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