Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 98561796 authored by Phil Weaver's avatar Phil Weaver
Browse files

Don't clear a11y focus with lock held

The bug I'm fixing is kind of weird, but in the trace it
showed lock contention with onWindowsForAccessibilityChanged
holding the lock for a long time. So I've cleaned up that
method a bit, looking for trouble. The only concrete thing
I see that's wrong is that I was clearing a11y focus, which
involves calling the app that last reported having focus.
That was done with the lock held. Now doing it through the
handler.

Bug: 77298850
Test: Ran a11y CTS and unit tests.
Change-Id: I667707412a0e3ba98639d0cb43858e8c6b52a5a7
parent f0e74ae8
Loading
Loading
Loading
Loading
+14 −7
Original line number Diff line number Diff line
@@ -2721,7 +2721,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
            }
        }

        private AccessibilityWindowInfo populateReportedWindow(WindowInfo window) {
        private AccessibilityWindowInfo populateReportedWindowLocked(WindowInfo window) {
            final int windowId = findWindowIdLocked(window.token);
            if (windowId < 0) {
                return null;
@@ -3140,10 +3140,14 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
                    mAccessibilityFocusedWindowId != INVALID_WINDOW_ID;
            if (windowCount > 0) {
                for (int i = 0; i < windowCount; i++) {
                    WindowInfo windowInfo = windows.get(i);
                    AccessibilityWindowInfo window = (mWindowsForAccessibilityCallback != null)
                            ? mWindowsForAccessibilityCallback.populateReportedWindow(windowInfo)
                            : null;
                    final WindowInfo windowInfo = windows.get(i);
                    final AccessibilityWindowInfo window;
                    if (mWindowsForAccessibilityCallback != null) {
                        window = mWindowsForAccessibilityCallback
                                .populateReportedWindowLocked(windowInfo);
                    } else {
                        window = null;
                    }
                    if (window != null) {

                        // Flip layers in list to be consistent with AccessibilityService#getWindows
@@ -3173,7 +3177,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
                // active window once we decided which it is.
                final int accessibilityWindowCount = mWindows.size();
                for (int i = 0; i < accessibilityWindowCount; i++) {
                    AccessibilityWindowInfo window = mWindows.get(i);
                    final AccessibilityWindowInfo window = mWindows.get(i);
                    if (window.getId() == mActiveWindowId) {
                        window.setActive(true);
                    }
@@ -3192,7 +3196,10 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
            }

            if (shouldClearAccessibilityFocus) {
                clearAccessibilityFocus(mAccessibilityFocusedWindowId);
                mMainHandler.sendMessage(obtainMessage(
                        AccessibilityManagerService::clearAccessibilityFocus,
                        AccessibilityManagerService.this,
                        box(mAccessibilityFocusedWindowId)));
            }
        }