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();
 }