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