Merge "Make ImePerfTest wait for animation end" into sc-dev am: 28a77d5846 am: 7a61b48724

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15161272

Change-Id: I51318a7165bfc5d874fba258a2b4d876024d52cc
diff --git a/apct-tests/perftests/inputmethod/src/android/inputmethod/ImePerfTest.java b/apct-tests/perftests/inputmethod/src/android/inputmethod/ImePerfTest.java
index 21c4491..ab3c50b 100644
--- a/apct-tests/perftests/inputmethod/src/android/inputmethod/ImePerfTest.java
+++ b/apct-tests/perftests/inputmethod/src/android/inputmethod/ImePerfTest.java
@@ -304,10 +304,9 @@
 
             while (state.keepRunning(measuredTimeNs)) {
                 setImeListener(activity, latchStart, latchEnd);
-                latchStart.set(new CountDownLatch(show ? 1 : 2));
-                latchEnd.set(new CountDownLatch(2));
                 // For measuring hide, lets show IME first.
                 if (!show) {
+                    initLatch(latchStart, latchEnd);
                     AtomicBoolean showCalled = new AtomicBoolean();
                     getInstrumentation().runOnMainSync(() -> {
                         if (!isImeVisible(activity)) {
@@ -316,9 +315,10 @@
                         }
                     });
                     if (showCalled.get()) {
-                        PollingCheck.check("IME show animation should finish ", TIMEOUT_1_S_IN_MS,
-                                () -> latchStart.get().getCount() == 1
-                                        && latchEnd.get().getCount() == 1);
+                        PollingCheck.check("IME show animation should finish ",
+                                TIMEOUT_1_S_IN_MS * 3,
+                                () -> latchStart.get().getCount() == 0
+                                        && latchEnd.get().getCount() == 0);
                     }
                 }
                 if (!mIsTraceStarted && !state.isWarmingUp()) {
@@ -328,6 +328,7 @@
 
                 AtomicLong startTime = new AtomicLong();
                 AtomicBoolean unexpectedVisibility = new AtomicBoolean();
+                initLatch(latchStart, latchEnd);
                 getInstrumentation().runOnMainSync(() -> {
                     boolean isVisible = isImeVisible(activity);
                     startTime.set(SystemClock.elapsedRealtimeNanos());
@@ -346,11 +347,15 @@
                     long timeElapsed = waitForAnimationStart(latchStart, startTime);
                     if (timeElapsed != ANIMATION_NOT_STARTED) {
                         measuredTimeNs = timeElapsed;
+                        // wait for animation to end or we may start two animations and timing
+                        // will not be measured accurately.
+                        waitForAnimationEnd(latchEnd);
                     }
                 }
 
                 // hide IME before next iteration.
                 if (show) {
+                    initLatch(latchStart, latchEnd);
                     activity.runOnUiThread(() -> controller.hide(WindowInsets.Type.ime()));
                     try {
                         latchEnd.get().await(TIMEOUT_1_S_IN_MS * 5, TimeUnit.MILLISECONDS);
@@ -372,6 +377,12 @@
         addResultToState(state);
     }
 
+    private void initLatch(AtomicReference<CountDownLatch> latchStart,
+            AtomicReference<CountDownLatch> latchEnd) {
+        latchStart.set(new CountDownLatch(1));
+        latchEnd.set(new CountDownLatch(1));
+    }
+
     @UiThread
     private boolean isImeVisible(@NonNull final Activity activity) {
         return activity.getWindow().getDecorView().getRootWindowInsets().isVisible(
@@ -381,7 +392,7 @@
     private long waitForAnimationStart(
             AtomicReference<CountDownLatch> latchStart, AtomicLong startTime) {
         try {
-            latchStart.get().await(TIMEOUT_1_S_IN_MS * 5, TimeUnit.MILLISECONDS);
+            latchStart.get().await(5, TimeUnit.SECONDS);
             if (latchStart.get().getCount() != 0) {
                 return ANIMATION_NOT_STARTED;
             }
@@ -390,6 +401,12 @@
         return SystemClock.elapsedRealtimeNanos() - startTime.get();
     }
 
+    private void waitForAnimationEnd(AtomicReference<CountDownLatch> latchEnd) {
+        try {
+            latchEnd.get().await(3, TimeUnit.SECONDS);
+        } catch (InterruptedException e) { }
+    }
+
     private void addResultToState(ManualBenchmarkState state) {
         mTraceMethods.forAllSlices((key, slices) -> {
             for (TraceMarkSlice slice : slices) {