Merge "Make shell-transit flag public" into tm-qpr-dev
diff --git a/quickstep/res/layout/activity_allset.xml b/quickstep/res/layout/activity_allset.xml
index 0cae733..56e1d16 100644
--- a/quickstep/res/layout/activity_allset.xml
+++ b/quickstep/res/layout/activity_allset.xml
@@ -26,7 +26,7 @@
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:id="@+id/content_view"
-        android:fitsSystemWindows="true">
+        android:fitsSystemWindows="false">
 
         <com.airbnb.lottie.LottieAnimationView
             android:id="@+id/animated_background"
diff --git a/quickstep/res/layout/taskbar.xml b/quickstep/res/layout/taskbar.xml
index 3b1d217..94388b4 100644
--- a/quickstep/res/layout/taskbar.xml
+++ b/quickstep/res/layout/taskbar.xml
@@ -45,8 +45,8 @@
             android:id="@+id/start_contextual_buttons"
             android:layout_width="wrap_content"
             android:layout_height="match_parent"
-            android:paddingLeft="@dimen/taskbar_nav_buttons_spacing"
-            android:paddingRight="@dimen/taskbar_nav_buttons_spacing"
+            android:paddingStart="@dimen/taskbar_contextual_button_padding"
+            android:paddingEnd="@dimen/taskbar_contextual_button_padding"
             android:paddingTop="@dimen/taskbar_contextual_padding_top"
             android:gravity="center_vertical"
             android:layout_gravity="start"/>
@@ -56,9 +56,6 @@
             android:layout_width="wrap_content"
             android:layout_height="match_parent"
             android:orientation="horizontal"
-            android:paddingLeft="@dimen/taskbar_nav_buttons_spacing"
-            android:paddingRight="@dimen/taskbar_nav_buttons_spacing"
-            android:layout_marginEnd="@dimen/taskbar_contextual_button_margin"
             android:gravity="center_vertical"
             android:layout_gravity="end"/>
 
@@ -66,8 +63,6 @@
             android:id="@+id/end_contextual_buttons"
             android:layout_width="wrap_content"
             android:layout_height="match_parent"
-            android:paddingLeft="@dimen/taskbar_nav_buttons_spacing"
-            android:paddingRight="@dimen/taskbar_nav_buttons_spacing"
             android:paddingTop="@dimen/taskbar_contextual_padding_top"
             android:gravity="center_vertical"
             android:layout_gravity="end"/>
diff --git a/quickstep/res/values-land/dimens.xml b/quickstep/res/values-land/dimens.xml
index 732f511..8368069 100644
--- a/quickstep/res/values-land/dimens.xml
+++ b/quickstep/res/values-land/dimens.xml
@@ -74,4 +74,10 @@
 
     <!-- Gesture Tutorial mock taskbar -->
     <dimen name="gesture_tutorial_taskbar_padding_start_end">218dp</dimen>
+
+    <!--  Taskbar 3 button spacing  -->
+    <dimen name="taskbar_button_margin_5_5">94.5dp</dimen>
+    <dimen name="taskbar_button_margin_6_5">94.5dp</dimen>
+    <dimen name="taskbar_button_margin_4_5">84dp</dimen>
+    <dimen name="taskbar_button_margin_4_4">79dp</dimen>
 </resources>
\ No newline at end of file
diff --git a/quickstep/res/values/dimens.xml b/quickstep/res/values/dimens.xml
index fa4eaed..0232f86 100644
--- a/quickstep/res/values/dimens.xml
+++ b/quickstep/res/values/dimens.xml
@@ -250,11 +250,11 @@
     <dimen name="taskbar_icon_touch_size">48dp</dimen>
     <dimen name="taskbar_icon_drag_icon_size">54dp</dimen>
     <dimen name="taskbar_folder_margin">16dp</dimen>
-    <dimen name="taskbar_nav_buttons_spacing">16dp</dimen>
+    <dimen name="taskbar_contextual_button_padding">16dp</dimen>
     <dimen name="taskbar_contextual_padding_top">8dp</dimen>
     <dimen name="taskbar_nav_buttons_size">44dp</dimen>
-    <dimen name="taskbar_contextual_button_margin">40dp</dimen>
-    <dimen name="taskbar_hotseat_nav_spacing">42dp</dimen>
+    <dimen name="taskbar_contextual_button_margin">47dp</dimen>
+    <dimen name="taskbar_hotseat_nav_spacing">24dp</dimen>
     <dimen name="taskbar_contextual_buttons_size">35dp</dimen>
     <dimen name="taskbar_stashed_size">24dp</dimen>
     <dimen name="taskbar_stashed_handle_width">220dp</dimen>
@@ -268,4 +268,12 @@
     <dimen name="taskbar_back_button_left_margin_kids">48dp</dimen>
     <dimen name="taskbar_home_button_left_margin_kids">48dp</dimen>
     <dimen name="taskbar_icon_size_kids">32dp</dimen>
+
+    <!--  Taskbar 3 button spacing  -->
+    <dimen name="taskbar_button_space_inbetween">24dp</dimen>
+    <dimen name="taskbar_button_margin_5_5">26dp</dimen>
+    <dimen name="taskbar_button_margin_6_5">26dp</dimen>
+    <dimen name="taskbar_button_margin_4_5">47dp</dimen>
+    <dimen name="taskbar_button_margin_4_4">47dp</dimen>
+    <dimen name="taskbar_button_margin_default">47dp</dimen>
 </resources>
diff --git a/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java b/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java
index ec497ef..e21dcba 100644
--- a/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java
+++ b/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java
@@ -337,7 +337,7 @@
                 new SplitSelectStateController(this, mHandler, getStateManager(),
                         getDepthController());
         overviewPanel.init(mActionsView, controller);
-        mActionsView.updateDimension(getDeviceProfile());
+        mActionsView.updateDimension(getDeviceProfile(), overviewPanel.getLastComputedTaskSize());
         mActionsView.updateVerticalMargin(DisplayController.getNavigationMode(this));
 
         mAppTransitionManager = new QuickstepTransitionManager(this);
diff --git a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java
index 17da0d9..b01168d 100644
--- a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java
@@ -46,6 +46,7 @@
 import android.content.pm.ActivityInfo.Config;
 import android.content.res.ColorStateList;
 import android.content.res.Configuration;
+import android.content.res.Resources;
 import android.graphics.Color;
 import android.graphics.Rect;
 import android.graphics.Region;
@@ -67,6 +68,7 @@
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 
+import com.android.launcher3.DeviceProfile;
 import com.android.launcher3.LauncherAnimUtils;
 import com.android.launcher3.R;
 import com.android.launcher3.Utilities;
@@ -94,7 +96,7 @@
 
     private final Rect mTempRect = new Rect();
 
-    private static final int FLAG_SWITCHER_SUPPORTED = 1 << 0;
+    private static final int FLAG_SWITCHER_SHOWING = 1 << 0;
     private static final int FLAG_IME_VISIBLE = 1 << 1;
     private static final int FLAG_ROTATION_BUTTON_VISIBLE = 1 << 2;
     private static final int FLAG_A11Y_VISIBLE = 1 << 3;
@@ -189,7 +191,7 @@
                     isThreeButtonNav ? mStartContextualContainer : mEndContextualContainer,
                     mControllers.navButtonController, R.id.ime_switcher);
             mPropertyHolders.add(new StatePropertyHolder(imeSwitcherButton,
-                    flags -> ((flags & FLAG_SWITCHER_SUPPORTED) != 0)
+                    flags -> ((flags & FLAG_SWITCHER_SHOWING) != 0)
                             && ((flags & FLAG_ROTATION_BUTTON_VISIBLE) == 0)));
         }
 
@@ -228,6 +230,7 @@
         if (alwaysShowButtons) {
             initButtons(mNavButtonContainer, mEndContextualContainer,
                     mControllers.navButtonController);
+            updateButtonLayoutSpacing();
 
             if (isInSetup) {
                 // Since setup wizard only has back button enabled, it looks strange to be
@@ -451,7 +454,7 @@
 
         // TODO(b/202218289) we're getting IME as not visible on lockscreen from system
         updateStateForFlag(FLAG_IME_VISIBLE, isImeVisible);
-        updateStateForFlag(FLAG_SWITCHER_SUPPORTED, isImeSwitcherShowing);
+        updateStateForFlag(FLAG_SWITCHER_SHOWING, isImeSwitcherShowing);
         updateStateForFlag(FLAG_A11Y_VISIBLE, a11yVisible);
         updateStateForFlag(FLAG_DISABLE_HOME, isHomeDisabled);
         updateStateForFlag(FLAG_DISABLE_RECENTS, isRecentsDisabled);
@@ -465,6 +468,7 @@
             boolean a11yLongClickable =
                     (sysUiStateFlags & SYSUI_STATE_A11Y_BUTTON_LONG_CLICKABLE) != 0;
             mA11yButton.setLongClickable(a11yLongClickable);
+            updateButtonLayoutSpacing();
         }
     }
 
