From f40da1a884493b6af61e3b978fdf7c7ff059b2dc Mon Sep 17 00:00:00 2001 From: Eugene Susla Date: Mon, 26 Feb 2018 10:41:28 -0800 Subject: [PATCH] Sort A11yService#getWindows by layer descending This is what A11yService#getWindows promises in the javadoc. Fixes: 71581072 Test: using testback ensure the order is correct Change-Id: I5038c4de29c60e235b65751f7bd7771ef35eb339 --- .../android/accessibilityservice/AccessibilityService.java | 2 +- core/java/android/app/UiAutomation.java | 13 ++++++++++--- .../AbstractAccessibilityServiceConnection.java | 3 +-- .../server/accessibility/AccessibilityManagerService.java | 6 +++++- 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java index 0a4541ba4777..829a94446937 100644 --- a/core/java/android/accessibilityservice/AccessibilityService.java +++ b/core/java/android/accessibilityservice/AccessibilityService.java @@ -537,7 +537,7 @@ public abstract class AccessibilityService extends Service { * anything behind it, then only the modal window will be reported * (assuming it is the top one). For convenience the returned windows * are ordered in a descending layer order, which is the windows that - * are higher in the Z-order are reported first. Since the user can always + * are on top are reported first. Since the user can always * interact with the window that has input focus by typing, the focused * window is always returned (even if covered by a modal window). *

diff --git a/core/java/android/app/UiAutomation.java b/core/java/android/app/UiAutomation.java index 8f0168530273..1b4b6eadb103 100644 --- a/core/java/android/app/UiAutomation.java +++ b/core/java/android/app/UiAutomation.java @@ -24,7 +24,6 @@ import android.accessibilityservice.IAccessibilityServiceConnection; import android.annotation.NonNull; import android.annotation.TestApi; import android.graphics.Bitmap; -import android.graphics.Canvas; import android.graphics.Point; import android.graphics.Rect; import android.graphics.Region; @@ -47,6 +46,7 @@ import android.view.accessibility.AccessibilityInteractionClient; import android.view.accessibility.AccessibilityNodeInfo; import android.view.accessibility.AccessibilityWindowInfo; import android.view.accessibility.IAccessibilityInteractionConnection; + import libcore.io.IoUtils; import java.io.IOException; @@ -580,6 +580,8 @@ public final class UiAutomation { // Execute the command *without* the lock being held. command.run(); + List receivedEvents = new ArrayList<>(); + // Acquire the lock and wait for the event. try { // Wait for the event. @@ -600,14 +602,14 @@ public final class UiAutomation { if (filter.accept(event)) { return event; } - event.recycle(); + receivedEvents.add(event); } // Check if timed out and if not wait. final long elapsedTimeMillis = SystemClock.uptimeMillis() - startTimeMillis; final long remainingTimeMillis = timeoutMillis - elapsedTimeMillis; if (remainingTimeMillis <= 0) { throw new TimeoutException("Expected event not received within: " - + timeoutMillis + " ms."); + + timeoutMillis + " ms among: " + receivedEvents); } synchronized (mLock) { if (mEventQueue.isEmpty()) { @@ -620,6 +622,11 @@ public final class UiAutomation { } } } finally { + int size = receivedEvents.size(); + for (int i = 0; i < size; i++) { + receivedEvents.get(i).recycle(); + } + synchronized (mLock) { mWaitingForEventDelivery = false; mEventQueue.clear(); diff --git a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java index ed068b931bad..38ae9ab4bde9 100644 --- a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java +++ b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java @@ -53,7 +53,6 @@ import android.view.accessibility.AccessibilityWindowInfo; import android.view.accessibility.IAccessibilityInteractionConnection; import android.view.accessibility.IAccessibilityInteractionConnectionCallback; - import com.android.internal.os.SomeArgs; import com.android.internal.util.DumpUtils; import com.android.server.accessibility.AccessibilityManagerService.RemoteAccessibilityConnection; @@ -76,7 +75,7 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ implements ServiceConnection, IBinder.DeathRecipient, KeyEventDispatcher.KeyEventFilter, FingerprintGestureDispatcher.FingerprintGestureClient { private static final boolean DEBUG = false; - private static final String LOG_TAG = "AccessibilityClientConnection"; + private static final String LOG_TAG = "AbstractAccessibilityServiceConnection"; protected final Context mContext; protected final SystemSupport mSystemSupport; diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index 0c3a5d186a4e..a73dd7e7065b 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -2945,7 +2945,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub | AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED | AccessibilityEvent.TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY; - // In Z order + // In Z order top to bottom public List mWindows; public SparseArray mA11yWindowInfoById = new SparseArray<>(); public SparseArray mWindowInfoById = new SparseArray<>(); @@ -3136,6 +3136,10 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub ? mWindowsForAccessibilityCallback.populateReportedWindow(windowInfo) : null; if (window != null) { + + // Flip layers in list to be consistent with AccessibilityService#getWindows + window.setLayer(windowCount - 1 - window.getLayer()); + final int windowId = window.getId(); if (window.isFocused()) { mFocusedWindowId = windowId; -- 2.11.0