Merge changes from topic "am-e105c9a980354a1590d80fe0d5a3450d" into tm-qpr-dev-plus-aosp

* changes:
  Merge changes from topic "am-c3479d1074da4f49a5c817b8ee7f386a" into stage-aosp-master am: 5d12fe84c7 -s ours
  [automerger skipped] Merge "Merge Android 13 QPR1" am: e3c1707e36 -s ours am: 7b0e393ca5 -s ours
diff --git a/quickstep/res/layout/taskbar_edu.xml b/quickstep/res/layout/taskbar_edu.xml
index 10444f1..d7daea3 100644
--- a/quickstep/res/layout/taskbar_edu.xml
+++ b/quickstep/res/layout/taskbar_edu.xml
@@ -46,7 +46,7 @@
             android:id="@+id/edu_start_button"
             android:layout_width="wrap_content"
             android:layout_height="36dp"
-            android:layout_marginBottom="92dp"
+            android:layout_marginBottom="18dp"
             android:layout_marginTop="32dp"
             app:layout_constraintTop_toBottomOf="@id/content"
             app:layout_constraintBottom_toBottomOf="parent"
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
index 01ec5f3..83b8d83 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
@@ -877,6 +877,16 @@
         mControllers.taskbarStashController.updateAndAnimateTransientTaskbar(false);
     }
 
+    /** Called when we want to hide the overlay window when user performs swipe up gesture. */
+    public void onSwipeToHideOverlay() {
+        mControllers.taskbarOverlayController.hideWindow();
+    }
+
+    /** Returns {@code true} if taskbar is stashed. */
+    public boolean isTaskbarStashed() {
+        return mControllers.taskbarStashController.isStashed();
+    }
+
     /**
      * Called to start the taskbar translation spring to its settled translation (0).
      */
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarEduController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarEduController.java
index 2cb05ff..d3f1b2f 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarEduController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarEduController.java
@@ -15,11 +15,11 @@
  */
 package com.android.launcher3.taskbar;
 
-import static com.android.launcher3.taskbar.TaskbarStashController.FLAG_STASHED_IN_APP_EDU;
-import static com.android.launcher3.util.Executors.MAIN_EXECUTOR;
-
 import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
 
+import com.android.launcher3.DeviceProfile;
 import com.android.launcher3.R;
 import com.android.launcher3.taskbar.overlay.TaskbarOverlayContext;
 import com.android.launcher3.taskbar.overlay.TaskbarOverlayController;
@@ -62,20 +62,21 @@
                         : R.layout.taskbar_edu_pages_persistent,
                 mPagedView,
                 true);
+
+        // Provide enough room for taskbar.
+        View startButton = mTaskbarEduView.findViewById(R.id.edu_start_button);
+        ViewGroup.MarginLayoutParams layoutParams =
+                (ViewGroup.MarginLayoutParams) startButton.getLayoutParams();
+        DeviceProfile dp = overlayContext.getDeviceProfile();
+        layoutParams.bottomMargin += DisplayController.isTransientTaskbar(overlayContext)
+                ? dp.taskbarSize + dp.transientTaskbarMargin
+                : dp.taskbarSize;
+
         mTaskbarEduView.init(new TaskbarEduCallbacks());
 
         mControllers.navbarButtonsViewController.setSlideInViewVisible(true);
-        TaskbarStashController stashController = mControllers.taskbarStashController;
-        stashController.updateStateForFlag(FLAG_STASHED_IN_APP_EDU, true);
-        stashController.applyState(overlayController.getOpenDuration());
-
-        mTaskbarEduView.setOnCloseBeginListener(() -> {
-            mControllers.navbarButtonsViewController.setSlideInViewVisible(false);
-            // 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(() -> stashController.resetFlagIfNoGestureInProgress(
-                    FLAG_STASHED_IN_APP_EDU));
-        });
+        mTaskbarEduView.setOnCloseBeginListener(
+                () -> mControllers.navbarButtonsViewController.setSlideInViewVisible(false));
         mTaskbarEduView.addOnCloseListener(() -> mTaskbarEduView = null);
         mTaskbarEduView.show();
     }
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java
index 6d7b2ff..95337ce 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java
@@ -82,7 +82,6 @@
     public static final int FLAG_IN_SETUP = 1 << 8; // In the Setup Wizard
     public static final int FLAG_STASHED_SMALL_SCREEN = 1 << 9; // phone screen gesture nav, stashed
     public static final int FLAG_STASHED_IN_APP_AUTO = 1 << 10; // Autohide (transient taskbar).