@@ -480,6 +484,13 @@
     }
 
     /**
+     * @return {@code true} if A11y is showing in 3 button nav taskbar
+     */
+    private boolean isContextualButtonShowing() {
+        return mContext.isThreeButtonNav() && (mState & FLAG_A11Y_VISIBLE) != 0;
+    }
+
+    /**
      * Should be called when we need to show back button for bouncer
      */
     public void setBackForBouncer(boolean isBouncerVisible) {
@@ -508,7 +519,7 @@
      * Returns true if IME switcher is visible
      */
     public boolean isImeSwitcherVisible() {
-        return (mState & FLAG_SWITCHER_SUPPORTED) != 0;
+        return (mState & FLAG_SWITCHER_SHOWING) != 0;
     }
 
     /**
@@ -662,6 +673,46 @@
         if (mFloatingRotationButton != null) {
             mFloatingRotationButton.onConfigurationChanged(configChanges);
         }
+        updateButtonLayoutSpacing();
+    }
+
+    /** Adds the correct spacing to 3 button nav container. No-op if using gesture nav */
+    private void updateButtonLayoutSpacing() {
+        if (!mContext.isThreeButtonNav()) {
+            return;
+        }
+        DeviceProfile dp = mContext.getDeviceProfile();
+        Resources res = mContext.getResources();
+
+        // Add spacing after the end of the last nav button
+        FrameLayout.LayoutParams navButtonParams =
+                (FrameLayout.LayoutParams) mNavButtonContainer.getLayoutParams();
+        int navMarginEnd = (int) res.getDimension(dp.inv.inlineNavButtonsEndSpacing);
+        int contextualWidth = mEndContextualContainer.getWidth();
+        // If contextual buttons are showing, we check if the end margin is enough for the
+        // contextual button to be showing - if not, move the nav buttons over a smidge
+        if (isContextualButtonShowing() && navMarginEnd < contextualWidth) {
+            // Additional spacing, eat up half of space between last icon and nav button
+            navMarginEnd += res.getDimensionPixelSize(R.dimen.taskbar_hotseat_nav_spacing) / 2;
+        }
+        navButtonParams.setMarginEnd(navMarginEnd);
+        mNavButtonContainer.setLayoutParams(navButtonParams);
+
+        // Add the spaces in between the nav buttons
+        int spaceInBetween = res.getDimensionPixelSize(R.dimen.taskbar_button_space_inbetween);
+        for (int i = 0; i < mNavButtonContainer.getChildCount(); i++) {
+            View navButton = mNavButtonContainer.getChildAt(i);
+            LinearLayout.LayoutParams buttonLayoutParams =
+                    (LinearLayout.LayoutParams) navButton.getLayoutParams();
+            if (i == 0) {
+                buttonLayoutParams.setMarginEnd(spaceInBetween / 2);
+            } else if (i == mNavButtonContainer.getChildCount() - 1) {
+                buttonLayoutParams.setMarginStart(spaceInBetween / 2);
+            } else {
+                buttonLayoutParams.setMarginStart(spaceInBetween / 2);
+                buttonLayoutParams.setMarginEnd(spaceInBetween / 2);
+            }
+        }
     }
 
     public void onDestroy() {
@@ -734,22 +785,17 @@
     public void dumpLogs(String prefix, PrintWriter pw) {
         pw.println(prefix + "NavbarButtonsViewController:");
 
-        pw.println(String.format("%s\tmState=%s", prefix, getStateString(mState)));
-        pw.println(String.format(
-                "%s\tmLightIconColor=0x%s", prefix, Integer.toHexString(mLightIconColor)));
-        pw.println(String.format(
-                "%s\tmDarkIconColor=0x%s", prefix, Integer.toHexString(mDarkIconColor)));
-        pw.println(String.format(
-                "%s\tmFloatingRotationButtonBounds=%s", prefix, mFloatingRotationButtonBounds));
-        pw.println(String.format(
-                "%s\tmSysuiStateFlags=%s",
-                prefix,
-                QuickStepContract.getSystemUiStateString(mSysuiStateFlags)));
+        pw.println(prefix + "\tmState=" + getStateString(mState));
+        pw.println(prefix + "\tmLightIconColor=" + Integer.toHexString(mLightIconColor));
+        pw.println(prefix + "\tmDarkIconColor=" + Integer.toHexString(mDarkIconColor));
+        pw.println(prefix + "\tmFloatingRotationButtonBounds=" + mFloatingRotationButtonBounds);
+        pw.println(prefix + "\tmSysuiStateFlags=" + QuickStepContract.getSystemUiStateString(
+                mSysuiStateFlags));
     }
 
     private static String getStateString(int flags) {
         StringJoiner str = new StringJoiner("|");
-        appendFlag(str, flags, FLAG_SWITCHER_SUPPORTED, "FLAG_SWITCHER_SUPPORTED");
+        appendFlag(str, flags, FLAG_SWITCHER_SHOWING, "FLAG_SWITCHER_SHOWING");
         appendFlag(str, flags, FLAG_IME_VISIBLE, "FLAG_IME_VISIBLE");
         appendFlag(str, flags, FLAG_ROTATION_BUTTON_VISIBLE, "FLAG_ROTATION_BUTTON_VISIBLE");
         appendFlag(str, flags, FLAG_A11Y_VISIBLE, "FLAG_A11Y_VISIBLE");
diff --git a/quickstep/src/com/android/launcher3/taskbar/StashedHandleViewController.java b/quickstep/src/com/android/launcher3/taskbar/StashedHandleViewController.java
index f472427..800e162 100644
--- a/quickstep/src/com/android/launcher3/taskbar/StashedHandleViewController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/StashedHandleViewController.java
@@ -209,10 +209,9 @@
     public void dumpLogs(String prefix, PrintWriter pw) {
         pw.println(prefix + "StashedHandleViewController:");
 
-        pw.println(String.format(
-                "%s\tisStashedHandleVisible=%b", prefix, isStashedHandleVisible()));
-        pw.println(String.format("%s\tmStashedHandleWidth=%dpx", prefix, mStashedHandleWidth));
-        pw.println(String.format("%s\tmStashedHandleHeight=%dpx", prefix, mStashedHandleHeight));
+        pw.println(prefix + "\tisStashedHandleVisible=" + isStashedHandleVisible());
+        pw.println(prefix + "\tmStashedHandleWidth=" + mStashedHandleWidth);
+        pw.println(prefix + "\tmStashedHandleHeight=" + mStashedHandleHeight);
         mRegionSamplingHelper.dump(prefix, pw);
     }
 }
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
index 6b12e9c..439490e 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
@@ -839,6 +839,6 @@
         pw.println(String.format(
                 "%s\tmBindInProgress=%b", prefix, mBindingItems));
         mControllers.dumpLogs(prefix + "\t", pw);
-        mDeviceProfile.dump(this, prefix, pw);
+        mDeviceProfile.dump(prefix, pw);
     }
 }
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarAutohideSuspendController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarAutohideSuspendController.java
index c5615c7..3cf9c99 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarAutohideSuspendController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarAutohideSuspendController.java
@@ -71,8 +71,7 @@
     public void dumpLogs(String prefix, PrintWriter pw) {
         pw.println(prefix + "TaskbarAutohideSuspendController:");
 
-        pw.println(String.format(
-                "%s\tmAutohideSuspendFlags=%s", prefix, getStateString(mAutohideSuspendFlags)));
+        pw.println(prefix + "\tmAutohideSuspendFlags=" + getStateString(mAutohideSuspendFlags));
     }
 
     private static String getStateString(int flags) {
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java
index 04fcc44..3a0f374 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java
@@ -559,13 +559,11 @@
     public void dumpLogs(String prefix, PrintWriter pw) {
         pw.println(prefix + "TaskbarDragController:");
 
-        pw.println(String.format("%s\tmDragIconSize=%dpx", prefix, mDragIconSize));
-        pw.println(String.format("%s\tmTempXY=%s", prefix, Arrays.toString(mTempXY)));
-        pw.println(String.format("%s\tmRegistrationX=%d", prefix, mRegistrationX));
-        pw.println(String.format("%s\tmRegistrationY=%d", prefix, mRegistrationY));
-        pw.println(String.format(
-                "%s\tmIsSystemDragInProgress=%b", prefix, mIsSystemDragInProgress));
-        pw.println(String.format(
-                "%s\tisInternalDragInProgess=%b", prefix, super.isDragging()));
+        pw.println(prefix + "\tmDragIconSize=" + mDragIconSize);
+        pw.println(prefix + "\tmTempXY=" + Arrays.toString(mTempXY));
+        pw.println(prefix + "\tmRegistrationX=" + mRegistrationX);
+        pw.println(prefix + "\tmRegistrationY=" + mRegistrationY);
+        pw.println(prefix + "\tmIsSystemDragInProgress=" + mIsSystemDragInProgress);
+        pw.println(prefix + "\tisInternalDragInProgess=" + super.isDragging());
     }
 }
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayerController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayerController.java
index 99c59a8..77ef83c 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayerController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayerController.java
@@ -144,10 +144,9 @@
     public void dumpLogs(String prefix, PrintWriter pw) {
         pw.println(prefix + "TaskbarDragLayerController:");
 
-        pw.println(String.format("%s\tmBgOffset=%.2f", prefix, mBgOffset.value));
-        pw.println(String.format("%s\tmFolderMargin=%dpx", prefix, mFolderMargin));
-        pw.println(String.format(
-                "%s\tmLastSetBackgroundAlpha=%.2f", prefix, mLastSetBackgroundAlpha));
+        pw.println(prefix + "\tmBgOffset=" + mBgOffset.value);
+        pw.println(prefix + "\tmFolderMargin=" + mFolderMargin);
+        pw.println(prefix + "\tmLastSetBackgroundAlpha=" + mLastSetBackgroundAlpha);
     }
 
     /**
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarEduController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarEduController.java
index e29b14b..32a3c10 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarEduController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarEduController.java
@@ -191,12 +191,10 @@
     public void dumpLogs(String prefix, PrintWriter pw) {
         pw.println(prefix + "TaskbarEduController:");
 
-        pw.println(String.format("%s\tisShowingEdu=%b", prefix, mTaskbarEduView != null));
-        pw.println(String.format("%s\tmWaveAnimTranslationY=%.2f", prefix, mWaveAnimTranslationY));
-        pw.println(String.format(
-                "%s\tmWaveAnimTranslationYReturnOvershoot=%.2f",
-                prefix,
-                mWaveAnimTranslationYReturnOvershoot));
+        pw.println(prefix + "\tisShowingEdu=" + (mTaskbarEduView != null));
+        pw.println(prefix + "\tmWaveAnimTranslationY=" + mWaveAnimTranslationY);
+        pw.println(prefix + "\tmWaveAnimTranslationYReturnOvershoot="
+                + mWaveAnimTranslationYReturnOvershoot);
     }
 
     /**
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarKeyguardController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarKeyguardController.java
index 56648ea..0808fab 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarKeyguardController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarKeyguardController.java
@@ -111,11 +111,9 @@
     public void dumpLogs(String prefix, PrintWriter pw) {
         pw.println(prefix + "TaskbarKeyguardController:");
 
-        pw.println(String.format(
-                "%s\tmKeyguardSysuiFlags=%s",
-                prefix,
-                QuickStepContract.getSystemUiStateString(mKeyguardSysuiFlags)));
-        pw.println(String.format("%s\tmBouncerShowing=%b", prefix, mBouncerShowing));
-        pw.println(String.format("%s\tmIsScreenOff=%b", prefix, mIsScreenOff));
+        pw.println(prefix + "\tmKeyguardSysuiFlags=" + QuickStepContract.getSystemUiStateString(
+                mKeyguardSysuiFlags));
+        pw.println(prefix + "\tmBouncerShowing=" + mBouncerShowing);
+        pw.println(prefix + "\tmIsScreenOff=" + mIsScreenOff);
     }
 }
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java
index ff11f67..85e76b2 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java
@@ -35,6 +35,7 @@
 import com.android.launcher3.LauncherState;
 import com.android.launcher3.QuickstepTransitionManager;
 import com.android.launcher3.Utilities;
+import com.android.launcher3.anim.AnimatorListeners;
 import com.android.launcher3.statemanager.StateManager;
 import com.android.launcher3.util.MultiValueAlpha;
 import com.android.quickstep.AnimatedFloat;
@@ -367,11 +368,14 @@
     private void playStateTransitionAnim(AnimatorSet animatorSet, long duration,
             boolean committed) {
         boolean isInStashedState = mLauncherState.isTaskbarStashed(mLauncher);
-        float toAlignment = mLauncherState.isTaskbarAlignedWithHotseat(mLauncher) ? 1 : 0;
+        boolean willStashVisually =
+                isInStashedState && mControllers.taskbarStashController.supportsVisualStashing();
+        float toAlignment =
+                mLauncherState.isTaskbarAlignedWithHotseat(mLauncher) && !willStashVisually ? 1 : 0;
 
-        TaskbarStashController controller = mControllers.taskbarStashController;
-        controller.updateStateForFlag(FLAG_IN_STASHED_LAUNCHER_STATE, isInStashedState);
-        Animator stashAnimator = controller.applyStateWithoutStart(duration);
+        TaskbarStashController stashController = mControllers.taskbarStashController;
+        stashController.updateStateForFlag(FLAG_IN_STASHED_LAUNCHER_STATE, isInStashedState);
+        Animator stashAnimator = stashController.applyStateWithoutStart(duration);
         if (stashAnimator != null) {
             stashAnimator.addListener(new AnimatorListenerAdapter() {
                 @Override
@@ -391,9 +395,13 @@
             });
             animatorSet.play(stashAnimator);
         }
-
-        // If we're already animating to the value, just leave it be instead of restarting it.
+        if (mIconAlignmentForLauncherState.value == toAlignment) {
+            // Already at expected value, but make sure we run the callback at the end.
+            animatorSet.addListener(AnimatorListeners.forEndCallback(
+                    this::onIconAlignmentRatioChangedForStateTransition));
+        }
         if (!mIconAlignmentForLauncherState.isAnimatingToValue(toAlignment)) {
+            // If we're already animating to the value, just leave it be instead of restarting it.
             mIconAlignmentForLauncherState.finishAnimation();
             animatorSet.play(mIconAlignmentForLauncherState.animateToValue(toAlignment)
                     .setDuration(duration));
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarNavButtonController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarNavButtonController.java
index 3392b6b..60f50a9 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarNavButtonController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarNavButtonController.java
@@ -18,7 +18,6 @@
 
 import static com.android.internal.app.AssistUtils.INVOCATION_TYPE_HOME_BUTTON_LONG_PRESS;
 import static com.android.internal.app.AssistUtils.INVOCATION_TYPE_KEY;
-import static com.android.systemui.shared.system.ActivityManagerWrapper.CLOSE_SYSTEM_WINDOWS_REASON_RECENTS;
 import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASKBAR_A11Y_BUTTON_LONGPRESS;
 import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASKBAR_A11Y_BUTTON_TAP;
 import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASKBAR_BACK_BUTTON_LONGPRESS;
@@ -28,6 +27,7 @@
 import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASKBAR_IME_SWITCHER_BUTTON_TAP;
 import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASKBAR_OVERVIEW_BUTTON_LONGPRESS;
 import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASKBAR_OVERVIEW_BUTTON_TAP;
+import static com.android.systemui.shared.system.ActivityManagerWrapper.CLOSE_SYSTEM_WINDOWS_REASON_RECENTS;
 import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SCREEN_PINNING;
 
 import android.os.Bundle;
@@ -72,9 +72,8 @@
     public void dumpLogs(String prefix, PrintWriter pw) {
         pw.println(prefix + "TaskbarNavButtonController:");
 
-        pw.println(String.format(
-                "%s\tmLastScreenPinLongPress=%dms", prefix, mLastScreenPinLongPress));
-        pw.println(String.format("%s\tmScreenPinned=%b", prefix, mScreenPinned));
+        pw.println(prefix + "\tmLastScreenPinLongPress=" + mLastScreenPinLongPress);
+        pw.println(prefix + "\tmScreenPinned=" + mScreenPinned);
     }
 
     @Retention(RetentionPolicy.SOURCE)
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarScrimViewController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarScrimViewController.java
index 58ace17..c3b0f57 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarScrimViewController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarScrimViewController.java
@@ -98,6 +98,6 @@
     public void dumpLogs(String prefix, PrintWriter pw) {
         pw.println(prefix + "TaskbarScrimViewController:");
 
-        pw.println(String.format("%s\tmScrimAlpha.value=%.2f", prefix, mScrimAlpha.value));
+        pw.println(prefix + "\tmScrimAlpha.value=" + mScrimAlpha.value);
     }
 }
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java
index 2b8fdd1..513f1bb 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java
@@ -728,16 +728,14 @@
     public void dumpLogs(String prefix, PrintWriter pw) {
         pw.println(prefix + "TaskbarStashController:");
 
-        pw.println(String.format("%s\tmStashedHeight=%dpx", prefix, mStashedHeight));
-        pw.println(String.format("%s\tmUnstashedHeight=%dpx", prefix, mUnstashedHeight));
-        pw.println(String.format("%s\tmIsStashed=%b", prefix, mIsStashed));
-        pw.println(String.format(
-                "%s\tappliedState=%s", prefix, getStateString(mStatePropertyHolder.mPrevFlags)));
-        pw.println(String.format("%s\tmState=%s", prefix, getStateString(mState)));
-        pw.println(String.format(
-                "%s\tmIsSystemGestureInProgress=%b", prefix, mIsSystemGestureInProgress));
-        pw.println(String.format("%s\tmIsImeShowing=%b", prefix, mIsImeShowing));
-        pw.println(String.format("%s\tmIsImeSwitcherShowing=%b", prefix, mIsImeSwitcherShowing));
+        pw.println(prefix + "\tmStashedHeight=" + mStashedHeight);
+        pw.println(prefix + "\tmUnstashedHeight=" + mUnstashedHeight);
+        pw.println(prefix + "\tmIsStashed=" + mIsStashed);
+        pw.println(prefix + "\tappliedState=" + getStateString(mStatePropertyHolder.mPrevFlags));
+        pw.println(prefix + "\tmState=" + getStateString(mState));
+        pw.println(prefix + "\tmIsSystemGestureInProgress=" + mIsSystemGestureInProgress);
+        pw.println(prefix + "\tmIsImeShowing=" + mIsImeShowing);
+        pw.println(prefix + "\tmIsImeSwitcherShowing=" + mIsImeSwitcherShowing);
     }
 
     private static String getStateString(int flags) {
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java
index db7dc78..6d45fd2 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java
@@ -373,6 +373,19 @@
     @Override
     public void dumpLogs(String prefix, PrintWriter pw) {
         pw.println(prefix + "TaskbarViewController:");
+
+        mTaskbarIconAlpha.dump(
+                prefix + "\t",
+                pw,
+                "mTaskbarIconAlpha",
+                "ALPHA_INDEX_HOME",
+                "ALPHA_INDEX_KEYGUARD",
+                "ALPHA_INDEX_STASH",
+                "ALPHA_INDEX_RECENTS_DISABLED",
+                "ALPHA_INDEX_NOTIFICATION_EXPANDED",
+                "ALPHA_INDEX_ASSISTANT_INVOKED",
+                "ALPHA_INDEX_IME_BUTTON_NAV");
+
         mModelCallbacks.dumpLogs(prefix + "\t", pw);
     }
 
diff --git a/quickstep/src/com/android/launcher3/uioverrides/states/BackgroundAppState.java b/quickstep/src/com/android/launcher3/uioverrides/states/BackgroundAppState.java
index 297a61a..b733007 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/states/BackgroundAppState.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/states/BackgroundAppState.java
@@ -50,7 +50,8 @@
             return super.getVerticalProgress(launcher);
         }
         RecentsView recentsView = launcher.getOverviewPanel();
-        int transitionLength = LayoutUtils.getShelfTrackingDistance(launcher.getDeviceProfile(),
+        int transitionLength = LayoutUtils.getShelfTrackingDistance(launcher,
+                launcher.getDeviceProfile(),
                 recentsView.getPagedOrientationHandler());
         AllAppsTransitionController controller = launcher.getAllAppsController();
         float scrollRange = Math.max(controller.getShiftRange(), 1);
diff --git a/quickstep/src/com/android/launcher3/uioverrides/states/OverviewModalTaskState.java b/quickstep/src/com/android/launcher3/uioverrides/states/OverviewModalTaskState.java
index 0f02e26..0c49e5f 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/states/OverviewModalTaskState.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/states/OverviewModalTaskState.java
@@ -18,6 +18,8 @@
 import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_OVERVIEW;
 
 import android.content.Context;
+import android.graphics.Point;
+import android.graphics.Rect;
 
 import com.android.launcher3.BaseDraggingActivity;
 import com.android.launcher3.Launcher;
@@ -69,6 +71,13 @@
     }
 
     public static float[] getOverviewScaleAndOffsetForModalState(BaseDraggingActivity activity) {
-        return new float[] {activity.getDeviceProfile().overviewModalTaskScale, NO_OFFSET};
+        Point taskSize = activity.<RecentsView>getOverviewPanel().getSelectedTaskSize();
+        Rect modalTaskSize = new Rect();
+        activity.<RecentsView>getOverviewPanel().getModalTaskSize(modalTaskSize);
+
+        float scale = Math.min((float) modalTaskSize.height() / taskSize.y,
+                (float) modalTaskSize.width() / taskSize.x);
+
+        return new float[] {scale, NO_OFFSET};
     }
 }
diff --git a/quickstep/src/com/android/launcher3/uioverrides/states/OverviewState.java b/quickstep/src/com/android/launcher3/uioverrides/states/OverviewState.java
index c0810b9..c4c9038 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/states/OverviewState.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/states/OverviewState.java
@@ -22,12 +22,10 @@
 import android.graphics.Rect;
 import android.os.SystemProperties;
 
-import com.android.launcher3.BaseQuickstepLauncher;
 import com.android.launcher3.DeviceProfile;
 import com.android.launcher3.Launcher;
 import com.android.launcher3.LauncherState;
 import com.android.launcher3.R;
-import com.android.launcher3.taskbar.LauncherTaskbarUIController;
 import com.android.launcher3.util.DisplayController;
 import com.android.launcher3.util.Themes;
 import com.android.quickstep.util.LayoutUtils;
@@ -65,9 +63,12 @@
 
     @Override
     public ScaleAndTranslation getWorkspaceScaleAndTranslation(Launcher launcher) {
+        RecentsView recentsView = launcher.getOverviewPanel();
+        float workspacePageHeight = launcher.getDeviceProfile().getCellLayoutHeight();
+        recentsView.getTaskSize(sTempRect);
+        float scale = (float) sTempRect.height() / workspacePageHeight;
         float parallaxFactor = 0.5f;
-        return new ScaleAndTranslation(launcher.getDeviceProfile().overviewTaskWorkspaceScale, 0,
-                -getDefaultSwipeHeight(launcher) * parallaxFactor);
+        return new ScaleAndTranslation(scale, 0, -getDefaultSwipeHeight(launcher) * parallaxFactor);
     }
 
     @Override
@@ -92,13 +93,7 @@
 
     @Override
     public boolean isTaskbarStashed(Launcher launcher) {
-        if (launcher instanceof BaseQuickstepLauncher) {
-            LauncherTaskbarUIController uiController =
-                    ((BaseQuickstepLauncher) launcher).getTaskbarUIController();
-
-            return uiController != null && uiController.supportsVisualStashing();
-        }
-        return super.isTaskbarStashed(launcher);
+        return true;
     }
 
     @Override
diff --git a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonQuickSwitchTouchController.java b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonQuickSwitchTouchController.java
index d06f64a..f294986 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonQuickSwitchTouchController.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonQuickSwitchTouchController.java
@@ -120,8 +120,8 @@
         mSwipeDetector = new BothAxesSwipeDetector(mLauncher, this);
         mRecentsView = mLauncher.getOverviewPanel();
         mXRange = mLauncher.getDeviceProfile().widthPx / 2f;
-        mYRange = LayoutUtils.getShelfTrackingDistance(mLauncher.getDeviceProfile(),
-                mRecentsView.getPagedOrientationHandler());
+        mYRange = LayoutUtils.getShelfTrackingDistance(
+            mLauncher, mLauncher.getDeviceProfile(), mRecentsView.getPagedOrientationHandler());
         mMaxYProgress = mLauncher.getDeviceProfile().heightPx / mYRange;
         mMotionPauseDetector = new MotionPauseDetector(mLauncher);
         mMotionPauseMinDisplacement = mLauncher.getResources().getDimension(
@@ -232,6 +232,7 @@
         mRecentsView.setFullscreenProgress(fromState.getOverviewFullscreenProgress());
         mLauncher.getActionsView().getVisibilityAlpha().setValue(
                 (fromState.getVisibleElements(mLauncher) & OVERVIEW_ACTIONS) != 0 ? 1f : 0f);
+        mRecentsView.setTaskIconScaledDown(true);
 
         float[] scaleAndOffset = toState.getOverviewScaleAndOffset(mLauncher);
         // As we drag right, animate the following properties:
@@ -321,6 +322,7 @@
         boolean verticalFling = mSwipeDetector.isFling(velocity.y);
         boolean noFling = !horizontalFling && !verticalFling;
         if (mMotionPauseDetector.isPaused() && noFling) {
+            // Going to Overview.
             cancelAnimations();
 
             StateAnimationConfig config = new StateAnimationConfig();
@@ -331,6 +333,8 @@
                 @Override
                 public void onAnimationEnd(Animator animation) {
                     onAnimationToStateCompleted(OVERVIEW);
+                    // Animate the icon after onAnimationToStateCompleted() so it doesn't clobber.
+                    mRecentsView.animateUpTaskIconScale();
                 }
             });
             overviewAnim.start();
diff --git a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/PortraitStatesTouchController.java b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/PortraitStatesTouchController.java
index 7394945..9efbc34 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/PortraitStatesTouchController.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/PortraitStatesTouchController.java
@@ -144,8 +144,8 @@
                     .createPlaybackController();
             mLauncher.getStateManager().setCurrentUserControlledAnimation(mCurrentAnimation);
             RecentsView recentsView = mLauncher.getOverviewPanel();
-            totalShift = LayoutUtils.getShelfTrackingDistance(mLauncher.getDeviceProfile(),
-                    recentsView.getPagedOrientationHandler());
+            totalShift = LayoutUtils.getShelfTrackingDistance(mLauncher,
+                    mLauncher.getDeviceProfile(), recentsView.getPagedOrientationHandler());
         } else {
             mCurrentAnimation = mLauncher.getStateManager()
                     .createAnimationToNewWorkspace(mToState, config);
diff --git a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
index 045530c..8f1872b 100644
--- a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
+++ b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
@@ -2049,8 +2049,8 @@
 
         float scrollOffset = Math.abs(mRecentsView.getScrollOffset(mRecentsView.getCurrentPage()));
         int maxScrollOffset = mRecentsView.getPagedOrientationHandler().getPrimaryValue(
-                mActivity.getDeviceProfile().overviewTaskRect.width(),
-                mActivity.getDeviceProfile().overviewTaskRect.height());
+                mRecentsView.getLastComputedTaskSize().width(),
+                mRecentsView.getLastComputedTaskSize().height());
         maxScrollOffset += mRecentsView.getPageSpacing();
 
         float maxScaleProgress =
diff --git a/quickstep/src/com/android/quickstep/BaseActivityInterface.java b/quickstep/src/com/android/quickstep/BaseActivityInterface.java
index a922f58..6354282 100644
--- a/quickstep/src/com/android/quickstep/BaseActivityInterface.java
+++ b/quickstep/src/com/android/quickstep/BaseActivityInterface.java
@@ -33,9 +33,12 @@
 import android.animation.ObjectAnimator;
 import android.annotation.TargetApi;
 import android.content.Context;
+import android.content.res.Resources;
 import android.graphics.Color;
+import android.graphics.PointF;
 import android.graphics.Rect;
 import android.os.Build;
+import android.view.Gravity;
 import android.view.MotionEvent;
 import android.view.View;
 
@@ -43,6 +46,7 @@
 import androidx.annotation.UiThread;
 
 import com.android.launcher3.DeviceProfile;
+import com.android.launcher3.R;
 import com.android.launcher3.anim.AnimatorPlaybackController;
 import com.android.launcher3.anim.PendingAnimation;
 import com.android.launcher3.statehandlers.DepthController;
@@ -105,8 +109,8 @@
         activity.getStateManager().goToState(startState, activityVisible);
     }
 
-    /** Gets swipe-up destination and length. */
-    public abstract int getSwipeUpDestinationAndLength(DeviceProfile dp, Context context,
+    public abstract int getSwipeUpDestinationAndLength(
+            DeviceProfile dp, Context context, Rect outRect,
             PagedOrientationHandler orientationHandler);
 
     /** Called when the animation to home has fully settled. */
@@ -211,6 +215,129 @@
     }
 
     /**
+     * Calculates the taskView size for the provided device configuration.
+     */
+    public final void calculateTaskSize(Context context, DeviceProfile dp, Rect outRect) {
+        Resources res = context.getResources();
+        float maxScale = res.getFloat(R.dimen.overview_max_scale);
+        if (dp.isTablet) {
+            Rect gridRect = new Rect();
+            calculateGridSize(dp, gridRect);
+
+            calculateTaskSizeInternal(context, dp, gridRect, maxScale, Gravity.CENTER, outRect);
+        } else {
+            int taskMargin = dp.overviewTaskMarginPx;
+            calculateTaskSizeInternal(context, dp,
+                    dp.overviewTaskThumbnailTopMarginPx,
+                    dp.getOverviewActionsClaimedSpace(),
+                    res.getDimensionPixelSize(R.dimen.overview_minimum_next_prev_size) + taskMargin,
+                    maxScale,
+                    Gravity.CENTER,
+                    outRect);
+        }
+    }
+
+    private void calculateTaskSizeInternal(Context context, DeviceProfile dp, int claimedSpaceAbove,
+            int claimedSpaceBelow, int minimumHorizontalPadding, float maxScale, int gravity,
+            Rect outRect) {
+        Rect insets = dp.getInsets();
+
+        Rect potentialTaskRect = new Rect(0, 0, dp.widthPx, dp.heightPx);
+        potentialTaskRect.inset(insets.left, insets.top, insets.right, insets.bottom);
+        potentialTaskRect.inset(
+                minimumHorizontalPadding,
+                claimedSpaceAbove,
+                minimumHorizontalPadding,
+                claimedSpaceBelow);
+
+        calculateTaskSizeInternal(context, dp, potentialTaskRect, maxScale, gravity, outRect);
+    }
+
+    private void calculateTaskSizeInternal(Context context, DeviceProfile dp,
+            Rect potentialTaskRect, float maxScale, int gravity, Rect outRect) {
+        PointF taskDimension = getTaskDimension(dp);
+
+        float scale = Math.min(
+                potentialTaskRect.width() / taskDimension.x,
+                potentialTaskRect.height() / taskDimension.y);
+        scale = Math.min(scale, maxScale);
+        int outWidth = Math.round(scale * taskDimension.x);
+        int outHeight = Math.round(scale * taskDimension.y);
+
+        Gravity.apply(gravity, outWidth, outHeight, potentialTaskRect, outRect);
+    }
+
+    private static PointF getTaskDimension(DeviceProfile dp) {
+        PointF dimension = new PointF();
+        getTaskDimension(dp, dimension);
+        return dimension;
+    }
+
+    /**
+     * Gets the dimension of the task in the current system state.
+     */
+    public static void getTaskDimension(DeviceProfile dp, PointF out) {
+        out.x = dp.widthPx;
+        out.y = dp.heightPx;
+        if (dp.isTablet) {
+            out.y -= dp.taskbarSize;
+        }
+    }
+
+    /**
+     * Calculates the overview grid size for the provided device configuration.
+     */
+    public final void calculateGridSize(DeviceProfile dp, Rect outRect) {
+        Rect insets = dp.getInsets();
+        int topMargin = dp.overviewTaskThumbnailTopMarginPx;
+        int bottomMargin = dp.getOverviewActionsClaimedSpace();
+        int sideMargin = dp.overviewGridSideMargin;
+
+        outRect.set(0, 0, dp.widthPx, dp.heightPx);
+        outRect.inset(Math.max(insets.left, sideMargin), insets.top + topMargin,
+                Math.max(insets.right, sideMargin), Math.max(insets.bottom, bottomMargin));
+    }
+
+    /**
+     * Calculates the overview grid non-focused task size for the provided device configuration.
+     */
+    public final void calculateGridTaskSize(Context context, DeviceProfile dp, Rect outRect,
+            PagedOrientationHandler orientedState) {
+        Resources res = context.getResources();
+        Rect taskRect = new Rect();
+        calculateTaskSize(context, dp, taskRect);
+
+        float rowHeight =
+                (taskRect.height() + dp.overviewTaskThumbnailTopMarginPx - dp.overviewRowSpacing)
+                        / 2f;
+
+        PointF taskDimension = getTaskDimension(dp);
+        float scale = (rowHeight - dp.overviewTaskThumbnailTopMarginPx) / taskDimension.y;
+        int outWidth = Math.round(scale * taskDimension.x);
+        int outHeight = Math.round(scale * taskDimension.y);
+
+        int gravity = Gravity.TOP;
+        gravity |= orientedState.getRecentsRtlSetting(res) ? Gravity.RIGHT : Gravity.LEFT;
+        Gravity.apply(gravity, outWidth, outHeight, taskRect, outRect);
+    }
+
+    /**
+     * Calculates the modal taskView size for the provided device configuration
+     */
+    public final void calculateModalTaskSize(Context context, DeviceProfile dp, Rect outRect) {
+        calculateTaskSize(context, dp, outRect);
+        float maxScale = context.getResources().getFloat(R.dimen.overview_modal_max_scale);
+        calculateTaskSizeInternal(
+                context, dp,
+                dp.overviewTaskMarginPx,
+                dp.heightPx - outRect.bottom - dp.getInsets().bottom,
+                Math.round((dp.availableWidthPx - outRect.width() * maxScale) / 2),
+                1f /*maxScale*/,
+                Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM,
+                outRect);
+    }
+
+    /**
      * Called when the gesture ends and the animation starts towards the given target. Used to add
      * an optional additional animation with the same duration.
      */
