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

Commit 3f730ebf authored by Jacky Kao's avatar Jacky Kao
Browse files

Supporting windows updated per display [Part II]

Creating new class, DisplayWindowsObserver implementing
WindowManagerInternal.WindowsForAccessibilityCallback, receives
updated windows from window manager.

Bug: 132854721
Test: a11y CTS & unit tests
Test: atest AccessibilityWindowManagerTest
Change-Id: I211da59d72c284e4a87574d3fc1955f44036800a
parent 3dd2c377
Loading
Loading
Loading
Loading
+10 −7
Original line number Diff line number Diff line
@@ -396,7 +396,8 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
            if (!mSecurityPolicy.checkAccessibilityAccess(this)) {
                return null;
            }
            AccessibilityWindowInfo window = mA11yWindowManager.findA11yWindowInfoById(windowId);
            AccessibilityWindowInfo window =
                    mA11yWindowManager.findA11yWindowInfoByIdLocked(windowId);
            if (window != null) {
                AccessibilityWindowInfo windowClone = AccessibilityWindowInfo.obtain(window);
                windowClone.setConnectionId(mId);
@@ -1356,11 +1357,11 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
                    || (action == ACTION_CLEAR_ACCESSIBILITY_FOCUS);
            if (!isA11yFocusAction) {
                final WindowInfo windowInfo =
                        mA11yWindowManager.findWindowInfoById(resolvedWindowId);
                        mA11yWindowManager.findWindowInfoByIdLocked(resolvedWindowId);
                if (windowInfo != null) activityToken = windowInfo.activityToken;
            }
            final AccessibilityWindowInfo a11yWindowInfo =
                    mA11yWindowManager.findA11yWindowInfoById(resolvedWindowId);
                    mA11yWindowManager.findA11yWindowInfoByIdLocked(resolvedWindowId);
            if (a11yWindowInfo != null && a11yWindowInfo.isInPictureInPictureMode()
                    && mA11yWindowManager.getPictureInPictureActionReplacingConnection() != null
                    && !isA11yFocusAction) {
@@ -1413,12 +1414,14 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
            int interactionId, int interrogatingPid, long interrogatingTid) {
        final RemoteAccessibilityConnection pipActionReplacingConnection =
                mA11yWindowManager.getPictureInPictureActionReplacingConnection();
        synchronized (mLock) {
            final AccessibilityWindowInfo windowInfo =
                mA11yWindowManager.findA11yWindowInfoById(resolvedWindowId);
                    mA11yWindowManager.findA11yWindowInfoByIdLocked(resolvedWindowId);
            if ((windowInfo == null) || !windowInfo.isInPictureInPictureMode()
                || (pipActionReplacingConnection == null)) {
                return originalCallback;
            }
        }
        return new ActionReplacingCallback(originalCallback,
                pipActionReplacingConnection.getRemote(), interactionId,
                interrogatingPid, interrogatingTid);
+2 −2
Original line number Diff line number Diff line
@@ -541,7 +541,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
            if (event.getWindowId() ==
                AccessibilityWindowInfo.PICTURE_IN_PICTURE_ACTION_REPLACER_WINDOW_ID) {
                // The replacer window isn't shown to services. Move its events into the pip.
                AccessibilityWindowInfo pip = mA11yWindowManager.getPictureInPictureWindow();
                AccessibilityWindowInfo pip = mA11yWindowManager.getPictureInPictureWindowLocked();
                if (pip != null) {
                    int pipId = pip.getId();
                    event.setWindowId(pipId);
@@ -770,7 +770,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
            if (resolvedUserId != mCurrentUserId) {
                return null;
            }
            if (mA11yWindowManager.findA11yWindowInfoById(windowId) == null) {
            if (mA11yWindowManager.findA11yWindowInfoByIdLocked(windowId) == null) {
                return null;
            }
            return mA11yWindowManager.getWindowTokenForUserAndWindowIdLocked(userId, windowId);
+1 −1
Original line number Diff line number Diff line
@@ -429,7 +429,7 @@ public class AccessibilitySecurityPolicy {
        if (windowId == mAccessibilityWindowManager.getActiveWindowId(userId)) {
            return true;
        }
        return mAccessibilityWindowManager.findA11yWindowInfoById(windowId) != null;
        return mAccessibilityWindowManager.findA11yWindowInfoByIdLocked(windowId) != null;
    }

    private boolean isShellAllowedToRetrieveWindowLocked(int userId, int windowId) {
+658 −523

File changed.

Preview size limit exceeded, changes collapsed.

+2 −2
Original line number Diff line number Diff line
@@ -179,9 +179,9 @@ public class AbstractAccessibilityServiceConnectionTest {
        addA11yWindowInfo(mA11yWindowInfos, WINDOWID, false);
        addA11yWindowInfo(mA11yWindowInfos, PIP_WINDOWID, true);
        when(mMockA11yWindowManager.getWindowListLocked()).thenReturn(mA11yWindowInfos);
        when(mMockA11yWindowManager.findA11yWindowInfoById(WINDOWID))
        when(mMockA11yWindowManager.findA11yWindowInfoByIdLocked(WINDOWID))
                .thenReturn(mA11yWindowInfos.get(0));
        when(mMockA11yWindowManager.findA11yWindowInfoById(PIP_WINDOWID))
        when(mMockA11yWindowManager.findA11yWindowInfoByIdLocked(PIP_WINDOWID))
                .thenReturn(mA11yWindowInfos.get(1));
        final RemoteAccessibilityConnection conn = getRemoteA11yConnection(
                WINDOWID, mMockIA11yInteractionConnection, PACKAGE_NAME1);
Loading