• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed On an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "accessibility_window_manager.h"
17 
18 #include <hitrace_meter.h>
19 
20 #include "accessible_ability_manager_service.h"
21 #include "hilog_wrapper.h"
22 #include "utils.h"
23 #include <cinttypes>
24 
25 namespace OHOS {
26 namespace Accessibility {
27 namespace {
28     const std::string SCB_SCENE_PANEL = "SCBScenePanel";
29 }
30 
AccessibilityWindowManager()31 AccessibilityWindowManager::AccessibilityWindowManager()
32 {
33 }
34 
Init()35 bool AccessibilityWindowManager::Init()
36 {
37     DeInit();
38     HILOG_DEBUG("deinit before start");
39     HITRACE_METER_NAME(HITRACE_TAG_ACCESSIBILITY_MANAGER, "QueryWindowInfo");
40     std::vector<sptr<Rosen::AccessibilityWindowInfo>> windowInfos;
41     Rosen::WMError err = OHOS::Rosen::WindowManager::GetInstance().GetAccessibilityWindowInfo(windowInfos);
42     if (err != Rosen::WMError::WM_OK) {
43         Utils::RecordUnavailableEvent(A11yUnavailableEvent::QUERY_EVENT, A11yError::ERROR_QUERY_WINDOW_INFO_FAILED);
44         HILOG_ERROR("get window info from wms failed. err[%{public}d]", err);
45         return false;
46     }
47     std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_);
48     HILOG_DEBUG("windowInfos size is %{public}zu", windowInfos.size());
49     for (auto &window : windowInfos) {
50         if (!window) {
51             HILOG_ERROR("window is nullptr");
52             continue;
53         }
54 
55         int32_t realWid = GetRealWindowId(window);
56         if (!a11yWindows_.count(realWid)) {
57             auto a11yWindowInfo = CreateAccessibilityWindowInfo(window);
58             a11yWindows_.emplace(realWid, a11yWindowInfo);
59         }
60 
61         if (IsSceneBoard(window)) {
62             subWindows_.insert(realWid);
63             sceneBoardElementIdMap_.InsertPair(realWid, window->uiNodeId_);
64         }
65 
66         if (a11yWindows_[realWid].IsFocused()) {
67             SetActiveWindow(realWid);
68         }
69     }
70     return true;
71 }
72 
DeInit()73 void AccessibilityWindowManager::DeInit()
74 {
75     HILOG_DEBUG();
76     std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_);
77     a11yWindows_.clear();
78     subWindows_.clear();
79     sceneBoardElementIdMap_.Clear();
80     activeWindowId_ = INVALID_WINDOW_ID;
81     a11yFocusedWindowId_ = INVALID_WINDOW_ID;
82 }
83 
WinDeInit()84 void AccessibilityWindowManager::WinDeInit()
85 {
86     HILOG_DEBUG();
87     std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_);
88     a11yWindows_.clear();
89     subWindows_.clear();
90     sceneBoardElementIdMap_.Clear();
91     activeWindowId_ = INVALID_WINDOW_ID;
92 }
93 
~AccessibilityWindowManager()94 AccessibilityWindowManager::~AccessibilityWindowManager()
95 {
96     DeregisterWindowListener();
97 }
98 
RegisterWindowListener(const std::shared_ptr<AppExecFwk::EventHandler> & handler)99 void AccessibilityWindowManager::RegisterWindowListener(const std::shared_ptr<AppExecFwk::EventHandler> &handler)
100 {
101     DeregisterWindowListener();
102     HILOG_DEBUG("deregister before register");
103     if (windowListener_) {
104         HILOG_DEBUG("Window listener is already registered!");
105         return;
106     }
107 
108     eventHandler_ = handler;
109     windowListener_ = new(std::nothrow) AccessibilityWindowListener(*this);
110     if (!windowListener_) {
111         HILOG_ERROR("Create window listener fail!");
112         return;
113     }
114     OHOS::Rosen::WindowManager::GetInstance().RegisterWindowUpdateListener(windowListener_);
115 }
116 
DeregisterWindowListener()117 void AccessibilityWindowManager::DeregisterWindowListener()
118 {
119     if (windowListener_) {
120         OHOS::Rosen::WindowManager::GetInstance().UnregisterWindowUpdateListener(windowListener_);
121         windowListener_ = nullptr;
122         eventHandler_ = nullptr;
123     }
124 }
125 
OnWindowUpdate(const std::vector<sptr<Rosen::AccessibilityWindowInfo>> & infos,Rosen::WindowUpdateType type)126 void AccessibilityWindowManager::OnWindowUpdate(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos,
127     Rosen::WindowUpdateType type)
128 {
129     HILOG_DEBUG("WindowUpdateType type[%{public}d]", type);
130     if (!eventHandler_) {
131         HILOG_ERROR("eventHandler_ is nullptr.");
132         return;
133     }
134     if (infos.size() == 0) {
135         HILOG_ERROR("window info is err");
136         return;
137     }
138     eventHandler_->PostTask([=]() {
139         switch (type) {
140             case Rosen::WindowUpdateType::WINDOW_UPDATE_ADDED: // 1
141                 WindowUpdateAdded(infos);
142                 break;
143             case Rosen::WindowUpdateType::WINDOW_UPDATE_REMOVED: // 2
144                 WindowUpdateRemoved(infos);
145                 break;
146             case Rosen::WindowUpdateType::WINDOW_UPDATE_BOUNDS: // 4
147                 WindowUpdateBounds(infos);
148                 break;
149             case Rosen::WindowUpdateType::WINDOW_UPDATE_ACTIVE: // 5
150                 WindowUpdateActive(infos);
151                 break;
152             case Rosen::WindowUpdateType::WINDOW_UPDATE_FOCUSED: // 3
153                 WindowUpdateFocused(infos);
154                 break;
155             case Rosen::WindowUpdateType::WINDOW_UPDATE_PROPERTY: // 6
156                 WindowUpdateProperty(infos);
157                 break;
158             case Rosen::WindowUpdateType::WINDOW_UPDATE_ALL:
159                 WindowUpdateAll(infos);
160                 break;
161             default:
162                 break;
163         }
164         HILOG_DEBUG("a11yWindows[%{public}zu]", a11yWindows_.size());
165         }, "TASK_ON_WINDOW_UPDATE");
166 }
167 
ConvertToRealWindowId(int32_t windowId,int32_t focusType)168 int32_t AccessibilityWindowManager::ConvertToRealWindowId(int32_t windowId, int32_t focusType)
169 {
170     std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_);
171     int32_t winId = windowId;
172     HILOG_DEBUG("ConvertToRealWindowId called, windowId[%{public}d], focusType[%{public}d]", windowId, focusType);
173     if (windowId == ACTIVE_WINDOW_ID) {
174         HILOG_DEBUG("After convert active windowId[%{public}d]", activeWindowId_);
175         winId = activeWindowId_;
176     }
177 
178     if (windowId == ANY_WINDOW_ID) {
179         if (focusType == FOCUS_TYPE_ACCESSIBILITY) {
180             HILOG_DEBUG("After convert a11yFocused windowId[%{public}d] by accessibility type", a11yFocusedWindowId_);
181             winId = a11yFocusedWindowId_;
182         } else if (focusType == FOCUS_TYPE_INPUT) {
183             HILOG_DEBUG("After convert active windowId[%{public}d] by input type", activeWindowId_);
184             winId = activeWindowId_;
185         }
186     }
187 
188     if (subWindows_.count(winId)) {
189         HILOG_DEBUG("After convert normal windowId[%{public}d]", SCENE_BOARD_WINDOW_ID);
190         return SCENE_BOARD_WINDOW_ID;
191     }
192     HILOG_DEBUG("After convert windowId[%{public}d] and activeId[%{public}d]", winId, activeWindowId_);
193     return winId;
194 }
195 
ConvertWindowType(Rosen::WindowType type)196 AccessibilityWindowType ConvertWindowType(Rosen::WindowType type)
197 {
198     AccessibilityWindowType winType = TYPE_WINDOW_INVALID;
199 
200     if (type < Rosen::WindowType::SYSTEM_WINDOW_BASE) {
201         winType = TYPE_APPLICATION;
202     } else if ((type >= Rosen::WindowType::SYSTEM_WINDOW_BASE) && (type <= Rosen::WindowType::SYSTEM_WINDOW_END)) {
203         winType = TYPE_SYSTEM;
204     } else {
205         HILOG_ERROR("Unknown windowType[%{public}d]", type);
206     }
207     return winType;
208 }
209 
CheckIntegerOverflow(const Rosen::Rect & rect)210 bool AccessibilityWindowManager::CheckIntegerOverflow(const Rosen::Rect& rect)
211 {
212     if ((rect.posX_ > 0) && (static_cast<int32_t>(rect.width_) > 0)) {
213         int32_t leftX = INT32_MAX - rect.posX_;
214         if (leftX < static_cast<int32_t>(rect.width_)) {
215             HILOG_ERROR("input parameter invalid posX %{public}d, width_ %{public}u", rect.posX_,
216                 rect.width_);
217             return false;
218         }
219     }
220 
221     if ((rect.posX_ < 0) && (static_cast<int32_t>(rect.width_) < 0)) {
222         int32_t leftX = INT32_MIN - rect.posX_;
223         if (leftX > static_cast<int32_t>(rect.width_)) {
224             HILOG_ERROR("input parameter invalid posX %{public}d, width_ %{public}u", rect.posX_,
225                 rect.width_);
226             return false;
227         }
228     }
229 
230     if ((rect.posY_ > 0) && (static_cast<int32_t>(rect.height_) > 0)) {
231         int32_t leftY = INT32_MAX - rect.posY_;
232         if (leftY < static_cast<int32_t>(rect.height_)) {
233             HILOG_ERROR("input parameter invalid posX %{public}d, height_ %{public}u", rect.posY_,
234                 rect.height_);
235             return false;
236         }
237     }
238 
239     if ((rect.posY_ < 0) && (static_cast<int32_t>(rect.height_) < 0)) {
240         int32_t leftY = INT32_MIN - rect.posY_;
241         if (leftY > static_cast<int32_t>(rect.height_)) {
242             HILOG_ERROR("input parameter invalid posX %{public}d, height_ %{public}u", rect.posY_,
243                 rect.height_);
244             return false;
245         }
246     }
247     return true;
248 }
249 
UpdateAccessibilityWindowInfo(AccessibilityWindowInfo & accWindowInfo,const sptr<Rosen::AccessibilityWindowInfo> windowInfo)250 void AccessibilityWindowManager::UpdateAccessibilityWindowInfo(AccessibilityWindowInfo &accWindowInfo,
251     const sptr<Rosen::AccessibilityWindowInfo> windowInfo)
252 {
253     accWindowInfo.SetScaleVal(windowInfo->scaleVal_);
254     accWindowInfo.SetScaleX(windowInfo->scaleX_);
255     accWindowInfo.SetScaleY(windowInfo->scaleY_);
256     accWindowInfo.SetWindowId(windowInfo->wid_);
257     accWindowInfo.SetWindowType(static_cast<uint32_t>(windowInfo->type_));
258     accWindowInfo.SetWindowMode(static_cast<uint32_t>(windowInfo->mode_));
259     accWindowInfo.SetAccessibilityWindowType(ConvertWindowType(windowInfo->type_));
260     accWindowInfo.SetFocused(windowInfo->focused_);
261     accWindowInfo.SetWindowLayer(windowInfo->layer_);
262     if (static_cast<int32_t>(windowInfo->type_) == 1 && (static_cast<int32_t>(windowInfo->windowRect_.width_) == 0 ||
263         static_cast<int32_t>(windowInfo->windowRect_.height_) == 0)) {
264         HILOG_WARN("invalid window parameters, windowId(%{public}d), posX(%{public}d, posY(%{public}d))",
265             windowInfo->wid_, windowInfo->windowRect_.posX_, windowInfo->windowRect_.posY_);
266     } else {
267         Rect bound;
268         bound.SetLeftTopScreenPostion(windowInfo->windowRect_.posX_, windowInfo->windowRect_.posY_);
269         if (!CheckIntegerOverflow(windowInfo->windowRect_)) {
270             bound.SetRightBottomScreenPostion(windowInfo->windowRect_.posX_, windowInfo->windowRect_.posY_);
271         } else {
272             bound.SetRightBottomScreenPostion(
273                 windowInfo->windowRect_.posX_ + static_cast<int32_t>(windowInfo->windowRect_.width_),
274                 windowInfo->windowRect_.posY_ + static_cast<int32_t>(windowInfo->windowRect_.height_));
275         }
276         accWindowInfo.SetRectInScreen(bound);
277     }
278     accWindowInfo.SetDisplayId(windowInfo->displayId_);
279     accWindowInfo.SetDecorEnable(windowInfo->isDecorEnable_);
280     accWindowInfo.SetUiNodeId(windowInfo->uiNodeId_);
281     accWindowInfo.SetInnerWid(windowInfo->innerWid_);
282     if (accWindowInfo.GetWindowId() == SCENE_BOARD_WINDOW_ID) {
283         accWindowInfo.SetWindowId(windowInfo->innerWid_);
284         HILOG_DEBUG("scene board window id 1 convert inner window id[%{public}d]", windowInfo->innerWid_);
285     }
286     HILOG_DEBUG("bundle name is [%{public}s] , touchHotAreas size(%{public}zu)",
287         windowInfo->bundleName_.c_str(), windowInfo->touchHotAreas_.size());
288     accWindowInfo.SetBundleName(windowInfo->bundleName_);
289     HILOG_DEBUG("UpdateAccessibilityWindowInfo is set bundlename is [%{public}s]",
290         accWindowInfo.GetBundleName().c_str());
291     std::vector<Rect> tempTouchHotAreas = {};
292     for (auto &rect : windowInfo->touchHotAreas_) {
293         HILOG_DEBUG("Rosen::windowinfo x:[%{public}d], y:[%{public}d]; width:[%{public}d], height:[%{public}d]",
294             rect.posX_, rect.posY_, rect.width_, rect.height_);
295         Rect rectTemp;
296         rectTemp.SetLeftTopScreenPostion(rect.posX_, rect.posY_);
297         if (!CheckIntegerOverflow(rect)) {
298             rectTemp.SetRightBottomScreenPostion(rect.posX_, rect.posY_);
299         } else {
300             rectTemp.SetRightBottomScreenPostion(
301                 rect.posX_ + static_cast<int32_t>(rect.width_),
302                 rect.posY_ + static_cast<int32_t>(rect.height_));
303         }
304         tempTouchHotAreas.push_back(rectTemp);
305     }
306     accWindowInfo.SetTouchHotAreas(tempTouchHotAreas);
307     for (auto &outRect : accWindowInfo.GetTouchHotAreas()) {
308         HILOG_DEBUG("left_x:[%{public}d], left_y:[%{public}d]; right_x:[%{public}d], right_y:[%{public}d]",
309             outRect.GetLeftTopXScreenPostion(), outRect.GetLeftTopYScreenPostion(),
310             outRect.GetRightBottomXScreenPostion(), outRect.GetRightBottomYScreenPostion());
311     }
312 }
313 
GetRealWindowId(const sptr<Rosen::AccessibilityWindowInfo> windowInfo)314 int32_t AccessibilityWindowManager::GetRealWindowId(const sptr<Rosen::AccessibilityWindowInfo> windowInfo)
315 {
316     if (windowInfo->wid_ == SCENE_BOARD_WINDOW_ID) {
317         return windowInfo->innerWid_;
318     }
319     return windowInfo->wid_;
320 }
321 
IsSceneBoard(const sptr<Rosen::AccessibilityWindowInfo> windowInfo)322 bool AccessibilityWindowManager::IsSceneBoard(const sptr<Rosen::AccessibilityWindowInfo> windowInfo)
323 {
324     if (windowInfo->wid_ == SCENE_BOARD_WINDOW_ID) {
325         return true;
326     }
327     return false;
328 }
329 
IsScenePanel(const sptr<Rosen::AccessibilityWindowInfo> windowInfo)330 bool AccessibilityWindowManager::IsScenePanel(const sptr<Rosen::AccessibilityWindowInfo> windowInfo)
331 {
332     return windowInfo->bundleName_.find(SCB_SCENE_PANEL) != std::string::npos;
333 }
334 
CreateAccessibilityWindowInfo(const sptr<Rosen::AccessibilityWindowInfo> windowInfo)335 AccessibilityWindowInfo AccessibilityWindowManager::CreateAccessibilityWindowInfo(
336     const sptr<Rosen::AccessibilityWindowInfo> windowInfo)
337 {
338     AccessibilityWindowInfo info;
339     UpdateAccessibilityWindowInfo(info, windowInfo);
340     HILOG_DEBUG("Create WindowInfo Id(%{public}d) type(%{public}d) posX(%{public}d) posY(%{public}d)"
341         "witdth(%{public}d) height(%{public}d) display id(%{public}" PRIu64 ") isDecorEnable(%{public}d)"
342         "innerWid(%{public}d), uiNodeId(%{public}d)",
343         windowInfo->wid_, windowInfo->type_, windowInfo->windowRect_.posX_, windowInfo->windowRect_.posY_,
344         windowInfo->windowRect_.width_, windowInfo->windowRect_.height_, windowInfo->displayId_,
345         windowInfo->isDecorEnable_, windowInfo->innerWid_, windowInfo->uiNodeId_);
346     return info;
347 }
348 
SetActiveWindow(int32_t windowId,bool isSendEvent)349 void AccessibilityWindowManager::SetActiveWindow(int32_t windowId, bool isSendEvent)
350 {
351     HILOG_DEBUG("windowId is %{public}d", windowId);
352     std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_);
353     if (windowId == INVALID_WINDOW_ID) {
354         ClearOldActiveWindow();
355         activeWindowId_ = INVALID_WINDOW_ID;
356         return;
357     }
358 
359     if (!a11yWindows_.count(windowId)) {
360         HILOG_WARN("Window id is not found");
361         return;
362     }
363 
364     if (activeWindowId_ != windowId) {
365         ClearOldActiveWindow();
366         activeWindowId_ = windowId;
367         a11yWindows_[activeWindowId_].SetActive(true);
368         if (!isSendEvent) {
369             HILOG_DEBUG("not send event, activeWindowId is %{public}d", activeWindowId_);
370             return;
371         }
372         auto &aams = Singleton<AccessibleAbilityManagerService>::GetInstance();
373         AccessibilityEventInfo evtInf(activeWindowId_, WINDOW_UPDATE_ACTIVE);
374         int32_t winId = windowId;
375         if (sceneBoardElementIdMap_.CheckWindowIdPair(windowId)) {
376             winId = SCENE_BOARD_WINDOW_ID;
377         }
378         if (aams.CheckWindowRegister(winId)) {
379             HILOG_DEBUG("send active event, windowId: %{public}d", winId);
380             aams.SendEvent(evtInf);
381         } else {
382             HILOG_DEBUG("wait for window register to process event, windowId: %{public}d", winId);
383             aams.InsertWindowIdEventPair(winId, evtInf);
384         }
385     }
386     HILOG_DEBUG("activeWindowId is %{public}d", activeWindowId_);
387 }
388 
GetActiveWindowId()389 int32_t AccessibilityWindowManager::GetActiveWindowId()
390 {
391     std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_);
392     HILOG_DEBUG("activeWindowId_ is %{public}d", activeWindowId_);
393     return activeWindowId_;
394 }
395 
SetAccessibilityFocusedWindow(int32_t windowId)396 void AccessibilityWindowManager::SetAccessibilityFocusedWindow(int32_t windowId)
397 {
398     HILOG_DEBUG("windowId is %{public}d", windowId);
399     std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_);
400     if (windowId == INVALID_WINDOW_ID) {
401         ClearAccessibilityFocused();
402         a11yFocusedWindowId_ = INVALID_WINDOW_ID;
403         return;
404     }
405 
406     if (!a11yWindows_.count(windowId)) {
407         HILOG_ERROR("Window id[%{public}d] is not found", windowId);
408         return;
409     }
410 
411     if (a11yFocusedWindowId_ != windowId) {
412         ClearAccessibilityFocused();
413         a11yFocusedWindowId_ = windowId;
414         a11yWindows_[a11yFocusedWindowId_].SetAccessibilityFocused(true);
415     }
416     HILOG_DEBUG("a11yFocusedWindowId_ is %{public}d", a11yFocusedWindowId_);
417 }
418 
GetAccessibilityWindows()419 std::vector<AccessibilityWindowInfo> AccessibilityWindowManager::GetAccessibilityWindows()
420 {
421     HILOG_DEBUG("a11yWindows_ size[%{public}zu]", a11yWindows_.size());
422     std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_);
423     std::vector<sptr<Rosen::AccessibilityWindowInfo>> windowInfos;
424     std::vector<AccessibilityWindowInfo> windows;
425     Rosen::WMError err = OHOS::Rosen::WindowManager::GetInstance().GetAccessibilityWindowInfo(windowInfos);
426     HILOG_DEBUG("windowInfos size[%{public}zu]", windowInfos.size());
427     if (err != Rosen::WMError::WM_OK) {
428         HILOG_ERROR("get window info from wms failed. err[%{public}d]", err);
429         return windows;
430     }
431     for (auto &info : windowInfos) {
432         if (info == nullptr) {
433             continue;
434         }
435         AccessibilityWindowInfo tmpWindowInfo;
436         UpdateAccessibilityWindowInfo(tmpWindowInfo, info);
437         if (tmpWindowInfo.IsFocused()) {
438             HILOG_DEBUG("set active windowId: %{public}d", tmpWindowInfo.GetWindowId());
439             tmpWindowInfo.SetActive(true);
440         }
441         windows.push_back(tmpWindowInfo);
442     }
443     return windows;
444 }
445 
GetAccessibilityWindow(int32_t windowId,AccessibilityWindowInfo & window)446 bool AccessibilityWindowManager::GetAccessibilityWindow(int32_t windowId, AccessibilityWindowInfo &window)
447 {
448     HILOG_DEBUG("start windowId(%{public}d)", windowId);
449     std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_);
450     std::vector<sptr<Rosen::AccessibilityWindowInfo>> windowInfos;
451     Rosen::WMError err = OHOS::Rosen::WindowManager::GetInstance().GetAccessibilityWindowInfo(windowInfos);
452     if (err != Rosen::WMError::WM_OK) {
453         HILOG_ERROR("get window info from wms failed. err[%{public}d]", err);
454         return false;
455     }
456     for (auto &info : windowInfos) {
457         if (info == nullptr) {
458             continue;
459         }
460 
461         int32_t realWidId = GetRealWindowId(info);
462         if (info != nullptr && a11yWindows_.count(realWidId)) {
463             UpdateAccessibilityWindowInfo(a11yWindows_[realWidId], info);
464         }
465     }
466     if (a11yWindows_.count(windowId)) {
467         window = a11yWindows_[windowId];
468         return true;
469     }
470     return false;
471 }
472 
IsValidWindow(int32_t windowId)473 bool AccessibilityWindowManager::IsValidWindow(int32_t windowId)
474 {
475     HILOG_DEBUG("start windowId(%{public}d)", windowId);
476     std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_);
477     auto it = std::find_if(a11yWindows_.begin(), a11yWindows_.end(),
478         [windowId](const std::map<int32_t, AccessibilityWindowInfo>::value_type &window) {
479             return window.first == windowId;
480         });
481     if (it == a11yWindows_.end()) {
482         return false;
483     }
484     return true;
485 }
486 
SetWindowSize(int32_t windowId,Rect rect)487 void AccessibilityWindowManager::SetWindowSize(int32_t windowId, Rect rect)
488 {
489     HILOG_DEBUG("start windowId(%{public}d)", windowId);
490     std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_);
491     auto it = std::find_if(a11yWindows_.begin(), a11yWindows_.end(),
492         [windowId](const std::map<int32_t, AccessibilityWindowInfo>::value_type &window) {
493             return window.first == windowId;
494         });
495     if (it != a11yWindows_.end()) {
496         it->second.SetRectInScreen(rect);
497     }
498 }
499 
CompareRect(const Rect & rectAccessibility,const Rosen::Rect & rectWindow)500 bool AccessibilityWindowManager::CompareRect(const Rect &rectAccessibility, const Rosen::Rect &rectWindow)
501 {
502     HILOG_DEBUG();
503     int32_t leftTopX_ = rectWindow.posX_;
504     int32_t leftTopY_ = rectWindow.posY_;
505     int32_t rightBottomX_ = 0;
506     int32_t rightBottomY_ = 0;
507 
508     if (!CheckIntegerOverflow(rectWindow)) {
509         rightBottomX_ = rectWindow.posX_;
510         rightBottomY_ = rectWindow.posY_;
511     } else {
512         rightBottomX_ = rectWindow.posX_ + static_cast<int32_t>(rectWindow.width_);
513         rightBottomY_ = rectWindow.posY_ + static_cast<int32_t>(rectWindow.height_);
514     }
515 
516     if (rectAccessibility.GetLeftTopXScreenPostion() == leftTopX_ &&
517         rectAccessibility.GetLeftTopYScreenPostion() == leftTopY_ &&
518         rectAccessibility.GetRightBottomXScreenPostion() == rightBottomX_ &&
519         rectAccessibility.GetRightBottomYScreenPostion() == rightBottomY_) {
520         HILOG_DEBUG("rect values are the same");
521         return false;
522     }
523     return true;
524 }
525 
EqualFocus(const Accessibility::AccessibilityWindowInfo & accWindowInfo,const sptr<Rosen::AccessibilityWindowInfo> & windowInfo)526 bool AccessibilityWindowManager::EqualFocus(const Accessibility::AccessibilityWindowInfo &accWindowInfo,
527     const sptr<Rosen::AccessibilityWindowInfo> &windowInfo)
528 {
529     HILOG_DEBUG();
530     if (accWindowInfo.IsFocused() == windowInfo->focused_) {
531         HILOG_DEBUG("focus values are the same");
532         return false;
533     }
534     return true;
535 }
536 
EqualBound(const Accessibility::AccessibilityWindowInfo & accWindowInfo,const sptr<Rosen::AccessibilityWindowInfo> & windowInfo)537 bool AccessibilityWindowManager::EqualBound(const Accessibility::AccessibilityWindowInfo &accWindowInfo,
538     const sptr<Rosen::AccessibilityWindowInfo> &windowInfo)
539 {
540     HILOG_DEBUG();
541     if (static_cast<int32_t>(windowInfo->type_) == 1 && (static_cast<int32_t>(windowInfo->windowRect_.width_) == 0 ||
542         static_cast<int32_t>(windowInfo->windowRect_.height_) == 0)) {
543         HILOG_ERROR("invalid window parameters, windowId(%{public}d), posX(%{public}d, posY(%{public}d))",
544             windowInfo->wid_, windowInfo->windowRect_.posX_, windowInfo->windowRect_.posY_);
545         return false;
546     }
547     return CompareRect(accWindowInfo.GetRectInScreen(), windowInfo->windowRect_);
548 }
549 
EqualProperty(Accessibility::AccessibilityWindowInfo & accWindowInfo,const sptr<Rosen::AccessibilityWindowInfo> & windowInfo)550 bool AccessibilityWindowManager::EqualProperty(Accessibility::AccessibilityWindowInfo &accWindowInfo,
551     const sptr<Rosen::AccessibilityWindowInfo> &windowInfo)
552 {
553     HILOG_DEBUG();
554     std::ostringstream  accInfoStr;
555     std::ostringstream  winInfoStr;
556 
557     accInfoStr << accWindowInfo.GetWindowMode()
558                << accWindowInfo.GetWindowLayer()
559                << accWindowInfo.IsDecorEnable()
560                << accWindowInfo.GetWindowType()
561                << accWindowInfo.GetDisplayId()
562                << accWindowInfo.GetScaleVal()
563                << accWindowInfo.GetScaleX()
564                << accWindowInfo.GetScaleY();
565     HILOG_DEBUG("Create accinfoStr windowMode_[%{public}d] Layer_[%{public}d] isDecorEnable_[%{public}d]"
566         "windowType_[%{public}d] displayId:%{public}" PRIu64 " get scaleVal_ [%{public}f]"
567         "get scaleX_ [%{public}f] get scaleY_ [%{public}f]",
568         accWindowInfo.GetWindowMode(), accWindowInfo.GetWindowLayer(), accWindowInfo.IsDecorEnable(),
569         accWindowInfo.GetWindowType(), accWindowInfo.GetDisplayId(), accWindowInfo.GetScaleVal(),
570         accWindowInfo.GetScaleX(), accWindowInfo.GetScaleY());
571 
572     winInfoStr << static_cast<uint32_t>(windowInfo->mode_)
573                << windowInfo->layer_
574                << windowInfo->isDecorEnable_
575                << static_cast<uint32_t>(windowInfo->type_)
576                << windowInfo->displayId_
577                << windowInfo->scaleVal_
578                << windowInfo->scaleX_
579                << windowInfo->scaleY_;
580     HILOG_DEBUG("Create wininfoStr Mode_[%{public}d] Layer_[%{public}d] isDecorEnable_[%{public}d]"
581         "Type_[%{public}d] displayId:%{public}" PRIu64 " scaleVal_ [%{public}f]"
582         "scaleX_ [%{public}f] scaleY_ [%{public}f]",
583         static_cast<uint32_t>(windowInfo->mode_), windowInfo->layer_, windowInfo->isDecorEnable_,
584         static_cast<uint32_t>(windowInfo->type_), windowInfo->displayId_, windowInfo->scaleVal_,
585         windowInfo->scaleX_, windowInfo->scaleY_);
586 
587     if (accInfoStr.str() != winInfoStr.str() ||
588         windowInfo->touchHotAreas_.size() != accWindowInfo.GetTouchHotAreas().size()) {
589         HILOG_DEBUG("Property different");
590         return true;
591     }
592     for (uint32_t i = 0; i < accWindowInfo.GetTouchHotAreas().size(); i++) {
593         if (CompareRect(accWindowInfo.GetTouchHotAreas()[i], windowInfo->touchHotAreas_[i])) {
594             HILOG_DEBUG("touchHotAreas different");
595             return true;
596         }
597     }
598     return false;
599 }
600 
WindowUpdateAdded(const std::vector<sptr<Rosen::AccessibilityWindowInfo>> & infos)601 void AccessibilityWindowManager::WindowUpdateAdded(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos)
602 {
603     HILOG_DEBUG();
604     std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_);
605     for (auto &windowInfo : infos) {
606         if (!windowInfo) {
607             HILOG_ERROR("invalid windowInfo");
608             return;
609         }
610 
611         int32_t realWidId = GetRealWindowId(windowInfo);
612         if (!a11yWindows_.count(realWidId)) {
613             auto a11yWindowInfoAdded = CreateAccessibilityWindowInfo(windowInfo);
614             a11yWindows_.emplace(realWidId, a11yWindowInfoAdded);
615         } else {
616             UpdateAccessibilityWindowInfo(a11yWindows_[realWidId], windowInfo);
617         }
618 
619         if (IsSceneBoard(windowInfo)) {
620             subWindows_.insert(realWidId);
621             sceneBoardElementIdMap_.InsertPair(realWidId, windowInfo->uiNodeId_);
622         }
623         AccessibilityEventInfo evtInfAdded(realWidId, WINDOW_UPDATE_ADDED);
624         Singleton<AccessibleAbilityManagerService>::GetInstance().SendEvent(evtInfAdded);
625         if (a11yWindows_[realWidId].IsFocused()) {
626             SetActiveWindow(realWidId);
627         }
628     }
629 }
630 
WindowUpdateRemoved(const std::vector<sptr<Rosen::AccessibilityWindowInfo>> & infos)631 void AccessibilityWindowManager::WindowUpdateRemoved(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos)
632 {
633     HILOG_DEBUG();
634     std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_);
635     auto &aams = Singleton<AccessibleAbilityManagerService>::GetInstance();
636     for (auto &windowInfo : infos) {
637         if (!windowInfo) {
638             HILOG_ERROR("invalid windowInfo");
639             return;
640         }
641 
642         int32_t realWidId = GetRealWindowId(windowInfo);
643         if (!a11yWindows_.count(realWidId)) {
644             return;
645         }
646         if (realWidId == activeWindowId_) {
647             SetActiveWindow(INVALID_WINDOW_ID);
648         }
649         if (realWidId == a11yFocusedWindowId_) {
650             SetAccessibilityFocusedWindow(INVALID_WINDOW_ID);
651         }
652         a11yWindows_.erase(realWidId);
653         subWindows_.erase(realWidId);
654         sceneBoardElementIdMap_.RemovePair(realWidId);
655         AccessibilityEventInfo evtInfRemoved(realWidId, WINDOW_UPDATE_REMOVED);
656         aams.SendEvent(evtInfRemoved);
657     }
658 }
659 
WindowUpdateFocused(const std::vector<sptr<Rosen::AccessibilityWindowInfo>> & infos)660 void AccessibilityWindowManager::WindowUpdateFocused(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos)
661 {
662     HILOG_DEBUG();
663     std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_);
664     auto &aams = Singleton<AccessibleAbilityManagerService>::GetInstance();
665     for (auto &windowInfo : infos) {
666         if (!windowInfo) {
667             HILOG_ERROR("invalid windowInfo");
668             return;
669         }
670 
671         int32_t realWidId = GetRealWindowId(windowInfo);
672         if (!a11yWindows_.count(realWidId)) {
673             HILOG_DEBUG("window not created");
674             auto a11yWindowInfoFocused = CreateAccessibilityWindowInfo(windowInfo);
675             a11yWindows_.emplace(realWidId, a11yWindowInfoFocused);
676         }
677 
678         if (IsSceneBoard(windowInfo)) {
679             subWindows_.insert(realWidId);
680             sceneBoardElementIdMap_.InsertPair(realWidId, windowInfo->uiNodeId_);
681         }
682         SetActiveWindow(realWidId);
683         AccessibilityEventInfo evtInfFocused(realWidId, WINDOW_UPDATE_FOCUSED);
684         aams.SendEvent(evtInfFocused);
685     }
686 }
687 
WindowUpdateBounds(const std::vector<sptr<Rosen::AccessibilityWindowInfo>> & infos)688 void AccessibilityWindowManager::WindowUpdateBounds(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos)
689 {
690     HILOG_DEBUG();
691     std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_);
692     auto &aams = Singleton<AccessibleAbilityManagerService>::GetInstance();
693     for (auto &windowInfo : infos) {
694         if (!windowInfo) {
695             HILOG_ERROR("invalid windowInfo");
696             return;
697         }
698 
699         int32_t realWidId = GetRealWindowId(windowInfo);
700         if (a11yWindows_.count(realWidId)) {
701             UpdateAccessibilityWindowInfo(a11yWindows_[realWidId], windowInfo);
702         }
703 
704         AccessibilityEventInfo evtInfBounds(realWidId, WINDOW_UPDATE_BOUNDS);
705         aams.SendEvent(evtInfBounds);
706     }
707 }
708 
WindowUpdateActive(const std::vector<sptr<Rosen::AccessibilityWindowInfo>> & infos)709 void AccessibilityWindowManager::WindowUpdateActive(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos)
710 {
711     HILOG_DEBUG();
712     std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_);
713     for (auto &windowInfo : infos) {
714         if (!windowInfo) {
715             HILOG_ERROR("invalid windowInfo");
716             return;
717         }
718 
719         int32_t realWidId = GetRealWindowId(windowInfo);
720         if (!a11yWindows_.count(realWidId)) {
721             auto a11yWindowInfoActive = CreateAccessibilityWindowInfo(windowInfo);
722             a11yWindows_.emplace(realWidId, a11yWindowInfoActive);
723         }
724 
725         if (IsSceneBoard(windowInfo)) {
726             subWindows_.insert(realWidId);
727             sceneBoardElementIdMap_.InsertPair(realWidId, windowInfo->uiNodeId_);
728         }
729         SetActiveWindow(realWidId);
730     }
731 }
732 
WindowUpdateProperty(const std::vector<sptr<Rosen::AccessibilityWindowInfo>> & infos)733 void AccessibilityWindowManager::WindowUpdateProperty(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos)
734 {
735     HILOG_DEBUG();
736     std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_);
737     auto &aams = Singleton<AccessibleAbilityManagerService>::GetInstance();
738     for (auto &windowInfo : infos) {
739         if (!windowInfo) {
740             HILOG_ERROR("invalid windowInfo");
741             return;
742         }
743 
744         int32_t realWidId = GetRealWindowId(windowInfo);
745         if (a11yWindows_.count(realWidId)) {
746             UpdateAccessibilityWindowInfo(a11yWindows_[realWidId], windowInfo);
747         }
748         AccessibilityEventInfo evtInfProperty(realWidId, WINDOW_UPDATE_PROPERTY);
749         aams.SendEvent(evtInfProperty);
750     }
751 }
752 
WindowUpdateTypeEvent(const int32_t realWidId,Accessibility::WindowUpdateType type)753 void AccessibilityWindowManager::WindowUpdateTypeEvent(const int32_t realWidId, Accessibility::WindowUpdateType type)
754 {
755     HILOG_DEBUG();
756     std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_);
757     HILOG_DEBUG("WindowUpdateType type[%{public}d]", type);
758     auto &aams = Singleton<AccessibleAbilityManagerService>::GetInstance();
759     switch (type) {
760         case WindowUpdateType::WINDOW_UPDATE_ADDED: {
761             AccessibilityEventInfo evtInfAdded(realWidId, WINDOW_UPDATE_ADDED);
762             Singleton<AccessibleAbilityManagerService>::GetInstance().SendEvent(evtInfAdded);
763             if (a11yWindows_[realWidId].IsFocused()) {
764                 SetActiveWindow(realWidId);
765             }
766             break;
767             }
768         case WindowUpdateType::WINDOW_UPDATE_REMOVED: {
769             if (realWidId == activeWindowId_) {
770                 SetActiveWindow(INVALID_WINDOW_ID);
771             }
772             if (realWidId == a11yFocusedWindowId_) {
773                 SetAccessibilityFocusedWindow(INVALID_WINDOW_ID);
774             }
775 
776             AccessibilityEventInfo evtInfRemoved(realWidId, WINDOW_UPDATE_REMOVED);
777             aams.SendEvent(evtInfRemoved);
778             break;
779             }
780         case WindowUpdateType::WINDOW_UPDATE_BOUNDS: {
781             AccessibilityEventInfo evtInfBounds(realWidId, WINDOW_UPDATE_BOUNDS);
782             aams.SendEvent(evtInfBounds);
783             break;
784             }
785         case WindowUpdateType::WINDOW_UPDATE_FOCUSED: {
786             SetActiveWindow(realWidId);
787             AccessibilityEventInfo evtInfFocused(realWidId, WINDOW_UPDATE_FOCUSED);
788             aams.SendEvent(evtInfFocused);
789             break;
790             }
791         case WindowUpdateType::WINDOW_UPDATE_PROPERTY: {
792             AccessibilityEventInfo evtInfProperty(realWidId, WINDOW_UPDATE_PROPERTY);
793             aams.SendEvent(evtInfProperty);
794             break;
795             }
796         default:
797             break;
798         }
799 }
800 
WindowUpdateAll(const std::vector<sptr<Rosen::AccessibilityWindowInfo>> & infos)801 void AccessibilityWindowManager::WindowUpdateAll(const std::vector<sptr<Rosen::AccessibilityWindowInfo>>& infos)
802 {
803     HILOG_DEBUG();
804     std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_);
805     auto oldA11yWindows_ = a11yWindows_;
806     HILOG_DEBUG("WindowUpdateAll info size(%{public}zu), oldA11yWindows_ size(%{public}zu)",
807         infos.size(), oldA11yWindows_.size());
808     WinDeInit();
809     for (auto &window : infos) {
810         if (window == nullptr) {
811             HILOG_ERROR("window is nullptr");
812             continue;
813         }
814         int32_t realWid = GetRealWindowId(window);
815         if (!a11yWindows_.count(realWid)) {
816             auto a11yWindowInfo = CreateAccessibilityWindowInfo(window);
817             a11yWindows_.emplace(realWid, a11yWindowInfo);
818             HILOG_DEBUG("WindowUpdateAll a11yWindowInfo size(%{public}s)", a11yWindowInfo.GetBundleName().c_str());
819         }
820         if (IsSceneBoard(window)) {
821             subWindows_.insert(realWid);
822             sceneBoardElementIdMap_.InsertPair(realWid, window->uiNodeId_);
823         }
824 
825         // IsScenePanel for recent-task window
826         if (a11yWindows_[realWid].IsFocused()) {
827             SetActiveWindow(realWid);
828         }
829 
830         if (!oldA11yWindows_.count(realWid)) {
831             WindowUpdateTypeEvent(realWid, WINDOW_UPDATE_ADDED);
832         } else {
833             if (EqualFocus(oldA11yWindows_[realWid], window)) {
834                 WindowUpdateTypeEvent(realWid, WINDOW_UPDATE_FOCUSED);
835             }
836             if (EqualBound(oldA11yWindows_[realWid], window)) {
837                 WindowUpdateTypeEvent(realWid, WINDOW_UPDATE_BOUNDS);
838             }
839             if (EqualProperty(oldA11yWindows_[realWid], window)) {
840                 WindowUpdateTypeEvent(realWid, WINDOW_UPDATE_PROPERTY);
841             }
842             auto itr = oldA11yWindows_.find(realWid);
843             if (itr != oldA11yWindows_.end()) {
844                 oldA11yWindows_.erase(itr);
845             }
846         }
847     }
848 
849     for (auto it = oldA11yWindows_.begin(); it != oldA11yWindows_.end(); ++it) {
850         WindowUpdateTypeEvent(it->first, WINDOW_UPDATE_REMOVED);
851     }
852     HILOG_DEBUG("WindowUpdateAll a11yWindowInfo_ size(%{public}zu)", a11yWindows_.size());
853 }
854 
ClearOldActiveWindow()855 void AccessibilityWindowManager::ClearOldActiveWindow()
856 {
857     HILOG_DEBUG("active window id is %{public}d", activeWindowId_);
858     std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_);
859     if (activeWindowId_ == INVALID_WINDOW_ID) {
860         HILOG_DEBUG("active window id is invalid");
861         return;
862     }
863 
864     if (a11yWindows_.count(activeWindowId_)) {
865         a11yWindows_[activeWindowId_].SetActive(false);
866     }
867     if (activeWindowId_ == a11yFocusedWindowId_) {
868         HILOG_DEBUG("Old active window is a11yFocused window.");
869         SetAccessibilityFocusedWindow(INVALID_WINDOW_ID);
870     }
871 }
872 
ClearAccessibilityFocused()873 void AccessibilityWindowManager::ClearAccessibilityFocused()
874 {
875     HILOG_DEBUG("a11yFocused window id is %{public}d", a11yFocusedWindowId_);
876     std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_);
877     if (a11yFocusedWindowId_ == INVALID_WINDOW_ID) {
878         HILOG_DEBUG("a11yFocused window id is invalid");
879         return;
880     }
881 
882     if (a11yWindows_.count(a11yFocusedWindowId_)) {
883         a11yWindows_[a11yFocusedWindowId_].SetAccessibilityFocused(false);
884     }
885 
886     int32_t windowId = a11yFocusedWindowId_;
887     if (subWindows_.count(a11yFocusedWindowId_)) {
888         windowId = SCENE_BOARD_WINDOW_ID;
889     }
890     sptr<AccessibilityAccountData> accountData =
891         Singleton<AccessibleAbilityManagerService>::GetInstance().GetCurrentAccountData();
892     if (!accountData) {
893         HILOG_ERROR("accountData is nullptr");
894         return;
895     }
896     sptr<AccessibilityWindowConnection> connection =
897         accountData->GetAccessibilityWindowConnection(windowId);
898     if (!connection) {
899         HILOG_ERROR("windowId[%{public}d] has no connection", windowId);
900         return;
901     }
902     if (!connection->GetProxy()) {
903         HILOG_ERROR("windowId[%{public}d] has no proxy", windowId);
904         return;
905     }
906     connection->GetProxy()->ClearFocus();
907 
908     // Send event
909     AccessibilityEventInfo eventInfo(TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED_EVENT);
910     eventInfo.SetWindowId(a11yFocusedWindowId_);
911     Singleton<AccessibleAbilityManagerService>::GetInstance().SendEvent(eventInfo);
912 }
913 
GetSceneBoardElementId(const int32_t windowId,const int64_t elementId)914 int64_t AccessibilityWindowManager::GetSceneBoardElementId(const int32_t windowId, const int64_t elementId)
915 {
916     std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_);
917     if (elementId != INVALID_SCENE_BOARD_ELEMENT_ID) {
918         return elementId;
919     }
920     if (subWindows_.count(windowId)) {
921         auto iter = a11yWindows_.find(windowId);
922         if (iter != a11yWindows_.end()) {
923             HILOG_DEBUG("GetSceneBoardElementId [%{public}" PRId64 "]", iter->second.GetUiNodeId());
924             return iter->second.GetUiNodeId();
925         }
926     }
927     return elementId;
928 }
929 
GetRealWindowAndElementId(int32_t & windowId,int64_t & elementId)930 void AccessibilityWindowManager::GetRealWindowAndElementId(int32_t& windowId, int64_t& elementId)
931 {
932     // sceneboard window id, element id is not equal -1
933     std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_);
934     if (subWindows_.count(windowId) && elementId != INVALID_SCENE_BOARD_ELEMENT_ID) {
935         windowId = SCENE_BOARD_WINDOW_ID;
936         HILOG_INFO("windowId %{public}d, elementId %{public}" PRId64 "", windowId, elementId);
937         return;
938     }
939 
940     if (elementId != INVALID_SCENE_BOARD_ELEMENT_ID) {
941         return;
942     }
943 
944     if (subWindows_.count(windowId)) {
945         auto iter = a11yWindows_.find(windowId);
946         if (iter != a11yWindows_.end()) {
947             HILOG_DEBUG("GetRealWindowAndElementId [%{public}" PRId64 "]", iter->second.GetUiNodeId());
948             windowId = SCENE_BOARD_WINDOW_ID;
949             elementId = iter->second.GetUiNodeId();
950             return;
951         }
952     }
953 }
954 
GetSceneBoardInnerWinId(int32_t windowId,int64_t elementId,int32_t & innerWid)955 void AccessibilityWindowManager::GetSceneBoardInnerWinId(int32_t windowId, int64_t elementId,
956     int32_t& innerWid)
957 {
958     std::lock_guard<ffrt::recursive_mutex> lock(interfaceMutex_);
959     if (windowId != SCENE_BOARD_WINDOW_ID) {
960         return;
961     }
962 
963     for (auto iter = a11yWindows_.begin(); iter != a11yWindows_.end(); iter++) {
964         if (iter->second.GetUiNodeId() == elementId) {
965             innerWid = iter->second.GetInnerWid();
966         }
967     }
968 
969     return;
970 }
971 
InsertPair(const int32_t windowId,const int64_t elementId)972 void AccessibilityWindowManager::SceneBoardElementIdMap::InsertPair(const int32_t windowId, const int64_t elementId)
973 {
974     std::lock_guard<ffrt::mutex> lock(mapMutex_);
975     windowElementMap_[windowId] = elementId;
976 }
977 
RemovePair(const int32_t windowId)978 void AccessibilityWindowManager::SceneBoardElementIdMap::RemovePair(const int32_t windowId)
979 {
980     std::lock_guard<ffrt::mutex> lock(mapMutex_);
981     windowElementMap_.erase(windowId);
982 }
983 
CheckWindowIdPair(const int32_t windowId)984 bool AccessibilityWindowManager::SceneBoardElementIdMap::CheckWindowIdPair(const int32_t windowId)
985 {
986     std::lock_guard<ffrt::mutex> lock(mapMutex_);
987     return windowElementMap_.count(windowId);
988 }
989 
Clear()990 void AccessibilityWindowManager::SceneBoardElementIdMap::Clear()
991 {
992     std::lock_guard<ffrt::mutex> lock(mapMutex_);
993     windowElementMap_.clear();
994 }
995 
GetAllPairs()996 std::map<int32_t, int64_t> AccessibilityWindowManager::SceneBoardElementIdMap::GetAllPairs()
997 {
998     std::lock_guard<ffrt::mutex> lock(mapMutex_);
999     return windowElementMap_;
1000 }
1001 
GetFocusedWindowId(int32_t & focusedWindowId)1002 RetError AccessibilityWindowManager::GetFocusedWindowId(int32_t &focusedWindowId)
1003 {
1004     HILOG_DEBUG();
1005     HITRACE_METER_NAME(HITRACE_TAG_ACCESSIBILITY_MANAGER, "QueryFocusedWindowInfo");
1006     Rosen::FocusChangeInfo focusedWindowInfo;
1007     OHOS::Rosen::WindowManager::GetInstance().GetFocusWindowInfo(focusedWindowInfo);
1008     if (focusedWindowInfo.windowId_ == INVALID_WINDOW_ID) {
1009         return RET_ERR_INVALID_PARAM;
1010     }
1011     focusedWindowId = focusedWindowInfo.windowId_;
1012     return RET_OK;
1013 }
1014 
IsInnerWindowRootElement(int64_t elementId)1015 bool AccessibilityWindowManager::IsInnerWindowRootElement(int64_t elementId)
1016 {
1017     HILOG_DEBUG("IsInnerWindowRootElement elementId: %{public}" PRId64 "", elementId);
1018     auto mapTable = sceneBoardElementIdMap_.GetAllPairs();
1019     for (auto iter = mapTable.begin(); iter != mapTable.end(); iter++) {
1020         if (elementId == iter->second) {
1021             return true;
1022         }
1023     }
1024     return false;
1025 }
1026 } // namespace Accessibility
1027 } // namespace OHOS