Loading core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl +38 −42 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package android.accessibilityservice; import android.accessibilityservice.AccessibilityServiceInfo; import android.view.accessibility.AccessibilityNodeInfo; import android.view.accessibility.IAccessibilityInteractionConnectionCallback; /** * Interface given to an AccessibilitySerivce to talk to the AccessibilityManagerService. Loading @@ -30,84 +31,79 @@ interface IAccessibilityServiceConnection { /** * Finds an {@link AccessibilityNodeInfo} by accessibility id. * <p> * <strong> * It is a client responsibility to recycle the received info by * calling {@link AccessibilityNodeInfo#recycle()} to avoid creating * of multiple instances. * </strong> * </p> * * @param accessibilityWindowId A unique window id. * @param accessibilityViewId A unique View accessibility id. * @return The node info. * @param interactionId The id of the interaction for matching with the callback result. * @param callback Callback which to receive the result. * @param threadId The id of the calling thread. * @return The current window scale, where zero means a failure. */ AccessibilityNodeInfo findAccessibilityNodeInfoByAccessibilityId(int accessibilityWindowId, int accessibilityViewId); float findAccessibilityNodeInfoByAccessibilityId(int accessibilityWindowId, int accessibilityViewId, int interactionId, IAccessibilityInteractionConnectionCallback callback, long threadId); /** * Finds {@link AccessibilityNodeInfo}s by View text. The match is case * insensitive containment. The search is performed in the window whose * id is specified and starts from the View whose accessibility id is * specified. * <p> * <strong> * It is a client responsibility to recycle the received infos by * calling {@link AccessibilityNodeInfo#recycle()} to avoid creating * of multiple instances. * </strong> * </p> * * @param text The searched text. * @param accessibilityId The id of the view from which to start searching. * @param accessibilityWindowId A unique window id. * @param accessibilityViewId A unique View accessibility id from where to start the search. * Use {@link android.view.View#NO_ID} to start from the root. * @return A list of node info. * @param interactionId The id of the interaction for matching with the callback result. * @param callback Callback which to receive the result. * @param threadId The id of the calling thread. * @return The current window scale, where zero means a failure. */ List<AccessibilityNodeInfo> findAccessibilityNodeInfosByViewText(String text, int accessibilityWindowId, int accessibilityViewId); float findAccessibilityNodeInfosByViewText(String text, int accessibilityWindowId, int accessibilityViewId, int interractionId, IAccessibilityInteractionConnectionCallback callback, long threadId); /** * Finds {@link AccessibilityNodeInfo}s by View text. The match is case * insensitive containment. The search is performed in the currently * active window and start from the root View in the window. * <p> * <strong> * It is a client responsibility to recycle the received infos by * calling {@link AccessibilityNodeInfo#recycle()} to avoid creating * of multiple instances. * </strong> * </p> * * @param text The searched text. * @param accessibilityId The id of the view from which to start searching. * Use {@link android.view.View#NO_ID} to start from the root. * @return A list of node info. * @param interactionId The id of the interaction for matching with the callback result. * @param callback Callback which to receive the result. * @param threadId The id of the calling thread. * @return The current window scale, where zero means a failure. */ List<AccessibilityNodeInfo> findAccessibilityNodeInfosByViewTextInActiveWindow(String text); float findAccessibilityNodeInfosByViewTextInActiveWindow(String text, int interactionId, IAccessibilityInteractionConnectionCallback callback, long threadId); /** * Finds an {@link AccessibilityNodeInfo} by View id. The search is performed * in the currently active window and start from the root View in the window. * <p> * <strong> * It is a client responsibility to recycle the received info by * calling {@link AccessibilityNodeInfo#recycle()} to avoid creating * of multiple instances. * </strong> * </p> * in the currently active window and starts from the root View in the window. * * @param id The id of the node. * @return The node info. * @param interactionId The id of the interaction for matching with the callback result. * @param callback Callback which to receive the result. * @param threadId The id of the calling thread. * @return The current window scale, where zero means a failure. */ AccessibilityNodeInfo findAccessibilityNodeInfoByViewIdInActiveWindow(int viewId); float findAccessibilityNodeInfoByViewIdInActiveWindow(int viewId, int interactionId, IAccessibilityInteractionConnectionCallback callback, long threadId); /** * Performs an accessibility action on an {@link AccessibilityNodeInfo}. * * @param accessibilityWindowId The id of the window. * @param accessibilityViewId The of a view in the . * @param accessibilityViewId A unique View accessibility id. * @param action The action to perform. * @param interactionId The id of the interaction for matching with the callback result. * @param callback Callback which to receive the result. * @param threadId The id of the calling thread. * @return Whether the action was performed. */ boolean performAccessibilityAction(int accessibilityWindowId, int accessibilityViewId, int action); int action, int interactionId, IAccessibilityInteractionConnectionCallback callback, long threadId); } core/java/android/view/ViewRootImpl.java +66 −16 Original line number Diff line number Diff line Loading @@ -61,6 +61,7 @@ import android.util.SparseArray; import android.util.TypedValue; import android.view.View.MeasureSpec; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityInteractionClient; import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener; import android.view.accessibility.AccessibilityNodeInfo; Loading Loading @@ -4362,37 +4363,42 @@ public final class ViewRootImpl extends Handler implements ViewParent, } public void findAccessibilityNodeInfoByAccessibilityId(int accessibilityId, int interactionId, IAccessibilityInteractionConnectionCallback callback) { int interactionId, IAccessibilityInteractionConnectionCallback callback, int interrogatingPid, long interrogatingTid) { if (mViewAncestor.get() != null) { getAccessibilityInteractionController() .findAccessibilityNodeInfoByAccessibilityIdClientThread(accessibilityId, interactionId, callback); interactionId, callback, interrogatingPid, interrogatingTid); } } public void performAccessibilityAction(int accessibilityId, int action, int interactionId, IAccessibilityInteractionConnectionCallback callback) { int interactionId, IAccessibilityInteractionConnectionCallback callback, int interogatingPid, long interrogatingTid) { if (mViewAncestor.get() != null) { getAccessibilityInteractionController() .performAccessibilityActionClientThread(accessibilityId, action, interactionId, callback); callback, interogatingPid, interrogatingTid); } } public void findAccessibilityNodeInfoByViewId(int viewId, int interactionId, IAccessibilityInteractionConnectionCallback callback) { int interactionId, IAccessibilityInteractionConnectionCallback callback, int interrogatingPid, long interrogatingTid) { if (mViewAncestor.get() != null) { getAccessibilityInteractionController() .findAccessibilityNodeInfoByViewIdClientThread(viewId, interactionId, callback); .findAccessibilityNodeInfoByViewIdClientThread(viewId, interactionId, callback, interrogatingPid, interrogatingTid); } } public void findAccessibilityNodeInfosByViewText(String text, int accessibilityId, int interactionId, IAccessibilityInteractionConnectionCallback callback) { int interactionId, IAccessibilityInteractionConnectionCallback callback, int interrogatingPid, long interrogatingTid) { if (mViewAncestor.get() != null) { getAccessibilityInteractionController() .findAccessibilityNodeInfosByViewTextClientThread(text, accessibilityId, interactionId, callback); interactionId, callback, interrogatingPid, interrogatingTid); } } } Loading Loading @@ -4468,14 +4474,25 @@ public final class ViewRootImpl extends Handler implements ViewParent, } public void findAccessibilityNodeInfoByAccessibilityIdClientThread(int accessibilityId, int interactionId, IAccessibilityInteractionConnectionCallback callback) { int interactionId, IAccessibilityInteractionConnectionCallback callback, int interrogatingPid, long interrogatingTid) { Message message = Message.obtain(); message.what = DO_FIND_ACCESSIBLITY_NODE_INFO_BY_ACCESSIBILITY_ID; message.arg1 = accessibilityId; message.arg2 = interactionId; message.obj = callback; // If the interrogation is performed by the same thread as the main UI // thread in this process, set the message as a static reference so // after this call completes the same thread but in the interrogating // client can handle the message to generate the result. if (interrogatingPid == Process.myPid() && interrogatingTid == Looper.getMainLooper().getThread().getId()) { message.setTarget(ViewRootImpl.this); AccessibilityInteractionClient.getInstance().setSameThreadMessage(message); } else { sendMessage(message); } } public void findAccessibilityNodeInfoByAccessibilityIdUiThread(Message message) { final int accessibilityId = message.arg1; Loading @@ -4502,14 +4519,25 @@ public final class ViewRootImpl extends Handler implements ViewParent, } public void findAccessibilityNodeInfoByViewIdClientThread(int viewId, int interactionId, IAccessibilityInteractionConnectionCallback callback) { IAccessibilityInteractionConnectionCallback callback, int interrogatingPid, long interrogatingTid) { Message message = Message.obtain(); message.what = DO_FIND_ACCESSIBLITY_NODE_INFO_BY_VIEW_ID; message.arg1 = viewId; message.arg2 = interactionId; message.obj = callback; // If the interrogation is performed by the same thread as the main UI // thread in this process, set the message as a static reference so // after this call completes the same thread but in the interrogating // client can handle the message to generate the result. if (interrogatingPid == Process.myPid() && interrogatingTid == Looper.getMainLooper().getThread().getId()) { message.setTarget(ViewRootImpl.this); AccessibilityInteractionClient.getInstance().setSameThreadMessage(message); } else { sendMessage(message); } } public void findAccessibilityNodeInfoByViewIdUiThread(Message message) { final int viewId = message.arg1; Loading @@ -4535,7 +4563,8 @@ public final class ViewRootImpl extends Handler implements ViewParent, public void findAccessibilityNodeInfosByViewTextClientThread(String text, int accessibilityViewId, int interactionId, IAccessibilityInteractionConnectionCallback callback) { IAccessibilityInteractionConnectionCallback callback, int interrogatingPid, long interrogatingTid) { Message message = Message.obtain(); message.what = DO_FIND_ACCESSIBLITY_NODE_INFO_BY_VIEW_TEXT; SomeArgs args = mPool.acquire(); Loading @@ -4544,8 +4573,18 @@ public final class ViewRootImpl extends Handler implements ViewParent, args.argi2 = interactionId; args.arg2 = callback; message.obj = args; // If the interrogation is performed by the same thread as the main UI // thread in this process, set the message as a static reference so // after this call completes the same thread but in the interrogating // client can handle the message to generate the result. if (interrogatingPid == Process.myPid() && interrogatingTid == Looper.getMainLooper().getThread().getId()) { message.setTarget(ViewRootImpl.this); AccessibilityInteractionClient.getInstance().setSameThreadMessage(message); } else { sendMessage(message); } } public void findAccessibilityNodeInfosByViewTextUiThread(Message message) { SomeArgs args = (SomeArgs) message.obj; Loading Loading @@ -4597,7 +4636,8 @@ public final class ViewRootImpl extends Handler implements ViewParent, } public void performAccessibilityActionClientThread(int accessibilityId, int action, int interactionId, IAccessibilityInteractionConnectionCallback callback) { int interactionId, IAccessibilityInteractionConnectionCallback callback, int interogatingPid, long interrogatingTid) { Message message = Message.obtain(); message.what = DO_PERFORM_ACCESSIBILITY_ACTION; SomeArgs args = mPool.acquire(); Loading @@ -4606,8 +4646,18 @@ public final class ViewRootImpl extends Handler implements ViewParent, args.argi3 = interactionId; args.arg1 = callback; message.obj = args; // If the interrogation is performed by the same thread as the main UI // thread in this process, set the message as a static reference so // after this call completes the same thread but in the interrogating // client can handle the message to generate the result. if (interogatingPid == Process.myPid() && interrogatingTid == Looper.getMainLooper().getThread().getId()) { message.setTarget(ViewRootImpl.this); AccessibilityInteractionClient.getInstance().setSameThreadMessage(message); } else { sendMessage(message); } } public void perfromAccessibilityActionUiThread(Message message) { SomeArgs args = (SomeArgs) message.obj; Loading core/java/android/view/accessibility/AccessibilityInteractionClient.java 0 → 100644 +462 −0 File added.Preview size limit exceeded, changes collapsed. Show changes core/java/android/view/accessibility/AccessibilityNodeInfo.java +12 −29 Original line number Diff line number Diff line Loading @@ -20,7 +20,6 @@ import android.accessibilityservice.IAccessibilityServiceConnection; import android.graphics.Rect; import android.os.Parcel; import android.os.Parcelable; import android.os.RemoteException; import android.text.TextUtils; import android.util.SparseIntArray; import android.view.View; Loading Loading @@ -181,13 +180,9 @@ public class AccessibilityNodeInfo implements Parcelable { if (!canPerformRequestOverConnection(childAccessibilityViewId)) { return null; } try { return mConnection.findAccessibilityNodeInfoByAccessibilityId(mAccessibilityWindowId, childAccessibilityViewId); } catch (RemoteException re) { /* ignore*/ } return null; AccessibilityInteractionClient client = AccessibilityInteractionClient.getInstance(); return client.findAccessibilityNodeInfoByAccessibilityId(mConnection, mAccessibilityWindowId, childAccessibilityViewId); } /** Loading Loading @@ -257,13 +252,9 @@ public class AccessibilityNodeInfo implements Parcelable { if (!canPerformRequestOverConnection(mAccessibilityViewId)) { return false; } try { return mConnection.performAccessibilityAction(mAccessibilityWindowId, AccessibilityInteractionClient client = AccessibilityInteractionClient.getInstance(); return client.performAccessibilityAction(mConnection, mAccessibilityWindowId, mAccessibilityViewId, action); } catch (RemoteException e) { /* ignore */ } return false; } /** Loading @@ -284,13 +275,9 @@ public class AccessibilityNodeInfo implements Parcelable { if (!canPerformRequestOverConnection(mAccessibilityViewId)) { return Collections.emptyList(); } try { return mConnection.findAccessibilityNodeInfosByViewText(text, mAccessibilityWindowId, mAccessibilityViewId); } catch (RemoteException e) { /* ignore */ } return Collections.emptyList(); AccessibilityInteractionClient client = AccessibilityInteractionClient.getInstance(); return client.findAccessibilityNodeInfosByViewText(mConnection, text, mAccessibilityWindowId, mAccessibilityViewId); } /** Loading @@ -308,13 +295,9 @@ public class AccessibilityNodeInfo implements Parcelable { if (!canPerformRequestOverConnection(mAccessibilityViewId)) { return null; } try { return mConnection.findAccessibilityNodeInfoByAccessibilityId( AccessibilityInteractionClient client = AccessibilityInteractionClient.getInstance(); return client.findAccessibilityNodeInfoByAccessibilityId(mConnection, mAccessibilityWindowId, mParentAccessibilityViewId); } catch (RemoteException e) { /* ignore */ } return null; } /** Loading core/java/android/view/accessibility/AccessibilityRecord.java +3 −8 Original line number Diff line number Diff line Loading @@ -18,7 +18,6 @@ package android.view.accessibility; import android.accessibilityservice.IAccessibilityServiceConnection; import android.os.Parcelable; import android.os.RemoteException; import android.view.View; import java.util.ArrayList; Loading Loading @@ -127,13 +126,9 @@ public class AccessibilityRecord { if (mSourceWindowId == View.NO_ID || mSourceViewId == View.NO_ID || mConnection == null) { return null; } try { return mConnection.findAccessibilityNodeInfoByAccessibilityId(mSourceWindowId, AccessibilityInteractionClient client = AccessibilityInteractionClient.getInstance(); return client.findAccessibilityNodeInfoByAccessibilityId(mConnection, mSourceWindowId, mSourceViewId); } catch (RemoteException e) { /* ignore */ } return null; } /** Loading Loading
core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl +38 −42 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package android.accessibilityservice; import android.accessibilityservice.AccessibilityServiceInfo; import android.view.accessibility.AccessibilityNodeInfo; import android.view.accessibility.IAccessibilityInteractionConnectionCallback; /** * Interface given to an AccessibilitySerivce to talk to the AccessibilityManagerService. Loading @@ -30,84 +31,79 @@ interface IAccessibilityServiceConnection { /** * Finds an {@link AccessibilityNodeInfo} by accessibility id. * <p> * <strong> * It is a client responsibility to recycle the received info by * calling {@link AccessibilityNodeInfo#recycle()} to avoid creating * of multiple instances. * </strong> * </p> * * @param accessibilityWindowId A unique window id. * @param accessibilityViewId A unique View accessibility id. * @return The node info. * @param interactionId The id of the interaction for matching with the callback result. * @param callback Callback which to receive the result. * @param threadId The id of the calling thread. * @return The current window scale, where zero means a failure. */ AccessibilityNodeInfo findAccessibilityNodeInfoByAccessibilityId(int accessibilityWindowId, int accessibilityViewId); float findAccessibilityNodeInfoByAccessibilityId(int accessibilityWindowId, int accessibilityViewId, int interactionId, IAccessibilityInteractionConnectionCallback callback, long threadId); /** * Finds {@link AccessibilityNodeInfo}s by View text. The match is case * insensitive containment. The search is performed in the window whose * id is specified and starts from the View whose accessibility id is * specified. * <p> * <strong> * It is a client responsibility to recycle the received infos by * calling {@link AccessibilityNodeInfo#recycle()} to avoid creating * of multiple instances. * </strong> * </p> * * @param text The searched text. * @param accessibilityId The id of the view from which to start searching. * @param accessibilityWindowId A unique window id. * @param accessibilityViewId A unique View accessibility id from where to start the search. * Use {@link android.view.View#NO_ID} to start from the root. * @return A list of node info. * @param interactionId The id of the interaction for matching with the callback result. * @param callback Callback which to receive the result. * @param threadId The id of the calling thread. * @return The current window scale, where zero means a failure. */ List<AccessibilityNodeInfo> findAccessibilityNodeInfosByViewText(String text, int accessibilityWindowId, int accessibilityViewId); float findAccessibilityNodeInfosByViewText(String text, int accessibilityWindowId, int accessibilityViewId, int interractionId, IAccessibilityInteractionConnectionCallback callback, long threadId); /** * Finds {@link AccessibilityNodeInfo}s by View text. The match is case * insensitive containment. The search is performed in the currently * active window and start from the root View in the window. * <p> * <strong> * It is a client responsibility to recycle the received infos by * calling {@link AccessibilityNodeInfo#recycle()} to avoid creating * of multiple instances. * </strong> * </p> * * @param text The searched text. * @param accessibilityId The id of the view from which to start searching. * Use {@link android.view.View#NO_ID} to start from the root. * @return A list of node info. * @param interactionId The id of the interaction for matching with the callback result. * @param callback Callback which to receive the result. * @param threadId The id of the calling thread. * @return The current window scale, where zero means a failure. */ List<AccessibilityNodeInfo> findAccessibilityNodeInfosByViewTextInActiveWindow(String text); float findAccessibilityNodeInfosByViewTextInActiveWindow(String text, int interactionId, IAccessibilityInteractionConnectionCallback callback, long threadId); /** * Finds an {@link AccessibilityNodeInfo} by View id. The search is performed * in the currently active window and start from the root View in the window. * <p> * <strong> * It is a client responsibility to recycle the received info by * calling {@link AccessibilityNodeInfo#recycle()} to avoid creating * of multiple instances. * </strong> * </p> * in the currently active window and starts from the root View in the window. * * @param id The id of the node. * @return The node info. * @param interactionId The id of the interaction for matching with the callback result. * @param callback Callback which to receive the result. * @param threadId The id of the calling thread. * @return The current window scale, where zero means a failure. */ AccessibilityNodeInfo findAccessibilityNodeInfoByViewIdInActiveWindow(int viewId); float findAccessibilityNodeInfoByViewIdInActiveWindow(int viewId, int interactionId, IAccessibilityInteractionConnectionCallback callback, long threadId); /** * Performs an accessibility action on an {@link AccessibilityNodeInfo}. * * @param accessibilityWindowId The id of the window. * @param accessibilityViewId The of a view in the . * @param accessibilityViewId A unique View accessibility id. * @param action The action to perform. * @param interactionId The id of the interaction for matching with the callback result. * @param callback Callback which to receive the result. * @param threadId The id of the calling thread. * @return Whether the action was performed. */ boolean performAccessibilityAction(int accessibilityWindowId, int accessibilityViewId, int action); int action, int interactionId, IAccessibilityInteractionConnectionCallback callback, long threadId); }
core/java/android/view/ViewRootImpl.java +66 −16 Original line number Diff line number Diff line Loading @@ -61,6 +61,7 @@ import android.util.SparseArray; import android.util.TypedValue; import android.view.View.MeasureSpec; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityInteractionClient; import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener; import android.view.accessibility.AccessibilityNodeInfo; Loading Loading @@ -4362,37 +4363,42 @@ public final class ViewRootImpl extends Handler implements ViewParent, } public void findAccessibilityNodeInfoByAccessibilityId(int accessibilityId, int interactionId, IAccessibilityInteractionConnectionCallback callback) { int interactionId, IAccessibilityInteractionConnectionCallback callback, int interrogatingPid, long interrogatingTid) { if (mViewAncestor.get() != null) { getAccessibilityInteractionController() .findAccessibilityNodeInfoByAccessibilityIdClientThread(accessibilityId, interactionId, callback); interactionId, callback, interrogatingPid, interrogatingTid); } } public void performAccessibilityAction(int accessibilityId, int action, int interactionId, IAccessibilityInteractionConnectionCallback callback) { int interactionId, IAccessibilityInteractionConnectionCallback callback, int interogatingPid, long interrogatingTid) { if (mViewAncestor.get() != null) { getAccessibilityInteractionController() .performAccessibilityActionClientThread(accessibilityId, action, interactionId, callback); callback, interogatingPid, interrogatingTid); } } public void findAccessibilityNodeInfoByViewId(int viewId, int interactionId, IAccessibilityInteractionConnectionCallback callback) { int interactionId, IAccessibilityInteractionConnectionCallback callback, int interrogatingPid, long interrogatingTid) { if (mViewAncestor.get() != null) { getAccessibilityInteractionController() .findAccessibilityNodeInfoByViewIdClientThread(viewId, interactionId, callback); .findAccessibilityNodeInfoByViewIdClientThread(viewId, interactionId, callback, interrogatingPid, interrogatingTid); } } public void findAccessibilityNodeInfosByViewText(String text, int accessibilityId, int interactionId, IAccessibilityInteractionConnectionCallback callback) { int interactionId, IAccessibilityInteractionConnectionCallback callback, int interrogatingPid, long interrogatingTid) { if (mViewAncestor.get() != null) { getAccessibilityInteractionController() .findAccessibilityNodeInfosByViewTextClientThread(text, accessibilityId, interactionId, callback); interactionId, callback, interrogatingPid, interrogatingTid); } } } Loading Loading @@ -4468,14 +4474,25 @@ public final class ViewRootImpl extends Handler implements ViewParent, } public void findAccessibilityNodeInfoByAccessibilityIdClientThread(int accessibilityId, int interactionId, IAccessibilityInteractionConnectionCallback callback) { int interactionId, IAccessibilityInteractionConnectionCallback callback, int interrogatingPid, long interrogatingTid) { Message message = Message.obtain(); message.what = DO_FIND_ACCESSIBLITY_NODE_INFO_BY_ACCESSIBILITY_ID; message.arg1 = accessibilityId; message.arg2 = interactionId; message.obj = callback; // If the interrogation is performed by the same thread as the main UI // thread in this process, set the message as a static reference so // after this call completes the same thread but in the interrogating // client can handle the message to generate the result. if (interrogatingPid == Process.myPid() && interrogatingTid == Looper.getMainLooper().getThread().getId()) { message.setTarget(ViewRootImpl.this); AccessibilityInteractionClient.getInstance().setSameThreadMessage(message); } else { sendMessage(message); } } public void findAccessibilityNodeInfoByAccessibilityIdUiThread(Message message) { final int accessibilityId = message.arg1; Loading @@ -4502,14 +4519,25 @@ public final class ViewRootImpl extends Handler implements ViewParent, } public void findAccessibilityNodeInfoByViewIdClientThread(int viewId, int interactionId, IAccessibilityInteractionConnectionCallback callback) { IAccessibilityInteractionConnectionCallback callback, int interrogatingPid, long interrogatingTid) { Message message = Message.obtain(); message.what = DO_FIND_ACCESSIBLITY_NODE_INFO_BY_VIEW_ID; message.arg1 = viewId; message.arg2 = interactionId; message.obj = callback; // If the interrogation is performed by the same thread as the main UI // thread in this process, set the message as a static reference so // after this call completes the same thread but in the interrogating // client can handle the message to generate the result. if (interrogatingPid == Process.myPid() && interrogatingTid == Looper.getMainLooper().getThread().getId()) { message.setTarget(ViewRootImpl.this); AccessibilityInteractionClient.getInstance().setSameThreadMessage(message); } else { sendMessage(message); } } public void findAccessibilityNodeInfoByViewIdUiThread(Message message) { final int viewId = message.arg1; Loading @@ -4535,7 +4563,8 @@ public final class ViewRootImpl extends Handler implements ViewParent, public void findAccessibilityNodeInfosByViewTextClientThread(String text, int accessibilityViewId, int interactionId, IAccessibilityInteractionConnectionCallback callback) { IAccessibilityInteractionConnectionCallback callback, int interrogatingPid, long interrogatingTid) { Message message = Message.obtain(); message.what = DO_FIND_ACCESSIBLITY_NODE_INFO_BY_VIEW_TEXT; SomeArgs args = mPool.acquire(); Loading @@ -4544,8 +4573,18 @@ public final class ViewRootImpl extends Handler implements ViewParent, args.argi2 = interactionId; args.arg2 = callback; message.obj = args; // If the interrogation is performed by the same thread as the main UI // thread in this process, set the message as a static reference so // after this call completes the same thread but in the interrogating // client can handle the message to generate the result. if (interrogatingPid == Process.myPid() && interrogatingTid == Looper.getMainLooper().getThread().getId()) { message.setTarget(ViewRootImpl.this); AccessibilityInteractionClient.getInstance().setSameThreadMessage(message); } else { sendMessage(message); } } public void findAccessibilityNodeInfosByViewTextUiThread(Message message) { SomeArgs args = (SomeArgs) message.obj; Loading Loading @@ -4597,7 +4636,8 @@ public final class ViewRootImpl extends Handler implements ViewParent, } public void performAccessibilityActionClientThread(int accessibilityId, int action, int interactionId, IAccessibilityInteractionConnectionCallback callback) { int interactionId, IAccessibilityInteractionConnectionCallback callback, int interogatingPid, long interrogatingTid) { Message message = Message.obtain(); message.what = DO_PERFORM_ACCESSIBILITY_ACTION; SomeArgs args = mPool.acquire(); Loading @@ -4606,8 +4646,18 @@ public final class ViewRootImpl extends Handler implements ViewParent, args.argi3 = interactionId; args.arg1 = callback; message.obj = args; // If the interrogation is performed by the same thread as the main UI // thread in this process, set the message as a static reference so // after this call completes the same thread but in the interrogating // client can handle the message to generate the result. if (interogatingPid == Process.myPid() && interrogatingTid == Looper.getMainLooper().getThread().getId()) { message.setTarget(ViewRootImpl.this); AccessibilityInteractionClient.getInstance().setSameThreadMessage(message); } else { sendMessage(message); } } public void perfromAccessibilityActionUiThread(Message message) { SomeArgs args = (SomeArgs) message.obj; Loading
core/java/android/view/accessibility/AccessibilityInteractionClient.java 0 → 100644 +462 −0 File added.Preview size limit exceeded, changes collapsed. Show changes
core/java/android/view/accessibility/AccessibilityNodeInfo.java +12 −29 Original line number Diff line number Diff line Loading @@ -20,7 +20,6 @@ import android.accessibilityservice.IAccessibilityServiceConnection; import android.graphics.Rect; import android.os.Parcel; import android.os.Parcelable; import android.os.RemoteException; import android.text.TextUtils; import android.util.SparseIntArray; import android.view.View; Loading Loading @@ -181,13 +180,9 @@ public class AccessibilityNodeInfo implements Parcelable { if (!canPerformRequestOverConnection(childAccessibilityViewId)) { return null; } try { return mConnection.findAccessibilityNodeInfoByAccessibilityId(mAccessibilityWindowId, childAccessibilityViewId); } catch (RemoteException re) { /* ignore*/ } return null; AccessibilityInteractionClient client = AccessibilityInteractionClient.getInstance(); return client.findAccessibilityNodeInfoByAccessibilityId(mConnection, mAccessibilityWindowId, childAccessibilityViewId); } /** Loading Loading @@ -257,13 +252,9 @@ public class AccessibilityNodeInfo implements Parcelable { if (!canPerformRequestOverConnection(mAccessibilityViewId)) { return false; } try { return mConnection.performAccessibilityAction(mAccessibilityWindowId, AccessibilityInteractionClient client = AccessibilityInteractionClient.getInstance(); return client.performAccessibilityAction(mConnection, mAccessibilityWindowId, mAccessibilityViewId, action); } catch (RemoteException e) { /* ignore */ } return false; } /** Loading @@ -284,13 +275,9 @@ public class AccessibilityNodeInfo implements Parcelable { if (!canPerformRequestOverConnection(mAccessibilityViewId)) { return Collections.emptyList(); } try { return mConnection.findAccessibilityNodeInfosByViewText(text, mAccessibilityWindowId, mAccessibilityViewId); } catch (RemoteException e) { /* ignore */ } return Collections.emptyList(); AccessibilityInteractionClient client = AccessibilityInteractionClient.getInstance(); return client.findAccessibilityNodeInfosByViewText(mConnection, text, mAccessibilityWindowId, mAccessibilityViewId); } /** Loading @@ -308,13 +295,9 @@ public class AccessibilityNodeInfo implements Parcelable { if (!canPerformRequestOverConnection(mAccessibilityViewId)) { return null; } try { return mConnection.findAccessibilityNodeInfoByAccessibilityId( AccessibilityInteractionClient client = AccessibilityInteractionClient.getInstance(); return client.findAccessibilityNodeInfoByAccessibilityId(mConnection, mAccessibilityWindowId, mParentAccessibilityViewId); } catch (RemoteException e) { /* ignore */ } return null; } /** Loading
core/java/android/view/accessibility/AccessibilityRecord.java +3 −8 Original line number Diff line number Diff line Loading @@ -18,7 +18,6 @@ package android.view.accessibility; import android.accessibilityservice.IAccessibilityServiceConnection; import android.os.Parcelable; import android.os.RemoteException; import android.view.View; import java.util.ArrayList; Loading Loading @@ -127,13 +126,9 @@ public class AccessibilityRecord { if (mSourceWindowId == View.NO_ID || mSourceViewId == View.NO_ID || mConnection == null) { return null; } try { return mConnection.findAccessibilityNodeInfoByAccessibilityId(mSourceWindowId, AccessibilityInteractionClient client = AccessibilityInteractionClient.getInstance(); return client.findAccessibilityNodeInfoByAccessibilityId(mConnection, mSourceWindowId, mSourceViewId); } catch (RemoteException e) { /* ignore */ } return null; } /** Loading