summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java27
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java15
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AccessibilityWindowManager.java14
-rw-r--r--services/tests/servicestests/src/com/android/server/accessibility/AbstractAccessibilityServiceConnectionTest.java24
4 files changed, 62 insertions, 18 deletions
diff --git a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java
index 1d936f263cb8..cdb062d1963c 100644
--- a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java
+++ b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java
@@ -352,7 +352,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
@Override
public List<AccessibilityWindowInfo> getWindows() {
- ensureWindowsAvailableTimed();
+ ensureWindowsAvailableTimed(Display.DEFAULT_DISPLAY);
synchronized (mLock) {
if (!hasRightsToCurrentUserLocked()) {
return null;
@@ -362,8 +362,6 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
if (!permissionGranted) {
return null;
}
- // TODO [Multi-Display] (b/134891479) :
- // using correct display Id to replace DEFAULT_DISPLAY.
List<AccessibilityWindowInfo> internalWindowList =
mA11yWindowManager.getWindowListLocked(Display.DEFAULT_DISPLAY);
if (internalWindowList == null) {
@@ -387,7 +385,14 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
@Override
public AccessibilityWindowInfo getWindow(int windowId) {
- ensureWindowsAvailableTimed();
+ int displayId = Display.INVALID_DISPLAY;
+ synchronized (mLock) {
+ if (windowId != AccessibilityWindowInfo.UNDEFINED_WINDOW_ID) {
+ displayId = mA11yWindowManager.getDisplayIdByUserIdAndWindowIdLocked(
+ mSystemSupport.getCurrentUserIdLocked(), windowId);
+ }
+ }
+ ensureWindowsAvailableTimed(displayId);
synchronized (mLock) {
if (!hasRightsToCurrentUserLocked()) {
return null;
@@ -1308,28 +1313,28 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
/**
* Request that the system make sure windows are available to interrogate.
+ *
+ * @param displayId The logical display id.
*/
- private void ensureWindowsAvailableTimed() {
+ private void ensureWindowsAvailableTimed(int displayId) {
synchronized (mLock) {
- // TODO [Multi-Display] (b/134891479) :
- // using correct display Id to replace DEFAULT_DISPLAY.
- if (mA11yWindowManager.getWindowListLocked(Display.DEFAULT_DISPLAY) != null) {
+ if (mA11yWindowManager.getWindowListLocked(displayId) != null) {
return;
}
// If we have no registered callback, update the state we
// we may have to register one but it didn't happen yet.
- if (!mA11yWindowManager.isTrackingWindowsLocked(Display.DEFAULT_DISPLAY)) {
+ if (!mA11yWindowManager.isTrackingWindowsLocked(displayId)) {
// Invokes client change to make sure tracking window enabled.
mSystemSupport.onClientChangeLocked(false);
}
// We have no windows but do not care about them, done.
- if (!mA11yWindowManager.isTrackingWindowsLocked(Display.DEFAULT_DISPLAY)) {
+ if (!mA11yWindowManager.isTrackingWindowsLocked(displayId)) {
return;
}
// Wait for the windows with a timeout.
final long startMillis = SystemClock.uptimeMillis();
- while (mA11yWindowManager.getWindowListLocked(Display.DEFAULT_DISPLAY) == null) {
+ while (mA11yWindowManager.getWindowListLocked(displayId) == null) {
final long elapsedMillis = SystemClock.uptimeMillis() - startMillis;
final long remainMillis = WAIT_WINDOWS_TIMEOUT_MILLIS - elapsedMillis;
if (remainMillis <= 0) {
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index ddf5bbec7eb1..feb7329bdda6 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -580,17 +580,24 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
// Make sure clients receiving this event will be able to get the
// current state of the windows as the window manager may be delaying
// the computation for performance reasons.
- // TODO [Multi-Display] : using correct display Id to replace DEFAULT_DISPLAY.
boolean shouldComputeWindows = false;
+ int displayId = Display.INVALID_DISPLAY;
synchronized (mLock) {
+ final int windowId = event.getWindowId();
if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED
- && mA11yWindowManager.isTrackingWindowsLocked(Display.DEFAULT_DISPLAY)) {
+ && windowId != AccessibilityWindowInfo.UNDEFINED_WINDOW_ID) {
+ displayId = mA11yWindowManager.getDisplayIdByUserIdAndWindowIdLocked(
+ mCurrentUserId, windowId);
+ }
+ if (displayId != Display.INVALID_DISPLAY
+ && mA11yWindowManager.isTrackingWindowsLocked(displayId)) {
shouldComputeWindows = true;
}
}
if (shouldComputeWindows) {
- WindowManagerInternal wm = LocalServices.getService(WindowManagerInternal.class);
- wm.computeWindowsForAccessibility(Display.DEFAULT_DISPLAY);
+ final WindowManagerInternal wm = LocalServices.getService(
+ WindowManagerInternal.class);
+ wm.computeWindowsForAccessibility(displayId);
}
synchronized (mLock) {
notifyAccessibilityServicesDelayedLocked(event, false);
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityWindowManager.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityWindowManager.java
index 82a593cdfd7f..0038a27db384 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityWindowManager.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityWindowManager.java
@@ -1463,6 +1463,20 @@ public class AccessibilityWindowManager {
}
/**
+ * Returns the display ID according to given userId and windowId.
+ *
+ * @param userId The userId
+ * @param windowId The windowId
+ * @return The display ID
+ */
+ public int getDisplayIdByUserIdAndWindowIdLocked(int userId, int windowId) {
+ final IBinder windowToken = getWindowTokenForUserAndWindowIdLocked(userId, windowId);
+ final int displayId = mWindowManagerInternal.getDisplayIdForWindow(windowToken);
+
+ return displayId;
+ }
+
+ /**
* Gets current input focused window token from window manager, and returns its windowId.
*
* @param userId The userId
diff --git a/services/tests/servicestests/src/com/android/server/accessibility/AbstractAccessibilityServiceConnectionTest.java b/services/tests/servicestests/src/com/android/server/accessibility/AbstractAccessibilityServiceConnectionTest.java
index 356423ad0590..73dcb98abc8c 100644
--- a/services/tests/servicestests/src/com/android/server/accessibility/AbstractAccessibilityServiceConnectionTest.java
+++ b/services/tests/servicestests/src/com/android/server/accessibility/AbstractAccessibilityServiceConnectionTest.java
@@ -111,6 +111,8 @@ public class AbstractAccessibilityServiceConnectionTest {
private static final String VIEW_TEXT = "test_view_text";
private static final int WINDOWID = 12;
private static final int PIP_WINDOWID = 13;
+ private static final int WINDOWID_ONSECONDDISPLAY = 14;
+ private static final int SECONDARY_DISPLAY_ID = Display.DEFAULT_DISPLAY + 1;
private static final int SERVICE_ID = 42;
private static final int A11Y_SERVICE_CAPABILITY = CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT
| CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION
@@ -135,6 +137,7 @@ public class AbstractAccessibilityServiceConnectionTest {
private AbstractAccessibilityServiceConnection mServiceConnection;
private MessageCapturingHandler mHandler = new MessageCapturingHandler(null);
private final List<AccessibilityWindowInfo> mA11yWindowInfos = new ArrayList<>();
+ private final List<AccessibilityWindowInfo> mA11yWindowInfosOnSecondDisplay = new ArrayList<>();
private Callable[] mFindA11yNodesFunctions;
private Callable<Boolean> mPerformA11yAction;
@@ -177,14 +180,22 @@ public class AbstractAccessibilityServiceConnectionTest {
when(mMockPackageManager.hasSystemFeature(FEATURE_FINGERPRINT)).thenReturn(true);
// Fake a11yWindowInfo and remote a11y connection for tests.
- addA11yWindowInfo(mA11yWindowInfos, WINDOWID, false);
- addA11yWindowInfo(mA11yWindowInfos, PIP_WINDOWID, true);
+ addA11yWindowInfo(mA11yWindowInfos, WINDOWID, false, Display.DEFAULT_DISPLAY);
+ addA11yWindowInfo(mA11yWindowInfos, PIP_WINDOWID, true, Display.DEFAULT_DISPLAY);
+ addA11yWindowInfo(mA11yWindowInfosOnSecondDisplay, WINDOWID_ONSECONDDISPLAY, false,
+ SECONDARY_DISPLAY_ID);
when(mMockA11yWindowManager.getWindowListLocked(Display.DEFAULT_DISPLAY))
.thenReturn(mA11yWindowInfos);
when(mMockA11yWindowManager.findA11yWindowInfoByIdLocked(WINDOWID))
.thenReturn(mA11yWindowInfos.get(0));
when(mMockA11yWindowManager.findA11yWindowInfoByIdLocked(PIP_WINDOWID))
.thenReturn(mA11yWindowInfos.get(1));
+ when(mMockA11yWindowManager.getDisplayIdByUserIdAndWindowIdLocked(USER_ID,
+ WINDOWID_ONSECONDDISPLAY)).thenReturn(SECONDARY_DISPLAY_ID);
+ when(mMockA11yWindowManager.getWindowListLocked(SECONDARY_DISPLAY_ID))
+ .thenReturn(mA11yWindowInfosOnSecondDisplay);
+ when(mMockA11yWindowManager.findA11yWindowInfoByIdLocked(WINDOWID_ONSECONDDISPLAY))
+ .thenReturn(mA11yWindowInfosOnSecondDisplay.get(0));
final RemoteAccessibilityConnection conn = getRemoteA11yConnection(
WINDOWID, mMockIA11yInteractionConnection, PACKAGE_NAME1);
final RemoteAccessibilityConnection connPip = getRemoteA11yConnection(
@@ -327,6 +338,12 @@ public class AbstractAccessibilityServiceConnectionTest {
}
@Test
+ public void getWindow_onNonDefaultDisplay() {
+ assertThat(mServiceConnection.getWindow(WINDOWID_ONSECONDDISPLAY),
+ is(mA11yWindowInfosOnSecondDisplay.get(0)));
+ }
+
+ @Test
public void accessAccessibilityNodeInfo_whenCantGetInfo_returnNullOrFalse()
throws Exception {
when(mMockSecurityPolicy.canGetAccessibilityNodeInfoLocked(
@@ -674,9 +691,10 @@ public class AbstractAccessibilityServiceConnectionTest {
}
private AccessibilityWindowInfo addA11yWindowInfo(List<AccessibilityWindowInfo> infos,
- int windowId, boolean isPip) {
+ int windowId, boolean isPip, int displayId) {
final AccessibilityWindowInfo info = AccessibilityWindowInfo.obtain();
info.setId(windowId);
+ info.setDisplayId(displayId);
info.setPictureInPicture(isPip);
infos.add(info);
return info;