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