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