diff --git a/quickstep/src/com/android/quickstep/FallbackActivityInterface.java b/quickstep/src/com/android/quickstep/FallbackActivityInterface.java
index 2ca5a2e..ba61574 100644
--- a/quickstep/src/com/android/quickstep/FallbackActivityInterface.java
+++ b/quickstep/src/com/android/quickstep/FallbackActivityInterface.java
@@ -60,13 +60,13 @@
 
     /** 2 */
     @Override
-    public int getSwipeUpDestinationAndLength(DeviceProfile dp, Context context,
+    public int getSwipeUpDestinationAndLength(DeviceProfile dp, Context context, Rect outRect,
             PagedOrientationHandler orientationHandler) {
+        calculateTaskSize(context, dp, outRect);
         if (dp.isVerticalBarLayout() && DisplayController.getNavigationMode(context) != NO_BUTTON) {
-            return dp.isSeascape()
-                    ? dp.overviewTaskRect.left : (dp.widthPx - dp.overviewTaskRect.right);
+            return dp.isSeascape() ? outRect.left : (dp.widthPx - outRect.right);
         } else {
-            return dp.heightPx - dp.overviewTaskRect.bottom;
+            return dp.heightPx - outRect.bottom;
         }
     }
 
diff --git a/quickstep/src/com/android/quickstep/LauncherActivityInterface.java b/quickstep/src/com/android/quickstep/LauncherActivityInterface.java
index d3065bd..c13b95f 100644
--- a/quickstep/src/com/android/quickstep/LauncherActivityInterface.java
+++ b/quickstep/src/com/android/quickstep/LauncherActivityInterface.java
@@ -70,14 +70,14 @@
     }
 
     @Override
-    public int getSwipeUpDestinationAndLength(DeviceProfile dp, Context context,
+    public int getSwipeUpDestinationAndLength(DeviceProfile dp, Context context, Rect outRect,
             PagedOrientationHandler orientationHandler) {
+        calculateTaskSize(context, dp, outRect);
         if (dp.isVerticalBarLayout()
                 && DisplayController.getNavigationMode(context) != NavigationMode.NO_BUTTON) {
-            return dp.isSeascape()
-                    ? dp.overviewTaskRect.left : (dp.widthPx - dp.overviewTaskRect.right);
+            return dp.isSeascape() ? outRect.left : (dp.widthPx - outRect.right);
         } else {
-            return LayoutUtils.getShelfTrackingDistance(dp, orientationHandler);
+            return LayoutUtils.getShelfTrackingDistance(context, dp, orientationHandler);
         }
     }
 
diff --git a/quickstep/src/com/android/quickstep/QuickstepTestInformationHandler.java b/quickstep/src/com/android/quickstep/QuickstepTestInformationHandler.java
index d216a6a..528fb97 100644
--- a/quickstep/src/com/android/quickstep/QuickstepTestInformationHandler.java
+++ b/quickstep/src/com/android/quickstep/QuickstepTestInformationHandler.java
@@ -2,6 +2,7 @@
 
 import android.app.Activity;
 import android.content.Context;
+import android.graphics.Rect;
 import android.os.Bundle;
 
 import androidx.annotation.Nullable;
@@ -31,7 +32,8 @@
             }
 
             case TestProtocol.REQUEST_BACKGROUND_TO_OVERVIEW_SWIPE_HEIGHT: {
-                final float swipeHeight = LayoutUtils.getShelfTrackingDistance(mDeviceProfile,
+                final float swipeHeight =
+                        LayoutUtils.getShelfTrackingDistance(mContext, mDeviceProfile,
                                 PagedOrientationHandler.PORTRAIT);
                 response.putInt(TestProtocol.TEST_INFO_RESPONSE_FIELD, (int) swipeHeight);
                 return response;
@@ -41,8 +43,10 @@
                 if (!mDeviceProfile.isTablet) {
                     return null;
                 }
-                response.putInt(TestProtocol.TEST_INFO_RESPONSE_FIELD,
-                        mDeviceProfile.overviewTaskRect.height());
+                Rect focusedTaskRect = new Rect();
+                LauncherActivityInterface.INSTANCE.calculateTaskSize(mContext, mDeviceProfile,
+                        focusedTaskRect);
+                response.putInt(TestProtocol.TEST_INFO_RESPONSE_FIELD, focusedTaskRect.height());
                 return response;
             }
 
@@ -50,10 +54,10 @@
                 if (!mDeviceProfile.isTablet) {
                     return null;
                 }
-                boolean isRecentsRtl = PagedOrientationHandler.PORTRAIT.getRecentsRtlSetting(
-                        mContext.getResources());
-                response.putParcelable(TestProtocol.TEST_INFO_RESPONSE_FIELD,
-                        mDeviceProfile.getOverviewGridTaskRect(isRecentsRtl));
+                Rect gridTaskRect = new Rect();
+                LauncherActivityInterface.INSTANCE.calculateGridTaskSize(mContext, mDeviceProfile,
+                        gridTaskRect, PagedOrientationHandler.PORTRAIT);
+                response.putParcelable(TestProtocol.TEST_INFO_RESPONSE_FIELD, gridTaskRect);
                 return response;
             }
 
diff --git a/quickstep/src/com/android/quickstep/SwipeUpAnimationLogic.java b/quickstep/src/com/android/quickstep/SwipeUpAnimationLogic.java
index 3c15d0f..baeb514 100644
--- a/quickstep/src/com/android/quickstep/SwipeUpAnimationLogic.java
+++ b/quickstep/src/com/android/quickstep/SwipeUpAnimationLogic.java
@@ -49,6 +49,7 @@
 public abstract class SwipeUpAnimationLogic implements
         RecentsAnimationCallbacks.RecentsAnimationListener{
 
+    protected static final Rect TEMP_RECT = new Rect();
     protected final RemoteTargetGluer mTargetGluer;
 
     protected DeviceProfile mDp;
@@ -91,7 +92,7 @@
     protected void initTransitionEndpoints(DeviceProfile dp) {
         mDp = dp;
         mTransitionDragLength = mGestureState.getActivityInterface().getSwipeUpDestinationAndLength(
-                dp, mContext, mRemoteTargetHandles[0].getTaskViewSimulator()
+                dp, mContext, TEMP_RECT, mRemoteTargetHandles[0].getTaskViewSimulator()
                         .getOrientationState().getOrientationHandler());
         mDragLengthFactor = (float) dp.heightPx / mTransitionDragLength;
 
diff --git a/quickstep/src/com/android/quickstep/TaskShortcutFactory.java b/quickstep/src/com/android/quickstep/TaskShortcutFactory.java
index 092854f..69a295b 100644
--- a/quickstep/src/com/android/quickstep/TaskShortcutFactory.java
+++ b/quickstep/src/com/android/quickstep/TaskShortcutFactory.java
@@ -27,6 +27,7 @@
 import android.os.Handler;
 import android.os.Looper;
 import android.view.View;
+import android.view.WindowInsets;
 import android.window.SplashScreen;
 
 import androidx.annotation.Nullable;
@@ -101,40 +102,10 @@
         }
     };
 
-    abstract class MultiWindowFactory implements TaskShortcutFactory {
-
-        private final int mIconRes;
-        private final int mTextRes;
-        private final LauncherEvent mLauncherEvent;
-
-        MultiWindowFactory(int iconRes, int textRes, LauncherEvent launcherEvent) {
-            mIconRes = iconRes;
-            mTextRes = textRes;
-            mLauncherEvent = launcherEvent;
-        }
-
-        protected abstract boolean isAvailable(BaseDraggingActivity activity, int displayId);
-        protected abstract ActivityOptions makeLaunchOptions(Activity activity);
-        protected abstract boolean onActivityStarted(BaseDraggingActivity activity);
-
-        @Override
-        public List<SystemShortcut> getShortcuts(BaseDraggingActivity activity,
-                TaskIdAttributeContainer taskContainer) {
-            final Task task  = taskContainer.getTask();
-            if (!task.isDockable) {
-                return null;
-            }
-            if (!isAvailable(activity, task.key.displayId)) {
-                return null;
-            }
-            return Collections.singletonList(new MultiWindowSystemShortcut(mIconRes,
-                    mTextRes, activity, taskContainer, this, mLauncherEvent));
-        }
-    }
-
     class SplitSelectSystemShortcut extends SystemShortcut {
         private final TaskView mTaskView;
         private final SplitPositionOption mSplitPositionOption;
+
         public SplitSelectSystemShortcut(BaseDraggingActivity target, TaskView taskView,
                 SplitPositionOption option) {
             super(option.iconResId, option.textResId, target, taskView.getItemInfo(), taskView);
@@ -148,19 +119,17 @@
         }
     }
 
