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