Eliminate race condition for a11y windows
Update the window list when a new window is registered
with a11y.
Bug: 111766358
Test: A11y CTS.
Change-Id: Id5ec3db3da1849b5de91cce55a67d8241e489e1f
diff --git a/services/core/java/com/android/server/wm/AccessibilityController.java b/services/core/java/com/android/server/wm/AccessibilityController.java
index f0898c0..e449111 100644
--- a/services/core/java/com/android/server/wm/AccessibilityController.java
+++ b/services/core/java/com/android/server/wm/AccessibilityController.java
@@ -119,13 +119,13 @@
}
}
- public void performComputeChangedWindowsNotLocked() {
+ public void performComputeChangedWindowsNotLocked(boolean forceSend) {
WindowsForAccessibilityObserver observer = null;
synchronized (mService) {
observer = mWindowsForAccessibilityObserver;
}
if (observer != null) {
- observer.performComputeChangedWindowsNotLocked();
+ observer.performComputeChangedWindowsNotLocked(forceSend);
}
}
@@ -193,7 +193,7 @@
observer = mWindowsForAccessibilityObserver;
}
if (observer != null) {
- observer.performComputeChangedWindowsNotLocked();
+ observer.performComputeChangedWindowsNotLocked(false);
}
}
@@ -1011,12 +1011,12 @@
mHandler = new MyHandler(mService.mH.getLooper());
mRecurringAccessibilityEventsIntervalMillis = ViewConfiguration
.getSendRecurringAccessibilityEventsInterval();
- computeChangedWindows();
+ computeChangedWindows(true);
}
- public void performComputeChangedWindowsNotLocked() {
+ public void performComputeChangedWindowsNotLocked(boolean forceSend) {
mHandler.removeMessages(MyHandler.MESSAGE_COMPUTE_CHANGED_WINDOWS);
- computeChangedWindows();
+ computeChangedWindows(forceSend);
}
public void scheduleComputeChangedWindowsLocked() {
@@ -1026,7 +1026,12 @@
}
}
- public void computeChangedWindows() {
+ /**
+ * Check if windows have changed, and send them to the accessibilty subsystem if they have.
+ *
+ * @param forceSend Send the windows the accessibility even if they haven't changed.
+ */
+ public void computeChangedWindows(boolean forceSend) {
if (DEBUG) {
Slog.i(LOG_TAG, "computeChangedWindows()");
}
@@ -1171,36 +1176,38 @@
visibleWindows.clear();
addedWindows.clear();
- // We computed the windows and if they changed notify the client.
- if (mOldWindows.size() != windows.size()) {
- // Different size means something changed.
- windowsChanged = true;
- } else if (!mOldWindows.isEmpty() || !windows.isEmpty()) {
- // Since we always traverse windows from high to low layer
- // the old and new windows at the same index should be the
- // same, otherwise something changed.
- for (int i = 0; i < windowCount; i++) {
- WindowInfo oldWindow = mOldWindows.get(i);
- WindowInfo newWindow = windows.get(i);
- // We do not care for layer changes given the window
- // order does not change. This brings no new information
- // to the clients.
- if (windowChangedNoLayer(oldWindow, newWindow)) {
- windowsChanged = true;
- break;
+ if (!forceSend) {
+ // We computed the windows and if they changed notify the client.
+ if (mOldWindows.size() != windows.size()) {
+ // Different size means something changed.
+ windowsChanged = true;
+ } else if (!mOldWindows.isEmpty() || !windows.isEmpty()) {
+ // Since we always traverse windows from high to low layer
+ // the old and new windows at the same index should be the
+ // same, otherwise something changed.
+ for (int i = 0; i < windowCount; i++) {
+ WindowInfo oldWindow = mOldWindows.get(i);
+ WindowInfo newWindow = windows.get(i);
+ // We do not care for layer changes given the window
+ // order does not change. This brings no new information
+ // to the clients.
+ if (windowChangedNoLayer(oldWindow, newWindow)) {
+ windowsChanged = true;
+ break;
+ }
}
}
}
- if (windowsChanged) {
+ if (forceSend || windowsChanged) {
cacheWindows(windows);
}
}
// Now we do not hold the lock, so send the windows over.
- if (windowsChanged) {
+ if (forceSend || windowsChanged) {
if (DEBUG) {
- Log.i(LOG_TAG, "Windows changed:" + windows);
+ Log.i(LOG_TAG, "Windows changed or force sending:" + windows);
}
mCallback.onWindowsForAccessibilityChanged(windows);
} else {
@@ -1345,7 +1352,7 @@
public void handleMessage(Message message) {
switch (message.what) {
case MESSAGE_COMPUTE_CHANGED_WINDOWS: {
- computeChangedWindows();
+ computeChangedWindows(false);
} break;
}
}