-    class MultiWindowSystemShortcut extends SystemShortcut<BaseDraggingActivity> {
+    class FreeformSystemShortcut extends SystemShortcut<BaseDraggingActivity> {
 
         private Handler mHandler;
 
         private final RecentsView mRecentsView;
         private final TaskThumbnailView mThumbnailView;
         private final TaskView mTaskView;
-        private final MultiWindowFactory mFactory;
         private final LauncherEvent mLauncherEvent;
 
-        public MultiWindowSystemShortcut(int iconRes, int textRes, BaseDraggingActivity activity,
-                TaskIdAttributeContainer taskContainer, MultiWindowFactory factory,
-                LauncherEvent launcherEvent) {
+        public FreeformSystemShortcut(int iconRes, int textRes, BaseDraggingActivity activity,
+                TaskIdAttributeContainer taskContainer, LauncherEvent launcherEvent) {
             super(iconRes, textRes, activity, taskContainer.getItemInfo(),
                     taskContainer.getTaskView());
             mLauncherEvent = launcherEvent;
@@ -168,55 +137,30 @@
             mTaskView = taskContainer.getTaskView();
             mRecentsView = activity.getOverviewPanel();
             mThumbnailView = taskContainer.getThumbnailView();
-            mFactory = factory;
         }
 
         @Override
         public void onClick(View view) {
-            Task.TaskKey taskKey = mTaskView.getTask().key;
-            final int taskId = taskKey.id;
-
-            final View.OnLayoutChangeListener onLayoutChangeListener =
-                    new View.OnLayoutChangeListener() {
-                        @Override
-                        public void onLayoutChange(View v, int l, int t, int r, int b,
-                                int oldL, int oldT, int oldR, int oldB) {
-                            mTaskView.getRootView().removeOnLayoutChangeListener(this);
-                            mRecentsView.clearIgnoreResetTask(taskId);
-
-                            // Start animating in the side pages once launcher has been resized
-                            mRecentsView.dismissTask(mTaskView, false, false);
-                        }
-                    };
-
-            final DeviceProfile.OnDeviceProfileChangeListener onDeviceProfileChangeListener =
-                    new DeviceProfile.OnDeviceProfileChangeListener() {
-                        @Override
-                        public void onDeviceProfileChanged(DeviceProfile dp) {
-                            mTarget.removeOnDeviceProfileChangeListener(this);
-                            if (dp.isMultiWindowMode) {
-                                mTaskView.getRootView().addOnLayoutChangeListener(
-                                        onLayoutChangeListener);
-                            }
-                        }
-                    };
-
             dismissTaskMenuView(mTarget);
+            RecentsView rv = mTarget.getOverviewPanel();
+            rv.switchToScreenshot(() -> {
+                rv.finishRecentsAnimation(true /* toHome */, () -> {
+                    mTarget.returnToHomescreen();
+                    rv.getHandler().post(this::startActivity);
+                });
+            });
+        }
 
-            ActivityOptions options = mFactory.makeLaunchOptions(mTarget);
+        private void startActivity() {
+            final Task.TaskKey taskKey = mTaskView.getTask().key;
+            final int taskId = taskKey.id;
+            final ActivityOptions options = makeLaunchOptions(mTarget);
             if (options != null) {
                 options.setSplashScreenStyle(SplashScreen.SPLASH_SCREEN_STYLE_ICON);
             }
             if (options != null
                     && ActivityManagerWrapper.getInstance().startActivityFromRecents(taskId,
                             options)) {
-                if (!mFactory.onActivityStarted(mTarget)) {
-                    return;
-                }
-                // Add a device profile change listener to kick off animating the side tasks
-                // once we enter multiwindow mode and relayout
-                mTarget.addOnDeviceProfileChangeListener(onDeviceProfileChangeListener);
-
                 final Runnable animStartedListener = () -> {
                     // Hide the task view and wait for the window to be resized
                     // TODO: Consider animating in launcher and do an in-place start activity
@@ -255,6 +199,18 @@
                         .log(mLauncherEvent);
             }
         }
+
+        private ActivityOptions makeLaunchOptions(Activity activity) {
+            ActivityOptions activityOptions = ActivityOptionsCompat.makeFreeformOptions();
+            // Arbitrary bounds only because freeform is in dev mode right now
+            final View decorView = activity.getWindow().getDecorView();
+            final WindowInsets insets = decorView.getRootWindowInsets();
+            final Rect r = new Rect(0, 0, decorView.getWidth() / 2, decorView.getHeight() / 2);
+            r.offsetTo(insets.getSystemWindowInsetLeft() + 50,
+                    insets.getSystemWindowInsetTop() + 50);
+            activityOptions.setLaunchBounds(r);
+            return activityOptions;
+        }
     }
 
     /**
@@ -304,28 +260,26 @@
         }
     };
 
-    TaskShortcutFactory FREE_FORM = new MultiWindowFactory(R.drawable.ic_split_screen,
-            R.string.recent_task_option_freeform, LAUNCHER_SYSTEM_SHORTCUT_FREE_FORM_TAP) {
-
+    TaskShortcutFactory FREE_FORM = new TaskShortcutFactory() {
         @Override
-        protected boolean isAvailable(BaseDraggingActivity activity, int displayId) {
+        public List<SystemShortcut> getShortcuts(BaseDraggingActivity activity,
+                TaskIdAttributeContainer taskContainer) {
+            final Task task  = taskContainer.getTask();
+            if (!task.isDockable) {
+                return null;
+            }
+            if (!isAvailable(activity, task.key.displayId)) {
+                return null;
+            }
+
+            return Collections.singletonList(new FreeformSystemShortcut(R.drawable.ic_split_screen,
+                    R.string.recent_task_option_freeform, activity, taskContainer,
+                    LAUNCHER_SYSTEM_SHORTCUT_FREE_FORM_TAP));
+        }
+
+        private boolean isAvailable(BaseDraggingActivity activity, int displayId) {
             return ActivityManagerWrapper.getInstance().supportsFreeformMultiWindow(activity);
         }
-
-        @Override
-        protected ActivityOptions makeLaunchOptions(Activity activity) {
-            ActivityOptions activityOptions = ActivityOptionsCompat.makeFreeformOptions();
-            // Arbitrary bounds only because freeform is in dev mode right now
-            Rect r = new Rect(50, 50, 200, 200);
-            activityOptions.setLaunchBounds(r);
-            return activityOptions;
-        }
-
-        @Override
-        protected boolean onActivityStarted(BaseDraggingActivity activity) {
-            activity.returnToHomescreen();
-            return true;
-        }
     };
 
     TaskShortcutFactory PIN = new TaskShortcutFactory() {
diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java
index 149af98..bf1c998 100644
--- a/quickstep/src/com/android/quickstep/TouchInteractionService.java
+++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java
@@ -1015,7 +1015,7 @@
             pw.println("ProtoTrace:");
             pw.println("  file=" + ProtoTracer.INSTANCE.get(this).getTraceFile());
             if (createdOverviewActivity != null) {
-                createdOverviewActivity.getDeviceProfile().dump(this, "", pw);
+                createdOverviewActivity.getDeviceProfile().dump("", pw);
             }
             mTaskbarManager.dumpLogs("", pw);
         }
diff --git a/quickstep/src/com/android/quickstep/util/AnimatorControllerWithResistance.java b/quickstep/src/com/android/quickstep/util/AnimatorControllerWithResistance.java
index ded4fb0..7c83833 100644
--- a/quickstep/src/com/android/quickstep/util/AnimatorControllerWithResistance.java
+++ b/quickstep/src/com/android/quickstep/util/AnimatorControllerWithResistance.java
@@ -36,6 +36,7 @@
 import com.android.launcher3.anim.AnimatorPlaybackController;
 import com.android.launcher3.anim.PendingAnimation;
 import com.android.launcher3.touch.PagedOrientationHandler;
+import com.android.quickstep.LauncherActivityInterface;
 import com.android.quickstep.views.RecentsView;
 
 /**
@@ -154,9 +155,10 @@
      */
     public static <SCALE, TRANSLATION> PendingAnimation createRecentsResistanceAnim(
             RecentsParams<SCALE, TRANSLATION> params) {
-        Rect startRect = new Rect(params.dp.overviewTaskRect);
+        Rect startRect = new Rect();
         PagedOrientationHandler orientationHandler = params.recentsOrientedState
                 .getOrientationHandler();
+        LauncherActivityInterface.INSTANCE.calculateTaskSize(params.context, params.dp, startRect);
         long distanceToCover = startRect.bottom;
         PendingAnimation resistAnim = params.resistAnim != null
                 ? params.resistAnim
diff --git a/quickstep/src/com/android/quickstep/util/LayoutUtils.java b/quickstep/src/com/android/quickstep/util/LayoutUtils.java
index d4eb880..d0856be 100644
--- a/quickstep/src/com/android/quickstep/util/LayoutUtils.java
+++ b/quickstep/src/com/android/quickstep/util/LayoutUtils.java
@@ -16,6 +16,7 @@
 package com.android.quickstep.util;
 
 import android.content.Context;
+import android.graphics.Rect;
 import android.view.View;
 import android.view.ViewGroup;
 
@@ -23,6 +24,7 @@
 import com.android.launcher3.touch.PagedOrientationHandler;
 import com.android.launcher3.util.DisplayController;
 import com.android.launcher3.util.DisplayController.NavigationMode;
+import com.android.quickstep.LauncherActivityInterface;
 
 public class LayoutUtils {
 
@@ -37,12 +39,12 @@
         return swipeHeight;
     }
 
-    /**
-     *  Returns the shelf tracking distance.
-     */
-    public static int getShelfTrackingDistance(DeviceProfile dp,
+    public static int getShelfTrackingDistance(Context context, DeviceProfile dp,
             PagedOrientationHandler orientationHandler) {
-        return orientationHandler.getDistanceToBottomOfRect(dp, dp.overviewTaskRect);
+        // Track the bottom of the window.
+        Rect taskSize = new Rect();
+        LauncherActivityInterface.INSTANCE.calculateTaskSize(context, dp, taskSize);
+        return orientationHandler.getDistanceToBottomOfRect(dp, taskSize);
     }
 
     /**
diff --git a/quickstep/src/com/android/quickstep/util/RecentsOrientedState.java b/quickstep/src/com/android/quickstep/util/RecentsOrientedState.java
index 39e3797..dec934a 100644
--- a/quickstep/src/com/android/quickstep/util/RecentsOrientedState.java
+++ b/quickstep/src/com/android/quickstep/util/RecentsOrientedState.java
@@ -25,6 +25,7 @@
 import static com.android.launcher3.states.RotationHelper.ALLOW_ROTATION_PREFERENCE_KEY;
 import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR;
 import static com.android.launcher3.util.SettingsCache.ROTATION_SETTING_URI;
+import static com.android.quickstep.BaseActivityInterface.getTaskDimension;
 
 import static java.lang.annotation.RetentionPolicy.SOURCE;
 
@@ -397,8 +398,8 @@
      * Returns the scale and pivot so that the provided taskRect can fit the provided full size
      */
     public float getFullScreenScaleAndPivot(Rect taskView, DeviceProfile dp, PointF outPivot) {
-        float scale = Math.min(dp.taskDimension.x / taskView.width(),
-                dp.taskDimension.y / taskView.height());
+        getTaskDimension(dp, outPivot);
+        float scale = Math.min(outPivot.x / taskView.width(), outPivot.y / taskView.height());
         if (scale == 1) {
             outPivot.set(taskView.centerX(), taskView.centerY());
         } else {
diff --git a/quickstep/src/com/android/quickstep/util/TaskViewSimulator.java b/quickstep/src/com/android/quickstep/util/TaskViewSimulator.java
index c626b0a..d37300c 100644
--- a/quickstep/src/com/android/quickstep/util/TaskViewSimulator.java
+++ b/quickstep/src/com/android/quickstep/util/TaskViewSimulator.java
@@ -22,6 +22,7 @@
 import static com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_TOP_OR_LEFT;
 import static com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_UNDEFINED;
 import static com.android.launcher3.util.SplitConfigurationOptions.StagePosition;
+import static com.android.quickstep.TaskAnimationManager.ENABLE_SHELL_TRANSITIONS;
 import static com.android.quickstep.util.RecentsOrientedState.postDisplayRotation;
 import static com.android.quickstep.util.RecentsOrientedState.preDisplayRotation;
 import static com.android.systemui.shared.system.WindowManagerWrapper.WINDOWING_MODE_FULLSCREEN;
@@ -144,8 +145,12 @@
         if (mDp == null) {
             return 1;
         }
-        mTaskRect.set(
-                mIsGridTask ? mDp.getOverviewGridTaskRect(mIsRecentsRtl) : mDp.overviewTaskRect);
+        if (mIsGridTask) {
+            mSizeStrategy.calculateGridTaskSize(mContext, mDp, mTaskRect,
+                    mOrientationState.getOrientationHandler());
+        } else {
+            mSizeStrategy.calculateTaskSize(mContext, mDp, mTaskRect);
+        }
 
         Rect fullTaskSize;
         if (mSplitBounds != null) {
@@ -387,7 +392,14 @@
                 .withCornerRadius(getCurrentCornerRadius());
 
         if (ENABLE_QUICKSTEP_LIVE_TILE.get()) {
-            builder.withLayer(mDrawsBelowRecents ? Integer.MIN_VALUE + 1 : Integer.MAX_VALUE);
+            // In legacy transitions, the animation leashes remain in same hierarchy in the
+            // TaskDisplayArea, so we don't want to bump the layer too high otherwise it will
+            // conflict with layers that WM core positions (ie. the input consumers).  For shell
+            // transitions, the animation leashes are reparented to an animation container so we
+            // can bump layers as needed.
+            builder.withLayer(mDrawsBelowRecents
+                    ? Integer.MIN_VALUE + 1
+                    : ENABLE_SHELL_TRANSITIONS ? Integer.MAX_VALUE : 0);
         }
     }
 
diff --git a/quickstep/src/com/android/quickstep/views/OverviewActionsView.java b/quickstep/src/com/android/quickstep/views/OverviewActionsView.java
index c178175..62ec0ef 100644
--- a/quickstep/src/com/android/quickstep/views/OverviewActionsView.java
+++ b/quickstep/src/com/android/quickstep/views/OverviewActionsView.java
@@ -93,6 +93,7 @@
 
     @Nullable
     protected DeviceProfile mDp;
+    private final Rect mTaskSize = new Rect();
 
     public OverviewActionsView(Context context) {
         this(context, null);
@@ -243,15 +244,16 @@
         }
 
         // Align to bottom of task Rect.
-        return mDp.heightPx - mDp.overviewTaskRect.bottom - mDp.overviewActionsTopMarginPx
+        return mDp.heightPx - mTaskSize.bottom - mDp.overviewActionsTopMarginPx
                 - mDp.overviewActionsHeight;
     }
 
     /**
-     * Updates device profile for this view to draw with.
+     * Updates device profile and task size for this view to draw with.
      */
-    public void updateDimension(DeviceProfile dp) {
+    public void updateDimension(DeviceProfile dp, Rect taskSize) {
         mDp = dp;
+        mTaskSize.set(taskSize);
         updateVerticalMargin(DisplayController.getNavigationMode(getContext()));
 
         requestLayout();
diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java
index dc886f6..3aa24ac 100644
--- a/quickstep/src/com/android/quickstep/views/RecentsView.java
+++ b/quickstep/src/com/android/quickstep/views/RecentsView.java
@@ -428,6 +428,9 @@
 
     @Nullable
     protected RemoteTargetHandle[] mRemoteTargetHandles;
+    protected final Rect mLastComputedTaskSize = new Rect();
+    protected final Rect mLastComputedGridSize = new Rect();
+    protected final Rect mLastComputedGridTaskSize = new Rect();
     // How much a task that is directly offscreen will be pushed out due to RecentsView scale/pivot.
     @Nullable
     protected Float mLastComputedTaskStartPushOutDistance = null;
@@ -1136,8 +1139,7 @@
         int targetScroll = getScrollForPage(indexOfChild(getFocusedTaskView()));
         if (!isClearAllHidden) {
             int clearAllWidth = mOrientationHandler.getPrimarySize(mClearAllButton);
-            int taskGridHorizontalDiff = mActivity.getDeviceProfile().overviewTaskRect.right
-                    - mActivity.getDeviceProfile().overviewGridRect.right;
+            int taskGridHorizontalDiff = mLastComputedTaskSize.right - mLastComputedGridSize.right;
             int clearAllFocusScrollDiff =  taskGridHorizontalDiff - clearAllWidth;
             targetScroll += mIsRtl ? clearAllFocusScrollDiff : -clearAllFocusScrollDiff;
         }
@@ -1676,7 +1678,7 @@
 
         // Update RecentsView and TaskView's DeviceProfile dependent layout.
         updateOrientationHandler();
-        mActionsView.updateDimension(dp);
+        mActionsView.updateDimension(dp, mLastComputedTaskSize);
     }
 
     private void updateOrientationHandler() {
@@ -1732,7 +1734,7 @@
     // Update task size and padding that are dependent on DeviceProfile and insets.
     private void updateSizeAndPadding() {
         DeviceProfile dp = mActivity.getDeviceProfile();
-        mTempRect.set(dp.overviewTaskRect);
+        getTaskSize(mTempRect);
         mTaskWidth = mTempRect.width();
         mTaskHeight = mTempRect.height();
 
@@ -1741,9 +1743,14 @@
                 dp.widthPx - mInsets.right - mTempRect.right,
                 dp.heightPx - mInsets.bottom - mTempRect.bottom);
 
-        mTaskGridVerticalDiff = dp.getOverviewGridTaskRect(mIsRtl).top - dp.overviewTaskRect.top;
+        mSizeStrategy.calculateGridSize(mActivity.getDeviceProfile(),
+                mLastComputedGridSize);
+        mSizeStrategy.calculateGridTaskSize(mActivity, mActivity.getDeviceProfile(),
+                mLastComputedGridTaskSize, mOrientationHandler);
+
+        mTaskGridVerticalDiff = mLastComputedGridTaskSize.top - mLastComputedTaskSize.top;
         mTopBottomRowHeightDiff =
-                dp.overviewGridTaskDimension.y + dp.overviewTaskThumbnailTopMarginPx
+                mLastComputedGridTaskSize.height() + dp.overviewTaskThumbnailTopMarginPx
                         + dp.overviewRowSpacing;
 
         // Force TaskView to update size from thumbnail
@@ -1785,6 +1792,34 @@
         updateGridProperties(isTaskDismissal);
     }
 
+    public void getTaskSize(Rect outRect) {
+        mSizeStrategy.calculateTaskSize(mActivity, mActivity.getDeviceProfile(), outRect);
+        mLastComputedTaskSize.set(outRect);
+    }
+
+    /**
+     * Returns the size of task selected to enter modal state.
+     */
+    public Point getSelectedTaskSize() {
+        mSizeStrategy.calculateTaskSize(mActivity, mActivity.getDeviceProfile(),
+                mTempRect);
+        return new Point(mTempRect.width(), mTempRect.height());
+    }
+
+    /** Gets the last computed task size */
+    public Rect getLastComputedTaskSize() {
+        return mLastComputedTaskSize;
+    }
+
+    public Rect getLastComputedGridTaskSize() {
+        return mLastComputedGridTaskSize;
+    }
+
+    /** Gets the task size for modal state. */
+    public void getModalTaskSize(Rect outRect) {
+        mSizeStrategy.calculateModalTaskSize(mActivity, mActivity.getDeviceProfile(), outRect);
+    }
+
     @Override
     protected boolean computeScrollHelper() {
         boolean scrolling = super.computeScrollHelper();
@@ -2417,8 +2452,7 @@
             return;
         }
 
-        DeviceProfile dp = mActivity.getDeviceProfile();
-        int taskTopMargin = dp.overviewTaskThumbnailTopMarginPx;
+        int taskTopMargin = mActivity.getDeviceProfile().overviewTaskThumbnailTopMarginPx;
 
         int topRowWidth = 0;
         int bottomRowWidth = 0;
@@ -2461,7 +2495,7 @@
                 gridTranslations[i] += mIsRtl ? taskWidthAndSpacing : -taskWidthAndSpacing;
 
                 // Center view vertically in case it's from different orientation.
-                taskView.setGridTranslationY((dp.overviewTaskRect.height() + taskTopMargin
+                taskView.setGridTranslationY((mLastComputedTaskSize.height() + taskTopMargin
                         - taskView.getLayoutParams().height) / 2f);
 
                 if (taskView == snappedTaskView) {
@@ -2577,11 +2611,11 @@
         // accordingly. Update longRowWidth if ClearAllButton has been moved.
         float clearAllShortTotalCompensation = 0;
         int longRowWidth = Math.max(topRowWidth, bottomRowWidth);
-        if (longRowWidth < dp.overviewGridRect.width()) {
-            float shortTotalCompensation = dp.overviewGridRect.width() - longRowWidth;
+        if (longRowWidth < mLastComputedGridSize.width()) {
+            float shortTotalCompensation = mLastComputedGridSize.width() - longRowWidth;
             clearAllShortTotalCompensation =
                     mIsRtl ? -shortTotalCompensation : shortTotalCompensation;
-            longRowWidth = dp.overviewGridRect.width();
+            longRowWidth = mLastComputedGridSize.width();
         }
 
         float clearAllTotalTranslationX =
@@ -2598,8 +2632,9 @@
         if (snappedTaskView != null) {
             int distanceFromClearAll = longRowWidth - snappedTaskRowWidth + mPageSpacing;
             // ClearAllButton should be off screen when snapped task is in its snapped position.
-            int minimumDistance = mTaskWidth - snappedTaskView.getLayoutParams().width
-                    + (dp.overviewGridRect.width() - mTaskWidth) / 2;
+            int minimumDistance =
+                    mTaskWidth - snappedTaskView.getLayoutParams().width
+                            + (mLastComputedGridSize.width() - mTaskWidth) / 2;
             if (distanceFromClearAll < minimumDistance) {
                 int distanceDifference = minimumDistance - distanceFromClearAll;
                 snappedTaskGridTranslationX += mIsRtl ? distanceDifference : -distanceDifference;
@@ -2614,9 +2649,9 @@
 
         mClearAllButton.setGridTranslationPrimary(
                 clearAllTotalTranslationX - snappedTaskGridTranslationX);
-        mClearAllButton.setGridScrollOffset(mIsRtl
-                ? dp.overviewTaskRect.left - dp.overviewGridRect.left
-                : dp.overviewTaskRect.right - dp.overviewGridRect.right);
+        mClearAllButton.setGridScrollOffset(
+                mIsRtl ? mLastComputedTaskSize.left - mLastComputedGridSize.left
+                        : mLastComputedTaskSize.right - mLastComputedGridSize.right);
 
         setGridProgress(mGridProgress);
     }
@@ -2869,8 +2904,8 @@
         boolean closeGapBetweenClearAll = false;
         boolean isClearAllHidden = isClearAllHidden();
         boolean snapToLastTask = false;
-        DeviceProfile dp = mActivity.getDeviceProfile();
-        boolean isLandscapeSplit = dp.isLandscape && isSplitSelectionActive();
+        boolean isLandscapeSplit =
+                mActivity.getDeviceProfile().isLandscape && isSplitSelectionActive();
         boolean isSplitPlaceholderFirstInGrid = isSplitPlaceholderFirstInGrid();
         boolean isSplitPlaceholderLastInGrid = isSplitPlaceholderLastInGrid();
         TaskView lastGridTaskView = showAsGrid ? getLastGridTaskView() : null;
@@ -3061,7 +3096,7 @@
                         dismissTranslationInterpolationEnd);
                 if (taskView == nextFocusedTaskView) {
                     // Enlarge the task to be focused next, and translate into focus position.
-                    float scale = mTaskWidth / (float) dp.overviewGridTaskDimension.x;
+                    float scale = mTaskWidth / (float) mLastComputedGridTaskSize.width();
                     anim.setFloat(taskView, TaskView.SNAPSHOT_SCALE, scale,
                             clampToProgress(LINEAR, animationStartProgress,
                                     dismissTranslationInterpolationEnd));
@@ -3107,7 +3142,9 @@
             anim.addOnFrameCallback(this::updateCurveProperties);
         }
 
-        // Add a tiny bit of translation Z, so that it draws on top of other views
+        // Add a tiny bit of translation Z, so that it draws on top of other views. This is relevant
+        // (e.g.) when we dismiss a task by sliding it upward: if there is a row of icons above, we
+        // want the dragged task to stay above all other views.
         if (animateTaskView) {
             dismissedTaskView.setTranslationZ(0.1f);
         }
@@ -3317,7 +3354,7 @@
                         // Update various scroll-dependent UI.
                         dispatchScrollChanged();
                         updateActionsViewFocusedScroll();
-                        if (isClearAllHidden() && !dp.isTablet) {
+                        if (isClearAllHidden() && !mActivity.getDeviceProfile().isTablet) {
                             mActionsView.updateDisabledFlags(OverviewActionsView.DISABLED_SCROLLING,
                                     false);
                         }
@@ -3715,6 +3752,7 @@
         updateEmptyStateUi(changed);
 
         // Update the pivots such that when the task is scaled, it fills the full page
+        getTaskSize(mTempRect);
         updatePivots();
         setTaskModalness(mTaskModalness);
         mLastComputedTaskStartPushOutDistance = null;
@@ -3728,13 +3766,12 @@
     }
 
     private void updatePivots() {
-        DeviceProfile dp = mActivity.getDeviceProfile();
         if (mOverviewSelectEnabled) {
-            setPivotX(dp.overviewTaskRect.centerX());
-            setPivotY(dp.overviewTaskRect.bottom);
+            setPivotX(mLastComputedTaskSize.centerX());
+            setPivotY(mLastComputedTaskSize.bottom);
         } else {
-            getPagedViewOrientedState().getFullScreenScaleAndPivot(dp.overviewTaskRect, dp,
-                    mTempPointF);
+            getPagedViewOrientedState().getFullScreenScaleAndPivot(mTempRect,
+                    mActivity.getDeviceProfile(), mTempPointF);
             setPivotX(mTempPointF.x);
             setPivotY(mTempPointF.y);
         }
@@ -4007,8 +4044,8 @@
     }
 
     public void initiateSplitSelect(TaskView taskView) {
-        int defaultSplitPosition =
-                mOrientationHandler.getDefaultSplitPosition(mActivity.getDeviceProfile());
+        int defaultSplitPosition = mOrientationHandler
+                .getDefaultSplitPosition(mActivity.getDeviceProfile());
         initiateSplitSelect(taskView, defaultSplitPosition);
     }
 
@@ -4313,9 +4350,9 @@
      * Returns the scale up required on the view, so that it coves the screen completely
      */
     public float getMaxScaleForFullScreen() {
-        DeviceProfile dp = mActivity.getDeviceProfile();
-        return getPagedViewOrientedState().getFullScreenScaleAndPivot(dp.overviewTaskRect,
-                dp, mTempPointF);
+        getTaskSize(mTempRect);
+        return getPagedViewOrientedState().getFullScreenScaleAndPivot(
+                mTempRect, mActivity.getDeviceProfile(), mTempPointF);
     }
 
     public PendingAnimation createTaskLaunchAnimation(
@@ -4822,15 +4859,17 @@
         int lastGridTaskViewPosition =
                 getPositionInRow(lastGridTaskView, topRowIdArray, bottomRowIdArray);
         int taskViewPosition = getPositionInRow(taskView, topRowIdArray, bottomRowIdArray);
-        DeviceProfile dp = mActivity.getDeviceProfile();
-        Rect gridTaskRect = dp.getOverviewGridTaskRect(mIsRtl);
-        int gridTaskSizeAndSpacing = gridTaskRect.width() + mPageSpacing;
+        int gridTaskSizeAndSpacing = mLastComputedGridTaskSize.width() + mPageSpacing;
         int positionDiff = gridTaskSizeAndSpacing * (lastGridTaskViewPosition - taskViewPosition);
 
-        int lastTaskEnd = (mIsRtl ? dp.overviewGridRect.left : dp.overviewGridRect.right)
+        int lastTaskEnd = (mIsRtl
+                ? mLastComputedGridSize.left
+                : mLastComputedGridSize.right)
                 + (mIsRtl ? mPageSpacing : -mPageSpacing);
         int taskEnd = lastTaskEnd + (mIsRtl ? positionDiff : -positionDiff);
-        int normalTaskEnd = mIsRtl ? gridTaskRect.left : gridTaskRect.right;
+        int normalTaskEnd = mIsRtl
+                ? mLastComputedGridTaskSize.left
+                : mLastComputedGridTaskSize.right;
         return taskEnd - normalTaskEnd;
     }
 
@@ -5136,12 +5175,14 @@
             while ((taskView == null || isTaskViewFullyVisible(taskView)) && targetPage - 1 >= 0) {
                 taskView = getTaskViewAt(--targetPage);
             }
-            DeviceProfile dp = mActivity.getDeviceProfile();
-            Rect gridTaskRect = dp.getOverviewGridTaskRect(mIsRtl);
             // Target a scroll where targetPage is on left of screen but still fully visible.
-            int lastTaskEnd = (mIsRtl ? dp.overviewGridRect.left : dp.overviewGridRect.right)
+            int lastTaskEnd = (mIsRtl
+                    ? mLastComputedGridSize.left
+                    : mLastComputedGridSize.right)
                     + (mIsRtl ? mPageSpacing : -mPageSpacing);
-            int normalTaskEnd = mIsRtl ? gridTaskRect.left : gridTaskRect.right;
+            int normalTaskEnd = mIsRtl
+                    ? mLastComputedGridTaskSize.left
+                    : mLastComputedGridTaskSize.right;
             int targetScroll = getScrollForPage(targetPage) + normalTaskEnd - lastTaskEnd;
             // Find a page that is close to targetScroll while not over it.
             while (targetPage - 1 >= 0
diff --git a/quickstep/src/com/android/quickstep/views/TaskView.java b/quickstep/src/com/android/quickstep/views/TaskView.java
index ba56af1..5602d88 100644
--- a/quickstep/src/com/android/quickstep/views/TaskView.java
+++ b/quickstep/src/com/android/quickstep/views/TaskView.java
@@ -1391,8 +1391,9 @@
         DeviceProfile deviceProfile = mActivity.getDeviceProfile();
         if (deviceProfile.isTablet) {
             final int thumbnailPadding = deviceProfile.overviewTaskThumbnailTopMarginPx;
-            final int taskWidth = deviceProfile.overviewTaskRect.width();
-            final int taskHeight = deviceProfile.overviewTaskRect.height();
+            final Rect lastComputedTaskSize = getRecentsView().getLastComputedTaskSize();
+            final int taskWidth = lastComputedTaskSize.width();
+            final int taskHeight = lastComputedTaskSize.height();
 
             int boxWidth;
             int boxHeight;
@@ -1403,9 +1404,10 @@
                 boxWidth = taskWidth;
                 boxHeight = taskHeight;
             } else {
-                // Otherwise task is in grid.
-                boxWidth = deviceProfile.overviewGridTaskDimension.x;
-                boxHeight = deviceProfile.overviewGridTaskDimension.y;
+                // Otherwise task is in grid, and should use lastComputedGridTaskSize.
+                Rect lastComputedGridTaskSize = getRecentsView().getLastComputedGridTaskSize();
+                boxWidth = lastComputedGridTaskSize.width();
+                boxHeight = lastComputedGridTaskSize.height();
             }
 
             // Bound width/height to the box size.
diff --git a/quickstep/tests/src/com/android/quickstep/DeviceProfilePhone3ButtonTest.kt b/quickstep/tests/src/com/android/quickstep/DeviceProfilePhone3ButtonTest.kt
index 588e346..3daf81d 100644
--- a/quickstep/tests/src/com/android/quickstep/DeviceProfilePhone3ButtonTest.kt
+++ b/quickstep/tests/src/com/android/quickstep/DeviceProfilePhone3ButtonTest.kt
@@ -483,114 +483,4 @@
     fun hotseatBarEndOffset() {
         assertThat(dp.hotseatBarEndOffset).isEqualTo(0)
     }
-
-    @Test
-    fun overviewGridRectLeft() {
-        assertThat(dp.overviewGridRect.left).isEqualTo(0)
-    }
-
-    @Test
-    fun overviewGridRectTop() {
-        assertThat(dp.overviewGridRect.top).isEqualTo(280)
-    }
-
-    @Test
-    fun overviewGridRectRight() {
-        assertThat(dp.overviewGridRect.right).isEqualTo(1440)
-    }
-
-    @Test
-    fun overviewGridRectBottom() {
-        assertThat(dp.overviewGridRect.bottom).isEqualTo(2768)
-    }
-
-    @Test
-    fun taskDimensionX() {
-        assertThat(dp.taskDimension.x).isEqualTo(1440)
-    }
-
-    @Test
-    fun taskDimensionY() {
-        assertThat(dp.taskDimension.y).isEqualTo(3120)
-    }
-
-    @Test
-    fun overviewTaskRectLeft() {
-        assertThat(dp.overviewTaskRect.left).isEqualTo(231)
-    }
-
-    @Test
-    fun overviewTaskRectTop() {
-        assertThat(dp.overviewTaskRect.top).isEqualTo(414)
-    }
-
-    @Test
-    fun overviewTaskRectRight() {
-        assertThat(dp.overviewTaskRect.right).isEqualTo(1209)
-    }
-
-    @Test
-    fun overviewTaskRectBottom() {
-        assertThat(dp.overviewTaskRect.bottom).isEqualTo(2533)
-    }
-
-    @Test
-    fun overviewGridTaskDimensionX() {
-        assertThat(dp.overviewGridTaskDimension.x).isEqualTo(450)
-    }
-
-    @Test
-    fun overviewGridTaskDimensionY() {
-        assertThat(dp.overviewGridTaskDimension.y).isEqualTo(976)
-    }
-
-    @Test
-    fun overviewModalTaskRectLeft() {
-        assertThat(dp.overviewModalTaskRect.left).isEqualTo(182)
-    }
-
-    @Test
-    fun overviewModalTaskRectTop() {
-        assertThat(dp.overviewModalTaskRect.top).isEqualTo(202)
-    }
-
-    @Test
-    fun overviewModalTaskRectRight() {
-        assertThat(dp.overviewModalTaskRect.right).isEqualTo(1258)
-    }
-
-    @Test
-    fun overviewModalTaskRectBottom() {
-        assertThat(dp.overviewModalTaskRect.bottom).isEqualTo(2533)
-    }
-
-    @Test
-    fun getGridTaskRectLeft() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).left).isEqualTo(759)
-    }
-
-    @Test
-    fun getGridTaskRectTop() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).top).isEqualTo(414)
-    }
-
-    @Test
-    fun getGridTaskRectRight() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).right).isEqualTo(1209)
-    }
-
-    @Test
-    fun getGridTaskRectBottom() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).bottom).isEqualTo(1390)
-    }
-
-    @Test
-    fun overviewTaskScale() {
-        assertThat(dp.overviewTaskWorkspaceScale).isEqualTo(0.86595833f)
-    }
-
-    @Test
-    fun overviewModalTaskScale() {
-        assertThat(dp.overviewModalTaskScale).isEqualTo(1.1000472f)
-    }
 }
