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