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_window_manager.h" 17885b47fbSopenharmony_ci 18885b47fbSopenharmony_ci#ifdef OHOS_BUILD_ENABLE_HITRACE 19885b47fbSopenharmony_ci#include <hitrace_meter.h> 20885b47fbSopenharmony_ci#endif // OHOS_BUILD_ENABLE_HITRACE 21885b47fbSopenharmony_ci 22885b47fbSopenharmony_ci#include "accessible_ability_manager_service.h" 23885b47fbSopenharmony_ci#include "hilog_wrapper.h" 24885b47fbSopenharmony_ci#include "utils.h" 25885b47fbSopenharmony_ci#include "xcollie_helper.h" 26885b47fbSopenharmony_ci 27885b47fbSopenharmony_cinamespace OHOS { 28885b47fbSopenharmony_cinamespace Accessibility { 29885b47fbSopenharmony_cinamespace { 30885b47fbSopenharmony_ci const std::string TIMER_GET_ACCESSIBILITY_WINDOWS = "accessibilty:getAccessibilityWindowInfo"; 31885b47fbSopenharmony_ci constexpr int32_t WMS_TIMEOUT = 10; // s 32885b47fbSopenharmony_ci} 33885b47fbSopenharmony_ci 34885b47fbSopenharmony_ciAccessibilityWindowManager::AccessibilityWindowManager() 35885b47fbSopenharmony_ci{ 36885b47fbSopenharmony_ci} 37885b47fbSopenharmony_ci 38885b47fbSopenharmony_cibool AccessibilityWindowManager::Init() 39885b47fbSopenharmony_ci{ 40885b47fbSopenharmony_ci DeInit(); 41885b47fbSopenharmony_ci HILOG_DEBUG("deinit before start"); 42885b47fbSopenharmony_ci#ifdef OHOS_BUILD_ENABLE_HITRACE 43885b47fbSopenharmony_ci HITRACE_METER_NAME(HITRACE_TAG_ACCESSIBILITY_MANAGER, "QueryWindowInfo"); 44885b47fbSopenharmony_ci#endif // OHOS_BUILD_ENABLE_HITRACE 45885b47fbSopenharmony_ci std::vector<sptr<Rosen::AccessibilityWindowInfo>> windowInfos; 46885b47fbSopenharmony_ci Rosen::WMError err = OHOS::Rosen::WindowManager::GetInstance().GetAccessibilityWindowInfo(windowInfos); 47885b47fbSopenharmony_ci if (err != Rosen::WMError::WM_OK) { 48885b47fbSopenharmony_ci Utils::RecordUnavailableEvent(A11yUnavailableEvent::QUERY_EVENT, A11yError::ERROR_QUERY_WINDOW_INFO_FAILED); 49885b47fbSopenharmony_ci HILOG_ERROR("get window info from wms failed. err[%{public}d]", err); 50885b47fbSopenharmony_ci return false; 51885b47fbSopenharmony_ci } 52885b47fbSopenharmony_ci std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_); 53885b47fbSopenharmony_ci HILOG_DEBUG("windowInfos size is %{public}zu", windowInfos.size()); 54885b47fbSopenharmony_ci for (auto &window : windowInfos) { 55885b47fbSopenharmony_ci if (!window) { 56885b47fbSopenharmony_ci HILOG_ERROR("window is nullptr"); 57885b47fbSopenharmony_ci continue; 58885b47fbSopenharmony_ci } 59885b47fbSopenharmony_ci 60885b47fbSopenharmony_ci int32_t realWid = GetRealWindowId(window); 61885b47fbSopenharmony_ci if (!a11yWindows_.count(realWid)) { 62885b47fbSopenharmony_ci auto a11yWindowInfo = CreateAccessibilityWindowInfo(window); 63885b47fbSopenharmony_ci a11yWindows_.emplace(realWid, a11yWindowInfo); 64885b47fbSopenharmony_ci } 65885b47fbSopenharmony_ci 66885b47fbSopenharmony_ci if (IsSceneBoard(window)) { 67885b47fbSopenharmony_ci subWindows_.insert(realWid); 68885b47fbSopenharmony_ci sceneBoardElementIdMap_.InsertPair(realWid, window->uiNodeId_); 69885b47fbSopenharmony_ci } 70885b47fbSopenharmony_ci 71885b47fbSopenharmony_ci if (a11yWindows_[realWid].IsFocused()) { 72885b47fbSopenharmony_ci SetActiveWindow(realWid); 73885b47fbSopenharmony_ci } 74885b47fbSopenharmony_ci } 75885b47fbSopenharmony_ci return true; 76885b47fbSopenharmony_ci} 77885b47fbSopenharmony_ci 78885b47fbSopenharmony_civoid AccessibilityWindowManager::DeInit() 79885b47fbSopenharmony_ci{ 80885b47fbSopenharmony_ci HILOG_DEBUG(); 81885b47fbSopenharmony_ci std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_); 82885b47fbSopenharmony_ci a11yWindows_.clear(); 83885b47fbSopenharmony_ci subWindows_.clear(); 84885b47fbSopenharmony_ci sceneBoardElementIdMap_.Clear(); 85885b47fbSopenharmony_ci activeWindowId_ = INVALID_WINDOW_ID; 86885b47fbSopenharmony_ci a11yFocusedWindowId_ = INVALID_WINDOW_ID; 87885b47fbSopenharmony_ci} 88885b47fbSopenharmony_ci 89885b47fbSopenharmony_civoid AccessibilityWindowManager::WinDeInit() 90885b47fbSopenharmony_ci{ 91885b47fbSopenharmony_ci HILOG_DEBUG(); 92885b47fbSopenharmony_ci std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_); 93885b47fbSopenharmony_ci a11yWindows_.clear(); 94885b47fbSopenharmony_ci subWindows_.clear(); 95885b47fbSopenharmony_ci sceneBoardElementIdMap_.Clear(); 96885b47fbSopenharmony_ci activeWindowId_ = INVALID_WINDOW_ID; 97885b47fbSopenharmony_ci} 98885b47fbSopenharmony_ci 99885b47fbSopenharmony_ciAccessibilityWindowManager::~AccessibilityWindowManager() 100885b47fbSopenharmony_ci{ 101885b47fbSopenharmony_ci DeregisterWindowListener(); 102885b47fbSopenharmony_ci} 103885b47fbSopenharmony_ci 104885b47fbSopenharmony_civoid AccessibilityWindowManager::RegisterWindowListener(const std::shared_ptr<AppExecFwk::EventHandler> &handler) 105885b47fbSopenharmony_ci{ 106885b47fbSopenharmony_ci DeregisterWindowListener(); 107885b47fbSopenharmony_ci HILOG_DEBUG("deregister before register"); 108885b47fbSopenharmony_ci if (windowListener_) { 109885b47fbSopenharmony_ci HILOG_DEBUG("Window listener is already registered!"); 110885b47fbSopenharmony_ci return; 111885b47fbSopenharmony_ci } 112885b47fbSopenharmony_ci 113885b47fbSopenharmony_ci eventHandler_ = handler; 114885b47fbSopenharmony_ci windowListener_ = new(std::nothrow) AccessibilityWindowListener(*this); 115885b47fbSopenharmony_ci if (!windowListener_) { 116885b47fbSopenharmony_ci HILOG_ERROR("Create window listener fail!"); 117885b47fbSopenharmony_ci return; 118885b47fbSopenharmony_ci } 119885b47fbSopenharmony_ci OHOS::Rosen::WindowManager::GetInstance().RegisterWindowUpdateListener(windowListener_); 120885b47fbSopenharmony_ci} 121885b47fbSopenharmony_ci 122885b47fbSopenharmony_civoid AccessibilityWindowManager::DeregisterWindowListener() 123885b47fbSopenharmony_ci{ 124885b47fbSopenharmony_ci if (windowListener_) { 125885b47fbSopenharmony_ci OHOS::Rosen::WindowManager::GetInstance().UnregisterWindowUpdateListener(windowListener_); 126885b47fbSopenharmony_ci windowListener_ = nullptr; 127885b47fbSopenharmony_ci eventHandler_ = nullptr; 128885b47fbSopenharmony_ci } 129885b47fbSopenharmony_ci} 130885b47fbSopenharmony_ci 131885b47fbSopenharmony_civoid AccessibilityWindowManager::OnWindowUpdate(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos, 132885b47fbSopenharmony_ci Rosen::WindowUpdateType type) 133885b47fbSopenharmony_ci{ 134885b47fbSopenharmony_ci HILOG_DEBUG("WindowUpdateType type[%{public}d]", type); 135885b47fbSopenharmony_ci if (!eventHandler_) { 136885b47fbSopenharmony_ci HILOG_ERROR("eventHandler_ is nullptr."); 137885b47fbSopenharmony_ci return; 138885b47fbSopenharmony_ci } 139885b47fbSopenharmony_ci if (infos.size() == 0) { 140885b47fbSopenharmony_ci HILOG_ERROR("window info is err"); 141885b47fbSopenharmony_ci return; 142885b47fbSopenharmony_ci } 143885b47fbSopenharmony_ci eventHandler_->PostTask([=]() { 144885b47fbSopenharmony_ci switch (type) { 145885b47fbSopenharmony_ci case Rosen::WindowUpdateType::WINDOW_UPDATE_ADDED: // 1 146885b47fbSopenharmony_ci WindowUpdateAdded(infos); 147885b47fbSopenharmony_ci break; 148885b47fbSopenharmony_ci case Rosen::WindowUpdateType::WINDOW_UPDATE_REMOVED: // 2 149885b47fbSopenharmony_ci WindowUpdateRemoved(infos); 150885b47fbSopenharmony_ci break; 151885b47fbSopenharmony_ci case Rosen::WindowUpdateType::WINDOW_UPDATE_BOUNDS: // 4 152885b47fbSopenharmony_ci WindowUpdateBounds(infos); 153885b47fbSopenharmony_ci break; 154885b47fbSopenharmony_ci case Rosen::WindowUpdateType::WINDOW_UPDATE_ACTIVE: // 5 155885b47fbSopenharmony_ci WindowUpdateActive(infos); 156885b47fbSopenharmony_ci break; 157885b47fbSopenharmony_ci case Rosen::WindowUpdateType::WINDOW_UPDATE_FOCUSED: // 3 158885b47fbSopenharmony_ci WindowUpdateFocused(infos); 159885b47fbSopenharmony_ci break; 160885b47fbSopenharmony_ci case Rosen::WindowUpdateType::WINDOW_UPDATE_PROPERTY: // 6 161885b47fbSopenharmony_ci WindowUpdateProperty(infos); 162885b47fbSopenharmony_ci break; 163885b47fbSopenharmony_ci case Rosen::WindowUpdateType::WINDOW_UPDATE_ALL: 164885b47fbSopenharmony_ci WindowUpdateAll(infos); 165885b47fbSopenharmony_ci break; 166885b47fbSopenharmony_ci default: 167885b47fbSopenharmony_ci break; 168885b47fbSopenharmony_ci } 169885b47fbSopenharmony_ci HILOG_DEBUG("a11yWindows[%{public}zu]", a11yWindows_.size()); 170885b47fbSopenharmony_ci }, "TASK_ON_WINDOW_UPDATE"); 171885b47fbSopenharmony_ci} 172885b47fbSopenharmony_ci 173885b47fbSopenharmony_ciint32_t AccessibilityWindowManager::ConvertToRealWindowId(int32_t windowId, int32_t focusType) 174885b47fbSopenharmony_ci{ 175885b47fbSopenharmony_ci std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_); 176885b47fbSopenharmony_ci int32_t winId = windowId; 177885b47fbSopenharmony_ci HILOG_DEBUG("ConvertToRealWindowId called, windowId[%{public}d], focusType[%{public}d]", windowId, focusType); 178885b47fbSopenharmony_ci if (windowId == ACTIVE_WINDOW_ID) { 179885b47fbSopenharmony_ci HILOG_DEBUG("After convert active windowId[%{public}d]", activeWindowId_); 180885b47fbSopenharmony_ci winId = activeWindowId_; 181885b47fbSopenharmony_ci } 182885b47fbSopenharmony_ci 183885b47fbSopenharmony_ci if (windowId == ANY_WINDOW_ID) { 184885b47fbSopenharmony_ci if (focusType == FOCUS_TYPE_ACCESSIBILITY) { 185885b47fbSopenharmony_ci HILOG_DEBUG("After convert a11yFocused windowId[%{public}d] by accessibility type", a11yFocusedWindowId_); 186885b47fbSopenharmony_ci winId = a11yFocusedWindowId_; 187885b47fbSopenharmony_ci } else if (focusType == FOCUS_TYPE_INPUT) { 188885b47fbSopenharmony_ci HILOG_DEBUG("After convert active windowId[%{public}d] by input type", activeWindowId_); 189885b47fbSopenharmony_ci winId = activeWindowId_; 190885b47fbSopenharmony_ci } 191885b47fbSopenharmony_ci } 192885b47fbSopenharmony_ci 193885b47fbSopenharmony_ci if (subWindows_.count(winId)) { 194885b47fbSopenharmony_ci HILOG_DEBUG("After convert normal windowId[%{public}d]", SCENE_BOARD_WINDOW_ID); 195885b47fbSopenharmony_ci return SCENE_BOARD_WINDOW_ID; 196885b47fbSopenharmony_ci } 197885b47fbSopenharmony_ci HILOG_DEBUG("After convert windowId[%{public}d] and activeId[%{public}d]", winId, activeWindowId_); 198885b47fbSopenharmony_ci return winId; 199885b47fbSopenharmony_ci} 200885b47fbSopenharmony_ci 201885b47fbSopenharmony_ciAccessibilityWindowType ConvertWindowType(Rosen::WindowType type) 202885b47fbSopenharmony_ci{ 203885b47fbSopenharmony_ci AccessibilityWindowType winType = TYPE_WINDOW_INVALID; 204885b47fbSopenharmony_ci 205885b47fbSopenharmony_ci if (type < Rosen::WindowType::SYSTEM_WINDOW_BASE) { 206885b47fbSopenharmony_ci winType = TYPE_APPLICATION; 207885b47fbSopenharmony_ci } else if ((type >= Rosen::WindowType::SYSTEM_WINDOW_BASE) && (type <= Rosen::WindowType::SYSTEM_WINDOW_END)) { 208885b47fbSopenharmony_ci winType = TYPE_SYSTEM; 209885b47fbSopenharmony_ci } else { 210885b47fbSopenharmony_ci HILOG_ERROR("Unknown windowType[%{public}d]", type); 211885b47fbSopenharmony_ci } 212885b47fbSopenharmony_ci return winType; 213885b47fbSopenharmony_ci} 214885b47fbSopenharmony_ci 215885b47fbSopenharmony_cibool AccessibilityWindowManager::CheckIntegerOverflow(const Rosen::Rect& rect) 216885b47fbSopenharmony_ci{ 217885b47fbSopenharmony_ci if ((rect.posX_ > 0) && (static_cast<int32_t>(rect.width_) > 0)) { 218885b47fbSopenharmony_ci int32_t leftX = INT32_MAX - rect.posX_; 219885b47fbSopenharmony_ci if (leftX < static_cast<int32_t>(rect.width_)) { 220885b47fbSopenharmony_ci HILOG_ERROR("input parameter invalid posX %{public}d, width_ %{public}u", rect.posX_, 221885b47fbSopenharmony_ci rect.width_); 222885b47fbSopenharmony_ci return false; 223885b47fbSopenharmony_ci } 224885b47fbSopenharmony_ci } 225885b47fbSopenharmony_ci 226885b47fbSopenharmony_ci if ((rect.posX_ < 0) && (static_cast<int32_t>(rect.width_) < 0)) { 227885b47fbSopenharmony_ci int32_t leftX = INT32_MIN - rect.posX_; 228885b47fbSopenharmony_ci if (leftX > static_cast<int32_t>(rect.width_)) { 229885b47fbSopenharmony_ci HILOG_ERROR("input parameter invalid posX %{public}d, width_ %{public}u", rect.posX_, 230885b47fbSopenharmony_ci rect.width_); 231885b47fbSopenharmony_ci return false; 232885b47fbSopenharmony_ci } 233885b47fbSopenharmony_ci } 234885b47fbSopenharmony_ci 235885b47fbSopenharmony_ci if ((rect.posY_ > 0) && (static_cast<int32_t>(rect.height_) > 0)) { 236885b47fbSopenharmony_ci int32_t leftY = INT32_MAX - rect.posY_; 237885b47fbSopenharmony_ci if (leftY < static_cast<int32_t>(rect.height_)) { 238885b47fbSopenharmony_ci HILOG_ERROR("input parameter invalid posX %{public}d, height_ %{public}u", rect.posY_, 239885b47fbSopenharmony_ci rect.height_); 240885b47fbSopenharmony_ci return false; 241885b47fbSopenharmony_ci } 242885b47fbSopenharmony_ci } 243885b47fbSopenharmony_ci 244885b47fbSopenharmony_ci if ((rect.posY_ < 0) && (static_cast<int32_t>(rect.height_) < 0)) { 245885b47fbSopenharmony_ci int32_t leftY = INT32_MIN - rect.posY_; 246885b47fbSopenharmony_ci if (leftY > static_cast<int32_t>(rect.height_)) { 247885b47fbSopenharmony_ci HILOG_ERROR("input parameter invalid posX %{public}d, height_ %{public}u", rect.posY_, 248885b47fbSopenharmony_ci rect.height_); 249885b47fbSopenharmony_ci return false; 250885b47fbSopenharmony_ci } 251885b47fbSopenharmony_ci } 252885b47fbSopenharmony_ci return true; 253885b47fbSopenharmony_ci} 254885b47fbSopenharmony_ci 255885b47fbSopenharmony_civoid AccessibilityWindowManager::UpdateAccessibilityWindowInfo(AccessibilityWindowInfo &accWindowInfo, 256885b47fbSopenharmony_ci const sptr<Rosen::AccessibilityWindowInfo> windowInfo) 257885b47fbSopenharmony_ci{ 258885b47fbSopenharmony_ci accWindowInfo.SetScaleVal(windowInfo->scaleVal_); 259885b47fbSopenharmony_ci accWindowInfo.SetScaleX(windowInfo->scaleX_); 260885b47fbSopenharmony_ci accWindowInfo.SetScaleY(windowInfo->scaleY_); 261885b47fbSopenharmony_ci accWindowInfo.SetWindowId(windowInfo->wid_); 262885b47fbSopenharmony_ci accWindowInfo.SetMainWindowId(windowInfo->wid_); 263885b47fbSopenharmony_ci accWindowInfo.SetWindowType(static_cast<uint32_t>(windowInfo->type_)); 264885b47fbSopenharmony_ci accWindowInfo.SetWindowMode(static_cast<uint32_t>(windowInfo->mode_)); 265885b47fbSopenharmony_ci accWindowInfo.SetAccessibilityWindowType(ConvertWindowType(windowInfo->type_)); 266885b47fbSopenharmony_ci accWindowInfo.SetFocused(windowInfo->focused_); 267885b47fbSopenharmony_ci accWindowInfo.SetWindowLayer(windowInfo->layer_); 268885b47fbSopenharmony_ci if (static_cast<int32_t>(windowInfo->type_) == 1 && (static_cast<int32_t>(windowInfo->windowRect_.width_) == 0 || 269885b47fbSopenharmony_ci static_cast<int32_t>(windowInfo->windowRect_.height_) == 0)) { 270885b47fbSopenharmony_ci HILOG_WARN("invalid window parameters, windowId(%{public}d), posX(%{public}d, posY(%{public}d))", 271885b47fbSopenharmony_ci windowInfo->wid_, windowInfo->windowRect_.posX_, windowInfo->windowRect_.posY_); 272885b47fbSopenharmony_ci } else { 273885b47fbSopenharmony_ci Rect bound; 274885b47fbSopenharmony_ci bound.SetLeftTopScreenPostion(windowInfo->windowRect_.posX_, windowInfo->windowRect_.posY_); 275885b47fbSopenharmony_ci if (!CheckIntegerOverflow(windowInfo->windowRect_)) { 276885b47fbSopenharmony_ci bound.SetRightBottomScreenPostion(windowInfo->windowRect_.posX_, windowInfo->windowRect_.posY_); 277885b47fbSopenharmony_ci } else { 278885b47fbSopenharmony_ci bound.SetRightBottomScreenPostion( 279885b47fbSopenharmony_ci windowInfo->windowRect_.posX_ + static_cast<int32_t>(windowInfo->windowRect_.width_), 280885b47fbSopenharmony_ci windowInfo->windowRect_.posY_ + static_cast<int32_t>(windowInfo->windowRect_.height_)); 281885b47fbSopenharmony_ci } 282885b47fbSopenharmony_ci accWindowInfo.SetRectInScreen(bound); 283885b47fbSopenharmony_ci } 284885b47fbSopenharmony_ci accWindowInfo.SetDisplayId(windowInfo->displayId_); 285885b47fbSopenharmony_ci accWindowInfo.SetDecorEnable(windowInfo->isDecorEnable_); 286885b47fbSopenharmony_ci accWindowInfo.SetUiNodeId(windowInfo->uiNodeId_); 287885b47fbSopenharmony_ci accWindowInfo.SetInnerWid(windowInfo->innerWid_); 288885b47fbSopenharmony_ci if (accWindowInfo.GetWindowId() == SCENE_BOARD_WINDOW_ID) { 289885b47fbSopenharmony_ci accWindowInfo.SetWindowId(windowInfo->innerWid_); 290885b47fbSopenharmony_ci HILOG_DEBUG("scene board window id 1 convert inner window id[%{public}d]", windowInfo->innerWid_); 291885b47fbSopenharmony_ci } 292885b47fbSopenharmony_ci HILOG_DEBUG("bundle name is [%{public}s] , touchHotAreas size(%{public}zu)", 293885b47fbSopenharmony_ci windowInfo->bundleName_.c_str(), windowInfo->touchHotAreas_.size()); 294885b47fbSopenharmony_ci accWindowInfo.SetBundleName(windowInfo->bundleName_); 295885b47fbSopenharmony_ci HILOG_DEBUG("UpdateAccessibilityWindowInfo is set bundlename is [%{public}s]", 296885b47fbSopenharmony_ci accWindowInfo.GetBundleName().c_str()); 297885b47fbSopenharmony_ci std::vector<Rect> tempTouchHotAreas = {}; 298885b47fbSopenharmony_ci for (auto &rect : windowInfo->touchHotAreas_) { 299885b47fbSopenharmony_ci HILOG_DEBUG("Rosen::windowinfo x:[%{public}d], y:[%{public}d]; width:[%{public}d], height:[%{public}d]", 300885b47fbSopenharmony_ci rect.posX_, rect.posY_, rect.width_, rect.height_); 301885b47fbSopenharmony_ci Rect rectTemp; 302885b47fbSopenharmony_ci rectTemp.SetLeftTopScreenPostion(rect.posX_, rect.posY_); 303885b47fbSopenharmony_ci if (!CheckIntegerOverflow(rect)) { 304885b47fbSopenharmony_ci rectTemp.SetRightBottomScreenPostion(rect.posX_, rect.posY_); 305885b47fbSopenharmony_ci } else { 306885b47fbSopenharmony_ci rectTemp.SetRightBottomScreenPostion( 307885b47fbSopenharmony_ci rect.posX_ + static_cast<int32_t>(rect.width_), 308885b47fbSopenharmony_ci rect.posY_ + static_cast<int32_t>(rect.height_)); 309885b47fbSopenharmony_ci } 310885b47fbSopenharmony_ci tempTouchHotAreas.push_back(rectTemp); 311885b47fbSopenharmony_ci } 312885b47fbSopenharmony_ci accWindowInfo.SetTouchHotAreas(tempTouchHotAreas); 313885b47fbSopenharmony_ci for (auto &outRect : accWindowInfo.GetTouchHotAreas()) { 314885b47fbSopenharmony_ci HILOG_DEBUG("left_x:[%{public}d], left_y:[%{public}d]; right_x:[%{public}d], right_y:[%{public}d]", 315885b47fbSopenharmony_ci outRect.GetLeftTopXScreenPostion(), outRect.GetLeftTopYScreenPostion(), 316885b47fbSopenharmony_ci outRect.GetRightBottomXScreenPostion(), outRect.GetRightBottomYScreenPostion()); 317885b47fbSopenharmony_ci } 318885b47fbSopenharmony_ci} 319885b47fbSopenharmony_ci 320885b47fbSopenharmony_ciint32_t AccessibilityWindowManager::GetRealWindowId(const sptr<Rosen::AccessibilityWindowInfo> windowInfo) 321885b47fbSopenharmony_ci{ 322885b47fbSopenharmony_ci if (windowInfo->wid_ == SCENE_BOARD_WINDOW_ID) { 323885b47fbSopenharmony_ci return windowInfo->innerWid_; 324885b47fbSopenharmony_ci } 325885b47fbSopenharmony_ci return windowInfo->wid_; 326885b47fbSopenharmony_ci} 327885b47fbSopenharmony_ci 328885b47fbSopenharmony_cibool AccessibilityWindowManager::IsSceneBoard(const sptr<Rosen::AccessibilityWindowInfo> windowInfo) 329885b47fbSopenharmony_ci{ 330885b47fbSopenharmony_ci if (windowInfo->wid_ == SCENE_BOARD_WINDOW_ID) { 331885b47fbSopenharmony_ci return true; 332885b47fbSopenharmony_ci } 333885b47fbSopenharmony_ci return false; 334885b47fbSopenharmony_ci} 335885b47fbSopenharmony_ci 336885b47fbSopenharmony_ciAccessibilityWindowInfo AccessibilityWindowManager::CreateAccessibilityWindowInfo( 337885b47fbSopenharmony_ci const sptr<Rosen::AccessibilityWindowInfo> windowInfo) 338885b47fbSopenharmony_ci{ 339885b47fbSopenharmony_ci AccessibilityWindowInfo info; 340885b47fbSopenharmony_ci UpdateAccessibilityWindowInfo(info, windowInfo); 341885b47fbSopenharmony_ci HILOG_DEBUG("Create WindowInfo Id(%{public}d) type(%{public}d) posX(%{public}d) posY(%{public}d)" 342885b47fbSopenharmony_ci "witdth(%{public}d) height(%{public}d) display id(%{public}" PRIu64 ") isDecorEnable(%{public}d)" 343885b47fbSopenharmony_ci "innerWid(%{public}d), uiNodeId(%{public}d)", 344885b47fbSopenharmony_ci windowInfo->wid_, windowInfo->type_, windowInfo->windowRect_.posX_, windowInfo->windowRect_.posY_, 345885b47fbSopenharmony_ci windowInfo->windowRect_.width_, windowInfo->windowRect_.height_, windowInfo->displayId_, 346885b47fbSopenharmony_ci windowInfo->isDecorEnable_, windowInfo->innerWid_, windowInfo->uiNodeId_); 347885b47fbSopenharmony_ci return info; 348885b47fbSopenharmony_ci} 349885b47fbSopenharmony_ci 350885b47fbSopenharmony_civoid AccessibilityWindowManager::SetActiveWindow(int32_t windowId, bool isSendEvent) 351885b47fbSopenharmony_ci{ 352885b47fbSopenharmony_ci HILOG_DEBUG("windowId is %{public}d", windowId); 353885b47fbSopenharmony_ci std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_); 354885b47fbSopenharmony_ci if (windowId == INVALID_WINDOW_ID) { 355885b47fbSopenharmony_ci ClearOldActiveWindow(); 356885b47fbSopenharmony_ci activeWindowId_ = INVALID_WINDOW_ID; 357885b47fbSopenharmony_ci return; 358885b47fbSopenharmony_ci } 359885b47fbSopenharmony_ci 360885b47fbSopenharmony_ci if (!a11yWindows_.count(windowId)) { 361885b47fbSopenharmony_ci HILOG_WARN("Window id is not found"); 362885b47fbSopenharmony_ci return; 363885b47fbSopenharmony_ci } 364885b47fbSopenharmony_ci 365885b47fbSopenharmony_ci if (activeWindowId_ != windowId) { 366885b47fbSopenharmony_ci ClearOldActiveWindow(); 367885b47fbSopenharmony_ci activeWindowId_ = windowId; 368885b47fbSopenharmony_ci a11yWindows_[activeWindowId_].SetActive(true); 369885b47fbSopenharmony_ci if (!isSendEvent) { 370885b47fbSopenharmony_ci HILOG_DEBUG("not send event, activeWindowId is %{public}d", activeWindowId_); 371885b47fbSopenharmony_ci return; 372885b47fbSopenharmony_ci } 373885b47fbSopenharmony_ci auto &aams = Singleton<AccessibleAbilityManagerService>::GetInstance(); 374885b47fbSopenharmony_ci AccessibilityEventInfo evtInf(activeWindowId_, WINDOW_UPDATE_ACTIVE); 375885b47fbSopenharmony_ci int32_t winId = windowId; 376885b47fbSopenharmony_ci if (sceneBoardElementIdMap_.CheckWindowIdPair(windowId)) { 377885b47fbSopenharmony_ci winId = SCENE_BOARD_WINDOW_ID; 378885b47fbSopenharmony_ci } 379885b47fbSopenharmony_ci if (aams.CheckWindowRegister(winId)) { 380885b47fbSopenharmony_ci HILOG_DEBUG("send active event, windowId: %{public}d", winId); 381885b47fbSopenharmony_ci aams.SendEvent(evtInf); 382885b47fbSopenharmony_ci } else { 383885b47fbSopenharmony_ci HILOG_DEBUG("wait for window register to process event, windowId: %{public}d", winId); 384885b47fbSopenharmony_ci aams.InsertWindowIdEventPair(winId, evtInf); 385885b47fbSopenharmony_ci } 386885b47fbSopenharmony_ci } 387885b47fbSopenharmony_ci HILOG_DEBUG("activeWindowId is %{public}d", activeWindowId_); 388885b47fbSopenharmony_ci} 389885b47fbSopenharmony_ci 390885b47fbSopenharmony_ciint32_t AccessibilityWindowManager::GetActiveWindowId() 391885b47fbSopenharmony_ci{ 392885b47fbSopenharmony_ci std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_); 393885b47fbSopenharmony_ci HILOG_DEBUG("activeWindowId_ is %{public}d", activeWindowId_); 394885b47fbSopenharmony_ci return activeWindowId_; 395885b47fbSopenharmony_ci} 396885b47fbSopenharmony_ci 397885b47fbSopenharmony_civoid AccessibilityWindowManager::SetAccessibilityFocusedWindow(int32_t windowId) 398885b47fbSopenharmony_ci{ 399885b47fbSopenharmony_ci HILOG_DEBUG("windowId is %{public}d", windowId); 400885b47fbSopenharmony_ci std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_); 401885b47fbSopenharmony_ci if (windowId == INVALID_WINDOW_ID) { 402885b47fbSopenharmony_ci ClearAccessibilityFocused(); 403885b47fbSopenharmony_ci a11yFocusedWindowId_ = INVALID_WINDOW_ID; 404885b47fbSopenharmony_ci return; 405885b47fbSopenharmony_ci } 406885b47fbSopenharmony_ci 407885b47fbSopenharmony_ci if (!a11yWindows_.count(windowId)) { 408885b47fbSopenharmony_ci HILOG_ERROR("Window id[%{public}d] is not found", windowId); 409885b47fbSopenharmony_ci return; 410885b47fbSopenharmony_ci } 411885b47fbSopenharmony_ci 412885b47fbSopenharmony_ci if (a11yFocusedWindowId_ != windowId) { 413885b47fbSopenharmony_ci ClearAccessibilityFocused(); 414885b47fbSopenharmony_ci a11yFocusedWindowId_ = windowId; 415885b47fbSopenharmony_ci a11yWindows_[a11yFocusedWindowId_].SetAccessibilityFocused(true); 416885b47fbSopenharmony_ci } 417885b47fbSopenharmony_ci HILOG_DEBUG("a11yFocusedWindowId_ is %{public}d", a11yFocusedWindowId_); 418885b47fbSopenharmony_ci} 419885b47fbSopenharmony_ci 420885b47fbSopenharmony_cistd::vector<AccessibilityWindowInfo> AccessibilityWindowManager::GetAccessibilityWindows() 421885b47fbSopenharmony_ci{ 422885b47fbSopenharmony_ci HILOG_DEBUG("a11yWindows_ size[%{public}zu]", a11yWindows_.size()); 423885b47fbSopenharmony_ci XCollieHelper timer(TIMER_GET_ACCESSIBILITY_WINDOWS, WMS_TIMEOUT); 424885b47fbSopenharmony_ci std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_); 425885b47fbSopenharmony_ci std::vector<sptr<Rosen::AccessibilityWindowInfo>> windowInfos; 426885b47fbSopenharmony_ci std::vector<AccessibilityWindowInfo> windows; 427885b47fbSopenharmony_ci Rosen::WMError err = OHOS::Rosen::WindowManager::GetInstance().GetAccessibilityWindowInfo(windowInfos); 428885b47fbSopenharmony_ci if (err != Rosen::WMError::WM_OK) { 429885b47fbSopenharmony_ci HILOG_ERROR("get window info from wms failed. err[%{public}d]", err); 430885b47fbSopenharmony_ci return windows; 431885b47fbSopenharmony_ci } 432885b47fbSopenharmony_ci for (auto &info : windowInfos) { 433885b47fbSopenharmony_ci if (info == nullptr) { 434885b47fbSopenharmony_ci continue; 435885b47fbSopenharmony_ci } 436885b47fbSopenharmony_ci AccessibilityWindowInfo tmpWindowInfo; 437885b47fbSopenharmony_ci UpdateAccessibilityWindowInfo(tmpWindowInfo, info); 438885b47fbSopenharmony_ci if (tmpWindowInfo.IsFocused()) { 439885b47fbSopenharmony_ci HILOG_DEBUG("set active windowId: %{public}d", tmpWindowInfo.GetWindowId()); 440885b47fbSopenharmony_ci tmpWindowInfo.SetActive(true); 441885b47fbSopenharmony_ci } 442885b47fbSopenharmony_ci windows.push_back(tmpWindowInfo); 443885b47fbSopenharmony_ci } 444885b47fbSopenharmony_ci return windows; 445885b47fbSopenharmony_ci} 446885b47fbSopenharmony_ci 447885b47fbSopenharmony_cibool AccessibilityWindowManager::GetAccessibilityWindow(int32_t windowId, AccessibilityWindowInfo &window) 448885b47fbSopenharmony_ci{ 449885b47fbSopenharmony_ci HILOG_DEBUG("start windowId(%{public}d)", windowId); 450885b47fbSopenharmony_ci XCollieHelper timer(TIMER_GET_ACCESSIBILITY_WINDOWS, WMS_TIMEOUT); 451885b47fbSopenharmony_ci std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_); 452885b47fbSopenharmony_ci std::vector<sptr<Rosen::AccessibilityWindowInfo>> windowInfos; 453885b47fbSopenharmony_ci Rosen::WMError err = OHOS::Rosen::WindowManager::GetInstance().GetAccessibilityWindowInfo(windowInfos); 454885b47fbSopenharmony_ci if (err != Rosen::WMError::WM_OK) { 455885b47fbSopenharmony_ci HILOG_ERROR("get window info from wms failed. err[%{public}d]", err); 456885b47fbSopenharmony_ci return false; 457885b47fbSopenharmony_ci } 458885b47fbSopenharmony_ci for (auto &info : windowInfos) { 459885b47fbSopenharmony_ci if (info == nullptr) { 460885b47fbSopenharmony_ci continue; 461885b47fbSopenharmony_ci } 462885b47fbSopenharmony_ci 463885b47fbSopenharmony_ci int32_t realWidId = GetRealWindowId(info); 464885b47fbSopenharmony_ci if (a11yWindows_.count(realWidId)) { 465885b47fbSopenharmony_ci UpdateAccessibilityWindowInfo(a11yWindows_[realWidId], info); 466885b47fbSopenharmony_ci } else { 467885b47fbSopenharmony_ci AccessibilityWindowInfo tmpWindowInfo; 468885b47fbSopenharmony_ci UpdateAccessibilityWindowInfo(tmpWindowInfo, info); 469885b47fbSopenharmony_ci a11yWindows_[realWidId] = tmpWindowInfo; 470885b47fbSopenharmony_ci } 471885b47fbSopenharmony_ci } 472885b47fbSopenharmony_ci if (a11yWindows_.count(windowId)) { 473885b47fbSopenharmony_ci window = a11yWindows_[windowId]; 474885b47fbSopenharmony_ci return true; 475885b47fbSopenharmony_ci } 476885b47fbSopenharmony_ci return false; 477885b47fbSopenharmony_ci} 478885b47fbSopenharmony_ci 479885b47fbSopenharmony_cibool AccessibilityWindowManager::IsValidWindow(int32_t windowId) 480885b47fbSopenharmony_ci{ 481885b47fbSopenharmony_ci HILOG_DEBUG("start windowId(%{public}d)", windowId); 482885b47fbSopenharmony_ci std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_); 483885b47fbSopenharmony_ci auto it = std::find_if(a11yWindows_.begin(), a11yWindows_.end(), 484885b47fbSopenharmony_ci [windowId](const std::map<int32_t, AccessibilityWindowInfo>::value_type &window) { 485885b47fbSopenharmony_ci return window.first == windowId; 486885b47fbSopenharmony_ci }); 487885b47fbSopenharmony_ci if (it == a11yWindows_.end()) { 488885b47fbSopenharmony_ci return false; 489885b47fbSopenharmony_ci } 490885b47fbSopenharmony_ci return true; 491885b47fbSopenharmony_ci} 492885b47fbSopenharmony_ci 493885b47fbSopenharmony_civoid AccessibilityWindowManager::SetWindowSize(int32_t windowId, Rect rect) 494885b47fbSopenharmony_ci{ 495885b47fbSopenharmony_ci HILOG_DEBUG("start windowId(%{public}d)", windowId); 496885b47fbSopenharmony_ci std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_); 497885b47fbSopenharmony_ci auto it = std::find_if(a11yWindows_.begin(), a11yWindows_.end(), 498885b47fbSopenharmony_ci [windowId](const std::map<int32_t, AccessibilityWindowInfo>::value_type &window) { 499885b47fbSopenharmony_ci return window.first == windowId; 500885b47fbSopenharmony_ci }); 501885b47fbSopenharmony_ci if (it != a11yWindows_.end()) { 502885b47fbSopenharmony_ci it->second.SetRectInScreen(rect); 503885b47fbSopenharmony_ci } 504885b47fbSopenharmony_ci} 505885b47fbSopenharmony_ci 506885b47fbSopenharmony_cibool AccessibilityWindowManager::CompareRect(const Rect &rectAccessibility, const Rosen::Rect &rectWindow) 507885b47fbSopenharmony_ci{ 508885b47fbSopenharmony_ci HILOG_DEBUG(); 509885b47fbSopenharmony_ci int32_t leftTopX_ = rectWindow.posX_; 510885b47fbSopenharmony_ci int32_t leftTopY_ = rectWindow.posY_; 511885b47fbSopenharmony_ci int32_t rightBottomX_ = 0; 512885b47fbSopenharmony_ci int32_t rightBottomY_ = 0; 513885b47fbSopenharmony_ci 514885b47fbSopenharmony_ci if (!CheckIntegerOverflow(rectWindow)) { 515885b47fbSopenharmony_ci rightBottomX_ = rectWindow.posX_; 516885b47fbSopenharmony_ci rightBottomY_ = rectWindow.posY_; 517885b47fbSopenharmony_ci } else { 518885b47fbSopenharmony_ci rightBottomX_ = rectWindow.posX_ + static_cast<int32_t>(rectWindow.width_); 519885b47fbSopenharmony_ci rightBottomY_ = rectWindow.posY_ + static_cast<int32_t>(rectWindow.height_); 520885b47fbSopenharmony_ci } 521885b47fbSopenharmony_ci 522885b47fbSopenharmony_ci if (rectAccessibility.GetLeftTopXScreenPostion() == leftTopX_ && 523885b47fbSopenharmony_ci rectAccessibility.GetLeftTopYScreenPostion() == leftTopY_ && 524885b47fbSopenharmony_ci rectAccessibility.GetRightBottomXScreenPostion() == rightBottomX_ && 525885b47fbSopenharmony_ci rectAccessibility.GetRightBottomYScreenPostion() == rightBottomY_) { 526885b47fbSopenharmony_ci HILOG_DEBUG("rect values are the same"); 527885b47fbSopenharmony_ci return false; 528885b47fbSopenharmony_ci } 529885b47fbSopenharmony_ci return true; 530885b47fbSopenharmony_ci} 531885b47fbSopenharmony_ci 532885b47fbSopenharmony_cibool AccessibilityWindowManager::EqualFocus(const Accessibility::AccessibilityWindowInfo &accWindowInfo, 533885b47fbSopenharmony_ci const sptr<Rosen::AccessibilityWindowInfo> &windowInfo) 534885b47fbSopenharmony_ci{ 535885b47fbSopenharmony_ci HILOG_DEBUG(); 536885b47fbSopenharmony_ci if (accWindowInfo.IsFocused() == windowInfo->focused_) { 537885b47fbSopenharmony_ci HILOG_DEBUG("focus values are the same"); 538885b47fbSopenharmony_ci return false; 539885b47fbSopenharmony_ci } 540885b47fbSopenharmony_ci return true; 541885b47fbSopenharmony_ci} 542885b47fbSopenharmony_ci 543885b47fbSopenharmony_cibool AccessibilityWindowManager::EqualBound(const Accessibility::AccessibilityWindowInfo &accWindowInfo, 544885b47fbSopenharmony_ci const sptr<Rosen::AccessibilityWindowInfo> &windowInfo) 545885b47fbSopenharmony_ci{ 546885b47fbSopenharmony_ci HILOG_DEBUG(); 547885b47fbSopenharmony_ci if (static_cast<int32_t>(windowInfo->type_) == 1 && (static_cast<int32_t>(windowInfo->windowRect_.width_) == 0 || 548885b47fbSopenharmony_ci static_cast<int32_t>(windowInfo->windowRect_.height_) == 0)) { 549885b47fbSopenharmony_ci HILOG_ERROR("invalid window parameters, windowId(%{public}d), posX(%{public}d, posY(%{public}d))", 550885b47fbSopenharmony_ci windowInfo->wid_, windowInfo->windowRect_.posX_, windowInfo->windowRect_.posY_); 551885b47fbSopenharmony_ci return false; 552885b47fbSopenharmony_ci } 553885b47fbSopenharmony_ci return CompareRect(accWindowInfo.GetRectInScreen(), windowInfo->windowRect_); 554885b47fbSopenharmony_ci} 555885b47fbSopenharmony_ci 556885b47fbSopenharmony_cibool AccessibilityWindowManager::EqualProperty(Accessibility::AccessibilityWindowInfo &accWindowInfo, 557885b47fbSopenharmony_ci const sptr<Rosen::AccessibilityWindowInfo> &windowInfo) 558885b47fbSopenharmony_ci{ 559885b47fbSopenharmony_ci HILOG_DEBUG(); 560885b47fbSopenharmony_ci std::ostringstream accInfoStr; 561885b47fbSopenharmony_ci std::ostringstream winInfoStr; 562885b47fbSopenharmony_ci 563885b47fbSopenharmony_ci accInfoStr << accWindowInfo.GetWindowMode() 564885b47fbSopenharmony_ci << accWindowInfo.GetWindowLayer() 565885b47fbSopenharmony_ci << accWindowInfo.IsDecorEnable() 566885b47fbSopenharmony_ci << accWindowInfo.GetWindowType() 567885b47fbSopenharmony_ci << accWindowInfo.GetDisplayId() 568885b47fbSopenharmony_ci << accWindowInfo.GetScaleVal() 569885b47fbSopenharmony_ci << accWindowInfo.GetScaleX() 570885b47fbSopenharmony_ci << accWindowInfo.GetScaleY(); 571885b47fbSopenharmony_ci HILOG_DEBUG("Create accinfoStr windowMode_[%{public}d] Layer_[%{public}d] isDecorEnable_[%{public}d]" 572885b47fbSopenharmony_ci "windowType_[%{public}d] displayId:%{public}" PRIu64 " get scaleVal_ [%{public}f]" 573885b47fbSopenharmony_ci "get scaleX_ [%{public}f] get scaleY_ [%{public}f]", 574885b47fbSopenharmony_ci accWindowInfo.GetWindowMode(), accWindowInfo.GetWindowLayer(), accWindowInfo.IsDecorEnable(), 575885b47fbSopenharmony_ci accWindowInfo.GetWindowType(), accWindowInfo.GetDisplayId(), accWindowInfo.GetScaleVal(), 576885b47fbSopenharmony_ci accWindowInfo.GetScaleX(), accWindowInfo.GetScaleY()); 577885b47fbSopenharmony_ci 578885b47fbSopenharmony_ci winInfoStr << static_cast<uint32_t>(windowInfo->mode_) 579885b47fbSopenharmony_ci << windowInfo->layer_ 580885b47fbSopenharmony_ci << windowInfo->isDecorEnable_ 581885b47fbSopenharmony_ci << static_cast<uint32_t>(windowInfo->type_) 582885b47fbSopenharmony_ci << windowInfo->displayId_ 583885b47fbSopenharmony_ci << windowInfo->scaleVal_ 584885b47fbSopenharmony_ci << windowInfo->scaleX_ 585885b47fbSopenharmony_ci << windowInfo->scaleY_; 586885b47fbSopenharmony_ci HILOG_DEBUG("Create wininfoStr Mode_[%{public}d] Layer_[%{public}d] isDecorEnable_[%{public}d]" 587885b47fbSopenharmony_ci "Type_[%{public}d] displayId:%{public}" PRIu64 " scaleVal_ [%{public}f]" 588885b47fbSopenharmony_ci "scaleX_ [%{public}f] scaleY_ [%{public}f]", 589885b47fbSopenharmony_ci static_cast<uint32_t>(windowInfo->mode_), windowInfo->layer_, windowInfo->isDecorEnable_, 590885b47fbSopenharmony_ci static_cast<uint32_t>(windowInfo->type_), windowInfo->displayId_, windowInfo->scaleVal_, 591885b47fbSopenharmony_ci windowInfo->scaleX_, windowInfo->scaleY_); 592885b47fbSopenharmony_ci 593885b47fbSopenharmony_ci if (accInfoStr.str() != winInfoStr.str() || 594885b47fbSopenharmony_ci windowInfo->touchHotAreas_.size() != accWindowInfo.GetTouchHotAreas().size()) { 595885b47fbSopenharmony_ci HILOG_DEBUG("Property different"); 596885b47fbSopenharmony_ci return true; 597885b47fbSopenharmony_ci } 598885b47fbSopenharmony_ci for (uint32_t i = 0; i < accWindowInfo.GetTouchHotAreas().size(); i++) { 599885b47fbSopenharmony_ci if (CompareRect(accWindowInfo.GetTouchHotAreas()[i], windowInfo->touchHotAreas_[i])) { 600885b47fbSopenharmony_ci HILOG_DEBUG("touchHotAreas different"); 601885b47fbSopenharmony_ci return true; 602885b47fbSopenharmony_ci } 603885b47fbSopenharmony_ci } 604885b47fbSopenharmony_ci return false; 605885b47fbSopenharmony_ci} 606885b47fbSopenharmony_ci 607885b47fbSopenharmony_civoid AccessibilityWindowManager::WindowUpdateAdded(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos) 608885b47fbSopenharmony_ci{ 609885b47fbSopenharmony_ci HILOG_DEBUG(); 610885b47fbSopenharmony_ci std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_); 611885b47fbSopenharmony_ci for (auto &windowInfo : infos) { 612885b47fbSopenharmony_ci if (!windowInfo) { 613885b47fbSopenharmony_ci HILOG_ERROR("invalid windowInfo"); 614885b47fbSopenharmony_ci return; 615885b47fbSopenharmony_ci } 616885b47fbSopenharmony_ci 617885b47fbSopenharmony_ci int32_t realWidId = GetRealWindowId(windowInfo); 618885b47fbSopenharmony_ci if (!a11yWindows_.count(realWidId)) { 619885b47fbSopenharmony_ci auto a11yWindowInfoAdded = CreateAccessibilityWindowInfo(windowInfo); 620885b47fbSopenharmony_ci a11yWindows_.emplace(realWidId, a11yWindowInfoAdded); 621885b47fbSopenharmony_ci } else { 622885b47fbSopenharmony_ci UpdateAccessibilityWindowInfo(a11yWindows_[realWidId], windowInfo); 623885b47fbSopenharmony_ci } 624885b47fbSopenharmony_ci 625885b47fbSopenharmony_ci if (IsSceneBoard(windowInfo)) { 626885b47fbSopenharmony_ci subWindows_.insert(realWidId); 627885b47fbSopenharmony_ci sceneBoardElementIdMap_.InsertPair(realWidId, windowInfo->uiNodeId_); 628885b47fbSopenharmony_ci } 629885b47fbSopenharmony_ci AccessibilityEventInfo evtInfAdded(realWidId, WINDOW_UPDATE_ADDED); 630885b47fbSopenharmony_ci Singleton<AccessibleAbilityManagerService>::GetInstance().SendEvent(evtInfAdded); 631885b47fbSopenharmony_ci if (a11yWindows_[realWidId].IsFocused()) { 632885b47fbSopenharmony_ci SetActiveWindow(realWidId); 633885b47fbSopenharmony_ci } 634885b47fbSopenharmony_ci } 635885b47fbSopenharmony_ci} 636885b47fbSopenharmony_ci 637885b47fbSopenharmony_civoid AccessibilityWindowManager::WindowUpdateRemoved(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos) 638885b47fbSopenharmony_ci{ 639885b47fbSopenharmony_ci HILOG_DEBUG(); 640885b47fbSopenharmony_ci std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_); 641885b47fbSopenharmony_ci auto &aams = Singleton<AccessibleAbilityManagerService>::GetInstance(); 642885b47fbSopenharmony_ci for (auto &windowInfo : infos) { 643885b47fbSopenharmony_ci if (!windowInfo) { 644885b47fbSopenharmony_ci HILOG_ERROR("invalid windowInfo"); 645885b47fbSopenharmony_ci return; 646885b47fbSopenharmony_ci } 647885b47fbSopenharmony_ci 648885b47fbSopenharmony_ci int32_t realWidId = GetRealWindowId(windowInfo); 649885b47fbSopenharmony_ci if (!a11yWindows_.count(realWidId)) { 650885b47fbSopenharmony_ci return; 651885b47fbSopenharmony_ci } 652885b47fbSopenharmony_ci if (realWidId == activeWindowId_) { 653885b47fbSopenharmony_ci SetActiveWindow(INVALID_WINDOW_ID); 654885b47fbSopenharmony_ci } 655885b47fbSopenharmony_ci if (realWidId == a11yFocusedWindowId_) { 656885b47fbSopenharmony_ci SetAccessibilityFocusedWindow(INVALID_WINDOW_ID); 657885b47fbSopenharmony_ci } 658885b47fbSopenharmony_ci a11yWindows_.erase(realWidId); 659885b47fbSopenharmony_ci subWindows_.erase(realWidId); 660885b47fbSopenharmony_ci sceneBoardElementIdMap_.RemovePair(realWidId); 661885b47fbSopenharmony_ci AccessibilityEventInfo evtInfRemoved(realWidId, WINDOW_UPDATE_REMOVED); 662885b47fbSopenharmony_ci aams.SendEvent(evtInfRemoved); 663885b47fbSopenharmony_ci } 664885b47fbSopenharmony_ci} 665885b47fbSopenharmony_ci 666885b47fbSopenharmony_civoid AccessibilityWindowManager::WindowUpdateFocused(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos) 667885b47fbSopenharmony_ci{ 668885b47fbSopenharmony_ci HILOG_DEBUG(); 669885b47fbSopenharmony_ci std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_); 670885b47fbSopenharmony_ci auto &aams = Singleton<AccessibleAbilityManagerService>::GetInstance(); 671885b47fbSopenharmony_ci for (auto &windowInfo : infos) { 672885b47fbSopenharmony_ci if (!windowInfo) { 673885b47fbSopenharmony_ci HILOG_ERROR("invalid windowInfo"); 674885b47fbSopenharmony_ci return; 675885b47fbSopenharmony_ci } 676885b47fbSopenharmony_ci 677885b47fbSopenharmony_ci int32_t realWidId = GetRealWindowId(windowInfo); 678885b47fbSopenharmony_ci if (!a11yWindows_.count(realWidId)) { 679885b47fbSopenharmony_ci HILOG_DEBUG("window not created"); 680885b47fbSopenharmony_ci auto a11yWindowInfoFocused = CreateAccessibilityWindowInfo(windowInfo); 681885b47fbSopenharmony_ci a11yWindows_.emplace(realWidId, a11yWindowInfoFocused); 682885b47fbSopenharmony_ci } 683885b47fbSopenharmony_ci 684885b47fbSopenharmony_ci if (IsSceneBoard(windowInfo)) { 685885b47fbSopenharmony_ci subWindows_.insert(realWidId); 686885b47fbSopenharmony_ci sceneBoardElementIdMap_.InsertPair(realWidId, windowInfo->uiNodeId_); 687885b47fbSopenharmony_ci } 688885b47fbSopenharmony_ci SetActiveWindow(realWidId); 689885b47fbSopenharmony_ci AccessibilityEventInfo evtInfFocused(realWidId, WINDOW_UPDATE_FOCUSED); 690885b47fbSopenharmony_ci aams.SendEvent(evtInfFocused); 691885b47fbSopenharmony_ci } 692885b47fbSopenharmony_ci} 693885b47fbSopenharmony_ci 694885b47fbSopenharmony_civoid AccessibilityWindowManager::WindowUpdateBounds(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos) 695885b47fbSopenharmony_ci{ 696885b47fbSopenharmony_ci HILOG_DEBUG(); 697885b47fbSopenharmony_ci std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_); 698885b47fbSopenharmony_ci auto &aams = Singleton<AccessibleAbilityManagerService>::GetInstance(); 699885b47fbSopenharmony_ci for (auto &windowInfo : infos) { 700885b47fbSopenharmony_ci if (!windowInfo) { 701885b47fbSopenharmony_ci HILOG_ERROR("invalid windowInfo"); 702885b47fbSopenharmony_ci return; 703885b47fbSopenharmony_ci } 704885b47fbSopenharmony_ci 705885b47fbSopenharmony_ci int32_t realWidId = GetRealWindowId(windowInfo); 706885b47fbSopenharmony_ci if (a11yWindows_.count(realWidId)) { 707885b47fbSopenharmony_ci UpdateAccessibilityWindowInfo(a11yWindows_[realWidId], windowInfo); 708885b47fbSopenharmony_ci } 709885b47fbSopenharmony_ci 710885b47fbSopenharmony_ci AccessibilityEventInfo evtInfBounds(realWidId, WINDOW_UPDATE_BOUNDS); 711885b47fbSopenharmony_ci aams.SendEvent(evtInfBounds); 712885b47fbSopenharmony_ci } 713885b47fbSopenharmony_ci} 714885b47fbSopenharmony_ci 715885b47fbSopenharmony_civoid AccessibilityWindowManager::WindowUpdateActive(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos) 716885b47fbSopenharmony_ci{ 717885b47fbSopenharmony_ci HILOG_DEBUG(); 718885b47fbSopenharmony_ci std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_); 719885b47fbSopenharmony_ci for (auto &windowInfo : infos) { 720885b47fbSopenharmony_ci if (!windowInfo) { 721885b47fbSopenharmony_ci HILOG_ERROR("invalid windowInfo"); 722885b47fbSopenharmony_ci return; 723885b47fbSopenharmony_ci } 724885b47fbSopenharmony_ci 725885b47fbSopenharmony_ci int32_t realWidId = GetRealWindowId(windowInfo); 726885b47fbSopenharmony_ci if (!a11yWindows_.count(realWidId)) { 727885b47fbSopenharmony_ci auto a11yWindowInfoActive = CreateAccessibilityWindowInfo(windowInfo); 728885b47fbSopenharmony_ci a11yWindows_.emplace(realWidId, a11yWindowInfoActive); 729885b47fbSopenharmony_ci } 730885b47fbSopenharmony_ci 731885b47fbSopenharmony_ci if (IsSceneBoard(windowInfo)) { 732885b47fbSopenharmony_ci subWindows_.insert(realWidId); 733885b47fbSopenharmony_ci sceneBoardElementIdMap_.InsertPair(realWidId, windowInfo->uiNodeId_); 734885b47fbSopenharmony_ci } 735885b47fbSopenharmony_ci SetActiveWindow(realWidId); 736885b47fbSopenharmony_ci } 737885b47fbSopenharmony_ci} 738885b47fbSopenharmony_ci 739885b47fbSopenharmony_civoid AccessibilityWindowManager::WindowUpdateProperty(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos) 740885b47fbSopenharmony_ci{ 741885b47fbSopenharmony_ci HILOG_DEBUG(); 742885b47fbSopenharmony_ci std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_); 743885b47fbSopenharmony_ci auto &aams = Singleton<AccessibleAbilityManagerService>::GetInstance(); 744885b47fbSopenharmony_ci for (auto &windowInfo : infos) { 745885b47fbSopenharmony_ci if (!windowInfo) { 746885b47fbSopenharmony_ci HILOG_ERROR("invalid windowInfo"); 747885b47fbSopenharmony_ci return; 748885b47fbSopenharmony_ci } 749885b47fbSopenharmony_ci 750885b47fbSopenharmony_ci int32_t realWidId = GetRealWindowId(windowInfo); 751885b47fbSopenharmony_ci if (a11yWindows_.count(realWidId)) { 752885b47fbSopenharmony_ci UpdateAccessibilityWindowInfo(a11yWindows_[realWidId], windowInfo); 753885b47fbSopenharmony_ci } 754885b47fbSopenharmony_ci AccessibilityEventInfo evtInfProperty(realWidId, WINDOW_UPDATE_PROPERTY); 755885b47fbSopenharmony_ci aams.SendEvent(evtInfProperty); 756885b47fbSopenharmony_ci } 757885b47fbSopenharmony_ci} 758885b47fbSopenharmony_ci 759885b47fbSopenharmony_civoid AccessibilityWindowManager::WindowUpdateTypeEvent(const int32_t realWidId, Accessibility::WindowUpdateType type) 760885b47fbSopenharmony_ci{ 761885b47fbSopenharmony_ci HILOG_DEBUG(); 762885b47fbSopenharmony_ci std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_); 763885b47fbSopenharmony_ci HILOG_DEBUG("WindowUpdateType type[%{public}d]", type); 764885b47fbSopenharmony_ci auto &aams = Singleton<AccessibleAbilityManagerService>::GetInstance(); 765885b47fbSopenharmony_ci switch (type) { 766885b47fbSopenharmony_ci case WindowUpdateType::WINDOW_UPDATE_ADDED: { 767885b47fbSopenharmony_ci AccessibilityEventInfo evtInfAdded(realWidId, WINDOW_UPDATE_ADDED); 768885b47fbSopenharmony_ci Singleton<AccessibleAbilityManagerService>::GetInstance().SendEvent(evtInfAdded); 769885b47fbSopenharmony_ci if (a11yWindows_[realWidId].IsFocused()) { 770885b47fbSopenharmony_ci SetActiveWindow(realWidId); 771885b47fbSopenharmony_ci } 772885b47fbSopenharmony_ci break; 773885b47fbSopenharmony_ci } 774885b47fbSopenharmony_ci case WindowUpdateType::WINDOW_UPDATE_REMOVED: { 775885b47fbSopenharmony_ci if (realWidId == activeWindowId_) { 776885b47fbSopenharmony_ci SetActiveWindow(INVALID_WINDOW_ID); 777885b47fbSopenharmony_ci } 778885b47fbSopenharmony_ci if (realWidId == a11yFocusedWindowId_) { 779885b47fbSopenharmony_ci SetAccessibilityFocusedWindow(INVALID_WINDOW_ID); 780885b47fbSopenharmony_ci } 781885b47fbSopenharmony_ci 782885b47fbSopenharmony_ci AccessibilityEventInfo evtInfRemoved(realWidId, WINDOW_UPDATE_REMOVED); 783885b47fbSopenharmony_ci aams.SendEvent(evtInfRemoved); 784885b47fbSopenharmony_ci break; 785885b47fbSopenharmony_ci } 786885b47fbSopenharmony_ci case WindowUpdateType::WINDOW_UPDATE_BOUNDS: { 787885b47fbSopenharmony_ci AccessibilityEventInfo evtInfBounds(realWidId, WINDOW_UPDATE_BOUNDS); 788885b47fbSopenharmony_ci aams.SendEvent(evtInfBounds); 789885b47fbSopenharmony_ci break; 790885b47fbSopenharmony_ci } 791885b47fbSopenharmony_ci case WindowUpdateType::WINDOW_UPDATE_FOCUSED: { 792885b47fbSopenharmony_ci SetActiveWindow(realWidId); 793885b47fbSopenharmony_ci AccessibilityEventInfo evtInfFocused(realWidId, WINDOW_UPDATE_FOCUSED); 794885b47fbSopenharmony_ci aams.SendEvent(evtInfFocused); 795885b47fbSopenharmony_ci break; 796885b47fbSopenharmony_ci } 797885b47fbSopenharmony_ci case WindowUpdateType::WINDOW_UPDATE_PROPERTY: { 798885b47fbSopenharmony_ci AccessibilityEventInfo evtInfProperty(realWidId, WINDOW_UPDATE_PROPERTY); 799885b47fbSopenharmony_ci aams.SendEvent(evtInfProperty); 800885b47fbSopenharmony_ci break; 801885b47fbSopenharmony_ci } 802885b47fbSopenharmony_ci default: 803885b47fbSopenharmony_ci break; 804885b47fbSopenharmony_ci } 805885b47fbSopenharmony_ci} 806885b47fbSopenharmony_ci 807885b47fbSopenharmony_civoid AccessibilityWindowManager::WindowUpdateAll(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos) 808885b47fbSopenharmony_ci{ 809885b47fbSopenharmony_ci HILOG_DEBUG(); 810885b47fbSopenharmony_ci std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_); 811885b47fbSopenharmony_ci auto oldA11yWindows_ = a11yWindows_; 812885b47fbSopenharmony_ci HILOG_DEBUG("WindowUpdateAll info size(%{public}zu), oldA11yWindows_ size(%{public}zu)", 813885b47fbSopenharmony_ci infos.size(), oldA11yWindows_.size()); 814885b47fbSopenharmony_ci WinDeInit(); 815885b47fbSopenharmony_ci for (auto &window : infos) { 816885b47fbSopenharmony_ci if (window == nullptr) { 817885b47fbSopenharmony_ci HILOG_ERROR("window is nullptr"); 818885b47fbSopenharmony_ci continue; 819885b47fbSopenharmony_ci } 820885b47fbSopenharmony_ci int32_t realWid = GetRealWindowId(window); 821885b47fbSopenharmony_ci HILOG_DEBUG("windowInfo wid: %{public}d, innerWid: %{public}d, focused: %{public}d", 822885b47fbSopenharmony_ci window->wid_, window->innerWid_, window->focused_); 823885b47fbSopenharmony_ci if (!a11yWindows_.count(realWid)) { 824885b47fbSopenharmony_ci auto a11yWindowInfo = CreateAccessibilityWindowInfo(window); 825885b47fbSopenharmony_ci a11yWindows_.emplace(realWid, a11yWindowInfo); 826885b47fbSopenharmony_ci HILOG_DEBUG("WindowUpdateAll a11yWindowInfo size(%{public}s)", a11yWindowInfo.GetBundleName().c_str()); 827885b47fbSopenharmony_ci } 828885b47fbSopenharmony_ci if (IsSceneBoard(window)) { 829885b47fbSopenharmony_ci subWindows_.insert(realWid); 830885b47fbSopenharmony_ci sceneBoardElementIdMap_.InsertPair(realWid, window->uiNodeId_); 831885b47fbSopenharmony_ci } 832885b47fbSopenharmony_ci 833885b47fbSopenharmony_ci if (window->focused_) { 834885b47fbSopenharmony_ci SetActiveWindow(realWid); 835885b47fbSopenharmony_ci } 836885b47fbSopenharmony_ci 837885b47fbSopenharmony_ci if (!oldA11yWindows_.count(realWid)) { 838885b47fbSopenharmony_ci WindowUpdateTypeEvent(realWid, WINDOW_UPDATE_ADDED); 839885b47fbSopenharmony_ci } else { 840885b47fbSopenharmony_ci if (EqualFocus(oldA11yWindows_[realWid], window)) { 841885b47fbSopenharmony_ci WindowUpdateTypeEvent(realWid, WINDOW_UPDATE_FOCUSED); 842885b47fbSopenharmony_ci } 843885b47fbSopenharmony_ci if (EqualBound(oldA11yWindows_[realWid], window)) { 844885b47fbSopenharmony_ci WindowUpdateTypeEvent(realWid, WINDOW_UPDATE_BOUNDS); 845885b47fbSopenharmony_ci } 846885b47fbSopenharmony_ci if (EqualProperty(oldA11yWindows_[realWid], window)) { 847885b47fbSopenharmony_ci WindowUpdateTypeEvent(realWid, WINDOW_UPDATE_PROPERTY); 848885b47fbSopenharmony_ci } 849885b47fbSopenharmony_ci auto itr = oldA11yWindows_.find(realWid); 850885b47fbSopenharmony_ci if (itr != oldA11yWindows_.end()) { 851885b47fbSopenharmony_ci oldA11yWindows_.erase(itr); 852885b47fbSopenharmony_ci } 853885b47fbSopenharmony_ci } 854885b47fbSopenharmony_ci } 855885b47fbSopenharmony_ci 856885b47fbSopenharmony_ci for (auto it = oldA11yWindows_.begin(); it != oldA11yWindows_.end(); ++it) { 857885b47fbSopenharmony_ci WindowUpdateTypeEvent(it->first, WINDOW_UPDATE_REMOVED); 858885b47fbSopenharmony_ci } 859885b47fbSopenharmony_ci HILOG_DEBUG("WindowUpdateAll a11yWindowInfo_ size(%{public}zu)", a11yWindows_.size()); 860885b47fbSopenharmony_ci} 861885b47fbSopenharmony_ci 862885b47fbSopenharmony_civoid AccessibilityWindowManager::ClearOldActiveWindow() 863885b47fbSopenharmony_ci{ 864885b47fbSopenharmony_ci HILOG_DEBUG("active window id is %{public}d", activeWindowId_); 865885b47fbSopenharmony_ci std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_); 866885b47fbSopenharmony_ci if (activeWindowId_ == INVALID_WINDOW_ID) { 867885b47fbSopenharmony_ci HILOG_DEBUG("active window id is invalid"); 868885b47fbSopenharmony_ci return; 869885b47fbSopenharmony_ci } 870885b47fbSopenharmony_ci 871885b47fbSopenharmony_ci if (a11yWindows_.count(activeWindowId_)) { 872885b47fbSopenharmony_ci a11yWindows_[activeWindowId_].SetActive(false); 873885b47fbSopenharmony_ci } 874885b47fbSopenharmony_ci if (activeWindowId_ == a11yFocusedWindowId_) { 875885b47fbSopenharmony_ci HILOG_DEBUG("Old active window is a11yFocused window."); 876885b47fbSopenharmony_ci SetAccessibilityFocusedWindow(INVALID_WINDOW_ID); 877885b47fbSopenharmony_ci } 878885b47fbSopenharmony_ci} 879885b47fbSopenharmony_ci 880885b47fbSopenharmony_civoid AccessibilityWindowManager::ClearAccessibilityFocused() 881885b47fbSopenharmony_ci{ 882885b47fbSopenharmony_ci HILOG_DEBUG("a11yFocused window id is %{public}d", a11yFocusedWindowId_); 883885b47fbSopenharmony_ci std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_); 884885b47fbSopenharmony_ci if (a11yFocusedWindowId_ == INVALID_WINDOW_ID) { 885885b47fbSopenharmony_ci HILOG_DEBUG("a11yFocused window id is invalid"); 886885b47fbSopenharmony_ci return; 887885b47fbSopenharmony_ci } 888885b47fbSopenharmony_ci 889885b47fbSopenharmony_ci if (a11yWindows_.count(a11yFocusedWindowId_)) { 890885b47fbSopenharmony_ci a11yWindows_[a11yFocusedWindowId_].SetAccessibilityFocused(false); 891885b47fbSopenharmony_ci } 892885b47fbSopenharmony_ci 893885b47fbSopenharmony_ci int32_t windowId = a11yFocusedWindowId_; 894885b47fbSopenharmony_ci if (subWindows_.count(a11yFocusedWindowId_)) { 895885b47fbSopenharmony_ci windowId = SCENE_BOARD_WINDOW_ID; 896885b47fbSopenharmony_ci } 897885b47fbSopenharmony_ci sptr<AccessibilityAccountData> accountData = 898885b47fbSopenharmony_ci Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData(); 899885b47fbSopenharmony_ci if (!accountData) { 900885b47fbSopenharmony_ci HILOG_ERROR("accountData is nullptr"); 901885b47fbSopenharmony_ci return; 902885b47fbSopenharmony_ci } 903885b47fbSopenharmony_ci sptr<AccessibilityWindowConnection> connection = 904885b47fbSopenharmony_ci accountData->GetAccessibilityWindowConnection(windowId); 905885b47fbSopenharmony_ci if (!connection) { 906885b47fbSopenharmony_ci HILOG_ERROR("windowId[%{public}d] has no connection", windowId); 907885b47fbSopenharmony_ci return; 908885b47fbSopenharmony_ci } 909885b47fbSopenharmony_ci if (!connection->GetProxy()) { 910885b47fbSopenharmony_ci HILOG_ERROR("windowId[%{public}d] has no proxy", windowId); 911885b47fbSopenharmony_ci return; 912885b47fbSopenharmony_ci } 913885b47fbSopenharmony_ci connection->GetProxy()->ClearFocus(); 914885b47fbSopenharmony_ci 915885b47fbSopenharmony_ci // Send event 916885b47fbSopenharmony_ci AccessibilityEventInfo eventInfo(TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED_EVENT); 917885b47fbSopenharmony_ci eventInfo.SetWindowId(a11yFocusedWindowId_); 918885b47fbSopenharmony_ci Singleton<AccessibleAbilityManagerService>::GetInstance().SendEvent(eventInfo); 919885b47fbSopenharmony_ci} 920885b47fbSopenharmony_ci 921885b47fbSopenharmony_ciint64_t AccessibilityWindowManager::GetSceneBoardElementId(const int32_t windowId, const int64_t elementId) 922885b47fbSopenharmony_ci{ 923885b47fbSopenharmony_ci std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_); 924885b47fbSopenharmony_ci if (elementId != INVALID_SCENE_BOARD_ELEMENT_ID) { 925885b47fbSopenharmony_ci return elementId; 926885b47fbSopenharmony_ci } 927885b47fbSopenharmony_ci if (subWindows_.count(windowId)) { 928885b47fbSopenharmony_ci auto iter = a11yWindows_.find(windowId); 929885b47fbSopenharmony_ci if (iter != a11yWindows_.end()) { 930885b47fbSopenharmony_ci HILOG_DEBUG("GetSceneBoardElementId [%{public}" PRId64 "]", iter->second.GetUiNodeId()); 931885b47fbSopenharmony_ci return iter->second.GetUiNodeId(); 932885b47fbSopenharmony_ci } 933885b47fbSopenharmony_ci } 934885b47fbSopenharmony_ci return elementId; 935885b47fbSopenharmony_ci} 936885b47fbSopenharmony_ci 937885b47fbSopenharmony_civoid AccessibilityWindowManager::GetRealWindowAndElementId(int32_t& windowId, int64_t& elementId) 938885b47fbSopenharmony_ci{ 939885b47fbSopenharmony_ci // sceneboard window id, element id is not equal -1 940885b47fbSopenharmony_ci std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_); 941885b47fbSopenharmony_ci if (subWindows_.count(windowId) && elementId != INVALID_SCENE_BOARD_ELEMENT_ID) { 942885b47fbSopenharmony_ci windowId = SCENE_BOARD_WINDOW_ID; 943885b47fbSopenharmony_ci HILOG_INFO("windowId %{public}d, elementId %{public}" PRId64 "", windowId, elementId); 944885b47fbSopenharmony_ci return; 945885b47fbSopenharmony_ci } 946885b47fbSopenharmony_ci 947885b47fbSopenharmony_ci if (elementId != INVALID_SCENE_BOARD_ELEMENT_ID) { 948885b47fbSopenharmony_ci return; 949885b47fbSopenharmony_ci } 950885b47fbSopenharmony_ci 951885b47fbSopenharmony_ci if (subWindows_.count(windowId)) { 952885b47fbSopenharmony_ci auto iter = a11yWindows_.find(windowId); 953885b47fbSopenharmony_ci if (iter != a11yWindows_.end()) { 954885b47fbSopenharmony_ci HILOG_DEBUG("GetRealWindowAndElementId [%{public}" PRId64 "]", iter->second.GetUiNodeId()); 955885b47fbSopenharmony_ci windowId = SCENE_BOARD_WINDOW_ID; 956885b47fbSopenharmony_ci elementId = iter->second.GetUiNodeId(); 957885b47fbSopenharmony_ci return; 958885b47fbSopenharmony_ci } 959885b47fbSopenharmony_ci } 960885b47fbSopenharmony_ci} 961885b47fbSopenharmony_ci 962885b47fbSopenharmony_civoid AccessibilityWindowManager::GetSceneBoardInnerWinId(int32_t windowId, int64_t elementId, 963885b47fbSopenharmony_ci int32_t& innerWid) 964885b47fbSopenharmony_ci{ 965885b47fbSopenharmony_ci std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_); 966885b47fbSopenharmony_ci if (windowId != SCENE_BOARD_WINDOW_ID) { 967885b47fbSopenharmony_ci return; 968885b47fbSopenharmony_ci } 969885b47fbSopenharmony_ci 970885b47fbSopenharmony_ci for (auto iter = a11yWindows_.begin(); iter != a11yWindows_.end(); iter++) { 971885b47fbSopenharmony_ci if (iter->second.GetUiNodeId() == elementId) { 972885b47fbSopenharmony_ci innerWid = iter->second.GetInnerWid(); 973885b47fbSopenharmony_ci } 974885b47fbSopenharmony_ci } 975885b47fbSopenharmony_ci 976885b47fbSopenharmony_ci return; 977885b47fbSopenharmony_ci} 978885b47fbSopenharmony_ci 979885b47fbSopenharmony_civoid AccessibilityWindowManager::SceneBoardElementIdMap::InsertPair(const int32_t windowId, const int64_t elementId) 980885b47fbSopenharmony_ci{ 981885b47fbSopenharmony_ci std::lock_guard<ffrt::mutex> lock(mapMutex_); 982885b47fbSopenharmony_ci windowElementMap_[windowId] = elementId; 983885b47fbSopenharmony_ci} 984885b47fbSopenharmony_ci 985885b47fbSopenharmony_civoid AccessibilityWindowManager::SceneBoardElementIdMap::RemovePair(const int32_t windowId) 986885b47fbSopenharmony_ci{ 987885b47fbSopenharmony_ci std::lock_guard<ffrt::mutex> lock(mapMutex_); 988885b47fbSopenharmony_ci windowElementMap_.erase(windowId); 989885b47fbSopenharmony_ci} 990885b47fbSopenharmony_ci 991885b47fbSopenharmony_cibool AccessibilityWindowManager::SceneBoardElementIdMap::CheckWindowIdPair(const int32_t windowId) 992885b47fbSopenharmony_ci{ 993885b47fbSopenharmony_ci std::lock_guard<ffrt::mutex> lock(mapMutex_); 994885b47fbSopenharmony_ci return windowElementMap_.count(windowId); 995885b47fbSopenharmony_ci} 996885b47fbSopenharmony_ci 997885b47fbSopenharmony_civoid AccessibilityWindowManager::SceneBoardElementIdMap::Clear() 998885b47fbSopenharmony_ci{ 999885b47fbSopenharmony_ci std::lock_guard<ffrt::mutex> lock(mapMutex_); 1000885b47fbSopenharmony_ci windowElementMap_.clear(); 1001885b47fbSopenharmony_ci} 1002885b47fbSopenharmony_ci 1003885b47fbSopenharmony_cistd::map<int32_t, int64_t> AccessibilityWindowManager::SceneBoardElementIdMap::GetAllPairs() 1004885b47fbSopenharmony_ci{ 1005885b47fbSopenharmony_ci std::lock_guard<ffrt::mutex> lock(mapMutex_); 1006885b47fbSopenharmony_ci return windowElementMap_; 1007885b47fbSopenharmony_ci} 1008885b47fbSopenharmony_ci 1009885b47fbSopenharmony_ciRetError AccessibilityWindowManager::GetFocusedWindowId(int32_t &focusedWindowId) 1010885b47fbSopenharmony_ci{ 1011885b47fbSopenharmony_ci HILOG_DEBUG(); 1012885b47fbSopenharmony_ci#ifdef OHOS_BUILD_ENABLE_HITRACE 1013885b47fbSopenharmony_ci HITRACE_METER_NAME(HITRACE_TAG_ACCESSIBILITY_MANAGER, "QueryFocusedWindowInfo"); 1014885b47fbSopenharmony_ci#endif // OHOS_BUILD_ENABLE_HITRACE 1015885b47fbSopenharmony_ci Rosen::FocusChangeInfo focusedWindowInfo; 1016885b47fbSopenharmony_ci OHOS::Rosen::WindowManager::GetInstance().GetFocusWindowInfo(focusedWindowInfo); 1017885b47fbSopenharmony_ci if (focusedWindowInfo.windowId_ == INVALID_WINDOW_ID) { 1018885b47fbSopenharmony_ci return RET_ERR_INVALID_PARAM; 1019885b47fbSopenharmony_ci } 1020885b47fbSopenharmony_ci focusedWindowId = focusedWindowInfo.windowId_; 1021885b47fbSopenharmony_ci return RET_OK; 1022885b47fbSopenharmony_ci} 1023885b47fbSopenharmony_ci 1024885b47fbSopenharmony_cibool AccessibilityWindowManager::IsInnerWindowRootElement(int64_t elementId) 1025885b47fbSopenharmony_ci{ 1026885b47fbSopenharmony_ci HILOG_DEBUG("IsInnerWindowRootElement elementId: %{public}" PRId64 "", elementId); 1027885b47fbSopenharmony_ci auto mapTable = sceneBoardElementIdMap_.GetAllPairs(); 1028885b47fbSopenharmony_ci for (auto iter = mapTable.begin(); iter != mapTable.end(); iter++) { 1029885b47fbSopenharmony_ci if (elementId == iter->second) { 1030885b47fbSopenharmony_ci return true; 1031885b47fbSopenharmony_ci } 1032885b47fbSopenharmony_ci } 1033885b47fbSopenharmony_ci return false; 1034885b47fbSopenharmony_ci} 1035885b47fbSopenharmony_ci} // namespace Accessibility 1036885b47fbSopenharmony_ci} // namespace OHOS