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

Commit c4388e8d authored by Daniel Norman's avatar Daniel Norman Committed by Android (Google) Code Review
Browse files

Merge "Use window transform matrix & magnfication spec for DirectA11yConnection."

parents bbc0a58b 6779b6af
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -10718,7 +10718,8 @@ public final class ViewRootImpl implements ViewParent,
        public int ensureDirectConnection() {
            if (mDirectConnectionId == AccessibilityNodeInfo.UNDEFINED_CONNECTION_ID) {
                mDirectConnectionId = AccessibilityInteractionClient.addDirectConnection(
                        new AccessibilityInteractionConnection(ViewRootImpl.this));
                        new AccessibilityInteractionConnection(ViewRootImpl.this),
                        mAccessibilityManager);
                // Notify listeners in the app process.
                mAccessibilityManager.notifyAccessibilityStateChanged();
            }
+3 −2
Original line number Diff line number Diff line
@@ -275,7 +275,8 @@ public final class AccessibilityInteractionClient
     *
     * @param connection The ViewRootImpl's {@link IAccessibilityInteractionConnection}.
     */
    public static int addDirectConnection(IAccessibilityInteractionConnection connection) {
    public static int addDirectConnection(IAccessibilityInteractionConnection connection,
            AccessibilityManager accessibilityManager) {
        synchronized (sConnectionCache) {
            int connectionId = sDirectConnectionIdCounter++;
            if (getConnection(connectionId) != null) {
@@ -283,7 +284,7 @@ public final class AccessibilityInteractionClient
                        "Cannot add direct connection with existing id " + connectionId);
            }
            DirectAccessibilityConnection directAccessibilityConnection =
                    new DirectAccessibilityConnection(connection);
                    new DirectAccessibilityConnection(connection, accessibilityManager);
            sConnectionCache.put(connectionId, directAccessibilityConnection);
            sDirectConnectionCount++;
            // Do not use AccessibilityCache for this connection, since there is no corresponding
+27 −0
Original line number Diff line number Diff line
@@ -2431,4 +2431,31 @@ public final class AccessibilityManager {
            return true;
        }
    }

    /**
     * Retrieves the window's transformation matrix and magnification spec.
     *
     * <p>
     * Used by callers outside of the AccessibilityManagerService process which need
     * this information, like {@link android.view.accessibility.DirectAccessibilityConnection}.
     * </p>
     *
     * @return The transformation spec
     * @hide
     */
    public IAccessibilityManager.WindowTransformationSpec getWindowTransformationSpec(
            int windowId) {
        final IAccessibilityManager service;
        synchronized (mLock) {
            service = getServiceLocked();
            if (service == null) {
                return null;
            }
        }
        try {
            return service.getWindowTransformationSpec(windowId);
        } catch (RemoteException re) {
            throw re.rethrowFromSystemServer();
        }
    }
}
+19 −14
Original line number Diff line number Diff line
@@ -17,12 +17,10 @@
package android.view.accessibility;

import android.accessibilityservice.IAccessibilityServiceConnection;
import android.graphics.Matrix;
import android.graphics.Region;
import android.os.Bundle;
import android.os.Process;
import android.os.RemoteException;
import android.view.MagnificationSpec;

/**
 * Minimal {@link IAccessibilityServiceConnection} implementation that interacts
@@ -51,24 +49,21 @@ import android.view.MagnificationSpec;
 */
class DirectAccessibilityConnection extends IAccessibilityServiceConnection.Default {
    private final IAccessibilityInteractionConnection mAccessibilityInteractionConnection;
    private final AccessibilityManager mAccessibilityManager;

    // Fetch all views, but do not use prefetching/cache since this "connection" does not
    // receive cache invalidation events (as it is not linked to an AccessibilityService).
    private static final int FETCH_FLAGS =
            AccessibilityNodeInfo.FLAG_SERVICE_REQUESTS_REPORT_VIEW_IDS
                    | AccessibilityNodeInfo.FLAG_SERVICE_REQUESTS_INCLUDE_NOT_IMPORTANT_VIEWS;
    private static final MagnificationSpec MAGNIFICATION_SPEC = new MagnificationSpec();
    private static final int PID = Process.myPid();
    private static final Region INTERACTIVE_REGION = null;
    private static final float[] TRANSFORM_MATRIX = new float[9];

    static {
        Matrix.IDENTITY_MATRIX.getValues(TRANSFORM_MATRIX);
    }

    DirectAccessibilityConnection(
            IAccessibilityInteractionConnection accessibilityInteractionConnection) {
            IAccessibilityInteractionConnection accessibilityInteractionConnection,
            AccessibilityManager accessibilityManager) {
        mAccessibilityInteractionConnection = accessibilityInteractionConnection;
        mAccessibilityManager = accessibilityManager;
    }

