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