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