\ No newline at end of file
diff --git a/quickstep/tests/src/com/android/quickstep/DeviceProfilePhoneTest.kt b/quickstep/tests/src/com/android/quickstep/DeviceProfilePhoneTest.kt
index f91d03d..e588c71 100644
--- a/quickstep/tests/src/com/android/quickstep/DeviceProfilePhoneTest.kt
+++ b/quickstep/tests/src/com/android/quickstep/DeviceProfilePhoneTest.kt
@@ -483,114 +483,4 @@
     fun hotseatBarEndOffset() {
         assertThat(dp.hotseatBarEndOffset).isEqualTo(0)
     }
-
-    @Test
-    fun overviewGridRectLeft() {
-        assertThat(dp.overviewGridRect.left).isEqualTo(0)
-    }
-
-    @Test
-    fun overviewGridRectTop() {
-        assertThat(dp.overviewGridRect.top).isEqualTo(280)
-    }
-
-    @Test
-    fun overviewGridRectRight() {
-        assertThat(dp.overviewGridRect.right).isEqualTo(1440)
-    }
-
-    @Test
-    fun overviewGridRectBottom() {
-        assertThat(dp.overviewGridRect.bottom).isEqualTo(2768)
-    }
-
-    @Test
-    fun taskDimensionX() {
-        assertThat(dp.taskDimension.x).isEqualTo(1440)
-    }
-
-    @Test
-    fun taskDimensionY() {
-        assertThat(dp.taskDimension.y).isEqualTo(3120)
-    }
-
-    @Test
-    fun overviewTaskRectLeft() {
-        assertThat(dp.overviewTaskRect.left).isEqualTo(231)
-    }
-
-    @Test
-    fun overviewTaskRectTop() {
-        assertThat(dp.overviewTaskRect.top).isEqualTo(414)
-    }
-
-    @Test
-    fun overviewTaskRectRight() {
-        assertThat(dp.overviewTaskRect.right).isEqualTo(1209)
-    }
-
-    @Test
-    fun overviewTaskRectBottom() {
-        assertThat(dp.overviewTaskRect.bottom).isEqualTo(2533)
-    }
-
-    @Test
-    fun overviewGridTaskDimensionX() {
-        assertThat(dp.overviewGridTaskDimension.x).isEqualTo(450)
-    }
-
-    @Test
-    fun overviewGridTaskDimensionY() {
-        assertThat(dp.overviewGridTaskDimension.y).isEqualTo(976)
-    }
-
-    @Test
-    fun overviewModalTaskRectLeft() {
-        assertThat(dp.overviewModalTaskRect.left).isEqualTo(182)
-    }
-
-    @Test
-    fun overviewModalTaskRectTop() {
-        assertThat(dp.overviewModalTaskRect.top).isEqualTo(202)
-    }
-
-    @Test
-    fun overviewModalTaskRectRight() {
-        assertThat(dp.overviewModalTaskRect.right).isEqualTo(1258)
-    }
-
-    @Test
-    fun overviewModalTaskRectBottom() {
-        assertThat(dp.overviewModalTaskRect.bottom).isEqualTo(2533)
-    }
-
-    @Test
-    fun getGridTaskRectLeft() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).left).isEqualTo(759)
-    }
-
-    @Test
-    fun getGridTaskRectTop() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).top).isEqualTo(414)
-    }
-
-    @Test
-    fun getGridTaskRectRight() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).right).isEqualTo(1209)
-    }
-
-    @Test
-    fun getGridTaskRectBottom() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).bottom).isEqualTo(1390)
-    }
-
-    @Test
-    fun overviewTaskScale() {
-        assertThat(dp.overviewTaskWorkspaceScale).isEqualTo(0.86595833f)
-    }
-
-    @Test
-    fun overviewModalTaskScale() {
-        assertThat(dp.overviewModalTaskScale).isEqualTo(1.1000472f)
-    }
 }
\ No newline at end of file
diff --git a/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletLandscape3ButtonTest.kt b/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletLandscape3ButtonTest.kt
index 2d9e263..d0c9346 100644
--- a/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletLandscape3ButtonTest.kt
+++ b/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletLandscape3ButtonTest.kt
@@ -461,7 +461,7 @@
 
     @Test
     fun getHotseatLayoutPaddingLeft() {
-        assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(1443)
+        assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(1305)
     }
 
     @Test
@@ -471,7 +471,7 @@
 
     @Test
     fun getHotseatLayoutPaddingRight() {
-        assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(428)
+        assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(566)
     }
 
     @Test
@@ -481,116 +481,6 @@
 
     @Test
     fun hotseatBarEndOffset() {
-        assertThat(dp.hotseatBarEndOffset).isEqualTo(428)
-    }
-
-    @Test
-    fun overviewGridRectLeft() {
-        assertThat(dp.overviewGridRect.left).isEqualTo(128)
-    }
-
-    @Test
-    fun overviewGridRectTop() {
-        assertThat(dp.overviewGridRect.top).isEqualTo(160)
-    }
-
-    @Test
-    fun overviewGridRectRight() {
-        assertThat(dp.overviewGridRect.right).isEqualTo(2432)
-    }
-
-    @Test
-    fun overviewGridRectBottom() {
-        assertThat(dp.overviewGridRect.bottom).isEqualTo(1340)
-    }
-
-    @Test
-    fun taskDimensionX() {
-        assertThat(dp.taskDimension.x).isEqualTo(2560)
-    }
-
-    @Test
-    fun taskDimensionY() {
-        assertThat(dp.taskDimension.y).isEqualTo(1480)
-    }
-
-    @Test
-    fun overviewTaskRectLeft() {
-        assertThat(dp.overviewTaskRect.left).isEqualTo(384)
-    }
-
-    @Test
-    fun overviewTaskRectTop() {
-        assertThat(dp.overviewTaskRect.top).isEqualTo(232)
-    }
-
-    @Test
-    fun overviewTaskRectRight() {
-        assertThat(dp.overviewTaskRect.right).isEqualTo(2176)
-    }
-
-    @Test
-    fun overviewTaskRectBottom() {
-        assertThat(dp.overviewTaskRect.bottom).isEqualTo(1268)
-    }
-
-    @Test
-    fun overviewGridTaskDimensionX() {
-        assertThat(dp.overviewGridTaskDimension.x).isEqualTo(723)
-    }
-
-    @Test
-    fun overviewGridTaskDimensionY() {
-        assertThat(dp.overviewGridTaskDimension.y).isEqualTo(418)
-    }
-
-    @Test
-    fun overviewModalTaskRectLeft() {
-        assertThat(dp.overviewModalTaskRect.left).isEqualTo(294)
-    }
-
-    @Test
-    fun overviewModalTaskRectTop() {
-        assertThat(dp.overviewModalTaskRect.top).isEqualTo(128)
-    }
-
-    @Test
-    fun overviewModalTaskRectRight() {
-        assertThat(dp.overviewModalTaskRect.right).isEqualTo(2266)
-    }
-
-    @Test
-    fun overviewModalTaskRectBottom() {
-        assertThat(dp.overviewModalTaskRect.bottom).isEqualTo(1268)
-    }
-
-    @Test
-    fun getGridTaskRectLeft() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).left).isEqualTo(1453)
-    }
-
-    @Test
-    fun getGridTaskRectTop() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).top).isEqualTo(232)
-    }
-
-    @Test
-    fun getGridTaskRectRight() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).right).isEqualTo(2176)
-    }
-
-    @Test
-    fun getGridTaskRectBottom() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).bottom).isEqualTo(650)
-    }
-
-    @Test
-    fun overviewTaskScale() {
-        assertThat(dp.overviewTaskWorkspaceScale).isEqualTo(0.7363184f)
-    }
-
-    @Test
-    fun overviewModalTaskScale() {
-        assertThat(dp.overviewModalTaskScale).isEqualTo(1.1003861f)
+        assertThat(dp.hotseatBarEndOffset).isEqualTo(566)
     }
 }
\ No newline at end of file
diff --git a/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletLandscapeTest.kt b/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletLandscapeTest.kt
index 3add2c7..456ed2c 100644
--- a/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletLandscapeTest.kt
+++ b/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletLandscapeTest.kt
@@ -483,114 +483,4 @@
     fun hotseatBarEndOffset() {
         assertThat(dp.hotseatBarEndOffset).isEqualTo(0)
     }
-
-    @Test
-    fun overviewGridRectLeft() {
-        assertThat(dp.overviewGridRect.left).isEqualTo(128)
-    }
-
-    @Test
-    fun overviewGridRectTop() {
-        assertThat(dp.overviewGridRect.top).isEqualTo(160)
-    }
-
-    @Test
-    fun overviewGridRectRight() {
-        assertThat(dp.overviewGridRect.right).isEqualTo(2432)
-    }
-
-    @Test
-    fun overviewGridRectBottom() {
-        assertThat(dp.overviewGridRect.bottom).isEqualTo(1416)
-    }
-
-    @Test
-    fun taskDimensionX() {
-        assertThat(dp.taskDimension.x).isEqualTo(2560)
-    }
-
-    @Test
-    fun taskDimensionY() {
-        assertThat(dp.taskDimension.y).isEqualTo(1480)
-    }
-
-    @Test
-    fun overviewTaskRectLeft() {
-        assertThat(dp.overviewTaskRect.left).isEqualTo(384)
-    }
-
-    @Test
-    fun overviewTaskRectTop() {
-        assertThat(dp.overviewTaskRect.top).isEqualTo(270)
-    }
-
-    @Test
-    fun overviewTaskRectRight() {
-        assertThat(dp.overviewTaskRect.right).isEqualTo(2176)
-    }
-
-    @Test
-    fun overviewTaskRectBottom() {
-        assertThat(dp.overviewTaskRect.bottom).isEqualTo(1306)
-    }
-
-    @Test
-    fun overviewGridTaskDimensionX() {
-        assertThat(dp.overviewGridTaskDimension.x).isEqualTo(723)
-    }
-
-    @Test
-    fun overviewGridTaskDimensionY() {
-        assertThat(dp.overviewGridTaskDimension.y).isEqualTo(418)
-    }
-
-    @Test
-    fun overviewModalTaskRectLeft() {
-        assertThat(dp.overviewModalTaskRect.left).isEqualTo(294)
-    }
-
-    @Test
-    fun overviewModalTaskRectTop() {
-        assertThat(dp.overviewModalTaskRect.top).isEqualTo(166)
-    }
-
-    @Test
-    fun overviewModalTaskRectRight() {
-        assertThat(dp.overviewModalTaskRect.right).isEqualTo(2266)
-    }
-
-    @Test
-    fun overviewModalTaskRectBottom() {
-        assertThat(dp.overviewModalTaskRect.bottom).isEqualTo(1306)
-    }
-
-    @Test
-    fun getGridTaskRectLeft() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).left).isEqualTo(1453)
-    }
-
-    @Test
-    fun getGridTaskRectTop() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).top).isEqualTo(270)
-    }
-
-    @Test
-    fun getGridTaskRectRight() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).right).isEqualTo(2176)
-    }
-
-    @Test
-    fun getGridTaskRectBottom() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).bottom).isEqualTo(688)
-    }
-
-    @Test
-    fun overviewTaskScale() {
-        assertThat(dp.overviewTaskWorkspaceScale).isEqualTo(0.7363184f)
-    }
-
-    @Test
-    fun overviewModalTaskScale() {
-        assertThat(dp.overviewModalTaskScale).isEqualTo(1.1003861f)
-    }
 }
