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

This commit is contained in:
Daniel Norman
2023-02-14 21:48:40 +00:00
committed by Android (Google) Code Review
6 changed files with 70 additions and 17 deletions

View File

@@ -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();
}

View File

@@ -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

View File

@@ -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();
}
}
}

View File

@@ -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];
}

View File

@@ -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);
}

View File

@@ -528,6 +528,18 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
}
}
@Override
public IAccessibilityManager.WindowTransformationSpec getWindowTransformationSpec(
int windowId) {
IAccessibilityManager.WindowTransformationSpec windowTransformationSpec =
new IAccessibilityManager.WindowTransformationSpec();
Pair<float[], MagnificationSpec> result =
getWindowTransformationMatrixAndMagnificationSpec(windowId);
windowTransformationSpec.transformationMatrix = result.first;
windowTransformationSpec.magnificationSpec = result.second;
return windowTransformationSpec;
}
@Override
public void onServiceInfoChangedLocked(AccessibilityUserState userState) {
mSecurityPolicy.onBoundServicesChangedLocked(userState.mUserId,