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