• 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 
21 #include "accessibility_display_manager.h"
22 #include "accessible_ability_manager_service.h"
23 #include "extension_ability_info.h"
24 #include "hilog_wrapper.h"
25 #include "utils.h"
26 
27 namespace OHOS {
28 namespace Accessibility {
29 namespace {
30     constexpr int32_t AUTOCLICK_DELAY_TIME_MIN = 1000; // ms
31     constexpr int32_t AUTOCLICK_DELAY_TIME_MAX = 5000; // ms
32 } // namespace
33 
AccessibilityAccountData(int32_t accountId)34 AccessibilityAccountData::AccessibilityAccountData(int32_t accountId)
35 {
36     id_ = accountId;
37 }
38 
~AccessibilityAccountData()39 AccessibilityAccountData::~AccessibilityAccountData()
40 {}
41 
GetAccountId()42 int32_t AccessibilityAccountData::GetAccountId()
43 {
44     HILOG_INFO();
45     return id_;
46 }
47 
GetAccessibilityState()48 uint32_t AccessibilityAccountData::GetAccessibilityState()
49 {
50     HILOG_INFO();
51     uint32_t state = 0;
52     if (!connectedA11yAbilities_.empty() || !connectingA11yAbilities_.empty()) {
53         HILOG_DEBUG("connectingA11yAbilities[%{public}zu] connectedA11yAbilities[%{public}zu]",
54             connectingA11yAbilities_.size(), connectedA11yAbilities_.size());
55         state |= STATE_ACCESSIBILITY_ENABLED;
56         if (!config_->GetEnabledState()) {
57             config_->SetEnabled(true);
58         }
59     } else {
60         if (config_->GetEnabledState()) {
61             config_->SetEnabled(false);
62         }
63     }
64 
65     if (config_->GetTouchGuideState()) {
66         state |= STATE_EXPLORATION_ENABLED;
67     }
68 
69     if (config_->GetKeyEventObserverState()) {
70         state |= STATE_KEYEVENT_ENABLED;
71     }
72 
73     if (config_->GetGestureState()) {
74         state |= STATE_GESTURE_ENABLED;
75     }
76     return state;
77 }
78 
OnAccountSwitched()79 void AccessibilityAccountData::OnAccountSwitched()
80 {
81     HILOG_INFO();
82     connectingA11yAbilities_.clear();
83     for (auto itr = connectedA11yAbilities_.begin(); itr != connectedA11yAbilities_.end(); itr++) {
84         itr->second->Disconnect();
85     }
86     connectedA11yAbilities_.clear();
87     enabledAbilities_.clear();
88     asacConnections_.clear();
89 }
90 
AddConnectedAbility(sptr<AccessibleAbilityConnection> & connection)91 void AccessibilityAccountData::AddConnectedAbility(sptr<AccessibleAbilityConnection>& connection)
92 {
93     if (!connection) {
94         HILOG_ERROR("connection is nullptr");
95         return;
96     }
97 
98     std::string uri = Utils::GetUri(connection->GetElementName());
99     HILOG_INFO("URI is %{private}s", uri.c_str());
100     if (!connectedA11yAbilities_.count(uri)) {
101         connectedA11yAbilities_.insert(make_pair(uri, connection));
102     }
103 
104     HILOG_INFO("Add ConnectedAbility: %{public}zu", connectedA11yAbilities_.size());
105 }
106 
RemoveConnectedAbility(const AppExecFwk::ElementName & element)107 void AccessibilityAccountData::RemoveConnectedAbility(const AppExecFwk::ElementName &element)
108 {
109     std::string uri = Utils::GetUri(element);
110     HILOG_INFO("URI is %{private}s", uri.c_str());
111     std::map<std::string, sptr<AccessibleAbilityConnection>>::iterator it = connectedA11yAbilities_.find(uri);
112     if (it != connectedA11yAbilities_.end()) {
113         connectedA11yAbilities_.erase(it);
114     }
115 
116     HILOG_INFO("Remove ConnectedAbility: %{public}zu", connectedA11yAbilities_.size());
117 }
118 
AddCaptionPropertyCallback(const sptr<IAccessibleAbilityManagerCaptionObserver> & callback)119 void AccessibilityAccountData::AddCaptionPropertyCallback(
120     const sptr<IAccessibleAbilityManagerCaptionObserver>& callback)
121 {
122     HILOG_INFO();
123     captionPropertyCallbacks_.push_back(callback);
124 }
125 
RemoveCaptionPropertyCallback(const wptr<IRemoteObject> & callback)126 void AccessibilityAccountData::RemoveCaptionPropertyCallback(const wptr<IRemoteObject>& callback)
127 {
128     HILOG_INFO();
129     for (auto itr = captionPropertyCallbacks_.begin(); itr != captionPropertyCallbacks_.end(); itr++) {
130         if ((*itr)->AsObject() == callback) {
131             captionPropertyCallbacks_.erase(itr);
132             break;
133         }
134     }
135 }
136 
AddEnableAbilityListsObserver(const sptr<IAccessibilityEnableAbilityListsObserver> & observer)137 void AccessibilityAccountData::AddEnableAbilityListsObserver(
138     const sptr<IAccessibilityEnableAbilityListsObserver>& observer)
139 {
140     HILOG_INFO();
141     if (std::any_of(enableAbilityListsObservers_.begin(), enableAbilityListsObservers_.end(),
142         [observer](const sptr<IAccessibilityEnableAbilityListsObserver> &listObserver) {
143             return listObserver == observer;
144         })) {
145         HILOG_ERROR("observer is already exist");
146         return;
147     }
148     enableAbilityListsObservers_.push_back(observer);
149     HILOG_DEBUG("observer's size is %{public}zu", enableAbilityListsObservers_.size());
150 }
151 
RemoveEnableAbilityListsObserver(const wptr<IRemoteObject> & observer)152 void AccessibilityAccountData::RemoveEnableAbilityListsObserver(const wptr<IRemoteObject>& observer)
153 {
154     HILOG_INFO();
155     for (auto itr = enableAbilityListsObservers_.begin(); itr != enableAbilityListsObservers_.end(); itr++) {
156         if ((*itr)->AsObject() == observer) {
157             HILOG_DEBUG("erase observer");
158             enableAbilityListsObservers_.erase(itr);
159             HILOG_DEBUG("observer's size is %{public}zu", enableAbilityListsObservers_.size());
160             return;
161         }
162     }
163 }
164 
UpdateEnableAbilityListsState()165 void AccessibilityAccountData::UpdateEnableAbilityListsState()
166 {
167     HILOG_DEBUG("observer's size is %{public}zu", enableAbilityListsObservers_.size());
168     for (auto &observer : enableAbilityListsObservers_) {
169         if (observer) {
170             observer->OnAccessibilityEnableAbilityListsChanged();
171         }
172     }
173 }
174 
AddAccessibilityWindowConnection(const int32_t windowId,const sptr<AccessibilityWindowConnection> & interactionConnection)175 void AccessibilityAccountData::AddAccessibilityWindowConnection(
176     const int32_t windowId, const sptr<AccessibilityWindowConnection>& interactionConnection)
177 {
178     HILOG_DEBUG("windowId(%{public}d)", windowId);
179     auto iter = asacConnections_.find(windowId);
180     if (iter == asacConnections_.end()) {
181         asacConnections_.insert(std::make_pair(windowId, interactionConnection));
182     }
183 }
184 
RemoveAccessibilityWindowConnection(const int32_t windowId)185 void AccessibilityAccountData::RemoveAccessibilityWindowConnection(const int32_t windowId)
186 {
187     HILOG_DEBUG("windowId(%{public}d)", windowId);
188     std::map<int32_t, sptr<AccessibilityWindowConnection>>::iterator it = asacConnections_.find(windowId);
189     if (it != asacConnections_.end()) {
190         asacConnections_.erase(it);
191     }
192 }
193 
AddConnectingA11yAbility(const std::string & uri,const sptr<AccessibleAbilityConnection> & connection)194 void AccessibilityAccountData::AddConnectingA11yAbility(const std::string &uri,
195     const sptr<AccessibleAbilityConnection> &connection)
196 {
197     HILOG_DEBUG("start.");
198     auto iter = connectingA11yAbilities_.find(uri);
199     if (iter == connectingA11yAbilities_.end()) {
200         connectingA11yAbilities_[uri] = connection;
201         HILOG_DEBUG("Add ConnectingA11yAbility: %{public}zu", connectingA11yAbilities_.size());
202     } else {
203         HILOG_ERROR("The ability is already connecting, and it's uri is %{public}s", uri.c_str());
204     }
205 }
206 
RemoveConnectingA11yAbility(const std::string & uri)207 void AccessibilityAccountData::RemoveConnectingA11yAbility(const std::string &uri)
208 {
209     HILOG_DEBUG("RemoveConnectingA11yAbility start");
210     auto iterator = connectingA11yAbilities_.find(uri);
211     if (iterator != connectingA11yAbilities_.end()) {
212         connectingA11yAbilities_.erase(iterator);
213         return;
214     }
215     HILOG_ERROR("The ability %{public}s is not connecting.", uri.c_str());
216 }
217 
AddEnabledAbility(const std::string & name)218 void AccessibilityAccountData::AddEnabledAbility(const std::string &name)
219 {
220     HILOG_DEBUG("AddEnabledAbility start.");
221     if (std::any_of(enabledAbilities_.begin(), enabledAbilities_.end(),
222         [name](const std::string &abilityName) {
223             return abilityName == name;
224         })) {
225         HILOG_DEBUG("The ability is already enabled, and it's name is %{public}s", name.c_str());
226         return;
227     }
228     enabledAbilities_.push_back(name);
229     UpdateEnableAbilityListsState();
230     HILOG_DEBUG("Add EnabledAbility: %{public}zu", enabledAbilities_.size());
231 }
232 
RemoveEnabledAbility(const std::string & name)233 RetError AccessibilityAccountData::RemoveEnabledAbility(const std::string &name)
234 {
235     HILOG_DEBUG("AddEnabledAbility start");
236     for (auto it = enabledAbilities_.begin(); it != enabledAbilities_.end(); it++) {
237         if (*it == name) {
238             HILOG_DEBUG("Removed %{public}s from EnabledAbility: ", name.c_str());
239             enabledAbilities_.erase(it);
240             UpdateEnableAbilityListsState();
241             HILOG_DEBUG("EnabledAbility size %{public}zu", enabledAbilities_.size());
242             return RET_OK;
243         }
244     }
245     HILOG_ERROR("The ability %{public}s is not enabled.", name.c_str());
246     return RET_ERR_NOT_ENABLED;
247 }
248 
AddInstalledAbility(AccessibilityAbilityInfo & abilityInfo)249 void AccessibilityAccountData::AddInstalledAbility(AccessibilityAbilityInfo& abilityInfo)
250 {
251     HILOG_DEBUG("abilityInfo's bundle name is %{public}s", abilityInfo.GetPackageName().c_str());
252     for (size_t i = 0; i < installedAbilities_.size(); i++) {
253         if ((installedAbilities_[i].GetPackageName() == abilityInfo.GetPackageName()) &&
254             installedAbilities_[i].GetName() == abilityInfo.GetName()) {
255             HILOG_DEBUG("the ability is already exist.");
256             return;
257         }
258     }
259     installedAbilities_.push_back(abilityInfo);
260     HILOG_DEBUG("push back installed ability successfully and installedAbilities_'s size is %{public}zu",
261         installedAbilities_.size());
262 }
263 
RemoveInstalledAbility(const std::string & bundleName)264 void AccessibilityAccountData::RemoveInstalledAbility(const std::string &bundleName)
265 {
266     HILOG_DEBUG("start.");
267     for (auto it = installedAbilities_.begin(); it != installedAbilities_.end();) {
268         if (it->GetPackageName() == bundleName) {
269             HILOG_DEBUG("Removed %{public}s from InstalledAbility: ", bundleName.c_str());
270             if (!config_) {
271                 it = installedAbilities_.erase(it);
272                 continue;
273             }
274             std::string name = config_->GetShortkeyTarget();
275             if (it->GetId() == name) {
276                 std::string targetName = "";
277                 config_->SetShortkeyTarget(targetName);
278                 config_->SetShortKeyState(false);
279             }
280             it = installedAbilities_.erase(it);
281         } else {
282             ++it;
283         }
284     }
285 }
286 
ClearInstalledAbility()287 void AccessibilityAccountData::ClearInstalledAbility()
288 {
289     HILOG_DEBUG("start.");
290     installedAbilities_.clear();
291 }
292 
GetAccessibleAbilityConnection(const std::string & elementName)293 const sptr<AccessibleAbilityConnection> AccessibilityAccountData::GetAccessibleAbilityConnection(
294     const std::string &elementName)
295 {
296     HILOG_DEBUG("GetAccessibleAbilityConnection URI is %{public}s", elementName.c_str());
297     for (auto& connected : connectedA11yAbilities_) {
298         std::string::size_type index = connected.first.find(elementName);
299         if (index == std::string::npos) {
300             continue;
301         } else {
302             HILOG_DEBUG("founded URI is %{public}s ", connected.first.c_str());
303             return connected.second;
304         }
305     }
306     HILOG_DEBUG("URI %{public}s not found ", elementName.c_str());
307     return nullptr;
308 }
309 
GetAccessibilityWindowConnection(const int32_t windowId)310 const sptr<AccessibilityWindowConnection> AccessibilityAccountData::GetAccessibilityWindowConnection(
311     const int32_t windowId)
312 {
313     HILOG_DEBUG("window id[%{public}d] interactionOperators's size[%{public}zu]", windowId, asacConnections_.size());
314     for (auto &asacConnection : asacConnections_) {
315         HILOG_DEBUG("window id of asacConnection is %{public}d", asacConnection.first);
316     }
317 
318     if (asacConnections_.count(windowId) > 0) {
319         return asacConnections_[windowId];
320     }
321 
322     return nullptr;
323 }
324 
GetConnectedA11yAbilities()325 const std::map<std::string, sptr<AccessibleAbilityConnection>> AccessibilityAccountData::GetConnectedA11yAbilities()
326 {
327     HILOG_DEBUG("connectedA11yAbilities's size[%{public}zu]", connectedA11yAbilities_.size());
328     return connectedA11yAbilities_;
329 }
330 
GetAsacConnections()331 const std::map<int32_t, sptr<AccessibilityWindowConnection>> AccessibilityAccountData::GetAsacConnections()
332 {
333     HILOG_DEBUG("GetAsacConnections start.");
334     return asacConnections_;
335 }
336 
GetCaptionPropertyCallbacks()337 const CaptionPropertyCallbacks AccessibilityAccountData::GetCaptionPropertyCallbacks()
338 {
339     HILOG_DEBUG("GetCaptionPropertyCallbacks start.");
340     return captionPropertyCallbacks_;
341 }
342 
GetConnectingA11yAbility(const std::string & uri)343 sptr<AccessibleAbilityConnection> AccessibilityAccountData::GetConnectingA11yAbility(const std::string &uri)
344 {
345     HILOG_DEBUG("GetConnectingA11yAbility start.");
346     auto iter = connectingA11yAbilities_.find(uri);
347     if (iter != connectingA11yAbilities_.end()) {
348         return iter->second;
349     }
350     return nullptr;
351 }
352 
GetEnabledAbilities()353 const std::vector<std::string> &AccessibilityAccountData::GetEnabledAbilities()
354 {
355     HILOG_DEBUG("enabledAbilities_'s size is (%{public}zu).", enabledAbilities_.size());
356     for (auto& ability : enabledAbilities_) {
357         HILOG_DEBUG("bundleName is %{public}s ", ability.c_str());
358     }
359     return enabledAbilities_;
360 }
361 
GetInstalledAbilities() const362 const std::vector<AccessibilityAbilityInfo> &AccessibilityAccountData::GetInstalledAbilities() const
363 {
364     HILOG_DEBUG("GetInstalledAbilities start.");
365     return installedAbilities_;
366 }
367 
GetAbilitiesByState(AbilityStateType state,std::vector<AccessibilityAbilityInfo> & abilities) const368 void AccessibilityAccountData::GetAbilitiesByState(AbilityStateType state,
369     std::vector<AccessibilityAbilityInfo> &abilities) const
370 {
371     HILOG_DEBUG("GetAbilitiesByState state(%{public}d) start.", state);
372     if (state == ABILITY_STATE_ENABLE) {
373         for (auto &ability : connectedA11yAbilities_) {
374             if (ability.second) {
375                 abilities.push_back(ability.second->GetAbilityInfo());
376             }
377         }
378         HILOG_DEBUG("connectedA11yAbilities_ is (%{public}zu) enabledAbilities is (%{public}zu).",
379             connectedA11yAbilities_.size(), abilities.size());
380     } else if (state == ABILITY_STATE_DISABLE) {
381         GetDisableAbilities(abilities);
382         HILOG_DEBUG("the size of disable abilities is %{public}zu", abilities.size());
383     } else {
384         abilities = installedAbilities_;
385     }
386 }
387 
GetDisableAbilities(std::vector<AccessibilityAbilityInfo> & disabledAbilities) const388 void AccessibilityAccountData::GetDisableAbilities(std::vector<AccessibilityAbilityInfo> &disabledAbilities) const
389 {
390     HILOG_DEBUG("start.");
391     disabledAbilities = installedAbilities_;
392     for (auto &enabledAbility : connectedA11yAbilities_) {
393         for (auto itr = disabledAbilities.begin(); itr != disabledAbilities.end();) {
394             if (enabledAbility.second && (itr->GetId() == enabledAbility.second->GetAbilityInfo().GetId())) {
395                 disabledAbilities.erase(itr);
396             } else {
397                 itr++;
398             }
399         }
400     }
401 }
402 
UpdateAccountCapabilities()403 void AccessibilityAccountData::UpdateAccountCapabilities()
404 {
405     HILOG_DEBUG("start.");
406     UpdateFilteringKeyEventsCapability();
407     UpdateEventTouchGuideCapability();
408     UpdateGesturesSimulationCapability();
409     UpdateMagnificationCapability();
410     config_->SetTouchGuideState(isEventTouchGuideState_);
411     config_->SetGestureState(isGesturesSimulation_);
412     config_->SetKeyEventObserverState(isFilteringKeyEvents_);
413 }
414 
UpdateEventTouchGuideCapability()415 void AccessibilityAccountData::UpdateEventTouchGuideCapability()
416 {
417     HILOG_DEBUG("start.");
418     for (auto itr = connectedA11yAbilities_.begin(); itr != connectedA11yAbilities_.end(); itr++) {
419         if (itr->second->GetAbilityInfo().GetCapabilityValues() & Capability::CAPABILITY_TOUCH_GUIDE) {
420             isEventTouchGuideState_ = true;
421             return;
422         }
423     }
424     isEventTouchGuideState_ = false;
425 }
426 
UpdateGesturesSimulationCapability()427 void AccessibilityAccountData::UpdateGesturesSimulationCapability()
428 {
429     HILOG_DEBUG("start.");
430     for (auto itr = connectedA11yAbilities_.begin(); itr != connectedA11yAbilities_.end(); itr++) {
431         if (itr->second->GetAbilityInfo().GetCapabilityValues() & Capability::CAPABILITY_GESTURE) {
432             isGesturesSimulation_ = true;
433             return;
434         }
435     }
436     isGesturesSimulation_ = false;
437 }
438 
UpdateFilteringKeyEventsCapability()439 void AccessibilityAccountData::UpdateFilteringKeyEventsCapability()
440 {
441     HILOG_DEBUG("start.");
442     for (auto itr = connectedA11yAbilities_.begin(); itr != connectedA11yAbilities_.end(); itr++) {
443         if (itr->second->GetAbilityInfo().GetCapabilityValues() & Capability::CAPABILITY_KEY_EVENT_OBSERVER) {
444             isFilteringKeyEvents_ = true;
445             return;
446         }
447     }
448     isFilteringKeyEvents_ = false;
449 }
450 
UpdateMagnificationCapability()451 void AccessibilityAccountData::UpdateMagnificationCapability()
452 {
453     HILOG_DEBUG("start.");
454     for (auto itr = connectedA11yAbilities_.begin(); itr != connectedA11yAbilities_.end(); itr++) {
455         if (itr->second->GetAbilityInfo().GetCapabilityValues() & Capability::CAPABILITY_ZOOM) {
456             isScreenMagnification_ = true;
457             return;
458         }
459     }
460     isScreenMagnification_ = false;
461 }
462 
EnableAbility(const std::string & name,const uint32_t capabilities)463 RetError AccessibilityAccountData::EnableAbility(const std::string &name, const uint32_t capabilities)
464 {
465     HILOG_DEBUG("start and name[%{public}s] capabilities[%{public}d]", name.c_str(), capabilities);
466 
467     bool isInstalled = false;
468     for (auto itr = installedAbilities_.begin(); itr != installedAbilities_.end(); itr++) {
469         if (itr->GetId() == name) {
470             isInstalled = true;
471 
472             // Judge capabilities
473             uint32_t resultCapabilities = itr->GetStaticCapabilityValues() & capabilities;
474             HILOG_DEBUG("resultCapabilities is [%{public}d]", resultCapabilities);
475             if (resultCapabilities == 0) {
476                 HILOG_ERROR("the result of capabilities is wrong");
477                 return RET_ERR_NO_CAPABILITY;
478             }
479 
480             itr->SetCapabilityValues(resultCapabilities);
481             break;
482         }
483     }
484     if (!isInstalled) {
485         HILOG_ERROR("the ability[%{public}s] is not installed", name.c_str());
486         return RET_ERR_NOT_INSTALLED;
487     }
488 
489     // Add enabled ability
490     if (std::any_of(enabledAbilities_.begin(), enabledAbilities_.end(),
491         [name](const std::string &abilityName) {
492             return abilityName == name;
493         })) {
494         HILOG_ERROR("The ability[%{public}s] is already enabled", name.c_str());
495         return RET_ERR_CONNECTION_EXIST;
496     }
497     HITRACE_METER_NAME(HITRACE_TAG_ACCESSIBILITY_MANAGER, "EnableAbility:" + name);
498 
499     enabledAbilities_.push_back(name);
500     UpdateAbilities();
501     Utils::RecordStartingA11yEvent(name);
502     return RET_OK;
503 }
504 
GetInstalledAbilitiesFromBMS()505 bool AccessibilityAccountData::GetInstalledAbilitiesFromBMS()
506 {
507     HILOG_DEBUG("start.");
508     HITRACE_METER_NAME(HITRACE_TAG_ACCESSIBILITY_MANAGER, "QueryInstalledAbilityInfo");
509     std::vector<AppExecFwk::ExtensionAbilityInfo> extensionInfos;
510     sptr<AppExecFwk::IBundleMgr> bms = Singleton<AccessibleAbilityManagerService>::GetInstance().GetBundleMgrProxy();
511     if (!bms) {
512         Utils::RecordUnavailableEvent(A11yUnavailableEvent::QUERY_EVENT, A11yError::ERROR_QUERY_PACKAGE_INFO_FAILED);
513         HILOG_ERROR("GetBundleMgrProxy failed.");
514         return false;
515     }
516     bool ret = bms->QueryExtensionAbilityInfos(AppExecFwk::ExtensionAbilityType::ACCESSIBILITY, id_, extensionInfos);
517     if (!ret) {
518         Utils::RecordUnavailableEvent(A11yUnavailableEvent::QUERY_EVENT, A11yError::ERROR_QUERY_PACKAGE_INFO_FAILED);
519         HILOG_ERROR("Query extension ability information failed.");
520         return false;
521     }
522     HILOG_DEBUG("query extensionAbilityInfos' size is %{public}zu.", extensionInfos.size());
523     for (auto& info : extensionInfos) {
524         AccessibilityAbilityInitParams initParams;
525         Utils::Parse(info, initParams);
526         std::shared_ptr<AccessibilityAbilityInfo> accessibilityInfo =
527             std::make_shared<AccessibilityAbilityInfo>(initParams);
528         AddInstalledAbility(*accessibilityInfo);
529     }
530     return true;
531 }
532 
Init()533 void AccessibilityAccountData::Init()
534 {
535     HILOG_DEBUG("Init start.");
536     if (!config_) {
537         config_ = std::make_shared<AccessibilitySettingsConfig>(id_);
538         config_->Init();
539     }
540 }
541 
AddConfigCallback(const sptr<IAccessibleAbilityManagerConfigObserver> & callback)542 void AccessibilityAccountData::AddConfigCallback(
543     const sptr<IAccessibleAbilityManagerConfigObserver>& callback)
544 {
545     HILOG_DEBUG("AddConfigCallback start.");
546     configCallbacks_.push_back(callback);
547 }
548 
GetConfigCallbacks() const549 const std::vector<sptr<IAccessibleAbilityManagerConfigObserver>> &AccessibilityAccountData::GetConfigCallbacks() const
550 {
551     HILOG_DEBUG("GetConfigCallbacks start.");
552     return configCallbacks_;
553 }
554 
SetConfigCallbacks(std::vector<sptr<IAccessibleAbilityManagerConfigObserver>> & observer)555 void AccessibilityAccountData::SetConfigCallbacks(std::vector<sptr<IAccessibleAbilityManagerConfigObserver>>& observer)
556 {
557     HILOG_DEBUG("SetConfigCallbacks start.");
558     configCallbacks_ = observer;
559 }
560 
RemoveConfigCallback(const wptr<IRemoteObject> & callback)561 void AccessibilityAccountData::RemoveConfigCallback(const wptr<IRemoteObject>& callback)
562 {
563     HILOG_DEBUG("RemoveConfigCallback start.");
564     for (auto itr = configCallbacks_.begin(); itr != configCallbacks_.end(); itr++) {
565         if ((*itr)->AsObject() == callback) {
566             configCallbacks_.erase(itr);
567             break;
568         }
569     }
570 }
571 
GetConfig()572 std::shared_ptr<AccessibilitySettingsConfig> AccessibilityAccountData::GetConfig()
573 {
574     HILOG_DEBUG("GetConfig start.");
575     return config_;
576 }
577 
GetImportantEnabledAbilities(std::map<std::string,uint32_t> & importantEnabledAbilities) const578 void AccessibilityAccountData::GetImportantEnabledAbilities(
579     std::map<std::string, uint32_t> &importantEnabledAbilities) const
580 {
581     HILOG_DEBUG("GetImportantEnabledAbilities start.");
582     if (installedAbilities_.empty()) {
583         HILOG_DEBUG("Current user has no installed Abilities.");
584         return;
585     }
586     if (enabledAbilities_.empty()) {
587         HILOG_DEBUG("Current user has no enabled abilities.");
588         return;
589     }
590     HILOG_DEBUG("installedAbilities_'s is %{public}zu.", installedAbilities_.size());
591     for (auto &installAbility : installedAbilities_) {
592         if (!installAbility.IsImportant()) {
593             HILOG_DEBUG("The ability is not important.");
594             continue;
595         }
596         std::string bundleName = installAbility.GetPackageName();
597         std::string abilityName = installAbility.GetName();
598         HILOG_DEBUG("installAbility's packageName is %{public}s and abilityName is %{public}s",
599             bundleName.c_str(), abilityName.c_str());
600         std::string uri = Utils::GetUri(bundleName, abilityName);
601         std::vector<std::string>::const_iterator iter = std::find(enabledAbilities_.begin(),
602             enabledAbilities_.end(), uri);
603         if (iter != enabledAbilities_.end()) {
604             uint32_t capabilityValues = installAbility.GetCapabilityValues();
605             importantEnabledAbilities.emplace(std::make_pair(uri, capabilityValues));
606         }
607     }
608 }
609 
UpdateImportantEnabledAbilities(std::map<std::string,uint32_t> & importantEnabledAbilities)610 void AccessibilityAccountData::UpdateImportantEnabledAbilities(
611     std::map<std::string, uint32_t> &importantEnabledAbilities)
612 {
613     HILOG_DEBUG();
614     if (importantEnabledAbilities.empty()) {
615         HILOG_DEBUG("There is no enabled abilities.");
616         return;
617     }
618     if (installedAbilities_.empty()) {
619         HILOG_DEBUG("Current user has no installedAbilities.");
620         return;
621     }
622     HILOG_DEBUG("installedAbilities is %{public}zu.", installedAbilities_.size());
623     for (auto &installAbility : installedAbilities_) {
624         std::string bundleName = installAbility.GetPackageName();
625         std::string abilityName = installAbility.GetName();
626         HILOG_DEBUG("installAbility's packageName is %{public}s and abilityName is %{public}s",
627             bundleName.c_str(), abilityName.c_str());
628         std::string uri = Utils::GetUri(bundleName, abilityName);
629         std::map<std::string, uint32_t>::iterator iter = importantEnabledAbilities.find(uri);
630         if (iter != importantEnabledAbilities.end()) {
631             AddEnabledAbility(uri);
632             installAbility.SetCapabilityValues(iter->second);
633         }
634     }
635 }
636 
GetInputFilterFlag() const637 uint32_t AccessibilityAccountData::GetInputFilterFlag() const
638 {
639     HILOG_DEBUG();
640     if (!config_) {
641         HILOG_ERROR("config is null");
642         return 0;
643     }
644     uint32_t flag = 0;
645     if (isScreenMagnification_ && config_->GetScreenMagnificationState()) {
646         flag |= AccessibilityInputInterceptor::FEATURE_SCREEN_MAGNIFICATION;
647     }
648     if (isEventTouchGuideState_) {
649         flag |= AccessibilityInputInterceptor::FEATURE_TOUCH_EXPLORATION;
650     }
651     if (isFilteringKeyEvents_) {
652         flag |= AccessibilityInputInterceptor::FEATURE_FILTER_KEY_EVENTS;
653     }
654     if (isGesturesSimulation_) {
655         flag |= AccessibilityInputInterceptor::FEATURE_INJECT_TOUCH_EVENTS;
656     }
657     if (config_->GetShortKeyState()) {
658         flag |= AccessibilityInputInterceptor::FEATURE_SHORT_KEY;
659     }
660     if (config_->GetMouseKeyState()) {
661         flag |= AccessibilityInputInterceptor::FEATURE_MOUSE_KEY;
662     }
663 
664     int32_t autoclickTime = config_->GetMouseAutoClick();
665     if (autoclickTime >= AUTOCLICK_DELAY_TIME_MIN && autoclickTime <= AUTOCLICK_DELAY_TIME_MAX) {
666         flag |= AccessibilityInputInterceptor::FEATURE_MOUSE_AUTOCLICK;
667     }
668 
669     return flag;
670 }
671 
UpdateAbilities()672 void AccessibilityAccountData::UpdateAbilities()
673 {
674     HILOG_DEBUG("installedAbilities is %{public}zu.", installedAbilities_.size());
675     for (auto &installAbility : installedAbilities_) {
676         std::string bundleName = installAbility.GetPackageName();
677         std::string abilityName = installAbility.GetName();
678         HILOG_DEBUG("installAbility's packageName is %{public}s and abilityName is %{public}s",
679             bundleName.c_str(), abilityName.c_str());
680 
681         if (connectingA11yAbilities_.count(Utils::GetUri(bundleName, abilityName))) {
682             HILOG_DEBUG("The ability(bundleName[%{public}s] abilityName[%{public}s]) is connecting.",
683                 bundleName.c_str(), abilityName.c_str());
684             continue;
685         }
686         sptr<AccessibleAbilityConnection> connection =
687             GetAccessibleAbilityConnection(Utils::GetUri(bundleName, abilityName));
688 
689         auto iter = std::find(enabledAbilities_.begin(), enabledAbilities_.end(),
690             Utils::GetUri(bundleName, abilityName));
691         if (iter != enabledAbilities_.end()) {
692             if (connection) {
693                 continue;
694             }
695             AppExecFwk::ElementName element("", bundleName, abilityName);
696             connection = new(std::nothrow) AccessibleAbilityConnection(id_, connectCounter_++, installAbility);
697             if (connection) {
698                 connection->Connect(element);
699                 AddConnectingA11yAbility(Utils::GetUri(bundleName, abilityName), connection);
700             }
701         } else {
702             HILOG_DEBUG("not in enabledAbilites list .");
703             if (connection) {
704                 RemoveConnectedAbility(connection->GetElementName());
705                 connection->Disconnect();
706             }
707         }
708     }
709 }
710 
RemoveAbility(const std::string & bundleName)711 bool AccessibilityAccountData::RemoveAbility(const std::string &bundleName)
712 {
713     HILOG_DEBUG("bundleName(%{public}s)", bundleName.c_str());
714     if (installedAbilities_.empty()) {
715         HILOG_DEBUG("There is no installed abilities.");
716         return false;
717     }
718     RemoveInstalledAbility(bundleName);
719 
720     bool result = false;
721     // Remove enabled ability, remove connecting ability if it is connecting.
722     for (auto& enableAbility : enabledAbilities_) {
723         if (enableAbility.substr(0, enableAbility.find("/")) == bundleName) {
724             RemoveEnabledAbility(enableAbility);
725             RemoveConnectingA11yAbility(enableAbility);
726             result = true;
727         }
728     }
729 
730     // Remove connected ability
731     for (auto &connectedAbility : connectedA11yAbilities_) {
732         std::size_t firstPos = connectedAbility.first.find_first_of('/') + 1;
733         std::size_t endPos = connectedAbility.first.find_last_of('/');
734         if (endPos <= firstPos) {
735             HILOG_ERROR("it's a wrong ability and the uri is %{public}s", connectedAbility.first.c_str());
736             continue;
737         }
738         std::string connectedBundleName = connectedAbility.first.substr(firstPos, endPos - firstPos);
739         if (connectedBundleName == bundleName) {
740             HILOG_DEBUG("Remove connected ability and it's bundle name is %{public}s", connectedBundleName.c_str());
741             RemoveConnectedAbility(connectedAbility.second->GetElementName());
742             result = true;
743         }
744     }
745 
746     if (result) {
747         UpdateAbilities();
748     }
749     return result;
750 }
751 
AddAbility(const std::string & bundleName)752 void AccessibilityAccountData::AddAbility(const std::string &bundleName)
753 {
754     HILOG_DEBUG("bundleName(%{public}s)", bundleName.c_str());
755 
756     std::vector<AppExecFwk::ExtensionAbilityInfo> extensionInfos;
757     sptr<AppExecFwk::IBundleMgr> bms = Singleton<AccessibleAbilityManagerService>::GetInstance().GetBundleMgrProxy();
758     if (!bms) {
759         HILOG_ERROR("bms is nullptr.");
760         return;
761     }
762     bms->QueryExtensionAbilityInfos(AppExecFwk::ExtensionAbilityType::ACCESSIBILITY, id_, extensionInfos);
763     HILOG_DEBUG("query extensionAbilityInfos' size is %{public}zu.", extensionInfos.size());
764     bool hasNewExtensionAbility = false;
765     for (auto &newAbility : extensionInfos) {
766         if (newAbility.bundleName == bundleName) {
767             HILOG_DEBUG("The package%{public}s added", (bundleName + "/" + newAbility.name).c_str());
768             AccessibilityAbilityInitParams initParams;
769             Utils::Parse(newAbility, initParams);
770             std::shared_ptr<AccessibilityAbilityInfo> accessibilityInfo =
771                 std::make_shared<AccessibilityAbilityInfo>(initParams);
772             AddInstalledAbility(*accessibilityInfo);
773             hasNewExtensionAbility = true;
774         }
775     }
776 
777     if (hasNewExtensionAbility) {
778         HILOG_DEBUG("add new extension ability and update abilities.");
779         UpdateAbilities();
780     }
781 }
782 
ChangeAbility(const std::string & bundleName)783 void AccessibilityAccountData::ChangeAbility(const std::string &bundleName)
784 {
785     HILOG_DEBUG("bundleName(%{public}s)", bundleName.c_str());
786 
787     if (installedAbilities_.empty()) {
788         HILOG_DEBUG("There is no installed abilities.");
789         return;
790     }
791     RemoveInstalledAbility(bundleName);
792     AddAbility(bundleName);
793 }
794 
AddUITestClient(const sptr<IRemoteObject> & obj,const std::string & bundleName,const std::string & abilityName)795 void AccessibilityAccountData::AddUITestClient(const sptr<IRemoteObject> &obj,
796     const std::string &bundleName, const std::string &abilityName)
797 {
798     HILOG_DEBUG();
799     // Add installed ability
800     std::shared_ptr<AccessibilityAbilityInfo> abilityInfo = std::make_shared<AccessibilityAbilityInfo>();
801     abilityInfo->SetPackageName(bundleName);
802     uint32_t capabilities = CAPABILITY_RETRIEVE | CAPABILITY_GESTURE;
803     abilityInfo->SetCapabilityValues(capabilities);
804     abilityInfo->SetAccessibilityAbilityType(ACCESSIBILITY_ABILITY_TYPE_ALL);
805     abilityInfo->SetEventTypes(EventType::TYPES_ALL_MASK);
806     AddInstalledAbility(*abilityInfo);
807 
808     // Add connected ability
809     sptr<AppExecFwk::ElementName> elementName = new(std::nothrow) AppExecFwk::ElementName();
810     if (!elementName) {
811         HILOG_ERROR("elementName is null");
812         return;
813     }
814     elementName->SetBundleName(bundleName);
815     elementName->SetAbilityName(abilityName);
816     sptr<AccessibleAbilityConnection> connection = new(std::nothrow) AccessibleAbilityConnection(
817         id_, connectCounter_++, *abilityInfo);
818     if (!connection) {
819         HILOG_ERROR("connection is null");
820         return;
821     }
822     connection->OnAbilityConnectDoneSync(*elementName, obj);
823 }
824 
RemoveUITestClient(sptr<AccessibleAbilityConnection> & connection,const std::string & bundleName)825 void AccessibilityAccountData::RemoveUITestClient(sptr<AccessibleAbilityConnection> &connection,
826     const std::string &bundleName)
827 {
828     HILOG_DEBUG();
829     if (!connection) {
830         HILOG_ERROR("connection is nullptr");
831         return;
832     }
833     RemoveInstalledAbility(bundleName);
834     RemoveConnectedAbility(connection->GetElementName());
835     connection->OnAbilityDisconnectDoneSync(connection->GetElementName());
836 }
837 } // namespace Accessibility
838 } // namespace OHOS
839