\ No newline at end of file
diff --git a/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletPortrait3ButtonTest.kt b/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletPortrait3ButtonTest.kt
index 7f0d6ca..eed3598 100644
--- a/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletPortrait3ButtonTest.kt
+++ b/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletPortrait3ButtonTest.kt
@@ -481,116 +481,6 @@
 
     @Test
     fun hotseatBarEndOffset() {
-        assertThat(dp.hotseatBarEndOffset).isEqualTo(428)
-    }
-
-    @Test
-    fun overviewGridRectLeft() {
-        assertThat(dp.overviewGridRect.left).isEqualTo(128)
-    }
-
-    @Test
-    fun overviewGridRectTop() {
-        assertThat(dp.overviewGridRect.top).isEqualTo(160)
-    }
-
-    @Test
-    fun overviewGridRectRight() {
-        assertThat(dp.overviewGridRect.right).isEqualTo(1472)
-    }
-
-    @Test
-    fun overviewGridRectBottom() {
-        assertThat(dp.overviewGridRect.bottom).isEqualTo(2292)
-    }
-
-    @Test
-    fun taskDimensionX() {
-        assertThat(dp.taskDimension.x).isEqualTo(1600)
-    }
-
-    @Test
-    fun taskDimensionY() {
-        assertThat(dp.taskDimension.y).isEqualTo(2440)
-    }
-
-    @Test
-    fun overviewTaskRectLeft() {
-        assertThat(dp.overviewTaskRect.left).isEqualTo(240)
-    }
-
-    @Test
-    fun overviewTaskRectTop() {
-        assertThat(dp.overviewTaskRect.top).isEqualTo(372)
-    }
-
-    @Test
-    fun overviewTaskRectRight() {
-        assertThat(dp.overviewTaskRect.right).isEqualTo(1360)
-    }
-
-    @Test
-    fun overviewTaskRectBottom() {
-        assertThat(dp.overviewTaskRect.bottom).isEqualTo(2080)
-    }
-
-    @Test
-    fun overviewGridTaskDimensionX() {
-        assertThat(dp.overviewGridTaskDimension.x).isEqualTo(494)
-    }
-
-    @Test
-    fun overviewGridTaskDimensionY() {
-        assertThat(dp.overviewGridTaskDimension.y).isEqualTo(754)
-    }
-
-    @Test
-    fun overviewModalTaskRectLeft() {
-        assertThat(dp.overviewModalTaskRect.left).isEqualTo(184)
-    }
-
-    @Test
-    fun overviewModalTaskRectTop() {
-        assertThat(dp.overviewModalTaskRect.top).isEqualTo(201)
-    }
-
-    @Test
-    fun overviewModalTaskRectRight() {
-        assertThat(dp.overviewModalTaskRect.right).isEqualTo(1416)
-    }
-
-    @Test
-    fun overviewModalTaskRectBottom() {
-        assertThat(dp.overviewModalTaskRect.bottom).isEqualTo(2080)
-    }
-
-    @Test
-    fun getGridTaskRectLeft() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).left).isEqualTo(866)
-    }
-
-    @Test
-    fun getGridTaskRectTop() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).top).isEqualTo(372)
-    }
-
-    @Test
-    fun getGridTaskRectRight() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).right).isEqualTo(1360)
-    }
-
-    @Test
-    fun getGridTaskRectBottom() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).bottom).isEqualTo(1126)
-    }
-
-    @Test
-    fun overviewTaskScale() {
-        assertThat(dp.overviewTaskWorkspaceScale).isEqualTo(0.7686769f)
-    }
-
-    @Test
-    fun overviewModalTaskScale() {
-        assertThat(dp.overviewModalTaskScale).isEqualTo(1.1f)
+        assertThat(dp.hotseatBarEndOffset).isEqualTo(502)
     }
 }
\ No newline at end of file
diff --git a/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletPortraitTest.kt b/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletPortraitTest.kt
index 1a709e6..4be3e45 100644
--- a/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletPortraitTest.kt
+++ b/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletPortraitTest.kt
@@ -483,114 +483,4 @@
     fun hotseatBarEndOffset() {
         assertThat(dp.hotseatBarEndOffset).isEqualTo(0)
     }
-
-    @Test
-    fun overviewGridRectLeft() {
-        assertThat(dp.overviewGridRect.left).isEqualTo(128)
-    }
-
-    @Test
-    fun overviewGridRectTop() {
-        assertThat(dp.overviewGridRect.top).isEqualTo(160)
-    }
-
-    @Test
-    fun overviewGridRectRight() {
-        assertThat(dp.overviewGridRect.right).isEqualTo(1472)
-    }
-
-    @Test
-    fun overviewGridRectBottom() {
-        assertThat(dp.overviewGridRect.bottom).isEqualTo(2368)
-    }
-
-    @Test
-    fun taskDimensionX() {
-        assertThat(dp.taskDimension.x).isEqualTo(1600)
-    }
-
-    @Test
-    fun taskDimensionY() {
-        assertThat(dp.taskDimension.y).isEqualTo(2440)
-    }
-
-    @Test
-    fun overviewTaskRectLeft() {
-        assertThat(dp.overviewTaskRect.left).isEqualTo(240)
-    }
-
-    @Test
-    fun overviewTaskRectTop() {
-        assertThat(dp.overviewTaskRect.top).isEqualTo(410)
-    }
-
-    @Test
-    fun overviewTaskRectRight() {
-        assertThat(dp.overviewTaskRect.right).isEqualTo(1360)
-    }
-
-    @Test
-    fun overviewTaskRectBottom() {
-        assertThat(dp.overviewTaskRect.bottom).isEqualTo(2118)
-    }
-
-    @Test
-    fun overviewGridTaskDimensionX() {
-        assertThat(dp.overviewGridTaskDimension.x).isEqualTo(494)
-    }
-
-    @Test
-    fun overviewGridTaskDimensionY() {
-        assertThat(dp.overviewGridTaskDimension.y).isEqualTo(754)
-    }
-
-    @Test
-    fun overviewModalTaskRectLeft() {
-        assertThat(dp.overviewModalTaskRect.left).isEqualTo(184)
-    }
-
-    @Test
-    fun overviewModalTaskRectTop() {
-        assertThat(dp.overviewModalTaskRect.top).isEqualTo(239)
-    }
-
-    @Test
-    fun overviewModalTaskRectRight() {
-        assertThat(dp.overviewModalTaskRect.right).isEqualTo(1416)
-    }
-
-    @Test
-    fun overviewModalTaskRectBottom() {
-        assertThat(dp.overviewModalTaskRect.bottom).isEqualTo(2118)
-    }
-
-    @Test
-    fun getGridTaskRectLeft() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).left).isEqualTo(866)
-    }
-
-    @Test
-    fun getGridTaskRectTop() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).top).isEqualTo(410)
-    }
-
-    @Test
-    fun getGridTaskRectRight() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).right).isEqualTo(1360)
-    }
-
-    @Test
-    fun getGridTaskRectBottom() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).bottom).isEqualTo(1164)
-    }
-
-    @Test
-    fun overviewTaskScale() {
-        assertThat(dp.overviewTaskWorkspaceScale).isEqualTo(0.7686769f)
-    }
-
-    @Test
-    fun overviewModalTaskScale() {
-        assertThat(dp.overviewModalTaskScale).isEqualTo(1.1f)
-    }
 }
\ No newline at end of file
diff --git a/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelLandscape3ButtonTest.kt b/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelLandscape3ButtonTest.kt
index 0eeb23d..6728540 100644
--- a/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelLandscape3ButtonTest.kt
+++ b/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelLandscape3ButtonTest.kt
@@ -481,116 +481,6 @@
 
     @Test
     fun hotseatBarEndOffset() {
-        assertThat(dp.hotseatBarEndOffset).isEqualTo(428)
-    }
-
-    @Test
-    fun overviewGridRectLeft() {
-        assertThat(dp.overviewGridRect.left).isEqualTo(128)
-    }
-
-    @Test
-    fun overviewGridRectTop() {
-        assertThat(dp.overviewGridRect.top).isEqualTo(160)
-    }
-
-    @Test
-    fun overviewGridRectRight() {
-        assertThat(dp.overviewGridRect.right).isEqualTo(2432)
-    }
-
-    @Test
-    fun overviewGridRectBottom() {
-        assertThat(dp.overviewGridRect.bottom).isEqualTo(1340)
-    }
-
-    @Test
-    fun taskDimensionX() {
-        assertThat(dp.taskDimension.x).isEqualTo(2560)
-    }
-
-    @Test
-    fun taskDimensionY() {
-        assertThat(dp.taskDimension.y).isEqualTo(1480)
-    }
-
-    @Test
-    fun overviewTaskRectLeft() {
-        assertThat(dp.overviewTaskRect.left).isEqualTo(384)
-    }
-
-    @Test
-    fun overviewTaskRectTop() {
-        assertThat(dp.overviewTaskRect.top).isEqualTo(232)
-    }
-
-    @Test
-    fun overviewTaskRectRight() {
-        assertThat(dp.overviewTaskRect.right).isEqualTo(2176)
-    }
-
-    @Test
-    fun overviewTaskRectBottom() {
-        assertThat(dp.overviewTaskRect.bottom).isEqualTo(1268)
-    }
-
-    @Test
-    fun overviewGridTaskDimensionX() {
-        assertThat(dp.overviewGridTaskDimension.x).isEqualTo(723)
-    }
-
-    @Test
-    fun overviewGridTaskDimensionY() {
-        assertThat(dp.overviewGridTaskDimension.y).isEqualTo(418)
-    }
-
-    @Test
-    fun overviewModalTaskRectLeft() {
-        assertThat(dp.overviewModalTaskRect.left).isEqualTo(294)
-    }
-
-    @Test
-    fun overviewModalTaskRectTop() {
-        assertThat(dp.overviewModalTaskRect.top).isEqualTo(128)
-    }
-
-    @Test
-    fun overviewModalTaskRectRight() {
-        assertThat(dp.overviewModalTaskRect.right).isEqualTo(2266)
-    }
-
-    @Test
-    fun overviewModalTaskRectBottom() {
-        assertThat(dp.overviewModalTaskRect.bottom).isEqualTo(1268)
-    }
-
-    @Test
-    fun getGridTaskRectLeft() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).left).isEqualTo(1453)
-    }
-
-    @Test
-    fun getGridTaskRectTop() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).top).isEqualTo(232)
-    }
-
-    @Test
-    fun getGridTaskRectRight() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).right).isEqualTo(2176)
-    }
-
-    @Test
-    fun getGridTaskRectBottom() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).bottom).isEqualTo(650)
-    }
-
-    @Test
-    fun overviewTaskScale() {
-        assertThat(dp.overviewTaskWorkspaceScale).isEqualTo(0.8526749f)
-    }
-
-    @Test
-    fun overviewModalTaskScale() {
-        assertThat(dp.overviewModalTaskScale).isEqualTo(1.1003861f)
+        assertThat(dp.hotseatBarEndOffset).isEqualTo(566)
     }
 }
\ No newline at end of file
diff --git a/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelLandscapeTest.kt b/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelLandscapeTest.kt
index 7bf53d7..ba3ef55 100644
--- a/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelLandscapeTest.kt
+++ b/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelLandscapeTest.kt
@@ -483,114 +483,4 @@
     fun hotseatBarEndOffset() {
         assertThat(dp.hotseatBarEndOffset).isEqualTo(0)
     }
-
-    @Test
-    fun overviewGridRectLeft() {
-        assertThat(dp.overviewGridRect.left).isEqualTo(128)
-    }
-
-    @Test
-    fun overviewGridRectTop() {
-        assertThat(dp.overviewGridRect.top).isEqualTo(160)
-    }
-
-    @Test
-    fun overviewGridRectRight() {
-        assertThat(dp.overviewGridRect.right).isEqualTo(2432)
-    }
-
-    @Test
-    fun overviewGridRectBottom() {
-        assertThat(dp.overviewGridRect.bottom).isEqualTo(1416)
-    }
-
-    @Test
-    fun taskDimensionX() {
-        assertThat(dp.taskDimension.x).isEqualTo(2560)
-    }
-
-    @Test
-    fun taskDimensionY() {
-        assertThat(dp.taskDimension.y).isEqualTo(1480)
-    }
-
-    @Test
-    fun overviewTaskRectLeft() {
-        assertThat(dp.overviewTaskRect.left).isEqualTo(384)
-    }
-
-    @Test
-    fun overviewTaskRectTop() {
-        assertThat(dp.overviewTaskRect.top).isEqualTo(270)
-    }
-
-    @Test
-    fun overviewTaskRectRight() {
-        assertThat(dp.overviewTaskRect.right).isEqualTo(2176)
-    }
-
-    @Test
-    fun overviewTaskRectBottom() {
-        assertThat(dp.overviewTaskRect.bottom).isEqualTo(1306)
-    }
-
-    @Test
-    fun overviewGridTaskDimensionX() {
-        assertThat(dp.overviewGridTaskDimension.x).isEqualTo(723)
-    }
-
-    @Test
-    fun overviewGridTaskDimensionY() {
-        assertThat(dp.overviewGridTaskDimension.y).isEqualTo(418)
-    }
-
-    @Test
-    fun overviewModalTaskRectLeft() {
-        assertThat(dp.overviewModalTaskRect.left).isEqualTo(294)
-    }
-
-    @Test
-    fun overviewModalTaskRectTop() {
-        assertThat(dp.overviewModalTaskRect.top).isEqualTo(166)
-    }
-
-    @Test
-    fun overviewModalTaskRectRight() {
-        assertThat(dp.overviewModalTaskRect.right).isEqualTo(2266)
-    }
-
-    @Test
-    fun overviewModalTaskRectBottom() {
-        assertThat(dp.overviewModalTaskRect.bottom).isEqualTo(1306)
-    }
-
-    @Test
-    fun getGridTaskRectLeft() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).left).isEqualTo(1453)
-    }
-
-    @Test
-    fun getGridTaskRectTop() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).top).isEqualTo(270)
-    }
-
-    @Test
-    fun getGridTaskRectRight() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).right).isEqualTo(2176)
-    }
-
-    @Test
-    fun getGridTaskRectBottom() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).bottom).isEqualTo(688)
-    }
-
-    @Test
-    fun overviewTaskScale() {
-        assertThat(dp.overviewTaskWorkspaceScale).isEqualTo(0.8526749f)
-    }
-
-    @Test
-    fun overviewModalTaskScale() {
-        assertThat(dp.overviewModalTaskScale).isEqualTo(1.1003861f)
-    }
 }
\ No newline at end of file
diff --git a/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelPortrait3ButtonTest.kt b/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelPortrait3ButtonTest.kt
index 9b6d7d5..a4b446a 100644
--- a/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelPortrait3ButtonTest.kt
+++ b/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelPortrait3ButtonTest.kt
@@ -461,7 +461,7 @@
 
     @Test
     fun getHotseatLayoutPaddingLeft() {
-        assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(340)
+        assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(266)
     }
 
     @Test
@@ -471,7 +471,7 @@
 
     @Test
     fun getHotseatLayoutPaddingRight() {
-        assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(428)
+        assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(502)
     }
 
     @Test
@@ -481,116 +481,6 @@
 
     @Test
     fun hotseatBarEndOffset() {
-        assertThat(dp.hotseatBarEndOffset).isEqualTo(428)
-    }
-
-    @Test
-    fun overviewGridRectLeft() {
-        assertThat(dp.overviewGridRect.left).isEqualTo(128)
-    }
-
-    @Test
-    fun overviewGridRectTop() {
-        assertThat(dp.overviewGridRect.top).isEqualTo(160)
-    }
-
-    @Test
-    fun overviewGridRectRight() {
-        assertThat(dp.overviewGridRect.right).isEqualTo(1472)
-    }
-
-    @Test
-    fun overviewGridRectBottom() {
-        assertThat(dp.overviewGridRect.bottom).isEqualTo(2292)
-    }
-
-    @Test
-    fun taskDimensionX() {
-        assertThat(dp.taskDimension.x).isEqualTo(1600)
-    }
-
-    @Test
-    fun taskDimensionY() {
-        assertThat(dp.taskDimension.y).isEqualTo(2440)
-    }
-
-    @Test
-    fun overviewTaskRectLeft() {
-        assertThat(dp.overviewTaskRect.left).isEqualTo(240)
-    }
-
-    @Test
-    fun overviewTaskRectTop() {
-        assertThat(dp.overviewTaskRect.top).isEqualTo(372)
-    }
-
-    @Test
-    fun overviewTaskRectRight() {
-        assertThat(dp.overviewTaskRect.right).isEqualTo(1360)
-    }
-
-    @Test
-    fun overviewTaskRectBottom() {
-        assertThat(dp.overviewTaskRect.bottom).isEqualTo(2080)
-    }
-
-    @Test
-    fun overviewGridTaskDimensionX() {
-        assertThat(dp.overviewGridTaskDimension.x).isEqualTo(494)
-    }
-
-    @Test
-    fun overviewGridTaskDimensionY() {
-        assertThat(dp.overviewGridTaskDimension.y).isEqualTo(754)
-    }
-
-    @Test
-    fun overviewModalTaskRectLeft() {
-        assertThat(dp.overviewModalTaskRect.left).isEqualTo(184)
-    }
-
-    @Test
-    fun overviewModalTaskRectTop() {
-        assertThat(dp.overviewModalTaskRect.top).isEqualTo(201)
-    }
-
-    @Test
-    fun overviewModalTaskRectRight() {
-        assertThat(dp.overviewModalTaskRect.right).isEqualTo(1416)
-    }
-
-    @Test
-    fun overviewModalTaskRectBottom() {
-        assertThat(dp.overviewModalTaskRect.bottom).isEqualTo(2080)
-    }
-
-    @Test
-    fun getGridTaskRectLeft() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).left).isEqualTo(866)
-    }
-
-    @Test
-    fun getGridTaskRectTop() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).top).isEqualTo(372)
-    }
-
-    @Test
-    fun getGridTaskRectRight() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).right).isEqualTo(1360)
-    }
-
-    @Test
-    fun getGridTaskRectBottom() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).bottom).isEqualTo(1126)
-    }
-
-    @Test
-    fun overviewTaskScale() {
-        assertThat(dp.overviewTaskWorkspaceScale).isEqualTo(0.7874597f)
-    }
-
-    @Test
-    fun overviewModalTaskScale() {
-        assertThat(dp.overviewModalTaskScale).isEqualTo(1.1f)
+        assertThat(dp.hotseatBarEndOffset).isEqualTo(502)
     }
 }
\ No newline at end of file
diff --git a/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelPortraitTest.kt b/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelPortraitTest.kt
index 6702eb5..0c5968e 100644
--- a/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelPortraitTest.kt
+++ b/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelPortraitTest.kt
@@ -483,114 +483,4 @@
     fun hotseatBarEndOffset() {
         assertThat(dp.hotseatBarEndOffset).isEqualTo(0)
     }
-
-    @Test
-    fun overviewGridRectLeft() {
-        assertThat(dp.overviewGridRect.left).isEqualTo(128)
-    }
-
-    @Test
-    fun overviewGridRectTop() {
-        assertThat(dp.overviewGridRect.top).isEqualTo(160)
-    }
-
-    @Test
-    fun overviewGridRectRight() {
-        assertThat(dp.overviewGridRect.right).isEqualTo(1472)
-    }
-
-    @Test
-    fun overviewGridRectBottom() {
-        assertThat(dp.overviewGridRect.bottom).isEqualTo(2368)
-    }
-
-    @Test
-    fun taskDimensionX() {
-        assertThat(dp.taskDimension.x).isEqualTo(1600)
-    }
-
-    @Test
-    fun taskDimensionY() {
-        assertThat(dp.taskDimension.y).isEqualTo(2440)
-    }
-
-    @Test
-    fun overviewTaskRectLeft() {
-        assertThat(dp.overviewTaskRect.left).isEqualTo(240)
-    }
-
-    @Test
-    fun overviewTaskRectTop() {
-        assertThat(dp.overviewTaskRect.top).isEqualTo(410)
-    }
-
-    @Test
-    fun overviewTaskRectRight() {
-        assertThat(dp.overviewTaskRect.right).isEqualTo(1360)
-    }
-
-    @Test
-    fun overviewTaskRectBottom() {
-        assertThat(dp.overviewTaskRect.bottom).isEqualTo(2118)
-    }
-
-    @Test
-    fun overviewGridTaskDimensionX() {
-        assertThat(dp.overviewGridTaskDimension.x).isEqualTo(494)
-    }
-
-    @Test
-    fun overviewGridTaskDimensionY() {
-        assertThat(dp.overviewGridTaskDimension.y).isEqualTo(754)
-    }
-
-    @Test
-    fun overviewModalTaskRectLeft() {
-        assertThat(dp.overviewModalTaskRect.left).isEqualTo(184)
-    }
-
-    @Test
-    fun overviewModalTaskRectTop() {
-        assertThat(dp.overviewModalTaskRect.top).isEqualTo(239)
-    }
-
-    @Test
-    fun overviewModalTaskRectRight() {
-        assertThat(dp.overviewModalTaskRect.right).isEqualTo(1416)
-    }
-
-    @Test
-    fun overviewModalTaskRectBottom() {
-        assertThat(dp.overviewModalTaskRect.bottom).isEqualTo(2118)
-    }
-
-    @Test
-    fun getGridTaskRectLeft() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).left).isEqualTo(866)
-    }
-
-    @Test
-    fun getGridTaskRectTop() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).top).isEqualTo(410)
-    }
-
-    @Test
-    fun getGridTaskRectRight() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).right).isEqualTo(1360)
-    }
-
-    @Test
-    fun getGridTaskRectBottom() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).bottom).isEqualTo(1164)
-    }
-
-    @Test
-    fun overviewTaskScale() {
-        assertThat(dp.overviewTaskWorkspaceScale).isEqualTo(0.7874597f)
-    }
-
-    @Test
-    fun overviewModalTaskScale() {
-        assertThat(dp.overviewModalTaskScale).isEqualTo(1.1f)
-    }
 }
