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) {