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