Merge "Wait for taskbar to become visible after closing launcher in tests" into sc-v2-dev
diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java
index 20d7eb1..7bb0b94 100644
--- a/quickstep/src/com/android/quickstep/TouchInteractionService.java
+++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java
@@ -67,6 +67,7 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.UiThread;
+import androidx.annotation.VisibleForTesting;
 import androidx.annotation.WorkerThread;
 
 import com.android.launcher3.BaseDraggingActivity;
@@ -301,17 +302,26 @@
 
     private static boolean sConnected = false;
     private static boolean sIsInitialized = false;
+    private static TouchInteractionService sInstance;
     private RotationTouchHelper mRotationTouchHelper;
 
     public static boolean isConnected() {
         return sConnected;
     }
 
-
     public static boolean isInitialized() {
         return sIsInitialized;
     }
 
+    @VisibleForTesting
+    @Nullable
+    public static TaskbarManager getTaskbarManagerForTesting() {
+        if (sInstance == null) {
+            return null;
+        }
+        return sInstance.mTaskbarManager;
+    }
+
     private final AbsSwipeUpHandler.Factory mLauncherSwipeHandlerFactory =
             this::createLauncherSwipeHandler;
     private final AbsSwipeUpHandler.Factory mFallbackSwipeHandlerFactory =
@@ -355,6 +365,7 @@
         mDeviceState.runOnUserUnlocked(mTaskbarManager::onUserUnlocked);
         ProtoTracer.INSTANCE.get(this).add(this);
         sConnected = true;
+        sInstance = this;
     }
 
     private void disposeEventHandlers() {
@@ -512,6 +523,7 @@
 
         mTaskbarManager.destroy();
         sConnected = false;
+        sInstance = null;
         super.onDestroy();
     }
 
diff --git a/quickstep/tests/src/com/android/quickstep/StartLauncherViaGestureTests.java b/quickstep/tests/src/com/android/quickstep/StartLauncherViaGestureTests.java
index f44a812..fe1bb2e 100644
--- a/quickstep/tests/src/com/android/quickstep/StartLauncherViaGestureTests.java
+++ b/quickstep/tests/src/com/android/quickstep/StartLauncherViaGestureTests.java
@@ -25,7 +25,12 @@
 import androidx.test.runner.AndroidJUnit4;
 
 import com.android.launcher3.Launcher;
+import com.android.launcher3.taskbar.TaskbarActivityContext;
+import com.android.launcher3.taskbar.TaskbarDragLayer;
+import com.android.launcher3.taskbar.TaskbarManager;
+import com.android.launcher3.taskbar.TaskbarView;
 import com.android.launcher3.ui.TaplTestsLauncher3;
+import com.android.launcher3.ui.TestViewHelpers;
 import com.android.launcher3.util.RaceConditionReproducer;
 import com.android.quickstep.NavigationModeSwitchRule.Mode;
 import com.android.quickstep.NavigationModeSwitchRule.NavigationModeSwitch;
@@ -85,7 +90,7 @@
     public void testStressPressHome() {
         for (int i = 0; i < STRESS_REPEAT_COUNT; ++i) {
             // Destroy Launcher activity.
-            closeLauncherActivity();
+            destroyLauncherActivityAndWaitForTaskbarVisible();
 
             // The test action.
             mLauncher.pressHome();
@@ -97,12 +102,41 @@
     public void testStressSwipeToOverview() {
         for (int i = 0; i < STRESS_REPEAT_COUNT; ++i) {
             // Destroy Launcher activity.
-            closeLauncherActivity();
+            destroyLauncherActivityAndWaitForTaskbarVisible();
 
             // The test action.
             mLauncher.getBackground().switchToOverview();
         }
-        closeLauncherActivity();
+        destroyLauncherActivityAndWaitForTaskbarVisible();
         mLauncher.pressHome();
     }
+
+    private void destroyLauncherActivityAndWaitForTaskbarVisible() {
+        closeLauncherActivity();
+
+        // After Launcher is destroyed, calculator app started in setup() will be launched, wait for
+        // taskbar to settle before further interaction if it's a tablet.
+        if (!mLauncher.isTablet()) {
+            return;
+        }
+
+        waitForLauncherCondition(
+                "Taskbar not yet visible", launcher -> {
+                    TaskbarManager taskbarManager =
+                            TouchInteractionService.getTaskbarManagerForTesting();
+                    if (taskbarManager == null) {
+                        return false;
+                    }
+
+                    TaskbarActivityContext taskbarActivityContext =
+                            taskbarManager.getCurrentActivityContext();
+                    if (taskbarActivityContext == null) {
+                        return false;
+                    }
+
+                    TaskbarDragLayer taskbarDragLayer = taskbarActivityContext.getDragLayer();
+                    return TestViewHelpers.findChildView(taskbarDragLayer,
+                            view -> view instanceof TaskbarView && view.isVisibleToUser()) != null;
+                }, DEFAULT_UI_TIMEOUT);
+    }
 }
diff --git a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java
index 9da3e71..7f9f1b6 100644
--- a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java
+++ b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java
@@ -745,7 +745,6 @@
                     dumpViewHierarchy();
                     action = "swiping up to home";
 
-                    final boolean launcherIsVisible = isLauncherVisible();
                     swipeToState(
                             displaySize.x / 2, displaySize.y - 1,
                             displaySize.x / 2, 0,
@@ -753,9 +752,6 @@
                             launcherWasVisible
                                     ? GestureScope.INSIDE_TO_OUTSIDE
                                     : GestureScope.OUTSIDE_WITH_PILFER);
-                    // b/193653850: launcherWasVisible is a flaky indicator.
-                    log("launcherWasVisible: " + launcherWasVisible + ", launcherIsVisible: "
-                            + launcherIsVisible);
                 }
             } else {
                 log("Hierarchy before clicking home:");