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