public QueryController(UiAutomatorBridge bridge) { mUiAutomatorBridge = bridge; bridge.setOnAccessibilityEventListener( new OnAccessibilityEventListener() { @Override public void onAccessibilityEvent(AccessibilityEvent event) { synchronized (mLock) { switch (event.getEventType()) { case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED: // don't trust event.getText(), check for nulls if (event.getText() != null && event.getText().size() > 0) { if (event.getText().get(0) != null) mLastActivityName = event.getText().get(0).toString(); } break; case AccessibilityEvent.TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY: // don't trust event.getText(), check for nulls if (event.getText() != null && event.getText().size() > 0) if (event.getText().get(0) != null) mLastTraversedText = event.getText().get(0).toString(); if (DEBUG) Log.d(LOG_TAG, "Last text selection reported: " + mLastTraversedText); break; } mLock.notifyAll(); } } }); }
/** * Last activity to report accessibility events. * * @deprecated The results returned should be considered unreliable * @return String name of activity */ @Deprecated public String getCurrentActivityName() { mUiAutomatorBridge.waitForIdle(); synchronized (mLock) { return mLastActivityName; } }
/** * Returns the last text selection reported by accessibility event * TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY. One way to cause this event is using a DPad * arrows to focus on UI elements. */ public String getLastTraversedText() { mUiAutomatorBridge.waitForIdle(); synchronized (mLock) { if (mLastTraversedText.length() > 0) { return mLastTraversedText; } } return null; }
/** * Gets the root node from accessibility and if it fails to get one it will retry every 250ms for * up to 1000ms. * * @return null if no root node is obtained */ protected AccessibilityNodeInfo getRootNode() { final int maxRetry = 4; final long waitInterval = 250; AccessibilityNodeInfo rootNode = null; for (int x = 0; x < maxRetry; x++) { rootNode = mUiAutomatorBridge.getRootInActiveWindow(); if (rootNode != null) { return rootNode; } if (x < maxRetry - 1) { Log.e(LOG_TAG, "Got null root node from accessibility - Retrying..."); SystemClock.sleep(waitInterval); } } return rootNode; }
protected AccessibilityNodeInfo findAccessibilityNodeInfo( UiSelector selector, boolean isCounting) { mUiAutomatorBridge.waitForIdle(); initializeNewSearch(); if (DEBUG) Log.d(LOG_TAG, "Searching: " + selector); synchronized (mLock) { AccessibilityNodeInfo rootNode = getRootNode(); if (rootNode == null) { Log.e(LOG_TAG, "Cannot proceed when root node is null. Aborted search"); return null; } // Copy so that we don't modify the original's sub selectors UiSelector uiSelector = new UiSelector(selector); return translateCompoundSelector(uiSelector, rootNode, isCounting); } }
/** Clears the last text selection value saved from the TYPE_VIEW_TEXT_SELECTION_CHANGED event */ public void clearLastTraversedText() { mUiAutomatorBridge.waitForIdle(); synchronized (mLock) { mLastTraversedText = ""; } }
/** * Last package to report accessibility events * * @return String name of package */ public String getCurrentPackageName() { mUiAutomatorBridge.waitForIdle(); AccessibilityNodeInfo rootNode = getRootNode(); if (rootNode == null) return null; return rootNode.getPackageName() != null ? rootNode.getPackageName().toString() : null; }
public AccessibilityNodeInfo getAccessibilityRootNode() { return mUiAutomatorBridge.getRootInActiveWindow(); }