\ No newline at end of file
diff --git a/quickstep/tests/src/com/android/quickstep/DeviceProfileVerticalBar3ButtonTest.kt b/quickstep/tests/src/com/android/quickstep/DeviceProfileVerticalBar3ButtonTest.kt
index 7e0c5f3..2bad6bb 100644
--- a/quickstep/tests/src/com/android/quickstep/DeviceProfileVerticalBar3ButtonTest.kt
+++ b/quickstep/tests/src/com/android/quickstep/DeviceProfileVerticalBar3ButtonTest.kt
@@ -483,114 +483,4 @@
     fun hotseatBarEndOffset() {
         assertThat(dp.hotseatBarEndOffset).isEqualTo(0)
     }
-
-    @Test
-    fun overviewGridRectLeft() {
-        assertThat(dp.overviewGridRect.left).isEqualTo(0)
-    }
-
-    @Test
-    fun overviewGridRectTop() {
-        assertThat(dp.overviewGridRect.top).isEqualTo(280)
-    }
-
-    @Test
-    fun overviewGridRectRight() {
-        assertThat(dp.overviewGridRect.right).isEqualTo(3120)
-    }
-
-    @Test
-    fun overviewGridRectBottom() {
-        assertThat(dp.overviewGridRect.bottom).isEqualTo(1130)
-    }
-
-    @Test
-    fun taskDimensionX() {
-        assertThat(dp.taskDimension.x).isEqualTo(3120)
-    }
-
-    @Test
-    fun taskDimensionY() {
-        assertThat(dp.taskDimension.y).isEqualTo(1440)
-    }
-
-    @Test
-    fun overviewTaskRectLeft() {
-        assertThat(dp.overviewTaskRect.left).isEqualTo(747)
-    }
-
-    @Test
-    fun overviewTaskRectTop() {
-        assertThat(dp.overviewTaskRect.top).isEqualTo(280)
-    }
-
-    @Test
-    fun overviewTaskRectRight() {
-        assertThat(dp.overviewTaskRect.right).isEqualTo(2372)
-    }
-
-    @Test
-    fun overviewTaskRectBottom() {
-        assertThat(dp.overviewTaskRect.bottom).isEqualTo(1030)
-    }
-
-    @Test
-    fun overviewGridTaskDimensionX() {
-        assertThat(dp.overviewGridTaskDimension.x).isEqualTo(631)
-    }
-
-    @Test
-    fun overviewGridTaskDimensionY() {
-        assertThat(dp.overviewGridTaskDimension.y).isEqualTo(291)
-    }
-
-    @Test
-    fun overviewModalTaskRectLeft() {
-        assertThat(dp.overviewModalTaskRect.left).isEqualTo(666)
-    }
-
-    @Test
-    fun overviewModalTaskRectTop() {
-        assertThat(dp.overviewModalTaskRect.top).isEqualTo(205)
-    }
-
-    @Test
-    fun overviewModalTaskRectRight() {
-        assertThat(dp.overviewModalTaskRect.right).isEqualTo(2454)
-    }
-
-    @Test
-    fun overviewModalTaskRectBottom() {
-        assertThat(dp.overviewModalTaskRect.bottom).isEqualTo(1030)
-    }
-
-    @Test
-    fun getGridTaskRectLeft() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).left).isEqualTo(1741)
-    }
-
-    @Test
-    fun getGridTaskRectTop() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).top).isEqualTo(280)
-    }
-
-    @Test
-    fun getGridTaskRectRight() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).right).isEqualTo(2372)
-    }
-
-    @Test
-    fun getGridTaskRectBottom() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).bottom).isEqualTo(571)
-    }
-
-    @Test
-    fun overviewTaskScale() {
-        assertThat(dp.overviewTaskWorkspaceScale).isEqualTo(0.5597015f)
-    }
-
-    @Test
-    fun overviewModalTaskScale() {
-        assertThat(dp.overviewModalTaskScale).isEqualTo(1.1f)
-    }
 }
\ No newline at end of file
diff --git a/quickstep/tests/src/com/android/quickstep/DeviceProfileVerticalBarTest.kt b/quickstep/tests/src/com/android/quickstep/DeviceProfileVerticalBarTest.kt
index 9580458..6256a43 100644
--- a/quickstep/tests/src/com/android/quickstep/DeviceProfileVerticalBarTest.kt
+++ b/quickstep/tests/src/com/android/quickstep/DeviceProfileVerticalBarTest.kt
@@ -483,114 +483,4 @@
     fun hotseatBarEndOffset() {
         assertThat(dp.hotseatBarEndOffset).isEqualTo(0)
     }
-
-    @Test
-    fun overviewGridRectLeft() {
-        assertThat(dp.overviewGridRect.left).isEqualTo(0)
-    }
-
-    @Test
-    fun overviewGridRectTop() {
-        assertThat(dp.overviewGridRect.top).isEqualTo(280)
-    }
-
-    @Test
-    fun overviewGridRectRight() {
-        assertThat(dp.overviewGridRect.right).isEqualTo(3120)
-    }
-
-    @Test
-    fun overviewGridRectBottom() {
-        assertThat(dp.overviewGridRect.bottom).isEqualTo(1130)
-    }
-
-    @Test
-    fun taskDimensionX() {
-        assertThat(dp.taskDimension.x).isEqualTo(3120)
-    }
-
-    @Test
-    fun taskDimensionY() {
-        assertThat(dp.taskDimension.y).isEqualTo(1440)
-    }
-
-    @Test
-    fun overviewTaskRectLeft() {
-        assertThat(dp.overviewTaskRect.left).isEqualTo(747)
-    }
-
-    @Test
-    fun overviewTaskRectTop() {
-        assertThat(dp.overviewTaskRect.top).isEqualTo(280)
-    }
-
-    @Test
-    fun overviewTaskRectRight() {
-        assertThat(dp.overviewTaskRect.right).isEqualTo(2372)
-    }
-
-    @Test
-    fun overviewTaskRectBottom() {
-        assertThat(dp.overviewTaskRect.bottom).isEqualTo(1030)
-    }
-
-    @Test
-    fun overviewGridTaskDimensionX() {
-        assertThat(dp.overviewGridTaskDimension.x).isEqualTo(631)
-    }
-
-    @Test
-    fun overviewGridTaskDimensionY() {
-        assertThat(dp.overviewGridTaskDimension.y).isEqualTo(291)
-    }
-
-    @Test
-    fun overviewModalTaskRectLeft() {
-        assertThat(dp.overviewModalTaskRect.left).isEqualTo(666)
-    }
-
-    @Test
-    fun overviewModalTaskRectTop() {
-        assertThat(dp.overviewModalTaskRect.top).isEqualTo(205)
-    }
-
-    @Test
-    fun overviewModalTaskRectRight() {
-        assertThat(dp.overviewModalTaskRect.right).isEqualTo(2454)
-    }
-
-    @Test
-    fun overviewModalTaskRectBottom() {
-        assertThat(dp.overviewModalTaskRect.bottom).isEqualTo(1030)
-    }
-
-    @Test
-    fun getGridTaskRectLeft() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).left).isEqualTo(1741)
-    }
-
-    @Test
-    fun getGridTaskRectTop() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).top).isEqualTo(280)
-    }
-
-    @Test
-    fun getGridTaskRectRight() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).right).isEqualTo(2372)
-    }
-
-    @Test
-    fun getGridTaskRectBottom() {
-        assertThat(dp.getOverviewGridTaskRect(isRecentsRtl).bottom).isEqualTo(571)
-    }
-
-    @Test
-    fun overviewTaskScale() {
-        assertThat(dp.overviewTaskWorkspaceScale).isEqualTo(0.5597015f)
-    }
-
-    @Test
-    fun overviewModalTaskScale() {
-        assertThat(dp.overviewModalTaskScale).isEqualTo(1.1f)
-    }
 }
\ No newline at end of file
diff --git a/quickstep/tests/src/com/android/quickstep/TaplTestsQuickstep.java b/quickstep/tests/src/com/android/quickstep/TaplTestsQuickstep.java
index 81df3c0..4bd627a 100644
--- a/quickstep/tests/src/com/android/quickstep/TaplTestsQuickstep.java
+++ b/quickstep/tests/src/com/android/quickstep/TaplTestsQuickstep.java
@@ -212,6 +212,7 @@
     @Test
     @NavigationModeSwitch
     @PortraitLandscape
