Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 601ad806 authored by Svetoslav Ganov's avatar Svetoslav Ganov
Browse files

Invalid access to AccessibilityInteractionController

1. The Interaction connection checks if the ViewAncestor
   is valid and posts a message to be processed on the UI
   thread. The code in the UI thread did not check if
   the mView was valid. Added this check.

2. Added a faster sync mechanism in the test for
   getting the source of the last access event.

Change-Id: I9982b6592f5f44a68a67df40f37c063a3ba62993
parent fe930104
Loading
Loading
Loading
Loading
+31 −30
Original line number Diff line number Diff line
@@ -2321,20 +2321,28 @@ public final class ViewAncestor extends Handler implements ViewParent,
            handleDispatchSystemUiVisibilityChanged(msg.arg1);
        } break;
        case DO_FIND_ACCESSIBLITY_NODE_INFO_BY_ACCESSIBILITY_ID: {
            if (mView != null) {
                getAccessibilityInteractionController()
                    .findAccessibilityNodeInfoByAccessibilityIdUiThread(msg);
            }
        } break;
        case DO_PERFORM_ACCESSIBILITY_ACTION: {
            if (mView != null) {
                getAccessibilityInteractionController()
                    .perfromAccessibilityActionUiThread(msg);
            }
        } break;
        case DO_FIND_ACCESSIBLITY_NODE_INFO_BY_VIEW_ID: {
            if (mView != null) {
                getAccessibilityInteractionController()
                    .findAccessibilityNodeInfoByViewIdUiThread(msg);
            }
        } break;
        case DO_FIND_ACCESSIBLITY_NODE_INFO_BY_VIEW_TEXT: {
            if (mView != null) {
                getAccessibilityInteractionController()
                    .findAccessibilityNodeInfosByViewTextUiThread(msg);
            }
        } break;
        }
    }
@@ -4149,44 +4157,37 @@ public final class ViewAncestor extends Handler implements ViewParent,

        public void findAccessibilityNodeInfoByAccessibilityId(int accessibilityId,
                int interactionId, IAccessibilityInteractionConnectionCallback callback) {
            final ViewAncestor viewAncestor = mViewAncestor.get();
            if (viewAncestor == null) {
                return;
            }
            if (mViewAncestor.get() != null) {
                getAccessibilityInteractionController()
                    .findAccessibilityNodeInfoByAccessibilityIdClientThread(accessibilityId,
                        interactionId, callback);
            }
        }

        public void performAccessibilityAction(int accessibilityId, int action,
                int interactionId, IAccessibilityInteractionConnectionCallback callback) {
            final ViewAncestor viewAncestor = mViewAncestor.get();
            if (viewAncestor == null) {
                return;
            }
            if (mViewAncestor.get() != null) {
                getAccessibilityInteractionController()
                    .performAccessibilityActionClientThread(accessibilityId, action, interactionId,
                            callback);
            }
        }

        public void findAccessibilityNodeInfoByViewId(int viewId,
                int interactionId, IAccessibilityInteractionConnectionCallback callback) {
            final ViewAncestor viewAncestor = mViewAncestor.get();
            if (viewAncestor == null) {
                return;
            }
            if (mViewAncestor.get() != null) {
                getAccessibilityInteractionController()
                    .findAccessibilityNodeInfoByViewIdClientThread(viewId, interactionId, callback);
            }
        }

        public void findAccessibilityNodeInfosByViewText(String text, int interactionId,
                IAccessibilityInteractionConnectionCallback callback) {
            final ViewAncestor viewAncestor = mViewAncestor.get();
            if (viewAncestor == null) {
                return;
            }
            if (mViewAncestor.get() != null) {
                getAccessibilityInteractionController()
                .findAccessibilityNodeInfosByViewTextClientThread(text, interactionId, callback);
                    .findAccessibilityNodeInfosByViewTextClientThread(text, interactionId,
                            callback);
            }
        }
    }

+12 −3
Original line number Diff line number Diff line
@@ -29,7 +29,6 @@ import android.os.SystemClock;
import android.provider.Settings;
import android.test.ActivityInstrumentationTestCase2;
import android.test.suitebuilder.annotation.LargeTest;
import android.util.Log;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.AccessibilityNodeInfo;
@@ -305,7 +304,14 @@ public class InterrogationActivityTest

            // focus the view
            assertTrue(button.performAction(ACTION_FOCUS));
            SystemClock.sleep(200);

            synchronized (sConnection) {
                try {
                    sConnection.wait(500);
                } catch (InterruptedException ie) {
                    /* ignore */
                }
            }

            // check that last event source
            AccessibilityNodeInfo source = sLastAccessibilityEvent.getSource();
@@ -437,6 +443,9 @@ public class InterrogationActivityTest

                public void onAccessibilityEvent(AccessibilityEvent event) {
                    sLastAccessibilityEvent = AccessibilityEvent.obtain(event);
                    synchronized (sConnection) {
                        sConnection.notifyAll();
                    }
                }
            };
            IAccessibilityManager manager = IAccessibilityManager.Stub.asInterface(