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