Skip waitForIdle when in watcher context

* Should already have waited for idle prior to running watchers, and
  since watchers may be executed for each operation/iteration, this can
  add a lot of repeated idle checks and take a long time.

Bug: 332352437
Test: ./gradlew :test:uiautomator:i:t:cAT
Change-Id: I8c65ead246dee1d1d99562e0f7d934a9fa30db16
diff --git a/test/uiautomator/uiautomator/src/androidTest/java/androidx/test/uiautomator/UiDeviceTest.java b/test/uiautomator/uiautomator/src/androidTest/java/androidx/test/uiautomator/UiDeviceTest.java
index f32e8d2..0286b1b 100644
--- a/test/uiautomator/uiautomator/src/androidTest/java/androidx/test/uiautomator/UiDeviceTest.java
+++ b/test/uiautomator/uiautomator/src/androidTest/java/androidx/test/uiautomator/UiDeviceTest.java
@@ -26,6 +26,7 @@
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.atLeastOnce;
 import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
@@ -245,4 +246,18 @@
         mDevice.waitForIdle(123L);
         verify(mUiAutomation, times(1)).waitForIdle(anyLong(), eq(123L));
     }
+
+    @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.P)
+    public void testWaitForIdle_watcher() throws Exception {
+        UiWatcher watcher = () -> {
+            mDevice.waitForIdle();
+            return true;
+        };
+        mDevice.registerWatcher(WATCHER_NAME, watcher);
+        mDevice.runWatchers();
+
+        // Wait for idle skipped during watcher execution.
+        verify(mUiAutomation, never()).waitForIdle(anyLong(), anyLong());
+    }
 }
diff --git a/test/uiautomator/uiautomator/src/main/java/androidx/test/uiautomator/QueryController.java b/test/uiautomator/uiautomator/src/main/java/androidx/test/uiautomator/QueryController.java
index 184b5fd..37ec308 100644
--- a/test/uiautomator/uiautomator/src/main/java/androidx/test/uiautomator/QueryController.java
+++ b/test/uiautomator/uiautomator/src/main/java/androidx/test/uiautomator/QueryController.java
@@ -528,6 +528,9 @@
      * @param timeout in milliseconds
      */
     public void waitForIdle(long timeout) {
+        if (mDevice.isInWatcherContext()) {
+            return; // Skip in watcher context, assuming already idle prior to running watchers.
+        }
         try {
             mDevice.getUiAutomation().waitForIdle(QUIET_TIME_TO_BE_CONSIDERED_IDLE_STATE, timeout);
         } catch (TimeoutException e) {