• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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