-    public static final int FLAG_STASHED_IN_APP_EDU = 1 << 11; // EDU is visible.
 
     // If any of these flags are enabled, isInApp should return true.
     private static final int FLAGS_IN_APP = FLAG_IN_APP | FLAG_IN_SETUP;
@@ -91,7 +90,7 @@
     private static final int FLAGS_STASHED_IN_APP = FLAG_STASHED_IN_APP_MANUAL
             | FLAG_STASHED_IN_SYSUI_STATE | FLAG_STASHED_IN_APP_EMPTY | FLAG_STASHED_IN_APP_SETUP
             | FLAG_STASHED_IN_APP_IME | FLAG_STASHED_IN_TASKBAR_ALL_APPS
-            | FLAG_STASHED_SMALL_SCREEN | FLAG_STASHED_IN_APP_AUTO | FLAG_STASHED_IN_APP_EDU;
+            | FLAG_STASHED_SMALL_SCREEN | FLAG_STASHED_IN_APP_AUTO;
 
     private static final int FLAGS_STASHED_IN_APP_IGNORING_IME =
             FLAGS_STASHED_IN_APP & ~FLAG_STASHED_IN_APP_IME;
@@ -101,8 +100,7 @@
     // Currently any flag that causes us to stash in an app is included, except for IME or All Apps
     // since those cover the underlying app anyway and thus the app shouldn't change insets.
     private static final int FLAGS_REPORT_STASHED_INSETS_TO_APP = FLAGS_STASHED_IN_APP
-            & ~FLAG_STASHED_IN_APP_IME & ~FLAG_STASHED_IN_TASKBAR_ALL_APPS
-            & ~FLAG_STASHED_IN_APP_EDU;
+            & ~FLAG_STASHED_IN_APP_IME & ~FLAG_STASHED_IN_TASKBAR_ALL_APPS;
 
     /**
      * How long to stash/unstash when manually invoked via long press.
@@ -728,7 +726,6 @@
         // Only update the following flags when system gesture is not in progress.
         boolean shouldStashForIme = shouldStashForIme();
         updateStateForFlag(FLAG_STASHED_IN_TASKBAR_ALL_APPS, false);
-        updateStateForFlag(FLAG_STASHED_IN_APP_EDU, false);
         if (hasAnyFlag(FLAG_STASHED_IN_APP_IME) != shouldStashForIme) {
             updateStateForFlag(FLAG_STASHED_IN_APP_IME, shouldStashForIme);
             applyState(TASKBAR_STASH_DURATION_FOR_IME, getTaskbarStashStartDelayForIme());
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java
index a059295..b3b53c2 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java
@@ -25,6 +25,7 @@
 
 import com.android.launcher3.model.data.ItemInfo;
 import com.android.launcher3.model.data.ItemInfoWithIcon;
+import com.android.launcher3.util.DisplayController;
 import com.android.quickstep.views.RecentsView;
 import com.android.quickstep.views.TaskView;
 
@@ -84,7 +85,9 @@
      * Manually closes the overlay window.
      */
     public void hideOverlayWindow() {
-        mControllers.taskbarOverlayController.hideWindow();
+        if (!DisplayController.isTransientTaskbar(mControllers.taskbarActivityContext)) {
+            mControllers.taskbarOverlayController.hideWindow();
+        }
     }
 
     /**
diff --git a/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsViewController.java b/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsViewController.java
index 4165486..721f816 100644
--- a/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsViewController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsViewController.java
@@ -16,6 +16,7 @@
 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;
@@ -28,6 +29,7 @@
 import com.android.launcher3.taskbar.TaskbarStashController;
 import com.android.launcher3.taskbar.overlay.TaskbarOverlayContext;
 import com.android.launcher3.taskbar.overlay.TaskbarOverlayController;
+import com.android.launcher3.util.DisplayController;
 
 /**
  * Handles the {@link TaskbarAllAppsContainerView} behavior and synchronizes its transitions with
@@ -88,18 +90,25 @@
     }
 
     private void setUpTaskbarStashing() {
-        mTaskbarStashController.updateStateForFlag(FLAG_STASHED_IN_TASKBAR_ALL_APPS, true);
+        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 */));
+
         mNavbarButtonsViewController.setSlideInViewVisible(true);
         mSlideInView.setOnCloseBeginListener(() -> {
             mNavbarButtonsViewController.setSlideInViewVisible(false);
             AbstractFloatingView.closeOpenContainer(
                     mContext, AbstractFloatingView.TYPE_ACTION_POPUP);
-            // 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(
-                    FLAG_STASHED_IN_TASKBAR_ALL_APPS));
+            if (!DisplayController.isTransientTaskbar(mContext)) {
+                // 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(
+                        FLAG_STASHED_IN_TASKBAR_ALL_APPS));
+            }
         });
     }
 
