Use window transform matrix & magnfication spec for DirectA11yConnection.
Bug: 251914173 Test: atest AccessibilityEndToEndTest Change-Id: Idbea42bce308fff03cc3cde2f45e0e14006486bb
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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];
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user