    @Override
@@ -76,9 +71,11 @@ class DirectAccessibilityConnection extends IAccessibilityServiceConnection.Defa
            long accessibilityNodeId, int interactionId,
            IAccessibilityInteractionConnectionCallback callback, int flags, long threadId,
            Bundle arguments) throws RemoteException {
        IAccessibilityManager.WindowTransformationSpec spec =
                mAccessibilityManager.getWindowTransformationSpec(accessibilityWindowId);
        mAccessibilityInteractionConnection.findAccessibilityNodeInfoByAccessibilityId(
                accessibilityNodeId, INTERACTIVE_REGION, interactionId, callback, FETCH_FLAGS, PID,
                threadId, MAGNIFICATION_SPEC, TRANSFORM_MATRIX, arguments);
                threadId, spec.magnificationSpec, spec.transformationMatrix, arguments);
        return new String[0];
    }

@@ -87,9 +84,11 @@ class DirectAccessibilityConnection extends IAccessibilityServiceConnection.Defa
            long accessibilityNodeId, String text, int interactionId,
            IAccessibilityInteractionConnectionCallback callback, long threadId)
            throws RemoteException {
        IAccessibilityManager.WindowTransformationSpec spec =
                mAccessibilityManager.getWindowTransformationSpec(accessibilityWindowId);
        mAccessibilityInteractionConnection.findAccessibilityNodeInfosByText(accessibilityNodeId,
                text, INTERACTIVE_REGION, interactionId, callback, FETCH_FLAGS, PID, threadId,
                MAGNIFICATION_SPEC, TRANSFORM_MATRIX);
                spec.magnificationSpec, spec.transformationMatrix);
        return new String[0];
    }

@@ -98,9 +97,11 @@ class DirectAccessibilityConnection extends IAccessibilityServiceConnection.Defa
            long accessibilityNodeId, String viewId, int interactionId,
            IAccessibilityInteractionConnectionCallback callback, long threadId)
            throws RemoteException {
        IAccessibilityManager.WindowTransformationSpec spec =
                mAccessibilityManager.getWindowTransformationSpec(accessibilityWindowId);
        mAccessibilityInteractionConnection.findAccessibilityNodeInfosByViewId(accessibilityNodeId,
                viewId, INTERACTIVE_REGION, interactionId, callback, FETCH_FLAGS, PID, threadId,
                MAGNIFICATION_SPEC, TRANSFORM_MATRIX);
                spec.magnificationSpec, spec.transformationMatrix);
        return new String[0];
    }

@@ -108,9 +109,11 @@ class DirectAccessibilityConnection extends IAccessibilityServiceConnection.Defa
    public String[] findFocus(int accessibilityWindowId, long accessibilityNodeId, int focusType,
            int interactionId, IAccessibilityInteractionConnectionCallback callback, long threadId)
            throws RemoteException {
        IAccessibilityManager.WindowTransformationSpec spec =
                mAccessibilityManager.getWindowTransformationSpec(accessibilityWindowId);
        mAccessibilityInteractionConnection.findFocus(accessibilityNodeId, focusType,
                INTERACTIVE_REGION, interactionId, callback, FETCH_FLAGS, PID, threadId,
                MAGNIFICATION_SPEC, TRANSFORM_MATRIX);
                spec.magnificationSpec, spec.transformationMatrix);
        return new String[0];
    }

@@ -118,9 +121,11 @@ class DirectAccessibilityConnection extends IAccessibilityServiceConnection.Defa
    public String[] focusSearch(int accessibilityWindowId, long accessibilityNodeId, int direction,
            int interactionId, IAccessibilityInteractionConnectionCallback callback, long threadId)
            throws RemoteException {
        IAccessibilityManager.WindowTransformationSpec spec =
                mAccessibilityManager.getWindowTransformationSpec(accessibilityWindowId);
        mAccessibilityInteractionConnection.focusSearch(accessibilityNodeId, direction,
                INTERACTIVE_REGION, interactionId, callback, FETCH_FLAGS, PID, threadId,
                MAGNIFICATION_SPEC, TRANSFORM_MATRIX);
                spec.magnificationSpec, spec.transformationMatrix);
        return new String[0];
    }

+7 −0
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ import android.view.accessibility.AccessibilityWindowAttributes;
import android.view.accessibility.IWindowMagnificationConnection;
import android.view.InputEvent;
import android.view.IWindow;
import android.view.MagnificationSpec;

/**
 * Interface implemented by the AccessibilityManagerService called by
@@ -124,4 +125,10 @@ interface IAccessibilityManager {
    boolean startFlashNotificationSequence(String opPkg, int reason, IBinder token);
    boolean stopFlashNotificationSequence(String opPkg);
    boolean startFlashNotificationEvent(String opPkg, int reason, String reasonPkg);

    parcelable WindowTransformationSpec {
        float[] transformationMatrix;
        MagnificationSpec magnificationSpec;
    }
    WindowTransformationSpec getWindowTransformationSpec(int windowId);
}
Loading