Loading core/java/android/view/ViewRootImpl.java +2 −1 Original line number Diff line number Diff line Loading @@ -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(); } Loading core/java/android/view/accessibility/AccessibilityInteractionClient.java +3 −2 Original line number Diff line number Diff line Loading @@ -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) { Loading @@ -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 Loading core/java/android/view/accessibility/AccessibilityManager.java +27 −0 Original line number Diff line number Diff line Loading @@ -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(); } } } core/java/android/view/accessibility/DirectAccessibilityConnection.java +19 −14 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 Loading @@ -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]; } Loading @@ -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]; } Loading @@ -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]; } Loading @@ -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]; } Loading @@ -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]; } Loading core/java/android/view/accessibility/IAccessibilityManager.aidl +7 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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
core/java/android/view/ViewRootImpl.java +2 −1 Original line number Diff line number Diff line Loading @@ -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(); } Loading
core/java/android/view/accessibility/AccessibilityInteractionClient.java +3 −2 Original line number Diff line number Diff line Loading @@ -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) { Loading @@ -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 Loading
core/java/android/view/accessibility/AccessibilityManager.java +27 −0 Original line number Diff line number Diff line Loading @@ -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(); } } }
core/java/android/view/accessibility/DirectAccessibilityConnection.java +19 −14 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 Loading @@ -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]; } Loading @@ -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]; } Loading @@ -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]; } Loading @@ -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]; } Loading @@ -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]; } Loading
core/java/android/view/accessibility/IAccessibilityManager.aidl +7 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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); }