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