diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 480abe03b5f3a..ff0e3264746b3 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -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(); } diff --git a/core/java/android/view/accessibility/AccessibilityInteractionClient.java b/core/java/android/view/accessibility/AccessibilityInteractionClient.java index 3da3ab9cded50..d9fcfb578232c 100644 --- a/core/java/android/view/accessibility/AccessibilityInteractionClient.java +++ b/core/java/android/view/accessibility/AccessibilityInteractionClient.java @@ -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 diff --git a/core/java/android/view/accessibility/AccessibilityManager.java b/core/java/android/view/accessibility/AccessibilityManager.java index d405c0b5b24fb..aa631cfa59804 100644 --- a/core/java/android/view/accessibility/AccessibilityManager.java +++ b/core/java/android/view/accessibility/AccessibilityManager.java @@ -2431,4 +2431,31 @@ public final class AccessibilityManager { return true; } } + + /** + * Retrieves the window's transformation matrix and magnification spec. + * + *
+ * Used by callers outside of the AccessibilityManagerService process which need + * this information, like {@link android.view.accessibility.DirectAccessibilityConnection}. + *
+ * + * @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(); + } + } } diff --git a/core/java/android/view/accessibility/DirectAccessibilityConnection.java b/core/java/android/view/accessibility/DirectAccessibilityConnection.java index dcc5660a64d60..8a3bb6fda361a 100644 --- a/core/java/android/view/accessibility/DirectAccessibilityConnection.java +++ b/core/java/android/view/accessibility/DirectAccessibilityConnection.java @@ -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]; } diff --git a/core/java/android/view/accessibility/IAccessibilityManager.aidl b/core/java/android/view/accessibility/IAccessibilityManager.aidl index 098e97c49fcc6..1302421d0ce2e 100644 --- a/core/java/android/view/accessibility/IAccessibilityManager.aidl +++ b/core/java/android/view/accessibility/IAccessibilityManager.aidl @@ -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); } diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index 311e43afd29aa..72c5598c33630 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -528,6 +528,18 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub } } + @Override + public IAccessibilityManager.WindowTransformationSpec getWindowTransformationSpec( + int windowId) { + IAccessibilityManager.WindowTransformationSpec windowTransformationSpec = + new IAccessibilityManager.WindowTransformationSpec(); + Pair