diff options
author | Svetoslav Ganov <svetoslavganov@google.com> | 2011-06-09 14:47:38 -0700 |
---|---|---|
committer | Svetoslav Ganov <svetoslavganov@google.com> | 2011-06-09 15:44:24 -0700 |
commit | 601ad8061cb8dcf3ab7385fa9e9dd13f15dc8ece (patch) | |
tree | 2ddae4cbc4745126034dbf1bba97cb4a9d938e6f | |
parent | fe93010446e68c747f4af727cbc48eaf63131689 (diff) | |
download | frameworks_base-601ad8061cb8dcf3ab7385fa9e9dd13f15dc8ece.zip frameworks_base-601ad8061cb8dcf3ab7385fa9e9dd13f15dc8ece.tar.gz frameworks_base-601ad8061cb8dcf3ab7385fa9e9dd13f15dc8ece.tar.bz2 |
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
-rw-r--r-- | core/java/android/view/ViewAncestor.java | 61 | ||||
-rw-r--r-- | core/tests/coretests/src/android/accessibilityservice/InterrogationActivityTest.java | 15 |
2 files changed, 43 insertions, 33 deletions
diff --git a/core/java/android/view/ViewAncestor.java b/core/java/android/view/ViewAncestor.java index da26aba..0a5b6aa0 100644 --- a/core/java/android/view/ViewAncestor.java +++ b/core/java/android/view/ViewAncestor.java @@ -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: { - getAccessibilityInteractionController() - .findAccessibilityNodeInfoByAccessibilityIdUiThread(msg); + if (mView != null) { + getAccessibilityInteractionController() + .findAccessibilityNodeInfoByAccessibilityIdUiThread(msg); + } } break; case DO_PERFORM_ACCESSIBILITY_ACTION: { - getAccessibilityInteractionController() - .perfromAccessibilityActionUiThread(msg); + if (mView != null) { + getAccessibilityInteractionController() + .perfromAccessibilityActionUiThread(msg); + } } break; case DO_FIND_ACCESSIBLITY_NODE_INFO_BY_VIEW_ID: { - getAccessibilityInteractionController() - .findAccessibilityNodeInfoByViewIdUiThread(msg); + if (mView != null) { + getAccessibilityInteractionController() + .findAccessibilityNodeInfoByViewIdUiThread(msg); + } } break; case DO_FIND_ACCESSIBLITY_NODE_INFO_BY_VIEW_TEXT: { - getAccessibilityInteractionController() - .findAccessibilityNodeInfosByViewTextUiThread(msg); + 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; - } - getAccessibilityInteractionController() - .findAccessibilityNodeInfoByAccessibilityIdClientThread(accessibilityId, + 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); } - 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); } - 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); } - getAccessibilityInteractionController() - .findAccessibilityNodeInfosByViewTextClientThread(text, interactionId, callback); } } diff --git a/core/tests/coretests/src/android/accessibilityservice/InterrogationActivityTest.java b/core/tests/coretests/src/android/accessibilityservice/InterrogationActivityTest.java index a20cc1f..3260616 100644 --- a/core/tests/coretests/src/android/accessibilityservice/InterrogationActivityTest.java +++ b/core/tests/coretests/src/android/accessibilityservice/InterrogationActivityTest.java @@ -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(); @@ -436,7 +442,10 @@ public class InterrogationActivityTest public void onInterrupt() {} public void onAccessibilityEvent(AccessibilityEvent event) { - sLastAccessibilityEvent= AccessibilityEvent.obtain(event); + sLastAccessibilityEvent = AccessibilityEvent.obtain(event); + synchronized (sConnection) { + sConnection.notifyAll(); + } } }; IAccessibilityManager manager = IAccessibilityManager.Stub.asInterface( |