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