1885b47fbSopenharmony_ci/*
2885b47fbSopenharmony_ci * Copyright (C) 2022 Huawei Device Co., Ltd.
3885b47fbSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4885b47fbSopenharmony_ci * you may not use this file except in compliance with the License.
5885b47fbSopenharmony_ci * You may obtain a copy of the License at
6885b47fbSopenharmony_ci *
7885b47fbSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8885b47fbSopenharmony_ci *
9885b47fbSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10885b47fbSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11885b47fbSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12885b47fbSopenharmony_ci * See the License for the specific language governing permissions and
13885b47fbSopenharmony_ci * limitations under the License.
14885b47fbSopenharmony_ci */
15885b47fbSopenharmony_ci
16885b47fbSopenharmony_ci#include "accessibility_account_data.h"
17885b47fbSopenharmony_ci
18885b47fbSopenharmony_ci#include <any>
19885b47fbSopenharmony_ci#ifdef OHOS_BUILD_ENABLE_HITRACE
20885b47fbSopenharmony_ci#include <hitrace_meter.h>
21885b47fbSopenharmony_ci#endif // OHOS_BUILD_ENABLE_HITRACE
22885b47fbSopenharmony_ci#ifdef OHOS_BUILD_ENABLE_DISPLAY_MANAGER
23885b47fbSopenharmony_ci#include "accessibility_display_manager.h"
24885b47fbSopenharmony_ci#endif
25885b47fbSopenharmony_ci#include "accessible_ability_manager_service.h"
26885b47fbSopenharmony_ci#include "extension_ability_info.h"
27885b47fbSopenharmony_ci#include "hilog_wrapper.h"
28885b47fbSopenharmony_ci#include "utils.h"
29885b47fbSopenharmony_ci#include "system_ability_definition.h"
30885b47fbSopenharmony_ci#include "os_account_manager.h"
31885b47fbSopenharmony_ci
32885b47fbSopenharmony_cinamespace OHOS {
33885b47fbSopenharmony_cinamespace Accessibility {
34885b47fbSopenharmony_cinamespace {
35885b47fbSopenharmony_ci    constexpr int32_t AUTOCLICK_DELAY_TIME_MIN = 1000; // ms
36885b47fbSopenharmony_ci    constexpr int32_t AUTOCLICK_DELAY_TIME_MAX = 5000; // ms
37885b47fbSopenharmony_ci    constexpr int32_t INIT_DATASHARE_HELPER_SLEEP_TIME = 500;
38885b47fbSopenharmony_ci    constexpr int DEFAULT_ACCOUNT_ID = 100;
39885b47fbSopenharmony_ci    constexpr int SHORT_KEY_TIMEOUT_AFTER_USE = 1000; // ms
40885b47fbSopenharmony_ci    constexpr int SHORT_KEY_TIMEOUT_BEFORE_USE = 3000; // ms
41885b47fbSopenharmony_ci    constexpr int INVALID_SHORTCUT_ON_LOCK_SCREEN_STATE = 2;
42885b47fbSopenharmony_ci    const std::string HIGH_TEXT_CONTRAST_ENABLED = "high_text_contrast_enabled";
43885b47fbSopenharmony_ci    const std::string ACCESSIBILITY_DISPLAY_INVERSION_ENABLED = "accessibility_display_inversion_enabled";
44885b47fbSopenharmony_ci    const std::string ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED = "accessibility_display_daltonizer_enabled";
45885b47fbSopenharmony_ci    const std::string MASTER_MONO = "master_mono";
46885b47fbSopenharmony_ci    const std::string ACCESSIBILITY_SCREENREADER_ENABLED = "accessibility_screenreader_enabled";
47885b47fbSopenharmony_ci    const std::string MASTER_BALENCE = "master_balance";
48885b47fbSopenharmony_ci    const std::string CLICK_RESPONSE_TIME = "click_response_time";
49885b47fbSopenharmony_ci    const std::string IGNORE_REPEAT_CLICK_SWITCH = "ignore_repeat_click_switch";
50885b47fbSopenharmony_ci    const std::string IGNORE_REPEAT_CLICK_TIME = "ignore_repeat_click_time";
51885b47fbSopenharmony_ci    const std::string ACCESSIBILITY_DISPLAY_DALTONIZER = "accessibility_display_daltonizer";
52885b47fbSopenharmony_ci    const std::string SCREEN_READER_BUNDLE_ABILITY_NAME = "com.huawei.hmos.screenreader/AccessibilityExtAbility";
53885b47fbSopenharmony_ci    const std::string DEVICE_PROVISIONED = "device_provisioned";
54885b47fbSopenharmony_ci    const std::string ENABLED_ACCESSIBILITY_SERVICES = "enabled_accessibility_services";
55885b47fbSopenharmony_ci    const std::string ACCESSIBILITY_SHORTCUT_ENABLED = "accessibility_shortcut_enabled";
56885b47fbSopenharmony_ci    const std::string ACCESSIBILITY_SHORTCUT_ENABLED_ON_LOCK_SCREEN = "accessibility_shortcut_enabled_on_lock_screen";
57885b47fbSopenharmony_ci    const std::string ACCESSIBILITY_SHORTCUT_ON_LOCK_SCREEN = "accessibility_shortcut_on_lock_screen";
58885b47fbSopenharmony_ci    const std::string ACCESSIBILITY_SHORTCUT_TIMEOUT = "accessibility_shortcut_timeout";
59885b47fbSopenharmony_ci    const std::string SCREEN_MAGNIFICATION_KEY = "accessibility_display_magnification_enabled";
60885b47fbSopenharmony_ci    const std::string ACCESSIBILITY_CLONE_FLAG = "accessibility_config_clone";
61885b47fbSopenharmony_ci} // namespace
62885b47fbSopenharmony_ci
63885b47fbSopenharmony_ciAccessibilityAccountData::AccessibilityAccountData(int32_t accountId)
64885b47fbSopenharmony_ci{
65885b47fbSopenharmony_ci    id_ = accountId;
66885b47fbSopenharmony_ci}
67885b47fbSopenharmony_ci
68885b47fbSopenharmony_ciAccessibilityAccountData::~AccessibilityAccountData()
69885b47fbSopenharmony_ci{}
70885b47fbSopenharmony_ci
71885b47fbSopenharmony_ciint32_t AccessibilityAccountData::GetAccountId()
72885b47fbSopenharmony_ci{
73885b47fbSopenharmony_ci    HILOG_INFO();
74885b47fbSopenharmony_ci    return id_;
75885b47fbSopenharmony_ci}
76885b47fbSopenharmony_ci
77885b47fbSopenharmony_ciuint32_t AccessibilityAccountData::GetAccessibilityState()
78885b47fbSopenharmony_ci{
79885b47fbSopenharmony_ci    HILOG_DEBUG();
80885b47fbSopenharmony_ci    uint32_t state = 0;
81885b47fbSopenharmony_ci    if (connectedA11yAbilities_.GetSize() != 0 || connectingA11yAbilities_.GetSize() != 0) {
82885b47fbSopenharmony_ci        HILOG_DEBUG("connectingA11yAbilities %{public}zu connectedA11yAbilities %{public}zu",
83885b47fbSopenharmony_ci            connectingA11yAbilities_.GetSize(), connectedA11yAbilities_.GetSize());
84885b47fbSopenharmony_ci        state |= STATE_ACCESSIBILITY_ENABLED;
85885b47fbSopenharmony_ci        if (!config_->GetEnabledState()) {
86885b47fbSopenharmony_ci            config_->SetEnabled(true);
87885b47fbSopenharmony_ci        }
88885b47fbSopenharmony_ci    } else {
89885b47fbSopenharmony_ci        if (config_->GetEnabledState()) {
90885b47fbSopenharmony_ci            config_->SetEnabled(false);
91885b47fbSopenharmony_ci        }
92885b47fbSopenharmony_ci    }
93885b47fbSopenharmony_ci
94885b47fbSopenharmony_ci    if (config_->GetTouchGuideState()) {
95885b47fbSopenharmony_ci        state |= STATE_EXPLORATION_ENABLED;
96885b47fbSopenharmony_ci    }
97885b47fbSopenharmony_ci
98885b47fbSopenharmony_ci    if (config_->GetKeyEventObserverState()) {
99885b47fbSopenharmony_ci        state |= STATE_KEYEVENT_ENABLED;
100885b47fbSopenharmony_ci    }
101885b47fbSopenharmony_ci
102885b47fbSopenharmony_ci    if (config_->GetGestureState()) {
103885b47fbSopenharmony_ci        state |= STATE_GESTURE_ENABLED;
104885b47fbSopenharmony_ci    }
105885b47fbSopenharmony_ci    return state;
106885b47fbSopenharmony_ci}
107885b47fbSopenharmony_ci
108885b47fbSopenharmony_civoid AccessibilityAccountData::OnAccountSwitched()
109885b47fbSopenharmony_ci{
110885b47fbSopenharmony_ci    HILOG_INFO();
111885b47fbSopenharmony_ci    connectingA11yAbilities_.Clear();
112885b47fbSopenharmony_ci    std::vector<sptr<AccessibleAbilityConnection>> connectionList;
113885b47fbSopenharmony_ci    connectedA11yAbilities_.GetAccessibilityAbilities(connectionList);
114885b47fbSopenharmony_ci    for (auto& connection : connectionList) {
115885b47fbSopenharmony_ci        if (connection) {
116885b47fbSopenharmony_ci            connection->Disconnect();
117885b47fbSopenharmony_ci        }
118885b47fbSopenharmony_ci    }
119885b47fbSopenharmony_ci
120885b47fbSopenharmony_ci    connectedA11yAbilities_.Clear();
121885b47fbSopenharmony_ci    enabledAbilities_.clear();
122885b47fbSopenharmony_ci    std::lock_guard lock(asacConnectionsMutex_);
123885b47fbSopenharmony_ci    asacConnections_.clear();
124885b47fbSopenharmony_ci}
125885b47fbSopenharmony_ci
126885b47fbSopenharmony_civoid AccessibilityAccountData::AddConnectedAbility(sptr<AccessibleAbilityConnection>& connection)
127885b47fbSopenharmony_ci{
128885b47fbSopenharmony_ci    if (!connection) {
129885b47fbSopenharmony_ci        HILOG_ERROR("connection is nullptr");
130885b47fbSopenharmony_ci        return;
131885b47fbSopenharmony_ci    }
132885b47fbSopenharmony_ci
133885b47fbSopenharmony_ci    std::string uri = Utils::GetUri(connection->GetElementName());
134885b47fbSopenharmony_ci    connectedA11yAbilities_.AddAccessibilityAbility(uri, connection);
135885b47fbSopenharmony_ci}
136885b47fbSopenharmony_ci
137885b47fbSopenharmony_civoid AccessibilityAccountData::RemoveConnectedAbility(const AppExecFwk::ElementName &element)
138885b47fbSopenharmony_ci{
139885b47fbSopenharmony_ci    connectedA11yAbilities_.RemoveAccessibilityAbilityByUri(Utils::GetUri(element));
140885b47fbSopenharmony_ci}
141885b47fbSopenharmony_ci
142885b47fbSopenharmony_civoid AccessibilityAccountData::AddCaptionPropertyCallback(
143885b47fbSopenharmony_ci    const sptr<IAccessibleAbilityManagerCaptionObserver>& callback)
144885b47fbSopenharmony_ci{
145885b47fbSopenharmony_ci    HILOG_DEBUG();
146885b47fbSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(captionPropertyCallbacksMutex_);
147885b47fbSopenharmony_ci    captionPropertyCallbacks_.push_back(callback);
148885b47fbSopenharmony_ci}
149885b47fbSopenharmony_ci
150885b47fbSopenharmony_civoid AccessibilityAccountData::RemoveCaptionPropertyCallback(const wptr<IRemoteObject>& callback)
151885b47fbSopenharmony_ci{
152885b47fbSopenharmony_ci    HILOG_DEBUG();
153885b47fbSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(captionPropertyCallbacksMutex_);
154885b47fbSopenharmony_ci    for (auto itr = captionPropertyCallbacks_.begin(); itr != captionPropertyCallbacks_.end(); itr++) {
155885b47fbSopenharmony_ci        if ((*itr)->AsObject() == callback) {
156885b47fbSopenharmony_ci            captionPropertyCallbacks_.erase(itr);
157885b47fbSopenharmony_ci            break;
158885b47fbSopenharmony_ci        }
159885b47fbSopenharmony_ci    }
160885b47fbSopenharmony_ci}
161885b47fbSopenharmony_ci
162885b47fbSopenharmony_civoid AccessibilityAccountData::AddEnableAbilityListsObserver(
163885b47fbSopenharmony_ci    const sptr<IAccessibilityEnableAbilityListsObserver>& observer)
164885b47fbSopenharmony_ci{
165885b47fbSopenharmony_ci    HILOG_DEBUG();
166885b47fbSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(enableAbilityListObserversMutex_);
167885b47fbSopenharmony_ci    if (std::any_of(enableAbilityListsObservers_.begin(), enableAbilityListsObservers_.end(),
168885b47fbSopenharmony_ci        [observer](const sptr<IAccessibilityEnableAbilityListsObserver> &listObserver) {
169885b47fbSopenharmony_ci            return listObserver == observer;
170885b47fbSopenharmony_ci        })) {
171885b47fbSopenharmony_ci        HILOG_ERROR("observer is already exist");
172885b47fbSopenharmony_ci        return;
173885b47fbSopenharmony_ci    }
174885b47fbSopenharmony_ci    enableAbilityListsObservers_.push_back(observer);
175885b47fbSopenharmony_ci    HILOG_DEBUG("observer's size is %{public}zu", enableAbilityListsObservers_.size());
176885b47fbSopenharmony_ci}
177885b47fbSopenharmony_ci
178885b47fbSopenharmony_civoid AccessibilityAccountData::RemoveEnableAbilityListsObserver(const wptr<IRemoteObject>& observer)
179885b47fbSopenharmony_ci{
180885b47fbSopenharmony_ci    HILOG_INFO();
181885b47fbSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(enableAbilityListObserversMutex_);
182885b47fbSopenharmony_ci    for (auto itr = enableAbilityListsObservers_.begin(); itr != enableAbilityListsObservers_.end(); itr++) {
183885b47fbSopenharmony_ci        if ((*itr)->AsObject() == observer) {
184885b47fbSopenharmony_ci            HILOG_DEBUG("erase observer");
185885b47fbSopenharmony_ci            enableAbilityListsObservers_.erase(itr);
186885b47fbSopenharmony_ci            HILOG_DEBUG("observer's size is %{public}zu", enableAbilityListsObservers_.size());
187885b47fbSopenharmony_ci            return;
188885b47fbSopenharmony_ci        }
189885b47fbSopenharmony_ci    }
190885b47fbSopenharmony_ci}
191885b47fbSopenharmony_ci
192885b47fbSopenharmony_civoid AccessibilityAccountData::UpdateEnableAbilityListsState()
193885b47fbSopenharmony_ci{
194885b47fbSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(enableAbilityListObserversMutex_);
195885b47fbSopenharmony_ci    HILOG_DEBUG("observer's size is %{public}zu", enableAbilityListsObservers_.size());
196885b47fbSopenharmony_ci    for (auto &observer : enableAbilityListsObservers_) {
197885b47fbSopenharmony_ci        if (observer) {
198885b47fbSopenharmony_ci            observer->OnAccessibilityEnableAbilityListsChanged();
199885b47fbSopenharmony_ci        }
200885b47fbSopenharmony_ci    }
201885b47fbSopenharmony_ci}
202885b47fbSopenharmony_ci
203885b47fbSopenharmony_civoid AccessibilityAccountData::UpdateInstallAbilityListsState()
204885b47fbSopenharmony_ci{
205885b47fbSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(enableAbilityListObserversMutex_);
206885b47fbSopenharmony_ci    HILOG_DEBUG("observer's size is %{public}zu", enableAbilityListsObservers_.size());
207885b47fbSopenharmony_ci    for (auto &observer : enableAbilityListsObservers_) {
208885b47fbSopenharmony_ci        if (observer) {
209885b47fbSopenharmony_ci            observer->OnAccessibilityInstallAbilityListsChanged();
210885b47fbSopenharmony_ci        }
211885b47fbSopenharmony_ci    }
212885b47fbSopenharmony_ci}
213885b47fbSopenharmony_ci
214885b47fbSopenharmony_civoid AccessibilityAccountData::AddAccessibilityWindowConnection(
215885b47fbSopenharmony_ci    const int32_t windowId, const sptr<AccessibilityWindowConnection>& interactionConnection)
216885b47fbSopenharmony_ci{
217885b47fbSopenharmony_ci    HILOG_INFO("windowId(%{public}d)", windowId);
218885b47fbSopenharmony_ci    std::lock_guard lock(asacConnectionsMutex_);
219885b47fbSopenharmony_ci    asacConnections_[windowId] = interactionConnection;
220885b47fbSopenharmony_ci}
221885b47fbSopenharmony_ci
222885b47fbSopenharmony_civoid AccessibilityAccountData::RemoveAccessibilityWindowConnection(const int32_t windowId)
223885b47fbSopenharmony_ci{
224885b47fbSopenharmony_ci    HILOG_INFO("windowId(%{public}d)", windowId);
225885b47fbSopenharmony_ci    std::lock_guard lock(asacConnectionsMutex_);
226885b47fbSopenharmony_ci    std::map<int32_t, sptr<AccessibilityWindowConnection>>::iterator it = asacConnections_.find(windowId);
227885b47fbSopenharmony_ci    if (it != asacConnections_.end()) {
228885b47fbSopenharmony_ci        asacConnections_.erase(it);
229885b47fbSopenharmony_ci    }
230885b47fbSopenharmony_ci}
231885b47fbSopenharmony_ci
232885b47fbSopenharmony_civoid AccessibilityAccountData::AddConnectingA11yAbility(const std::string &uri,
233885b47fbSopenharmony_ci    const sptr<AccessibleAbilityConnection> &connection)
234885b47fbSopenharmony_ci{
235885b47fbSopenharmony_ci    connectingA11yAbilities_.AddAccessibilityAbility(uri, connection);
236885b47fbSopenharmony_ci}
237885b47fbSopenharmony_ci
238885b47fbSopenharmony_civoid AccessibilityAccountData::RemoveConnectingA11yAbility(const std::string &uri)
239885b47fbSopenharmony_ci{
240885b47fbSopenharmony_ci    connectingA11yAbilities_.RemoveAccessibilityAbilityByUri(uri);
241885b47fbSopenharmony_ci}
242885b47fbSopenharmony_ci
243885b47fbSopenharmony_civoid AccessibilityAccountData::AddEnabledAbility(const std::string &name)
244885b47fbSopenharmony_ci{
245885b47fbSopenharmony_ci    HILOG_DEBUG("AddEnabledAbility start.");
246885b47fbSopenharmony_ci    if (std::any_of(enabledAbilities_.begin(), enabledAbilities_.end(),
247885b47fbSopenharmony_ci        [name](const std::string &abilityName) {
248885b47fbSopenharmony_ci            return abilityName == name;
249885b47fbSopenharmony_ci        })) {
250885b47fbSopenharmony_ci        HILOG_DEBUG("The ability is already enabled, and it's name is %{public}s", name.c_str());
251885b47fbSopenharmony_ci        return;
252885b47fbSopenharmony_ci    }
253885b47fbSopenharmony_ci    enabledAbilities_.push_back(name);
254885b47fbSopenharmony_ci    if (name == screenReaderAbilityName_) {
255885b47fbSopenharmony_ci        SetScreenReaderState(screenReaderKey_, "1");
256885b47fbSopenharmony_ci    }
257885b47fbSopenharmony_ci    UpdateEnableAbilityListsState();
258885b47fbSopenharmony_ci    HILOG_DEBUG("Add EnabledAbility: %{public}zu", enabledAbilities_.size());
259885b47fbSopenharmony_ci}
260885b47fbSopenharmony_ci
261885b47fbSopenharmony_ciRetError AccessibilityAccountData::RemoveEnabledAbility(const std::string &name)
262885b47fbSopenharmony_ci{
263885b47fbSopenharmony_ci    HILOG_DEBUG("RemoveEnabledAbility start");
264885b47fbSopenharmony_ci    for (auto it = enabledAbilities_.begin(); it != enabledAbilities_.end(); it++) {
265885b47fbSopenharmony_ci        if (*it == name) {
266885b47fbSopenharmony_ci            HILOG_DEBUG("Removed %{public}s from EnabledAbility: ", name.c_str());
267885b47fbSopenharmony_ci            enabledAbilities_.erase(it);
268885b47fbSopenharmony_ci            if (name == screenReaderAbilityName_) {
269885b47fbSopenharmony_ci                SetScreenReaderState(screenReaderKey_, "0");
270885b47fbSopenharmony_ci            }
271885b47fbSopenharmony_ci            UpdateEnableAbilityListsState();
272885b47fbSopenharmony_ci            HILOG_DEBUG("EnabledAbility size %{public}zu", enabledAbilities_.size());
273885b47fbSopenharmony_ci            return RET_OK;
274885b47fbSopenharmony_ci        }
275885b47fbSopenharmony_ci    }
276885b47fbSopenharmony_ci    HILOG_ERROR("The ability %{public}s is not enabled.", name.c_str());
277885b47fbSopenharmony_ci    return RET_ERR_NOT_ENABLED;
278885b47fbSopenharmony_ci}
279885b47fbSopenharmony_ci
280885b47fbSopenharmony_civoid AccessibilityAccountData::AddInstalledAbility(AccessibilityAbilityInfo& abilityInfo)
281885b47fbSopenharmony_ci{
282885b47fbSopenharmony_ci    HILOG_DEBUG("abilityInfo's bundle name is %{public}s", abilityInfo.GetPackageName().c_str());
283885b47fbSopenharmony_ci    for (size_t i = 0; i < installedAbilities_.size(); i++) {
284885b47fbSopenharmony_ci        if ((installedAbilities_[i].GetPackageName() == abilityInfo.GetPackageName()) &&
285885b47fbSopenharmony_ci            installedAbilities_[i].GetName() == abilityInfo.GetName()) {
286885b47fbSopenharmony_ci            HILOG_DEBUG("the ability is already exist.");
287885b47fbSopenharmony_ci            return;
288885b47fbSopenharmony_ci        }
289885b47fbSopenharmony_ci    }
290885b47fbSopenharmony_ci    installedAbilities_.push_back(abilityInfo);
291885b47fbSopenharmony_ci    UpdateInstallAbilityListsState();
292885b47fbSopenharmony_ci    HILOG_DEBUG("push back installed ability successfully and installedAbilities_'s size is %{public}zu",
293885b47fbSopenharmony_ci        installedAbilities_.size());
294885b47fbSopenharmony_ci}
295885b47fbSopenharmony_ci
296885b47fbSopenharmony_civoid AccessibilityAccountData::RemoveInstalledAbility(const std::string &bundleName)
297885b47fbSopenharmony_ci{
298885b47fbSopenharmony_ci    HILOG_DEBUG("start.");
299885b47fbSopenharmony_ci    for (auto it = installedAbilities_.begin(); it != installedAbilities_.end();) {
300885b47fbSopenharmony_ci        if (it->GetPackageName() == bundleName) {
301885b47fbSopenharmony_ci            HILOG_DEBUG("Removed %{public}s from InstalledAbility: ", bundleName.c_str());
302885b47fbSopenharmony_ci            if (!config_) {
303885b47fbSopenharmony_ci                it = installedAbilities_.erase(it);
304885b47fbSopenharmony_ci                UpdateInstallAbilityListsState();
305885b47fbSopenharmony_ci                continue;
306885b47fbSopenharmony_ci            }
307885b47fbSopenharmony_ci            it = installedAbilities_.erase(it);
308885b47fbSopenharmony_ci            UpdateInstallAbilityListsState();
309885b47fbSopenharmony_ci        } else {
310885b47fbSopenharmony_ci            ++it;
311885b47fbSopenharmony_ci        }
312885b47fbSopenharmony_ci    }
313885b47fbSopenharmony_ci}
314885b47fbSopenharmony_ci
315885b47fbSopenharmony_civoid AccessibilityAccountData::ClearInstalledAbility()
316885b47fbSopenharmony_ci{
317885b47fbSopenharmony_ci    HILOG_DEBUG("start.");
318885b47fbSopenharmony_ci    installedAbilities_.clear();
319885b47fbSopenharmony_ci}
320885b47fbSopenharmony_ci
321885b47fbSopenharmony_ciconst sptr<AccessibleAbilityConnection> AccessibilityAccountData::GetAccessibleAbilityConnection(
322885b47fbSopenharmony_ci    const std::string &elementName)
323885b47fbSopenharmony_ci{
324885b47fbSopenharmony_ci    return connectedA11yAbilities_.GetAccessibilityAbilityByName(elementName);
325885b47fbSopenharmony_ci}
326885b47fbSopenharmony_ci
327885b47fbSopenharmony_ciconst sptr<AccessibilityWindowConnection> AccessibilityAccountData::GetAccessibilityWindowConnection(
328885b47fbSopenharmony_ci    const int32_t windowId)
329885b47fbSopenharmony_ci{
330885b47fbSopenharmony_ci    std::lock_guard lock(asacConnectionsMutex_);
331885b47fbSopenharmony_ci    HILOG_DEBUG("window id[%{public}d] interactionOperators's size[%{public}zu]", windowId, asacConnections_.size());
332885b47fbSopenharmony_ci    for (auto &asacConnection : asacConnections_) {
333885b47fbSopenharmony_ci        HILOG_DEBUG("window id of asacConnection is %{public}d", asacConnection.first);
334885b47fbSopenharmony_ci    }
335885b47fbSopenharmony_ci
336885b47fbSopenharmony_ci    if (asacConnections_.count(windowId) > 0) {
337885b47fbSopenharmony_ci        return asacConnections_[windowId];
338885b47fbSopenharmony_ci    }
339885b47fbSopenharmony_ci
340885b47fbSopenharmony_ci    return nullptr;
341885b47fbSopenharmony_ci}
342885b47fbSopenharmony_ci
343885b47fbSopenharmony_ciconst std::map<std::string, sptr<AccessibleAbilityConnection>> AccessibilityAccountData::GetConnectedA11yAbilities()
344885b47fbSopenharmony_ci{
345885b47fbSopenharmony_ci    std::map<std::string, sptr<AccessibleAbilityConnection>> connectionMap;
346885b47fbSopenharmony_ci    connectedA11yAbilities_.GetAccessibilityAbilitiesMap(connectionMap);
347885b47fbSopenharmony_ci    return connectionMap;
348885b47fbSopenharmony_ci}
349885b47fbSopenharmony_ci
350885b47fbSopenharmony_ciconst std::map<int32_t, sptr<AccessibilityWindowConnection>> AccessibilityAccountData::GetAsacConnections()
351885b47fbSopenharmony_ci{
352885b47fbSopenharmony_ci    HILOG_DEBUG("GetAsacConnections start.");
353885b47fbSopenharmony_ci    return asacConnections_;
354885b47fbSopenharmony_ci}
355885b47fbSopenharmony_ci
356885b47fbSopenharmony_ciconst CaptionPropertyCallbacks AccessibilityAccountData::GetCaptionPropertyCallbacks()
357885b47fbSopenharmony_ci{
358885b47fbSopenharmony_ci    HILOG_DEBUG("GetCaptionPropertyCallbacks start.");
359885b47fbSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(captionPropertyCallbacksMutex_);
360885b47fbSopenharmony_ci    CaptionPropertyCallbacks rtnVec = captionPropertyCallbacks_;
361885b47fbSopenharmony_ci    return rtnVec;
362885b47fbSopenharmony_ci}
363885b47fbSopenharmony_ci
364885b47fbSopenharmony_cisptr<AccessibleAbilityConnection> AccessibilityAccountData::GetConnectingA11yAbility(const std::string &uri)
365885b47fbSopenharmony_ci{
366885b47fbSopenharmony_ci    return connectingA11yAbilities_.GetAccessibilityAbilityByUri(uri);
367885b47fbSopenharmony_ci}
368885b47fbSopenharmony_ci
369885b47fbSopenharmony_ciconst std::vector<std::string> &AccessibilityAccountData::GetEnabledAbilities()
370885b47fbSopenharmony_ci{
371885b47fbSopenharmony_ci    HILOG_DEBUG("enabledAbilities_'s size is (%{public}zu).", enabledAbilities_.size());
372885b47fbSopenharmony_ci    for (auto& ability : enabledAbilities_) {
373885b47fbSopenharmony_ci        HILOG_DEBUG("bundleName is %{public}s ", ability.c_str());
374885b47fbSopenharmony_ci    }
375885b47fbSopenharmony_ci    return enabledAbilities_;
376885b47fbSopenharmony_ci}
377885b47fbSopenharmony_ci
378885b47fbSopenharmony_ciconst std::vector<AccessibilityAbilityInfo> &AccessibilityAccountData::GetInstalledAbilities() const
379885b47fbSopenharmony_ci{
380885b47fbSopenharmony_ci    HILOG_DEBUG("GetInstalledAbilities start.");
381885b47fbSopenharmony_ci    return installedAbilities_;
382885b47fbSopenharmony_ci}
383885b47fbSopenharmony_ci
384885b47fbSopenharmony_civoid AccessibilityAccountData::GetAbilitiesByState(AbilityStateType state,
385885b47fbSopenharmony_ci    std::vector<AccessibilityAbilityInfo> &abilities)
386885b47fbSopenharmony_ci{
387885b47fbSopenharmony_ci    HILOG_DEBUG("get abilities by state %{public}d", state);
388885b47fbSopenharmony_ci    if (state == ABILITY_STATE_ENABLE) {
389885b47fbSopenharmony_ci        connectedA11yAbilities_.GetAbilitiesInfo(abilities);
390885b47fbSopenharmony_ci    } else if (state == ABILITY_STATE_DISABLE) {
391885b47fbSopenharmony_ci        GetDisableAbilities(abilities);
392885b47fbSopenharmony_ci        HILOG_DEBUG("the size of disable abilities is %{public}zu", abilities.size());
393885b47fbSopenharmony_ci    } else {
394885b47fbSopenharmony_ci        abilities = installedAbilities_;
395885b47fbSopenharmony_ci    }
396885b47fbSopenharmony_ci}
397885b47fbSopenharmony_ci
398885b47fbSopenharmony_civoid AccessibilityAccountData::GetDisableAbilities(std::vector<AccessibilityAbilityInfo> &disabledAbilities)
399885b47fbSopenharmony_ci{
400885b47fbSopenharmony_ci    HILOG_DEBUG("get disable abilities");
401885b47fbSopenharmony_ci    disabledAbilities = installedAbilities_;
402885b47fbSopenharmony_ci    connectedA11yAbilities_.GetDisableAbilities(disabledAbilities);
403885b47fbSopenharmony_ci}
404885b47fbSopenharmony_ci
405885b47fbSopenharmony_civoid AccessibilityAccountData::UpdateAccountCapabilities()
406885b47fbSopenharmony_ci{
407885b47fbSopenharmony_ci    HILOG_DEBUG("start.");
408885b47fbSopenharmony_ci    UpdateFilteringKeyEventsCapability();
409885b47fbSopenharmony_ci    UpdateEventTouchGuideCapability();
410885b47fbSopenharmony_ci    UpdateGesturesSimulationCapability();
411885b47fbSopenharmony_ci    UpdateMagnificationCapability();
412885b47fbSopenharmony_ci    config_->SetTouchGuideState(isEventTouchGuideState_);
413885b47fbSopenharmony_ci    config_->SetGestureState(isGesturesSimulation_);
414885b47fbSopenharmony_ci    config_->SetKeyEventObserverState(isFilteringKeyEvents_);
415885b47fbSopenharmony_ci}
416885b47fbSopenharmony_ci
417885b47fbSopenharmony_civoid AccessibilityAccountData::UpdateEventTouchGuideCapability()
418885b47fbSopenharmony_ci{
419885b47fbSopenharmony_ci    if (connectedA11yAbilities_.IsExistCapability(Capability::CAPABILITY_TOUCH_GUIDE)) {
420885b47fbSopenharmony_ci        isEventTouchGuideState_ = true;
421885b47fbSopenharmony_ci        return;
422885b47fbSopenharmony_ci    }
423885b47fbSopenharmony_ci
424885b47fbSopenharmony_ci    isEventTouchGuideState_ = false;
425885b47fbSopenharmony_ci}
426885b47fbSopenharmony_ci
427885b47fbSopenharmony_civoid AccessibilityAccountData::UpdateGesturesSimulationCapability()
428885b47fbSopenharmony_ci{
429885b47fbSopenharmony_ci    if (connectedA11yAbilities_.IsExistCapability(Capability::CAPABILITY_GESTURE)) {
430885b47fbSopenharmony_ci        isGesturesSimulation_ = true;
431885b47fbSopenharmony_ci        return;
432885b47fbSopenharmony_ci    }
433885b47fbSopenharmony_ci
434885b47fbSopenharmony_ci    isGesturesSimulation_ = false;
435885b47fbSopenharmony_ci}
436885b47fbSopenharmony_ci
437885b47fbSopenharmony_civoid AccessibilityAccountData::UpdateFilteringKeyEventsCapability()
438885b47fbSopenharmony_ci{
439885b47fbSopenharmony_ci    if (connectedA11yAbilities_.IsExistCapability(Capability::CAPABILITY_KEY_EVENT_OBSERVER)) {
440885b47fbSopenharmony_ci        isFilteringKeyEvents_ = true;
441885b47fbSopenharmony_ci        return;
442885b47fbSopenharmony_ci    }
443885b47fbSopenharmony_ci
444885b47fbSopenharmony_ci    isFilteringKeyEvents_ = false;
445885b47fbSopenharmony_ci}
446885b47fbSopenharmony_ci
447885b47fbSopenharmony_civoid AccessibilityAccountData::UpdateMagnificationCapability()
448885b47fbSopenharmony_ci{
449885b47fbSopenharmony_ci    if (connectedA11yAbilities_.IsExistCapability(Capability::CAPABILITY_ZOOM)) {
450885b47fbSopenharmony_ci        isScreenMagnification_ = true;
451885b47fbSopenharmony_ci        return;
452885b47fbSopenharmony_ci    }
453885b47fbSopenharmony_ci
454885b47fbSopenharmony_ci    isScreenMagnification_ = false;
455885b47fbSopenharmony_ci}
456885b47fbSopenharmony_ci
457885b47fbSopenharmony_civoid AccessibilityAccountData::SetScreenReaderExtInAllAccounts(const bool state)
458885b47fbSopenharmony_ci{
459885b47fbSopenharmony_ci    RetError rtn = RET_OK;
460885b47fbSopenharmony_ci    std::vector<int32_t> accountIds = Singleton<AccessibleAbilityManagerService>::GetInstance().GetAllAccountIds();
461885b47fbSopenharmony_ci    for (auto accountId : accountIds) {
462885b47fbSopenharmony_ci        auto accountData = Singleton<AccessibleAbilityManagerService>::GetInstance().GetAccountData(accountId);
463885b47fbSopenharmony_ci        std::shared_ptr<AccessibilitySettingsConfig> config = accountData->GetConfig();
464885b47fbSopenharmony_ci        if (config == nullptr) {
465885b47fbSopenharmony_ci            HILOG_WARN("config is nullptr, accountId = %{public}d", accountId);
466885b47fbSopenharmony_ci            continue;
467885b47fbSopenharmony_ci        }
468885b47fbSopenharmony_ci        if (state) {
469885b47fbSopenharmony_ci            rtn = config->AddEnabledAccessibilityService(SCREEN_READER_BUNDLE_ABILITY_NAME);
470885b47fbSopenharmony_ci        } else {
471885b47fbSopenharmony_ci            rtn = config->RemoveEnabledAccessibilityService(SCREEN_READER_BUNDLE_ABILITY_NAME);
472885b47fbSopenharmony_ci        }
473885b47fbSopenharmony_ci        HILOG_INFO("set screenReader state = %{public}d, rtn = %{public}d, accountId = %{public}d", state, rtn,
474885b47fbSopenharmony_ci            accountId);
475885b47fbSopenharmony_ci    }
476885b47fbSopenharmony_ci}
477885b47fbSopenharmony_ci
478885b47fbSopenharmony_civoid AccessibilityAccountData::SetAbilityAutoStartState(const std::string &name, const bool state)
479885b47fbSopenharmony_ci{
480885b47fbSopenharmony_ci    RetError rtn = RET_OK;
481885b47fbSopenharmony_ci    if (name == SCREEN_READER_BUNDLE_ABILITY_NAME) {
482885b47fbSopenharmony_ci        SetScreenReaderState(screenReaderKey_, state ? "1" : "0");
483885b47fbSopenharmony_ci        SetScreenReaderExtInAllAccounts(state);
484885b47fbSopenharmony_ci        return;
485885b47fbSopenharmony_ci    }
486885b47fbSopenharmony_ci    if (!config_) {
487885b47fbSopenharmony_ci        HILOG_WARN("conig_ is nullptr.");
488885b47fbSopenharmony_ci        return;
489885b47fbSopenharmony_ci    }
490885b47fbSopenharmony_ci    if (state) {
491885b47fbSopenharmony_ci        rtn = config_->AddEnabledAccessibilityService(name);
492885b47fbSopenharmony_ci    } else {
493885b47fbSopenharmony_ci        rtn = config_->RemoveEnabledAccessibilityService(name);
494885b47fbSopenharmony_ci    }
495885b47fbSopenharmony_ci    if (rtn != RET_OK) {
496885b47fbSopenharmony_ci        HILOG_WARN("handle service %{public}s state = %{public}d failed, rtn = %{public}d", name.c_str(), state, rtn);
497885b47fbSopenharmony_ci    }
498885b47fbSopenharmony_ci}
499885b47fbSopenharmony_ci
500885b47fbSopenharmony_civoid AccessibilityAccountData::SetScreenReaderState(const std::string &name, const std::string &state)
501885b47fbSopenharmony_ci{
502885b47fbSopenharmony_ci    HILOG_DEBUG("set screen reader key [%{public}s], state = [%{public}s].", name.c_str(), state.c_str());
503885b47fbSopenharmony_ci    std::shared_ptr<AccessibilitySettingProvider> service =
504885b47fbSopenharmony_ci        AccessibilitySettingProvider::GetInstance(POWER_MANAGER_SERVICE_ID);
505885b47fbSopenharmony_ci    if (service == nullptr) {
506885b47fbSopenharmony_ci        HILOG_ERROR("service is nullptr");
507885b47fbSopenharmony_ci        return;
508885b47fbSopenharmony_ci    }
509885b47fbSopenharmony_ci    ErrCode ret = service->PutStringValue(name, state, true);
510885b47fbSopenharmony_ci    if (ret != ERR_OK) {
511885b47fbSopenharmony_ci        HILOG_ERROR("set failed, ret=%{public}d", ret);
512885b47fbSopenharmony_ci    }
513885b47fbSopenharmony_ci}
514885b47fbSopenharmony_ci
515885b47fbSopenharmony_cibool AccessibilityAccountData::GetDefaultUserScreenReaderState()
516885b47fbSopenharmony_ci{
517885b47fbSopenharmony_ci    HILOG_DEBUG();
518885b47fbSopenharmony_ci    std::vector<std::string> services = config_->GetEnabledAccessibilityServices();
519885b47fbSopenharmony_ci    auto iter = std::find(services.begin(), services.end(), SCREEN_READER_BUNDLE_ABILITY_NAME);
520885b47fbSopenharmony_ci    return iter != services.end();
521885b47fbSopenharmony_ci}
522885b47fbSopenharmony_ci
523885b47fbSopenharmony_civoid AccessibilityAccountData::DelAutoStartPrefKeyInRemovePkg(const std::string &bundleName)
524885b47fbSopenharmony_ci{
525885b47fbSopenharmony_ci    HILOG_ERROR("start and bundleName[%{public}s].", bundleName.c_str());
526885b47fbSopenharmony_ci    if (installedAbilities_.empty()) {
527885b47fbSopenharmony_ci        HILOG_DEBUG("There is no installed abilities.");
528885b47fbSopenharmony_ci        return;
529885b47fbSopenharmony_ci    }
530885b47fbSopenharmony_ci    for (auto &installAbility : installedAbilities_) {
531885b47fbSopenharmony_ci        if (installAbility.GetPackageName() == bundleName) {
532885b47fbSopenharmony_ci            std::string abilityName = installAbility.GetName();
533885b47fbSopenharmony_ci            std::string uri = Utils::GetUri(bundleName, abilityName);
534885b47fbSopenharmony_ci            SetAbilityAutoStartState(uri, false);
535885b47fbSopenharmony_ci            break;
536885b47fbSopenharmony_ci        }
537885b47fbSopenharmony_ci    }
538885b47fbSopenharmony_ci}
539885b47fbSopenharmony_ci
540885b47fbSopenharmony_cibool AccessibilityAccountData::GetAbilityAutoStartState(const std::string &name)
541885b47fbSopenharmony_ci{
542885b47fbSopenharmony_ci    if (name == SCREEN_READER_BUNDLE_ABILITY_NAME && GetAccountType() == AccountSA::OsAccountType::PRIVATE) {
543885b47fbSopenharmony_ci        return GetDefaultUserScreenReaderState();
544885b47fbSopenharmony_ci    }
545885b47fbSopenharmony_ci    if (!config_) {
546885b47fbSopenharmony_ci        HILOG_WARN("config_ is nullptr.");
547885b47fbSopenharmony_ci        return false;
548885b47fbSopenharmony_ci    }
549885b47fbSopenharmony_ci    std::vector<std::string> serviceList = config_->GetEnabledAccessibilityServices();
550885b47fbSopenharmony_ci    auto iter = std::find(serviceList.begin(), serviceList.end(), name);
551885b47fbSopenharmony_ci    if (iter != serviceList.end()) {
552885b47fbSopenharmony_ci        return true;
553885b47fbSopenharmony_ci    } else {
554885b47fbSopenharmony_ci        return false;
555885b47fbSopenharmony_ci    }
556885b47fbSopenharmony_ci}
557885b47fbSopenharmony_ci
558885b47fbSopenharmony_civoid AccessibilityAccountData::GetConfigValueAtoHos(ConfigValueAtoHosUpdate &value)
559885b47fbSopenharmony_ci{
560885b47fbSopenharmony_ci    HILOG_DEBUG();
561885b47fbSopenharmony_ci    if (config_ == nullptr) {
562885b47fbSopenharmony_ci        HILOG_ERROR("config_ is nullptr");
563885b47fbSopenharmony_ci        return;
564885b47fbSopenharmony_ci    }
565885b47fbSopenharmony_ci
566885b47fbSopenharmony_ci    if (config_->GetDbHandle() == nullptr) {
567885b47fbSopenharmony_ci        HILOG_INFO("helper is null, retry.");
568885b47fbSopenharmony_ci        std::this_thread::sleep_for(std::chrono::milliseconds(INIT_DATASHARE_HELPER_SLEEP_TIME));
569885b47fbSopenharmony_ci        if (config_->GetDbHandle() == nullptr) {
570885b47fbSopenharmony_ci            HILOG_ERROR("helper is null");
571885b47fbSopenharmony_ci            return;
572885b47fbSopenharmony_ci        }
573885b47fbSopenharmony_ci    }
574885b47fbSopenharmony_ci
575885b47fbSopenharmony_ci    value.highContrastText = config_->GetDbHandle()->GetBoolValue(HIGH_TEXT_CONTRAST_ENABLED, false);
576885b47fbSopenharmony_ci    value.invertColor = config_->GetDbHandle()->GetBoolValue(ACCESSIBILITY_DISPLAY_INVERSION_ENABLED, false);
577885b47fbSopenharmony_ci    value.daltonizationState = config_->GetDbHandle()->GetBoolValue(ACCESSIBILITY_DISPLAY_DALTONIZER_ENABLED, false);
578885b47fbSopenharmony_ci    value.displayDaltonizer = config_->GetDbHandle()->GetIntValue(ACCESSIBILITY_DISPLAY_DALTONIZER, 0);
579885b47fbSopenharmony_ci    value.shortcutEnabled = config_->GetDbHandle()->GetBoolValue(ACCESSIBILITY_SHORTCUT_ENABLED, false);
580885b47fbSopenharmony_ci    value.shortcutEnabledOnLockScreen = config_->GetDbHandle()->GetIntValue(
581885b47fbSopenharmony_ci        ACCESSIBILITY_SHORTCUT_ENABLED_ON_LOCK_SCREEN, INVALID_SHORTCUT_ON_LOCK_SCREEN_STATE);
582885b47fbSopenharmony_ci    value.shortcutOnLockScreen = config_->GetDbHandle()->GetIntValue(
583885b47fbSopenharmony_ci        ACCESSIBILITY_SHORTCUT_ON_LOCK_SCREEN, INVALID_SHORTCUT_ON_LOCK_SCREEN_STATE);
584885b47fbSopenharmony_ci    config_->GetDbHandle()->PutIntValue(ACCESSIBILITY_SHORTCUT_ON_LOCK_SCREEN, INVALID_SHORTCUT_ON_LOCK_SCREEN_STATE);
585885b47fbSopenharmony_ci    value.shortcutTimeout = config_->GetDbHandle()->GetIntValue(ACCESSIBILITY_SHORTCUT_TIMEOUT,
586885b47fbSopenharmony_ci        SHORT_KEY_TIMEOUT_BEFORE_USE);
587885b47fbSopenharmony_ci    value.clickResponseTime = config_->GetDbHandle()->GetIntValue(CLICK_RESPONSE_TIME, 0);
588885b47fbSopenharmony_ci    value.ignoreRepeatClickState = config_->GetDbHandle()->GetBoolValue(IGNORE_REPEAT_CLICK_SWITCH, false);
589885b47fbSopenharmony_ci    value.ignoreRepeatClickTime = config_->GetDbHandle()->GetIntValue(IGNORE_REPEAT_CLICK_TIME, 0);
590885b47fbSopenharmony_ci    value.screenMagnificationState = config_->GetDbHandle()->GetBoolValue(SCREEN_MAGNIFICATION_KEY, false);
591885b47fbSopenharmony_ci
592885b47fbSopenharmony_ci    // In Aos, the audio configuration is stored in SYSTEM and it should be copied to SECURE
593885b47fbSopenharmony_ci    config_->CloneAudioState();
594885b47fbSopenharmony_ci    value.audioMono = config_->GetDbHandle()->GetBoolValue(MASTER_MONO, false);
595885b47fbSopenharmony_ci    value.audioBalance = config_->GetDbHandle()->GetFloatValue(MASTER_BALENCE, 0);
596885b47fbSopenharmony_ci
597885b47fbSopenharmony_ci    std::shared_ptr<AccessibilitySettingProvider> service =
598885b47fbSopenharmony_ci        AccessibilitySettingProvider::GetInstance(POWER_MANAGER_SERVICE_ID);
599885b47fbSopenharmony_ci    if (service == nullptr) {
600885b47fbSopenharmony_ci        HILOG_ERROR("service is nullptr");
601885b47fbSopenharmony_ci        return;
602885b47fbSopenharmony_ci    }
603885b47fbSopenharmony_ci    service->GetBoolValue(ACCESSIBILITY_SCREENREADER_ENABLED, value.isScreenReaderEnabled);
604885b47fbSopenharmony_ci    service->DeleteInstance();
605885b47fbSopenharmony_ci}
606885b47fbSopenharmony_ci
607885b47fbSopenharmony_ciRetError AccessibilityAccountData::EnableAbility(const std::string &name, const uint32_t capabilities)
608885b47fbSopenharmony_ci{
609885b47fbSopenharmony_ci    HILOG_DEBUG("start and name[%{public}s] capabilities[%{public}d]", name.c_str(), capabilities);
610885b47fbSopenharmony_ci
611885b47fbSopenharmony_ci    bool isInstalled = false;
612885b47fbSopenharmony_ci    for (auto itr = installedAbilities_.begin(); itr != installedAbilities_.end(); itr++) {
613885b47fbSopenharmony_ci        if (itr->GetId() == name) {
614885b47fbSopenharmony_ci            isInstalled = true;
615885b47fbSopenharmony_ci
616885b47fbSopenharmony_ci            // Judge capabilities
617885b47fbSopenharmony_ci            uint32_t resultCapabilities = itr->GetStaticCapabilityValues() & capabilities;
618885b47fbSopenharmony_ci            HILOG_DEBUG("resultCapabilities is [%{public}d]", resultCapabilities);
619885b47fbSopenharmony_ci            if (resultCapabilities == 0) {
620885b47fbSopenharmony_ci                HILOG_ERROR("the result of capabilities is wrong");
621885b47fbSopenharmony_ci                return RET_ERR_NO_CAPABILITY;
622885b47fbSopenharmony_ci            }
623885b47fbSopenharmony_ci
624885b47fbSopenharmony_ci            itr->SetCapabilityValues(resultCapabilities);
625885b47fbSopenharmony_ci            break;
626885b47fbSopenharmony_ci        }
627885b47fbSopenharmony_ci    }
628885b47fbSopenharmony_ci    if (!isInstalled) {
629885b47fbSopenharmony_ci        HILOG_ERROR("the ability[%{public}s] is not installed", name.c_str());
630885b47fbSopenharmony_ci        return RET_ERR_NOT_INSTALLED;
631885b47fbSopenharmony_ci    }
632885b47fbSopenharmony_ci
633885b47fbSopenharmony_ci    // Add enabled ability
634885b47fbSopenharmony_ci    if (std::any_of(enabledAbilities_.begin(), enabledAbilities_.end(),
635885b47fbSopenharmony_ci        [name](const std::string &abilityName) {
636885b47fbSopenharmony_ci            return abilityName == name;
637885b47fbSopenharmony_ci        })) {
638885b47fbSopenharmony_ci        HILOG_ERROR("The ability[%{public}s] is already enabled", name.c_str());
639885b47fbSopenharmony_ci        return RET_ERR_CONNECTION_EXIST;
640885b47fbSopenharmony_ci    }
641885b47fbSopenharmony_ci#ifdef OHOS_BUILD_ENABLE_HITRACE
642885b47fbSopenharmony_ci    HITRACE_METER_NAME(HITRACE_TAG_ACCESSIBILITY_MANAGER, "EnableAbility:" + name);
643885b47fbSopenharmony_ci#endif // OHOS_BUILD_ENABLE_HITRACE
644885b47fbSopenharmony_ci
645885b47fbSopenharmony_ci    enabledAbilities_.push_back(name);
646885b47fbSopenharmony_ci    SetAbilityAutoStartState(name, true);
647885b47fbSopenharmony_ci    if (name == screenReaderAbilityName_) {
648885b47fbSopenharmony_ci        SetScreenReaderState(screenReaderKey_, "1");
649885b47fbSopenharmony_ci    }
650885b47fbSopenharmony_ci    UpdateAbilities();
651885b47fbSopenharmony_ci    Utils::RecordStartingA11yEvent(name);
652885b47fbSopenharmony_ci    return RET_OK;
653885b47fbSopenharmony_ci}
654885b47fbSopenharmony_ci
655885b47fbSopenharmony_cibool AccessibilityAccountData::GetInstalledAbilitiesFromBMS()
656885b47fbSopenharmony_ci{
657885b47fbSopenharmony_ci    HILOG_DEBUG("start.");
658885b47fbSopenharmony_ci#ifdef OHOS_BUILD_ENABLE_HITRACE
659885b47fbSopenharmony_ci    HITRACE_METER_NAME(HITRACE_TAG_ACCESSIBILITY_MANAGER, "QueryInstalledAbilityInfo");
660885b47fbSopenharmony_ci#endif // OHOS_BUILD_ENABLE_HITRACE
661885b47fbSopenharmony_ci    std::vector<AppExecFwk::ExtensionAbilityInfo> extensionInfos;
662885b47fbSopenharmony_ci    sptr<AppExecFwk::IBundleMgr> bms = Singleton<AccessibleAbilityManagerService>::GetInstance().GetBundleMgrProxy();
663885b47fbSopenharmony_ci    if (!bms) {
664885b47fbSopenharmony_ci        Utils::RecordUnavailableEvent(A11yUnavailableEvent::QUERY_EVENT, A11yError::ERROR_QUERY_PACKAGE_INFO_FAILED);
665885b47fbSopenharmony_ci        HILOG_ERROR("GetBundleMgrProxy failed.");
666885b47fbSopenharmony_ci        return false;
667885b47fbSopenharmony_ci    }
668885b47fbSopenharmony_ci    bool ret = bms->QueryExtensionAbilityInfos(AppExecFwk::ExtensionAbilityType::ACCESSIBILITY, id_, extensionInfos);
669885b47fbSopenharmony_ci    if (!ret) {
670885b47fbSopenharmony_ci        Utils::RecordUnavailableEvent(A11yUnavailableEvent::QUERY_EVENT, A11yError::ERROR_QUERY_PACKAGE_INFO_FAILED);
671885b47fbSopenharmony_ci        HILOG_ERROR("Query extension ability information failed.");
672885b47fbSopenharmony_ci    }
673885b47fbSopenharmony_ci    HILOG_DEBUG("query extensionAbilityInfos' size is %{public}zu.", extensionInfos.size());
674885b47fbSopenharmony_ci    for (auto& info : extensionInfos) {
675885b47fbSopenharmony_ci        AccessibilityAbilityInitParams initParams;
676885b47fbSopenharmony_ci        Utils::Parse(info, initParams);
677885b47fbSopenharmony_ci        std::shared_ptr<AccessibilityAbilityInfo> accessibilityInfo =
678885b47fbSopenharmony_ci            std::make_shared<AccessibilityAbilityInfo>(initParams);
679885b47fbSopenharmony_ci        AddInstalledAbility(*accessibilityInfo);
680885b47fbSopenharmony_ci    }
681885b47fbSopenharmony_ci    return true;
682885b47fbSopenharmony_ci}
683885b47fbSopenharmony_ci
684885b47fbSopenharmony_civoid AccessibilityAccountData::Init()
685885b47fbSopenharmony_ci{
686885b47fbSopenharmony_ci    HILOG_DEBUG("Init start.");
687885b47fbSopenharmony_ci    if (!config_) {
688885b47fbSopenharmony_ci        config_ = std::make_shared<AccessibilitySettingsConfig>(id_);
689885b47fbSopenharmony_ci        config_->Init();
690885b47fbSopenharmony_ci    }
691885b47fbSopenharmony_ci    ErrCode rtn = AccountSA::OsAccountManager::GetOsAccountType(id_, accountType_);
692885b47fbSopenharmony_ci    if (rtn != ERR_OK) {
693885b47fbSopenharmony_ci        HILOG_ERROR("get account type failed for accountId [%{public}d]", id_);
694885b47fbSopenharmony_ci    }
695885b47fbSopenharmony_ci    std::shared_ptr<AccessibilitySettingProvider> service =
696885b47fbSopenharmony_ci        AccessibilitySettingProvider::GetInstance(POWER_MANAGER_SERVICE_ID);
697885b47fbSopenharmony_ci    if (service == nullptr) {
698885b47fbSopenharmony_ci        HILOG_ERROR("service is nullptr");
699885b47fbSopenharmony_ci        return;
700885b47fbSopenharmony_ci    }
701885b47fbSopenharmony_ci    bool cloneState = false;
702885b47fbSopenharmony_ci    service->GetBoolValue(ACCESSIBILITY_CLONE_FLAG, cloneState);
703885b47fbSopenharmony_ci    if (cloneState == true) {
704885b47fbSopenharmony_ci        service->PutBoolValue(ACCESSIBILITY_CLONE_FLAG, false);
705885b47fbSopenharmony_ci    }
706885b47fbSopenharmony_ci    if (id_ != DEFAULT_ACCOUNT_ID) {
707885b47fbSopenharmony_ci        HILOG_WARN("id != default_account_id.");
708885b47fbSopenharmony_ci        return;
709885b47fbSopenharmony_ci    }
710885b47fbSopenharmony_ci
711885b47fbSopenharmony_ci    HILOG_INFO("register clone observer.");
712885b47fbSopenharmony_ci    AccessibilitySettingObserver::UpdateFunc func = [ = ](const std::string& state) {
713885b47fbSopenharmony_ci        Singleton<AccessibleAbilityManagerService>::GetInstance().OnDataClone();
714885b47fbSopenharmony_ci    };
715885b47fbSopenharmony_ci    RetError ret = service->RegisterObserver(ACCESSIBILITY_CLONE_FLAG, func);
716885b47fbSopenharmony_ci    if (ret != RET_OK) {
717885b47fbSopenharmony_ci        HILOG_WARN("register clone observer failed %{public}d.", ret);
718885b47fbSopenharmony_ci    }
719885b47fbSopenharmony_ci}
720885b47fbSopenharmony_ci
721885b47fbSopenharmony_civoid AccessibilityAccountData::AddConfigCallback(
722885b47fbSopenharmony_ci    const sptr<IAccessibleAbilityManagerConfigObserver>& callback)
723885b47fbSopenharmony_ci{
724885b47fbSopenharmony_ci    HILOG_DEBUG("AddConfigCallback start.");
725885b47fbSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(configCallbacksMutex_);
726885b47fbSopenharmony_ci    configCallbacks_.push_back(callback);
727885b47fbSopenharmony_ci}
728885b47fbSopenharmony_ci
729885b47fbSopenharmony_ciconst std::vector<sptr<IAccessibleAbilityManagerConfigObserver>> AccessibilityAccountData::GetConfigCallbacks()
730885b47fbSopenharmony_ci{
731885b47fbSopenharmony_ci    HILOG_DEBUG("GetConfigCallbacks start.");
732885b47fbSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(configCallbacksMutex_);
733885b47fbSopenharmony_ci    std::vector<sptr<IAccessibleAbilityManagerConfigObserver>> rtnVec = configCallbacks_;
734885b47fbSopenharmony_ci    return rtnVec;
735885b47fbSopenharmony_ci}
736885b47fbSopenharmony_ci
737885b47fbSopenharmony_civoid AccessibilityAccountData::SetConfigCallbacks(std::vector<sptr<IAccessibleAbilityManagerConfigObserver>>& observer)
738885b47fbSopenharmony_ci{
739885b47fbSopenharmony_ci    HILOG_DEBUG("SetConfigCallbacks start.");
740885b47fbSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(configCallbacksMutex_);
741885b47fbSopenharmony_ci    configCallbacks_ = observer;
742885b47fbSopenharmony_ci}
743885b47fbSopenharmony_ci
744885b47fbSopenharmony_civoid AccessibilityAccountData::RemoveConfigCallback(const wptr<IRemoteObject>& callback)
745885b47fbSopenharmony_ci{
746885b47fbSopenharmony_ci    HILOG_DEBUG("RemoveConfigCallback start.");
747885b47fbSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(configCallbacksMutex_);
748885b47fbSopenharmony_ci    for (auto itr = configCallbacks_.begin(); itr != configCallbacks_.end(); itr++) {
749885b47fbSopenharmony_ci        if ((*itr)->AsObject() == callback) {
750885b47fbSopenharmony_ci            configCallbacks_.erase(itr);
751885b47fbSopenharmony_ci            break;
752885b47fbSopenharmony_ci        }
753885b47fbSopenharmony_ci    }
754885b47fbSopenharmony_ci}
755885b47fbSopenharmony_ci
756885b47fbSopenharmony_cistd::shared_ptr<AccessibilitySettingsConfig> AccessibilityAccountData::GetConfig()
757885b47fbSopenharmony_ci{
758885b47fbSopenharmony_ci    HILOG_DEBUG("GetConfig start.");
759885b47fbSopenharmony_ci    return config_;
760885b47fbSopenharmony_ci}
761885b47fbSopenharmony_ci
762885b47fbSopenharmony_civoid AccessibilityAccountData::GetImportantEnabledAbilities(
763885b47fbSopenharmony_ci    std::map<std::string, uint32_t> &importantEnabledAbilities) const
764885b47fbSopenharmony_ci{
765885b47fbSopenharmony_ci    HILOG_DEBUG("GetImportantEnabledAbilities start.");
766885b47fbSopenharmony_ci    if (installedAbilities_.empty()) {
767885b47fbSopenharmony_ci        HILOG_DEBUG("Current user has no installed Abilities.");
768885b47fbSopenharmony_ci        return;
769885b47fbSopenharmony_ci    }
770885b47fbSopenharmony_ci    if (enabledAbilities_.empty()) {
771885b47fbSopenharmony_ci        HILOG_DEBUG("Current user has no enabled abilities.");
772885b47fbSopenharmony_ci        return;
773885b47fbSopenharmony_ci    }
774885b47fbSopenharmony_ci    HILOG_DEBUG("installedAbilities_'s is %{public}zu.", installedAbilities_.size());
775885b47fbSopenharmony_ci    for (auto &installAbility : installedAbilities_) {
776885b47fbSopenharmony_ci        if (!installAbility.IsImportant()) {
777885b47fbSopenharmony_ci            HILOG_DEBUG("The ability is not important.");
778885b47fbSopenharmony_ci            continue;
779885b47fbSopenharmony_ci        }
780885b47fbSopenharmony_ci        std::string bundleName = installAbility.GetPackageName();
781885b47fbSopenharmony_ci        std::string abilityName = installAbility.GetName();
782885b47fbSopenharmony_ci        HILOG_DEBUG("installAbility's packageName is %{public}s and abilityName is %{public}s",
783885b47fbSopenharmony_ci            bundleName.c_str(), abilityName.c_str());
784885b47fbSopenharmony_ci        std::string uri = Utils::GetUri(bundleName, abilityName);
785885b47fbSopenharmony_ci        std::vector<std::string>::const_iterator iter = std::find(enabledAbilities_.begin(),
786885b47fbSopenharmony_ci            enabledAbilities_.end(), uri);
787885b47fbSopenharmony_ci        if (iter != enabledAbilities_.end()) {
788885b47fbSopenharmony_ci            uint32_t capabilityValues = installAbility.GetCapabilityValues();
789885b47fbSopenharmony_ci            importantEnabledAbilities.emplace(std::make_pair(uri, capabilityValues));
790885b47fbSopenharmony_ci        }
791885b47fbSopenharmony_ci    }
792885b47fbSopenharmony_ci}
793885b47fbSopenharmony_ci
794885b47fbSopenharmony_civoid AccessibilityAccountData::UpdateImportantEnabledAbilities(
795885b47fbSopenharmony_ci    std::map<std::string, uint32_t> &importantEnabledAbilities)
796885b47fbSopenharmony_ci{
797885b47fbSopenharmony_ci    HILOG_DEBUG();
798885b47fbSopenharmony_ci    if (importantEnabledAbilities.empty()) {
799885b47fbSopenharmony_ci        HILOG_DEBUG("There is no enabled abilities.");
800885b47fbSopenharmony_ci        return;
801885b47fbSopenharmony_ci    }
802885b47fbSopenharmony_ci    if (installedAbilities_.empty()) {
803885b47fbSopenharmony_ci        HILOG_DEBUG("Current user has no installedAbilities.");
804885b47fbSopenharmony_ci        return;
805885b47fbSopenharmony_ci    }
806885b47fbSopenharmony_ci    HILOG_DEBUG("installedAbilities is %{public}zu.", installedAbilities_.size());
807885b47fbSopenharmony_ci    for (auto &installAbility : installedAbilities_) {
808885b47fbSopenharmony_ci        std::string bundleName = installAbility.GetPackageName();
809885b47fbSopenharmony_ci        std::string abilityName = installAbility.GetName();
810885b47fbSopenharmony_ci        HILOG_DEBUG("installAbility's packageName is %{public}s and abilityName is %{public}s",
811885b47fbSopenharmony_ci            bundleName.c_str(), abilityName.c_str());
812885b47fbSopenharmony_ci        std::string uri = Utils::GetUri(bundleName, abilityName);
813885b47fbSopenharmony_ci        std::map<std::string, uint32_t>::iterator iter = importantEnabledAbilities.find(uri);
814885b47fbSopenharmony_ci        if (iter != importantEnabledAbilities.end()) {
815885b47fbSopenharmony_ci            AddEnabledAbility(uri);
816885b47fbSopenharmony_ci            installAbility.SetCapabilityValues(iter->second);
817885b47fbSopenharmony_ci        }
818885b47fbSopenharmony_ci    }
819885b47fbSopenharmony_ci}
820885b47fbSopenharmony_ci
821885b47fbSopenharmony_civoid AccessibilityAccountData::UpdateAutoStartEnabledAbilities()
822885b47fbSopenharmony_ci{
823885b47fbSopenharmony_ci    HILOG_DEBUG();
824885b47fbSopenharmony_ci    if (id_ == -1) {
825885b47fbSopenharmony_ci        HILOG_DEBUG("Current user is -1.");
826885b47fbSopenharmony_ci        return;
827885b47fbSopenharmony_ci    }
828885b47fbSopenharmony_ci    if (installedAbilities_.empty()) {
829885b47fbSopenharmony_ci        HILOG_DEBUG("Current user has no installedAbilities.");
830885b47fbSopenharmony_ci        return;
831885b47fbSopenharmony_ci    }
832885b47fbSopenharmony_ci    if (!config_) {
833885b47fbSopenharmony_ci        HILOG_DEBUG("config_ is null.");
834885b47fbSopenharmony_ci        return;
835885b47fbSopenharmony_ci    }
836885b47fbSopenharmony_ci    HILOG_DEBUG("installedAbilities is %{public}zu.", installedAbilities_.size());
837885b47fbSopenharmony_ci    for (auto &installAbility : installedAbilities_) {
838885b47fbSopenharmony_ci        std::string bundleName = installAbility.GetPackageName();
839885b47fbSopenharmony_ci        std::string abilityName = installAbility.GetName();
840885b47fbSopenharmony_ci        std::string abilityId = bundleName + "/" + abilityName;
841885b47fbSopenharmony_ci        if (GetAbilityAutoStartState(abilityId)) {
842885b47fbSopenharmony_ci            HILOG_INFO("auto start packageName is %{public}s.", bundleName.c_str());
843885b47fbSopenharmony_ci            uint32_t capabilities = CAPABILITY_GESTURE | CAPABILITY_KEY_EVENT_OBSERVER | CAPABILITY_RETRIEVE |
844885b47fbSopenharmony_ci                CAPABILITY_TOUCH_GUIDE | CAPABILITY_ZOOM;
845885b47fbSopenharmony_ci            uint32_t resultCapabilities = installAbility.GetStaticCapabilityValues() & capabilities;
846885b47fbSopenharmony_ci            installAbility.SetCapabilityValues(resultCapabilities);
847885b47fbSopenharmony_ci            std::string uri = Utils::GetUri(bundleName, abilityName);
848885b47fbSopenharmony_ci            AddEnabledAbility(uri);
849885b47fbSopenharmony_ci        }
850885b47fbSopenharmony_ci    }
851885b47fbSopenharmony_ci}
852885b47fbSopenharmony_ci
853885b47fbSopenharmony_ciuint32_t AccessibilityAccountData::GetInputFilterFlag() const
854885b47fbSopenharmony_ci{
855885b47fbSopenharmony_ci    HILOG_DEBUG();
856885b47fbSopenharmony_ci    if (!config_) {
857885b47fbSopenharmony_ci        HILOG_ERROR("config is null");
858885b47fbSopenharmony_ci        return 0;
859885b47fbSopenharmony_ci    }
860885b47fbSopenharmony_ci    uint32_t flag = 0;
861885b47fbSopenharmony_ci    if (config_->GetScreenMagnificationState()) {
862885b47fbSopenharmony_ci        flag |= AccessibilityInputInterceptor::FEATURE_SCREEN_MAGNIFICATION;
863885b47fbSopenharmony_ci    }
864885b47fbSopenharmony_ci    if (isEventTouchGuideState_) {
865885b47fbSopenharmony_ci        flag |= AccessibilityInputInterceptor::FEATURE_TOUCH_EXPLORATION;
866885b47fbSopenharmony_ci    }
867885b47fbSopenharmony_ci    if (isFilteringKeyEvents_) {
868885b47fbSopenharmony_ci        flag |= AccessibilityInputInterceptor::FEATURE_FILTER_KEY_EVENTS;
869885b47fbSopenharmony_ci    }
870885b47fbSopenharmony_ci    if (isGesturesSimulation_) {
871885b47fbSopenharmony_ci        flag |= AccessibilityInputInterceptor::FEATURE_INJECT_TOUCH_EVENTS;
872885b47fbSopenharmony_ci    }
873885b47fbSopenharmony_ci    if (config_->GetMouseKeyState()) {
874885b47fbSopenharmony_ci        flag |= AccessibilityInputInterceptor::FEATURE_MOUSE_KEY;
875885b47fbSopenharmony_ci    }
876885b47fbSopenharmony_ci
877885b47fbSopenharmony_ci    int32_t autoclickTime = config_->GetMouseAutoClick();
878885b47fbSopenharmony_ci    if (autoclickTime >= AUTOCLICK_DELAY_TIME_MIN && autoclickTime <= AUTOCLICK_DELAY_TIME_MAX) {
879885b47fbSopenharmony_ci        flag |= AccessibilityInputInterceptor::FEATURE_MOUSE_AUTOCLICK;
880885b47fbSopenharmony_ci    }
881885b47fbSopenharmony_ci
882885b47fbSopenharmony_ci    uint32_t clickResponseTime = config_->GetClickResponseTime();
883885b47fbSopenharmony_ci    bool ignoreRepeatClickState = config_->GetIgnoreRepeatClickState();
884885b47fbSopenharmony_ci    if (clickResponseTime > 0 || ignoreRepeatClickState == true) {
885885b47fbSopenharmony_ci        flag |= AccessibilityInputInterceptor::FEATURE_SCREEN_TOUCH;
886885b47fbSopenharmony_ci    }
887885b47fbSopenharmony_ci
888885b47fbSopenharmony_ci    return flag;
889885b47fbSopenharmony_ci}
890885b47fbSopenharmony_ci
891885b47fbSopenharmony_civoid AccessibilityAccountData::UpdateAbilities()
892885b47fbSopenharmony_ci{
893885b47fbSopenharmony_ci    HILOG_DEBUG("installedAbilities is %{public}zu.", installedAbilities_.size());
894885b47fbSopenharmony_ci    for (auto &installAbility : installedAbilities_) {
895885b47fbSopenharmony_ci        std::string bundleName = installAbility.GetPackageName();
896885b47fbSopenharmony_ci        std::string abilityName = installAbility.GetName();
897885b47fbSopenharmony_ci        HILOG_DEBUG("installAbility's packageName is %{public}s and abilityName is %{public}s",
898885b47fbSopenharmony_ci            bundleName.c_str(), abilityName.c_str());
899885b47fbSopenharmony_ci
900885b47fbSopenharmony_ci        if (connectingA11yAbilities_.GetSizeByUri(Utils::GetUri(bundleName, abilityName))) {
901885b47fbSopenharmony_ci            HILOG_DEBUG("The ability(bundleName[%{public}s] abilityName[%{public}s]) is connecting.",
902885b47fbSopenharmony_ci                bundleName.c_str(), abilityName.c_str());
903885b47fbSopenharmony_ci            continue;
904885b47fbSopenharmony_ci        }
905885b47fbSopenharmony_ci        sptr<AccessibleAbilityConnection> connection =
906885b47fbSopenharmony_ci            GetAccessibleAbilityConnection(Utils::GetUri(bundleName, abilityName));
907885b47fbSopenharmony_ci
908885b47fbSopenharmony_ci        auto iter = std::find(enabledAbilities_.begin(), enabledAbilities_.end(),
909885b47fbSopenharmony_ci            Utils::GetUri(bundleName, abilityName));
910885b47fbSopenharmony_ci        if (iter != enabledAbilities_.end()) {
911885b47fbSopenharmony_ci            if (connection) {
912885b47fbSopenharmony_ci                continue;
913885b47fbSopenharmony_ci            }
914885b47fbSopenharmony_ci            AppExecFwk::ElementName element("", bundleName, abilityName);
915885b47fbSopenharmony_ci            connection = new(std::nothrow) AccessibleAbilityConnection(id_, connectCounter_++, installAbility);
916885b47fbSopenharmony_ci            if (connection != nullptr && connection->Connect(element)) {
917885b47fbSopenharmony_ci                AddConnectingA11yAbility(Utils::GetUri(bundleName, abilityName), connection);
918885b47fbSopenharmony_ci            }
919885b47fbSopenharmony_ci        } else {
920885b47fbSopenharmony_ci            HILOG_DEBUG("not in enabledAbilites list .");
921885b47fbSopenharmony_ci            if (connection) {
922885b47fbSopenharmony_ci                RemoveConnectedAbility(connection->GetElementName());
923885b47fbSopenharmony_ci                connection->Disconnect();
924885b47fbSopenharmony_ci            }
925885b47fbSopenharmony_ci        }
926885b47fbSopenharmony_ci    }
927885b47fbSopenharmony_ci}
928885b47fbSopenharmony_ci
929885b47fbSopenharmony_cibool AccessibilityAccountData::RemoveAbility(const std::string &bundleName)
930885b47fbSopenharmony_ci{
931885b47fbSopenharmony_ci    HILOG_DEBUG("bundleName(%{public}s)", bundleName.c_str());
932885b47fbSopenharmony_ci    if (installedAbilities_.empty()) {
933885b47fbSopenharmony_ci        HILOG_DEBUG("There is no installed abilities.");
934885b47fbSopenharmony_ci        return false;
935885b47fbSopenharmony_ci    }
936885b47fbSopenharmony_ci    RemoveInstalledAbility(bundleName);
937885b47fbSopenharmony_ci
938885b47fbSopenharmony_ci    bool result = false;
939885b47fbSopenharmony_ci    // Remove enabled ability, remove connecting ability if it is connecting.
940885b47fbSopenharmony_ci    for (auto& enableAbility : enabledAbilities_) {
941885b47fbSopenharmony_ci        if (enableAbility.substr(0, enableAbility.find("/")) == bundleName) {
942885b47fbSopenharmony_ci            RemoveEnabledAbility(enableAbility);
943885b47fbSopenharmony_ci            RemoveConnectingA11yAbility(enableAbility);
944885b47fbSopenharmony_ci            result = true;
945885b47fbSopenharmony_ci        }
946885b47fbSopenharmony_ci    }
947885b47fbSopenharmony_ci
948885b47fbSopenharmony_ci    // Remove connected ability
949885b47fbSopenharmony_ci    connectedA11yAbilities_.RemoveAccessibilityAbilityByName(bundleName, result);
950885b47fbSopenharmony_ci    if (result) {
951885b47fbSopenharmony_ci        UpdateAbilities();
952885b47fbSopenharmony_ci    }
953885b47fbSopenharmony_ci
954885b47fbSopenharmony_ci    return result;
955885b47fbSopenharmony_ci}
956885b47fbSopenharmony_ci
957885b47fbSopenharmony_civoid AccessibilityAccountData::AddAbility(const std::string &bundleName)
958885b47fbSopenharmony_ci{
959885b47fbSopenharmony_ci    HILOG_DEBUG("bundleName(%{public}s)", bundleName.c_str());
960885b47fbSopenharmony_ci
961885b47fbSopenharmony_ci    std::vector<AppExecFwk::ExtensionAbilityInfo> extensionInfos;
962885b47fbSopenharmony_ci    sptr<AppExecFwk::IBundleMgr> bms = Singleton<AccessibleAbilityManagerService>::GetInstance().GetBundleMgrProxy();
963885b47fbSopenharmony_ci    if (!bms) {
964885b47fbSopenharmony_ci        HILOG_ERROR("bms is nullptr.");
965885b47fbSopenharmony_ci        return;
966885b47fbSopenharmony_ci    }
967885b47fbSopenharmony_ci    bms->QueryExtensionAbilityInfos(AppExecFwk::ExtensionAbilityType::ACCESSIBILITY, id_, extensionInfos);
968885b47fbSopenharmony_ci    HILOG_DEBUG("query extensionAbilityInfos' size is %{public}zu.", extensionInfos.size());
969885b47fbSopenharmony_ci    bool hasNewExtensionAbility = false;
970885b47fbSopenharmony_ci    for (auto &newAbility : extensionInfos) {
971885b47fbSopenharmony_ci        if (newAbility.bundleName == bundleName) {
972885b47fbSopenharmony_ci            HILOG_DEBUG("The package%{public}s added", (bundleName + "/" + newAbility.name).c_str());
973885b47fbSopenharmony_ci            AccessibilityAbilityInitParams initParams;
974885b47fbSopenharmony_ci            Utils::Parse(newAbility, initParams);
975885b47fbSopenharmony_ci            std::shared_ptr<AccessibilityAbilityInfo> accessibilityInfo =
976885b47fbSopenharmony_ci                std::make_shared<AccessibilityAbilityInfo>(initParams);
977885b47fbSopenharmony_ci
978885b47fbSopenharmony_ci            std::string abilityId = accessibilityInfo->GetId();
979885b47fbSopenharmony_ci            if (GetAbilityAutoStartState(abilityId)) {
980885b47fbSopenharmony_ci                HILOG_DEBUG("auto start packageName is %{public}s.", bundleName.c_str());
981885b47fbSopenharmony_ci                uint32_t capabilities = CAPABILITY_GESTURE | CAPABILITY_KEY_EVENT_OBSERVER | CAPABILITY_RETRIEVE |
982885b47fbSopenharmony_ci                    CAPABILITY_TOUCH_GUIDE | CAPABILITY_ZOOM;
983885b47fbSopenharmony_ci                uint32_t resultCapabilities = accessibilityInfo->GetStaticCapabilityValues() & capabilities;
984885b47fbSopenharmony_ci                accessibilityInfo->SetCapabilityValues(resultCapabilities);
985885b47fbSopenharmony_ci                AddInstalledAbility(*accessibilityInfo);
986885b47fbSopenharmony_ci                hasNewExtensionAbility = true;
987885b47fbSopenharmony_ci                std::string uri = Utils::GetUri(bundleName, accessibilityInfo->GetName());
988885b47fbSopenharmony_ci                AddEnabledAbility(uri);
989885b47fbSopenharmony_ci                RemoveConnectingA11yAbility(uri);
990885b47fbSopenharmony_ci                continue;
991885b47fbSopenharmony_ci            }
992885b47fbSopenharmony_ci
993885b47fbSopenharmony_ci            AddInstalledAbility(*accessibilityInfo);
994885b47fbSopenharmony_ci            hasNewExtensionAbility = true;
995885b47fbSopenharmony_ci        }
996885b47fbSopenharmony_ci    }
997885b47fbSopenharmony_ci
998885b47fbSopenharmony_ci    if (hasNewExtensionAbility) {
999885b47fbSopenharmony_ci        HILOG_DEBUG("add new extension ability and update abilities.");
1000885b47fbSopenharmony_ci        UpdateAbilities();
1001885b47fbSopenharmony_ci    }
1002885b47fbSopenharmony_ci}
1003885b47fbSopenharmony_ci
1004885b47fbSopenharmony_civoid AccessibilityAccountData::ChangeAbility(const std::string &bundleName)
1005885b47fbSopenharmony_ci{
1006885b47fbSopenharmony_ci    HILOG_DEBUG("bundleName(%{public}s)", bundleName.c_str());
1007885b47fbSopenharmony_ci
1008885b47fbSopenharmony_ci    if (installedAbilities_.empty()) {
1009885b47fbSopenharmony_ci        HILOG_DEBUG("There is no installed abilities.");
1010885b47fbSopenharmony_ci        return;
1011885b47fbSopenharmony_ci    }
1012885b47fbSopenharmony_ci    std::vector<std::string> autoStartAbilities;
1013885b47fbSopenharmony_ci    for (auto &ability : installedAbilities_) {
1014885b47fbSopenharmony_ci        if (ability.GetPackageName() != bundleName) {
1015885b47fbSopenharmony_ci            continue;
1016885b47fbSopenharmony_ci        }
1017885b47fbSopenharmony_ci        if (GetAbilityAutoStartState(ability.GetId())) {
1018885b47fbSopenharmony_ci            autoStartAbilities.push_back(ability.GetId());
1019885b47fbSopenharmony_ci        }
1020885b47fbSopenharmony_ci    }
1021885b47fbSopenharmony_ci
1022885b47fbSopenharmony_ci    RemoveInstalledAbility(bundleName);
1023885b47fbSopenharmony_ci    AddAbility(bundleName);
1024885b47fbSopenharmony_ci
1025885b47fbSopenharmony_ci    for (auto &name : autoStartAbilities) {
1026885b47fbSopenharmony_ci        auto iter = installedAbilities_.begin();
1027885b47fbSopenharmony_ci        for (; iter != installedAbilities_.end(); ++iter) {
1028885b47fbSopenharmony_ci            if (name == iter->GetId()) {
1029885b47fbSopenharmony_ci                break;
1030885b47fbSopenharmony_ci            }
1031885b47fbSopenharmony_ci        }
1032885b47fbSopenharmony_ci        if (iter == installedAbilities_.end()) {
1033885b47fbSopenharmony_ci            SetAbilityAutoStartState(name, false);
1034885b47fbSopenharmony_ci        }
1035885b47fbSopenharmony_ci    }
1036885b47fbSopenharmony_ci}
1037885b47fbSopenharmony_ci
1038885b47fbSopenharmony_civoid AccessibilityAccountData::AddUITestClient(const sptr<IRemoteObject> &obj,
1039885b47fbSopenharmony_ci    const std::string &bundleName, const std::string &abilityName)
1040885b47fbSopenharmony_ci{
1041885b47fbSopenharmony_ci    HILOG_DEBUG();
1042885b47fbSopenharmony_ci    // Add installed ability
1043885b47fbSopenharmony_ci    std::shared_ptr<AccessibilityAbilityInfo> abilityInfo = std::make_shared<AccessibilityAbilityInfo>();
1044885b47fbSopenharmony_ci    abilityInfo->SetPackageName(bundleName);
1045885b47fbSopenharmony_ci    uint32_t capabilities = CAPABILITY_RETRIEVE | CAPABILITY_GESTURE;
1046885b47fbSopenharmony_ci    abilityInfo->SetCapabilityValues(capabilities);
1047885b47fbSopenharmony_ci    abilityInfo->SetAccessibilityAbilityType(ACCESSIBILITY_ABILITY_TYPE_ALL);
1048885b47fbSopenharmony_ci    abilityInfo->SetEventTypes(EventType::TYPES_ALL_MASK);
1049885b47fbSopenharmony_ci    AddInstalledAbility(*abilityInfo);
1050885b47fbSopenharmony_ci
1051885b47fbSopenharmony_ci    // Add connected ability
1052885b47fbSopenharmony_ci    sptr<AppExecFwk::ElementName> elementName = new(std::nothrow) AppExecFwk::ElementName();
1053885b47fbSopenharmony_ci    if (!elementName) {
1054885b47fbSopenharmony_ci        HILOG_ERROR("elementName is null");
1055885b47fbSopenharmony_ci        return;
1056885b47fbSopenharmony_ci    }
1057885b47fbSopenharmony_ci    elementName->SetBundleName(bundleName);
1058885b47fbSopenharmony_ci    elementName->SetAbilityName(abilityName);
1059885b47fbSopenharmony_ci    sptr<AccessibleAbilityConnection> connection = new(std::nothrow) AccessibleAbilityConnection(
1060885b47fbSopenharmony_ci        id_, connectCounter_++, *abilityInfo);
1061885b47fbSopenharmony_ci    if (!connection) {
1062885b47fbSopenharmony_ci        HILOG_ERROR("connection is null");
1063885b47fbSopenharmony_ci        return;
1064885b47fbSopenharmony_ci    }
1065885b47fbSopenharmony_ci    connection->OnAbilityConnectDoneSync(*elementName, obj);
1066885b47fbSopenharmony_ci}
1067885b47fbSopenharmony_ci
1068885b47fbSopenharmony_civoid AccessibilityAccountData::RemoveUITestClient(sptr<AccessibleAbilityConnection> &connection,
1069885b47fbSopenharmony_ci    const std::string &bundleName)
1070885b47fbSopenharmony_ci{
1071885b47fbSopenharmony_ci    HILOG_DEBUG();
1072885b47fbSopenharmony_ci    if (!connection) {
1073885b47fbSopenharmony_ci        HILOG_ERROR("connection is nullptr");
1074885b47fbSopenharmony_ci        return;
1075885b47fbSopenharmony_ci    }
1076885b47fbSopenharmony_ci    RemoveInstalledAbility(bundleName);
1077885b47fbSopenharmony_ci    RemoveConnectedAbility(connection->GetElementName());
1078885b47fbSopenharmony_ci    connection->OnAbilityDisconnectDoneSync(connection->GetElementName());
1079885b47fbSopenharmony_ci}
1080885b47fbSopenharmony_ci
1081885b47fbSopenharmony_ciAccountSA::OsAccountType AccessibilityAccountData::GetAccountType()
1082885b47fbSopenharmony_ci{
1083885b47fbSopenharmony_ci    return accountType_;
1084885b47fbSopenharmony_ci}
1085885b47fbSopenharmony_ci
1086885b47fbSopenharmony_civoid AccessibilityAccountData::AccessibilityAbility::AddAccessibilityAbility(const std::string& uri,
1087885b47fbSopenharmony_ci    const sptr<AccessibleAbilityConnection>& connection)
1088885b47fbSopenharmony_ci{
1089885b47fbSopenharmony_ci    HILOG_INFO("uri is %{private}s", uri.c_str());
1090885b47fbSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(mutex_);
1091885b47fbSopenharmony_ci    if (!connectionMap_.count(uri)) {
1092885b47fbSopenharmony_ci        connectionMap_[uri] = connection;
1093885b47fbSopenharmony_ci        HILOG_DEBUG("connectionMap_ size %{public}zu", connectionMap_.size());
1094885b47fbSopenharmony_ci        return;
1095885b47fbSopenharmony_ci    }
1096885b47fbSopenharmony_ci
1097885b47fbSopenharmony_ci    HILOG_DEBUG("uri %{private}s, connectionMap_ %{public}zu", uri.c_str(), connectionMap_.size());
1098885b47fbSopenharmony_ci}
1099885b47fbSopenharmony_ci
1100885b47fbSopenharmony_civoid AccessibilityAccountData::AccessibilityAbility::RemoveAccessibilityAbilityByUri(const std::string& uri)
1101885b47fbSopenharmony_ci{
1102885b47fbSopenharmony_ci    HILOG_INFO("uri is %{private}s", uri.c_str());
1103885b47fbSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(mutex_);
1104885b47fbSopenharmony_ci    auto it = connectionMap_.find(uri);
1105885b47fbSopenharmony_ci    if (it != connectionMap_.end()) {
1106885b47fbSopenharmony_ci        connectionMap_.erase(it);
1107885b47fbSopenharmony_ci    }
1108885b47fbSopenharmony_ci
1109885b47fbSopenharmony_ci    HILOG_DEBUG("connectionMap_ %{public}zu", connectionMap_.size());
1110885b47fbSopenharmony_ci}
1111885b47fbSopenharmony_ci
1112885b47fbSopenharmony_cisptr<AccessibleAbilityConnection> AccessibilityAccountData::AccessibilityAbility::GetAccessibilityAbilityByName(
1113885b47fbSopenharmony_ci    const std::string& elementName)
1114885b47fbSopenharmony_ci{
1115885b47fbSopenharmony_ci    HILOG_DEBUG("elementName is %{public}s", elementName.c_str());
1116885b47fbSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(mutex_);
1117885b47fbSopenharmony_ci    for (auto& connection : connectionMap_) {
1118885b47fbSopenharmony_ci        std::string::size_type index = connection.first.find(elementName);
1119885b47fbSopenharmony_ci        if (index == std::string::npos) {
1120885b47fbSopenharmony_ci            continue;
1121885b47fbSopenharmony_ci        } else {
1122885b47fbSopenharmony_ci            HILOG_DEBUG("uri %{private}s ", connection.first.c_str());
1123885b47fbSopenharmony_ci            return connection.second;
1124885b47fbSopenharmony_ci        }
1125885b47fbSopenharmony_ci    }
1126885b47fbSopenharmony_ci
1127885b47fbSopenharmony_ci    return nullptr;
1128885b47fbSopenharmony_ci}
1129885b47fbSopenharmony_ci
1130885b47fbSopenharmony_cisptr<AccessibleAbilityConnection> AccessibilityAccountData::AccessibilityAbility::GetAccessibilityAbilityByUri(
1131885b47fbSopenharmony_ci    const std::string& uri)
1132885b47fbSopenharmony_ci{
1133885b47fbSopenharmony_ci    HILOG_DEBUG("uri is %{private}s", uri.c_str());
1134885b47fbSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(mutex_);
1135885b47fbSopenharmony_ci    auto iter = connectionMap_.find(uri);
1136885b47fbSopenharmony_ci    if (iter != connectionMap_.end()) {
1137885b47fbSopenharmony_ci        return iter->second;
1138885b47fbSopenharmony_ci    }
1139885b47fbSopenharmony_ci    return nullptr;
1140885b47fbSopenharmony_ci}
1141885b47fbSopenharmony_ci
1142885b47fbSopenharmony_civoid AccessibilityAccountData::AccessibilityAbility::GetAccessibilityAbilities(
1143885b47fbSopenharmony_ci    std::vector<sptr<AccessibleAbilityConnection>>& connectionList)
1144885b47fbSopenharmony_ci{
1145885b47fbSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(mutex_);
1146885b47fbSopenharmony_ci    for (auto& connection : connectionMap_) {
1147885b47fbSopenharmony_ci        connectionList.push_back(connection.second);
1148885b47fbSopenharmony_ci    }
1149885b47fbSopenharmony_ci}
1150885b47fbSopenharmony_ci
1151885b47fbSopenharmony_civoid AccessibilityAccountData::AccessibilityAbility::GetAbilitiesInfo(
1152885b47fbSopenharmony_ci    std::vector<AccessibilityAbilityInfo>& abilities)
1153885b47fbSopenharmony_ci{
1154885b47fbSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(mutex_);
1155885b47fbSopenharmony_ci    for (auto& connection : connectionMap_) {
1156885b47fbSopenharmony_ci        if (connection.second) {
1157885b47fbSopenharmony_ci            abilities.push_back(connection.second->GetAbilityInfo());
1158885b47fbSopenharmony_ci        }
1159885b47fbSopenharmony_ci    }
1160885b47fbSopenharmony_ci
1161885b47fbSopenharmony_ci    HILOG_DEBUG("connectionMap_ %{public}zu and enabledAbilities %{public}zu",
1162885b47fbSopenharmony_ci        connectionMap_.size(), abilities.size());
1163885b47fbSopenharmony_ci}
1164885b47fbSopenharmony_ci
1165885b47fbSopenharmony_cibool AccessibilityAccountData::AccessibilityAbility::IsExistCapability(Capability capability)
1166885b47fbSopenharmony_ci{
1167885b47fbSopenharmony_ci    HILOG_DEBUG("capability %{public}d", capability);
1168885b47fbSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(mutex_);
1169885b47fbSopenharmony_ci    for (auto iter = connectionMap_.begin(); iter != connectionMap_.end(); iter++) {
1170885b47fbSopenharmony_ci        if (iter->second->GetAbilityInfo().GetCapabilityValues() & capability) {
1171885b47fbSopenharmony_ci            return true;
1172885b47fbSopenharmony_ci        }
1173885b47fbSopenharmony_ci    }
1174885b47fbSopenharmony_ci
1175885b47fbSopenharmony_ci    return false;
1176885b47fbSopenharmony_ci}
1177885b47fbSopenharmony_ci
1178885b47fbSopenharmony_civoid AccessibilityAccountData::AccessibilityAbility::GetAccessibilityAbilitiesMap(
1179885b47fbSopenharmony_ci    std::map<std::string, sptr<AccessibleAbilityConnection>>& connectionMap)
1180885b47fbSopenharmony_ci{
1181885b47fbSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(mutex_);
1182885b47fbSopenharmony_ci    connectionMap = connectionMap_;
1183885b47fbSopenharmony_ci}
1184885b47fbSopenharmony_ci
1185885b47fbSopenharmony_civoid AccessibilityAccountData::AccessibilityAbility::Clear()
1186885b47fbSopenharmony_ci{
1187885b47fbSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(mutex_);
1188885b47fbSopenharmony_ci    return connectionMap_.clear();
1189885b47fbSopenharmony_ci}
1190885b47fbSopenharmony_ci
1191885b47fbSopenharmony_cisize_t AccessibilityAccountData::AccessibilityAbility::GetSize()
1192885b47fbSopenharmony_ci{
1193885b47fbSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(mutex_);
1194885b47fbSopenharmony_ci    return connectionMap_.size();
1195885b47fbSopenharmony_ci}
1196885b47fbSopenharmony_ci
1197885b47fbSopenharmony_civoid AccessibilityAccountData::AccessibilityAbility::GetDisableAbilities(
1198885b47fbSopenharmony_ci    std::vector<AccessibilityAbilityInfo> &disabledAbilities)
1199885b47fbSopenharmony_ci{
1200885b47fbSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(mutex_);
1201885b47fbSopenharmony_ci    for (auto& connection : connectionMap_) {
1202885b47fbSopenharmony_ci        for (auto iter = disabledAbilities.begin(); iter != disabledAbilities.end();) {
1203885b47fbSopenharmony_ci            if (connection.second && (iter->GetId() == connection.second->GetAbilityInfo().GetId())) {
1204885b47fbSopenharmony_ci                iter = disabledAbilities.erase(iter);
1205885b47fbSopenharmony_ci            } else {
1206885b47fbSopenharmony_ci                iter++;
1207885b47fbSopenharmony_ci            }
1208885b47fbSopenharmony_ci        }
1209885b47fbSopenharmony_ci    }
1210885b47fbSopenharmony_ci}
1211885b47fbSopenharmony_ci
1212885b47fbSopenharmony_civoid AccessibilityAccountData::AccessibilityAbility::RemoveAccessibilityAbilityByName(const std::string& bundleName,
1213885b47fbSopenharmony_ci    bool& result)
1214885b47fbSopenharmony_ci{
1215885b47fbSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(mutex_);
1216885b47fbSopenharmony_ci    for (auto& connection : connectionMap_) {
1217885b47fbSopenharmony_ci        std::size_t firstPos = connection.first.find_first_of('/') + 1;
1218885b47fbSopenharmony_ci        std::size_t endPos = connection.first.find_last_of('/');
1219885b47fbSopenharmony_ci        if (endPos <= firstPos) {
1220885b47fbSopenharmony_ci            HILOG_ERROR("it's a wrong ability and the uri %{public}s ", connection.first.c_str());
1221885b47fbSopenharmony_ci            continue;
1222885b47fbSopenharmony_ci        }
1223885b47fbSopenharmony_ci
1224885b47fbSopenharmony_ci        std::string connectedBundleName = connection.first.substr(firstPos, endPos - firstPos);
1225885b47fbSopenharmony_ci        if (connectedBundleName == bundleName) {
1226885b47fbSopenharmony_ci            HILOG_DEBUG("remove connected ability, bundle name %{public}s", connectedBundleName.c_str());
1227885b47fbSopenharmony_ci            std::string uri = Utils::GetUri(connection.second->GetElementName());
1228885b47fbSopenharmony_ci            auto it = connectionMap_.find(uri);
1229885b47fbSopenharmony_ci            if (it != connectionMap_.end()) {
1230885b47fbSopenharmony_ci                connectionMap_.erase(it);
1231885b47fbSopenharmony_ci            }
1232885b47fbSopenharmony_ci            result = true;
1233885b47fbSopenharmony_ci        }
1234885b47fbSopenharmony_ci    }
1235885b47fbSopenharmony_ci}
1236885b47fbSopenharmony_ci
1237885b47fbSopenharmony_ciint32_t AccessibilityAccountData::AccessibilityAbility::GetSizeByUri(const std::string& uri)
1238885b47fbSopenharmony_ci{
1239885b47fbSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(mutex_);
1240885b47fbSopenharmony_ci    return connectionMap_.count(uri);
1241885b47fbSopenharmony_ci}
1242885b47fbSopenharmony_ci
1243885b47fbSopenharmony_cisptr<AccessibilityAccountData> AccessibilityAccountDataMap::AddAccountData(
1244885b47fbSopenharmony_ci    int32_t accountId)
1245885b47fbSopenharmony_ci{
1246885b47fbSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(accountDataMutex_);
1247885b47fbSopenharmony_ci    auto iter = accountDataMap_.find(accountId);
1248885b47fbSopenharmony_ci    if (iter != accountDataMap_.end()) {
1249885b47fbSopenharmony_ci        HILOG_WARN("accountId is existed");
1250885b47fbSopenharmony_ci        return iter->second;
1251885b47fbSopenharmony_ci    }
1252885b47fbSopenharmony_ci
1253885b47fbSopenharmony_ci    sptr<AccessibilityAccountData> accountData = new(std::nothrow) AccessibilityAccountData(accountId);
1254885b47fbSopenharmony_ci    if (accountData == nullptr) {
1255885b47fbSopenharmony_ci        HILOG_ERROR("accountData is null");
1256885b47fbSopenharmony_ci        return nullptr;
1257885b47fbSopenharmony_ci    }
1258885b47fbSopenharmony_ci
1259885b47fbSopenharmony_ci    accountData->Init();
1260885b47fbSopenharmony_ci    accountDataMap_[accountId] = accountData;
1261885b47fbSopenharmony_ci    return accountData;
1262885b47fbSopenharmony_ci}
1263885b47fbSopenharmony_ci
1264885b47fbSopenharmony_cisptr<AccessibilityAccountData> AccessibilityAccountDataMap::GetCurrentAccountData(
1265885b47fbSopenharmony_ci    int32_t accountId)
1266885b47fbSopenharmony_ci{
1267885b47fbSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(accountDataMutex_);
1268885b47fbSopenharmony_ci    auto iter = accountDataMap_.find(accountId);
1269885b47fbSopenharmony_ci    if (iter != accountDataMap_.end()) {
1270885b47fbSopenharmony_ci        return iter->second;
1271885b47fbSopenharmony_ci    }
1272885b47fbSopenharmony_ci
1273885b47fbSopenharmony_ci    sptr<AccessibilityAccountData> accountData = new(std::nothrow) AccessibilityAccountData(accountId);
1274885b47fbSopenharmony_ci    if (!accountData) {
1275885b47fbSopenharmony_ci        HILOG_ERROR("accountData is null");
1276885b47fbSopenharmony_ci        return nullptr;
1277885b47fbSopenharmony_ci    }
1278885b47fbSopenharmony_ci
1279885b47fbSopenharmony_ci    accountDataMap_[accountId] = accountData;
1280885b47fbSopenharmony_ci    return accountData;
1281885b47fbSopenharmony_ci}
1282885b47fbSopenharmony_ci
1283885b47fbSopenharmony_cisptr<AccessibilityAccountData> AccessibilityAccountDataMap::GetAccountData(
1284885b47fbSopenharmony_ci    int32_t accountId)
1285885b47fbSopenharmony_ci{
1286885b47fbSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(accountDataMutex_);
1287885b47fbSopenharmony_ci    auto iter = accountDataMap_.find(accountId);
1288885b47fbSopenharmony_ci    if (iter != accountDataMap_.end()) {
1289885b47fbSopenharmony_ci        return iter->second;
1290885b47fbSopenharmony_ci    }
1291885b47fbSopenharmony_ci
1292885b47fbSopenharmony_ci    HILOG_DEBUG("accountId is not existed");
1293885b47fbSopenharmony_ci    return nullptr;
1294885b47fbSopenharmony_ci}
1295885b47fbSopenharmony_ci
1296885b47fbSopenharmony_cisptr<AccessibilityAccountData> AccessibilityAccountDataMap::RemoveAccountData(
1297885b47fbSopenharmony_ci    int32_t accountId)
1298885b47fbSopenharmony_ci{
1299885b47fbSopenharmony_ci    sptr<AccessibilityAccountData> accountData = nullptr;
1300885b47fbSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(accountDataMutex_);
1301885b47fbSopenharmony_ci    auto iter = accountDataMap_.find(accountId);
1302885b47fbSopenharmony_ci    if (iter != accountDataMap_.end()) {
1303885b47fbSopenharmony_ci        accountData = iter->second;
1304885b47fbSopenharmony_ci        accountDataMap_.erase(iter);
1305885b47fbSopenharmony_ci    }
1306885b47fbSopenharmony_ci
1307885b47fbSopenharmony_ci    return accountData;
1308885b47fbSopenharmony_ci}
1309885b47fbSopenharmony_ci
1310885b47fbSopenharmony_cistd::vector<int32_t> AccessibilityAccountDataMap::GetAllAccountIds()
1311885b47fbSopenharmony_ci{
1312885b47fbSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(accountDataMutex_);
1313885b47fbSopenharmony_ci    std::vector<int32_t> accountIds;
1314885b47fbSopenharmony_ci    for (auto it = accountDataMap_.begin(); it != accountDataMap_.end(); it++) {
1315885b47fbSopenharmony_ci        accountIds.push_back(it->first);
1316885b47fbSopenharmony_ci    }
1317885b47fbSopenharmony_ci    return accountIds;
1318885b47fbSopenharmony_ci}
1319885b47fbSopenharmony_ci
1320885b47fbSopenharmony_civoid AccessibilityAccountDataMap::Clear()
1321885b47fbSopenharmony_ci{
1322885b47fbSopenharmony_ci    std::lock_guard<ffrt::mutex> lock(accountDataMutex_);
1323885b47fbSopenharmony_ci    accountDataMap_.clear();
1324885b47fbSopenharmony_ci}
1325885b47fbSopenharmony_ci} // namespace Accessibility
1326885b47fbSopenharmony_ci} // namespace OHOS
1327