From 12e1ea6a42b837b918e8f643d04d79e69db07737 Mon Sep 17 00:00:00 2001 From: lucychang Date: Wed, 7 Oct 2020 12:34:19 +0800 Subject: Using windowId from A11yWindowInfo instead AccessibilityManagerService#getWindowBounds would return null if using the windowId comes from the embedded hierarchy, and EventDispatch#computeClickLocation will return CLICK_LOCATION_NONE and can't perform long-click action. The fix try to use AccessibilityWindowInfo's windowId to get correct window token to get window bounds. Bug: 161857059 Test: a11y CTS & unit tests Change-Id: I5a978177352e973f06a856826a43910a9b655b29 --- .../server/accessibility/AccessibilityManagerService.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index 9ddf7a4fb79b..d71b919818ea 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -941,10 +941,19 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub if (resolvedUserId != mCurrentUserId) { return null; } - if (mA11yWindowManager.findA11yWindowInfoByIdLocked(windowId) == null) { + final AccessibilityWindowInfo accessibilityWindowInfo = mA11yWindowManager + .findA11yWindowInfoByIdLocked(windowId); + if (accessibilityWindowInfo == null) { return null; } - return mA11yWindowManager.getWindowTokenForUserAndWindowIdLocked(userId, windowId); + // We use AccessibilityWindowInfo#getId instead of windowId. When the windowId comes + // from an embedded hierarchy, the system can't find correct window token because + // embedded hierarchy doesn't have windowInfo. Calling + // AccessibilityWindowManager#findA11yWindowInfoByIdLocked can look for its parent's + // windowInfo, so it is safer to use AccessibilityWindowInfo#getId + // to get window token to find real window. + return mA11yWindowManager.getWindowTokenForUserAndWindowIdLocked(userId, + accessibilityWindowInfo.getId()); } } -- cgit v1.2.3-59-g8ed1b