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_account_data.h"
17 
18 #include <any>
19 #include <hitrace_meter.h>
20 #ifdef OHOS_BUILD_ENABLE_DISPLAY_MANAGER
21 #include "accessibility_display_manager.h"
22 #endif
23 #include "accessible_ability_manager_service.h"
24 #include "extension_ability_info.h"
25 #include "hilog_wrapper.h"
26 #include "utils.h"
27 #include "system_ability_definition.h"
28 #include "os_account_manager.h"
29 
30 namespace OHOS {
31 namespace Accessibility {
32 namespace {
33     constexpr int32_t AUTOCLICK_DELAY_TIME_MIN = 1000; // ms
34     constexpr int32_t AUTOCLICK_DELAY_TIME_MAX = 5000; // ms
35     constexpr int32_t INIT_DATASHARE_HELPER_SLEEP_TIME = 500;
36     constexpr int DEFAULT_ACCOUNT_ID = 100;
37     constexpr int SHORT_KEY_TIMEOUT_AFTER_USE = 1000; // ms
38     constexpr int SHORT_KEY_TIMEOUT_BEFORE_USE = 3000; // ms
39     const std::string HIGH_TEXT_CONTRAST_ENABLED = "high_text_contrast_enabled";
40     const std::string ACCESSIBILITY_DISPLAY_INVERSION_ENABLED = "accessibility_display_inversion_enabled";
41     const std::string ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED = "accessibility_display_daltonizer_enabled";
42     const std::string MASTER_MONO = "master_mono";
43     const std::string ACCESSIBILITY_SCREENREADER_ENABLED = "accessibility_screenreader_enabled";
44     const std::string MASTER_BALENCE = "master_balance";
45     const std::string CLICK_RESPONSE_TIME = "click_response_time";
46     const std::string IGNORE_REPEAT_CLICK_SWITCH = "ignore_repeat_click_switch";
47     const std::string IGNORE_REPEAT_CLICK_TIME = "ignore_repeat_click_time";
48     const std::string ACCESSIBILITY_DISPLAY_DALTONIZER = "accessibility_display_daltonizer";
49     const std::string SCREEN_READER_BUNDLE_ABILITY_NAME = "com.huawei.hmos.screenreader/AccessibilityExtAbility";
50     const std::string DEVICE_PROVISIONED = "device_provisioned";
51     const std::string ENABLED_ACCESSIBILITY_SERVICES = "enabled_accessibility_services";
52     const std::string ACCESSIBILITY_SHORTCUT_ENABLED = "accessibility_shortcut_enabled";
53     const std::string ACCESSIBILITY_SHORTCUT_ENABLED_ON_LOCK_SCREEN = "accessibility_shortcut_enabled_on_lock_screen";
54     const std::string ACCESSIBILITY_SHORTCUT_TIMEOUT = "accessibility_shortcut_timeout";
55     const std::string SCREEN_MAGNIFICATION_KEY = "accessibility_display_magnification_enabled";
56     const std::string ACCESSIBILITY_CLONE_FLAG = "accessibility_config_clone";
57     const std::string ACCESSIBILITY_PRIVACY_CLONE_OR_UPGRADE = "accessibility_privacy_clone_or_upgrade";
58 } // namespace
59 
AccessibilityAccountData(int32_t accountId)60 AccessibilityAccountData::AccessibilityAccountData(int32_t accountId)
61 {
62     id_ = accountId;
63 }
64 
~AccessibilityAccountData()65 AccessibilityAccountData::~AccessibilityAccountData()
66 {}
67 
GetAccountId()68 int32_t AccessibilityAccountData::GetAccountId()
69 {
70     HILOG_INFO();
71     return id_;
72 }
73 
GetAccessibilityState()74 uint32_t AccessibilityAccountData::GetAccessibilityState()
75 {
76     HILOG_DEBUG();
77     uint32_t state = 0;
78     if (connectedA11yAbilities_.GetSize() != 0 || connectingA11yAbilities_.GetSize() != 0) {
79         HILOG_DEBUG("connectingA11yAbilities %{public}zu connectedA11yAbilities %{public}zu",
80             connectingA11yAbilities_.GetSize(), connectedA11yAbilities_.GetSize());
81         state |= STATE_ACCESSIBILITY_ENABLED;
82         if (!config_->GetEnabledState()) {
83             config_->SetEnabled(true);
84         }
85     } else {
86         if (config_->GetEnabledState()) {
87             config_->SetEnabled(false);
88         }
89     }
90 
91     if (config_->GetTouchGuideState()) {
92         state |= STATE_EXPLORATION_ENABLED;
93     }
94 
95     if (config_->GetKeyEventObserverState()) {
96         state |= STATE_KEYEVENT_ENABLED;
97     }
98 
99     if (config_->GetGestureState()) {
100         state |= STATE_GESTURE_ENABLED;
101     }
102     return state;
103 }
104 
OnAccountSwitched()105 void AccessibilityAccountData::OnAccountSwitched()
106 {
107     HILOG_INFO();
108     connectingA11yAbilities_.Clear();
109     std::vector<sptr<AccessibleAbilityConnection>> connectionList;
110     connectedA11yAbilities_.GetAccessibilityAbilities(connectionList);
111     for (auto& connection : connectionList) {
112         if (connection) {
113             connection->Disconnect();
114         }
115     }
116 
117     connectedA11yAbilities_.Clear();
118     enabledAbilities_.clear();
119     std::lock_guard lock(asacConnectionsMutex_);
120     asacConnections_.clear();
121 }
122 
AddConnectedAbility(sptr<AccessibleAbilityConnection> & connection)123 void AccessibilityAccountData::AddConnectedAbility(sptr<AccessibleAbilityConnection>& connection)
124 {
125     if (!connection) {
126         HILOG_ERROR("connection is nullptr");
127         return;
128     }
129 
130     std::string uri = Utils::GetUri(connection->GetElementName());
131     connectedA11yAbilities_.AddAccessibilityAbility(uri, connection);
132 }
133 
RemoveConnectedAbility(const AppExecFwk::ElementName & element)134 void AccessibilityAccountData::RemoveConnectedAbility(const AppExecFwk::ElementName &element)
135 {
136     connectedA11yAbilities_.RemoveAccessibilityAbilityByUri(Utils::GetUri(element));
137 }
138 
AddCaptionPropertyCallback(const sptr<IAccessibleAbilityManagerCaptionObserver> & callback)139 void AccessibilityAccountData::AddCaptionPropertyCallback(
140     const sptr<IAccessibleAbilityManagerCaptionObserver>& callback)
141 {
142     HILOG_DEBUG();
143     std::lock_guard<ffrt::mutex> lock(captionPropertyCallbacksMutex_);
144     captionPropertyCallbacks_.push_back(callback);
145 }
146 
RemoveCaptionPropertyCallback(const wptr<IRemoteObject> & callback)147 void AccessibilityAccountData::RemoveCaptionPropertyCallback(const wptr<IRemoteObject>& callback)
148 {
149     HILOG_DEBUG();
150     std::lock_guard<ffrt::mutex> lock(captionPropertyCallbacksMutex_);
151     for (auto itr = captionPropertyCallbacks_.begin(); itr != captionPropertyCallbacks_.end(); itr++) {
152         if ((*itr)->AsObject() == callback) {
153             captionPropertyCallbacks_.erase(itr);
154             break;
155         }
156     }
157 }
158 
AddEnableAbilityListsObserver(const sptr<IAccessibilityEnableAbilityListsObserver> & observer)159 void AccessibilityAccountData::AddEnableAbilityListsObserver(
160     const sptr<IAccessibilityEnableAbilityListsObserver>& observer)
161 {
162     HILOG_DEBUG();
163     std::lock_guard<ffrt::mutex> lock(enableAbilityListObserversMutex_);
164     if (std::any_of(enableAbilityListsObservers_.begin(), enableAbilityListsObservers_.end(),
165         [observer](const sptr<IAccessibilityEnableAbilityListsObserver> &listObserver) {
166             return listObserver == observer;
167         })) {
168         HILOG_ERROR("observer is already exist");
169         return;
170     }
171     enableAbilityListsObservers_.push_back(observer);
172     HILOG_DEBUG("observer's size is %{public}zu", enableAbilityListsObservers_.size());
173 }
174 
RemoveEnableAbilityListsObserver(const wptr<IRemoteObject> & observer)175 void AccessibilityAccountData::RemoveEnableAbilityListsObserver(const wptr<IRemoteObject>& observer)
176 {
177     HILOG_INFO();
178     std::lock_guard<ffrt::mutex> lock(enableAbilityListObserversMutex_);
179     for (auto itr = enableAbilityListsObservers_.begin(); itr != enableAbilityListsObservers_.end(); itr++) {
180         if ((*itr)->AsObject() == observer) {
181             HILOG_DEBUG("erase observer");
182             enableAbilityListsObservers_.erase(itr);
183             HILOG_DEBUG("observer's size is %{public}zu", enableAbilityListsObservers_.size());
184             return;
185         }
186     }
187 }
188 
UpdateEnableAbilityListsState()189 void AccessibilityAccountData::UpdateEnableAbilityListsState()
190 {
191     std::lock_guard<ffrt::mutex> lock(enableAbilityListObserversMutex_);
192     HILOG_DEBUG("observer's size is %{public}zu", enableAbilityListsObservers_.size());
193     for (auto &observer : enableAbilityListsObservers_) {
194         if (observer) {
195             observer->OnAccessibilityEnableAbilityListsChanged();
196         }
197     }
198 }
199 
UpdateInstallAbilityListsState()200 void AccessibilityAccountData::UpdateInstallAbilityListsState()
201 {
202     std::lock_guard<ffrt::mutex> lock(enableAbilityListObserversMutex_);
203     HILOG_DEBUG("observer's size is %{public}zu", enableAbilityListsObservers_.size());
204     for (auto &observer : enableAbilityListsObservers_) {
205         if (observer) {
206             observer->OnAccessibilityInstallAbilityListsChanged();
207         }
208     }
209 }
210 
AddAccessibilityWindowConnection(const int32_t windowId,const sptr<AccessibilityWindowConnection> & interactionConnection)211 void AccessibilityAccountData::AddAccessibilityWindowConnection(
212     const int32_t windowId, const sptr<AccessibilityWindowConnection>& interactionConnection)
213 {
214     HILOG_INFO("windowId(%{public}d)", windowId);
215     std::lock_guard lock(asacConnectionsMutex_);
216     asacConnections_[windowId] = interactionConnection;
217 }
218 
RemoveAccessibilityWindowConnection(const int32_t windowId)219 void AccessibilityAccountData::RemoveAccessibilityWindowConnection(const int32_t windowId)
220 {
221     HILOG_INFO("windowId(%{public}d)", windowId);
222     std::lock_guard lock(asacConnectionsMutex_);
223     std::map<int32_t, sptr<AccessibilityWindowConnection>>::iterator it = asacConnections_.find(windowId);
224     if (it != asacConnections_.end()) {
225         asacConnections_.erase(it);
226     }
227 }
228 
AddConnectingA11yAbility(const std::string & uri,const sptr<AccessibleAbilityConnection> & connection)229 void AccessibilityAccountData::AddConnectingA11yAbility(const std::string &uri,
230     const sptr<AccessibleAbilityConnection> &connection)
231 {
232     connectingA11yAbilities_.AddAccessibilityAbility(uri, connection);
233 }
234 
RemoveConnectingA11yAbility(const std::string & uri)235 void AccessibilityAccountData::RemoveConnectingA11yAbility(const std::string &uri)
236 {
237     connectingA11yAbilities_.RemoveAccessibilityAbilityByUri(uri);
238 }
239 
AddEnabledAbility(const std::string & name)240 void AccessibilityAccountData::AddEnabledAbility(const std::string &name)
241 {
242     HILOG_DEBUG("AddEnabledAbility start.");
243     if (std::any_of(enabledAbilities_.begin(), enabledAbilities_.end(),
244         [name](const std::string &abilityName) {
245             return abilityName == name;
246         })) {
247         HILOG_DEBUG("The ability is already enabled, and it's name is %{public}s", name.c_str());
248         return;
249     }
250     enabledAbilities_.push_back(name);
251     if (name == screenReaderAbilityName_) {
252         SetScreenReaderState(screenReaderKey_, "1");
253     }
254     UpdateEnableAbilityListsState();
255     HILOG_DEBUG("Add EnabledAbility: %{public}zu", enabledAbilities_.size());
256 }
257 
RemoveEnabledAbility(const std::string & name)258 RetError AccessibilityAccountData::RemoveEnabledAbility(const std::string &name)
259 {
260     HILOG_DEBUG("RemoveEnabledAbility start");
261     for (auto it = enabledAbilities_.begin(); it != enabledAbilities_.end(); it++) {
262         if (*it == name) {
263             HILOG_DEBUG("Removed %{public}s from EnabledAbility: ", name.c_str());
264             enabledAbilities_.erase(it);
265             if (name == screenReaderAbilityName_) {
266                 SetScreenReaderState(screenReaderKey_, "0");
267             }
268             UpdateEnableAbilityListsState();
269             HILOG_DEBUG("EnabledAbility size %{public}zu", enabledAbilities_.size());
270             return RET_OK;
271         }
272     }
273     HILOG_ERROR("The ability %{public}s is not enabled.", name.c_str());
274     return RET_ERR_NOT_ENABLED;
275 }
276 
AddInstalledAbility(AccessibilityAbilityInfo & abilityInfo)277 void AccessibilityAccountData::AddInstalledAbility(AccessibilityAbilityInfo& abilityInfo)
278 {
279     HILOG_DEBUG("abilityInfo's bundle name is %{public}s", abilityInfo.GetPackageName().c_str());
280     for (size_t i = 0; i < installedAbilities_.size(); i++) {
281         if ((installedAbilities_[i].GetPackageName() == abilityInfo.GetPackageName()) &&
282             installedAbilities_[i].GetName() == abilityInfo.GetName()) {
283             HILOG_DEBUG("the ability is already exist.");
284             return;
285         }
286     }
287     installedAbilities_.push_back(abilityInfo);
288     UpdateInstallAbilityListsState();
289     HILOG_DEBUG("push back installed ability successfully and installedAbilities_'s size is %{public}zu",
290         installedAbilities_.size());
291 }
292 
RemoveInstalledAbility(const std::string & bundleName)293 void AccessibilityAccountData::RemoveInstalledAbility(const std::string &bundleName)
294 {
295     HILOG_DEBUG("start.");
296     for (auto it = installedAbilities_.begin(); it != installedAbilities_.end();) {
297         if (it->GetPackageName() == bundleName) {
298             HILOG_DEBUG("Removed %{public}s from InstalledAbility: ", bundleName.c_str());
299             if (!config_) {
300                 it = installedAbilities_.erase(it);
301                 UpdateInstallAbilityListsState();
302                 continue;
303             }
304             it = installedAbilities_.erase(it);
305             UpdateInstallAbilityListsState();
306         } else {
307             ++it;
308         }
309     }
310 }
311 
ClearInstalledAbility()312 void AccessibilityAccountData::ClearInstalledAbility()
313 {
314     HILOG_DEBUG("start.");
315     installedAbilities_.clear();
316 }
317 
GetAccessibleAbilityConnection(const std::string & elementName)318 const sptr<AccessibleAbilityConnection> AccessibilityAccountData::GetAccessibleAbilityConnection(
319     const std::string &elementName)
320 {
321     return connectedA11yAbilities_.GetAccessibilityAbilityByName(elementName);
322 }
323 
GetAccessibilityWindowConnection(const int32_t windowId)324 const sptr<AccessibilityWindowConnection> AccessibilityAccountData::GetAccessibilityWindowConnection(
325     const int32_t windowId)
326 {
327     std::lock_guard lock(asacConnectionsMutex_);
328     HILOG_DEBUG("window id[%{public}d] interactionOperators's size[%{public}zu]", windowId, asacConnections_.size());
329     for (auto &asacConnection : asacConnections_) {
330         HILOG_DEBUG("window id of asacConnection is %{public}d", asacConnection.first);
331     }
332 
333     if (asacConnections_.count(windowId) > 0) {
334         return asacConnections_[windowId];
335     }
336 
337     return nullptr;
338 }
339 
GetConnectedA11yAbilities()340 const std::map<std::string, sptr<AccessibleAbilityConnection>> AccessibilityAccountData::GetConnectedA11yAbilities()
341 {
342     std::map<std::string, sptr<AccessibleAbilityConnection>> connectionMap;
343     connectedA11yAbilities_.GetAccessibilityAbilitiesMap(connectionMap);
344     return connectionMap;
345 }
346 
GetAsacConnections()347 const std::map<int32_t, sptr<AccessibilityWindowConnection>> AccessibilityAccountData::GetAsacConnections()
348 {
349     HILOG_DEBUG("GetAsacConnections start.");
350     return asacConnections_;
351 }
352 
GetCaptionPropertyCallbacks()353 const CaptionPropertyCallbacks AccessibilityAccountData::GetCaptionPropertyCallbacks()
354 {
355     HILOG_DEBUG("GetCaptionPropertyCallbacks start.");
356     std::lock_guard<ffrt::mutex> lock(captionPropertyCallbacksMutex_);
357     CaptionPropertyCallbacks rtnVec = captionPropertyCallbacks_;
358     return rtnVec;
359 }
360 
GetConnectingA11yAbility(const std::string & uri)361 sptr<AccessibleAbilityConnection> AccessibilityAccountData::GetConnectingA11yAbility(const std::string &uri)
362 {
363     return connectingA11yAbilities_.GetAccessibilityAbilityByUri(uri);
364 }
365 
GetEnabledAbilities()366 const std::vector<std::string> &AccessibilityAccountData::GetEnabledAbilities()
367 {
368     HILOG_DEBUG("enabledAbilities_'s size is (%{public}zu).", enabledAbilities_.size());
369     for (auto& ability : enabledAbilities_) {
370         HILOG_DEBUG("bundleName is %{public}s ", ability.c_str());
371     }
372     return enabledAbilities_;
373 }
374 
GetInstalledAbilities() const375 const std::vector<AccessibilityAbilityInfo> &AccessibilityAccountData::GetInstalledAbilities() const
376 {
377     HILOG_DEBUG("GetInstalledAbilities start.");
378     return installedAbilities_;
379 }
380 
GetAbilitiesByState(AbilityStateType state,std::vector<AccessibilityAbilityInfo> & abilities)381 void AccessibilityAccountData::GetAbilitiesByState(AbilityStateType state,
382     std::vector<AccessibilityAbilityInfo> &abilities)
383 {
384     HILOG_DEBUG("get abilities by state %{public}d", state);
385     if (state == ABILITY_STATE_ENABLE) {
386         connectedA11yAbilities_.GetAbilitiesInfo(abilities);
387     } else if (state == ABILITY_STATE_DISABLE) {
388         GetDisableAbilities(abilities);
389         HILOG_DEBUG("the size of disable abilities is %{public}zu", abilities.size());
390     } else {
391         abilities = installedAbilities_;
392     }
393 }
394 
GetDisableAbilities(std::vector<AccessibilityAbilityInfo> & disabledAbilities)395 void AccessibilityAccountData::GetDisableAbilities(std::vector<AccessibilityAbilityInfo> &disabledAbilities)
396 {
397     HILOG_DEBUG("get disable abilities");
398     disabledAbilities = installedAbilities_;
399     connectedA11yAbilities_.GetDisableAbilities(disabledAbilities);
400 }
401 
UpdateAccountCapabilities()402 void AccessibilityAccountData::UpdateAccountCapabilities()
403 {
404     HILOG_DEBUG("start.");
405     UpdateFilteringKeyEventsCapability();
406     UpdateEventTouchGuideCapability();
407     UpdateGesturesSimulationCapability();
408     UpdateMagnificationCapability();
409     config_->SetTouchGuideState(isEventTouchGuideState_);
410     config_->SetGestureState(isGesturesSimulation_);
411     config_->SetKeyEventObserverState(isFilteringKeyEvents_);
412 }
413 
UpdateEventTouchGuideCapability()414 void AccessibilityAccountData::UpdateEventTouchGuideCapability()
415 {
416     if (connectedA11yAbilities_.IsExistCapability(Capability::CAPABILITY_TOUCH_GUIDE)) {
417         isEventTouchGuideState_ = true;
418         return;
419     }
420 
421     isEventTouchGuideState_ = false;
422 }
423 
UpdateGesturesSimulationCapability()424 void AccessibilityAccountData::UpdateGesturesSimulationCapability()
425 {
426     if (connectedA11yAbilities_.IsExistCapability(Capability::CAPABILITY_GESTURE)) {
427         isGesturesSimulation_ = true;
428         return;
429     }
430 
431     isGesturesSimulation_ = false;
432 }
433 
UpdateFilteringKeyEventsCapability()434 void AccessibilityAccountData::UpdateFilteringKeyEventsCapability()
435 {
436     if (connectedA11yAbilities_.IsExistCapability(Capability::CAPABILITY_KEY_EVENT_OBSERVER)) {
437         isFilteringKeyEvents_ = true;
438         return;
439     }
440 
441     isFilteringKeyEvents_ = false;
442 }
443 
UpdateMagnificationCapability()444 void AccessibilityAccountData::UpdateMagnificationCapability()
445 {
446     if (connectedA11yAbilities_.IsExistCapability(Capability::CAPABILITY_ZOOM)) {
447         isScreenMagnification_ = true;
448         return;
449     }
450 
451     isScreenMagnification_ = false;
452 }
453 
SetScreenReaderExtInAllAccounts(const bool state)454 void AccessibilityAccountData::SetScreenReaderExtInAllAccounts(const bool state)
455 {
456     RetError rtn = RET_OK;
457     std::vector<int32_t> accountIds = Singleton<AccessibleAbilityManagerService>::GetInstance().GetAllAccountIds();
458     for (auto accountId : accountIds) {
459         auto accountData = Singleton<AccessibleAbilityManagerService>::GetInstance().GetAccountData(accountId);
460         if (accountData == nullptr) {
461             HILOG_WARN("accountData is nullptr, accountId = %{public}d", accountId);
462             continue;
463         }
464         std::shared_ptr<AccessibilitySettingsConfig> config = accountData->GetConfig();
465         if (config == nullptr) {
466             HILOG_WARN("config is nullptr, accountId = %{public}d", accountId);
467             continue;
468         }
469         if (state) {
470             rtn = config->AddEnabledAccessibilityService(SCREEN_READER_BUNDLE_ABILITY_NAME);
471         } else {
472             rtn = config->RemoveEnabledAccessibilityService(SCREEN_READER_BUNDLE_ABILITY_NAME);
473         }
474         HILOG_INFO("set screenReader state = %{public}d, rtn = %{public}d, accountId = %{public}d", state, rtn,
475             accountId);
476     }
477 }
478 
SetAbilityAutoStartState(const std::string & name,const bool state)479 void AccessibilityAccountData::SetAbilityAutoStartState(const std::string &name, const bool state)
480 {
481     RetError rtn = RET_OK;
482     if (name == SCREEN_READER_BUNDLE_ABILITY_NAME) {
483         SetScreenReaderState(screenReaderKey_, state ? "1" : "0");
484         SetScreenReaderExtInAllAccounts(state);
485         return;
486     }
487     if (!config_) {
488         HILOG_WARN("conig_ is nullptr.");
489         return;
490     }
491     if (state) {
492         rtn = config_->AddEnabledAccessibilityService(name);
493     } else {
494         rtn = config_->RemoveEnabledAccessibilityService(name);
495     }
496     if (rtn != RET_OK) {
497         HILOG_WARN("handle service %{public}s state = %{public}d failed, rtn = %{public}d", name.c_str(), state, rtn);
498     }
499 }
500 
SetScreenReaderState(const std::string & name,const std::string & state)501 void AccessibilityAccountData::SetScreenReaderState(const std::string &name, const std::string &state)
502 {
503     HILOG_DEBUG("set screen reader key [%{public}s], state = [%{public}s].", name.c_str(), state.c_str());
504     std::shared_ptr<AccessibilitySettingProvider> service =
505         AccessibilitySettingProvider::GetInstance(POWER_MANAGER_SERVICE_ID);
506     if (service == nullptr) {
507         HILOG_ERROR("service is nullptr");
508         return;
509     }
510     ErrCode ret = service->PutStringValue(name, state, true);
511     if (ret != ERR_OK) {
512         HILOG_ERROR("set failed, ret=%{public}d", ret);
513     }
514 }
515 
GetDefaultUserScreenReaderState()516 bool AccessibilityAccountData::GetDefaultUserScreenReaderState()
517 {
518     HILOG_DEBUG();
519     std::vector<std::string> services = config_->GetEnabledAccessibilityServices();
520     auto iter = std::find(services.begin(), services.end(), SCREEN_READER_BUNDLE_ABILITY_NAME);
521     return iter != services.end();
522 }
523 
DelAutoStartPrefKeyInRemovePkg(const std::string & bundleName)524 void AccessibilityAccountData::DelAutoStartPrefKeyInRemovePkg(const std::string &bundleName)
525 {
526     HILOG_ERROR("start and bundleName[%{public}s].", bundleName.c_str());
527     if (installedAbilities_.empty()) {
528         HILOG_DEBUG("There is no installed abilities.");
529         return;
530     }
531     for (auto &installAbility : installedAbilities_) {
532         if (installAbility.GetPackageName() == bundleName) {
533             std::string abilityName = installAbility.GetName();
534             std::string uri = Utils::GetUri(bundleName, abilityName);
535             SetAbilityAutoStartState(uri, false);
536             break;
537         }
538     }
539 }
540 
GetAbilityAutoStartState(const std::string & name)541 bool AccessibilityAccountData::GetAbilityAutoStartState(const std::string &name)
542 {
543     if (name == SCREEN_READER_BUNDLE_ABILITY_NAME && GetAccountType() == AccountSA::OsAccountType::PRIVATE) {
544         return GetDefaultUserScreenReaderState();
545     }
546     if (!config_) {
547         HILOG_WARN("config_ is nullptr.");
548         return false;
549     }
550     std::vector<std::string> serviceList = config_->GetEnabledAccessibilityServices();
551     auto iter = std::find(serviceList.begin(), serviceList.end(), name);
552     if (iter != serviceList.end()) {
553         return true;
554     } else {
555         return false;
556     }
557 }
558 
GetConfigValueAtoHos(ConfigValueAtoHosUpdate & value)559 void AccessibilityAccountData::GetConfigValueAtoHos(ConfigValueAtoHosUpdate &value)
560 {
561     HILOG_DEBUG();
562     if (config_ == nullptr) {
563         HILOG_ERROR("config_ is nullptr");
564         return;
565     }
566 
567     if (config_->GetDbHandle() == nullptr) {
568         HILOG_INFO("helper is null, retry.");
569         std::this_thread::sleep_for(std::chrono::milliseconds(INIT_DATASHARE_HELPER_SLEEP_TIME));
570         if (config_->GetDbHandle() == nullptr) {
571             HILOG_ERROR("helper is null");
572             return;
573         }
574     }
575 
576     value.highContrastText = config_->GetDbHandle()->GetBoolValue(HIGH_TEXT_CONTRAST_ENABLED, false);
577     value.invertColor = config_->GetDbHandle()->GetBoolValue(ACCESSIBILITY_DISPLAY_INVERSION_ENABLED, false);
578     value.daltonizationState = config_->GetDbHandle()->GetBoolValue(ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, false);
579     value.displayDaltonizer = config_->GetDbHandle()->GetIntValue(ACCESSIBILITY_DISPLAY_DALTONIZER, 0);
580     value.shortcutEnabled = config_->GetDbHandle()->GetBoolValue(ACCESSIBILITY_SHORTCUT_ENABLED, true);
581     value.shortcutEnabledOnLockScreen = config_->GetDbHandle()->GetBoolValue(
582         ACCESSIBILITY_SHORTCUT_ENABLED_ON_LOCK_SCREEN, true);
583     value.shortcutTimeout = config_->GetDbHandle()->GetIntValue(ACCESSIBILITY_SHORTCUT_TIMEOUT,
584         SHORT_KEY_TIMEOUT_BEFORE_USE);
585     value.clickResponseTime = config_->GetDbHandle()->GetIntValue(CLICK_RESPONSE_TIME, 0);
586     value.ignoreRepeatClickState = config_->GetDbHandle()->GetBoolValue(IGNORE_REPEAT_CLICK_SWITCH, false);
587     value.ignoreRepeatClickTime = config_->GetDbHandle()->GetIntValue(IGNORE_REPEAT_CLICK_TIME, 0);
588     value.screenMagnificationState = config_->GetDbHandle()->GetBoolValue(SCREEN_MAGNIFICATION_KEY, false);
589 
590     // In Aos, the audio configuration is stored in SYSTEM and it should be copied to SECURE
591     config_->CloneAudioState();
592     value.audioMono = config_->GetDbHandle()->GetBoolValue(MASTER_MONO, false);
593     value.audioBalance = config_->GetDbHandle()->GetFloatValue(MASTER_BALENCE, 0);
594 
595     std::shared_ptr<AccessibilitySettingProvider> service =
596         AccessibilitySettingProvider::GetInstance(POWER_MANAGER_SERVICE_ID);
597     if (service == nullptr) {
598         HILOG_ERROR("service is nullptr");
599         return;
600     }
601     service->PutBoolValue(ACCESSIBILITY_PRIVACY_CLONE_OR_UPGRADE, true);
602     service->GetBoolValue(ACCESSIBILITY_SCREENREADER_ENABLED, value.isScreenReaderEnabled);
603     service->DeleteInstance();
604 }
605 
EnableAbility(const std::string & name,const uint32_t capabilities)606 RetError AccessibilityAccountData::EnableAbility(const std::string &name, const uint32_t capabilities)
607 {
608     HILOG_DEBUG("start and name[%{public}s] capabilities[%{public}d]", name.c_str(), capabilities);
609 
610     bool isInstalled = false;
611     for (auto itr = installedAbilities_.begin(); itr != installedAbilities_.end(); itr++) {
612         if (itr->GetId() == name) {
613             isInstalled = true;
614 
615             // Judge capabilities
616             uint32_t resultCapabilities = itr->GetStaticCapabilityValues() & capabilities;
617             HILOG_DEBUG("resultCapabilities is [%{public}d]", resultCapabilities);
618             if (resultCapabilities == 0) {
619                 HILOG_ERROR("the result of capabilities is wrong");
620                 return RET_ERR_NO_CAPABILITY;
621             }
622 
623             itr->SetCapabilityValues(resultCapabilities);
624             break;
625         }
626     }
627     if (!isInstalled) {
628         HILOG_ERROR("the ability[%{public}s] is not installed", name.c_str());
629         return RET_ERR_NOT_INSTALLED;
630     }
631 
632     // Add enabled ability
633     if (std::any_of(enabledAbilities_.begin(), enabledAbilities_.end(),
634         [name](const std::string &abilityName) {
635             return abilityName == name;
636         })) {
637         HILOG_ERROR("The ability[%{public}s] is already enabled", name.c_str());
638         return RET_ERR_CONNECTION_EXIST;
639     }
640     HITRACE_METER_NAME(HITRACE_TAG_ACCESSIBILITY_MANAGER, "EnableAbility:" + name);
641 
642     enabledAbilities_.push_back(name);
643     SetAbilityAutoStartState(name, true);
644     if (name == screenReaderAbilityName_) {
645         SetScreenReaderState(screenReaderKey_, "1");
646     }
647     UpdateAbilities();
648     Utils::RecordStartingA11yEvent(name);
649     return RET_OK;
650 }
651 
GetInstalledAbilitiesFromBMS()652 bool AccessibilityAccountData::GetInstalledAbilitiesFromBMS()
653 {
654     HILOG_DEBUG("start.");
655     HITRACE_METER_NAME(HITRACE_TAG_ACCESSIBILITY_MANAGER, "QueryInstalledAbilityInfo");
656     std::vector<AppExecFwk::ExtensionAbilityInfo> extensionInfos;
657     sptr<AppExecFwk::IBundleMgr> bms = Singleton<AccessibleAbilityManagerService>::GetInstance().GetBundleMgrProxy();
658     if (!bms) {
659         Utils::RecordUnavailableEvent(A11yUnavailableEvent::QUERY_EVENT, A11yError::ERROR_QUERY_PACKAGE_INFO_FAILED);
660         HILOG_ERROR("GetBundleMgrProxy failed.");
661         return false;
662     }
663     bool ret = bms->QueryExtensionAbilityInfos(AppExecFwk::ExtensionAbilityType::ACCESSIBILITY, id_, extensionInfos);
664     if (!ret) {
665         Utils::RecordUnavailableEvent(A11yUnavailableEvent::QUERY_EVENT, A11yError::ERROR_QUERY_PACKAGE_INFO_FAILED);
666         HILOG_ERROR("Query extension ability information failed.");
667     }
668     HILOG_DEBUG("query extensionAbilityInfos' size is %{public}zu.", extensionInfos.size());
669     for (auto& info : extensionInfos) {
670         AccessibilityAbilityInitParams initParams;
671         Utils::Parse(info, initParams);
672         std::shared_ptr<AccessibilityAbilityInfo> accessibilityInfo =
673             std::make_shared<AccessibilityAbilityInfo>(initParams);
674         AddInstalledAbility(*accessibilityInfo);
675     }
676     return true;
677 }
678 
Init()679 void AccessibilityAccountData::Init()
680 {
681     HILOG_DEBUG("Init start.");
682     if (!config_) {
683         config_ = std::make_shared<AccessibilitySettingsConfig>(id_);
684         config_->Init();
685     } else {
686         config_->InitSetting();
687     }
688     ErrCode rtn = AccountSA::OsAccountManager::GetOsAccountType(id_, accountType_);
689     if (rtn != ERR_OK) {
690         HILOG_ERROR("get account type failed for accountId [%{public}d]", id_);
691     }
692     std::shared_ptr<AccessibilitySettingProvider> service =
693         AccessibilitySettingProvider::GetInstance(POWER_MANAGER_SERVICE_ID);
694     if (service == nullptr) {
695         HILOG_ERROR("service is nullptr");
696         return;
697     }
698     bool cloneState = false;
699     service->GetBoolValue(ACCESSIBILITY_CLONE_FLAG, cloneState);
700     if (cloneState == true) {
701         service->PutBoolValue(ACCESSIBILITY_CLONE_FLAG, false);
702     }
703     if (id_ != DEFAULT_ACCOUNT_ID) {
704         HILOG_WARN("id != default_account_id.");
705         return;
706     }
707 
708     HILOG_INFO("register clone observer.");
709     AccessibilitySettingObserver::UpdateFunc func = [ = ](const std::string& state) {
710         Singleton<AccessibleAbilityManagerService>::GetInstance().OnDataClone();
711     };
712     RetError ret = service->RegisterObserver(ACCESSIBILITY_CLONE_FLAG, func);
713     if (ret != RET_OK) {
714         HILOG_WARN("register clone observer failed %{public}d.", ret);
715     }
716 }
717 
AddConfigCallback(const sptr<IAccessibleAbilityManagerConfigObserver> & callback)718 void AccessibilityAccountData::AddConfigCallback(
719     const sptr<IAccessibleAbilityManagerConfigObserver>& callback)
720 {
721     HILOG_DEBUG("AddConfigCallback start.");
722     std::lock_guard<ffrt::mutex> lock(configCallbacksMutex_);
723     configCallbacks_.push_back(callback);
724 }
725 
GetConfigCallbacks()726 const std::vector<sptr<IAccessibleAbilityManagerConfigObserver>> AccessibilityAccountData::GetConfigCallbacks()
727 {
728     HILOG_DEBUG("GetConfigCallbacks start.");
729     std::lock_guard<ffrt::mutex> lock(configCallbacksMutex_);
730     std::vector<sptr<IAccessibleAbilityManagerConfigObserver>> rtnVec = configCallbacks_;
731     return rtnVec;
732 }
733 
SetConfigCallbacks(std::vector<sptr<IAccessibleAbilityManagerConfigObserver>> & observer)734 void AccessibilityAccountData::SetConfigCallbacks(std::vector<sptr<IAccessibleAbilityManagerConfigObserver>>& observer)
735 {
736     HILOG_DEBUG("SetConfigCallbacks start.");
737     std::lock_guard<ffrt::mutex> lock(configCallbacksMutex_);
738     configCallbacks_ = observer;
739 }
740 
RemoveConfigCallback(const wptr<IRemoteObject> & callback)741 void AccessibilityAccountData::RemoveConfigCallback(const wptr<IRemoteObject>& callback)
742 {
743     HILOG_DEBUG("RemoveConfigCallback start.");
744     std::lock_guard<ffrt::mutex> lock(configCallbacksMutex_);
745     for (auto itr = configCallbacks_.begin(); itr != configCallbacks_.end(); itr++) {
746         if ((*itr)->AsObject() == callback) {
747             configCallbacks_.erase(itr);
748             break;
749         }
750     }
751 }
752 
GetConfig()753 std::shared_ptr<AccessibilitySettingsConfig> AccessibilityAccountData::GetConfig()
754 {
755     HILOG_DEBUG("GetConfig start.");
756     return config_;
757 }
758 
GetImportantEnabledAbilities(std::map<std::string,uint32_t> & importantEnabledAbilities) const759 void AccessibilityAccountData::GetImportantEnabledAbilities(
760     std::map<std::string, uint32_t> &importantEnabledAbilities) const
761 {
762     HILOG_DEBUG("GetImportantEnabledAbilities start.");
763     if (installedAbilities_.empty()) {
764         HILOG_DEBUG("Current user has no installed Abilities.");
765         return;
766     }
767     if (enabledAbilities_.empty()) {
768         HILOG_DEBUG("Current user has no enabled abilities.");
769         return;
770     }
771     HILOG_DEBUG("installedAbilities_'s is %{public}zu.", installedAbilities_.size());
772     for (auto &installAbility : installedAbilities_) {
773         if (!installAbility.IsImportant()) {
774             HILOG_DEBUG("The ability is not important.");
775             continue;
776         }
777         std::string bundleName = installAbility.GetPackageName();
778         std::string abilityName = installAbility.GetName();
779         HILOG_DEBUG("installAbility's packageName is %{public}s and abilityName is %{public}s",
780             bundleName.c_str(), abilityName.c_str());
781         std::string uri = Utils::GetUri(bundleName, abilityName);
782         std::vector<std::string>::const_iterator iter = std::find(enabledAbilities_.begin(),
783             enabledAbilities_.end(), uri);
784         if (iter != enabledAbilities_.end()) {
785             uint32_t capabilityValues = installAbility.GetCapabilityValues();
786             importantEnabledAbilities.emplace(std::make_pair(uri, capabilityValues));
787         }
788     }
789 }
790 
UpdateImportantEnabledAbilities(std::map<std::string,uint32_t> & importantEnabledAbilities)791 void AccessibilityAccountData::UpdateImportantEnabledAbilities(
792     std::map<std::string, uint32_t> &importantEnabledAbilities)
793 {
794     HILOG_DEBUG();
795     if (importantEnabledAbilities.empty()) {
796         HILOG_DEBUG("There is no enabled abilities.");
797         return;
798     }
799     if (installedAbilities_.empty()) {
800         HILOG_DEBUG("Current user has no installedAbilities.");
801         return;
802     }
803     HILOG_DEBUG("installedAbilities is %{public}zu.", installedAbilities_.size());
804     for (auto &installAbility : installedAbilities_) {
805         std::string bundleName = installAbility.GetPackageName();
806         std::string abilityName = installAbility.GetName();
807         HILOG_DEBUG("installAbility's packageName is %{public}s and abilityName is %{public}s",
808             bundleName.c_str(), abilityName.c_str());
809         std::string uri = Utils::GetUri(bundleName, abilityName);
810         std::map<std::string, uint32_t>::iterator iter = importantEnabledAbilities.find(uri);
811         if (iter != importantEnabledAbilities.end()) {
812             AddEnabledAbility(uri);
813             installAbility.SetCapabilityValues(iter->second);
814         }
815     }
816 }
817 
UpdateAutoStartEnabledAbilities()818 void AccessibilityAccountData::UpdateAutoStartEnabledAbilities()
819 {
820     HILOG_DEBUG();
821     if (id_ == -1) {
822         HILOG_DEBUG("Current user is -1.");
823         return;
824     }
825     if (installedAbilities_.empty()) {
826         HILOG_DEBUG("Current user has no installedAbilities.");
827         return;
828     }
829     if (!config_) {
830         HILOG_DEBUG("config_ is null.");
831         return;
832     }
833     HILOG_DEBUG("installedAbilities is %{public}zu.", installedAbilities_.size());
834     for (auto &installAbility : installedAbilities_) {
835         std::string bundleName = installAbility.GetPackageName();
836         std::string abilityName = installAbility.GetName();
837         std::string abilityId = bundleName + "/" + abilityName;
838         if (GetAbilityAutoStartState(abilityId)) {
839             HILOG_INFO("auto start packageName is %{public}s.", bundleName.c_str());
840             uint32_t capabilities = CAPABILITY_GESTURE | CAPABILITY_KEY_EVENT_OBSERVER | CAPABILITY_RETRIEVE |
841                 CAPABILITY_TOUCH_GUIDE | CAPABILITY_ZOOM;
842             uint32_t resultCapabilities = installAbility.GetStaticCapabilityValues() & capabilities;
843             installAbility.SetCapabilityValues(resultCapabilities);
844             std::string uri = Utils::GetUri(bundleName, abilityName);
845             AddEnabledAbility(uri);
846         }
847     }
848 }
849 
GetInputFilterFlag() const850 uint32_t AccessibilityAccountData::GetInputFilterFlag() const
851 {
852     HILOG_DEBUG();
853     if (!config_) {
854         HILOG_ERROR("config is null");
855         return 0;
856     }
857     uint32_t flag = 0;
858     if (config_->GetScreenMagnificationState()) {
859         flag |= AccessibilityInputInterceptor::FEATURE_SCREEN_MAGNIFICATION;
860     }
861     if (isEventTouchGuideState_) {
862         flag |= AccessibilityInputInterceptor::FEATURE_TOUCH_EXPLORATION;
863     }
864     if (isFilteringKeyEvents_) {
865         flag |= AccessibilityInputInterceptor::FEATURE_FILTER_KEY_EVENTS;
866     }
867     if (isGesturesSimulation_) {
868         flag |= AccessibilityInputInterceptor::FEATURE_INJECT_TOUCH_EVENTS;
869     }
870     if (config_->GetMouseKeyState()) {
871         flag |= AccessibilityInputInterceptor::FEATURE_MOUSE_KEY;
872     }
873 
874     int32_t autoclickTime = config_->GetMouseAutoClick();
875     if (autoclickTime >= AUTOCLICK_DELAY_TIME_MIN && autoclickTime <= AUTOCLICK_DELAY_TIME_MAX) {
876         flag |= AccessibilityInputInterceptor::FEATURE_MOUSE_AUTOCLICK;
877     }
878 
879     uint32_t clickResponseTime = config_->GetClickResponseTime();
880     bool ignoreRepeatClickState = config_->GetIgnoreRepeatClickState();
881     if (clickResponseTime > 0 || ignoreRepeatClickState == true) {
882         flag |= AccessibilityInputInterceptor::FEATURE_SCREEN_TOUCH;
883     }
884 
885     return flag;
886 }
887 
UpdateAbilities()888 void AccessibilityAccountData::UpdateAbilities()
889 {
890     HILOG_DEBUG("installedAbilities is %{public}zu.", installedAbilities_.size());
891     for (auto &installAbility : installedAbilities_) {
892         std::string bundleName = installAbility.GetPackageName();
893         std::string abilityName = installAbility.GetName();
894         HILOG_DEBUG("installAbility's packageName is %{public}s and abilityName is %{public}s",
895             bundleName.c_str(), abilityName.c_str());
896 
897         if (connectingA11yAbilities_.GetSizeByUri(Utils::GetUri(bundleName, abilityName))) {
898             HILOG_DEBUG("The ability(bundleName[%{public}s] abilityName[%{public}s]) is connecting.",
899                 bundleName.c_str(), abilityName.c_str());
900             continue;
901         }
902         sptr<AccessibleAbilityConnection> connection =
903             GetAccessibleAbilityConnection(Utils::GetUri(bundleName, abilityName));
904 
905         auto iter = std::find(enabledAbilities_.begin(), enabledAbilities_.end(),
906             Utils::GetUri(bundleName, abilityName));
907         if (iter != enabledAbilities_.end()) {
908             if (connection) {
909                 continue;
910             }
911             AppExecFwk::ElementName element("", bundleName, abilityName);
912             connection = new(std::nothrow) AccessibleAbilityConnection(id_, connectCounter_++, installAbility);
913             if (connection != nullptr && connection->Connect(element)) {
914                 AddConnectingA11yAbility(Utils::GetUri(bundleName, abilityName), connection);
915             }
916         } else {
917             HILOG_DEBUG("not in enabledAbilites list .");
918             if (connection) {
919                 RemoveConnectedAbility(connection->GetElementName());
920                 connection->Disconnect();
921             }
922         }
923     }
924 }
925 
RemoveAbility(const std::string & bundleName)926 bool AccessibilityAccountData::RemoveAbility(const std::string &bundleName)
927 {
928     HILOG_DEBUG("bundleName(%{public}s)", bundleName.c_str());
929     if (installedAbilities_.empty()) {
930         HILOG_DEBUG("There is no installed abilities.");
931         return false;
932     }
933     RemoveInstalledAbility(bundleName);
934 
935     bool result = false;
936     // Remove enabled ability, remove connecting ability if it is connecting.
937     for (auto& enableAbility : enabledAbilities_) {
938         if (enableAbility.substr(0, enableAbility.find("/")) == bundleName) {
939             RemoveEnabledAbility(enableAbility);
940             RemoveConnectingA11yAbility(enableAbility);
941             result = true;
942         }
943     }
944 
945     // Remove connected ability
946     connectedA11yAbilities_.RemoveAccessibilityAbilityByName(bundleName, result);
947     if (result) {
948         UpdateAbilities();
949     }
950 
951     return result;
952 }
953 
AddAbility(const std::string & bundleName)954 void AccessibilityAccountData::AddAbility(const std::string &bundleName)
955 {
956     HILOG_DEBUG("bundleName(%{public}s)", bundleName.c_str());
957 
958     std::vector<AppExecFwk::ExtensionAbilityInfo> extensionInfos;
959     sptr<AppExecFwk::IBundleMgr> bms = Singleton<AccessibleAbilityManagerService>::GetInstance().GetBundleMgrProxy();
960     if (!bms) {
961         HILOG_ERROR("bms is nullptr.");
962         return;
963     }
964     bms->QueryExtensionAbilityInfos(AppExecFwk::ExtensionAbilityType::ACCESSIBILITY, id_, extensionInfos);
965     HILOG_DEBUG("query extensionAbilityInfos' size is %{public}zu.", extensionInfos.size());
966     bool hasNewExtensionAbility = false;
967     for (auto &newAbility : extensionInfos) {
968         if (newAbility.bundleName == bundleName) {
969             HILOG_DEBUG("The package%{public}s added", (bundleName + "/" + newAbility.name).c_str());
970             AccessibilityAbilityInitParams initParams;
971             Utils::Parse(newAbility, initParams);
972             std::shared_ptr<AccessibilityAbilityInfo> accessibilityInfo =
973                 std::make_shared<AccessibilityAbilityInfo>(initParams);
974 
975             std::string abilityId = accessibilityInfo->GetId();
976             if (GetAbilityAutoStartState(abilityId)) {
977                 HILOG_DEBUG("auto start packageName is %{public}s.", bundleName.c_str());
978                 uint32_t capabilities = CAPABILITY_GESTURE | CAPABILITY_KEY_EVENT_OBSERVER | CAPABILITY_RETRIEVE |
979                     CAPABILITY_TOUCH_GUIDE | CAPABILITY_ZOOM;
980                 uint32_t resultCapabilities = accessibilityInfo->GetStaticCapabilityValues() & capabilities;
981                 accessibilityInfo->SetCapabilityValues(resultCapabilities);
982                 AddInstalledAbility(*accessibilityInfo);
983                 hasNewExtensionAbility = true;
984                 std::string uri = Utils::GetUri(bundleName, accessibilityInfo->GetName());
985                 AddEnabledAbility(uri);
986                 RemoveConnectingA11yAbility(uri);
987                 continue;
988             }
989 
990             AddInstalledAbility(*accessibilityInfo);
991             hasNewExtensionAbility = true;
992         }
993     }
994 
995     if (hasNewExtensionAbility) {
996         HILOG_DEBUG("add new extension ability and update abilities.");
997         UpdateAbilities();
998     }
999 }
1000 
ChangeAbility(const std::string & bundleName)1001 void AccessibilityAccountData::ChangeAbility(const std::string &bundleName)
1002 {
1003     HILOG_DEBUG("bundleName(%{public}s)", bundleName.c_str());
1004 
1005     if (installedAbilities_.empty()) {
1006         HILOG_DEBUG("There is no installed abilities.");
1007         return;
1008     }
1009     std::vector<std::string> autoStartAbilities;
1010     for (auto &ability : installedAbilities_) {
1011         if (ability.GetPackageName() != bundleName) {
1012             continue;
1013         }
1014         if (GetAbilityAutoStartState(ability.GetId())) {
1015             autoStartAbilities.push_back(ability.GetId());
1016         }
1017     }
1018 
1019     RemoveInstalledAbility(bundleName);
1020     AddAbility(bundleName);
1021 
1022     for (auto &name : autoStartAbilities) {
1023         auto iter = installedAbilities_.begin();
1024         for (; iter != installedAbilities_.end(); ++iter) {
1025             if (name == iter->GetId()) {
1026                 break;
1027             }
1028         }
1029         if (iter == installedAbilities_.end()) {
1030             SetAbilityAutoStartState(name, false);
1031         }
1032     }
1033 }
1034 
AddUITestClient(const sptr<IRemoteObject> & obj,const std::string & bundleName,const std::string & abilityName)1035 void AccessibilityAccountData::AddUITestClient(const sptr<IRemoteObject> &obj,
1036     const std::string &bundleName, const std::string &abilityName)
1037 {
1038     HILOG_DEBUG();
1039     // Add installed ability
1040     std::shared_ptr<AccessibilityAbilityInfo> abilityInfo = std::make_shared<AccessibilityAbilityInfo>();
1041     abilityInfo->SetPackageName(bundleName);
1042     uint32_t capabilities = CAPABILITY_RETRIEVE | CAPABILITY_GESTURE;
1043     abilityInfo->SetCapabilityValues(capabilities);
1044     abilityInfo->SetAccessibilityAbilityType(ACCESSIBILITY_ABILITY_TYPE_ALL);
1045     abilityInfo->SetEventTypes(EventType::TYPES_ALL_MASK);
1046     AddInstalledAbility(*abilityInfo);
1047 
1048     // Add connected ability
1049     sptr<AppExecFwk::ElementName> elementName = new(std::nothrow) AppExecFwk::ElementName();
1050     if (!elementName) {
1051         HILOG_ERROR("elementName is null");
1052         return;
1053     }
1054     elementName->SetBundleName(bundleName);
1055     elementName->SetAbilityName(abilityName);
1056     sptr<AccessibleAbilityConnection> connection = new(std::nothrow) AccessibleAbilityConnection(
1057         id_, connectCounter_++, *abilityInfo);
1058     if (!connection) {
1059         HILOG_ERROR("connection is null");
1060         return;
1061     }
1062     connection->OnAbilityConnectDoneSync(*elementName, obj);
1063 }
1064 
RemoveUITestClient(sptr<AccessibleAbilityConnection> & connection,const std::string & bundleName)1065 void AccessibilityAccountData::RemoveUITestClient(sptr<AccessibleAbilityConnection> &connection,
1066     const std::string &bundleName)
1067 {
1068     HILOG_DEBUG();
1069     if (!connection) {
1070         HILOG_ERROR("connection is nullptr");
1071         return;
1072     }
1073     RemoveInstalledAbility(bundleName);
1074     RemoveConnectedAbility(connection->GetElementName());
1075     connection->OnAbilityDisconnectDoneSync(connection->GetElementName());
1076 }
1077 
GetAccountType()1078 AccountSA::OsAccountType AccessibilityAccountData::GetAccountType()
1079 {
1080     return accountType_;
1081 }
1082 
AddAccessibilityAbility(const std::string & uri,const sptr<AccessibleAbilityConnection> & connection)1083 void AccessibilityAccountData::AccessibilityAbility::AddAccessibilityAbility(const std::string& uri,
1084     const sptr<AccessibleAbilityConnection>& connection)
1085 {
1086     HILOG_INFO("uri is %{private}s", uri.c_str());
1087     std::lock_guard<ffrt::mutex> lock(mutex_);
1088     if (!connectionMap_.count(uri)) {
1089         connectionMap_[uri] = connection;
1090         HILOG_DEBUG("connectionMap_ size %{public}zu", connectionMap_.size());
1091         return;
1092     }
1093 
1094     HILOG_DEBUG("uri %{private}s, connectionMap_ %{public}zu", uri.c_str(), connectionMap_.size());
1095 }
1096 
RemoveAccessibilityAbilityByUri(const std::string & uri)1097 void AccessibilityAccountData::AccessibilityAbility::RemoveAccessibilityAbilityByUri(const std::string& uri)
1098 {
1099     HILOG_INFO("uri is %{private}s", uri.c_str());
1100     std::lock_guard<ffrt::mutex> lock(mutex_);
1101     auto it = connectionMap_.find(uri);
1102     if (it != connectionMap_.end()) {
1103         connectionMap_.erase(it);
1104     }
1105 
1106     HILOG_DEBUG("connectionMap_ %{public}zu", connectionMap_.size());
1107 }
1108 
GetAccessibilityAbilityByName(const std::string & elementName)1109 sptr<AccessibleAbilityConnection> AccessibilityAccountData::AccessibilityAbility::GetAccessibilityAbilityByName(
1110     const std::string& elementName)
1111 {
1112     HILOG_DEBUG("elementName is %{public}s", elementName.c_str());
1113     std::lock_guard<ffrt::mutex> lock(mutex_);
1114     for (auto& connection : connectionMap_) {
1115         std::string::size_type index = connection.first.find(elementName);
1116         if (index == std::string::npos) {
1117             continue;
1118         } else {
1119             HILOG_DEBUG("uri %{private}s ", connection.first.c_str());
1120             return connection.second;
1121         }
1122     }
1123 
1124     return nullptr;
1125 }
1126 
GetAccessibilityAbilityByUri(const std::string & uri)1127 sptr<AccessibleAbilityConnection> AccessibilityAccountData::AccessibilityAbility::GetAccessibilityAbilityByUri(
1128     const std::string& uri)
1129 {
1130     HILOG_DEBUG("uri is %{private}s", uri.c_str());
1131     std::lock_guard<ffrt::mutex> lock(mutex_);
1132     auto iter = connectionMap_.find(uri);
1133     if (iter != connectionMap_.end()) {
1134         return iter->second;
1135     }
1136     return nullptr;
1137 }
1138 
GetAccessibilityAbilities(std::vector<sptr<AccessibleAbilityConnection>> & connectionList)1139 void AccessibilityAccountData::AccessibilityAbility::GetAccessibilityAbilities(
1140     std::vector<sptr<AccessibleAbilityConnection>>& connectionList)
1141 {
1142     std::lock_guard<ffrt::mutex> lock(mutex_);
1143     for (auto& connection : connectionMap_) {
1144         connectionList.push_back(connection.second);
1145     }
1146 }
1147 
GetAbilitiesInfo(std::vector<AccessibilityAbilityInfo> & abilities)1148 void AccessibilityAccountData::AccessibilityAbility::GetAbilitiesInfo(
1149     std::vector<AccessibilityAbilityInfo>& abilities)
1150 {
1151     std::lock_guard<ffrt::mutex> lock(mutex_);
1152     for (auto& connection : connectionMap_) {
1153         if (connection.second) {
1154             abilities.push_back(connection.second->GetAbilityInfo());
1155         }
1156     }
1157 
1158     HILOG_DEBUG("connectionMap_ %{public}zu and enabledAbilities %{public}zu",
1159         connectionMap_.size(), abilities.size());
1160 }
1161 
IsExistCapability(Capability capability)1162 bool AccessibilityAccountData::AccessibilityAbility::IsExistCapability(Capability capability)
1163 {
1164     HILOG_DEBUG("capability %{public}d", capability);
1165     std::lock_guard<ffrt::mutex> lock(mutex_);
1166     for (auto iter = connectionMap_.begin(); iter != connectionMap_.end(); iter++) {
1167         if (iter->second->GetAbilityInfo().GetCapabilityValues() & capability) {
1168             return true;
1169         }
1170     }
1171 
1172     return false;
1173 }
1174 
GetAccessibilityAbilitiesMap(std::map<std::string,sptr<AccessibleAbilityConnection>> & connectionMap)1175 void AccessibilityAccountData::AccessibilityAbility::GetAccessibilityAbilitiesMap(
1176     std::map<std::string, sptr<AccessibleAbilityConnection>>& connectionMap)
1177 {
1178     std::lock_guard<ffrt::mutex> lock(mutex_);
1179     connectionMap = connectionMap_;
1180 }
1181 
Clear()1182 void AccessibilityAccountData::AccessibilityAbility::Clear()
1183 {
1184     std::lock_guard<ffrt::mutex> lock(mutex_);
1185     return connectionMap_.clear();
1186 }
1187 
GetSize()1188 size_t AccessibilityAccountData::AccessibilityAbility::GetSize()
1189 {
1190     std::lock_guard<ffrt::mutex> lock(mutex_);
1191     return connectionMap_.size();
1192 }
1193 
GetDisableAbilities(std::vector<AccessibilityAbilityInfo> & disabledAbilities)1194 void AccessibilityAccountData::AccessibilityAbility::GetDisableAbilities(
1195     std::vector<AccessibilityAbilityInfo> &disabledAbilities)
1196 {
1197     std::lock_guard<ffrt::mutex> lock(mutex_);
1198     for (auto& connection : connectionMap_) {
1199         for (auto iter = disabledAbilities.begin(); iter != disabledAbilities.end();) {
1200             if (connection.second && (iter->GetId() == connection.second->GetAbilityInfo().GetId())) {
1201                 iter = disabledAbilities.erase(iter);
1202             } else {
1203                 iter++;
1204             }
1205         }
1206     }
1207 }
1208 
RemoveAccessibilityAbilityByName(const std::string & bundleName,bool & result)1209 void AccessibilityAccountData::AccessibilityAbility::RemoveAccessibilityAbilityByName(const std::string& bundleName,
1210     bool& result)
1211 {
1212     std::lock_guard<ffrt::mutex> lock(mutex_);
1213     for (auto& connection : connectionMap_) {
1214         std::size_t firstPos = connection.first.find_first_of('/') + 1;
1215         std::size_t endPos = connection.first.find_last_of('/');
1216         if (endPos <= firstPos) {
1217             HILOG_ERROR("it's a wrong ability and the uri %{public}s ", connection.first.c_str());
1218             continue;
1219         }
1220 
1221         std::string connectedBundleName = connection.first.substr(firstPos, endPos - firstPos);
1222         if (connectedBundleName == bundleName) {
1223             HILOG_DEBUG("remove connected ability, bundle name %{public}s", connectedBundleName.c_str());
1224             std::string uri = Utils::GetUri(connection.second->GetElementName());
1225             auto it = connectionMap_.find(uri);
1226             if (it != connectionMap_.end()) {
1227                 connectionMap_.erase(it);
1228             }
1229             result = true;
1230         }
1231     }
1232 }
1233 
GetSizeByUri(const std::string & uri)1234 int32_t AccessibilityAccountData::AccessibilityAbility::GetSizeByUri(const std::string& uri)
1235 {
1236     std::lock_guard<ffrt::mutex> lock(mutex_);
1237     return connectionMap_.count(uri);
1238 }
1239 
AddAccountData(int32_t accountId)1240 sptr<AccessibilityAccountData> AccessibilityAccountDataMap::AddAccountData(
1241     int32_t accountId)
1242 {
1243     std::lock_guard<ffrt::mutex> lock(accountDataMutex_);
1244     auto iter = accountDataMap_.find(accountId);
1245     if (iter != accountDataMap_.end()) {
1246         HILOG_WARN("accountId is existed");
1247         return iter->second;
1248     }
1249 
1250     sptr<AccessibilityAccountData> accountData = new(std::nothrow) AccessibilityAccountData(accountId);
1251     if (accountData == nullptr) {
1252         HILOG_ERROR("accountData is null");
1253         return nullptr;
1254     }
1255 
1256     accountData->Init();
1257     accountDataMap_[accountId] = accountData;
1258     return accountData;
1259 }
1260 
GetCurrentAccountData(int32_t accountId)1261 sptr<AccessibilityAccountData> AccessibilityAccountDataMap::GetCurrentAccountData(
1262     int32_t accountId)
1263 {
1264     std::lock_guard<ffrt::mutex> lock(accountDataMutex_);
1265     auto iter = accountDataMap_.find(accountId);
1266     if (iter != accountDataMap_.end()) {
1267         return iter->second;
1268     }
1269 
1270     sptr<AccessibilityAccountData> accountData = new(std::nothrow) AccessibilityAccountData(accountId);
1271     if (!accountData) {
1272         HILOG_ERROR("accountData is null");
1273         return nullptr;
1274     }
1275 
1276     accountDataMap_[accountId] = accountData;
1277     return accountData;
1278 }
1279 
GetAccountData(int32_t accountId)1280 sptr<AccessibilityAccountData> AccessibilityAccountDataMap::GetAccountData(
1281     int32_t accountId)
1282 {
1283     std::lock_guard<ffrt::mutex> lock(accountDataMutex_);
1284     auto iter = accountDataMap_.find(accountId);
1285     if (iter != accountDataMap_.end()) {
1286         return iter->second;
1287     }
1288 
1289     HILOG_DEBUG("accountId is not existed");
1290     return nullptr;
1291 }
1292 
RemoveAccountData(int32_t accountId)1293 sptr<AccessibilityAccountData> AccessibilityAccountDataMap::RemoveAccountData(
1294     int32_t accountId)
1295 {
1296     sptr<AccessibilityAccountData> accountData = nullptr;
1297     std::lock_guard<ffrt::mutex> lock(accountDataMutex_);
1298     auto iter = accountDataMap_.find(accountId);
1299     if (iter != accountDataMap_.end()) {
1300         accountData = iter->second;
1301         accountDataMap_.erase(iter);
1302     }
1303 
1304     return accountData;
1305 }
1306 
GetAllAccountIds()1307 std::vector<int32_t> AccessibilityAccountDataMap::GetAllAccountIds()
1308 {
1309     std::lock_guard<ffrt::mutex> lock(accountDataMutex_);
1310     std::vector<int32_t> accountIds;
1311     for (auto it = accountDataMap_.begin(); it != accountDataMap_.end(); it++) {
1312         accountIds.push_back(it->first);
1313     }
1314     return accountIds;
1315 }
1316 
Clear()1317 void AccessibilityAccountDataMap::Clear()
1318 {
1319     std::lock_guard<ffrt::mutex> lock(accountDataMutex_);
1320     accountDataMap_.clear();
1321 }
1322 } // namespace Accessibility
1323 } // namespace OHOS
1324