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