• 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("id_ = %{public}d", id_);
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("start");
210     auto iter = connectingA11yAbilities_.find(uri);
211     if (iter != connectingA11yAbilities_.end()) {
212         connectingA11yAbilities_.erase(iter);
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("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("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             it = installedAbilities_.erase(it);
271         } else {
272             ++it;
273         }
274     }
275 }
276 
ClearInstalledAbility()277 void AccessibilityAccountData::ClearInstalledAbility()
278 {
279     HILOG_DEBUG("start.");
280     installedAbilities_.clear();
281 }
282 
GetAccessibleAbilityConnection(const std::string & elementName)283 const sptr<AccessibleAbilityConnection> AccessibilityAccountData::GetAccessibleAbilityConnection(
284     const std::string &elementName)
285 {
286     HILOG_DEBUG("URI is %{public}s", elementName.c_str());
287     for (auto& connected : connectedA11yAbilities_) {
288         std::string::size_type  idx = connected.first.find(elementName);
289         if (idx == std::string::npos) {
290             continue;
291         } else {
292             HILOG_DEBUG("founded URI = %{public}s ", connected.first.c_str());
293             return connected.second;
294         }
295     }
296     HILOG_DEBUG("URI %{public}s not found ", elementName.c_str());
297     return nullptr;
298 }
299 
GetAccessibilityWindowConnection(const int32_t windowId)300 const sptr<AccessibilityWindowConnection> AccessibilityAccountData::GetAccessibilityWindowConnection(
301     const int32_t windowId)
302 {
303     HILOG_DEBUG("windowId[%{public}d] interactionOperators's size[%{public}zu]", windowId, asacConnections_.size());
304     for (auto &asacConnection : asacConnections_) {
305         HILOG_DEBUG("The window id of asacConnection is %{public}d", asacConnection.first);
306     }
307 
308     if (asacConnections_.count(windowId) > 0) {
309         return asacConnections_[windowId];
310     }
311 
312     return nullptr;
313 }
314 
GetConnectedA11yAbilities()315 const std::map<std::string, sptr<AccessibleAbilityConnection>> AccessibilityAccountData::GetConnectedA11yAbilities()
316 {
317     HILOG_DEBUG("connectedA11yAbilities size[%{public}zu]", connectedA11yAbilities_.size());
318     return connectedA11yAbilities_;
319 }
320 
GetAsacConnections()321 const std::map<int32_t, sptr<AccessibilityWindowConnection>> AccessibilityAccountData::GetAsacConnections()
322 {
323     HILOG_DEBUG("start.");
324     return asacConnections_;
325 }
326 
GetCaptionPropertyCallbacks()327 const CaptionPropertyCallbacks AccessibilityAccountData::GetCaptionPropertyCallbacks()
328 {
329     HILOG_DEBUG("start.");
330     return captionPropertyCallbacks_;
331 }
332 
GetConnectingA11yAbility(const std::string & uri)333 sptr<AccessibleAbilityConnection> AccessibilityAccountData::GetConnectingA11yAbility(const std::string &uri)
334 {
335     HILOG_DEBUG("start.");
336     auto iter = connectingA11yAbilities_.find(uri);
337     if (iter != connectingA11yAbilities_.end()) {
338         return iter->second;
339     }
340     return nullptr;
341 }
342 
GetEnabledAbilities()343 const std::vector<std::string> &AccessibilityAccountData::GetEnabledAbilities()
344 {
345     HILOG_DEBUG("enabledAbilities_ size is (%{public}zu).", enabledAbilities_.size());
346     for (auto& ability : enabledAbilities_) {
347         HILOG_DEBUG("bundleName = %{public}s ", ability.c_str());
348     }
349     return enabledAbilities_;
350 }
351 
GetInstalledAbilities() const352 const std::vector<AccessibilityAbilityInfo> &AccessibilityAccountData::GetInstalledAbilities() const
353 {
354     HILOG_DEBUG("start.");
355     return installedAbilities_;
356 }
357 
GetAbilitiesByState(AbilityStateType state,std::vector<AccessibilityAbilityInfo> & abilities) const358 void AccessibilityAccountData::GetAbilitiesByState(AbilityStateType state,
359     std::vector<AccessibilityAbilityInfo> &abilities) const
360 {
361     HILOG_DEBUG("state(%{public}d) start.", state);
362     if (state == ABILITY_STATE_ENABLE) {
363         for (auto &ability : connectedA11yAbilities_) {
364             if (ability.second) {
365                 abilities.push_back(ability.second->GetAbilityInfo());
366             }
367         }
368         HILOG_DEBUG("connectedA11yAbilities_ is (%{public}zu) enabledAbilities is (%{public}zu).",
369             connectedA11yAbilities_.size(), abilities.size());
370     } else if (state == ABILITY_STATE_DISABLE) {
371         GetDisableAbilities(abilities);
372         HILOG_DEBUG("the size of disable abilities is %{public}zu", abilities.size());
373     } else {
374         abilities = installedAbilities_;
375     }
376 }
377 
GetDisableAbilities(std::vector<AccessibilityAbilityInfo> & disabledAbilities) const378 void AccessibilityAccountData::GetDisableAbilities(std::vector<AccessibilityAbilityInfo> &disabledAbilities) const
379 {
380     HILOG_DEBUG("start.");
381     disabledAbilities = installedAbilities_;
382     for (auto &enabledAbility : connectedA11yAbilities_) {
383         for (auto itr = disabledAbilities.begin(); itr != disabledAbilities.end();) {
384             if (enabledAbility.second && (itr->GetId() == enabledAbility.second->GetAbilityInfo().GetId())) {
385                 disabledAbilities.erase(itr);
386             } else {
387                 itr++;
388             }
389         }
390     }
391 }
392 
UpdateAccountCapabilities()393 void AccessibilityAccountData::UpdateAccountCapabilities()
394 {
395     HILOG_DEBUG("start.");
396     UpdateFilteringKeyEventsCapability();
397     UpdateEventTouchGuideCapability();
398     UpdateGesturesSimulationCapability();
399     UpdateMagnificationCapability();
400     config_->SetTouchGuideState(isEventTouchGuideState_);
401     config_->SetGestureState(isGesturesSimulation_);
402     config_->SetKeyEventObserverState(isFilteringKeyEvents_);
403 }
404 
UpdateEventTouchGuideCapability()405 void AccessibilityAccountData::UpdateEventTouchGuideCapability()
406 {
407     HILOG_DEBUG("start.");
408     for (auto itr = connectedA11yAbilities_.begin(); itr != connectedA11yAbilities_.end(); itr++) {
409         if (itr->second->GetAbilityInfo().GetCapabilityValues() & Capability::CAPABILITY_TOUCH_GUIDE) {
410             isEventTouchGuideState_ = true;
411             return;
412         }
413     }
414     isEventTouchGuideState_ = false;
415 }
416 
UpdateGesturesSimulationCapability()417 void AccessibilityAccountData::UpdateGesturesSimulationCapability()
418 {
419     HILOG_DEBUG("start.");
420     for (auto itr = connectedA11yAbilities_.begin(); itr != connectedA11yAbilities_.end(); itr++) {
421         if (itr->second->GetAbilityInfo().GetCapabilityValues() & Capability::CAPABILITY_GESTURE) {
422             isGesturesSimulation_ = true;
423             return;
424         }
425     }
426     isGesturesSimulation_ = false;
427 }
428 
UpdateFilteringKeyEventsCapability()429 void AccessibilityAccountData::UpdateFilteringKeyEventsCapability()
430 {
431     HILOG_DEBUG("start.");
432     for (auto itr = connectedA11yAbilities_.begin(); itr != connectedA11yAbilities_.end(); itr++) {
433         if (itr->second->GetAbilityInfo().GetCapabilityValues() & Capability::CAPABILITY_KEY_EVENT_OBSERVER) {
434             isFilteringKeyEvents_ = true;
435             return;
436         }
437     }
438     isFilteringKeyEvents_ = false;
439 }
440 
UpdateMagnificationCapability()441 void AccessibilityAccountData::UpdateMagnificationCapability()
442 {
443     HILOG_DEBUG("start.");
444     for (auto itr = connectedA11yAbilities_.begin(); itr != connectedA11yAbilities_.end(); itr++) {
445         if (itr->second->GetAbilityInfo().GetCapabilityValues() & Capability::CAPABILITY_ZOOM) {
446             isScreenMagnification_ = true;
447             return;
448         }
449     }
450     isScreenMagnification_ = false;
451 }
452 
EnableAbility(const std::string & name,const uint32_t capabilities)453 RetError AccessibilityAccountData::EnableAbility(const std::string &name, const uint32_t capabilities)
454 {
455     HILOG_DEBUG("start and name[%{public}s] capabilities[%{public}d]", name.c_str(), capabilities);
456 
457     bool isInstalled = false;
458     for (auto itr = installedAbilities_.begin(); itr != installedAbilities_.end(); itr++) {
459         if (itr->GetId() == name) {
460             isInstalled = true;
461 
462             // Judge capabilities
463             uint32_t resultCapabilities = itr->GetStaticCapabilityValues() & capabilities;
464             HILOG_DEBUG("resultCapabilities is [%{public}d]", resultCapabilities);
465             if (resultCapabilities == 0) {
466                 HILOG_ERROR("the result of capabilities is wrong");
467                 return RET_ERR_NO_CAPABILITY;
468             }
469 
470             itr->SetCapabilityValues(capabilities);
471             break;
472         }
473     }
474     if (!isInstalled) {
475         HILOG_ERROR("the ability[%{public}s] is not installed", name.c_str());
476         return RET_ERR_NOT_INSTALLED;
477     }
478 
479     // Add enabled ability
480     if (std::any_of(enabledAbilities_.begin(), enabledAbilities_.end(),
481         [name](const std::string &abilityName) {
482             return abilityName == name;
483         })) {
484         HILOG_ERROR("The ability[%{public}s] is already enabled", name.c_str());
485         return RET_ERR_CONNECTION_EXIST;
486     }
487     enabledAbilities_.push_back(name);
488     UpdateEnableAbilityListsState();
489     UpdateAbilities();
490     Utils::RecordStartingA11yEvent(name);
491     return RET_OK;
492 }
493 
GetInstalledAbilitiesFromBMS()494 bool AccessibilityAccountData::GetInstalledAbilitiesFromBMS()
495 {
496     HILOG_DEBUG("start.");
497     HITRACE_METER_NAME(HITRACE_TAG_ACCESSIBILITY_MANAGER, "QueryInstalledAbilityInfo");
498     std::vector<AppExecFwk::ExtensionAbilityInfo> extensionInfos;
499     sptr<AppExecFwk::IBundleMgr> bms = Singleton<AccessibleAbilityManagerService>::GetInstance().GetBundleMgrProxy();
500     if (!bms) {
501         Utils::RecordUnavailableEvent(A11yUnavailableEvent::QUERY_EVENT, A11yError::ERROR_QUERY_PACKAGE_INFO_FAILED);
502         HILOG_ERROR("GetBundleMgrProxy failed.");
503         return false;
504     }
505     bool ret = bms->QueryExtensionAbilityInfos(AppExecFwk::ExtensionAbilityType::ACCESSIBILITY, id_, extensionInfos);
506     if (!ret) {
507         Utils::RecordUnavailableEvent(A11yUnavailableEvent::QUERY_EVENT, A11yError::ERROR_QUERY_PACKAGE_INFO_FAILED);
508         HILOG_ERROR("Query extension ability information failed.");
509         return false;
510     }
511     HILOG_DEBUG("query extensionAbilityInfos' size is %{public}zu.", extensionInfos.size());
512     for (auto& info : extensionInfos) {
513         AccessibilityAbilityInitParams initParams;
514         Utils::Parse(info, initParams);
515         std::shared_ptr<AccessibilityAbilityInfo> accessibilityInfo =
516             std::make_shared<AccessibilityAbilityInfo>(initParams);
517         AddInstalledAbility(*accessibilityInfo);
518     }
519     return true;
520 }
521 
Init()522 void AccessibilityAccountData::Init()
523 {
524     HILOG_DEBUG("start.");
525     if (!config_) {
526         config_ = std::make_shared<AccessibilitySettingsConfig>(id_);
527         config_->Init();
528     }
529 }
530 
AddConfigCallback(const sptr<IAccessibleAbilityManagerConfigObserver> & callback)531 void AccessibilityAccountData::AddConfigCallback(
532     const sptr<IAccessibleAbilityManagerConfigObserver>& callback)
533 {
534     HILOG_DEBUG("start.");
535     configCallbacks_.push_back(callback);
536 }
537 
GetConfigCallbacks() const538 const std::vector<sptr<IAccessibleAbilityManagerConfigObserver>> &AccessibilityAccountData::GetConfigCallbacks() const
539 {
540     HILOG_DEBUG("start.");
541     return configCallbacks_;
542 }
543 
SetConfigCallbacks(std::vector<sptr<IAccessibleAbilityManagerConfigObserver>> & observer)544 void AccessibilityAccountData::SetConfigCallbacks(std::vector<sptr<IAccessibleAbilityManagerConfigObserver>>& observer)
545 {
546     HILOG_DEBUG("start.");
547     configCallbacks_ = observer;
548 }
549 
RemoveConfigCallback(const wptr<IRemoteObject> & callback)550 void AccessibilityAccountData::RemoveConfigCallback(const wptr<IRemoteObject>& callback)
551 {
552     HILOG_DEBUG("start.");
553     for (auto itr = configCallbacks_.begin(); itr != configCallbacks_.end(); itr++) {
554         if ((*itr)->AsObject() == callback) {
555             configCallbacks_.erase(itr);
556             break;
557         }
558     }
559 }
560 
GetConfig()561 std::shared_ptr<AccessibilitySettingsConfig> AccessibilityAccountData::GetConfig()
562 {
563     HILOG_DEBUG("start.");
564     return config_;
565 }
566 
GetImportantEnabledAbilities(std::map<std::string,uint32_t> & importantEnabledAbilities) const567 void AccessibilityAccountData::GetImportantEnabledAbilities(
568     std::map<std::string, uint32_t> &importantEnabledAbilities) const
569 {
570     HILOG_DEBUG();
571     if (installedAbilities_.empty()) {
572         HILOG_DEBUG("Current user has no installedAbilities.");
573         return;
574     }
575     if (enabledAbilities_.empty()) {
576         HILOG_DEBUG("Current user has no enabledabilities.");
577         return;
578     }
579     HILOG_DEBUG("installedAbilities is %{public}zu.", installedAbilities_.size());
580     for (auto &installAbility : installedAbilities_) {
581         if (!installAbility.IsImportant()) {
582             HILOG_DEBUG("The ability is not important.");
583             continue;
584         }
585         std::string bundleName = installAbility.GetPackageName();
586         std::string abilityName = installAbility.GetName();
587         HILOG_DEBUG("installAbility's packageName is %{public}s and abilityName is %{public}s",
588             bundleName.c_str(), abilityName.c_str());
589         std::string uri = Utils::GetUri(bundleName, abilityName);
590         std::vector<std::string>::const_iterator iter = std::find(enabledAbilities_.begin(),
591             enabledAbilities_.end(), uri);
592         if (iter != enabledAbilities_.end()) {
593             uint32_t capabilityValues = installAbility.GetCapabilityValues();
594             importantEnabledAbilities.emplace(std::make_pair(uri, capabilityValues));
595         }
596     }
597 }
598 
UpdateImportantEnabledAbilities(std::map<std::string,uint32_t> & importantEnabledAbilities)599 void AccessibilityAccountData::UpdateImportantEnabledAbilities(
600     std::map<std::string, uint32_t> &importantEnabledAbilities)
601 {
602     HILOG_DEBUG();
603     if (importantEnabledAbilities.empty()) {
604         HILOG_DEBUG("There is no enabled abilities.");
605         return;
606     }
607     if (installedAbilities_.empty()) {
608         HILOG_DEBUG("Current user has no installedAbilities.");
609         return;
610     }
611     HILOG_DEBUG("installedAbilities is %{public}zu.", installedAbilities_.size());
612     for (auto &installAbility : installedAbilities_) {
613         std::string bundleName = installAbility.GetPackageName();
614         std::string abilityName = installAbility.GetName();
615         HILOG_DEBUG("installAbility's packageName is %{public}s and abilityName is %{public}s",
616             bundleName.c_str(), abilityName.c_str());
617         std::string uri = Utils::GetUri(bundleName, abilityName);
618         std::map<std::string, uint32_t>::iterator iter = importantEnabledAbilities.find(uri);
619         if (iter != importantEnabledAbilities.end()) {
620             AddEnabledAbility(uri);
621             installAbility.SetCapabilityValues(iter->second);
622         }
623     }
624 }
625 
GetInputFilterFlag() const626 uint32_t AccessibilityAccountData::GetInputFilterFlag() const
627 {
628     HILOG_DEBUG();
629     if (!config_) {
630         HILOG_ERROR("config is null");
631         return 0;
632     }
633     uint32_t flag = 0;
634     if (isScreenMagnification_ && config_->GetScreenMagnificationState()) {
635         flag |= AccessibilityInputInterceptor::FEATURE_SCREEN_MAGNIFICATION;
636     }
637     if (isEventTouchGuideState_) {
638         flag |= AccessibilityInputInterceptor::FEATURE_TOUCH_EXPLORATION;
639     }
640     if (isFilteringKeyEvents_) {
641         flag |= AccessibilityInputInterceptor::FEATURE_FILTER_KEY_EVENTS;
642     }
643     if (isGesturesSimulation_) {
644         flag |= AccessibilityInputInterceptor::FEATURE_INJECT_TOUCH_EVENTS;
645     }
646     if (config_->GetShortKeyState()) {
647         flag |= AccessibilityInputInterceptor::FEATURE_SHORT_KEY;
648     }
649     if (config_->GetMouseKeyState()) {
650         flag |= AccessibilityInputInterceptor::FEATURE_MOUSE_KEY;
651     }
652 
653     int32_t autoclickTime = config_->GetMouseAutoClick();
654     if (autoclickTime >= AUTOCLICK_DELAY_TIME_MIN && autoclickTime <= AUTOCLICK_DELAY_TIME_MAX) {
655         flag |= AccessibilityInputInterceptor::FEATURE_MOUSE_AUTOCLICK;
656     }
657 
658     return flag;
659 }
660 
UpdateAbilities()661 void AccessibilityAccountData::UpdateAbilities()
662 {
663     HILOG_DEBUG("installedAbilities is %{public}zu.", installedAbilities_.size());
664     for (auto &installAbility : installedAbilities_) {
665         std::string bundleName = installAbility.GetPackageName();
666         std::string abilityName = installAbility.GetName();
667         HILOG_DEBUG("installAbility's packageName is %{public}s and abilityName is %{public}s",
668             bundleName.c_str(), abilityName.c_str());
669 
670         if (connectingA11yAbilities_.count(Utils::GetUri(bundleName, abilityName))) {
671             HILOG_DEBUG("The ability(bundleName[%{public}s] abilityName[%{public}s]) is connecting.",
672                 bundleName.c_str(), abilityName.c_str());
673             continue;
674         }
675         sptr<AccessibleAbilityConnection> connection =
676             GetAccessibleAbilityConnection(Utils::GetUri(bundleName, abilityName));
677 
678         auto iter = std::find(enabledAbilities_.begin(), enabledAbilities_.end(),
679             Utils::GetUri(bundleName, abilityName));
680         if (iter != enabledAbilities_.end()) {
681             if (connection) {
682                 continue;
683             }
684             AppExecFwk::ElementName element("", bundleName, abilityName);
685             connection = new(std::nothrow) AccessibleAbilityConnection(id_, connectCounter_++, installAbility);
686             if (connection) {
687                 connection->Connect(element);
688                 AddConnectingA11yAbility(Utils::GetUri(bundleName, abilityName), connection);
689             }
690         } else {
691             HILOG_DEBUG("not in enabledAbilites list .");
692             if (connection) {
693                 RemoveConnectedAbility(connection->GetElementName());
694                 connection->Disconnect();
695             }
696         }
697     }
698 }
699 
RemoveAbility(const std::string & bundleName)700 bool AccessibilityAccountData::RemoveAbility(const std::string &bundleName)
701 {
702     HILOG_DEBUG("bundleName(%{public}s)", bundleName.c_str());
703     if (installedAbilities_.empty()) {
704         HILOG_DEBUG("There is no installed abilities.");
705         return false;
706     }
707     RemoveInstalledAbility(bundleName);
708 
709     bool result = false;
710     // Remove enabled ability, remove connecting ability if it is connecting.
711     for (auto& enableAbility : enabledAbilities_) {
712         if (enableAbility.substr(0, enableAbility.find("/")) == bundleName) {
713             RemoveEnabledAbility(enableAbility);
714             RemoveConnectingA11yAbility(enableAbility);
715             result = true;
716         }
717     }
718 
719     // Remove connected ability
720     for (auto &connectedAbility : connectedA11yAbilities_) {
721         std::size_t firstPos = connectedAbility.first.find_first_of('/') + 1;
722         std::size_t endPos = connectedAbility.first.find_last_of('/');
723         if (endPos <= firstPos) {
724             HILOG_ERROR("it's a wrong ability and the uri is %{public}s", connectedAbility.first.c_str());
725             continue;
726         }
727         std::string connectedBundleName = connectedAbility.first.substr(firstPos, endPos - firstPos);
728         if (connectedBundleName == bundleName) {
729             HILOG_DEBUG("Remove connected ability and it's bundle name is %{public}s", connectedBundleName.c_str());
730             RemoveConnectedAbility(connectedAbility.second->GetElementName());
731             result = true;
732         }
733     }
734 
735     if (result) {
736         UpdateAbilities();
737     }
738     return result;
739 }
740 
AddAbility(const std::string & bundleName)741 void AccessibilityAccountData::AddAbility(const std::string &bundleName)
742 {
743     HILOG_DEBUG("bundleName(%{public}s)", bundleName.c_str());
744 
745     std::vector<AppExecFwk::ExtensionAbilityInfo> extensionInfos;
746     sptr<AppExecFwk::IBundleMgr> bms = Singleton<AccessibleAbilityManagerService>::GetInstance().GetBundleMgrProxy();
747     if (!bms) {
748         HILOG_ERROR("bms is nullptr.");
749         return;
750     }
751     bms->QueryExtensionAbilityInfos(AppExecFwk::ExtensionAbilityType::ACCESSIBILITY, id_, extensionInfos);
752     HILOG_DEBUG("query extensionAbilityInfos' size is %{public}zu.", extensionInfos.size());
753     bool hasNewExtensionAbility = false;
754     for (auto &newAbility : extensionInfos) {
755         if (newAbility.bundleName == bundleName) {
756             HILOG_DEBUG("The package%{public}s added", (bundleName + "/" + newAbility.name).c_str());
757             AccessibilityAbilityInitParams initParams;
758             Utils::Parse(newAbility, initParams);
759             std::shared_ptr<AccessibilityAbilityInfo> accessibilityInfo =
760                 std::make_shared<AccessibilityAbilityInfo>(initParams);
761             AddInstalledAbility(*accessibilityInfo);
762             hasNewExtensionAbility = true;
763         }
764     }
765 
766     if (hasNewExtensionAbility) {
767         HILOG_DEBUG("add new extension ability and update abilities.");
768         UpdateAbilities();
769     }
770 }
771 
ChangeAbility(const std::string & bundleName)772 void AccessibilityAccountData::ChangeAbility(const std::string &bundleName)
773 {
774     HILOG_DEBUG("bundleName(%{public}s)", bundleName.c_str());
775 
776     if (installedAbilities_.empty()) {
777         HILOG_DEBUG("There is no installed abilities.");
778         return;
779     }
780     RemoveInstalledAbility(bundleName);
781     AddAbility(bundleName);
782 }
783 
AddUITestClient(const sptr<IRemoteObject> & obj,const std::string & bundleName,const std::string & abilityName)784 void AccessibilityAccountData::AddUITestClient(const sptr<IRemoteObject> &obj,
785     const std::string &bundleName, const std::string &abilityName)
786 {
787     HILOG_DEBUG();
788     // Add installed ability
789     std::shared_ptr<AccessibilityAbilityInfo> abilityInfo = std::make_shared<AccessibilityAbilityInfo>();
790     abilityInfo->SetPackageName(bundleName);
791     uint32_t capabilities = CAPABILITY_RETRIEVE | CAPABILITY_GESTURE;
792     abilityInfo->SetCapabilityValues(capabilities);
793     abilityInfo->SetAccessibilityAbilityType(ACCESSIBILITY_ABILITY_TYPE_ALL);
794     abilityInfo->SetEventTypes(EventType::TYPES_ALL_MASK);
795     AddInstalledAbility(*abilityInfo);
796 
797     // Add connected ability
798     sptr<AppExecFwk::ElementName> elementName = new(std::nothrow) AppExecFwk::ElementName();
799     if (!elementName) {
800         HILOG_ERROR("elementName is null");
801         return;
802     }
803     elementName->SetBundleName(bundleName);
804     elementName->SetAbilityName(abilityName);
805     sptr<AccessibleAbilityConnection> connection = new(std::nothrow) AccessibleAbilityConnection(
806         id_, connectCounter_++, *abilityInfo);
807     if (!connection) {
808         HILOG_ERROR("connection is null");
809         return;
810     }
811     connection->OnAbilityConnectDoneSync(*elementName, obj);
812 }
813 
RemoveUITestClient(sptr<AccessibleAbilityConnection> & connection,const std::string & bundleName)814 void AccessibilityAccountData::RemoveUITestClient(sptr<AccessibleAbilityConnection> &connection,
815     const std::string &bundleName)
816 {
817     HILOG_DEBUG();
818     if (!connection) {
819         HILOG_ERROR("connection is nullptr");
820         return;
821     }
822     RemoveInstalledAbility(bundleName);
823     RemoveConnectedAbility(connection->GetElementName());
824     connection->OnAbilityDisconnectDoneSync(connection->GetElementName());
825 }
826 } // namespace Accessibility
827 } // namespace OHOS
828