diff --git a/quickstep/src/com/android/quickstep/OverviewComponentObserver.java b/quickstep/src/com/android/quickstep/OverviewComponentObserver.java
index 8e07376..83f2a0a 100644
--- a/quickstep/src/com/android/quickstep/OverviewComponentObserver.java
+++ b/quickstep/src/com/android/quickstep/OverviewComponentObserver.java
@@ -34,6 +34,7 @@
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.os.Bundle;
+import android.util.Log;
 import android.util.SparseIntArray;
 
 import androidx.annotation.NonNull;
@@ -54,6 +55,8 @@
  * and provide callers the relevant classes.
  */
 public final class OverviewComponentObserver {
+    private static final String TAG = "OverviewComponentObserver";
+
     private final BroadcastReceiver mUserPreferenceChangeReceiver =
             new SimpleBroadcastReceiver(this::updateOverviewTargets);
     private final BroadcastReceiver mOtherHomeAppUpdateReceiver =
@@ -146,7 +149,12 @@
             }
         }
 
-        if (!mDeviceState.isHomeDisabled() && (defaultHome == null || mIsDefaultHome)) {
+        // TODO(b/258022658): Remove temporary logging.
+        Log.i(TAG, "updateOverviewTargets: mIsHomeDisabled=" + mIsHomeDisabled
+                + ", isDefaultHomeNull=" + (defaultHome == null)
+                + ", mIsDefaultHome=" + mIsDefaultHome);
+
+        if (!mIsHomeDisabled && (defaultHome == null || mIsDefaultHome)) {
             // User default home is same as out home app. Use Overview integrated in Launcher.
             mActivityInterface = LauncherActivityInterface.INSTANCE;
             mIsHomeAndOverviewSame = true;
diff --git a/quickstep/src/com/android/quickstep/inputconsumers/TaskbarStashInputConsumer.java b/quickstep/src/com/android/quickstep/inputconsumers/TaskbarStashInputConsumer.java
index 3a09490..c8326c4 100644
--- a/quickstep/src/com/android/quickstep/inputconsumers/TaskbarStashInputConsumer.java
+++ b/quickstep/src/com/android/quickstep/inputconsumers/TaskbarStashInputConsumer.java
@@ -53,8 +53,11 @@
     private final float mUnstashArea;
     private final float mScreenWidth;
 
-    private final int mTaskbarThresholdY;
-    private boolean mHasPassedTaskbarThreshold;
+    private final int mTaskbarNavThresholdY;
+    private final int mTaskbarAppWindowThresholdY;
+    private final boolean mTaskbarAlreadyOpen;
+    private boolean mHasPassedTaskbarNavThreshold;
+    private boolean mHasPassedTaskbarAppWindowThreshold;
 
     private final PointF mDownPos = new PointF();
     private final PointF mLastPos = new PointF();
@@ -73,11 +76,18 @@
 
         Resources res = context.getResources();
         mUnstashArea = res.getDimensionPixelSize(R.dimen.taskbar_unstash_input_area);
-        int taskbarThreshold = res.getDimensionPixelSize(ENABLE_TASKBAR_REVISED_THRESHOLDS.get()
+        int taskbarNavThreshold = res.getDimensionPixelSize(ENABLE_TASKBAR_REVISED_THRESHOLDS.get()
                 ? R.dimen.taskbar_nav_threshold_v2
                 : R.dimen.taskbar_nav_threshold);
+        int taskbarAppWindowThreshold = res.getDimensionPixelSize(
+                ENABLE_TASKBAR_REVISED_THRESHOLDS.get()
+                        ? R.dimen.taskbar_app_window_threshold_v2
+                        : R.dimen.taskbar_app_window_threshold);
         int screenHeight = taskbarActivityContext.getDeviceProfile().heightPx;
-        mTaskbarThresholdY = screenHeight - taskbarThreshold;
+        mTaskbarNavThresholdY = screenHeight - taskbarNavThreshold;
+        mTaskbarAppWindowThresholdY = screenHeight - taskbarAppWindowThreshold;
+        mTaskbarAlreadyOpen = mTaskbarActivityContext != null
+                && !mTaskbarActivityContext.isTaskbarStashed();
 
         mIsTransientTaskbar = DisplayController.isTransientTaskbar(context);
 
@@ -113,7 +123,8 @@
                         mDownPos.set(ev.getX(), ev.getY());
                         mLastPos.set(mDownPos);
 
-                        mHasPassedTaskbarThreshold = false;
+                        mHasPassedTaskbarNavThreshold = false;
+                        mHasPassedTaskbarAppWindowThreshold = false;
                         mTaskbarActivityContext.setAutohideSuspendFlag(
                                 FLAG_AUTOHIDE_SUSPEND_TOUCHING, true);
                         if (isInArea(x)) {
@@ -156,18 +167,23 @@
 
                         if (mIsTransientTaskbar) {
                             float dY = mLastPos.y - mDownPos.y;
-                            boolean passedTaskbarThreshold = dY < 0
-                                    && mLastPos.y < mTaskbarThresholdY;
+                            boolean passedTaskbarNavThreshold = dY < 0
+                                    && mLastPos.y < mTaskbarNavThresholdY;
+                            boolean passedTaskbarAppWindowThreshold = dY < 0
+                                    && mLastPos.y < mTaskbarAppWindowThresholdY;
 
-                            if (!mHasPassedTaskbarThreshold
-                                    && passedTaskbarThreshold) {
-                                mHasPassedTaskbarThreshold = true;
-
+                            if (!mHasPassedTaskbarNavThreshold && passedTaskbarNavThreshold) {
+                                mHasPassedTaskbarNavThreshold = true;
                                 mTaskbarActivityContext.onSwipeToUnstashTaskbar();
                             }
+                            if (mTaskbarAlreadyOpen || (!mHasPassedTaskbarAppWindowThreshold
+                                    && passedTaskbarAppWindowThreshold)) {
+                                mHasPassedTaskbarAppWindowThreshold = true;
+                                mTaskbarActivityContext.onSwipeToHideOverlay();
+                            }
 
                             if (dY < 0) {
-                                dY = -OverScroll.dampedScroll(-dY, mTaskbarThresholdY);
+                                dY = -OverScroll.dampedScroll(-dY, mTaskbarNavThresholdY);
                                 if (mTransitionCallback != null) {
                                     mTransitionCallback.onActionMove(dY);
                                 }
@@ -185,7 +201,8 @@
                         if (mTransitionCallback != null) {
                             mTransitionCallback.onActionEnd();
                         }
-                        mHasPassedTaskbarThreshold = false;
+                        mHasPassedTaskbarNavThreshold = false;
+                        mHasPassedTaskbarAppWindowThreshold = false;
                         break;
                 }
             }
diff --git a/src/com/android/launcher3/config/FeatureFlags.java b/src/com/android/launcher3/config/FeatureFlags.java
index 5cab817..942eb99 100644
--- a/src/com/android/launcher3/config/FeatureFlags.java
+++ b/src/com/android/launcher3/config/FeatureFlags.java
@@ -335,7 +335,7 @@
                     + " nav mode and when transient taskbar is enabled.");
 
     public static final BooleanFlag ENABLE_TRANSIENT_TASKBAR = getDebugFlag(
-            "ENABLE_TRANSIENT_TASKBAR", false, "Enables transient taskbar.");
+            "ENABLE_TRANSIENT_TASKBAR", true, "Enables transient taskbar.");
 
     public static final BooleanFlag SECONDARY_DRAG_N_DROP_TO_PIN = getDebugFlag(
             "SECONDARY_DRAG_N_DROP_TO_PIN", false,