• 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_config_impl.h"
17 #include "hilog_wrapper.h"
18 #include "if_system_ability_manager.h"
19 #include "iservice_registry.h"
20 #include "parameter.h"
21 #include "system_ability_definition.h"
22 
23 namespace OHOS {
24 namespace AccessibilityConfig {
25 namespace {
26     const std::string SYSTEM_PARAMETER_AAMS_NAME = "accessibility.config.ready";
27     constexpr int32_t CONFIG_PARAMETER_VALUE_SIZE = 10;
28 } // namespace
29 
Impl()30 AccessibilityConfig::Impl::Impl()
31 {}
32 
InitializeContext()33 bool AccessibilityConfig::Impl::InitializeContext()
34 {
35     HILOG_DEBUG();
36     std::lock_guard<std::mutex> lock(mutex_);
37     if (isInitialized_) {
38         HILOG_DEBUG("Context has initialized");
39         return true;
40     }
41     isInitialized_ = ConnectToService();
42 
43     return isInitialized_;
44 }
45 
OnParameterChanged(const char * key,const char * value,void * context)46 void AccessibilityConfig::Impl::OnParameterChanged(const char *key, const char *value, void *context)
47 {
48     HILOG_DEBUG("Parameter key = [%{public}s] value = [%{public}s]", key, value);
49 
50     if (!key || std::strcmp(key, SYSTEM_PARAMETER_AAMS_NAME.c_str())) {
51         HILOG_WARN("not accessibility.config.ready callback");
52         return;
53     }
54 
55     if (!value || std::strcmp(value, "true")) {
56         HILOG_WARN("accessibility.config.ready value not true");
57         return;
58     }
59 
60     if (!context) {
61         HILOG_ERROR("accessibility.config.ready context NULL");
62         return;
63     }
64 
65     Impl* implPtr = static_cast<Impl*>(context);
66     (void)implPtr->ConnectToServiceAsync();
67 }
68 
ConnectToService()69 bool AccessibilityConfig::Impl::ConnectToService()
70 {
71     char value[CONFIG_PARAMETER_VALUE_SIZE] = "default";
72     int retSysParam = GetParameter(SYSTEM_PARAMETER_AAMS_NAME.c_str(), "false", value, CONFIG_PARAMETER_VALUE_SIZE);
73     if (retSysParam >= 0 && !std::strcmp(value, "true")) {
74         // Accessibility service is ready
75         if (!InitAccessibilityServiceProxy()) {
76             return false;
77         }
78 
79         if (!RegisterToService()) {
80             return false;
81         }
82 
83         InitConfigValues();
84     } else {
85         HILOG_DEBUG("Start watching accessibility service.");
86         retSysParam = WatchParameter(SYSTEM_PARAMETER_AAMS_NAME.c_str(), &OnParameterChanged, this);
87         if (retSysParam) {
88             HILOG_ERROR("Watch parameter failed, error = %{public}d", retSysParam);
89             return false;
90         }
91     }
92 
93     return true;
94 }
95 
ConnectToServiceAsync()96 bool AccessibilityConfig::Impl::ConnectToServiceAsync()
97 {
98     HILOG_DEBUG("ConnectToServiceAsync start.");
99     std::lock_guard<std::mutex> lock(mutex_);
100     if (InitAccessibilityServiceProxy()) {
101         (void)RegisterToService();
102         InitConfigValues();
103         return true;
104     } else {
105         HILOG_ERROR("ConnectToServiceAsync fail");
106         return false;
107     }
108 }
109 
RegisterToService()110 bool AccessibilityConfig::Impl::RegisterToService()
111 {
112     if (!serviceProxy_) {
113         HILOG_ERROR("Service is not connected");
114         return false;
115     }
116 
117     if (captionObserver_ && enableAbilityListsObserver_ && configObserver_) {
118         HILOG_DEBUG("Observers is registered");
119         return true;
120     }
121 
122     if (!captionObserver_) {
123         captionObserver_ = new(std::nothrow) AccessibleAbilityManagerCaptionObserverImpl(*this);
124         if (!captionObserver_) {
125             HILOG_ERROR("Create captionObserver_ failed.");
126             return false;
127         }
128         uint32_t ret = serviceProxy_->RegisterCaptionObserver(captionObserver_);
129         if (ret != 0) {
130             HILOG_ERROR("Register captionObserver failed.");
131             return false;
132         }
133     }
134 
135     if (!enableAbilityListsObserver_) {
136         enableAbilityListsObserver_ = new(std::nothrow) AccessibilityEnableAbilityListsObserverImpl(*this);
137         if (!enableAbilityListsObserver_) {
138             HILOG_ERROR("Create enableAbilityListsObserver_ failed.");
139             return false;
140         }
141         serviceProxy_->RegisterEnableAbilityListsObserver(enableAbilityListsObserver_);
142     }
143 
144     if (!configObserver_) {
145         configObserver_ = new(std::nothrow) AccessibleAbilityManagerConfigObserverImpl(*this);
146         if (!configObserver_) {
147             HILOG_ERROR("Create configObserver_ failed.");
148             return false;
149         }
150         uint32_t ret = serviceProxy_->RegisterConfigObserver(configObserver_);
151         if (ret != 0) {
152             HILOG_ERROR("Register configObserver failed.");
153             return false;
154         }
155     }
156 
157     HILOG_DEBUG("RegisterToService succeaddss");
158     return true;
159 }
160 
InitAccessibilityServiceProxy()161 bool AccessibilityConfig::Impl::InitAccessibilityServiceProxy()
162 {
163     if (serviceProxy_) {
164         HILOG_DEBUG("Accessibility Service is connected");
165         return true;
166     }
167 
168     sptr<ISystemAbilityManager> samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
169     if (!samgr) {
170         HILOG_ERROR("Failed to get ISystemAbilityManager");
171         return false;
172     }
173 
174     sptr<IRemoteObject> object = samgr->GetSystemAbility(ACCESSIBILITY_MANAGER_SERVICE_ID);
175     if (!object) {
176         HILOG_ERROR("Get IAccessibleAbilityManagerService object from samgr failed");
177         return false;
178     }
179 
180     if (!deathRecipient_) {
181         deathRecipient_ = new(std::nothrow) DeathRecipient(*this);
182         if (!deathRecipient_) {
183             HILOG_ERROR("Create deathRecipient_ fail.");
184             return false;
185         }
186     }
187 
188     if ((object->IsProxyObject()) && (!object->AddDeathRecipient(deathRecipient_))) {
189         HILOG_ERROR("Failed to add death recipient");
190         return false;
191     }
192 
193     serviceProxy_ = iface_cast<Accessibility::IAccessibleAbilityManagerService>(object);
194     if (!serviceProxy_) {
195         HILOG_ERROR("IAccessibleAbilityManagerService iface_cast failed");
196         return false;
197     }
198 
199     HILOG_DEBUG("InitAccessibilityServiceProxy success");
200     return true;
201 }
202 
ResetService(const wptr<IRemoteObject> & remote)203 void AccessibilityConfig::Impl::ResetService(const wptr<IRemoteObject> &remote)
204 {
205     HILOG_DEBUG();
206     std::lock_guard<std::mutex> lock(mutex_);
207     if (serviceProxy_) {
208         sptr<IRemoteObject> object = serviceProxy_->AsObject();
209         if (object && (remote == object)) {
210             object->RemoveDeathRecipient(deathRecipient_);
211             serviceProxy_ = nullptr;
212             captionObserver_ = nullptr;
213             enableAbilityListsObserver_ = nullptr;
214             configObserver_ = nullptr;
215             HILOG_DEBUG("Reset OK");
216         }
217     }
218 }
219 
EnableAbility(const std::string & name,const uint32_t capabilities)220 Accessibility::RetError AccessibilityConfig::Impl::EnableAbility(const std::string &name, const uint32_t capabilities)
221 {
222     HILOG_INFO("name = [%{private}s] capabilities = [%{private}u]", name.c_str(), capabilities);
223     std::lock_guard<std::mutex> lock(mutex_);
224     if (!serviceProxy_) {
225         HILOG_ERROR("Failed to get accessibility service");
226         return Accessibility::RET_ERR_SAMGR;
227     }
228     return serviceProxy_->EnableAbility(name, capabilities);
229 }
230 
DisableAbility(const std::string & name)231 Accessibility::RetError AccessibilityConfig::Impl::DisableAbility(const std::string &name)
232 {
233     HILOG_INFO("name = [%{private}s]", name.c_str());
234     std::lock_guard<std::mutex> lock(mutex_);
235     if (!serviceProxy_) {
236         HILOG_ERROR("Failed to get accessibility service");
237         return Accessibility::RET_ERR_SAMGR;
238     }
239     return serviceProxy_->DisableAbility(name);
240 }
241 
GetCaptionsState(bool & state)242 Accessibility::RetError AccessibilityConfig::Impl::GetCaptionsState(bool &state)
243 {
244     std::lock_guard<std::mutex> lock(mutex_);
245     if (!serviceProxy_) {
246         HILOG_ERROR("Failed to get accessibility service");
247         return Accessibility::RET_ERR_SAMGR;
248     }
249     Accessibility::RetError ret = serviceProxy_->GetCaptionState(state);
250     HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
251     return ret;
252 }
253 
GetCaptionsProperty(CaptionProperty & caption)254 Accessibility::RetError AccessibilityConfig::Impl::GetCaptionsProperty(CaptionProperty &caption)
255 {
256     std::lock_guard<std::mutex> lock(mutex_);
257     if (!serviceProxy_) {
258         HILOG_ERROR("Failed to get accessibility service");
259         return Accessibility::RET_ERR_SAMGR;
260     }
261     Accessibility::RetError ret = serviceProxy_->GetCaptionProperty(caption);
262     HILOG_INFO();
263     return ret;
264 }
265 
SetCaptionsProperty(const CaptionProperty & caption)266 Accessibility::RetError AccessibilityConfig::Impl::SetCaptionsProperty(const CaptionProperty& caption)
267 {
268     HILOG_INFO();
269     std::lock_guard<std::mutex> lock(mutex_);
270     if (!serviceProxy_) {
271         HILOG_ERROR("Failed to get accessibility service");
272         return Accessibility::RET_ERR_SAMGR;
273     }
274     return serviceProxy_->SetCaptionProperty(caption);
275 }
276 
SetCaptionsState(const bool state)277 Accessibility::RetError AccessibilityConfig::Impl::SetCaptionsState(const bool state)
278 {
279     HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
280     std::lock_guard<std::mutex> lock(mutex_);
281     if (!serviceProxy_) {
282         HILOG_ERROR("Failed to get accessibility service");
283         return Accessibility::RET_ERR_SAMGR;
284     }
285     return serviceProxy_->SetCaptionState(state);
286 }
287 
NotifyCaptionStateChanged(const std::vector<std::shared_ptr<AccessibilityConfigObserver>> & observers,const bool state)288 void AccessibilityConfig::Impl::NotifyCaptionStateChanged(
289     const std::vector<std::shared_ptr<AccessibilityConfigObserver>> &observers, const bool state)
290 {
291     HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
292     for (auto &observer : observers) {
293         if (observer) {
294             ConfigValue configValue;
295             configValue.captionState = state;
296             observer->OnConfigChanged(CONFIG_CAPTION_STATE, configValue);
297         } else {
298             HILOG_ERROR("end configObservers_ is null");
299         }
300     }
301 }
302 
NotifyCaptionChanged(const std::vector<std::shared_ptr<AccessibilityConfigObserver>> & observers,const CaptionProperty & captionProperty)303 void AccessibilityConfig::Impl::NotifyCaptionChanged(
304     const std::vector<std::shared_ptr<AccessibilityConfigObserver>> &observers, const CaptionProperty &captionProperty)
305 {
306     HILOG_INFO();
307     for (auto &observer : observers) {
308         if (observer) {
309             ConfigValue configValue;
310             configValue.captionStyle = captionProperty_;
311             observer->OnConfigChanged(CONFIG_CAPTION_STYLE, configValue);
312         } else {
313             HILOG_ERROR("end observers is null");
314         }
315     }
316 }
317 
SubscribeConfigObserver(const CONFIG_ID id,const std::shared_ptr<AccessibilityConfigObserver> & observer,const bool retFlag)318 Accessibility::RetError AccessibilityConfig::Impl::SubscribeConfigObserver(const CONFIG_ID id,
319     const std::shared_ptr<AccessibilityConfigObserver> &observer, const bool retFlag)
320 {
321     HILOG_INFO("id = [%{public}d]", static_cast<int32_t>(id));
322     std::lock_guard<std::mutex> lock(mutex_);
323     std::map<CONFIG_ID, std::vector<std::shared_ptr<AccessibilityConfigObserver>>>::iterator it =
324         configObservers_.find(id);
325     if (it != configObservers_.end()) {
326         it->second.push_back(observer);
327         HILOG_DEBUG("configObservers->second.size%{public}zu", it->second.size());
328     } else {
329         std::vector<std::shared_ptr<AccessibilityConfigObserver>> ob;
330         ob.push_back(observer);
331         configObservers_.insert(std::make_pair(id, ob));
332         HILOG_DEBUG("configObservers->second.size%{public}zu", ob.size());
333     }
334 
335     if (retFlag && observer) {
336         NotifyImmediately(id, observer);
337     }
338     return Accessibility::RET_OK;
339 }
340 
UnsubscribeConfigObserver(const CONFIG_ID id,const std::shared_ptr<AccessibilityConfigObserver> & observer)341 Accessibility::RetError AccessibilityConfig::Impl::UnsubscribeConfigObserver(const CONFIG_ID id,
342     const std::shared_ptr<AccessibilityConfigObserver> &observer)
343 {
344     HILOG_INFO("id = [%{public}d]", static_cast<int32_t>(id));
345     std::lock_guard<std::mutex> lock(mutex_);
346     std::map<CONFIG_ID, std::vector<std::shared_ptr<AccessibilityConfigObserver>>>::iterator it =
347         configObservers_.find(id);
348     if (it != configObservers_.end()) {
349         for (auto iter = it->second.begin(); iter != it->second.end(); iter++) {
350             if (*iter == observer) {
351                 HILOG_DEBUG("erase observer");
352                 it->second.erase(iter);
353                 HILOG_DEBUG("observer's size is %{public}zu", it->second.size());
354                 return Accessibility::RET_OK;
355             }
356         }
357     } else {
358         HILOG_DEBUG("%{public}d has not subscribed ", id);
359     }
360     return Accessibility::RET_OK;
361 }
362 
OnAccessibleAbilityManagerCaptionPropertyChanged(const CaptionProperty & property)363 void AccessibilityConfig::Impl::OnAccessibleAbilityManagerCaptionPropertyChanged(const CaptionProperty& property)
364 {
365     HILOG_DEBUG();
366     std::vector<std::shared_ptr<AccessibilityConfigObserver>> observers;
367     {
368         std::lock_guard<std::mutex> lock(mutex_);
369         if (captionProperty_.GetFontScale() == property.GetFontScale() &&
370             captionProperty_.GetFontColor() == property.GetFontColor() &&
371             !strcmp(captionProperty_.GetFontFamily().c_str(), property.GetFontFamily().c_str()) &&
372             !strcmp(captionProperty_.GetFontEdgeType().c_str(), property.GetFontEdgeType().c_str()) &&
373             captionProperty_.GetBackgroundColor() == property.GetBackgroundColor() &&
374             captionProperty_.GetWindowColor() == property.GetWindowColor()) {
375             return;
376         }
377         captionProperty_ = property;
378         std::map<CONFIG_ID, std::vector<std::shared_ptr<AccessibilityConfigObserver>>>::iterator it =
379             configObservers_.find(CONFIG_CAPTION_STYLE);
380         if (it == configObservers_.end()) {
381             return;
382         }
383         observers = it->second;
384     }
385 
386     NotifyCaptionChanged(observers, property);
387 }
388 
SetScreenMagnificationState(const bool state)389 Accessibility::RetError AccessibilityConfig::Impl::SetScreenMagnificationState(const bool state)
390 {
391     HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
392     std::lock_guard<std::mutex> lock(mutex_);
393     if (!serviceProxy_) {
394         HILOG_ERROR("Failed to get accessibility service");
395         return Accessibility::RET_ERR_SAMGR;
396     }
397     return serviceProxy_->SetScreenMagnificationState(state);
398 }
399 
SetShortKeyState(const bool state)400 Accessibility::RetError AccessibilityConfig::Impl::SetShortKeyState(const bool state)
401 {
402     HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
403     std::lock_guard<std::mutex> lock(mutex_);
404     if (!serviceProxy_) {
405         HILOG_ERROR("Failed to get accessibility service");
406         return Accessibility::RET_ERR_SAMGR;
407     }
408     return serviceProxy_->SetShortKeyState(state);
409 }
410 
SetMouseKeyState(const bool state)411 Accessibility::RetError AccessibilityConfig::Impl::SetMouseKeyState(const bool state)
412 {
413     HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
414     std::lock_guard<std::mutex> lock(mutex_);
415     if (!serviceProxy_) {
416         HILOG_ERROR("Failed to get accessibility service");
417         return Accessibility::RET_ERR_SAMGR;
418     }
419     return serviceProxy_->SetMouseKeyState(state);
420 }
421 
GetScreenMagnificationState(bool & state)422 Accessibility::RetError AccessibilityConfig::Impl::GetScreenMagnificationState(bool &state)
423 {
424     std::lock_guard<std::mutex> lock(mutex_);
425     if (!serviceProxy_) {
426         HILOG_ERROR("Failed to get accessibility service");
427         return Accessibility::RET_ERR_SAMGR;
428     }
429 
430     Accessibility::RetError ret = serviceProxy_->GetScreenMagnificationState(state);
431     HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
432     return ret;
433 }
434 
GetShortKeyState(bool & state)435 Accessibility::RetError AccessibilityConfig::Impl::GetShortKeyState(bool &state)
436 {
437     std::lock_guard<std::mutex> lock(mutex_);
438     if (!serviceProxy_) {
439         HILOG_ERROR("Failed to get accessibility service");
440         return Accessibility::RET_ERR_SAMGR;
441     }
442 
443     Accessibility::RetError ret = serviceProxy_->GetShortKeyState(state);
444     HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
445     return ret;
446 }
447 
GetMouseKeyState(bool & state)448 Accessibility::RetError AccessibilityConfig::Impl::GetMouseKeyState(bool &state)
449 {
450     std::lock_guard<std::mutex> lock(mutex_);
451     if (!serviceProxy_) {
452         HILOG_ERROR("Failed to get accessibility service");
453         return Accessibility::RET_ERR_SAMGR;
454     }
455 
456     Accessibility::RetError ret = serviceProxy_->GetMouseKeyState(state);
457     HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
458     return ret;
459 }
460 
UpdateCaptionEnabled(const bool enabled)461 void AccessibilityConfig::Impl::UpdateCaptionEnabled(const bool enabled)
462 {
463     std::vector<std::shared_ptr<AccessibilityConfigObserver>> observers;
464     {
465         std::lock_guard<std::mutex> lock(mutex_);
466         if (captionState_ == enabled) {
467             return;
468         }
469         captionState_ = enabled;
470         std::map<CONFIG_ID, std::vector<std::shared_ptr<AccessibilityConfigObserver>>>::iterator it =
471             configObservers_.find(CONFIG_CAPTION_STATE);
472         if (it == configObservers_.end()) {
473             return;
474         }
475         observers = it->second;
476     }
477     NotifyCaptionStateChanged(observers, enabled);
478 }
479 
UpdateScreenMagnificationEnabled(const bool enabled)480 void AccessibilityConfig::Impl::UpdateScreenMagnificationEnabled(const bool enabled)
481 {
482     std::vector<std::shared_ptr<AccessibilityConfigObserver>> observers;
483     {
484         std::lock_guard<std::mutex> lock(mutex_);
485         if (screenMagnifier_ == enabled) {
486             return;
487         }
488         screenMagnifier_ = enabled;
489         std::map<CONFIG_ID, std::vector<std::shared_ptr<AccessibilityConfigObserver>>>::iterator it =
490             configObservers_.find(CONFIG_SCREEN_MAGNIFICATION);
491         if (it == configObservers_.end()) {
492             return;
493         }
494         observers = it->second;
495     }
496     NotifyScreenMagnificationChanged(observers, enabled);
497 }
498 
UpdateShortKeyEnabled(const bool enabled)499 void AccessibilityConfig::Impl::UpdateShortKeyEnabled(const bool enabled)
500 {
501     std::vector<std::shared_ptr<AccessibilityConfigObserver>> observers;
502     {
503         std::lock_guard<std::mutex> lock(mutex_);
504         if (shortkey_ == enabled) {
505             return;
506         }
507         shortkey_ = enabled;
508         std::map<CONFIG_ID, std::vector<std::shared_ptr<AccessibilityConfigObserver>>>::iterator it =
509             configObservers_.find(CONFIG_SHORT_KEY);
510         if (it == configObservers_.end()) {
511             return;
512         }
513         observers = it->second;
514     }
515     NotifyShortKeyChanged(observers, enabled);
516 }
517 
UpdateMouseKeyEnabled(const bool enabled)518 void AccessibilityConfig::Impl::UpdateMouseKeyEnabled(const bool enabled)
519 {
520     std::vector<std::shared_ptr<AccessibilityConfigObserver>> observers;
521     {
522         std::lock_guard<std::mutex> lock(mutex_);
523         if (mouseKey_ == enabled) {
524             return;
525         }
526         mouseKey_ = enabled;
527         std::map<CONFIG_ID, std::vector<std::shared_ptr<AccessibilityConfigObserver>>>::iterator it =
528             configObservers_.find(CONFIG_MOUSE_KEY);
529         if (it == configObservers_.end()) {
530             return;
531         }
532         observers = it->second;
533     }
534     NotifyMouseKeyChanged(observers, enabled);
535 }
536 
UpdateAudioMonoEnabled(const bool enabled)537 void AccessibilityConfig::Impl::UpdateAudioMonoEnabled(const bool enabled)
538 {
539     std::vector<std::shared_ptr<AccessibilityConfigObserver>> observers;
540     {
541         std::lock_guard<std::mutex> lock(mutex_);
542         if (audioMono_ == enabled) {
543             return;
544         }
545         audioMono_ = enabled;
546         std::map<CONFIG_ID, std::vector<std::shared_ptr<AccessibilityConfigObserver>>>::iterator it =
547             configObservers_.find(CONFIG_AUDIO_MONO);
548         if (it == configObservers_.end()) {
549             return;
550         }
551         observers = it->second;
552     }
553     NotifyAudioMonoChanged(observers, enabled);
554 }
555 
UpdateAnimationOffEnabled(const bool enabled)556 void AccessibilityConfig::Impl::UpdateAnimationOffEnabled(const bool enabled)
557 {
558     std::vector<std::shared_ptr<AccessibilityConfigObserver>> observers;
559     {
560         std::lock_guard<std::mutex> lock(mutex_);
561         if (animationOff_ == enabled) {
562             return;
563         }
564         animationOff_ = enabled;
565         std::map<CONFIG_ID, std::vector<std::shared_ptr<AccessibilityConfigObserver>>>::iterator it =
566             configObservers_.find(CONFIG_ANIMATION_OFF);
567         if (it == configObservers_.end()) {
568             return;
569         }
570         observers = it->second;
571     }
572 
573     NotifyAnimationOffChanged(observers, enabled);
574 }
575 
UpdateInvertColorEnabled(const bool enabled)576 void AccessibilityConfig::Impl::UpdateInvertColorEnabled(const bool enabled)
577 {
578     std::vector<std::shared_ptr<AccessibilityConfigObserver>> observers;
579     {
580         std::lock_guard<std::mutex> lock(mutex_);
581         if (invertColor_ == enabled) {
582             return;
583         }
584         invertColor_ = enabled;
585         std::map<CONFIG_ID, std::vector<std::shared_ptr<AccessibilityConfigObserver>>>::iterator it =
586             configObservers_.find(CONFIG_INVERT_COLOR);
587         if (it == configObservers_.end()) {
588             return;
589         }
590         observers = it->second;
591     }
592     NotifyInvertColorChanged(observers, enabled);
593 }
594 
UpdateHighContrastTextEnabled(const bool enabled)595 void AccessibilityConfig::Impl::UpdateHighContrastTextEnabled(const bool enabled)
596 {
597     HILOG_INFO("enabled = [%{public}s]", enabled ? "True" : "False");
598     std::vector<std::shared_ptr<AccessibilityConfigObserver>> observers;
599     {
600         std::lock_guard<std::mutex> lock(mutex_);
601         if (highContrastText_ == enabled) {
602             return;
603         }
604         highContrastText_ = enabled;
605         std::map<CONFIG_ID, std::vector<std::shared_ptr<AccessibilityConfigObserver>>>::iterator it =
606             configObservers_.find(CONFIG_HIGH_CONTRAST_TEXT);
607         if (it == configObservers_.end()) {
608             return;
609         }
610         observers = it->second;
611     }
612     NotifyHighContrastTextChanged(observers, enabled);
613 }
614 
NotifyScreenMagnificationChanged(const std::vector<std::shared_ptr<AccessibilityConfigObserver>> & observers,const bool state)615 void AccessibilityConfig::Impl::NotifyScreenMagnificationChanged(
616     const std::vector<std::shared_ptr<AccessibilityConfigObserver>> &observers, const bool state)
617 {
618     HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
619     for (auto &observer : observers) {
620         if (observer) {
621             ConfigValue configValue;
622             configValue.screenMagnifier = state;
623             observer->OnConfigChanged(CONFIG_SCREEN_MAGNIFICATION, configValue);
624         } else {
625             HILOG_ERROR("end configObservers_ is null");
626         }
627     }
628 }
629 
NotifyShortKeyChanged(const std::vector<std::shared_ptr<AccessibilityConfigObserver>> & observers,const bool state)630 void AccessibilityConfig::Impl::NotifyShortKeyChanged(
631     const std::vector<std::shared_ptr<AccessibilityConfigObserver>> &observers, const bool state)
632 {
633     HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
634     for (auto &observer : observers) {
635         if (observer) {
636             ConfigValue configValue;
637             configValue.shortkey = state;
638             observer->OnConfigChanged(CONFIG_SHORT_KEY, configValue);
639         } else {
640             HILOG_ERROR("end configObservers_ is null");
641         }
642     }
643 }
644 
NotifyMouseKeyChanged(const std::vector<std::shared_ptr<AccessibilityConfigObserver>> & observers,const bool state)645 void AccessibilityConfig::Impl::NotifyMouseKeyChanged(
646     const std::vector<std::shared_ptr<AccessibilityConfigObserver>> &observers, const bool state)
647 {
648     HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
649     for (auto &observer : observers) {
650         if (observer) {
651             ConfigValue configValue;
652             configValue.mouseKey = state;
653             observer->OnConfigChanged(CONFIG_MOUSE_KEY, configValue);
654         } else {
655             HILOG_ERROR("end configObservers_ is null");
656         }
657     }
658 }
659 
NotifyInvertColorChanged(const std::vector<std::shared_ptr<AccessibilityConfigObserver>> & observers,const bool state)660 void AccessibilityConfig::Impl::NotifyInvertColorChanged(
661     const std::vector<std::shared_ptr<AccessibilityConfigObserver>> &observers, const bool state)
662 {
663     HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
664     for (auto &observer : observers) {
665         if (observer) {
666             ConfigValue configValue;
667             configValue.invertColor = state;
668             observer->OnConfigChanged(CONFIG_INVERT_COLOR, configValue);
669         } else {
670             HILOG_ERROR("end configObservers_ is null");
671         }
672     }
673 }
674 
NotifyHighContrastTextChanged(const std::vector<std::shared_ptr<AccessibilityConfigObserver>> & observers,const bool state)675 void AccessibilityConfig::Impl::NotifyHighContrastTextChanged(
676     const std::vector<std::shared_ptr<AccessibilityConfigObserver>> &observers, const bool state)
677 {
678     HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
679     for (auto &observer : observers) {
680         if (observer) {
681             ConfigValue configValue;
682             configValue.highContrastText = state;
683             observer->OnConfigChanged(CONFIG_HIGH_CONTRAST_TEXT, configValue);
684         } else {
685             HILOG_ERROR("end configObservers_ is null");
686         }
687     }
688 }
689 
NotifyAudioMonoChanged(const std::vector<std::shared_ptr<AccessibilityConfigObserver>> & observers,const bool state)690 void AccessibilityConfig::Impl::NotifyAudioMonoChanged(
691     const std::vector<std::shared_ptr<AccessibilityConfigObserver>> &observers, const bool state)
692 {
693     HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
694     for (auto &observer : observers) {
695         if (observer) {
696             ConfigValue configValue;
697             configValue.audioMono = state;
698             observer->OnConfigChanged(CONFIG_AUDIO_MONO, configValue);
699         } else {
700             HILOG_ERROR("end configObservers_ is null");
701         }
702     }
703 }
704 
NotifyAnimationOffChanged(const std::vector<std::shared_ptr<AccessibilityConfigObserver>> & observers,const bool state)705 void AccessibilityConfig::Impl::NotifyAnimationOffChanged(
706     const std::vector<std::shared_ptr<AccessibilityConfigObserver>> &observers, const bool state)
707 {
708     HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
709     for (auto &observer : observers) {
710         if (observer) {
711             ConfigValue configValue;
712             configValue.animationOff = state;
713             observer->OnConfigChanged(CONFIG_ANIMATION_OFF, configValue);
714         } else {
715             HILOG_ERROR("end configObservers_ is null");
716         }
717     }
718 }
719 
SetMouseAutoClick(const int32_t time)720 Accessibility::RetError AccessibilityConfig::Impl::SetMouseAutoClick(const int32_t time)
721 {
722     HILOG_INFO("time = [%{public}d]", time);
723     std::lock_guard<std::mutex> lock(mutex_);
724     if (!serviceProxy_) {
725         HILOG_ERROR("Failed to get accessibility service");
726         return Accessibility::RET_ERR_SAMGR;
727     }
728     return serviceProxy_->SetMouseAutoClick(time);
729 }
730 
SetShortkeyTarget(const std::string & name)731 Accessibility::RetError AccessibilityConfig::Impl::SetShortkeyTarget(const std::string& name)
732 {
733     HILOG_INFO("name = [%{public}s]", name.c_str());
734     std::lock_guard<std::mutex> lock(mutex_);
735     if (!serviceProxy_) {
736         HILOG_ERROR("Failed to get accessibility service");
737         return Accessibility::RET_ERR_SAMGR;
738     }
739     return serviceProxy_->SetShortkeyTarget(name);
740 }
741 
GetMouseAutoClick(int32_t & time)742 Accessibility::RetError AccessibilityConfig::Impl::GetMouseAutoClick(int32_t &time)
743 {
744     std::lock_guard<std::mutex> lock(mutex_);
745     if (!serviceProxy_) {
746         HILOG_ERROR("Failed to get accessibility service");
747         return Accessibility::RET_ERR_SAMGR;
748     }
749 
750     Accessibility::RetError ret = serviceProxy_->GetMouseAutoClick(time);
751     HILOG_INFO("time = [%{public}d]", time);
752     return ret;
753 }
754 
GetShortkeyTarget(std::string & name)755 Accessibility::RetError AccessibilityConfig::Impl::GetShortkeyTarget(std::string &name)
756 {
757     std::lock_guard<std::mutex> lock(mutex_);
758     if (!serviceProxy_) {
759         HILOG_ERROR("Failed to get accessibility service");
760         return Accessibility::RET_ERR_SAMGR;
761     }
762 
763     Accessibility::RetError ret = serviceProxy_->GetShortkeyTarget(name);
764     HILOG_INFO("name = [%{public}s]", name.c_str());
765     return ret;
766 }
767 
NotifyShortkeyTargetChanged(const std::vector<std::shared_ptr<AccessibilityConfigObserver>> & observers,const std::string & shortkey_target)768 void AccessibilityConfig::Impl::NotifyShortkeyTargetChanged(
769     const std::vector<std::shared_ptr<AccessibilityConfigObserver>> &observers, const std::string &shortkey_target)
770 {
771     HILOG_INFO("shortkey_target = [%{public}s]", shortkey_target.c_str());
772     for (auto &observer : observers) {
773         if (observer) {
774             ConfigValue configValue;
775             configValue.shortkey_target = shortkeyTarget_;
776             observer->OnConfigChanged(CONFIG_SHORT_KEY_TARGET, configValue);
777         } else {
778             HILOG_ERROR("end configObservers_ is null");
779         }
780     }
781 }
782 
NotifyMouseAutoClickChanged(const std::vector<std::shared_ptr<AccessibilityConfigObserver>> & observers,const uint32_t mouseAutoClick)783 void AccessibilityConfig::Impl::NotifyMouseAutoClickChanged(
784     const std::vector<std::shared_ptr<AccessibilityConfigObserver>> &observers, const uint32_t mouseAutoClick)
785 {
786     HILOG_INFO("mouseAutoClick = [%{public}u]", mouseAutoClick);
787     for (auto &observer : observers) {
788         if (observer) {
789             ConfigValue configValue;
790             configValue.mouseAutoClick = mouseAutoClick_;
791             observer->OnConfigChanged(CONFIG_MOUSE_AUTOCLICK, configValue);
792         } else {
793             HILOG_ERROR("end configObservers_ is null");
794         }
795     }
796 }
797 
NotifyAudioBalanceChanged(const std::vector<std::shared_ptr<AccessibilityConfigObserver>> & observers,const float audioBalance)798 void AccessibilityConfig::Impl::NotifyAudioBalanceChanged(
799     const std::vector<std::shared_ptr<AccessibilityConfigObserver>> &observers, const float audioBalance)
800 {
801     HILOG_INFO("audioBalance = [%{public}f]", audioBalance);
802     for (auto &observer : observers) {
803         if (observer) {
804             ConfigValue configValue;
805             configValue.audioBalance = audioBalance;
806             observer->OnConfigChanged(CONFIG_AUDIO_BALANCE, configValue);
807         } else {
808             HILOG_ERROR("end configObservers_ is null");
809         }
810     }
811 }
812 
NotifyBrightnessDiscountChanged(const std::vector<std::shared_ptr<AccessibilityConfigObserver>> & observers,const float brightnessDiscount)813 void AccessibilityConfig::Impl::NotifyBrightnessDiscountChanged(
814     const std::vector<std::shared_ptr<AccessibilityConfigObserver>> &observers, const float brightnessDiscount)
815 {
816     HILOG_INFO("brightnessDiscount = [%{public}f]", brightnessDiscount);
817     for (auto &observer : observers) {
818         if (observer) {
819             ConfigValue configValue;
820             configValue.brightnessDiscount = brightnessDiscount;
821             observer->OnConfigChanged(CONFIG_BRIGHTNESS_DISCOUNT, configValue);
822         } else {
823             HILOG_ERROR("end configObservers_ is null");
824         }
825     }
826 }
827 
NotifyContentTimeoutChanged(const std::vector<std::shared_ptr<AccessibilityConfigObserver>> & observers,const uint32_t contentTimeout)828 void AccessibilityConfig::Impl::NotifyContentTimeoutChanged(
829     const std::vector<std::shared_ptr<AccessibilityConfigObserver>> &observers, const uint32_t contentTimeout)
830 {
831     HILOG_INFO("contentTimeout = [%{public}u]", contentTimeout);
832     for (auto &observer : observers) {
833         if (observer) {
834             ConfigValue configValue;
835             configValue.contentTimeout = contentTimeout;
836             observer->OnConfigChanged(CONFIG_CONTENT_TIMEOUT, configValue);
837         } else {
838             HILOG_ERROR("end configObservers_ is null");
839         }
840     }
841 }
842 
NotifyDaltonizationColorFilterChanged(const std::vector<std::shared_ptr<AccessibilityConfigObserver>> & observers,const uint32_t daltonizationColorFilter)843 void AccessibilityConfig::Impl::NotifyDaltonizationColorFilterChanged(
844     const std::vector<std::shared_ptr<AccessibilityConfigObserver>> &observers, const uint32_t daltonizationColorFilter)
845 {
846     HILOG_INFO("daltonizationColorFilter = [%{public}u]", daltonizationColorFilter);
847     for (auto &observer : observers) {
848         if (observer) {
849             ConfigValue configValue;
850             configValue.daltonizationColorFilter = static_cast<DALTONIZATION_TYPE>(daltonizationColorFilter_);
851             observer->OnConfigChanged(CONFIG_DALTONIZATION_COLOR_FILTER, configValue);
852         } else {
853             HILOG_ERROR("end configObservers_ is null");
854         }
855     }
856 }
857 
SetHighContrastTextState(const bool state)858 Accessibility::RetError AccessibilityConfig::Impl::SetHighContrastTextState(const bool state)
859 {
860     HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
861     std::lock_guard<std::mutex> lock(mutex_);
862     if (!serviceProxy_) {
863         HILOG_ERROR("Failed to get accessibility service");
864         return Accessibility::RET_ERR_SAMGR;
865     }
866     return serviceProxy_->SetHighContrastTextState(state);
867 }
868 
SetInvertColorState(const bool state)869 Accessibility::RetError AccessibilityConfig::Impl::SetInvertColorState(const bool state)
870 {
871     HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
872     std::lock_guard<std::mutex> lock(mutex_);
873     if (!serviceProxy_) {
874         HILOG_ERROR("Failed to get accessibility service");
875         return Accessibility::RET_ERR_SAMGR;
876     }
877     return serviceProxy_->SetInvertColorState(state);
878 }
879 
SetDaltonizationColorFilter(const DALTONIZATION_TYPE type)880 Accessibility::RetError AccessibilityConfig::Impl::SetDaltonizationColorFilter(const DALTONIZATION_TYPE type)
881 {
882     HILOG_INFO("type = [%{public}u]", static_cast<uint32_t>(type));
883     std::lock_guard<std::mutex> lock(mutex_);
884     if (!serviceProxy_) {
885         HILOG_ERROR("Failed to get accessibility service");
886         return Accessibility::RET_ERR_SAMGR;
887     }
888     return serviceProxy_->SetDaltonizationColorFilter(type);
889 }
890 
SetContentTimeout(const uint32_t timer)891 Accessibility::RetError AccessibilityConfig::Impl::SetContentTimeout(const uint32_t timer)
892 {
893     HILOG_INFO("timer = [%{public}u]", timer);
894     std::lock_guard<std::mutex> lock(mutex_);
895     if (!serviceProxy_) {
896         HILOG_ERROR("Failed to get accessibility service");
897         return Accessibility::RET_ERR_SAMGR;
898     }
899     return serviceProxy_->SetContentTimeout(timer);
900 }
901 
SetAnimationOffState(const bool state)902 Accessibility::RetError AccessibilityConfig::Impl::SetAnimationOffState(const bool state)
903 {
904     HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
905     std::lock_guard<std::mutex> lock(mutex_);
906     if (!serviceProxy_) {
907         HILOG_ERROR("Failed to get accessibility service");
908         return Accessibility::RET_ERR_SAMGR;
909     }
910     return serviceProxy_->SetAnimationOffState(state);
911 }
912 
SetBrightnessDiscount(const float brightness)913 Accessibility::RetError AccessibilityConfig::Impl::SetBrightnessDiscount(const float brightness)
914 {
915     HILOG_INFO("brightness = [%{public}f]", brightness);
916     std::lock_guard<std::mutex> lock(mutex_);
917     if (!serviceProxy_) {
918         HILOG_ERROR("Failed to get accessibility service");
919         return Accessibility::RET_ERR_SAMGR;
920     }
921     return serviceProxy_->SetBrightnessDiscount(brightness);
922 }
923 
SetAudioMonoState(const bool state)924 Accessibility::RetError AccessibilityConfig::Impl::SetAudioMonoState(const bool state)
925 {
926     HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
927     std::lock_guard<std::mutex> lock(mutex_);
928     if (!serviceProxy_) {
929         HILOG_ERROR("Failed to get accessibility service");
930         return Accessibility::RET_ERR_SAMGR;
931     }
932     return serviceProxy_->SetAudioMonoState(state);
933 }
934 
SetAudioBalance(const float balance)935 Accessibility::RetError AccessibilityConfig::Impl::SetAudioBalance(const float balance)
936 {
937     HILOG_INFO("balance = [%{public}f]", balance);
938     std::lock_guard<std::mutex> lock(mutex_);
939     if (!serviceProxy_) {
940         HILOG_ERROR("Failed to get accessibility service");
941         return Accessibility::RET_ERR_SAMGR;
942     }
943     return serviceProxy_->SetAudioBalance(balance);
944 }
945 
GetInvertColorState(bool & state)946 Accessibility::RetError AccessibilityConfig::Impl::GetInvertColorState(bool &state)
947 {
948     std::lock_guard<std::mutex> lock(mutex_);
949     if (!serviceProxy_) {
950         HILOG_ERROR("Failed to get accessibility service");
951         return Accessibility::RET_ERR_SAMGR;
952     }
953 
954     Accessibility::RetError ret = serviceProxy_->GetInvertColorState(state);
955     HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
956     return ret;
957 }
958 
GetHighContrastTextState(bool & state)959 Accessibility::RetError AccessibilityConfig::Impl::GetHighContrastTextState(bool &state)
960 {
961     std::lock_guard<std::mutex> lock(mutex_);
962     if (!serviceProxy_) {
963         HILOG_ERROR("Failed to get accessibility service");
964         return Accessibility::RET_ERR_SAMGR;
965     }
966 
967     Accessibility::RetError ret = serviceProxy_->GetHighContrastTextState(state);
968     HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
969     return ret;
970 }
971 
GetDaltonizationColorFilter(DALTONIZATION_TYPE & type)972 Accessibility::RetError AccessibilityConfig::Impl::GetDaltonizationColorFilter(DALTONIZATION_TYPE &type)
973 {
974     std::lock_guard<std::mutex> lock(mutex_);
975     if (!serviceProxy_) {
976         HILOG_ERROR("Failed to get accessibility service");
977         return Accessibility::RET_ERR_SAMGR;
978     }
979 
980     uint32_t filterType = 0;
981     Accessibility::RetError ret = serviceProxy_->GetDaltonizationColorFilter(filterType);
982     type = static_cast<DALTONIZATION_TYPE>(filterType);
983     HILOG_INFO("type = [%{public}u]", static_cast<uint32_t>(type));
984     return ret;
985 }
986 
GetContentTimeout(uint32_t & timer)987 Accessibility::RetError AccessibilityConfig::Impl::GetContentTimeout(uint32_t &timer)
988 {
989     std::lock_guard<std::mutex> lock(mutex_);
990     if (!serviceProxy_) {
991         HILOG_ERROR("Failed to get accessibility service");
992         return Accessibility::RET_ERR_SAMGR;
993     }
994 
995     Accessibility::RetError ret = serviceProxy_->GetContentTimeout(timer);
996     HILOG_INFO("timer = [%{public}u]", timer);
997     return ret;
998 }
999 
GetAnimationOffState(bool & state)1000 Accessibility::RetError AccessibilityConfig::Impl::GetAnimationOffState(bool &state)
1001 {
1002     std::lock_guard<std::mutex> lock(mutex_);
1003     if (!serviceProxy_) {
1004         HILOG_ERROR("Failed to get accessibility service");
1005         return Accessibility::RET_ERR_SAMGR;
1006     }
1007 
1008     Accessibility::RetError ret = serviceProxy_->GetAnimationOffState(state);
1009     HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
1010     return ret;
1011 }
1012 
GetBrightnessDiscount(float & brightness)1013 Accessibility::RetError AccessibilityConfig::Impl::GetBrightnessDiscount(float &brightness)
1014 {
1015     std::lock_guard<std::mutex> lock(mutex_);
1016     if (!serviceProxy_) {
1017         HILOG_ERROR("Failed to get accessibility service");
1018         return Accessibility::RET_ERR_SAMGR;
1019     }
1020 
1021     Accessibility::RetError ret = serviceProxy_->GetBrightnessDiscount(brightness);
1022     HILOG_INFO("brightness = [%{public}f]", brightness);
1023     return ret;
1024 }
1025 
GetAudioMonoState(bool & state)1026 Accessibility::RetError AccessibilityConfig::Impl::GetAudioMonoState(bool &state)
1027 {
1028     std::lock_guard<std::mutex> lock(mutex_);
1029     if (!serviceProxy_) {
1030         HILOG_ERROR("Failed to get accessibility service");
1031         return Accessibility::RET_ERR_SAMGR;
1032     }
1033 
1034     Accessibility::RetError ret = serviceProxy_->GetAudioMonoState(state);
1035     HILOG_INFO("state = [%{public}s]", state ? "True" : "False");
1036     return ret;
1037 }
1038 
GetAudioBalance(float & balance)1039 Accessibility::RetError AccessibilityConfig::Impl::GetAudioBalance(float &balance)
1040 {
1041     std::lock_guard<std::mutex> lock(mutex_);
1042     if (!serviceProxy_) {
1043         HILOG_ERROR("Failed to get accessibility service");
1044         return Accessibility::RET_ERR_SAMGR;
1045     }
1046 
1047     Accessibility::RetError ret = serviceProxy_->GetAudioBalance(balance);
1048     HILOG_INFO("balance = [%{public}f]", balance);
1049     return ret;
1050 }
1051 
SubscribeEnableAbilityListsObserver(const std::shared_ptr<AccessibilityEnableAbilityListsObserver> & observer)1052 Accessibility::RetError AccessibilityConfig::Impl::SubscribeEnableAbilityListsObserver(
1053     const std::shared_ptr<AccessibilityEnableAbilityListsObserver> &observer)
1054 {
1055     HILOG_INFO();
1056     std::lock_guard<std::mutex> lock(mutex_);
1057     if (std::any_of(enableAbilityListsObservers_.begin(), enableAbilityListsObservers_.end(),
1058         [&observer](const std::shared_ptr<AccessibilityEnableAbilityListsObserver> &listObserver) {
1059             return listObserver == observer;
1060             })) {
1061         HILOG_ERROR("the observer is exist");
1062         return Accessibility::RET_OK;
1063     }
1064     enableAbilityListsObservers_.push_back(observer);
1065     HILOG_DEBUG("observer's size is %{public}zu", enableAbilityListsObservers_.size());
1066     return Accessibility::RET_OK;
1067 }
1068 
UnsubscribeEnableAbilityListsObserver(const std::shared_ptr<AccessibilityEnableAbilityListsObserver> & observer)1069 Accessibility::RetError AccessibilityConfig::Impl::UnsubscribeEnableAbilityListsObserver(
1070     const std::shared_ptr<AccessibilityEnableAbilityListsObserver> &observer)
1071 {
1072     HILOG_INFO();
1073     std::lock_guard<std::mutex> lock(mutex_);
1074     for (auto iter = enableAbilityListsObservers_.begin(); iter != enableAbilityListsObservers_.end(); iter++) {
1075         if (*iter == observer) {
1076             HILOG_DEBUG("erase observer");
1077             enableAbilityListsObservers_.erase(iter);
1078             HILOG_DEBUG("observer's size is %{public}zu", enableAbilityListsObservers_.size());
1079             return Accessibility::RET_OK;
1080         }
1081     }
1082     return Accessibility::RET_OK;
1083 }
1084 
OnAccessibilityEnableAbilityListsChanged()1085 void AccessibilityConfig::Impl::OnAccessibilityEnableAbilityListsChanged()
1086 {
1087     HILOG_DEBUG("observer's size is %{public}zu", enableAbilityListsObservers_.size());
1088     std::vector<std::shared_ptr<AccessibilityEnableAbilityListsObserver>> observers;
1089     {
1090         std::lock_guard<std::mutex> lock(mutex_);
1091         observers = enableAbilityListsObservers_;
1092     }
1093     for (auto &enableAbilityListsObserver : observers) {
1094         enableAbilityListsObserver->OnEnableAbilityListsStateChanged();
1095     }
1096 }
1097 
OnAccessibleAbilityManagerConfigStateChanged(const uint32_t stateType)1098 void AccessibilityConfig::Impl::OnAccessibleAbilityManagerConfigStateChanged(const uint32_t stateType)
1099 {
1100     HILOG_DEBUG("stateType = [%{public}u}", stateType);
1101     if (stateType & Accessibility::STATE_CAPTION_ENABLED) {
1102         UpdateCaptionEnabled(true);
1103     } else {
1104         UpdateCaptionEnabled(false);
1105     }
1106 
1107     if (stateType & Accessibility::STATE_SCREENMAGNIFIER_ENABLED) {
1108         UpdateScreenMagnificationEnabled(true);
1109     } else {
1110         UpdateScreenMagnificationEnabled(false);
1111     }
1112 
1113     if (stateType & Accessibility::STATE_SHORTKEY_ENABLED) {
1114         UpdateShortKeyEnabled(true);
1115     } else {
1116         UpdateShortKeyEnabled(false);
1117     }
1118 
1119     if (stateType & Accessibility::STATE_AUDIOMONO_ENABLED) {
1120         UpdateAudioMonoEnabled(true);
1121     } else {
1122         UpdateAudioMonoEnabled(false);
1123     }
1124 
1125     if (stateType & Accessibility::STATE_ANIMATIONOFF_ENABLED) {
1126         UpdateAnimationOffEnabled(true);
1127     } else {
1128         UpdateAnimationOffEnabled(false);
1129     }
1130 
1131     if (stateType & Accessibility::STATE_INVETRTCOLOR_ENABLED) {
1132         UpdateInvertColorEnabled(true);
1133     } else {
1134         UpdateInvertColorEnabled(false);
1135     }
1136 
1137     if (stateType & Accessibility::STATE_HIGHCONTRAST_ENABLED) {
1138         UpdateHighContrastTextEnabled(true);
1139     } else {
1140         UpdateHighContrastTextEnabled(false);
1141     }
1142 
1143     if (stateType & Accessibility::STATE_MOUSEKEY_ENABLED) {
1144         UpdateMouseKeyEnabled(true);
1145     } else {
1146         UpdateMouseKeyEnabled(false);
1147     }
1148 }
1149 
OnAccessibleAbilityManagerAudioBalanceChanged(const float audioBalance)1150 void AccessibilityConfig::Impl::OnAccessibleAbilityManagerAudioBalanceChanged(const float audioBalance)
1151 {
1152     HILOG_DEBUG("audioBalance = [%{public}f}", audioBalance);
1153     std::vector<std::shared_ptr<AccessibilityConfigObserver>> observers;
1154     {
1155         std::lock_guard<std::mutex> lock(mutex_);
1156         if (audioBalance_ == audioBalance) {
1157             return;
1158         }
1159         audioBalance_ = audioBalance;
1160         std::map<CONFIG_ID, std::vector<std::shared_ptr<AccessibilityConfigObserver>>>::iterator it =
1161             configObservers_.find(CONFIG_AUDIO_BALANCE);
1162         if (it == configObservers_.end()) {
1163             return;
1164         }
1165         observers = it->second;
1166     }
1167 
1168     NotifyAudioBalanceChanged(observers, audioBalance);
1169 }
1170 
OnAccessibleAbilityManagerBrightnessDiscountChanged(const float brightnessDiscount)1171 void AccessibilityConfig::Impl::OnAccessibleAbilityManagerBrightnessDiscountChanged(const float brightnessDiscount)
1172 {
1173     HILOG_DEBUG("brightnessDiscount = [%{public}f}", brightnessDiscount);
1174 
1175     std::vector<std::shared_ptr<AccessibilityConfigObserver>> observers;
1176     {
1177         std::lock_guard<std::mutex> lock(mutex_);
1178         if (brightnessDiscount_ == brightnessDiscount) {
1179             return;
1180         }
1181         brightnessDiscount_ = brightnessDiscount;
1182         std::map<CONFIG_ID, std::vector<std::shared_ptr<AccessibilityConfigObserver>>>::iterator it =
1183             configObservers_.find(CONFIG_BRIGHTNESS_DISCOUNT);
1184         if (it == configObservers_.end()) {
1185             return;
1186         }
1187         observers = it->second;
1188     }
1189 
1190     NotifyBrightnessDiscountChanged(observers, brightnessDiscount);
1191 }
1192 
OnAccessibleAbilityManagerContentTimeoutChanged(const uint32_t contentTimeout)1193 void AccessibilityConfig::Impl::OnAccessibleAbilityManagerContentTimeoutChanged(const uint32_t contentTimeout)
1194 {
1195     HILOG_DEBUG("contentTimeout = [%{public}u}", contentTimeout);
1196     std::vector<std::shared_ptr<AccessibilityConfigObserver>> observers;
1197     {
1198         std::lock_guard<std::mutex> lock(mutex_);
1199         if (contentTimeout_ == contentTimeout) {
1200             return;
1201         }
1202         contentTimeout_ = contentTimeout;
1203         std::map<CONFIG_ID, std::vector<std::shared_ptr<AccessibilityConfigObserver>>>::iterator it =
1204             configObservers_.find(CONFIG_CONTENT_TIMEOUT);
1205         if (it == configObservers_.end()) {
1206             return;
1207         }
1208         observers = it->second;
1209     }
1210 
1211     NotifyContentTimeoutChanged(observers, contentTimeout);
1212 }
1213 
OnAccessibleAbilityManagerDaltonizationColorFilterChanged(const uint32_t filterType)1214 void AccessibilityConfig::Impl::OnAccessibleAbilityManagerDaltonizationColorFilterChanged(const uint32_t filterType)
1215 {
1216     HILOG_DEBUG("filterType = [%{public}u}", filterType);
1217     std::vector<std::shared_ptr<AccessibilityConfigObserver>> observers;
1218     {
1219         std::lock_guard<std::mutex> lock(mutex_);
1220         if (daltonizationColorFilter_ == filterType) {
1221             HILOG_DEBUG("filterType[%{public}u]", daltonizationColorFilter_);
1222             return;
1223         }
1224         daltonizationColorFilter_ = filterType;
1225         std::map<CONFIG_ID, std::vector<std::shared_ptr<AccessibilityConfigObserver>>>::iterator it =
1226             configObservers_.find(CONFIG_DALTONIZATION_COLOR_FILTER);
1227         if (it == configObservers_.end()) {
1228             return;
1229         }
1230         observers = it->second;
1231     }
1232 
1233     NotifyDaltonizationColorFilterChanged(observers, filterType);
1234 }
1235 
OnAccessibleAbilityManagerMouseAutoClickChanged(const int32_t mouseAutoClick)1236 void AccessibilityConfig::Impl::OnAccessibleAbilityManagerMouseAutoClickChanged(const int32_t mouseAutoClick)
1237 {
1238     HILOG_DEBUG("mouseAutoClick = [%{public}d}", mouseAutoClick);
1239     std::vector<std::shared_ptr<AccessibilityConfigObserver>> observers;
1240     {
1241         std::lock_guard<std::mutex> lock(mutex_);
1242         if (mouseAutoClick_ == mouseAutoClick) {
1243             return;
1244         }
1245         mouseAutoClick_ = mouseAutoClick;
1246         std::map<CONFIG_ID, std::vector<std::shared_ptr<AccessibilityConfigObserver>>>::iterator it =
1247             configObservers_.find(CONFIG_MOUSE_AUTOCLICK);
1248         if (it == configObservers_.end()) {
1249             return;
1250         }
1251         observers = it->second;
1252     }
1253 
1254     NotifyMouseAutoClickChanged(observers, mouseAutoClick);
1255 }
1256 
OnAccessibleAbilityManagerShortkeyTargetChanged(const std::string & shortkeyTarget)1257 void AccessibilityConfig::Impl::OnAccessibleAbilityManagerShortkeyTargetChanged(const std::string &shortkeyTarget)
1258 {
1259     HILOG_DEBUG("shortkeyTarget = [%{public}s}", shortkeyTarget.c_str());
1260     std::vector<std::shared_ptr<AccessibilityConfigObserver>> observers;
1261     {
1262         std::lock_guard<std::mutex> lock(mutex_);
1263         if (shortkeyTarget_.length() > 0 && shortkeyTarget.length() > 0 &&
1264             !std::strcmp(shortkeyTarget_.c_str(), shortkeyTarget.c_str())) {
1265             return;
1266         }
1267         shortkeyTarget_ = shortkeyTarget;
1268         std::map<CONFIG_ID, std::vector<std::shared_ptr<AccessibilityConfigObserver>>>::iterator it =
1269             configObservers_.find(CONFIG_SHORT_KEY_TARGET);
1270         if (it == configObservers_.end()) {
1271             return;
1272         }
1273         observers = it->second;
1274     }
1275 
1276     NotifyShortkeyTargetChanged(observers, shortkeyTarget);
1277 }
1278 
NotifyImmediately(const CONFIG_ID id,const std::shared_ptr<AccessibilityConfigObserver> & observer)1279 void AccessibilityConfig::Impl::NotifyImmediately(const CONFIG_ID id,
1280     const std::shared_ptr<AccessibilityConfigObserver> &observer)
1281 {
1282     HILOG_DEBUG("NotifyImmediately start.");
1283     ConfigValue configValue;
1284     {
1285         configValue.highContrastText = highContrastText_;
1286         configValue.invertColor = invertColor_;
1287         configValue.animationOff = animationOff_;
1288         configValue.screenMagnifier = screenMagnifier_;
1289         configValue.audioMono = audioMono_;
1290         configValue.mouseKey = mouseKey_;
1291         configValue.shortkey = shortkey_;
1292         configValue.captionState = captionState_;
1293         configValue.contentTimeout = contentTimeout_;
1294         configValue.mouseAutoClick = mouseAutoClick_;
1295         configValue.audioBalance = audioBalance_;
1296         configValue.brightnessDiscount = brightnessDiscount_;
1297         configValue.daltonizationColorFilter = static_cast<DALTONIZATION_TYPE>(daltonizationColorFilter_);
1298         configValue.shortkey_target = shortkeyTarget_;
1299         configValue.captionStyle = captionProperty_;
1300     }
1301     observer->OnConfigChanged(id, configValue);
1302 }
1303 
InitConfigValues()1304 void AccessibilityConfig::Impl::InitConfigValues()
1305 {
1306     Accessibility::AccessibilityConfigData configData;
1307     serviceProxy_->GetAllConfigs(configData);
1308     highContrastText_ = configData.highContrastText_;
1309     invertColor_ = configData.invertColor_;
1310     animationOff_ = configData.animationOff_;
1311     audioMono_ = configData.audioMono_;
1312     mouseKey_ = configData.mouseKey_;
1313     captionState_ = configData.captionState_;
1314     screenMagnifier_ = configData.screenMagnifier_;
1315     shortkey_ = configData.shortkey_;
1316     mouseAutoClick_ = configData.mouseAutoClick_;
1317     daltonizationColorFilter_ = configData.daltonizationColorFilter_;
1318     contentTimeout_ = configData.contentTimeout_;
1319     brightnessDiscount_ = configData.brightnessDiscount_;
1320     audioBalance_ = configData.audioBalance_;
1321     shortkeyTarget_ = configData.shortkeyTarget_;
1322     captionProperty_ = configData.captionProperty_;
1323     NotifyDefaultConfigs();
1324     HILOG_DEBUG("ConnectToService Success");
1325 }
1326 
NotifyDefaultConfigs()1327 void AccessibilityConfig::Impl::NotifyDefaultConfigs()
1328 {
1329     std::map<CONFIG_ID, std::vector<std::shared_ptr<AccessibilityConfigObserver>>>::iterator it =
1330         configObservers_.find(CONFIG_HIGH_CONTRAST_TEXT);
1331     if (it != configObservers_.end()) {
1332         NotifyHighContrastTextChanged(it->second, highContrastText_);
1333     }
1334     if ((it = configObservers_.find(CONFIG_INVERT_COLOR)) != configObservers_.end()) {
1335         NotifyInvertColorChanged(it->second, invertColor_);
1336     }
1337     if ((it = configObservers_.find(CONFIG_DALTONIZATION_COLOR_FILTER)) != configObservers_.end()) {
1338         NotifyDaltonizationColorFilterChanged(it->second, daltonizationColorFilter_);
1339     }
1340     if ((it = configObservers_.find(CONFIG_CONTENT_TIMEOUT)) != configObservers_.end()) {
1341         NotifyContentTimeoutChanged(it->second, contentTimeout_);
1342     }
1343     if ((it = configObservers_.find(CONFIG_ANIMATION_OFF)) != configObservers_.end()) {
1344         NotifyAnimationOffChanged(it->second, animationOff_);
1345     }
1346     if ((it = configObservers_.find(CONFIG_BRIGHTNESS_DISCOUNT)) != configObservers_.end()) {
1347         NotifyBrightnessDiscountChanged(it->second, brightnessDiscount_);
1348     }
1349     if ((it = configObservers_.find(CONFIG_AUDIO_MONO)) != configObservers_.end()) {
1350         NotifyAudioMonoChanged(it->second, audioMono_);
1351     }
1352     if ((it = configObservers_.find(CONFIG_AUDIO_BALANCE)) != configObservers_.end()) {
1353         NotifyAudioBalanceChanged(it->second, audioBalance_);
1354     }
1355     if ((it = configObservers_.find(CONFIG_MOUSE_KEY)) != configObservers_.end()) {
1356         NotifyMouseKeyChanged(it->second, mouseKey_);
1357     }
1358     if ((it = configObservers_.find(CONFIG_SHORT_KEY)) != configObservers_.end()) {
1359         NotifyShortKeyChanged(it->second, shortkey_);
1360     }
1361     if ((it = configObservers_.find(CONFIG_CAPTION_STATE)) != configObservers_.end()) {
1362         NotifyCaptionStateChanged(it->second, captionState_);
1363     }
1364     if ((it = configObservers_.find(CONFIG_CAPTION_STYLE)) != configObservers_.end()) {
1365         NotifyCaptionChanged(it->second, captionProperty_);
1366     }
1367     if ((it = configObservers_.find(CONFIG_SCREEN_MAGNIFICATION)) != configObservers_.end()) {
1368         NotifyScreenMagnificationChanged(it->second, screenMagnifier_);
1369     }
1370     if ((it = configObservers_.find(CONFIG_SHORT_KEY_TARGET)) != configObservers_.end()) {
1371         NotifyShortkeyTargetChanged(it->second, shortkeyTarget_);
1372     }
1373     if ((it = configObservers_.find(CONFIG_MOUSE_AUTOCLICK)) != configObservers_.end()) {
1374         NotifyMouseAutoClickChanged(it->second, mouseAutoClick_);
1375     }
1376 }
1377 
1378 } // namespace AccessibilityConfig
1379 } // namespace OHOS