Polish all apps taskbar unstash behavior for transient and persistent.

- During gestures from taskbar all apps, unstash immediately in
  transient.
- Overlay closes sooner if all apps is open (still done later for EDU).
- Taskbar stashes in overview when All Apps is opened.
- Transient app-window threshold is ignored if All Apps is opened.

Test: Manual
Fix: 262076812
Change-Id: I46b2dcdc75ee0cc15c1b47da2139ff8c20cf618a
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
index 83b8d83..e944480 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
@@ -887,6 +887,11 @@
         return mControllers.taskbarStashController.isStashed();
     }
 
+    /** Returns {@code true} if taskbar All Apps is open. */
+    public boolean isTaskbarAllAppsOpen() {
+        return mControllers.taskbarAllAppsController.isOpen();
+    }
+
     /**
      * Called to start the taskbar translation spring to its settled translation (0).
      */
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java
index b3b53c2..7a47f29 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java
@@ -85,7 +85,8 @@
      * Manually closes the overlay window.
      */
     public void hideOverlayWindow() {
-        if (!DisplayController.isTransientTaskbar(mControllers.taskbarActivityContext)) {
+        if (!DisplayController.isTransientTaskbar(mControllers.taskbarActivityContext)
+                || mControllers.taskbarAllAppsController.isOpen()) {
             mControllers.taskbarOverlayController.hideWindow();
         }
     }
@@ -102,13 +103,20 @@
     }
 
     /**
-     * Returns true iff taskbar is stashed.
+     * Returns {@code true} iff taskbar is stashed.
      */
     public boolean isTaskbarStashed() {
         return mControllers.taskbarStashController.isStashed();
     }
 
     /**
+     * Returns {@code true} iff taskbar All Apps is open.
+     */
+    public boolean isTaskbarAllAppsOpen() {
+        return mControllers.taskbarAllAppsController.isOpen();
+    }
+
+    /**
      * Called at the end of the swipe gesture on Transient taskbar.
      */
     public void startTranslationSpring() {
diff --git a/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsController.java b/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsController.java
index 4dc8d47..7a34869 100644
--- a/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsController.java
@@ -42,6 +42,7 @@
 public final class TaskbarAllAppsController {
 
     private TaskbarControllers mControllers;
+    private @Nullable TaskbarAllAppsSlideInView mSlideInView;
     private @Nullable TaskbarAllAppsContainerView mAppsView;
 
     // Application data models.
@@ -107,6 +108,11 @@
         show(true);
     }
 
+    /** Returns {@code true} if All Apps is open. */
+    public boolean isOpen() {
+        return mSlideInView != null && mSlideInView.isOpen();
+    }
+
     private void show(boolean animate) {
         if (mAppsView != null) {
             return;
@@ -117,15 +123,15 @@
 
         TaskbarOverlayContext overlayContext =
                 mControllers.taskbarOverlayController.requestWindow();
-        TaskbarAllAppsSlideInView slideInView =
-                (TaskbarAllAppsSlideInView) overlayContext.getLayoutInflater().inflate(
-                        R.layout.taskbar_all_apps, overlayContext.getDragLayer(), false);
-        slideInView.addOnCloseListener(() -> {
+        mSlideInView = (TaskbarAllAppsSlideInView) overlayContext.getLayoutInflater().inflate(
+                R.layout.taskbar_all_apps, overlayContext.getDragLayer(), false);
+        mSlideInView.addOnCloseListener(() -> {
             mControllers.getSharedState().allAppsVisible = false;
+            mSlideInView = null;
             mAppsView = null;
         });
         TaskbarAllAppsViewController viewController = new TaskbarAllAppsViewController(
-                overlayContext, slideInView, mControllers);
+                overlayContext, mSlideInView, mControllers);
 
         viewController.show(animate);
         mAppsView = overlayContext.getAppsView();
diff --git a/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsViewController.java b/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsViewController.java
index 721f816..7a3b3e8 100644
--- a/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsViewController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsViewController.java
@@ -15,8 +15,6 @@
  */
 package com.android.launcher3.taskbar.allapps;
 
-import static com.android.launcher3.LauncherState.ALL_APPS;
-import static com.android.launcher3.taskbar.TaskbarStashController.FLAG_STASHED_IN_APP_AUTO;
 import static com.android.launcher3.taskbar.TaskbarStashController.FLAG_STASHED_IN_TASKBAR_ALL_APPS;
 import static com.android.launcher3.util.Executors.MAIN_EXECUTOR;
 import static com.android.launcher3.util.OnboardingPrefs.ALL_APPS_VISITED_COUNT;
@@ -90,20 +88,19 @@
     }
 
     private void setUpTaskbarStashing() {
-        mTaskbarStashController.updateStateForFlag(
-                DisplayController.isTransientTaskbar(mContext)
-                        ? FLAG_STASHED_IN_APP_AUTO
-                        : FLAG_STASHED_IN_TASKBAR_ALL_APPS,
-                true);
-        mTaskbarStashController.applyState(
-                ALL_APPS.getTransitionDuration(mContext, true /* isToState */));
+        mTaskbarStashController.updateStateForFlag(FLAG_STASHED_IN_TASKBAR_ALL_APPS, true);
+        mTaskbarStashController.applyState(mOverlayController.getOpenDuration());
 
         mNavbarButtonsViewController.setSlideInViewVisible(true);
         mSlideInView.setOnCloseBeginListener(() -> {
             mNavbarButtonsViewController.setSlideInViewVisible(false);
             AbstractFloatingView.closeOpenContainer(
                     mContext, AbstractFloatingView.TYPE_ACTION_POPUP);
-            if (!DisplayController.isTransientTaskbar(mContext)) {
+
+            if (DisplayController.isTransientTaskbar(mContext)) {
+                mTaskbarStashController.updateStateForFlag(FLAG_STASHED_IN_TASKBAR_ALL_APPS, false);
+                mTaskbarStashController.applyState(mOverlayController.getCloseDuration());
+            } else {
                 // Post in case view is closing due to gesture navigation. If a gesture is in
                 // progress, wait to unstash until after the gesture is finished.
                 MAIN_EXECUTOR.post(() -> mTaskbarStashController.resetFlagIfNoGestureInProgress(
diff --git a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
index 3d8ffc4..3423728 100644
--- a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
+++ b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
@@ -318,7 +318,8 @@
     private final int mTaskbarAppWindowThreshold;
     private final int mTaskbarHomeOverviewThreshold;
     private final int mTaskbarCatchUpThreshold;
-    private boolean mTaskbarAlreadyOpen;
+    private final boolean mTaskbarAlreadyOpen;
+    private final boolean mIsTaskbarAllAppsOpen;
     private final boolean mIsTransientTaskbar;
     // May be set to false when mIsTransientTaskbar is true.
     private boolean mCanSlowSwipeGoHome = true;
@@ -359,6 +360,7 @@
                 && DisplayController.isTransientTaskbar(mActivity);
         TaskbarUIController controller = mActivityInterface.getTaskbarController();
         mTaskbarAlreadyOpen = controller != null && !controller.isTaskbarStashed();
+        mIsTaskbarAllAppsOpen = controller != null && controller.isTaskbarAllAppsOpen();
         mTaskbarAppWindowThreshold = res
                 .getDimensionPixelSize(ENABLE_TASKBAR_REVISED_THRESHOLDS.get()
                         ? R.dimen.taskbar_app_window_threshold_v2
@@ -2264,7 +2266,7 @@
             return displacement;
         }
 
-        if (mTaskbarAlreadyOpen) {
+        if (mTaskbarAlreadyOpen || mIsTaskbarAllAppsOpen) {
             return displacement;
         }
 
diff --git a/quickstep/src/com/android/quickstep/inputconsumers/TaskbarStashInputConsumer.java b/quickstep/src/com/android/quickstep/inputconsumers/TaskbarStashInputConsumer.java
index c8326c4..9f59c76 100644
--- a/quickstep/src/com/android/quickstep/inputconsumers/TaskbarStashInputConsumer.java
+++ b/quickstep/src/com/android/quickstep/inputconsumers/TaskbarStashInputConsumer.java
@@ -56,6 +56,7 @@
     private final int mTaskbarNavThresholdY;
     private final int mTaskbarAppWindowThresholdY;
     private final boolean mTaskbarAlreadyOpen;
+    private final boolean mIsTaskbarAllAppsOpen;
     private boolean mHasPassedTaskbarNavThreshold;
     private boolean mHasPassedTaskbarAppWindowThreshold;
 
@@ -88,6 +89,8 @@
         mTaskbarAppWindowThresholdY = screenHeight - taskbarAppWindowThreshold;
         mTaskbarAlreadyOpen = mTaskbarActivityContext != null
                 && !mTaskbarActivityContext.isTaskbarStashed();
+        mIsTaskbarAllAppsOpen =
+                mTaskbarActivityContext != null && mTaskbarActivityContext.isTaskbarAllAppsOpen();
 
         mIsTransientTaskbar = DisplayController.isTransientTaskbar(context);
 
@@ -184,7 +187,7 @@
 
                             if (dY < 0) {
                                 dY = -OverScroll.dampedScroll(-dY, mTaskbarNavThresholdY);
-                                if (mTransitionCallback != null) {
+                                if (mTransitionCallback != null && !mIsTaskbarAllAppsOpen) {
                                     mTransitionCallback.onActionMove(dY);
                                 }
                             }