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