+    @ScreenRecord // b/238461765
     public void testSwitchToOverview() throws Exception {
         assertNotNull("Workspace.switchToOverview() returned null",
                 mLauncher.goHome().switchToOverview());
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index e5b588c..3b71585 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -176,6 +176,10 @@
         <!-- defaults to numColumns, if not specified -->
         <attr name="hotseatColumnSpanTwoPanelPortrait" format="integer" />
 
+        <!-- Spacing to have at the end of the nav buttons in large screen 3 button nav,
+             defaults to @dimen/taskbar_button_margin_default -->
+        <attr name="inlineNavButtonsEndSpacing" format="reference" />
+
         <attr name="dbFile" format="string" />
         <attr name="defaultLayoutId" format="reference" />
         <attr name="defaultSplitDisplayLayoutId" format="reference" />
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index dc80bc3..b19e739 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -363,6 +363,12 @@
     <dimen name="taskbar_nav_buttons_size">0dp</dimen>
     <dimen name="taskbar_contextual_button_margin">0dp</dimen>
     <dimen name="taskbar_hotseat_nav_spacing">0dp</dimen>
+    <dimen name="taskbar_button_margin_default">0dp</dimen>
+    <dimen name="taskbar_button_space_inbetween">0dp</dimen>
+    <dimen name="taskbar_button_margin_5_5">0dp</dimen>
+    <dimen name="taskbar_button_margin_6_5">0dp</dimen>
+    <dimen name="taskbar_button_margin_4_5">0dp</dimen>
+    <dimen name="taskbar_button_margin_4_4">0dp</dimen>
 
     <!-- Size of the maximum radius for the enforced rounded rectangles. -->
     <dimen name="enforced_rounded_corner_max_radius">16dp</dimen>
@@ -383,9 +389,6 @@
     <dimen name="overview_grid_side_margin">0dp</dimen>
     <dimen name="overview_grid_row_spacing">0dp</dimen>
     <dimen name="overview_page_spacing">0dp</dimen>
-    <dimen name="overview_minimum_next_prev_size">0dp</dimen>
-    <item name="overview_max_scale" format="float" type="dimen">0.0</item>
-    <item name="overview_modal_max_scale" format="float" type="dimen">0.0</item>
     <dimen name="split_placeholder_size">72dp</dimen>
     <dimen name="split_placeholder_inset">16dp</dimen>
     <dimen name="split_placeholder_icon_size">44dp</dimen>
diff --git a/res/xml/device_profiles.xml b/res/xml/device_profiles.xml
index 5ee291b..0238e7d 100644
--- a/res/xml/device_profiles.xml
+++ b/res/xml/device_profiles.xml
@@ -26,7 +26,7 @@
         launcher:numHotseatIcons="3"
         launcher:dbFile="launcher_3_by_3.db"
         launcher:defaultLayoutId="@xml/default_workspace_3x3"
-        launcher:deviceCategory="phone|multi_display" >
+        launcher:deviceCategory="phone" >
 
         <display-option
             launcher:name="Super Short Stubby"
@@ -58,6 +58,7 @@
         launcher:numFolderColumns="4"
         launcher:numHotseatIcons="4"
         launcher:dbFile="launcher_4_by_4.db"
+        launcher:inlineNavButtonsEndSpacing="@dimen/taskbar_button_margin_4_4"
         launcher:defaultLayoutId="@xml/default_workspace_4x4"
         launcher:deviceCategory="phone|multi_display" >
 
@@ -121,6 +122,7 @@
         launcher:numFolderColumns="4"
         launcher:numHotseatIcons="5"
         launcher:dbFile="launcher.db"
+        launcher:inlineNavButtonsEndSpacing="@dimen/taskbar_button_margin_5_5"
         launcher:defaultLayoutId="@xml/default_workspace_5x5"
         launcher:deviceCategory="phone|multi_display" >
 
@@ -167,6 +169,7 @@
         launcher:hotseatColumnSpanLandscape="4"
         launcher:numAllAppsColumns="6"
         launcher:isScalable="true"
+        launcher:inlineNavButtonsEndSpacing="@dimen/taskbar_button_margin_6_5"
         launcher:devicePaddingId="@xml/paddings_6x5"
         launcher:dbFile="launcher_6_by_5.db"
         launcher:defaultLayoutId="@xml/default_workspace_6x5"
diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java
index d09642a..3a2227a 100644
--- a/src/com/android/launcher3/DeviceProfile.java
+++ b/src/com/android/launcher3/DeviceProfile.java
@@ -34,7 +34,6 @@
 import android.graphics.PointF;
 import android.graphics.Rect;
 import android.util.DisplayMetrics;
-import android.view.Gravity;
 import android.view.Surface;
 
 import com.android.launcher3.CellLayout.ContainerType;
@@ -42,7 +41,6 @@
 import com.android.launcher3.icons.DotRenderer;
 import com.android.launcher3.icons.GraphicsUtils;
 import com.android.launcher3.icons.IconNormalizer;
-import com.android.launcher3.touch.PortraitPagedViewHandler;
 import com.android.launcher3.uioverrides.ApiWrapper;
 import com.android.launcher3.util.DisplayController;
 import com.android.launcher3.util.DisplayController.Info;
@@ -204,12 +202,6 @@
     public int overviewPageSpacing;
     public int overviewRowSpacing;
     public int overviewGridSideMargin;
-    public final Rect overviewGridRect = new Rect();
-    public final Rect overviewTaskRect = new Rect();
-    public final float overviewTaskWorkspaceScale;
-    public final Point overviewGridTaskDimension = new Point();
-    public final Rect overviewModalTaskRect = new Rect();
-    public final float overviewModalTaskScale;
 
     // Widgets
     public final PointF appWidgetScale = new PointF(1.0f, 1.0f);
@@ -236,9 +228,6 @@
     public DotRenderer mDotRendererWorkSpace;
     public DotRenderer mDotRendererAllApps;
 
-    // Tasks
-    public final PointF taskDimension = new PointF();
-
     // Taskbar
     public boolean isTaskbarPresent;
     // Whether Taskbar will inset the bottom of apps by taskbarSize.
@@ -424,11 +413,13 @@
         if (areNavButtonsInline) {
             /*
              * 3 nav buttons +
+             * Spacing between nav buttons +
              * Little space at the end for contextual buttons +
              * Little space between icons and nav buttons
              */
             hotseatBarEndOffset = 3 * res.getDimensionPixelSize(R.dimen.taskbar_nav_buttons_size)
-                    + res.getDimensionPixelSize(R.dimen.taskbar_contextual_button_margin)
+                    + 2 * res.getDimensionPixelSize(R.dimen.taskbar_button_space_inbetween)
+                    + res.getDimensionPixelSize(inv.inlineNavButtonsEndSpacing)
                     + res.getDimensionPixelSize(R.dimen.taskbar_hotseat_nav_spacing);
         } else {
             hotseatBarEndOffset = 0;
@@ -492,104 +483,6 @@
         mDotRendererWorkSpace = new DotRenderer(iconSizePx, dotPath, DEFAULT_DOT_SIZE);
         mDotRendererAllApps = iconSizePx == allAppsIconSizePx ? mDotRendererWorkSpace :
                 new DotRenderer(allAppsIconSizePx, dotPath, DEFAULT_DOT_SIZE);
-
-        // Grid and Task size calculations
-        calculateGridSize();
-        getTaskDimension();
-        calculateTaskSize(res);
-        calculateGridTaskSize();
-        calculateModalTaskSize(res);
-        overviewModalTaskScale =
-                Math.min(overviewModalTaskRect.height() / (float) overviewTaskRect.height(),
-                        overviewModalTaskRect.width() / (float) overviewTaskRect.width());
-        overviewTaskWorkspaceScale = (float) overviewTaskRect.height() / getCellLayoutHeight();
-    }
-
-    private void calculateGridSize() {
-        int topMargin = overviewTaskThumbnailTopMarginPx;
-        int bottomMargin = getOverviewActionsClaimedSpace();
-        int sideMargin = overviewGridSideMargin;
-
-        overviewGridRect.set(0, 0, widthPx, heightPx);
-        overviewGridRect.inset(Math.max(mInsets.left, sideMargin), mInsets.top + topMargin,
-                Math.max(mInsets.right, sideMargin), Math.max(mInsets.bottom, bottomMargin));
-    }
-
-    private void calculateTaskSize(Resources res) {
-        int overviewMinNextPrevSize =
-                res.getDimensionPixelSize(R.dimen.overview_minimum_next_prev_size);
-        float overviewMaxScale = res.getFloat(R.dimen.overview_max_scale);
-        Rect containerRect = new Rect();
-        if (isTablet) {
-            containerRect.set(overviewGridRect);
-        } else {
-            int taskMargin = overviewTaskMarginPx;
-            containerRect.set(0, 0, widthPx, heightPx);
-            containerRect.inset(mInsets.left, mInsets.top, mInsets.right, mInsets.bottom);
-            int minimumHorizontalPadding = overviewMinNextPrevSize + taskMargin;
-            containerRect.inset(minimumHorizontalPadding, overviewTaskThumbnailTopMarginPx,
-                    minimumHorizontalPadding, getOverviewActionsClaimedSpace());
-        }
-        float scale = Math.min(
-                containerRect.width() / taskDimension.x,
-                containerRect.height() / taskDimension.y);
-        scale = Math.min(scale, overviewMaxScale);
-        int outWidth = Math.round(scale * taskDimension.x);
-        int outHeight = Math.round(scale * taskDimension.y);
-        Gravity.apply(Gravity.CENTER, outWidth, outHeight, containerRect, overviewTaskRect);
-    }
-
-    private void calculateGridTaskSize() {
-        float rowHeight =
-                (overviewTaskRect.height() + overviewTaskThumbnailTopMarginPx - overviewRowSpacing)
-                        / 2f;
-
-        float scale = (rowHeight - overviewTaskThumbnailTopMarginPx) / taskDimension.y;
-        overviewGridTaskDimension.set(
-                Math.round(scale * taskDimension.x), Math.round(scale * taskDimension.y));
-    }
-
-    /**
-     * Returns a Rect the size of a grid task with the correct positioning within the screen.
-     *
-     * @param isRecentsRtl is true when device is in LTR, false when in RTL, as grid tasks are only
-     *                     supported on tablets, which use PortraitPagedViewHandler.
-     */
-    public Rect getOverviewGridTaskRect(boolean isRecentsRtl) {
-        Rect outRect = new Rect();
-        int gravity = Gravity.TOP;
-        gravity |= isRecentsRtl ? Gravity.RIGHT : Gravity.LEFT;
-        Gravity.apply(gravity, overviewGridTaskDimension.x, overviewGridTaskDimension.y,
-                overviewTaskRect, outRect);
-        return outRect;
-    }
-
-    private void calculateModalTaskSize(Resources res) {
-        float overviewModalMaxScale = res.getFloat(R.dimen.overview_modal_max_scale);
-        Rect potentialTaskRect = new Rect(0, 0, widthPx, heightPx);
-        potentialTaskRect.inset(mInsets.left, mInsets.top, mInsets.right, mInsets.bottom);
-        int minimumHorizontalPadding = Math.round(
-                (availableWidthPx - overviewTaskRect.width() * overviewModalMaxScale) / 2);
-        potentialTaskRect.inset(
-                minimumHorizontalPadding,
-                overviewTaskMarginPx,
-                minimumHorizontalPadding,
-                heightPx - overviewTaskRect.bottom - mInsets.bottom);
-        float scale = Math.min(
-                potentialTaskRect.width() / taskDimension.x,
-                potentialTaskRect.height() / taskDimension.y);
-        int outWidth = Math.round(scale * taskDimension.x);
-        int outHeight = Math.round(scale * taskDimension.y);
-        Gravity.apply(Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM, outWidth, outHeight,
-                potentialTaskRect, overviewModalTaskRect);
-    }
-
-    private void getTaskDimension() {
-        float taskHeight = heightPx;
-        if (isTablet) {
-            taskHeight -= taskbarSize;
-        }
-        taskDimension.set(widthPx, taskHeight);
     }
 
     /**
@@ -1354,8 +1247,7 @@
     }
 
     // LINT.IfChange
-    /** Dumps various DeviceProfile variables to the specified writer. */
-    public void dump(Context context, String prefix, PrintWriter writer) {
+    public void dump(String prefix, PrintWriter writer) {
         writer.println(prefix + "DeviceProfile:");
         writer.println(prefix + "\t1 dp = " + mMetrics.density + " px");
 
@@ -1401,12 +1293,9 @@
                 cellLayoutBorderSpacePx.x));
         writer.println(prefix + pxToDpStr("cellLayoutBorderSpacePx Vertical",
                 cellLayoutBorderSpacePx.y));
-        writer.println(
-                prefix + pxToDpStr("cellLayoutPaddingPx.left", cellLayoutPaddingPx.left));
-        writer.println(
-                prefix + pxToDpStr("cellLayoutPaddingPx.top", cellLayoutPaddingPx.top));
-        writer.println(
-                prefix + pxToDpStr("cellLayoutPaddingPx.right", cellLayoutPaddingPx.right));
+        writer.println(prefix + pxToDpStr("cellLayoutPaddingPx.left", cellLayoutPaddingPx.left));
+        writer.println(prefix + pxToDpStr("cellLayoutPaddingPx.top", cellLayoutPaddingPx.top));
+        writer.println(prefix + pxToDpStr("cellLayoutPaddingPx.right", cellLayoutPaddingPx.right));
         writer.println(
                 prefix + pxToDpStr("cellLayoutPaddingPx.bottom", cellLayoutPaddingPx.bottom));
 
@@ -1440,15 +1329,13 @@
         writer.println(prefix + pxToDpStr("allAppsBorderSpacePxX", allAppsBorderSpacePx.x));
         writer.println(prefix + pxToDpStr("allAppsBorderSpacePxY", allAppsBorderSpacePx.y));
         writer.println(prefix + "\tnumShownAllAppsColumns: " + numShownAllAppsColumns);
-        writer.println(
-                prefix + pxToDpStr("allAppsLeftRightPadding", allAppsLeftRightPadding));
+        writer.println(prefix + pxToDpStr("allAppsLeftRightPadding", allAppsLeftRightPadding));
         writer.println(prefix + pxToDpStr("allAppsLeftRightMargin", allAppsLeftRightMargin));
 
         writer.println(prefix + pxToDpStr("hotseatBarSizePx", hotseatBarSizePx));
         writer.println(prefix + "\tinv.hotseatColumnSpan: " + inv.hotseatColumnSpan[mTypeIndex]);
         writer.println(prefix + pxToDpStr("hotseatCellHeightPx", hotseatCellHeightPx));
-        writer.println(
-                prefix + pxToDpStr("hotseatBarBottomSpacePx", hotseatBarBottomSpacePx));
+        writer.println(prefix + pxToDpStr("hotseatBarBottomSpacePx", hotseatBarBottomSpacePx));
         writer.println(prefix + pxToDpStr("hotseatBarSidePaddingStartPx",
                 hotseatBarSidePaddingStartPx));
         writer.println(prefix + pxToDpStr("hotseatBarSidePaddingEndPx",
@@ -1459,12 +1346,9 @@
         writer.println(prefix + pxToDpStr("springLoadedHotseatBarTopMarginPx",
                 springLoadedHotseatBarTopMarginPx));
         writer.println(prefix + pxToDpStr("mHotseatBarPadding.top", mHotseatBarPadding.top));
-        writer.println(
-                prefix + pxToDpStr("mHotseatBarPadding.bottom", mHotseatBarPadding.bottom));
-        writer.println(
-                prefix + pxToDpStr("mHotseatBarPadding.left", mHotseatBarPadding.left));
-        writer.println(
-                prefix + pxToDpStr("mHotseatBarPadding.right", mHotseatBarPadding.right));
+        writer.println(prefix + pxToDpStr("mHotseatBarPadding.bottom", mHotseatBarPadding.bottom));
+        writer.println(prefix + pxToDpStr("mHotseatBarPadding.left", mHotseatBarPadding.left));
+        writer.println(prefix + pxToDpStr("mHotseatBarPadding.right", mHotseatBarPadding.right));
         writer.println(prefix + "\tnumShownHotseatIcons: " + numShownHotseatIcons);
         writer.println(prefix + pxToDpStr("hotseatBorderSpace", hotseatBorderSpace));
         writer.println(prefix + "\tisQsbInline: " + isQsbInline);
@@ -1479,14 +1363,12 @@
         writer.println(prefix + pxToDpStr("workspacePadding.left", workspacePadding.left));
         writer.println(prefix + pxToDpStr("workspacePadding.top", workspacePadding.top));
         writer.println(prefix + pxToDpStr("workspacePadding.right", workspacePadding.right));
-        writer.println(
-                prefix + pxToDpStr("workspacePadding.bottom", workspacePadding.bottom));
+        writer.println(prefix + pxToDpStr("workspacePadding.bottom", workspacePadding.bottom));
 
         writer.println(prefix + pxToDpStr("iconScale", iconScale));
         writer.println(prefix + pxToDpStr("cellScaleToFit ", cellScaleToFit));
         writer.println(prefix + pxToDpStr("extraSpace", extraSpace));
-        writer.println(
-                prefix + pxToDpStr("unscaled extraSpace", extraSpace / iconScale));
+        writer.println(prefix + pxToDpStr("unscaled extraSpace", extraSpace / iconScale));
 
         if (inv.devicePaddings != null) {
             int unscaledExtraSpace = (int) (extraSpace / iconScale);
@@ -1497,8 +1379,7 @@
         writer.println(prefix + pxToDpStr("workspaceBottomPadding", workspaceBottomPadding));
 
         writer.println(prefix + pxToDpStr("overviewTaskMarginPx", overviewTaskMarginPx));
-        writer.println(
-                prefix + pxToDpStr("overviewTaskMarginGridPx", overviewTaskMarginGridPx));
+        writer.println(prefix + pxToDpStr("overviewTaskMarginGridPx", overviewTaskMarginGridPx));
         writer.println(prefix + pxToDpStr("overviewTaskIconSizePx", overviewTaskIconSizePx));
         writer.println(prefix + pxToDpStr("overviewTaskIconDrawableSizePx",
                 overviewTaskIconDrawableSizePx));
@@ -1516,64 +1397,21 @@
         writer.println(prefix + pxToDpStr("overviewRowSpacing", overviewRowSpacing));
         writer.println(prefix + pxToDpStr("overviewGridSideMargin", overviewGridSideMargin));
 
-        writer.println(
-                prefix + pxToDpStr("dropTargetBarTopMarginPx", dropTargetBarTopMarginPx));
+        writer.println(prefix + pxToDpStr("dropTargetBarTopMarginPx", dropTargetBarTopMarginPx));
         writer.println(prefix + pxToDpStr("dropTargetBarSizePx", dropTargetBarSizePx));
-        writer.println(prefix
-                + pxToDpStr("dropTargetBarBottomMarginPx", dropTargetBarBottomMarginPx));
+        writer.println(
+                prefix + pxToDpStr("dropTargetBarBottomMarginPx", dropTargetBarBottomMarginPx));
 
-        writer.println(prefix
-                + pxToDpStr("workspaceSpringLoadShrunkTop", mWorkspaceSpringLoadShrunkTop));
+        writer.println(
+                prefix + pxToDpStr("workspaceSpringLoadShrunkTop", mWorkspaceSpringLoadShrunkTop));
         writer.println(prefix + pxToDpStr("workspaceSpringLoadShrunkBottom",
                 mWorkspaceSpringLoadShrunkBottom));
         writer.println(prefix + pxToDpStr("workspaceSpringLoadedMinNextPageVisiblePx",
                 workspaceSpringLoadedMinNextPageVisiblePx));
-        writer.println(prefix
-                + pxToDpStr("getWorkspaceSpringLoadScale()", getWorkspaceSpringLoadScale()));
+        writer.println(
+                prefix + pxToDpStr("getWorkspaceSpringLoadScale()", getWorkspaceSpringLoadScale()));
         writer.println(prefix + pxToDpStr("getCellLayoutHeight()", getCellLayoutHeight()));
         writer.println(prefix + pxToDpStr("getCellLayoutWidth()", getCellLayoutWidth()));
-
-        writer.println(prefix + pxToDpStr("overviewGridRect.left", overviewGridRect.left));
-        writer.println(prefix + pxToDpStr("overviewGridRect.top", overviewGridRect.top));
-        writer.println(prefix + pxToDpStr("overviewGridRect.right", overviewGridRect.right));
-        writer.println(prefix
-                + pxToDpStr("overviewGridRect.bottom", overviewGridRect.bottom));
-        writer.println(prefix + pxToDpStr("taskDimension.x", taskDimension.x));
-        writer.println(prefix + pxToDpStr("taskDimension.y", taskDimension.y));
-        writer.println(prefix + pxToDpStr("overviewTaskRect.left", overviewTaskRect.left));
-        writer.println(prefix + pxToDpStr("overviewTaskRect.top", overviewTaskRect.top));
-        writer.println(prefix + pxToDpStr("overviewTaskRect.right", overviewTaskRect.right));
-        writer.println(prefix
-                + pxToDpStr("overviewTaskRect.bottom", overviewTaskRect.bottom));
-        writer.println(prefix
-                + pxToDpStr("overviewGridTaskDimension.x", overviewGridTaskDimension.x));
-        writer.println(prefix
-                + pxToDpStr("overviewGridTaskDimension.y", overviewGridTaskDimension.y));
-        writer.println(prefix
-                + pxToDpStr("overviewModalTaskRect.left", overviewModalTaskRect.left));
-        writer.println(prefix
-                + pxToDpStr("overviewModalTaskRect.top", overviewModalTaskRect.top));
-        writer.println(prefix
-                + pxToDpStr("overviewModalTaskRect.right", overviewModalTaskRect.right));
-        writer.println(prefix
-                + pxToDpStr("overviewModalTaskRect.bottom", overviewModalTaskRect.bottom));
-        boolean isRecentsRtl =
-                PortraitPagedViewHandler.PORTRAIT.getRecentsRtlSetting(context.getResources());
-        writer.println(prefix
-                + pxToDpStr("getOverviewGridTaskRect(" + isRecentsRtl + ").left",
-                getOverviewGridTaskRect(isRecentsRtl).left));
-        writer.println(prefix
-                + pxToDpStr("getOverviewGridTaskRect(" + isRecentsRtl + ").top",
-                getOverviewGridTaskRect(isRecentsRtl).top));
-        writer.println(prefix
-                + pxToDpStr("getOverviewGridTaskRect(" + isRecentsRtl + ").right",
-                getOverviewGridTaskRect(isRecentsRtl).right));
-        writer.println(prefix
-                + pxToDpStr("getOverviewGridTaskRect(" + isRecentsRtl + ").bottom",
-                getOverviewGridTaskRect(isRecentsRtl).bottom));
-        writer.println(
-                prefix + pxToDpStr("overviewTaskWorkspaceScale", overviewTaskWorkspaceScale));
-        writer.println(prefix + pxToDpStr("overviewModalTaskScale", overviewModalTaskScale));
     }
     // LINT.ThenChange(
     //     packages/apps/Launcher3/quickstep/tests/src/com/android/quickstep/DeviceProfilePhoneTest.kt,
diff --git a/src/com/android/launcher3/InvariantDeviceProfile.java b/src/com/android/launcher3/InvariantDeviceProfile.java
index 2085b84..c051292 100644
--- a/src/com/android/launcher3/InvariantDeviceProfile.java
+++ b/src/com/android/launcher3/InvariantDeviceProfile.java
@@ -127,6 +127,7 @@
     public PointF[] borderSpaces;
     public float folderBorderSpace;
     public float[] hotseatBorderSpaces;
+    public int inlineNavButtonsEndSpacing;
 
     public float[] horizontalMargin;
 
@@ -339,6 +340,8 @@
         devicePaddingId = closestProfile.devicePaddingId;
         this.deviceType = deviceType;
 
+        inlineNavButtonsEndSpacing = closestProfile.inlineNavButtonsEndSpacing;
+
         mExtraAttrs = closestProfile.extraAttrs;
 
         iconSize = displayOption.iconSizes;
@@ -735,6 +738,7 @@
 
         private final int[] hotseatColumnSpan = new int[COUNT_SIZES];
 
+        private int inlineNavButtonsEndSpacing;
         private final String dbFile;
 
         private final int defaultLayoutId;
@@ -785,6 +789,9 @@
                     R.styleable.GridDisplayOption_hotseatColumnSpanTwoPanelPortrait,
                     numColumns);
 
+            inlineNavButtonsEndSpacing =
+                    a.getResourceId(R.styleable.GridDisplayOption_inlineNavButtonsEndSpacing,
+                    R.dimen.taskbar_button_margin_default);
             numFolderRows = a.getInt(
                     R.styleable.GridDisplayOption_numFolderRows, numRows);
             numFolderColumns = a.getInt(
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index 528613c..9c62251 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -3024,7 +3024,7 @@
         mDragLayer.dump(prefix, writer);
         mStateManager.dump(prefix, writer);
         mPopupDataProvider.dump(prefix, writer);
-        mDeviceProfile.dump(this, prefix, writer);
+        mDeviceProfile.dump(prefix, writer);
 
         try {
             FileLog.flushAll(writer);
diff --git a/src/com/android/launcher3/LauncherState.java b/src/com/android/launcher3/LauncherState.java
index ea6a919..8b5cdbd 100644
--- a/src/com/android/launcher3/LauncherState.java
+++ b/src/com/android/launcher3/LauncherState.java
@@ -208,14 +208,18 @@
         return (getVisibleElements(launcher) & elements) == elements;
     }
 
-    /** Returns whether taskbar is stashed and thus should replace hotseat with a handle */
+    /**
+     * Returns whether taskbar is stashed and thus should either:
+     * 1) replace hotseat or taskbar icons with a handle in gesture navigation mode or
+     * 2) fade out the hotseat or taskbar icons in 3-button navigation mode.
+     */
     public boolean isTaskbarStashed(Launcher launcher) {
         return false;
     }
 
     /** Returns whether taskbar is aligned with the hotseat vs position inside apps */
     public boolean isTaskbarAlignedWithHotseat(Launcher launcher) {
-        return !isTaskbarStashed(launcher);
+        return true;
     }
 
     /**
diff --git a/src/com/android/launcher3/model/LoaderCursor.java b/src/com/android/launcher3/model/LoaderCursor.java
index ae5b66a..87e8ebf 100644
--- a/src/com/android/launcher3/model/LoaderCursor.java
+++ b/src/com/android/launcher3/model/LoaderCursor.java
@@ -291,12 +291,16 @@
 
         // from the db
         if (TextUtils.isEmpty(info.title)) {
-            info.title = getTitle();
-        }
+            if (loadIcon) {
+                info.title = getTitle();
 
-        // fall back to the class name of the activity
-        if (info.title == null) {
-            info.title = componentName.getClassName();
+                // fall back to the class name of the activity
+                if (info.title == null) {
+                    info.title = componentName.getClassName();
+                }
+            } else {
+                info.title = "";
+            }
         }
 
         info.contentDescription = mPM.getUserBadgedLabel(info.title, info.user);
diff --git a/src/com/android/launcher3/util/MultiValueAlpha.java b/src/com/android/launcher3/util/MultiValueAlpha.java
index 11cd07c..4b46a0a 100644
--- a/src/com/android/launcher3/util/MultiValueAlpha.java
+++ b/src/com/android/launcher3/util/MultiValueAlpha.java
@@ -23,6 +23,7 @@
 
 import com.android.launcher3.anim.AlphaUpdateListener;
 
+import java.io.PrintWriter;
 import java.util.Arrays;
 import java.util.function.Consumer;
 
@@ -78,6 +79,29 @@
         mUpdateVisibility = updateVisibility;
     }
 
+    /**
+     * Dumps the alpha channel values to the given PrintWriter
+     *
+     * @param prefix String to be used before every line
+     * @param pw PrintWriter where the logs should be dumped
+     * @param label String used to help identify this object
+     * @param alphaIndexLabels Strings that represent each alpha channel, these should be entered
+     *                         in the order of the indexes they represent, starting from 0.
+     */
+    public void dump(String prefix, PrintWriter pw, String label, String... alphaIndexLabels) {
+        pw.println(prefix + label);
+
+        String innerPrefix = prefix + '\t';
+        for (int i = 0; i < alphaIndexLabels.length; i++) {
+            if (i >= mMyProperties.length) {
+                pw.println(innerPrefix + alphaIndexLabels[i] + " given for alpha index " + i
+                        + " however there are only " + mMyProperties.length + " alpha channels.");
+                continue;
+            }
+            pw.println(innerPrefix + alphaIndexLabels[i] + "=" + getProperty(i).getValue());
+        }
+    }
+
     public class AlphaProperty {
 
         private final int mMyMask;
diff --git a/src_ui_overrides/com/android/launcher3/uioverrides/ApiWrapper.java b/src_ui_overrides/com/android/launcher3/uioverrides/ApiWrapper.java
index 6715749..c8b5e2f 100644
--- a/src_ui_overrides/com/android/launcher3/uioverrides/ApiWrapper.java
+++ b/src_ui_overrides/com/android/launcher3/uioverrides/ApiWrapper.java
@@ -17,7 +17,6 @@
 package com.android.launcher3.uioverrides;
 
 import android.app.Person;
-import android.content.Context;
 import android.content.pm.ShortcutInfo;
 
 import com.android.launcher3.Utilities;
@@ -29,11 +28,4 @@
     public static Person[] getPersons(ShortcutInfo si) {
         return Utilities.EMPTY_PERSON_ARRAY;
     }
-
-    /**
-     * Returns the minimum space that should be left empty at the end of hotseat
-     */
-    public static int getHotseatEndOffset(Context context) {
-        return 0;
-    }
 }
diff --git a/tests/src/com/android/launcher3/DeviceProfileBaseTest.kt b/tests/src/com/android/launcher3/DeviceProfileBaseTest.kt
index ba813c0..7465db5 100644
--- a/tests/src/com/android/launcher3/DeviceProfileBaseTest.kt
+++ b/tests/src/com/android/launcher3/DeviceProfileBaseTest.kt
@@ -37,7 +37,6 @@
     protected var transposeLayoutWithOrientation: Boolean = false
     protected var useTwoPanels: Boolean = false
     protected var isGestureMode: Boolean = true
-    protected var isRecentsRtl: Boolean = true
 
     @Before
     fun setUp() {
@@ -136,6 +135,7 @@
             hotseatBorderSpaces = FloatArray(4) { 16f }
             hotseatColumnSpan = IntArray(4) { 4 }
             hotseatBarBottomSpace = FloatArray(4) { 48f }
+            inlineNavButtonsEndSpacing = R.dimen.taskbar_button_margin_4_4
             hotseatQsbSpace = FloatArray(4) { 36f }
             iconSize = FloatArray(4) { 56f }
             allAppsIconSize = FloatArray(4) { 56f }
@@ -164,7 +164,7 @@
     fun dump(dp: DeviceProfile): StringWriter {
         val stringWriter = StringWriter()
         val printWriter = PrintWriter(stringWriter)
-        dp.dump(context, "", printWriter)
+        dp.dump("", printWriter)
         printWriter.flush()
         return stringWriter
     }