Merge "Fix no action menu for split pairs in overview panel" into tm-qpr-dev
diff --git a/Android.bp b/Android.bp
index 4adbf53..330c32e 100644
--- a/Android.bp
+++ b/Android.bp
@@ -35,9 +35,7 @@
     ],
     srcs: [
         "tests/tapl/**/*.java",
-        "src/com/android/launcher3/ResourceUtils.java",
-        "src/com/android/launcher3/testing/TestProtocol.java",
-        "src/com/android/launcher3/testing/*Request.java",
+        "src/com/android/launcher3/testing/shared/**/*.java",
     ],
     resource_dirs: [ ],
     manifest: "tests/tapl/AndroidManifest.xml",
diff --git a/ext_tests/src/com/android/launcher3/testing/DebugTestInformationHandler.java b/ext_tests/src/com/android/launcher3/testing/DebugTestInformationHandler.java
index d16e12c..a91ff44 100644
--- a/ext_tests/src/com/android/launcher3/testing/DebugTestInformationHandler.java
+++ b/ext_tests/src/com/android/launcher3/testing/DebugTestInformationHandler.java
@@ -33,6 +33,7 @@
 import com.android.launcher3.LauncherAppState;
 import com.android.launcher3.LauncherSettings;
 import com.android.launcher3.ShortcutAndWidgetContainer;
+import com.android.launcher3.testing.shared.TestProtocol;
 
 import java.util.ArrayList;
 import java.util.Collection;
diff --git a/go/quickstep/res/values-or/strings.xml b/go/quickstep/res/values-or/strings.xml
index 36de437..6a3c5dc 100644
--- a/go/quickstep/res/values-or/strings.xml
+++ b/go/quickstep/res/values-or/strings.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_share_drop_target_label" msgid="5804774105974539508">"ଆପ୍ ସେୟାର୍ କରନ୍ତୁ"</string>
+    <string name="app_share_drop_target_label" msgid="5804774105974539508">"ଆପ ସେୟାର କରନ୍ତୁ"</string>
     <string name="action_listen" msgid="2370304050784689486">"ଶୁଣନ୍ତୁ"</string>
     <string name="action_translate" msgid="8028378961867277746">"ଅନୁବାଦ କରନ୍ତୁ"</string>
     <string name="action_search" msgid="6269564710943755464">"Lens"</string>
diff --git a/proguard.flags b/proguard.flags
index a450183..53a68de 100644
--- a/proguard.flags
+++ b/proguard.flags
@@ -2,10 +2,6 @@
   *;
 }
 
--keep class com.android.launcher3.graphics.ShadowDrawable {
-  public <init>(...);
-}
-
 # The support library contains references to newer platform versions.
 # Don't warn about those in case this app is linking against an older
 # platform version.  We know about them, and they are safe.
diff --git a/quickstep/ext_tests/src/com/android/quickstep/DebugQuickstepTestInformationHandler.java b/quickstep/ext_tests/src/com/android/quickstep/DebugQuickstepTestInformationHandler.java
index e5f0295..84b907f 100644
--- a/quickstep/ext_tests/src/com/android/quickstep/DebugQuickstepTestInformationHandler.java
+++ b/quickstep/ext_tests/src/com/android/quickstep/DebugQuickstepTestInformationHandler.java
@@ -28,7 +28,7 @@
 import com.android.launcher3.R;
 import com.android.launcher3.taskbar.LauncherTaskbarUIController;
 import com.android.launcher3.testing.DebugTestInformationHandler;
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 
 import java.util.concurrent.ExecutionException;
 
diff --git a/quickstep/res/values-land/dimens.xml b/quickstep/res/values-land/dimens.xml
index 8368069..905fbda 100644
--- a/quickstep/res/values-land/dimens.xml
+++ b/quickstep/res/values-land/dimens.xml
@@ -77,7 +77,7 @@
 
     <!--  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_6_5">219.6dp</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-sw600dp/dimens.xml b/quickstep/res/values-sw600dp/dimens.xml
index 7494683..cfbbf8d 100644
--- a/quickstep/res/values-sw600dp/dimens.xml
+++ b/quickstep/res/values-sw600dp/dimens.xml
@@ -14,16 +14,23 @@
  * limitations under the License.
 */
 -->
+<!-- Applies to small tablet screens -->
 <resources>
     <dimen name="navigation_key_padding">25dp</dimen>
 
-    <!--  Task View  -->
+    <!--  Overview Task Views  -->
+    <!--  A touch target for icons, sometimes slightly larger than the icons themselves  -->
     <dimen name="task_thumbnail_icon_size">48dp</dimen>
+    <!--  The icon size for the focused task, placed in center of touch target  -->
     <dimen name="task_thumbnail_icon_drawable_size">44dp</dimen>
+    <!--  The space under the focused task icon  -->
     <dimen name="overview_task_margin">12dp</dimen>
+    <!--  The icon size of all non-focused task icons, placed in center of touch target  -->
     <dimen name="task_thumbnail_icon_drawable_size_grid">44dp</dimen>
-    <dimen name="overview_task_margin_grid">12dp</dimen>
+    <!--  The space between grid rows (when there's 2 rows of thumbnails)  -->
     <dimen name="overview_grid_row_spacing">28dp</dimen>
+    <!--  The horizontal space between tasks  -->
     <dimen name="overview_page_spacing">36dp</dimen>
+    <!--  The space to the left and to the right of the "Clear all" button  -->
     <dimen name="overview_grid_side_margin">64dp</dimen>
 </resources>
diff --git a/quickstep/res/values-sw720dp/dimens.xml b/quickstep/res/values-sw720dp/dimens.xml
index ceaa8f8..284ce11 100644
--- a/quickstep/res/values-sw720dp/dimens.xml
+++ b/quickstep/res/values-sw720dp/dimens.xml
@@ -14,14 +14,23 @@
  * limitations under the License.
 */
 -->
+<!-- Applies to large tablet screens -->
 <resources>
-    <!--  Task View  -->
+    <!--  Overview Task Views  -->
+    <!--  The primary task thumbnail uses up to this much of the total screen height/width  -->
+    <item name="overview_max_scale" format="float" type="dimen">0.7</item>
+    <!--  A touch target for icons, sometimes slightly larger than the icons themselves  -->
     <dimen name="task_thumbnail_icon_size">48dp</dimen>
+    <!--  The icon size for the focused task, placed in center of touch target  -->
     <dimen name="task_thumbnail_icon_drawable_size">44dp</dimen>
+    <!--  The space under the focused task icon  -->
     <dimen name="overview_task_margin">16dp</dimen>
+    <!--  The icon size of all non-focused task icons, placed in center of touch target  -->
     <dimen name="task_thumbnail_icon_drawable_size_grid">44dp</dimen>
-    <dimen name="overview_task_margin_grid">16dp</dimen>
+    <!--  The space between grid rows (when there's 2 rows of thumbnails)  -->
     <dimen name="overview_grid_row_spacing">36dp</dimen>
+    <!--  The horizontal space between tasks  -->
     <dimen name="overview_page_spacing">44dp</dimen>
+    <!--  The space to the left and to the right of the "Clear all" button  -->
     <dimen name="overview_grid_side_margin">64dp</dimen>
 </resources>
diff --git a/quickstep/res/values/dimens.xml b/quickstep/res/values/dimens.xml
index 0232f86..6bc3d38 100644
--- a/quickstep/res/values/dimens.xml
+++ b/quickstep/res/values/dimens.xml
@@ -31,14 +31,19 @@
 
     <dimen name="overview_minimum_next_prev_size">50dp</dimen>
 
-    <!--  Task View  -->
-    <dimen name="task_thumbnail_icon_size">48dp</dimen>
-    <dimen name="task_thumbnail_icon_drawable_size">44dp</dimen>
-    <dimen name="overview_task_margin">16dp</dimen>
-    <dimen name="overview_page_spacing">16dp</dimen>
-    <dimen name="task_icon_cache_default_icon_size">72dp</dimen>
-
+    <!--  Overview Task Views  -->
+    <!--  The primary task thumbnail uses up to this much of the total screen height/width  -->
     <item name="overview_max_scale" format="float" type="dimen">0.7</item>
+    <!--  A touch target for icons, sometimes slightly larger than the icons themselves  -->
+    <dimen name="task_thumbnail_icon_size">48dp</dimen>
+    <!--  The icon size for the focused task, placed in center of touch target  -->
+    <dimen name="task_thumbnail_icon_drawable_size">44dp</dimen>
+    <!--  The space under the focused task icon  -->
+    <dimen name="overview_task_margin">16dp</dimen>
+    <!--  The horizontal space between tasks  -->
+    <dimen name="overview_page_spacing">16dp</dimen>
+
+    <dimen name="task_icon_cache_default_icon_size">72dp</dimen>
     <item name="overview_modal_max_scale" format="float" type="dimen">1.1</item>
 
     <!-- Overrideable in overlay that provides the Overview Actions. -->
@@ -258,6 +263,7 @@
     <dimen name="taskbar_contextual_buttons_size">35dp</dimen>
     <dimen name="taskbar_stashed_size">24dp</dimen>
     <dimen name="taskbar_stashed_handle_width">220dp</dimen>
+    <dimen name="taskbar_stashed_small_screen">108dp</dimen>
     <dimen name="taskbar_unstash_input_area">316dp</dimen>
     <dimen name="taskbar_stashed_handle_height">4dp</dimen>
     <dimen name="taskbar_edu_wave_anim_trans_y">25dp</dimen>
@@ -272,7 +278,7 @@
     <!--  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_6_5">75dp</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>
diff --git a/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java b/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java
index e21dcba..c2e8658 100644
--- a/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java
+++ b/quickstep/src/com/android/launcher3/BaseQuickstepLauncher.java
@@ -110,7 +110,7 @@
  */
 public abstract class BaseQuickstepLauncher extends Launcher {
 
-    private DepthController mDepthController = new DepthController(this);
+    private DepthController mDepthController;
     private QuickstepTransitionManager mAppTransitionManager;
 
     /**
@@ -247,7 +247,6 @@
     @Override
     public void onScrollChanged(float progress) {
         super.onScrollChanged(progress);
-        mDepthController.onOverlayScrollChanged(progress);
         onTaskbarInAppDisplayProgressUpdate(progress, MINUS_ONE_PAGE_PROGRESS_INDEX);
     }
 
@@ -345,6 +344,7 @@
         mAppTransitionManager.registerRemoteTransitions();
 
         mTISBindHelper = new TISBindHelper(this, this::onTISConnected);
+        mDepthController = new DepthController(this);
     }
 
     private void onTISConnected(TISBinder binder) {
diff --git a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java
index bb79c1b..d251f3e 100644
--- a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java
+++ b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java
@@ -43,7 +43,6 @@
 import static com.android.launcher3.config.FeatureFlags.SEPARATE_RECENTS_ACTIVITY;
 import static com.android.launcher3.model.data.ItemInfo.NO_MATCHING_ID;
 import static com.android.launcher3.statehandlers.DepthController.DEPTH;
-import static com.android.launcher3.testing.TestProtocol.BAD_STATE;
 import static com.android.launcher3.util.window.RefreshRateTracker.getSingleFrameMs;
 import static com.android.launcher3.views.FloatingIconView.SHAPE_PROGRESS_DURATION;
 import static com.android.launcher3.views.FloatingIconView.getFloatingIconView;
@@ -77,9 +76,9 @@
 import android.os.SystemProperties;
 import android.os.UserHandle;
 import android.provider.Settings;
-import android.util.Log;
 import android.util.Pair;
 import android.util.Size;
+import android.view.CrossWindowBlurListeners;
 import android.view.SurfaceControl;
 import android.view.View;
 import android.view.ViewRootImpl;
@@ -95,11 +94,13 @@
 import com.android.launcher3.DeviceProfile.OnDeviceProfileChangeListener;
 import com.android.launcher3.LauncherAnimationRunner.RemoteAnimationFactory;
 import com.android.launcher3.anim.AnimationSuccessListener;
+import com.android.launcher3.anim.AnimatorListeners;
 import com.android.launcher3.dragndrop.DragLayer;
 import com.android.launcher3.icons.FastBitmapDrawable;
 import com.android.launcher3.shortcuts.DeepShortcutView;
 import com.android.launcher3.statehandlers.DepthController;
 import com.android.launcher3.taskbar.LauncherTaskbarUIController;
+import com.android.launcher3.testing.shared.ResourceUtils;
 import com.android.launcher3.touch.PagedOrientationHandler;
 import com.android.launcher3.util.ActivityOptionsWrapper;
 import com.android.launcher3.util.DynamicResource;
@@ -136,7 +137,6 @@
 import com.android.wm.shell.startingsurface.IStartingWindowListener;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.LinkedHashMap;
 import java.util.List;
 
@@ -145,8 +145,6 @@
  */
 public class QuickstepTransitionManager implements OnDeviceProfileChangeListener {
 
-    private static final String TAG = "QuickstepTransition";
-
     private static final boolean ENABLE_SHELL_STARTING_SURFACE =
             SystemProperties.getBoolean("persist.debug.shell_starting_surface", true);
 
@@ -446,7 +444,7 @@
                         4 - rotationChange);
             }
         }
-        if (mDeviceProfile.isTaskbarPresentInApps) {
+        if (mDeviceProfile.isTaskbarPresentInApps && !target.willShowImeOnTarget) {
             // Animate to above the taskbar.
             bounds.bottom -= target.contentInsets.bottom;
         }
@@ -622,28 +620,9 @@
         RecentsView overview = mLauncher.getOverviewPanel();
         ObjectAnimator alpha = ObjectAnimator.ofFloat(overview,
                 RecentsView.CONTENT_ALPHA, alphas);
-        Log.d(BAD_STATE, "QTM composeViewContentAnimator alphas=" + Arrays.toString(alphas));
-        alpha.addListener(new AnimatorListenerAdapter() {
-            @Override
-            public void onAnimationStart(Animator animation) {
-                Log.d(BAD_STATE, "QTM composeViewContentAnimator onStart");
-            }
-
-            @Override
-            public void onAnimationCancel(Animator animation) {
-                float alpha = overview == null ? -1 : RecentsView.CONTENT_ALPHA.get(overview);
-                Log.d(BAD_STATE, "QTM composeViewContentAnimator onCancel, alpha=" + alpha);
-            }
-
-            @Override
-            public void onAnimationEnd(Animator animation) {
-                Log.d(BAD_STATE, "QTM composeViewContentAnimator onEnd");
-            }
-        });
         alpha.setDuration(CONTENT_ALPHA_DURATION);
         alpha.setInterpolator(LINEAR);
         anim.play(alpha);
-        Log.d(BAD_STATE, "QTM composeViewContentAnimator setFreezeVisibility=true");
         overview.setFreezeViewVisibility(true);
 
         ObjectAnimator scaleAnim = ObjectAnimator.ofFloat(overview, SCALE_PROPERTY, scales);
@@ -652,7 +631,6 @@
         anim.play(scaleAnim);
 
         return () -> {
-            Log.d(BAD_STATE, "QTM composeViewContentAnimator onEnd setFreezeVisibility=false");
             overview.setFreezeViewVisibility(false);
             SCALE_PROPERTY.set(overview, 1f);
             mLauncher.getStateManager().reapplyState();
@@ -1066,54 +1044,37 @@
     private ObjectAnimator getBackgroundAnimator() {
         // When launching an app from overview that doesn't map to a task, we still want to just
         // blur the wallpaper instead of the launcher surface as well
-        boolean allowBlurringLauncher = mLauncher.getStateManager().getState() != OVERVIEW;
-        DepthController depthController = mLauncher.getDepthController();
+        boolean allowBlurringLauncher = mLauncher.getStateManager().getState() != OVERVIEW
+                && BlurUtils.supportsBlursOnWindows();
+
+        MyDepthController depthController = new MyDepthController(mLauncher);
         ObjectAnimator backgroundRadiusAnim = ObjectAnimator.ofFloat(depthController, DEPTH,
-                BACKGROUND_APP.getDepth(mLauncher))
+                        BACKGROUND_APP.getDepth(mLauncher))
                 .setDuration(APP_LAUNCH_DURATION);
+
         if (allowBlurringLauncher) {
-            final SurfaceControl dimLayer;
-            if (BlurUtils.supportsBlursOnWindows()) {
-                // Create a temporary effect layer, that lives on top of launcher, so we can apply
-                // the blur to it. The EffectLayer will be fullscreen, which will help with caching
-                // optimizations on the SurfaceFlinger side:
-                // - Results would be able to be cached as a texture
-                // - There won't be texture allocation overhead, because EffectLayers don't have
-                //   buffers
-                ViewRootImpl viewRootImpl = mLauncher.getDragLayer().getViewRootImpl();
-                SurfaceControl parent = viewRootImpl != null
-                        ? viewRootImpl.getSurfaceControl()
-                        : null;
-                dimLayer = new SurfaceControl.Builder()
-                        .setName("Blur layer")
-                        .setParent(parent)
-                        .setOpaque(false)
-                        .setHidden(false)
-                        .setEffectLayer()
-                        .build();
-            } else {
-                dimLayer = null;
-            }
+            // Create a temporary effect layer, that lives on top of launcher, so we can apply
+            // the blur to it. The EffectLayer will be fullscreen, which will help with caching
+            // optimizations on the SurfaceFlinger side:
+            // - Results would be able to be cached as a texture
+            // - There won't be texture allocation overhead, because EffectLayers don't have
+            //   buffers
+            ViewRootImpl viewRootImpl = mLauncher.getDragLayer().getViewRootImpl();
+            SurfaceControl parent = viewRootImpl != null
+                    ? viewRootImpl.getSurfaceControl()
+                    : null;
+            SurfaceControl dimLayer = new SurfaceControl.Builder()
+                    .setName("Blur layer")
+                    .setParent(parent)
+                    .setOpaque(false)
+                    .setHidden(false)
+                    .setEffectLayer()
+                    .build();
 
-            depthController.setSurface(dimLayer);
-            backgroundRadiusAnim.addListener(new AnimatorListenerAdapter() {
-                @Override
-                public void onAnimationStart(Animator animation) {
-                    depthController.setIsInLaunchTransition(true);
-                }
-
-                @Override
-                public void onAnimationEnd(Animator animation) {
-                    depthController.setIsInLaunchTransition(false);
-                    depthController.setSurface(null);
-                    if (dimLayer != null) {
-                        new SurfaceControl.Transaction()
-                                .remove(dimLayer)
-                                .apply();
-                    }
-                }
-            });
+            backgroundRadiusAnim.addListener(AnimatorListeners.forEndCallback(() ->
+                    new SurfaceControl.Transaction().remove(dimLayer).apply()));
         }
+
         return backgroundRadiusAnim;
     }
 
@@ -1958,4 +1919,17 @@
             return Utilities.mapToRange(progress, start, end, 1, 0, ACCEL_1_5);
         }
     }
+
+    private static class MyDepthController extends DepthController {
+        MyDepthController(Launcher l) {
+            super(l);
+            setCrossWindowBlursEnabled(
+                    CrossWindowBlurListeners.getInstance().isCrossWindowBlurEnabled());
+        }
+
+        @Override
+        public void setSurface(SurfaceControl surface) {
+            super.setSurface(surface);
+        }
+    }
 }
diff --git a/quickstep/src/com/android/launcher3/statehandlers/DepthController.java b/quickstep/src/com/android/launcher3/statehandlers/DepthController.java
index eda0823..1311b1d 100644
--- a/quickstep/src/com/android/launcher3/statehandlers/DepthController.java
+++ b/quickstep/src/com/android/launcher3/statehandlers/DepthController.java
@@ -23,13 +23,8 @@
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
 import android.animation.ObjectAnimator;
-import android.app.WallpaperManager;
-import android.os.IBinder;
-import android.os.SystemProperties;
 import android.util.FloatProperty;
-import android.view.AttachedSurfaceControl;
 import android.view.CrossWindowBlurListeners;
-import android.view.SurfaceControl;
 import android.view.View;
 import android.view.ViewRootImpl;
 import android.view.ViewTreeObserver;
@@ -37,12 +32,11 @@
 import com.android.launcher3.BaseActivity;
 import com.android.launcher3.Launcher;
 import com.android.launcher3.LauncherState;
-import com.android.launcher3.R;
 import com.android.launcher3.Utilities;
 import com.android.launcher3.anim.PendingAnimation;
 import com.android.launcher3.statemanager.StateManager.StateHandler;
 import com.android.launcher3.states.StateAnimationConfig;
-import com.android.systemui.shared.system.BlurUtils;
+import com.android.quickstep.util.BaseDepthController;
 
 import java.io.PrintWriter;
 import java.util.function.Consumer;
@@ -50,23 +44,9 @@
 /**
  * Controls blur and wallpaper zoom, for the Launcher surface only.
  */
-public class DepthController implements StateHandler<LauncherState>,
+public class DepthController extends BaseDepthController implements StateHandler<LauncherState>,
         BaseActivity.MultiWindowModeChangedListener {
 
-    private static final boolean OVERLAY_SCROLL_ENABLED = false;
-    public static final FloatProperty<DepthController> DEPTH =
-            new FloatProperty<DepthController>("depth") {
-                @Override
-                public void setValue(DepthController depthController, float depth) {
-                    depthController.setDepth(depth);
-                }
-
-                @Override
-                public Float get(DepthController depthController) {
-                    return depthController.mDepth;
-                }
-            };
-
     /**
      * A property that updates the background blur within a given range of values (ie. even if the
      * animator goes beyond 0..1, the interpolated value will still be bounded).
@@ -92,96 +72,46 @@
         }
     }
 
-    private final ViewTreeObserver.OnDrawListener mOnDrawListener =
-            new ViewTreeObserver.OnDrawListener() {
-                @Override
-                public void onDraw() {
-                    View view = mLauncher.getDragLayer();
-                    ViewRootImpl viewRootImpl = view.getViewRootImpl();
-                    boolean applied = setSurface(
-                            viewRootImpl != null ? viewRootImpl.getSurfaceControl() : null);
-                    if (!applied) {
-                        dispatchTransactionSurface(mDepth);
-                    }
-                    view.post(() -> view.getViewTreeObserver().removeOnDrawListener(this));
-                }
-            };
+    private final ViewTreeObserver.OnDrawListener mOnDrawListener = this::onLauncherDraw;
 
-    private final Consumer<Boolean> mCrossWindowBlurListener = new Consumer<Boolean>() {
-        @Override
-        public void accept(Boolean enabled) {
-            mCrossWindowBlursEnabled = enabled;
-            dispatchTransactionSurface(mDepth);
-        }
-    };
+    private final Consumer<Boolean> mCrossWindowBlurListener = this::setCrossWindowBlursEnabled;
 
-    private final Runnable mOpaquenessListener = new Runnable() {
-        @Override
-        public void run() {
-            dispatchTransactionSurface(mDepth);
-        }
-    };
+    private final Runnable mOpaquenessListener = this::applyDepthAndBlur;
 
-    private final Launcher mLauncher;
-    /**
-     * Blur radius when completely zoomed out, in pixels.
-     */
-    private int mMaxBlurRadius;
-    private boolean mCrossWindowBlursEnabled;
-    private WallpaperManager mWallpaperManager;
-    private SurfaceControl mSurface;
-    /**
-     * How visible the -1 overlay is, from 0 to 1.
-     */
-    private float mOverlayScrollProgress;
-    /**
-     * Ratio from 0 to 1, where 0 is fully zoomed out, and 1 is zoomed in.
-     * @see android.service.wallpaper.WallpaperService.Engine#onZoomChanged(float)
-     */
-    private float mDepth;
-    /**
-     * Last blur value, in pixels, that was applied.
-     * For debugging purposes.
-     */
-    private int mCurrentBlur;
     /**
      * If we're launching and app and should not be blurring the screen for performance reasons.
      */
     private boolean mBlurDisabledForAppLaunch;
-    /**
-     * If we requested early wake-up offsets to SurfaceFlinger.
-     */
-    private boolean mInEarlyWakeUp;
+
 
     // Workaround for animating the depth when multiwindow mode changes.
     private boolean mIgnoreStateChangesDuringMultiWindowAnimation = false;
 
-    // Hints that there is potentially content behind Launcher and that we shouldn't optimize by
-    // marking the launcher surface as opaque.  Only used in certain Launcher states.
-    private boolean mHasContentBehindLauncher;
-
     private View.OnAttachStateChangeListener mOnAttachListener;
 
     public DepthController(Launcher l) {
-        mLauncher = l;
+        super(l);
+    }
+
+    private void onLauncherDraw() {
+        View view = mLauncher.getDragLayer();
+        ViewRootImpl viewRootImpl = view.getViewRootImpl();
+        setSurface(viewRootImpl != null ? viewRootImpl.getSurfaceControl() : null);
+        view.post(() -> view.getViewTreeObserver().removeOnDrawListener(mOnDrawListener));
     }
 
     private void ensureDependencies() {
-        if (mWallpaperManager == null) {
-            mMaxBlurRadius = mLauncher.getResources().getInteger(R.integer.max_depth_blur_radius);
-            mWallpaperManager = mLauncher.getSystemService(WallpaperManager.class);
-        }
-
         if (mLauncher.getRootView() != null && mOnAttachListener == null) {
+            View rootView = mLauncher.getRootView();
             mOnAttachListener = new View.OnAttachStateChangeListener() {
                 @Override
                 public void onViewAttachedToWindow(View view) {
+                    CrossWindowBlurListeners.getInstance().addListener(mLauncher.getMainExecutor(),
+                            mCrossWindowBlurListener);
+                    mLauncher.getScrimView().addOpaquenessListener(mOpaquenessListener);
+
                     // To handle the case where window token is invalid during last setDepth call.
-                    IBinder windowToken = mLauncher.getRootView().getWindowToken();
-                    if (windowToken != null) {
-                        mWallpaperManager.setWallpaperZoomOut(windowToken, mDepth);
-                    }
-                    onAttached();
+                    applyDepthAndBlur();
                 }
 
                 @Override
@@ -190,23 +120,13 @@
                     mLauncher.getScrimView().removeOpaquenessListener(mOpaquenessListener);
                 }
             };
-            mLauncher.getRootView().addOnAttachStateChangeListener(mOnAttachListener);
-            if (mLauncher.getRootView().isAttachedToWindow()) {
-                onAttached();
+            rootView.addOnAttachStateChangeListener(mOnAttachListener);
+            if (rootView.isAttachedToWindow()) {
+                mOnAttachListener.onViewAttachedToWindow(rootView);
             }
         }
     }
 
-    private void onAttached() {
-        CrossWindowBlurListeners.getInstance().addListener(mLauncher.getMainExecutor(),
-                mCrossWindowBlurListener);
-        mLauncher.getScrimView().addOpaquenessListener(mOpaquenessListener);
-    }
-
-    public void setHasContentBehindLauncher(boolean hasContentBehindLauncher) {
-        mHasContentBehindLauncher = hasContentBehindLauncher;
-    }
-
     /**
      * Sets if the underlying activity is started or not
      */
@@ -219,26 +139,6 @@
         }
     }
 
-    /**
-     * Sets the specified app target surface to apply the blur to.
-     * @return true when surface was valid and transaction was dispatched.
-     */
-    public boolean setSurface(SurfaceControl surface) {
-        // Set launcher as the SurfaceControl when we don't need an external target anymore.
-        if (surface == null) {
-            ViewRootImpl viewRootImpl = mLauncher.getDragLayer().getViewRootImpl();
-            surface = viewRootImpl != null ? viewRootImpl.getSurfaceControl() : null;
-        }
-        if (mSurface != surface) {
-            mSurface = surface;
-            if (surface != null) {
-                dispatchTransactionSurface(mDepth);
-                return true;
-            }
-        }
-        return false;
-    }
-
     @Override
     public void setState(LauncherState toState) {
         if (mSurface == null || mIgnoreStateChangesDuringMultiWindowAnimation) {
@@ -249,7 +149,7 @@
         if (Float.compare(mDepth, toDepth) != 0) {
             setDepth(toDepth);
         } else if (toState == LauncherState.OVERVIEW) {
-            dispatchTransactionSurface(mDepth);
+            applyDepthAndBlur();
         } else if (toState == LauncherState.BACKGROUND_APP) {
             mLauncher.getDragLayer().getViewTreeObserver().addOnDrawListener(mOnDrawListener);
         }
@@ -269,90 +169,10 @@
         }
     }
 
-    /**
-     * If we're launching an app from the home screen.
-     */
-    public void setIsInLaunchTransition(boolean inLaunchTransition) {
-        boolean blurEnabled = SystemProperties.getBoolean("ro.launcher.blur.appLaunch", true);
-        mBlurDisabledForAppLaunch = inLaunchTransition && !blurEnabled;
-        if (!inLaunchTransition) {
-            // Reset depth at the end of the launch animation, so the wallpaper won't be
-            // zoomed out if an app crashes.
-            setDepth(0f);
-        }
-    }
-
-    private void setDepth(float depth) {
-        depth = Utilities.boundToRange(depth, 0, 1);
-        // Round out the depth to dedupe frequent, non-perceptable updates
-        int depthI = (int) (depth * 256);
-        float depthF = depthI / 256f;
-        if (Float.compare(mDepth, depthF) == 0) {
-            return;
-        }
-        dispatchTransactionSurface(depthF);
-        mDepth = depthF;
-    }
-
-    public void onOverlayScrollChanged(float progress) {
-        if (!OVERLAY_SCROLL_ENABLED) {
-            return;
-        }
-        // Add some padding to the progress, such we don't change the depth on the last frames of
-        // the animation. It's possible that a user flinging the feed quickly would scroll
-        // horizontally by accident, causing the device to enter client composition unnecessarily.
-        progress = Math.min(progress * 1.1f, 1f);
-
-        // Round out the progress to dedupe frequent, non-perceptable updates
-        int progressI = (int) (progress * 256);
-        float progressF = Utilities.boundToRange(progressI / 256f, 0f, 1f);
-        if (Float.compare(mOverlayScrollProgress, progressF) == 0) {
-            return;
-        }
-        mOverlayScrollProgress = progressF;
-        dispatchTransactionSurface(mDepth);
-    }
-
-    private boolean dispatchTransactionSurface(float depth) {
-        boolean supportsBlur = BlurUtils.supportsBlursOnWindows();
-        if (supportsBlur && (mSurface == null || !mSurface.isValid())) {
-            return false;
-        }
+    @Override
+    protected void applyDepthAndBlur() {
         ensureDependencies();
-        depth = Math.max(depth, mOverlayScrollProgress);
-        IBinder windowToken = mLauncher.getRootView().getWindowToken();
-        if (windowToken != null) {
-            mWallpaperManager.setWallpaperZoomOut(windowToken, depth);
-        }
-
-        if (supportsBlur) {
-            boolean hasOpaqueBg = mLauncher.getScrimView().isFullyOpaque();
-            boolean isSurfaceOpaque = !mHasContentBehindLauncher && hasOpaqueBg;
-
-            mCurrentBlur = !mCrossWindowBlursEnabled || mBlurDisabledForAppLaunch || hasOpaqueBg
-                    ? 0 : (int) (depth * mMaxBlurRadius);
-            SurfaceControl.Transaction transaction = new SurfaceControl.Transaction()
-                    .setBackgroundBlurRadius(mSurface, mCurrentBlur)
-                    .setOpaque(mSurface, isSurfaceOpaque);
-
-            // Set early wake-up flags when we know we're executing an expensive operation, this way
-            // SurfaceFlinger will adjust its internal offsets to avoid jank.
-            boolean wantsEarlyWakeUp = depth > 0 && depth < 1;
-            if (wantsEarlyWakeUp && !mInEarlyWakeUp) {
-                transaction.setEarlyWakeupStart();
-                mInEarlyWakeUp = true;
-            } else if (!wantsEarlyWakeUp && mInEarlyWakeUp) {
-                transaction.setEarlyWakeupEnd();
-                mInEarlyWakeUp = false;
-            }
-
-            AttachedSurfaceControl rootSurfaceControl =
-                    mLauncher.getRootView().getRootSurfaceControl();
-            if (rootSurfaceControl != null) {
-                rootSurfaceControl.applyTransactionOnDraw(transaction);
-            }
-        }
-        return true;
+        super.applyDepthAndBlur();
     }
 
     @Override
@@ -377,7 +197,6 @@
         writer.println(prefix + "\tmMaxBlurRadius=" + mMaxBlurRadius);
         writer.println(prefix + "\tmCrossWindowBlursEnabled=" + mCrossWindowBlursEnabled);
         writer.println(prefix + "\tmSurface=" + mSurface);
-        writer.println(prefix + "\tmOverlayScrollProgress=" + mOverlayScrollProgress);
         writer.println(prefix + "\tmDepth=" + mDepth);
         writer.println(prefix + "\tmCurrentBlur=" + mCurrentBlur);
         writer.println(prefix + "\tmBlurDisabledForAppLaunch=" + mBlurDisabledForAppLaunch);
diff --git a/quickstep/src/com/android/launcher3/taskbar/DesktopTaskbarRecentAppsController.java b/quickstep/src/com/android/launcher3/taskbar/DesktopTaskbarRecentAppsController.java
new file mode 100644
index 0000000..acfbea3
--- /dev/null
+++ b/quickstep/src/com/android/launcher3/taskbar/DesktopTaskbarRecentAppsController.java
@@ -0,0 +1,153 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.launcher3.taskbar;
+
+import android.app.ActivityManager;
+import android.content.ComponentName;
+import android.util.SparseArray;
+
+import com.android.launcher3.model.data.AppInfo;
+import com.android.launcher3.model.data.ItemInfo;
+import com.android.launcher3.model.data.WorkspaceItemInfo;
+import com.android.quickstep.RecentsModel;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Provides recent apps functionality specifically in a desktop environment.
+ */
+public class DesktopTaskbarRecentAppsController extends TaskbarRecentAppsController {
+
+    private final TaskbarActivityContext mContext;
+    private ArrayList<ItemInfo> mRunningApps = new ArrayList<>();
+    private AppInfo[] mApps;
+
+    public DesktopTaskbarRecentAppsController(TaskbarActivityContext context) {
+        mContext = context;
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        mApps = null;
+    }
+
+    @Override
+    protected void setApps(AppInfo[] apps) {
+        mApps = apps;
+    }
+
+    @Override
+    protected boolean isEnabled() {
+        return true;
+    }
+
+    /**
+     * Set mRunningApps to hold currently running applications using the list of currently running
+     * tasks. Filtering is also done to ignore applications that are already on the taskbar in the
+     * original hotseat.
+     */
+    @Override
+    protected void updateRunningApps(SparseArray<ItemInfo> hotseatItems) {
+        ArrayList<AppInfo> runningApps = getRunningAppsFromTasks();
+        ArrayList<ItemInfo> filteredRunningApps = new ArrayList<>();
+        for (AppInfo runningApp : runningApps) {
+            boolean shouldAddOnTaskbar = true;
+            for (int i = 0; i < hotseatItems.size(); i++) {
+                if (hotseatItems.keyAt(i) >= mControllers.taskbarActivityContext.getDeviceProfile()
+                        .numShownHotseatIcons) {
+                    break;
+                }
+                if (hotseatItems.valueAt(i).getTargetPackage()
+                        .equals(runningApp.getTargetPackage())) {
+                    shouldAddOnTaskbar = false;
+                    break;
+                }
+            }
+            if (shouldAddOnTaskbar) {
+                filteredRunningApps.add(new WorkspaceItemInfo(runningApp));
+            }
+        }
+        mRunningApps = filteredRunningApps;
+        mControllers.taskbarViewController.commitRunningAppsToUI();
+    }
+
+    /**
+     * Returns a copy of hotseatItems with the addition of currently running applications.
+     */
+    @Override
+    protected ItemInfo[] updateHotseatItemInfos(ItemInfo[] hotseatItemInfos) {
+        // hotseatItemInfos.length would be 0 if deviceProfile.numShownHotseatIcons is 0, so we
+        // don't want to show anything in the hotseat
+        if (hotseatItemInfos.length == 0) return hotseatItemInfos;
+
+        int runningAppsIndex = 0;
+        ItemInfo[] newHotseatItemsInfo = Arrays.copyOf(
+                hotseatItemInfos, hotseatItemInfos.length + mRunningApps.size());
+        for (int i = hotseatItemInfos.length; i < newHotseatItemsInfo.length; i++) {
+            newHotseatItemsInfo[i] = mRunningApps.get(runningAppsIndex);
+            runningAppsIndex++;
+        }
+        return newHotseatItemsInfo;
+    }
+
+
+    /**
+     * Returns a list of running applications from the list of currently running tasks.
+     */
+    private ArrayList<AppInfo> getRunningAppsFromTasks() {
+        ArrayList<ActivityManager.RunningTaskInfo> tasks =
+                RecentsModel.INSTANCE.get(mContext).getRunningTasks();
+        ArrayList<AppInfo> runningApps = new ArrayList<>();
+        // early return if apps is empty, since we would have no AppInfo to compare
+        if (mApps == null)  {
+            return runningApps;
+        }
+
+        Set<String> seenPackages = new HashSet<>();
+        for (ActivityManager.RunningTaskInfo taskInfo : tasks) {
+            if (taskInfo.realActivity == null) continue;
+
+            // If a different task for the same package has already been handled, skip this one
+            String taskPackage = taskInfo.realActivity.getPackageName();
+            if (seenPackages.contains(taskPackage)) continue;
+
+            // Otherwise, get the corresponding AppInfo and add it to the list
+            seenPackages.add(taskPackage);
+            AppInfo app = getAppInfo(taskInfo.realActivity);
+            if (app == null) continue;
+            runningApps.add(app);
+        }
+        return runningApps;
+    }
+
+    /**
+     * Retrieves the corresponding AppInfo for the activity.
+     */
+    private AppInfo getAppInfo(ComponentName activity) {
+        String packageName = activity.getPackageName();
+        for (AppInfo app : mApps) {
+            if (!packageName.equals(app.getTargetPackage())) {
+                continue;
+            }
+            return app;
+        }
+        return null;
+    }
+}
diff --git a/quickstep/src/com/android/launcher3/taskbar/DesktopTaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/DesktopTaskbarUIController.java
index e2359c0..3c76e8e 100644
--- a/quickstep/src/com/android/launcher3/taskbar/DesktopTaskbarUIController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/DesktopTaskbarUIController.java
@@ -32,11 +32,14 @@
 
     @Override
     protected void init(TaskbarControllers taskbarControllers) {
+        super.init(taskbarControllers);
         mLauncher.getHotseat().setIconsAlpha(0f);
+        mControllers.taskbarViewController.updateRunningApps();
     }
 
     @Override
     protected void onDestroy() {
+        super.onDestroy();
         mLauncher.getHotseat().setIconsAlpha(1f);
     }
 
diff --git a/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java
index 6df31e5..62a11d4 100644
--- a/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java
@@ -354,6 +354,13 @@
     }
 
     @Override
+    public void onExpandPip() {
+        super.onExpandPip();
+        mTaskbarLauncherStateController.updateStateForFlag(FLAG_RESUMED, false);
+        mTaskbarLauncherStateController.applyState();
+    }
+
+    @Override
     public void dumpLogs(String prefix, PrintWriter pw) {
         super.dumpLogs(prefix, pw);
 
diff --git a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java
index b01168d..55c3c20 100644
--- a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java
@@ -676,9 +676,11 @@
         updateButtonLayoutSpacing();
     }
 
-    /** Adds the correct spacing to 3 button nav container. No-op if using gesture nav */
+    /**
+     * Adds the correct spacing to 3 button nav container. No-op if using gesture nav or kids mode.
+     */
     private void updateButtonLayoutSpacing() {
-        if (!mContext.isThreeButtonNav()) {
+        if (!mContext.isThreeButtonNav() || mContext.isNavBarKidsModeActive()) {
             return;
         }
         DeviceProfile dp = mContext.getDeviceProfile();
diff --git a/quickstep/src/com/android/launcher3/taskbar/StashedHandleViewController.java b/quickstep/src/com/android/launcher3/taskbar/StashedHandleViewController.java
index 800e162..0652463 100644
--- a/quickstep/src/com/android/launcher3/taskbar/StashedHandleViewController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/StashedHandleViewController.java
@@ -15,6 +15,8 @@
  */
 package com.android.launcher3.taskbar;
 
+import static com.android.launcher3.taskbar.TaskbarManager.isPhoneMode;
+
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
 import android.animation.ValueAnimator;
@@ -25,6 +27,7 @@
 import android.view.View;
 import android.view.ViewOutlineProvider;
 
+import com.android.launcher3.DeviceProfile;
 import com.android.launcher3.R;
 import com.android.launcher3.Utilities;
 import com.android.launcher3.anim.RevealOutlineAnimation;
@@ -55,9 +58,9 @@
     private final TaskbarActivityContext mActivity;
     private final SharedPreferences mPrefs;
     private final StashedHandleView mStashedHandleView;
-    private final int mStashedHandleWidth;
+    private int mStashedHandleWidth;
     private final int mStashedHandleHeight;
-    private final RegionSamplingHelper mRegionSamplingHelper;
+    private RegionSamplingHelper mRegionSamplingHelper;
     private final MultiValueAlpha mTaskbarStashedHandleAlpha;
     private final AnimatedFloat mTaskbarStashedHandleHintScale = new AnimatedFloat(
             this::updateStashedHandleHintScale);
@@ -85,30 +88,27 @@
                 mPrefs.getBoolean(SHARED_PREFS_STASHED_HANDLE_REGION_DARK_KEY, false),
                 false /* animate */);
         final Resources resources = mActivity.getResources();
-        mStashedHandleWidth = resources.getDimensionPixelSize(R.dimen.taskbar_stashed_handle_width);
         mStashedHandleHeight = resources.getDimensionPixelSize(
                 R.dimen.taskbar_stashed_handle_height);
-        mRegionSamplingHelper = new RegionSamplingHelper(mStashedHandleView,
-                new RegionSamplingHelper.SamplingCallback() {
-                    @Override
-                    public void onRegionDarknessChanged(boolean isRegionDark) {
-                        mStashedHandleView.updateHandleColor(isRegionDark, true /* animate */);
-                        mPrefs.edit().putBoolean(SHARED_PREFS_STASHED_HANDLE_REGION_DARK_KEY,
-                                isRegionDark).apply();
-                    }
-
-                    @Override
-                    public Rect getSampledRegion(View sampledView) {
-                        return mStashedHandleView.getSampledRegion();
-                    }
-                }, Executors.UI_HELPER_EXECUTOR);
     }
 
     public void init(TaskbarControllers controllers) {
         mControllers = controllers;
-        mStashedHandleView.getLayoutParams().height = mActivity.getDeviceProfile().taskbarSize;
+        DeviceProfile deviceProfile = mActivity.getDeviceProfile();
+        Resources resources = mActivity.getResources();
+        if (isPhoneMode(mActivity.getDeviceProfile())) {
+            mStashedHandleView.getLayoutParams().height =
+                    resources.getDimensionPixelSize(R.dimen.taskbar_size);
+            mStashedHandleWidth =
+                    resources.getDimensionPixelSize(R.dimen.taskbar_stashed_small_screen);
+        } else {
+            mStashedHandleView.getLayoutParams().height = deviceProfile.taskbarSize;
+            mStashedHandleWidth =
+                    resources.getDimensionPixelSize(R.dimen.taskbar_stashed_handle_width);
+        }
 
-        mTaskbarStashedHandleAlpha.getProperty(ALPHA_INDEX_STASHED).setValue(0);
+        mTaskbarStashedHandleAlpha.getProperty(ALPHA_INDEX_STASHED).setValue(
+                isPhoneMode(deviceProfile) ? 1 : 0);
         mTaskbarStashedHandleHintScale.updateValue(1f);
 
         final int stashedTaskbarHeight = mControllers.taskbarStashController.getStashedHeight();
@@ -135,10 +135,33 @@
             view.setPivotX(stashedCenterX);
             view.setPivotY(stashedCenterY);
         });
+        initRegionSampler();
+        if (isPhoneMode(deviceProfile)) {
+            onIsStashedChanged(true);
+        }
     }
 
+    private void initRegionSampler() {
+        mRegionSamplingHelper = new RegionSamplingHelper(mStashedHandleView,
+                new RegionSamplingHelper.SamplingCallback() {
+                    @Override
+                    public void onRegionDarknessChanged(boolean isRegionDark) {
+                        mStashedHandleView.updateHandleColor(isRegionDark, true /* animate */);
+                        mPrefs.edit().putBoolean(SHARED_PREFS_STASHED_HANDLE_REGION_DARK_KEY,
+                                isRegionDark).apply();
+                    }
+
+                    @Override
+                    public Rect getSampledRegion(View sampledView) {
+                        return mStashedHandleView.getSampledRegion();
+                    }
+                }, Executors.UI_HELPER_EXECUTOR);
+    }
+
+
     public void onDestroy() {
         mRegionSamplingHelper.stopAndDestroy();
+        mRegionSamplingHelper = null;
     }
 
     public MultiValueAlpha getStashedHandleAlpha() {
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
index 439490e..f5fe77a 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
@@ -23,8 +23,9 @@
 
 import static com.android.launcher3.AbstractFloatingView.TYPE_ALL;
 import static com.android.launcher3.AbstractFloatingView.TYPE_REBIND_SAFE;
-import static com.android.launcher3.ResourceUtils.getBoolByName;
 import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_FOLDER_OPEN;
+import static com.android.launcher3.taskbar.TaskbarManager.FLAG_HIDE_NAVBAR_WINDOW;
+import static com.android.launcher3.testing.shared.ResourceUtils.getBoolByName;
 import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED;
 import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_QUICK_SETTINGS_EXPANDED;
 import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_VOICE_INTERACTION_WINDOW_SHOWING;
@@ -76,7 +77,7 @@
 import com.android.launcher3.popup.PopupDataProvider;
 import com.android.launcher3.taskbar.allapps.TaskbarAllAppsController;
 import com.android.launcher3.testing.TestLogging;
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 import com.android.launcher3.touch.ItemClickHandler;
 import com.android.launcher3.util.DisplayController;
 import com.android.launcher3.util.DisplayController.NavigationMode;
@@ -130,6 +131,8 @@
     // The flag to know if the window is excluded from magnification region computation.
     private boolean mIsExcludeFromMagnificationRegion = false;
     private boolean mBindingItems = false;
+    private boolean mAddedWindow = false;
+
 
     private final TaskbarShortcutMenuAccessibilityDelegate mAccessibilityDelegate;
 
@@ -173,13 +176,15 @@
 
         mAccessibilityDelegate = new TaskbarShortcutMenuAccessibilityDelegate(this);
 
+        final boolean isDesktopMode = getPackageManager().hasSystemFeature(FEATURE_PC);
+
         // Construct controllers.
         mControllers = new TaskbarControllers(this,
                 new TaskbarDragController(this),
                 buttonController,
-                getPackageManager().hasSystemFeature(FEATURE_PC)
-                        ? new DesktopNavbarButtonsViewController(this, navButtonsView) :
-                        new NavbarButtonsViewController(this, navButtonsView),
+                isDesktopMode
+                        ? new DesktopNavbarButtonsViewController(this, navButtonsView)
+                        : new NavbarButtonsViewController(this, navButtonsView),
                 new RotationButtonController(this,
                         c.getColor(R.color.taskbar_nav_icon_light_color),
                         c.getColor(R.color.taskbar_nav_icon_dark_color),
@@ -202,7 +207,10 @@
                 new TaskbarForceVisibleImmersiveController(this),
                 new TaskbarAllAppsController(this, dp),
                 new TaskbarInsetsController(this),
-                new VoiceInteractionWindowController(this));
+                new VoiceInteractionWindowController(this),
+                isDesktopMode
+                        ? new DesktopTaskbarRecentAppsController(this)
+                        : TaskbarRecentAppsController.DEFAULT);
     }
 
     public void init(@NonNull TaskbarSharedState sharedState) {
@@ -213,7 +221,12 @@
         mControllers.init(sharedState);
         updateSysuiStateFlags(sharedState.sysuiStateFlags, true /* fromInit */);
 
-        mWindowManager.addView(mDragLayer, mWindowLayoutParams);
+        if (!mAddedWindow) {
+            mWindowManager.addView(mDragLayer, mWindowLayoutParams);
+            mAddedWindow = true;
+        } else {
+            mWindowManager.updateViewLayout(mDragLayer, mWindowLayoutParams);
+        }
     }
 
     @Override
@@ -456,7 +469,10 @@
         mIsDestroyed = true;
         setUIController(TaskbarUIController.DEFAULT);
         mControllers.onDestroy();
-        mWindowManager.removeViewImmediate(mDragLayer);
+        if (!FLAG_HIDE_NAVBAR_WINDOW) {
+            mWindowManager.removeViewImmediate(mDragLayer);
+            mAddedWindow = false;
+        }
     }
 
     public void updateSysuiStateFlags(int systemUiStateFlags, boolean fromInit) {
@@ -591,6 +607,9 @@
      * Returns the default height of the window, including the static corner radii above taskbar.
      */
     public int getDefaultTaskbarWindowHeight() {
+        if (FLAG_HIDE_NAVBAR_WINDOW && mDeviceProfile.isPhone) {
+            return getResources().getDimensionPixelSize(R.dimen.taskbar_stashed_size);
+        }
         return mDeviceProfile.taskbarSize + Math.max(getLeftCornerRadius(), getRightCornerRadius());
     }
 
@@ -622,7 +641,9 @@
 
     /** Adds the given view to WindowManager with the provided LayoutParams (creates new window). */
     public void addWindowView(View view, WindowManager.LayoutParams windowLayoutParams) {
-        mWindowManager.addView(view, windowLayoutParams);
+        if (!view.isAttachedToWindow()) {
+            mWindowManager.addView(view, windowLayoutParams);
+        }
     }
 
     /** Removes the given view from WindowManager. See {@link #addWindowView}. */
@@ -839,6 +860,6 @@
         pw.println(String.format(
                 "%s\tmBindInProgress=%b", prefix, mBindingItems));
         mControllers.dumpLogs(prefix + "\t", pw);
-        mDeviceProfile.dump(prefix, pw);
+        mDeviceProfile.dump(this, prefix, pw);
     }
 }
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java
index d7b50b0..2b80b75 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java
@@ -53,6 +53,7 @@
     public final TaskbarAllAppsController taskbarAllAppsController;
     public final TaskbarInsetsController taskbarInsetsController;
     public final VoiceInteractionWindowController voiceInteractionWindowController;
+    public final TaskbarRecentAppsController taskbarRecentAppsController;
 
     @Nullable private LoggableTaskbarController[] mControllersToLog = null;
 
@@ -82,7 +83,8 @@
             TaskbarForceVisibleImmersiveController taskbarForceVisibleImmersiveController,
             TaskbarAllAppsController taskbarAllAppsController,
             TaskbarInsetsController taskbarInsetsController,
-            VoiceInteractionWindowController voiceInteractionWindowController) {
+            VoiceInteractionWindowController voiceInteractionWindowController,
+            TaskbarRecentAppsController taskbarRecentAppsController) {
         this.taskbarActivityContext = taskbarActivityContext;
         this.taskbarDragController = taskbarDragController;
         this.navButtonController = navButtonController;
@@ -102,6 +104,7 @@
         this.taskbarAllAppsController = taskbarAllAppsController;
         this.taskbarInsetsController = taskbarInsetsController;
         this.voiceInteractionWindowController = voiceInteractionWindowController;
+        this.taskbarRecentAppsController = taskbarRecentAppsController;
     }
 
     /**
@@ -130,6 +133,7 @@
         navButtonController.init(this);
         taskbarInsetsController.init(this);
         voiceInteractionWindowController.init(this);
+        taskbarRecentAppsController.init(this);
 
         mControllersToLog = new LoggableTaskbarController[] {
                 taskbarDragController, navButtonController, navbarButtonsViewController,
@@ -178,6 +182,7 @@
         navButtonController.onDestroy();
         taskbarInsetsController.onDestroy();
         voiceInteractionWindowController.onDestroy();
+        taskbarRecentAppsController.onDestroy();
 
         mControllersToLog = null;
     }
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java
index 3a0f374..97029fe 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java
@@ -66,7 +66,7 @@
 import com.android.launcher3.shortcuts.DeepShortcutView;
 import com.android.launcher3.shortcuts.ShortcutDragPreviewProvider;
 import com.android.launcher3.testing.TestLogging;
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 import com.android.launcher3.util.IntSet;
 import com.android.launcher3.util.ItemInfoMatcher;
 import com.android.systemui.shared.recents.model.Task;
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayer.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayer.java
index c1a6185..ee17ad0 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayer.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayer.java
@@ -30,7 +30,7 @@
 
 import com.android.launcher3.AbstractFloatingView;
 import com.android.launcher3.testing.TestLogging;
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 import com.android.launcher3.views.BaseDragLayer;
 import com.android.systemui.shared.system.ViewTreeObserverWrapper;
 import com.android.systemui.shared.system.ViewTreeObserverWrapper.InsetsInfo;
@@ -86,8 +86,14 @@
         }
     }
 
+    protected void onDestroy(boolean forceDestroy) {
+        if (forceDestroy) {
+            ViewTreeObserverWrapper.removeOnComputeInsetsListener(mTaskbarInsetsComputer);
+        }
+    }
+
     protected void onDestroy() {
-        ViewTreeObserverWrapper.removeOnComputeInsetsListener(mTaskbarInsetsComputer);
+        onDestroy(!TaskbarManager.FLAG_HIDE_NAVBAR_WINDOW);
     }
 
     @Override
@@ -101,7 +107,7 @@
     protected void onDetachedFromWindow() {
         super.onDetachedFromWindow();
 
-        onDestroy();
+        onDestroy(true);
     }
 
     @Override
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
index 06262c0..353bf89 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
@@ -30,6 +30,7 @@
 import android.hardware.display.DisplayManager;
 import android.net.Uri;
 import android.os.Handler;
+import android.os.SystemProperties;
 import android.provider.Settings;
 import android.view.Display;
 
@@ -58,6 +59,9 @@
  */
 public class TaskbarManager {
 
+    public static final boolean FLAG_HIDE_NAVBAR_WINDOW =
+            SystemProperties.getBoolean("persist.wm.debug.hide_navbar_window", false);
+
     private static final Uri USER_SETUP_COMPLETE_URI = Settings.Secure.getUriFor(
             Settings.Secure.USER_SETUP_COMPLETE);
 
@@ -147,7 +151,7 @@
                 } else {
                     // Config change might be handled without re-creating the taskbar
                     if (mTaskbarActivityContext != null) {
-                        if (dp != null && dp.isTaskbarPresent) {
+                        if (dp != null && isTaskbarPresent(dp)) {
                             mTaskbarActivityContext.updateDeviceProfile(dp);
                         }
                         mTaskbarActivityContext.onConfigurationChanged(configDiff);
@@ -159,7 +163,8 @@
             @Override
             public void onLowMemory() { }
         };
-        mShutdownReceiver = new SimpleBroadcastReceiver(i -> destroyExistingTaskbar());
+        mShutdownReceiver = new SimpleBroadcastReceiver(i ->
+                destroyExistingTaskbar());
         mDispInfoChangeListener = (context, info, flags) -> {
             if ((flags & CHANGE_FLAGS) != 0) {
                 recreateTaskbar();
@@ -179,7 +184,9 @@
     private void destroyExistingTaskbar() {
         if (mTaskbarActivityContext != null) {
             mTaskbarActivityContext.onDestroy();
-            mTaskbarActivityContext = null;
+            if (!FLAG_HIDE_NAVBAR_WINDOW) {
+                mTaskbarActivityContext = null;
+            }
         }
     }
 
@@ -260,24 +267,32 @@
         }
     }
 
+    /**
+     * This method is called multiple times (ex. initial init, then when user unlocks) in which case
+     * we fully want to destroy an existing taskbar and create a new one.
+     * In other case (folding/unfolding) we don't need to remove and add window.
+     */
     private void recreateTaskbar() {
+        DeviceProfile dp = mUserUnlocked ?
+                LauncherAppState.getIDP(mContext).getDeviceProfile(mContext) : null;
+
         destroyExistingTaskbar();
 
-        DeviceProfile dp =
-                mUserUnlocked ? LauncherAppState.getIDP(mContext).getDeviceProfile(mContext) : null;
-
-        boolean isTaskBarEnabled = dp != null && dp.isTaskbarPresent;
-
+        boolean isTaskBarEnabled = dp != null && isTaskbarPresent(dp);
         if (!isTaskBarEnabled) {
             SystemUiProxy.INSTANCE.get(mContext)
                     .notifyTaskbarStatus(/* visible */ false, /* stashed */ false);
             return;
         }
 
-        mTaskbarActivityContext = new TaskbarActivityContext(mContext, dp, mNavButtonController,
-                mUnfoldProgressProvider);
-
+        if (mTaskbarActivityContext == null) {
+            mTaskbarActivityContext = new TaskbarActivityContext(mContext, dp, mNavButtonController,
+                    mUnfoldProgressProvider);
+        } else {
+            mTaskbarActivityContext.updateDeviceProfile(dp);
+        }
         mTaskbarActivityContext.init(mSharedState);
+
         if (mActivity != null) {
             mTaskbarActivityContext.setUIController(
                     createTaskbarUIControllerForActivity(mActivity));
@@ -301,6 +316,18 @@
         }
     }
 
+    /**
+     * @return {@code true} if provided device profile isn't a large screen profile
+     *                      and we are using a single window for taskbar and navbar.
+     */
+    public static boolean isPhoneMode(DeviceProfile deviceProfile) {
+        return TaskbarManager.FLAG_HIDE_NAVBAR_WINDOW && deviceProfile.isPhone;
+    }
+
+    private boolean isTaskbarPresent(DeviceProfile deviceProfile) {
+        return FLAG_HIDE_NAVBAR_WINDOW || deviceProfile.isTaskbarPresent;
+    }
+
     public void onRotationProposal(int rotation, boolean isValid) {
         if (mTaskbarActivityContext != null) {
             mTaskbarActivityContext.onRotationProposal(rotation, isValid);
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarModelCallbacks.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarModelCallbacks.java
index 75881a3..5e670d294 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarModelCallbacks.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarModelCallbacks.java
@@ -29,6 +29,7 @@
 import com.android.launcher3.util.IntSet;
 import com.android.launcher3.util.ItemInfoMatcher;
 import com.android.launcher3.util.LauncherBindableItemsContainer;
+import com.android.quickstep.RecentsModel;
 
 import java.io.PrintWriter;
 import java.util.ArrayList;
@@ -42,7 +43,7 @@
  * Launcher model Callbacks for rendering taskbar.
  */
 public class TaskbarModelCallbacks implements
-        BgDataModel.Callbacks, LauncherBindableItemsContainer {
+        BgDataModel.Callbacks, LauncherBindableItemsContainer, RecentsModel.RunningTasksListener {
 
     private final SparseArray<ItemInfo> mHotseatItems = new SparseArray<>();
     private List<ItemInfo> mPredictedItems = Collections.emptyList();
@@ -61,6 +62,16 @@
 
     public void init(TaskbarControllers controllers) {
         mControllers = controllers;
+        if (mControllers.taskbarRecentAppsController.isEnabled()) {
+            RecentsModel.INSTANCE.get(mContext).registerRunningTasksListener(this);
+        }
+    }
+
+    /**
+     * Unregisters listeners in this class.
+     */
+    public void unregisterListeners() {
+        RecentsModel.INSTANCE.get(mContext).unregisterRunningTasksListener();
     }
 
     @Override
@@ -185,6 +196,8 @@
                 isHotseatEmpty = false;
             }
         }
+        hotseatItemInfos = mControllers.taskbarRecentAppsController
+                .updateHotseatItemInfos(hotseatItemInfos);
         mContainer.updateHotseatItems(hotseatItemInfos);
 
         final boolean finalIsHotseatEmpty = isHotseatEmpty;
@@ -196,6 +209,21 @@
     }
 
     @Override
+    public void onRunningTasksChanged() {
+        updateRunningApps();
+    }
+
+    /** Called when there's a change in running apps to update the UI. */
+    public void commitRunningAppsToUI() {
+        commitItemsToUI();
+    }
+
+    /** Call TaskbarRecentAppsController to update running apps with mHotseatItems. */
+    public void updateRunningApps() {
+        mControllers.taskbarRecentAppsController.updateRunningApps(mHotseatItems);
+    }
+
+    @Override
     public void bindDeepShortcutMap(HashMap<ComponentKey, Integer> deepShortcutMapCopy) {
         mControllers.taskbarPopupController.setDeepShortcutMap(deepShortcutMapCopy);
     }
@@ -203,6 +231,7 @@
     @Override
     public void bindAllApplications(AppInfo[] apps, int flags) {
         mControllers.taskbarAllAppsController.setApps(apps, flags);
+        mControllers.taskbarRecentAppsController.setApps(apps);
     }
 
     protected void dumpLogs(String prefix, PrintWriter pw) {
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarNavButtonController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarNavButtonController.java
index 60f50a9..a395548 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarNavButtonController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarNavButtonController.java
@@ -43,7 +43,7 @@
 import com.android.launcher3.R;
 import com.android.launcher3.logging.StatsLogManager;
 import com.android.launcher3.testing.TestLogging;
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 import com.android.quickstep.OverviewCommandHelper;
 import com.android.quickstep.SystemUiProxy;
 import com.android.quickstep.TaskUtils;
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarRecentAppsController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarRecentAppsController.java
new file mode 100644
index 0000000..8445cff
--- /dev/null
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarRecentAppsController.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.launcher3.taskbar;
+
+import android.util.SparseArray;
+
+import androidx.annotation.CallSuper;
+
+import com.android.launcher3.model.data.AppInfo;
+import com.android.launcher3.model.data.ItemInfo;
+
+/**
+ * Base class for providing recent apps functionality
+ */
+public class TaskbarRecentAppsController {
+
+    public static final TaskbarRecentAppsController DEFAULT = new TaskbarRecentAppsController();
+
+    // Initialized in init.
+    protected TaskbarControllers mControllers;
+
+    @CallSuper
+    protected void init(TaskbarControllers taskbarControllers) {
+        mControllers = taskbarControllers;
+    }
+
+    @CallSuper
+    protected void onDestroy() {
+        mControllers = null;
+    }
+
+    /** Stores the current {@link AppInfo} instances, no-op except in desktop environment. */
+    protected void setApps(AppInfo[] apps) { }
+
+    /**
+     * Indicates whether recent apps functionality is enabled, should return false except in
+     * desktop environment.
+     */
+    protected boolean isEnabled() {
+        return false;
+    }
+
+    /** Called to update hotseatItems, no-op except in desktop environment. */
+    protected ItemInfo[] updateHotseatItemInfos(ItemInfo[] hotseatItems) {
+        return hotseatItems;
+    }
+
+    /** Called to update the list of currently running apps, no-op except in desktop environment. */
+    protected void updateRunningApps(SparseArray<ItemInfo> hotseatItems) { }
+}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java
index 513f1bb..114ab4e 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java
@@ -20,6 +20,7 @@
 import static com.android.launcher3.LauncherState.ALL_APPS;
 import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASKBAR_LONGPRESS_HIDE;
 import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASKBAR_LONGPRESS_SHOW;
+import static com.android.launcher3.taskbar.TaskbarManager.isPhoneMode;
 import static com.android.launcher3.taskbar.Utilities.appendFlag;
 import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_IME_SHOWING;
 import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_IME_SWITCHER_SHOWING;
@@ -30,6 +31,7 @@
 import android.animation.AnimatorSet;
 import android.annotation.Nullable;
 import android.content.SharedPreferences;
+import android.content.res.Resources;
 import android.util.Log;
 import android.view.View;
 import android.view.ViewConfiguration;
@@ -38,9 +40,10 @@
 
 import com.android.internal.jank.InteractionJankMonitor;
 import com.android.launcher3.DeviceProfile;
+import com.android.launcher3.R;
 import com.android.launcher3.Utilities;
 import com.android.launcher3.anim.AnimatorListeners;
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 import com.android.launcher3.util.MultiValueAlpha.AlphaProperty;
 import com.android.quickstep.AnimatedFloat;
 import com.android.quickstep.SystemUiProxy;
@@ -69,6 +72,7 @@
     public static final int FLAG_IN_STASHED_LAUNCHER_STATE = 1 << 6;
     public static final int FLAG_STASHED_IN_APP_ALL_APPS = 1 << 7; // All apps is visible.
     public static final int FLAG_IN_SETUP = 1 << 8; // In the Setup Wizard
+    public static final int FLAG_STASHED_SMALL_SCREEN = 1 << 9; // phone screen gesture nav, stashed
 
     // If any of these flags are enabled, isInApp should return true.
     private static final int FLAGS_IN_APP = FLAG_IN_APP | FLAG_IN_SETUP;
@@ -76,7 +80,8 @@
     // If we're in an app and any of these flags are enabled, taskbar should be stashed.
     private static final int FLAGS_STASHED_IN_APP = FLAG_STASHED_IN_APP_MANUAL
             | FLAG_STASHED_IN_APP_PINNED | FLAG_STASHED_IN_APP_EMPTY | FLAG_STASHED_IN_APP_SETUP
-            | FLAG_STASHED_IN_APP_IME | FLAG_STASHED_IN_APP_ALL_APPS;
+            | FLAG_STASHED_IN_APP_IME | FLAG_STASHED_IN_APP_ALL_APPS |
+            FLAG_STASHED_SMALL_SCREEN;
 
     private static final int FLAGS_STASHED_IN_APP_IGNORING_IME =
             FLAGS_STASHED_IN_APP & ~FLAG_STASHED_IN_APP_IME;
@@ -166,15 +171,25 @@
                 boolean inApp = hasAnyFlag(flags, FLAGS_IN_APP);
                 boolean stashedInApp = hasAnyFlag(flags, FLAGS_STASHED_IN_APP);
                 boolean stashedLauncherState = hasAnyFlag(flags, FLAG_IN_STASHED_LAUNCHER_STATE);
-                return (inApp && stashedInApp) || (!inApp && stashedLauncherState);
+                boolean stashedForSmallScreen = hasAnyFlag(flags, FLAG_STASHED_SMALL_SCREEN);
+                return (inApp && stashedInApp) || (!inApp && stashedLauncherState)
+                        || stashedForSmallScreen;
             });
 
     public TaskbarStashController(TaskbarActivityContext activity) {
         mActivity = activity;
         mPrefs = Utilities.getPrefs(mActivity);
         mSystemUiProxy = SystemUiProxy.INSTANCE.get(activity);
-        mUnstashedHeight = mActivity.getDeviceProfile().taskbarSize;
-        mStashedHeight = mActivity.getDeviceProfile().stashedTaskbarSize;
+        if (isPhoneMode(mActivity.getDeviceProfile())) {
+            // DeviceProfile's taskbar vars aren't initialized w/ the flag off
+            Resources resources = mActivity.getResources();
+            mUnstashedHeight = resources.getDimensionPixelSize(R.dimen.taskbar_size);
+            mStashedHeight = resources.getDimensionPixelOffset(R.dimen.taskbar_stashed_size);
+        } else {
+            mUnstashedHeight = mActivity.getDeviceProfile().taskbarSize;
+            mStashedHeight = mActivity.getDeviceProfile().stashedTaskbarSize;
+        }
+
     }
 
     public void init(TaskbarControllers controllers, boolean setupUIVisible) {
@@ -202,6 +217,7 @@
         updateStateForFlag(FLAG_STASHED_IN_APP_MANUAL, isManuallyStashedInApp);
         updateStateForFlag(FLAG_STASHED_IN_APP_SETUP, isInSetup);
         updateStateForFlag(FLAG_IN_SETUP, isInSetup);
+        updateStateForFlag(FLAG_STASHED_SMALL_SCREEN, isPhoneMode(mActivity.getDeviceProfile()));
         applyState();
 
         notifyStashChange(/* visible */ false, /* stashed */ isStashedInApp());
@@ -212,7 +228,8 @@
      * state.
      */
     public boolean supportsVisualStashing() {
-        return mControllers.uiController.supportsVisualStashing();
+        return mControllers.uiController.supportsVisualStashing() ||
+                isPhoneMode(mActivity.getDeviceProfile());
     }
 
     /**
@@ -266,7 +283,7 @@
      * Returns whether the taskbar should be stashed in the current LauncherState.
      */
     public boolean isInStashedLauncherState() {
-        return hasAnyFlag(FLAG_IN_STASHED_LAUNCHER_STATE) && supportsVisualStashing();
+        return (hasAnyFlag(FLAG_IN_STASHED_LAUNCHER_STATE) && supportsVisualStashing());
     }
 
     private boolean hasAnyFlag(int flagMask) {
@@ -295,6 +312,10 @@
      * @see WindowInsets.Type#systemBars()
      */
     public int getContentHeightToReportToApps() {
+        if (isPhoneMode(mActivity.getDeviceProfile())) {
+            return getStashedHeight();
+        }
+
         if (supportsVisualStashing() && hasAnyFlag(FLAGS_REPORT_STASHED_INSETS_TO_APP)) {
             DeviceProfile dp = mActivity.getDeviceProfile();
             if (hasAnyFlag(FLAG_STASHED_IN_APP_SETUP) && dp.isTaskbarPresent && !dp.isLandscape) {
@@ -410,11 +431,18 @@
         }
         mAnimator = new AnimatorSet();
         addJankMonitorListener(mAnimator, /* appearing= */ !mIsStashed);
+        final float stashTranslation = isPhoneMode(mActivity.getDeviceProfile()) ? 0 :
+                (mUnstashedHeight - mStashedHeight) / 2f;
 
         if (!supportsVisualStashing()) {
             // Just hide/show the icons and background instead of stashing into a handle.
             mAnimator.play(mIconAlphaForStash.animateToValue(isStashed ? 0 : 1)
                     .setDuration(duration));
+            mAnimator.playTogether(mTaskbarBackgroundOffset.animateToValue(isStashed ? 1 : 0)
+                    .setDuration(duration));
+            mAnimator.playTogether(mIconTranslationYForStash.animateToValue(isStashed ?
+                            stashTranslation : 0)
+                    .setDuration(duration));
             mAnimator.play(mTaskbarImeBgAlpha.animateToValue(
                     hasAnyFlag(FLAG_STASHED_IN_APP_IME) ? 0 : 1).setDuration(duration));
             mAnimator.setStartDelay(startDelay);
@@ -438,7 +466,6 @@
         if (isStashed) {
             firstHalfDurationScale = 0.75f;
             secondHalfDurationScale = 0.5f;
-            final float stashTranslation = (mUnstashedHeight - mStashedHeight) / 2f;
 
             fullLengthAnimatorSet.play(mIconTranslationYForStash.animateToValue(stashTranslation));
             if (animateBg) {
@@ -450,7 +477,8 @@
 
             firstHalfAnimatorSet.playTogether(
                     mIconAlphaForStash.animateToValue(0),
-                    mIconScaleForStash.animateToValue(STASHED_TASKBAR_SCALE)
+                    mIconScaleForStash.animateToValue(isPhoneMode(mActivity.getDeviceProfile()) ?
+                            0 : STASHED_TASKBAR_SCALE)
             );
             secondHalfAnimatorSet.playTogether(
                     mTaskbarStashedHandleAlpha.animateToValue(1)
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java
index ea15acb..dbf9759 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java
@@ -314,10 +314,10 @@
                 int qsbEnd;
                 if (layoutRtl) {
                     qsbStart = iconEnd + mItemMarginLeftRight;
-                    qsbEnd = qsbStart + deviceProfile.qsbWidth;
+                    qsbEnd = qsbStart + deviceProfile.hotseatQsbWidth;
                 } else {
                     qsbEnd = iconEnd - mItemMarginLeftRight;
-                    qsbStart = qsbEnd - deviceProfile.qsbWidth;
+                    qsbStart = qsbEnd - deviceProfile.hotseatQsbWidth;
                 }
                 int qsbTop = (bottom - top - deviceProfile.hotseatQsbHeight) / 2;
                 int qsbBottom = qsbTop + deviceProfile.hotseatQsbHeight;
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java
index 6d45fd2..929dc20 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java
@@ -20,6 +20,7 @@
 import static com.android.launcher3.Utilities.squaredHypot;
 import static com.android.launcher3.anim.Interpolators.LINEAR;
 import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASKBAR_ALLAPPS_BUTTON_TAP;
+import static com.android.launcher3.taskbar.TaskbarManager.isPhoneMode;
 import static com.android.quickstep.AnimatedFloat.VALUE;
 
 import android.annotation.NonNull;
@@ -35,6 +36,7 @@
 import com.android.launcher3.BubbleTextView;
 import com.android.launcher3.DeviceProfile;
 import com.android.launcher3.LauncherAppState;
+import com.android.launcher3.R;
 import com.android.launcher3.Utilities;
 import com.android.launcher3.anim.AlphaUpdateListener;
 import com.android.launcher3.anim.AnimatorPlaybackController;
@@ -108,7 +110,9 @@
     public void init(TaskbarControllers controllers) {
         mControllers = controllers;
         mTaskbarView.init(new TaskbarViewCallbacks());
-        mTaskbarView.getLayoutParams().height = mActivity.getDeviceProfile().taskbarSize;
+        mTaskbarView.getLayoutParams().height = isPhoneMode(mActivity.getDeviceProfile())
+                ? mActivity.getResources().getDimensionPixelSize(R.dimen.taskbar_size)
+                : mActivity.getDeviceProfile().taskbarSize;
         mThemeIconsColor = ThemedIconDrawable.getColors(mTaskbarView.getContext())[0];
 
         mTaskbarIconScaleForStash.updateValue(1f);
@@ -126,6 +130,7 @@
 
     public void onDestroy() {
         LauncherAppState.getInstance(mActivity).getModel().removeCallbacks(mModelCallbacks);
+        mModelCallbacks.unregisterListeners();
     }
 
     public boolean areIconsVisible() {
@@ -290,10 +295,11 @@
                 boolean isRtl = Utilities.isRtl(child.getResources());
                 float hotseatIconCenter = isRtl
                         ? launcherDp.widthPx - hotseatPadding.right + borderSpacing
-                        + launcherDp.qsbWidth / 2f
-                        : hotseatPadding.left - borderSpacing - launcherDp.qsbWidth / 2f;
+                        + launcherDp.hotseatQsbWidth / 2f
+                        : hotseatPadding.left - borderSpacing - launcherDp.hotseatQsbWidth / 2f;
                 float childCenter = (child.getLeft() + child.getRight()) / 2f;
-                float halfQsbIconWidthDiff = (launcherDp.qsbWidth - taskbarDp.iconSizePx) / 2f;
+                float halfQsbIconWidthDiff =
+                        (launcherDp.hotseatQsbWidth - taskbarDp.iconSizePx) / 2f;
                 setter.addFloat(child, ICON_TRANSLATE_X,
                         isRtl ? -halfQsbIconWidthDiff : halfQsbIconWidthDiff,
                         hotseatIconCenter - childCenter, LINEAR);
@@ -307,7 +313,7 @@
                                 : Interpolators.clampToProgress(LINEAR, 0.84f, 1f));
                 setter.addOnFrameListener(animator -> AlphaUpdateListener.updateVisibility(child));
 
-                float qsbInsetFraction = halfQsbIconWidthDiff / launcherDp.qsbWidth;
+                float qsbInsetFraction = halfQsbIconWidthDiff / launcherDp.hotseatQsbWidth;
                 if (child instanceof  HorizontalInsettableView) {
                     setter.addFloat((HorizontalInsettableView) child,
                             HorizontalInsettableView.HORIZONTAL_INSETS, qsbInsetFraction, 0,
@@ -389,6 +395,16 @@
         mModelCallbacks.dumpLogs(prefix + "\t", pw);
     }
 
+    /** Called when there's a change in running apps to update the UI. */
+    public void commitRunningAppsToUI() {
+        mModelCallbacks.commitRunningAppsToUI();
+    }
+
+    /** Call TaskbarModelCallbacks to update running apps. */
+    public void updateRunningApps() {
+        mModelCallbacks.updateRunningApps();
+    }
+
     /**
      * Callbacks for {@link TaskbarView} to interact with its controller.
      */
diff --git a/quickstep/src/com/android/launcher3/taskbar/VoiceInteractionWindowController.kt b/quickstep/src/com/android/launcher3/taskbar/VoiceInteractionWindowController.kt
index 946873e..81acda3 100644
--- a/quickstep/src/com/android/launcher3/taskbar/VoiceInteractionWindowController.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/VoiceInteractionWindowController.kt
@@ -36,7 +36,10 @@
 
                 override fun draw(canvas: Canvas) {
                     super.draw(canvas)
-                    taskbarBackgroundRenderer.draw(canvas)
+                    if (this@VoiceInteractionWindowController.context.isGestureNav
+                        && controllers.taskbarStashController.isInAppAndNotStashed) {
+                        taskbarBackgroundRenderer.draw(canvas)
+                    }
                 }
             }
         separateWindowForTaskbarBackground.recreateControllers()
@@ -74,18 +77,20 @@
             fadeStashedHandle.end()
         }
 
-        if (context.isGestureNav && controllers.taskbarStashController.isInAppAndNotStashed) {
-            moveTaskbarBackgroundToLowerLayer()
-        }
+        moveTaskbarBackgroundToAppropriateLayer()
     }
 
     /**
+     * Either:
      * Hides the TaskbarDragLayer background and creates a new window to draw just that background.
+     * OR
+     * Removes the temporary window and show the TaskbarDragLayer background again.
      */
-    private fun moveTaskbarBackgroundToLowerLayer() {
+    private fun moveTaskbarBackgroundToAppropriateLayer() {
         val taskbarBackgroundOverride = controllers.taskbarDragLayerController
             .overrideBackgroundAlpha
-        if (isVoiceInteractionWindowVisible) {
+        val moveToLowerLayer = isVoiceInteractionWindowVisible
+        if (moveToLowerLayer) {
             // First add the temporary window, then hide the overlapping taskbar background.
             context.addWindowView(separateWindowForTaskbarBackground, separateWindowLayoutParams)
             ViewRootSync.synchronizeNextDraw(separateWindowForTaskbarBackground, context.dragLayer
diff --git a/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsContext.java b/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsContext.java
index e2f7522..c76180e 100644
--- a/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsContext.java
+++ b/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsContext.java
@@ -43,7 +43,7 @@
 import com.android.launcher3.taskbar.TaskbarDragController;
 import com.android.launcher3.taskbar.TaskbarStashController;
 import com.android.launcher3.testing.TestLogging;
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 import com.android.launcher3.util.OnboardingPrefs;
 import com.android.launcher3.util.TouchController;
 import com.android.launcher3.views.BaseDragLayer;
diff --git a/quickstep/src/com/android/launcher3/uioverrides/BaseRecentsViewStateController.java b/quickstep/src/com/android/launcher3/uioverrides/BaseRecentsViewStateController.java
index 7166a3e..ea0972f 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/BaseRecentsViewStateController.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/BaseRecentsViewStateController.java
@@ -23,26 +23,33 @@
 import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_FADE;
 import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_MODAL;
 import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_SCALE;
+import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_SPLIT_SELECT_FLOATING_TASK_TRANSLATE_OFFSCREEN;
+import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_SPLIT_SELECT_INSTRUCTIONS_FADE;
 import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_TRANSLATE_X;
 import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_TRANSLATE_Y;
 import static com.android.launcher3.states.StateAnimationConfig.SKIP_OVERVIEW;
-import static com.android.launcher3.testing.TestProtocol.BAD_STATE;
 import static com.android.quickstep.views.RecentsView.ADJACENT_PAGE_HORIZONTAL_OFFSET;
+import static com.android.quickstep.views.RecentsView.FIRST_FLOATING_TASK_TRANSLATE_OFFSCREEN;
 import static com.android.quickstep.views.RecentsView.OVERVIEW_PROGRESS;
 import static com.android.quickstep.views.RecentsView.RECENTS_GRID_PROGRESS;
 import static com.android.quickstep.views.RecentsView.RECENTS_SCALE_PROPERTY;
+import static com.android.quickstep.views.RecentsView.SPLIT_INSTRUCTIONS_FADE;
 import static com.android.quickstep.views.RecentsView.TASK_SECONDARY_TRANSLATION;
 
+import android.graphics.Rect;
+import android.graphics.RectF;
 import android.util.FloatProperty;
-import android.util.Log;
 
 import androidx.annotation.NonNull;
 
 import com.android.launcher3.BaseQuickstepLauncher;
 import com.android.launcher3.LauncherState;
+import com.android.launcher3.Utilities;
 import com.android.launcher3.anim.PendingAnimation;
+import com.android.launcher3.dragndrop.DragLayer;
 import com.android.launcher3.statemanager.StateManager.StateHandler;
 import com.android.launcher3.states.StateAnimationConfig;
+import com.android.quickstep.views.FloatingTaskView;
 import com.android.quickstep.views.RecentsView;
 
 /**
@@ -68,10 +75,7 @@
         ADJACENT_PAGE_HORIZONTAL_OFFSET.set(mRecentsView, scaleAndOffset[1]);
         TASK_SECONDARY_TRANSLATION.set(mRecentsView, 0f);
 
-        float recentsAlpha = state.overviewUi ? 1f : 0;
-        Log.d(BAD_STATE, "BaseRecentsViewStateController setState state=" + state
-                + ", alpha=" + recentsAlpha);
-        getContentAlphaProperty().set(mRecentsView, recentsAlpha);
+        getContentAlphaProperty().set(mRecentsView, state.overviewUi ? 1f : 0);
         getTaskModalnessProperty().set(mRecentsView, state.getOverviewModalness());
         RECENTS_GRID_PROGRESS.set(mRecentsView,
                 state.displayOverviewTasksAsGrid(mLauncher.getDeviceProfile()) ? 1f : 0f);
@@ -81,8 +85,6 @@
     @Override
     public void setStateWithAnimation(LauncherState toState, StateAnimationConfig config,
             PendingAnimation builder) {
-        Log.d(BAD_STATE, "BaseRecentsViewStateController setStateWithAnimation state=" + toState
-                + ", config.skipOverview=" + config.hasAnimationFlag(SKIP_OVERVIEW));
         if (config.hasAnimationFlag(SKIP_OVERVIEW)) {
             return;
         }
@@ -106,10 +108,50 @@
         setter.setFloat(mRecentsView, TASK_SECONDARY_TRANSLATION, 0f,
                 config.getInterpolator(ANIM_OVERVIEW_TRANSLATE_Y, LINEAR));
 
-        float recentsAlpha = toState.overviewUi ? 1 : 0;
-        Log.d(BAD_STATE, "BaseRecentsViewStateController setStateWithAnimationInternal toState="
-                + toState + ", alpha=" + recentsAlpha);
-        setter.setFloat(mRecentsView, getContentAlphaProperty(), recentsAlpha,
+        if (mRecentsView.isSplitSelectionActive()) {
+            // TODO (b/238651489): Refactor state management to avoid need for double check
+            FloatingTaskView floatingTask = mRecentsView.getFirstFloatingTaskView();
+            if (floatingTask != null) {
+                DragLayer dragLayer = mLauncher.getDragLayer();
+                RectF onScreenRectF = new RectF();
+                Utilities.getBoundsForViewInDragLayer(mLauncher.getDragLayer(), floatingTask,
+                        new Rect(0, 0, floatingTask.getWidth(), floatingTask.getHeight()),
+                        false, null, onScreenRectF);
+                // Get the part of the floatingTask that intersects with the DragLayer (i.e. the
+                // on-screen portion)
+                onScreenRectF.intersect(
+                        dragLayer.getLeft(),
+                        dragLayer.getTop(),
+                        dragLayer.getRight(),
+                        dragLayer.getBottom()
+                );
+
+                setter.setFloat(
+                        mRecentsView,
+                        FIRST_FLOATING_TASK_TRANSLATE_OFFSCREEN,
+                        mRecentsView.getPagedOrientationHandler()
+                                .getFloatingTaskOffscreenTranslationTarget(
+                                        floatingTask,
+                                        onScreenRectF,
+                                        floatingTask.getStagePosition(),
+                                        mLauncher.getDeviceProfile()
+                                ),
+                        config.getInterpolator(
+                                ANIM_OVERVIEW_SPLIT_SELECT_FLOATING_TASK_TRANSLATE_OFFSCREEN,
+                                LINEAR
+                        ));
+                setter.setFloat(
+                        mRecentsView,
+                        SPLIT_INSTRUCTIONS_FADE,
+                        1,
+                        config.getInterpolator(
+                                ANIM_OVERVIEW_SPLIT_SELECT_INSTRUCTIONS_FADE,
+                                LINEAR
+                        ));
+            }
+        }
+
+        setter.setFloat(mRecentsView, getContentAlphaProperty(), toState.overviewUi ? 1 : 0,
                 config.getInterpolator(ANIM_OVERVIEW_FADE, AGGRESSIVE_EASE_IN_OUT));
 
         setter.setFloat(
diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
index 4bb4343..21f03be 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
@@ -28,10 +28,10 @@
 import static com.android.launcher3.compat.AccessibilityManagerCompat.sendCustomAccessibilityEvent;
 import static com.android.launcher3.config.FeatureFlags.ENABLE_QUICKSTEP_WIDGET_APP_START;
 import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_APP_LAUNCH_TAP;
-import static com.android.launcher3.testing.TestProtocol.HINT_STATE_ORDINAL;
-import static com.android.launcher3.testing.TestProtocol.HINT_STATE_TWO_BUTTON_ORDINAL;
-import static com.android.launcher3.testing.TestProtocol.OVERVIEW_STATE_ORDINAL;
-import static com.android.launcher3.testing.TestProtocol.QUICK_SWITCH_STATE_ORDINAL;
+import static com.android.launcher3.testing.shared.TestProtocol.HINT_STATE_ORDINAL;
+import static com.android.launcher3.testing.shared.TestProtocol.HINT_STATE_TWO_BUTTON_ORDINAL;
+import static com.android.launcher3.testing.shared.TestProtocol.OVERVIEW_STATE_ORDINAL;
+import static com.android.launcher3.testing.shared.TestProtocol.QUICK_SWITCH_STATE_ORDINAL;
 import static com.android.systemui.shared.system.ActivityManagerWrapper.CLOSE_SYSTEM_WINDOWS_REASON_HOME_KEY;
 
 import android.content.Intent;
diff --git a/quickstep/src/com/android/launcher3/uioverrides/states/OverviewState.java b/quickstep/src/com/android/launcher3/uioverrides/states/OverviewState.java
index c4c9038..6f07568 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/states/OverviewState.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/states/OverviewState.java
@@ -37,6 +37,10 @@
  */
 public class OverviewState extends LauncherState {
 
+    private static final int OVERVIEW_SLIDE_IN_DURATION = 380;
+    private static final int OVERVIEW_POP_IN_DURATION = 250;
+    private static final int OVERVIEW_EXIT_DURATION = 250;
+
     protected static final Rect sTempRect = new Rect();
 
     private static final int STATE_FLAGS = FLAG_WORKSPACE_ICONS_CAN_BE_DRAGGED
@@ -57,8 +61,15 @@
 
     @Override
     public int getTransitionDuration(Context context, boolean isToState) {
-        // In gesture modes, overview comes in all the way from the side, so give it more time.
-        return DisplayController.getNavigationMode(context).hasGestures ? 380 : 250;
+        if (isToState) {
+            // In gesture modes, overview comes in all the way from the side, so give it more time.
+            return DisplayController.getNavigationMode(context).hasGestures
+                    ? OVERVIEW_SLIDE_IN_DURATION
+                    : OVERVIEW_POP_IN_DURATION;
+        } else {
+            // When exiting Overview, exit quickly.
+            return OVERVIEW_EXIT_DURATION;
+        }
     }
 
     @Override
diff --git a/quickstep/src/com/android/launcher3/uioverrides/states/QuickstepAtomicAnimationFactory.java b/quickstep/src/com/android/launcher3/uioverrides/states/QuickstepAtomicAnimationFactory.java
index 4d2f965..872e64a 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/states/QuickstepAtomicAnimationFactory.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/states/QuickstepAtomicAnimationFactory.java
@@ -22,13 +22,15 @@
 import static com.android.launcher3.LauncherState.HINT_STATE_TWO_BUTTON;
 import static com.android.launcher3.LauncherState.NORMAL;
 import static com.android.launcher3.LauncherState.OVERVIEW;
+import static com.android.launcher3.LauncherState.OVERVIEW_SPLIT_SELECT;
 import static com.android.launcher3.WorkspaceStateTransitionAnimation.getWorkspaceSpringScaleAnimator;
 import static com.android.launcher3.anim.Interpolators.ACCEL;
 import static com.android.launcher3.anim.Interpolators.ACCEL_DEACCEL;
 import static com.android.launcher3.anim.Interpolators.DEACCEL;
 import static com.android.launcher3.anim.Interpolators.DEACCEL_1_7;
 import static com.android.launcher3.anim.Interpolators.DEACCEL_3;
-import static com.android.launcher3.anim.Interpolators.FAST_OUT_SLOW_IN;
+import static com.android.launcher3.anim.Interpolators.EMPHASIZED_ACCELERATE;
+import static com.android.launcher3.anim.Interpolators.EMPHASIZED_DECELERATE;
 import static com.android.launcher3.anim.Interpolators.FINAL_FRAME;
 import static com.android.launcher3.anim.Interpolators.INSTANT;
 import static com.android.launcher3.anim.Interpolators.LINEAR;
@@ -39,6 +41,8 @@
 import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_ACTIONS_FADE;
 import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_FADE;
 import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_SCALE;
+import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_SPLIT_SELECT_FLOATING_TASK_TRANSLATE_OFFSCREEN;
+import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_SPLIT_SELECT_INSTRUCTIONS_FADE;
 import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_TRANSLATE_X;
 import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_TRANSLATE_Y;
 import static com.android.launcher3.states.StateAnimationConfig.ANIM_SCRIM_FADE;
@@ -87,9 +91,16 @@
     public void prepareForAtomicAnimation(LauncherState fromState, LauncherState toState,
             StateAnimationConfig config) {
         RecentsView overview = mActivity.getOverviewPanel();
-        if (toState == NORMAL && fromState == OVERVIEW) {
+        if ((fromState == OVERVIEW || fromState == OVERVIEW_SPLIT_SELECT) && toState == NORMAL) {
+            if (fromState == OVERVIEW_SPLIT_SELECT) {
+                config.setInterpolator(ANIM_OVERVIEW_SPLIT_SELECT_FLOATING_TASK_TRANSLATE_OFFSCREEN,
+                        clampToProgress(EMPHASIZED_ACCELERATE, 0, 0.4f));
+                config.setInterpolator(ANIM_OVERVIEW_SPLIT_SELECT_INSTRUCTIONS_FADE,
+                        clampToProgress(LINEAR, 0, 0.33f));
+            }
+
             config.setInterpolator(ANIM_OVERVIEW_ACTIONS_FADE, clampToProgress(LINEAR, 0, 0.25f));
-            config.setInterpolator(ANIM_SCRIM_FADE, LINEAR);
+            config.setInterpolator(ANIM_SCRIM_FADE, clampToProgress(LINEAR, 0.33f, 1));
             config.setInterpolator(ANIM_WORKSPACE_SCALE, DEACCEL);
             config.setInterpolator(ANIM_WORKSPACE_FADE, ACCEL);
 
@@ -98,8 +109,7 @@
                 // Overview is going offscreen, so keep it at its current scale and opacity.
                 config.setInterpolator(ANIM_OVERVIEW_SCALE, FINAL_FRAME);
                 config.setInterpolator(ANIM_OVERVIEW_FADE, FINAL_FRAME);
-                config.setInterpolator(ANIM_OVERVIEW_TRANSLATE_X,
-                        clampToProgress(FAST_OUT_SLOW_IN, 0, 0.75f));
+                config.setInterpolator(ANIM_OVERVIEW_TRANSLATE_X, EMPHASIZED_DECELERATE);
                 config.setInterpolator(ANIM_OVERVIEW_TRANSLATE_Y, FINAL_FRAME);
             } else {
                 config.setInterpolator(ANIM_OVERVIEW_TRANSLATE_X, ACCEL_DEACCEL);
diff --git a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonQuickSwitchTouchController.java b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonQuickSwitchTouchController.java
index f294986..bc76487 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonQuickSwitchTouchController.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonQuickSwitchTouchController.java
@@ -39,7 +39,6 @@
 import static com.android.launcher3.states.StateAnimationConfig.SKIP_ALL_ANIMATIONS;
 import static com.android.launcher3.states.StateAnimationConfig.SKIP_OVERVIEW;
 import static com.android.launcher3.states.StateAnimationConfig.SKIP_SCRIM;
-import static com.android.launcher3.testing.TestProtocol.BAD_STATE;
 import static com.android.launcher3.touch.BothAxesSwipeDetector.DIRECTION_RIGHT;
 import static com.android.launcher3.touch.BothAxesSwipeDetector.DIRECTION_UP;
 import static com.android.launcher3.util.window.RefreshRateTracker.getSingleFrameMs;
@@ -56,7 +55,6 @@
 import android.animation.AnimatorListenerAdapter;
 import android.animation.ValueAnimator;
 import android.graphics.PointF;
-import android.util.Log;
 import android.view.MotionEvent;
 import android.view.animation.Interpolator;
 
@@ -227,7 +225,6 @@
         // Set RecentView's initial properties.
         RECENTS_SCALE_PROPERTY.set(mRecentsView, fromState.getOverviewScaleAndOffset(mLauncher)[0]);
         ADJACENT_PAGE_HORIZONTAL_OFFSET.set(mRecentsView, 1f);
-        Log.d(BAD_STATE, "NBQSTC setupOverviewAnimators setContentAlpha=1");
         mRecentsView.setContentAlpha(1);
         mRecentsView.setFullscreenProgress(fromState.getOverviewFullscreenProgress());
         mLauncher.getActionsView().getVisibilityAlpha().setValue(
@@ -247,24 +244,6 @@
                 QUICK_SWITCH.getWorkspaceScrimColor(mLauncher), LINEAR);
         if (mRecentsView.getTaskViewCount() == 0) {
             xAnim.addFloat(mRecentsView, CONTENT_ALPHA, 0f, 1f, LINEAR);
-            Log.d(BAD_STATE, "NBQSTC setupOverviewAnimators from: 0 to: 1");
-            xAnim.addListener(new AnimatorListenerAdapter() {
-                @Override
-                public void onAnimationStart(Animator animation) {
-                    Log.d(BAD_STATE, "NBQSTC setupOverviewAnimators onStart");
-                }
-
-                @Override
-                public void onAnimationCancel(Animator animation) {
-                    float alpha = mRecentsView == null ? -1 : CONTENT_ALPHA.get(mRecentsView);
-                    Log.d(BAD_STATE, "NBQSTC setupOverviewAnimators onCancel, alpha=" + alpha);
-                }
-
-                @Override
-                public void onAnimationEnd(Animator animation) {
-                    Log.d(BAD_STATE, "NBQSTC setupOverviewAnimators onEnd");
-                }
-            });
         }
         mXOverviewAnim = xAnim.createPlaybackController();
         mXOverviewAnim.dispatchOnStart();
diff --git a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/QuickSwitchTouchController.java b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/QuickSwitchTouchController.java
index d1b0a9c..e5cd53a 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/QuickSwitchTouchController.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/QuickSwitchTouchController.java
@@ -29,7 +29,6 @@
 import static com.android.launcher3.states.StateAnimationConfig.ANIM_VERTICAL_PROGRESS;
 import static com.android.launcher3.states.StateAnimationConfig.ANIM_WORKSPACE_FADE;
 import static com.android.launcher3.states.StateAnimationConfig.ANIM_WORKSPACE_TRANSLATE;
-import static com.android.launcher3.testing.TestProtocol.BAD_STATE;
 import static com.android.launcher3.util.SystemUiController.UI_STATE_FULLSCREEN_TASK;
 import static com.android.quickstep.views.RecentsView.ADJACENT_PAGE_HORIZONTAL_OFFSET;
 import static com.android.quickstep.views.RecentsView.RECENTS_SCALE_PROPERTY;
@@ -37,7 +36,6 @@
 import static com.android.systemui.shared.system.ActivityManagerWrapper.CLOSE_SYSTEM_WINDOWS_REASON_RECENTS;
 import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_OVERVIEW_DISABLED;
 
-import android.util.Log;
 import android.view.MotionEvent;
 
 import com.android.launcher3.Launcher;
@@ -114,7 +112,6 @@
         RECENTS_SCALE_PROPERTY.set(mOverviewPanel,
                 QUICK_SWITCH.getOverviewScaleAndOffset(mLauncher)[0] * 0.85f);
         ADJACENT_PAGE_HORIZONTAL_OFFSET.set(mOverviewPanel, 1f);
-        Log.d(BAD_STATE, "QuickSwitchTouchController initCurrentAnimation setContentAlpha=1");
         mOverviewPanel.setContentAlpha(1);
 
         mCurrentAnimation = mLauncher.getStateManager()
diff --git a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TwoButtonNavbarTouchController.java b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TwoButtonNavbarTouchController.java
index e2747df..9f2c1d4 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TwoButtonNavbarTouchController.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TwoButtonNavbarTouchController.java
@@ -24,13 +24,11 @@
 
 import android.animation.ValueAnimator;
 import android.os.SystemClock;
-import android.util.Log;
 import android.view.MotionEvent;
 
 import com.android.launcher3.AbstractFloatingView;
 import com.android.launcher3.Launcher;
 import com.android.launcher3.LauncherState;
-import com.android.launcher3.testing.TestProtocol;
 import com.android.launcher3.touch.AbstractStateChangeTouchController;
 import com.android.launcher3.touch.SingleAxisSwipeDetector;
 import com.android.quickstep.SystemUiProxy;
diff --git a/quickstep/src/com/android/quickstep/OrientationTouchTransformer.java b/quickstep/src/com/android/quickstep/OrientationTouchTransformer.java
index 895cf89..47c5dd0 100644
--- a/quickstep/src/com/android/quickstep/OrientationTouchTransformer.java
+++ b/quickstep/src/com/android/quickstep/OrientationTouchTransformer.java
@@ -32,7 +32,7 @@
 import android.view.Surface;
 
 import com.android.launcher3.R;
-import com.android.launcher3.ResourceUtils;
+import com.android.launcher3.testing.shared.ResourceUtils;
 import com.android.launcher3.util.DisplayController.Info;
 import com.android.launcher3.util.DisplayController.NavigationMode;
 import com.android.launcher3.util.window.CachedDisplayInfo;
diff --git a/quickstep/src/com/android/quickstep/QuickstepTestInformationHandler.java b/quickstep/src/com/android/quickstep/QuickstepTestInformationHandler.java
index 528fb97..9bd0cb9 100644
--- a/quickstep/src/com/android/quickstep/QuickstepTestInformationHandler.java
+++ b/quickstep/src/com/android/quickstep/QuickstepTestInformationHandler.java
@@ -8,7 +8,7 @@
 import androidx.annotation.Nullable;
 
 import com.android.launcher3.testing.TestInformationHandler;
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 import com.android.launcher3.touch.PagedOrientationHandler;
 import com.android.quickstep.util.LayoutUtils;
 
diff --git a/quickstep/src/com/android/quickstep/RecentTasksList.java b/quickstep/src/com/android/quickstep/RecentTasksList.java
index cd93dbe..813e687 100644
--- a/quickstep/src/com/android/quickstep/RecentTasksList.java
+++ b/quickstep/src/com/android/quickstep/RecentTasksList.java
@@ -62,6 +62,10 @@
     private TaskLoadResult mResultsBg = INVALID_RESULT;
     private TaskLoadResult mResultsUi = INVALID_RESULT;
 
+    private RecentsModel.RunningTasksListener mRunningTasksListener;
+    // Tasks are stored in order of least recently launched to most recently launched.
+    private ArrayList<ActivityManager.RunningTaskInfo> mRunningTasks;
+
     public RecentTasksList(LooperExecutor mainThreadExecutor,
             KeyguardManagerCompat keyguardManager, SystemUiProxy sysUiProxy) {
         mMainThreadExecutor = mainThreadExecutor;
@@ -73,7 +77,26 @@
             public void onRecentTasksChanged() throws RemoteException {
                 mMainThreadExecutor.execute(RecentTasksList.this::onRecentTasksChanged);
             }
+
+            @Override
+            public void onRunningTaskAppeared(ActivityManager.RunningTaskInfo taskInfo) {
+                mMainThreadExecutor.execute(() -> {
+                    RecentTasksList.this.onRunningTaskAppeared(taskInfo);
+                });
+            }
+
+            @Override
+            public void onRunningTaskVanished(ActivityManager.RunningTaskInfo taskInfo) {
+                mMainThreadExecutor.execute(() -> {
+                    RecentTasksList.this.onRunningTaskVanished(taskInfo);
+                });
+            }
         });
+        // We may receive onRunningTaskAppeared events later for tasks which have already been
+        // included in the list returned by mSysUiProxy.getRunningTasks(), or may receive
+        // onRunningTaskVanished for tasks not included in the returned list. These cases will be
+        // addressed when the tasks are added to/removed from mRunningTasks.
+        initRunningTasks(mSysUiProxy.getRunningTasks(Integer.MAX_VALUE));
     }
 
     @VisibleForTesting
@@ -154,6 +177,59 @@
         mChangeId++;
     }
 
+     /**
+     * Registers a listener for running tasks
+     */
+    public void registerRunningTasksListener(RecentsModel.RunningTasksListener listener) {
+        mRunningTasksListener = listener;
+    }
+
+    /**
+     * Removes the previously registered running tasks listener
+     */
+    public void unregisterRunningTasksListener() {
+        mRunningTasksListener = null;
+    }
+
+    private void initRunningTasks(ArrayList<ActivityManager.RunningTaskInfo> runningTasks) {
+        // Tasks are retrieved in order of most recently launched/used to least recently launched.
+        mRunningTasks = new ArrayList<>(runningTasks);
+        Collections.reverse(mRunningTasks);
+    }
+
+    /**
+     * Gets the set of running tasks.
+     */
+    public ArrayList<ActivityManager.RunningTaskInfo> getRunningTasks() {
+        return mRunningTasks;
+    }
+
+    private void onRunningTaskAppeared(ActivityManager.RunningTaskInfo taskInfo) {
+        // Make sure this task is not already in the list
+        for (ActivityManager.RunningTaskInfo existingTask : mRunningTasks) {
+            if (taskInfo.taskId == existingTask.taskId) {
+                return;
+            }
+        }
+        mRunningTasks.add(taskInfo);
+        if (mRunningTasksListener != null) {
+            mRunningTasksListener.onRunningTasksChanged();
+        }
+    }
+
+    private void onRunningTaskVanished(ActivityManager.RunningTaskInfo taskInfo) {
+        // Find the task from the list of running tasks, if it exists
+        for (ActivityManager.RunningTaskInfo existingTask : mRunningTasks) {
+            if (existingTask.taskId != taskInfo.taskId) continue;
+
+            mRunningTasks.remove(existingTask);
+            if (mRunningTasksListener != null) {
+                mRunningTasksListener.onRunningTasksChanged();
+            }
+            return;
+        }
+    }
+
     /**
      * Loads and creates a list of all the recent tasks.
      */
diff --git a/quickstep/src/com/android/quickstep/RecentsActivity.java b/quickstep/src/com/android/quickstep/RecentsActivity.java
index 67ce606..4435eda 100644
--- a/quickstep/src/com/android/quickstep/RecentsActivity.java
+++ b/quickstep/src/com/android/quickstep/RecentsActivity.java
@@ -23,8 +23,7 @@
 import static com.android.launcher3.QuickstepTransitionManager.STATUS_BAR_TRANSITION_PRE_DELAY;
 import static com.android.launcher3.config.FeatureFlags.ENABLE_QUICKSTEP_LIVE_TILE;
 import static com.android.launcher3.graphics.SysUiScrim.SYSUI_PROGRESS;
-import static com.android.launcher3.testing.TestProtocol.BAD_STATE;
-import static com.android.launcher3.testing.TestProtocol.OVERVIEW_STATE_ORDINAL;
+import static com.android.launcher3.testing.shared.TestProtocol.OVERVIEW_STATE_ORDINAL;
 import static com.android.quickstep.OverviewComponentObserver.startHomeIntentSafely;
 import static com.android.quickstep.TaskUtils.taskIsATargetWithMode;
 import static com.android.quickstep.TaskViewUtils.createRecentsWindowAnimator;
@@ -39,7 +38,6 @@
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Looper;
-import android.util.Log;
 import android.view.Display;
 import android.view.SurfaceControl.Transaction;
 import android.view.View;
@@ -314,7 +312,6 @@
     protected void onStart() {
         // Set the alpha to 1 before calling super, as it may get set back to 0 due to
         // onActivityStart callback.
-        Log.d(BAD_STATE, "RecentsActivity onStart mFallbackRecentsView.setContentAlpha(1)");
         mFallbackRecentsView.setContentAlpha(1);
         super.onStart();
         mFallbackRecentsView.updateLocusId();
diff --git a/quickstep/src/com/android/quickstep/RecentsAnimationDeviceState.java b/quickstep/src/com/android/quickstep/RecentsAnimationDeviceState.java
index 4fb7e6b..48f0557 100644
--- a/quickstep/src/com/android/quickstep/RecentsAnimationDeviceState.java
+++ b/quickstep/src/com/android/quickstep/RecentsAnimationDeviceState.java
@@ -61,6 +61,7 @@
 import android.view.MotionEvent;
 
 import androidx.annotation.BinderThread;
+import androidx.annotation.NonNull;
 
 import com.android.launcher3.Utilities;
 import com.android.launcher3.util.DisplayController;
@@ -124,7 +125,7 @@
     };
 
     private int mGestureBlockingTaskId = -1;
-    private Region mExclusionRegion;
+    private @NonNull Region mExclusionRegion = new Region();
     private SystemGestureExclusionListenerCompat mExclusionListener;
 
     public RecentsAnimationDeviceState(Context context) {
@@ -162,6 +163,10 @@
             @Override
             @BinderThread
             public void onExclusionChanged(Region region) {
+                if (region == null) {
+                    // Don't think this is possible but just in case, don't let it be null.
+                    region = new Region();
+                }
                 // Assignments are atomic, it should be safe on binder thread
                 mExclusionRegion = region;
             }
@@ -498,7 +503,7 @@
     public boolean isInExclusionRegion(MotionEvent event) {
         // mExclusionRegion can change on binder thread, use a local instance here.
         Region exclusionRegion = mExclusionRegion;
-        return mMode == NO_BUTTON && exclusionRegion != null
+        return mMode == NO_BUTTON
                 && exclusionRegion.contains((int) event.getX(), (int) event.getY());
     }
 
@@ -587,7 +592,8 @@
         pw.println("  isUserUnlocked=" + mIsUserUnlocked);
         pw.println("  isOneHandedModeEnabled=" + mIsOneHandedModeEnabled);
         pw.println("  isSwipeToNotificationEnabled=" + mIsSwipeToNotificationEnabled);
-        pw.println("  deferredGestureRegion=" + mDeferredGestureRegion);
+        pw.println("  deferredGestureRegion=" + mDeferredGestureRegion.getBounds());
+        pw.println("  exclusionRegion=" + mExclusionRegion.getBounds());
         pw.println("  pipIsActive=" + mPipIsActive);
         mRotationTouchHelper.dump(pw);
     }
diff --git a/quickstep/src/com/android/quickstep/RecentsModel.java b/quickstep/src/com/android/quickstep/RecentsModel.java
index 442578e..3074dbb 100644
--- a/quickstep/src/com/android/quickstep/RecentsModel.java
+++ b/quickstep/src/com/android/quickstep/RecentsModel.java
@@ -236,4 +236,35 @@
         writer.println(prefix + "RecentsModel:");
         mTaskList.dump("  ", writer);
     }
+
+    /**
+     * Registers a listener for running tasks
+     */
+    public void registerRunningTasksListener(RunningTasksListener listener) {
+        mTaskList.registerRunningTasksListener(listener);
+    }
+
+    /**
+     * Removes the previously registered running tasks listener
+     */
+    public void unregisterRunningTasksListener() {
+        mTaskList.unregisterRunningTasksListener();
+    }
+
+    /**
+     * Gets the set of running tasks.
+     */
+    public ArrayList<ActivityManager.RunningTaskInfo> getRunningTasks() {
+        return mTaskList.getRunningTasks();
+    }
+
+    /**
+     * Listener for receiving running tasks changes
+     */
+    public interface RunningTasksListener {
+        /**
+         * Called when there's a change to running tasks
+         */
+        void onRunningTasksChanged();
+    }
 }
diff --git a/quickstep/src/com/android/quickstep/RotationTouchHelper.java b/quickstep/src/com/android/quickstep/RotationTouchHelper.java
index f1e20db..2186a3b 100644
--- a/quickstep/src/com/android/quickstep/RotationTouchHelper.java
+++ b/quickstep/src/com/android/quickstep/RotationTouchHelper.java
@@ -31,7 +31,7 @@
 import android.view.MotionEvent;
 import android.view.OrientationEventListener;
 
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 import com.android.launcher3.util.DisplayController;
 import com.android.launcher3.util.DisplayController.DisplayInfoChangeListener;
 import com.android.launcher3.util.DisplayController.Info;
diff --git a/quickstep/src/com/android/quickstep/SystemUiProxy.java b/quickstep/src/com/android/quickstep/SystemUiProxy.java
index 9a2619b..0ec7e62 100644
--- a/quickstep/src/com/android/quickstep/SystemUiProxy.java
+++ b/quickstep/src/com/android/quickstep/SystemUiProxy.java
@@ -20,12 +20,14 @@
 import static com.android.launcher3.util.DisplayController.CHANGE_NAVIGATION_MODE;
 import static com.android.launcher3.util.Executors.MAIN_EXECUTOR;
 
+import android.app.ActivityManager;
 import android.app.PendingIntent;
 import android.app.PictureInPictureParams;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.ActivityInfo;
+import android.content.pm.PackageManager;
 import android.graphics.Bitmap;
 import android.graphics.Insets;
 import android.graphics.Rect;
@@ -96,7 +98,7 @@
     private IPipAnimationListener mPipAnimationListener;
     private ISplitScreenListener mSplitScreenListener;
     private IStartingWindowListener mStartingWindowListener;
-    private ILauncherUnlockAnimationController mPendingLauncherUnlockAnimationController;
+    private ILauncherUnlockAnimationController mLauncherUnlockAnimationController;
     private IRecentTasksListener mRecentTasksListener;
     private final ArrayList<RemoteTransitionCompat> mRemoteTransitions = new ArrayList<>();
     private IOnBackInvokedCallback mBackToLauncherCallback;
@@ -108,12 +110,14 @@
     private boolean mLastNavButtonAnimate;
     private boolean mHasNavButtonAlphaBeenSet = false;
     private Runnable mPendingSetNavButtonAlpha = null;
+    private Context mContext;
 
     // TODO(141886704): Find a way to remove this
     private int mLastSystemUiStateFlags;
 
     public SystemUiProxy(Context context) {
         DisplayController.INSTANCE.get(context).addChangeListener(this);
+        mContext = context;
     }
 
     @Override
@@ -189,10 +193,8 @@
         if (mStartingWindowListener != null && mStartingWindow != null) {
             setStartingWindowListener(mStartingWindowListener);
         }
-        if (mPendingLauncherUnlockAnimationController != null
-                && mSysuiUnlockAnimationController != null) {
-            setLauncherUnlockAnimationController(mPendingLauncherUnlockAnimationController);
-            mPendingLauncherUnlockAnimationController = null;
+        if (mSysuiUnlockAnimationController != null && mLauncherUnlockAnimationController != null) {
+            setLauncherUnlockAnimationController(mLauncherUnlockAnimationController);
         }
         for (int i = mRemoteTransitions.size() - 1; i >= 0; --i) {
             registerRemoteTransition(mRemoteTransitions.get(i));
@@ -757,11 +759,11 @@
                     controller.dispatchSmartspaceStateToSysui();
                 }
             } catch (RemoteException e) {
-                Log.w(TAG, "Failed call setStartingWindowListener", e);
+                Log.w(TAG, "Failed call setLauncherUnlockAnimationController", e);
             }
-        } else {
-            mPendingLauncherUnlockAnimationController = controller;
         }
+
+        mLauncherUnlockAnimationController = controller;
     }
 
     /**
@@ -870,4 +872,20 @@
         }
         return new ArrayList<>();
     }
+
+    /**
+     * Gets the set of running tasks.
+     */
+    public ArrayList<ActivityManager.RunningTaskInfo> getRunningTasks(int numTasks) {
+        if (mRecentTasks != null
+                && mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_PC)) {
+            try {
+                return new ArrayList<ActivityManager.RunningTaskInfo>(
+                        Arrays.asList(mRecentTasks.getRunningTasks(numTasks)));
+            } catch (RemoteException e) {
+                Log.w(TAG, "Failed call getRunningTasks", e);
+            }
+        }
+        return new ArrayList<>();
+    }
 }
diff --git a/quickstep/src/com/android/quickstep/TaskViewUtils.java b/quickstep/src/com/android/quickstep/TaskViewUtils.java
index a030568..fa30b8f 100644
--- a/quickstep/src/com/android/quickstep/TaskViewUtils.java
+++ b/quickstep/src/com/android/quickstep/TaskViewUtils.java
@@ -37,7 +37,6 @@
 import static com.android.launcher3.anim.Interpolators.clampToProgress;
 import static com.android.launcher3.config.FeatureFlags.ENABLE_QUICKSTEP_LIVE_TILE;
 import static com.android.launcher3.statehandlers.DepthController.DEPTH;
-import static com.android.launcher3.testing.TestProtocol.BAD_STATE;
 import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.MODE_CLOSING;
 import static com.android.systemui.shared.system.RemoteAnimationTargetCompat.MODE_OPENING;
 
@@ -55,7 +54,6 @@
 import android.graphics.Rect;
 import android.graphics.RectF;
 import android.os.Build;
-import android.util.Log;
 import android.view.SurfaceControl;
 import android.view.View;
 import android.window.TransitionInfo;
@@ -571,29 +569,6 @@
             launcherAnim = dp.isTablet
                     ? ObjectAnimator.ofFloat(recentsView, RecentsView.CONTENT_ALPHA, 0)
                     : recentsView.createAdjacentPageAnimForTaskLaunch(taskView);
-            if (dp.isTablet) {
-                Log.d(BAD_STATE, "TVU composeRecentsLaunchAnimator alpha=" + 0);
-                launcherAnim.addListener(new AnimatorListenerAdapter() {
-                    @Override
-                    public void onAnimationStart(Animator animation) {
-                        Log.d(BAD_STATE, "TVU composeRecentsLaunchAnimator onStart");
-                    }
-
-                    @Override
-                    public void onAnimationCancel(Animator animation) {
-                        float alpha = recentsView == null
-                                ? -1
-                                : RecentsView.CONTENT_ALPHA.get(recentsView);
-                        Log.d(BAD_STATE, "TVU composeRecentsLaunchAnimator onCancel, alpha="
-                                + alpha);
-                    }
-
-                    @Override
-                    public void onAnimationEnd(Animator animation) {
-                        Log.d(BAD_STATE, "TVU composeRecentsLaunchAnimator onEnd");
-                    }
-                });
-            }
             launcherAnim.setInterpolator(Interpolators.TOUCH_RESPONSE_INTERPOLATOR);
             launcherAnim.setDuration(RECENTS_LAUNCH_DURATION);
 
diff --git a/quickstep/src/com/android/quickstep/TopTaskTracker.java b/quickstep/src/com/android/quickstep/TopTaskTracker.java
index 42fa86d..cfcba4c 100644
--- a/quickstep/src/com/android/quickstep/TopTaskTracker.java
+++ b/quickstep/src/com/android/quickstep/TopTaskTracker.java
@@ -20,6 +20,7 @@
 import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
 import static android.content.Intent.ACTION_CHOOSER;
 import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
+import static android.view.Display.DEFAULT_DISPLAY;
 
 import static com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_TOP_OR_LEFT;
 
@@ -31,9 +32,9 @@
 
 import com.android.launcher3.util.MainThreadInitializedObject;
 import com.android.launcher3.util.SplitConfigurationOptions;
+import com.android.launcher3.util.SplitConfigurationOptions.SplitStageInfo;
 import com.android.launcher3.util.SplitConfigurationOptions.StagePosition;
 import com.android.launcher3.util.SplitConfigurationOptions.StageType;
-import com.android.launcher3.util.SplitConfigurationOptions.SplitStageInfo;
 import com.android.launcher3.util.TraceHelper;
 import com.android.systemui.shared.recents.model.Task;
 import com.android.systemui.shared.recents.model.Task.TaskKey;
@@ -85,6 +86,19 @@
     public void onTaskMovedToFront(RunningTaskInfo taskInfo) {
         mOrderedTaskList.removeIf(rto -> rto.taskId == taskInfo.taskId);
         mOrderedTaskList.addFirst(taskInfo);
+
+        // Keep the home display's top running task in the first while adding a non-home
+        // display's task to the list, to avoid showing non-home display's task upon going to
+        // Recents animation.
+        if (taskInfo.displayId != DEFAULT_DISPLAY) {
+            final RunningTaskInfo topTaskOnHomeDisplay = mOrderedTaskList.stream()
+                    .filter(rto -> rto.displayId == DEFAULT_DISPLAY).findFirst().orElse(null);
+            if (topTaskOnHomeDisplay != null) {
+                mOrderedTaskList.removeIf(rto -> rto.taskId == topTaskOnHomeDisplay.taskId);
+                mOrderedTaskList.addFirst(topTaskOnHomeDisplay);
+            }
+        }
+
         if (mOrderedTaskList.size() >= HISTORY_SIZE) {
             // If we grow in size, remove the last taskInfo which is not part of the split task.
             Iterator<RunningTaskInfo> itr = mOrderedTaskList.descendingIterator();
diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java
index bf1c998..52a37c5 100644
--- a/quickstep/src/com/android/quickstep/TouchInteractionService.java
+++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java
@@ -65,7 +65,6 @@
 
 import com.android.launcher3.BaseDraggingActivity;
 import com.android.launcher3.R;
-import com.android.launcher3.ResourceUtils;
 import com.android.launcher3.Utilities;
 import com.android.launcher3.config.FeatureFlags;
 import com.android.launcher3.provider.RestoreDbTask;
@@ -73,7 +72,8 @@
 import com.android.launcher3.taskbar.TaskbarActivityContext;
 import com.android.launcher3.taskbar.TaskbarManager;
 import com.android.launcher3.testing.TestLogging;
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.ResourceUtils;
+import com.android.launcher3.testing.shared.TestProtocol;
 import com.android.launcher3.tracing.LauncherTraceProto;
 import com.android.launcher3.tracing.TouchInteractionServiceProto;
 import com.android.launcher3.uioverrides.plugins.PluginManagerWrapper;
@@ -1015,7 +1015,7 @@
             pw.println("ProtoTrace:");
             pw.println("  file=" + ProtoTracer.INSTANCE.get(this).getTraceFile());
             if (createdOverviewActivity != null) {
-                createdOverviewActivity.getDeviceProfile().dump("", pw);
+                createdOverviewActivity.getDeviceProfile().dump(this, "", pw);
             }
             mTaskbarManager.dumpLogs("", pw);
         }
diff --git a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java
index ab3201a..eb739a6 100644
--- a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java
+++ b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java
@@ -15,7 +15,6 @@
  */
 package com.android.quickstep.fallback;
 
-import static com.android.launcher3.testing.TestProtocol.BAD_STATE;
 import static com.android.quickstep.GestureState.GestureEndTarget.RECENTS;
 import static com.android.quickstep.fallback.RecentsState.DEFAULT;
 import static com.android.quickstep.fallback.RecentsState.HOME;
@@ -27,7 +26,6 @@
 import android.content.Context;
 import android.os.Build;
 import android.util.AttributeSet;
-import android.util.Log;
 import android.view.MotionEvent;
 
 import androidx.annotation.Nullable;
@@ -225,7 +223,6 @@
         if (toState == MODAL_TASK) {
             setOverviewSelectEnabled(true);
         }
-        Log.d(BAD_STATE, "FRV onStateTransitionStart setFreezeVisibility=true, toState=" + toState);
         setFreezeViewVisibility(true);
     }
 
@@ -237,8 +234,6 @@
         }
         boolean isOverlayEnabled = finalState == DEFAULT || finalState == MODAL_TASK;
         setOverlayEnabled(isOverlayEnabled);
-        Log.d(BAD_STATE, "FRV onStateTransitionComplete setFreezeVisibility=false, finalState="
-                + finalState);
         setFreezeViewVisibility(false);
         if (finalState != MODAL_TASK) {
             setOverviewSelectEnabled(false);
diff --git a/quickstep/src/com/android/quickstep/inputconsumers/DelegateInputConsumer.java b/quickstep/src/com/android/quickstep/inputconsumers/DelegateInputConsumer.java
index 8da2fd3..03f8eef 100644
--- a/quickstep/src/com/android/quickstep/inputconsumers/DelegateInputConsumer.java
+++ b/quickstep/src/com/android/quickstep/inputconsumers/DelegateInputConsumer.java
@@ -3,7 +3,7 @@
 import android.view.MotionEvent;
 
 import com.android.launcher3.testing.TestLogging;
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 import com.android.launcher3.tracing.InputConsumerProto;
 import com.android.quickstep.InputConsumer;
 import com.android.systemui.shared.system.InputMonitorCompat;
diff --git a/quickstep/src/com/android/quickstep/inputconsumers/DeviceLockedInputConsumer.java b/quickstep/src/com/android/quickstep/inputconsumers/DeviceLockedInputConsumer.java
index c1750b5..6bc24f2 100644
--- a/quickstep/src/com/android/quickstep/inputconsumers/DeviceLockedInputConsumer.java
+++ b/quickstep/src/com/android/quickstep/inputconsumers/DeviceLockedInputConsumer.java
@@ -42,7 +42,7 @@
 import com.android.launcher3.R;
 import com.android.launcher3.anim.Interpolators;
 import com.android.launcher3.testing.TestLogging;
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 import com.android.launcher3.util.DisplayController;
 import com.android.quickstep.AnimatedFloat;
 import com.android.quickstep.GestureState;
diff --git a/quickstep/src/com/android/quickstep/inputconsumers/OneHandedModeInputConsumer.java b/quickstep/src/com/android/quickstep/inputconsumers/OneHandedModeInputConsumer.java
index bc20902..d7ed79b 100644
--- a/quickstep/src/com/android/quickstep/inputconsumers/OneHandedModeInputConsumer.java
+++ b/quickstep/src/com/android/quickstep/inputconsumers/OneHandedModeInputConsumer.java
@@ -21,7 +21,7 @@
 import static android.view.MotionEvent.ACTION_MOVE;
 import static android.view.MotionEvent.ACTION_UP;
 
-import static com.android.launcher3.ResourceUtils.NAVBAR_BOTTOM_GESTURE_SIZE;
+import static com.android.launcher3.testing.shared.ResourceUtils.NAVBAR_BOTTOM_GESTURE_SIZE;
 import static com.android.launcher3.Utilities.squaredHypot;
 
 import android.content.Context;
@@ -30,7 +30,7 @@
 import android.view.MotionEvent;
 
 import com.android.launcher3.R;
-import com.android.launcher3.ResourceUtils;
+import com.android.launcher3.testing.shared.ResourceUtils;
 import com.android.launcher3.Utilities;
 import com.android.launcher3.util.DisplayController;
 import com.android.quickstep.InputConsumer;
diff --git a/quickstep/src/com/android/quickstep/inputconsumers/OtherActivityInputConsumer.java b/quickstep/src/com/android/quickstep/inputconsumers/OtherActivityInputConsumer.java
index 641385d..92d3d23 100644
--- a/quickstep/src/com/android/quickstep/inputconsumers/OtherActivityInputConsumer.java
+++ b/quickstep/src/com/android/quickstep/inputconsumers/OtherActivityInputConsumer.java
@@ -50,7 +50,7 @@
 import com.android.launcher3.R;
 import com.android.launcher3.Utilities;
 import com.android.launcher3.testing.TestLogging;
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 import com.android.launcher3.tracing.InputConsumerProto;
 import com.android.launcher3.util.Preconditions;
 import com.android.launcher3.util.TraceHelper;
diff --git a/quickstep/src/com/android/quickstep/inputconsumers/OverviewInputConsumer.java b/quickstep/src/com/android/quickstep/inputconsumers/OverviewInputConsumer.java
index 02ac48e..7899c55 100644
--- a/quickstep/src/com/android/quickstep/inputconsumers/OverviewInputConsumer.java
+++ b/quickstep/src/com/android/quickstep/inputconsumers/OverviewInputConsumer.java
@@ -29,7 +29,7 @@
 import com.android.launcher3.statemanager.BaseState;
 import com.android.launcher3.statemanager.StatefulActivity;
 import com.android.launcher3.testing.TestLogging;
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 import com.android.launcher3.views.BaseDragLayer;
 import com.android.quickstep.BaseActivityInterface;
 import com.android.quickstep.GestureState;
diff --git a/quickstep/src/com/android/quickstep/inputconsumers/OverviewWithoutFocusInputConsumer.java b/quickstep/src/com/android/quickstep/inputconsumers/OverviewWithoutFocusInputConsumer.java
index a730183..bde4240 100644
--- a/quickstep/src/com/android/quickstep/inputconsumers/OverviewWithoutFocusInputConsumer.java
+++ b/quickstep/src/com/android/quickstep/inputconsumers/OverviewWithoutFocusInputConsumer.java
@@ -28,7 +28,7 @@
 import com.android.launcher3.BaseDraggingActivity;
 import com.android.launcher3.logger.LauncherAtom;
 import com.android.launcher3.testing.TestLogging;
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 import com.android.quickstep.GestureState;
 import com.android.quickstep.InputConsumer;
 import com.android.quickstep.RecentsAnimationDeviceState;
diff --git a/quickstep/src/com/android/quickstep/inputconsumers/ProgressDelegateInputConsumer.java b/quickstep/src/com/android/quickstep/inputconsumers/ProgressDelegateInputConsumer.java
index 71dca66..2462394 100644
--- a/quickstep/src/com/android/quickstep/inputconsumers/ProgressDelegateInputConsumer.java
+++ b/quickstep/src/com/android/quickstep/inputconsumers/ProgressDelegateInputConsumer.java
@@ -30,7 +30,7 @@
 
 import com.android.launcher3.anim.AnimatorListeners;
 import com.android.launcher3.testing.TestLogging;
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 import com.android.launcher3.touch.SingleAxisSwipeDetector;
 import com.android.launcher3.util.DisplayController;
 import com.android.quickstep.AnimatedFloat;
diff --git a/quickstep/src/com/android/quickstep/inputconsumers/SysUiOverlayInputConsumer.java b/quickstep/src/com/android/quickstep/inputconsumers/SysUiOverlayInputConsumer.java
index 878f132..4806ac1 100644
--- a/quickstep/src/com/android/quickstep/inputconsumers/SysUiOverlayInputConsumer.java
+++ b/quickstep/src/com/android/quickstep/inputconsumers/SysUiOverlayInputConsumer.java
@@ -23,7 +23,7 @@
 import android.view.MotionEvent;
 
 import com.android.launcher3.testing.TestLogging;
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 import com.android.quickstep.InputConsumer;
 import com.android.quickstep.RecentsAnimationDeviceState;
 import com.android.quickstep.util.TriggerSwipeUpTouchTracker;
diff --git a/quickstep/src/com/android/quickstep/interaction/EdgeBackGestureHandler.java b/quickstep/src/com/android/quickstep/interaction/EdgeBackGestureHandler.java
index d059d82..8660d87 100644
--- a/quickstep/src/com/android/quickstep/interaction/EdgeBackGestureHandler.java
+++ b/quickstep/src/com/android/quickstep/interaction/EdgeBackGestureHandler.java
@@ -29,7 +29,7 @@
 
 import androidx.annotation.Nullable;
 
-import com.android.launcher3.ResourceUtils;
+import com.android.launcher3.testing.shared.ResourceUtils;
 import com.android.launcher3.Utilities;
 import com.android.launcher3.util.DisplayController;
 
diff --git a/quickstep/src/com/android/quickstep/interaction/EdgeBackGesturePanel.java b/quickstep/src/com/android/quickstep/interaction/EdgeBackGesturePanel.java
index b2b2f59..437572b 100644
--- a/quickstep/src/com/android/quickstep/interaction/EdgeBackGesturePanel.java
+++ b/quickstep/src/com/android/quickstep/interaction/EdgeBackGesturePanel.java
@@ -41,7 +41,7 @@
 import androidx.dynamicanimation.animation.SpringForce;
 
 import com.android.launcher3.R;
-import com.android.launcher3.ResourceUtils;
+import com.android.launcher3.testing.shared.ResourceUtils;
 import com.android.launcher3.anim.Interpolators;
 import com.android.quickstep.util.VibratorWrapper;
 
diff --git a/quickstep/src/com/android/quickstep/interaction/NavBarGestureHandler.java b/quickstep/src/com/android/quickstep/interaction/NavBarGestureHandler.java
index f981860..4badf30 100644
--- a/quickstep/src/com/android/quickstep/interaction/NavBarGestureHandler.java
+++ b/quickstep/src/com/android/quickstep/interaction/NavBarGestureHandler.java
@@ -44,7 +44,7 @@
 import androidx.annotation.Nullable;
 
 import com.android.launcher3.R;
-import com.android.launcher3.ResourceUtils;
+import com.android.launcher3.testing.shared.ResourceUtils;
 import com.android.launcher3.anim.Interpolators;
 import com.android.launcher3.util.DisplayController;
 import com.android.launcher3.util.DisplayController.NavigationMode;
diff --git a/quickstep/src/com/android/quickstep/util/BaseDepthController.java b/quickstep/src/com/android/quickstep/util/BaseDepthController.java
new file mode 100644
index 0000000..4030630
--- /dev/null
+++ b/quickstep/src/com/android/quickstep/util/BaseDepthController.java
@@ -0,0 +1,153 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.quickstep.util;
+
+import android.app.WallpaperManager;
+import android.os.IBinder;
+import android.util.FloatProperty;
+import android.view.AttachedSurfaceControl;
+import android.view.SurfaceControl;
+
+import com.android.launcher3.Launcher;
+import com.android.launcher3.R;
+import com.android.launcher3.Utilities;
+import com.android.systemui.shared.system.BlurUtils;
+
+/**
+ * Utility class for applying depth effect
+ */
+public class BaseDepthController {
+
+    public static final FloatProperty<BaseDepthController> DEPTH =
+            new FloatProperty<BaseDepthController>("depth") {
+                @Override
+                public void setValue(BaseDepthController depthController, float depth) {
+                    depthController.setDepth(depth);
+                }
+
+                @Override
+                public Float get(BaseDepthController depthController) {
+                    return depthController.mDepth;
+                }
+            };
+
+    protected final Launcher mLauncher;
+
+    /**
+     * Blur radius when completely zoomed out, in pixels.
+     */
+    protected final int mMaxBlurRadius;
+    protected final WallpaperManager mWallpaperManager;
+    protected boolean mCrossWindowBlursEnabled;
+
+    /**
+     * Ratio from 0 to 1, where 0 is fully zoomed out, and 1 is zoomed in.
+     * @see android.service.wallpaper.WallpaperService.Engine#onZoomChanged(float)
+     */
+    protected float mDepth;
+
+    protected SurfaceControl mSurface;
+
+    // Hints that there is potentially content behind Launcher and that we shouldn't optimize by
+    // marking the launcher surface as opaque.  Only used in certain Launcher states.
+    private boolean mHasContentBehindLauncher;
+    /**
+     * Last blur value, in pixels, that was applied.
+     * For debugging purposes.
+     */
+    protected int mCurrentBlur;
+    /**
+     * If we requested early wake-up offsets to SurfaceFlinger.
+     */
+    protected boolean mInEarlyWakeUp;
+
+    public BaseDepthController(Launcher activity) {
+        mLauncher = activity;
+        mMaxBlurRadius = activity.getResources().getInteger(R.integer.max_depth_blur_radius);
+        mWallpaperManager = activity.getSystemService(WallpaperManager.class);
+    }
+
+    protected void setCrossWindowBlursEnabled(boolean isEnabled) {
+        mCrossWindowBlursEnabled = isEnabled;
+        applyDepthAndBlur();
+    }
+
+    public void setHasContentBehindLauncher(boolean hasContentBehindLauncher) {
+        mHasContentBehindLauncher = hasContentBehindLauncher;
+    }
+
+    protected void applyDepthAndBlur() {
+        float depth = mDepth;
+        IBinder windowToken = mLauncher.getRootView().getWindowToken();
+        if (windowToken != null) {
+            mWallpaperManager.setWallpaperZoomOut(windowToken, depth);
+        }
+
+        if (!BlurUtils.supportsBlursOnWindows()) {
+            return;
+        }
+        if (mSurface == null || !mSurface.isValid()) {
+            return;
+        }
+        boolean hasOpaqueBg = mLauncher.getScrimView().isFullyOpaque();
+        boolean isSurfaceOpaque = !mHasContentBehindLauncher && hasOpaqueBg;
+
+        mCurrentBlur = !mCrossWindowBlursEnabled || hasOpaqueBg
+                ? 0 : (int) (depth * mMaxBlurRadius);
+        SurfaceControl.Transaction transaction = new SurfaceControl.Transaction()
+                .setBackgroundBlurRadius(mSurface, mCurrentBlur)
+                .setOpaque(mSurface, isSurfaceOpaque);
+
+        // Set early wake-up flags when we know we're executing an expensive operation, this way
+        // SurfaceFlinger will adjust its internal offsets to avoid jank.
+        boolean wantsEarlyWakeUp = depth > 0 && depth < 1;
+        if (wantsEarlyWakeUp && !mInEarlyWakeUp) {
+            transaction.setEarlyWakeupStart();
+            mInEarlyWakeUp = true;
+        } else if (!wantsEarlyWakeUp && mInEarlyWakeUp) {
+            transaction.setEarlyWakeupEnd();
+            mInEarlyWakeUp = false;
+        }
+
+        AttachedSurfaceControl rootSurfaceControl =
+                mLauncher.getRootView().getRootSurfaceControl();
+        if (rootSurfaceControl != null) {
+            rootSurfaceControl.applyTransactionOnDraw(transaction);
+        }
+    }
+
+    protected void setDepth(float depth) {
+        depth = Utilities.boundToRange(depth, 0, 1);
+        // Round out the depth to dedupe frequent, non-perceptable updates
+        int depthI = (int) (depth * 256);
+        float depthF = depthI / 256f;
+        if (Float.compare(mDepth, depthF) == 0) {
+            return;
+        }
+        mDepth = depthF;
+        applyDepthAndBlur();
+    }
+
+    /**
+     * Sets the specified app target surface to apply the blur to.
+     */
+    protected void setSurface(SurfaceControl surface) {
+        if (mSurface != surface) {
+            mSurface = surface;
+            applyDepthAndBlur();
+        }
+    }
+}
diff --git a/quickstep/src/com/android/quickstep/util/RecentsAtomicAnimationFactory.java b/quickstep/src/com/android/quickstep/util/RecentsAtomicAnimationFactory.java
index edaa326..1d008da 100644
--- a/quickstep/src/com/android/quickstep/util/RecentsAtomicAnimationFactory.java
+++ b/quickstep/src/com/android/quickstep/util/RecentsAtomicAnimationFactory.java
@@ -15,13 +15,10 @@
  */
 package com.android.quickstep.util;
 
-import static com.android.launcher3.testing.TestProtocol.BAD_STATE;
 import static com.android.quickstep.views.RecentsView.ADJACENT_PAGE_HORIZONTAL_OFFSET;
 
 import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
 import android.animation.ObjectAnimator;
-import android.util.Log;
 
 import androidx.dynamicanimation.animation.DynamicAnimation;
 
@@ -30,8 +27,6 @@
 import com.android.launcher3.statemanager.StatefulActivity;
 import com.android.quickstep.views.RecentsView;
 
-import java.util.Arrays;
-
 public class RecentsAtomicAnimationFactory<ACTIVITY_TYPE extends StatefulActivity, STATE_TYPE>
         extends AtomicAnimationFactory<STATE_TYPE> {
 
@@ -53,27 +48,6 @@
             case INDEX_RECENTS_FADE_ANIM:
                 ObjectAnimator alpha = ObjectAnimator.ofFloat(mActivity.getOverviewPanel(),
                         RecentsView.CONTENT_ALPHA, values);
-                Log.d(BAD_STATE, "RAAF createStateElementAnimation alpha="
-                        + Arrays.toString(values));
-                alpha.addListener(new AnimatorListenerAdapter() {
-                    @Override
-                    public void onAnimationStart(Animator animation) {
-                        Log.d(BAD_STATE, "RAAF createStateElementAnimation onStart");
-                    }
-
-                    @Override
-                    public void onAnimationCancel(Animator animation) {
-                        RecentsView recent = mActivity.getOverviewPanel();
-                        float alpha = recent == null ? -1 : RecentsView.CONTENT_ALPHA.get(recent);
-                        Log.d(BAD_STATE, "RAAF createStateElementAnimation onCancel, alpha="
-                                + alpha);
-                    }
-
-                    @Override
-                    public void onAnimationEnd(Animator animation) {
-                        Log.d(BAD_STATE, "RAAF createStateElementAnimation onEnd");
-                    }
-                });
                 return alpha;
             case INDEX_RECENTS_TRANSLATE_X_ANIM: {
                 RecentsView rv = mActivity.getOverviewPanel();
diff --git a/quickstep/src/com/android/quickstep/util/RecentsOrientedState.java b/quickstep/src/com/android/quickstep/util/RecentsOrientedState.java
index dec934a..c459f30 100644
--- a/quickstep/src/com/android/quickstep/util/RecentsOrientedState.java
+++ b/quickstep/src/com/android/quickstep/util/RecentsOrientedState.java
@@ -46,7 +46,7 @@
 import com.android.launcher3.DeviceProfile;
 import com.android.launcher3.InvariantDeviceProfile;
 import com.android.launcher3.Utilities;
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 import com.android.launcher3.touch.PagedOrientationHandler;
 import com.android.launcher3.util.DisplayController;
 import com.android.launcher3.util.SettingsCache;
diff --git a/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java b/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java
index e89c842..d2a2f36 100644
--- a/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java
+++ b/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java
@@ -43,7 +43,7 @@
 import com.android.launcher3.statehandlers.DepthController;
 import com.android.launcher3.statemanager.StateManager;
 import com.android.launcher3.testing.TestLogging;
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 import com.android.launcher3.util.SplitConfigurationOptions;
 import com.android.launcher3.util.SplitConfigurationOptions.StagePosition;
 import com.android.quickstep.SystemUiProxy;
diff --git a/quickstep/src/com/android/quickstep/views/FloatingTaskView.java b/quickstep/src/com/android/quickstep/views/FloatingTaskView.java
index 835c9f7..7a66ea0 100644
--- a/quickstep/src/com/android/quickstep/views/FloatingTaskView.java
+++ b/quickstep/src/com/android/quickstep/views/FloatingTaskView.java
@@ -260,6 +260,10 @@
                 mActivity.getDeviceProfile(), mStagePosition);
     }
 
+    public int getStagePosition() {
+        return mStagePosition;
+    }
+
     private static class SplitOverlayProperties {
 
         private final float finalTaskViewScaleX;
diff --git a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java
index a736583..3c5a626 100644
--- a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java
+++ b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java
@@ -21,13 +21,11 @@
 import static com.android.launcher3.LauncherState.OVERVIEW_MODAL_TASK;
 import static com.android.launcher3.LauncherState.OVERVIEW_SPLIT_SELECT;
 import static com.android.launcher3.LauncherState.SPRING_LOADED;
-import static com.android.launcher3.testing.TestProtocol.BAD_STATE;
 
 import android.annotation.TargetApi;
 import android.content.Context;
 import android.os.Build;
 import android.util.AttributeSet;
-import android.util.Log;
 import android.view.MotionEvent;
 import android.view.Surface;
 
@@ -68,7 +66,6 @@
     public void init(OverviewActionsView actionsView,
             SplitSelectStateController splitPlaceholderView) {
         super.init(actionsView, splitPlaceholderView);
-        Log.d(BAD_STATE, "LauncherRecentsView init setContentAlpha=0");
         setContentAlpha(0);
     }
 
@@ -119,7 +116,6 @@
         if (toState == OVERVIEW_MODAL_TASK) {
             setOverviewSelectEnabled(true);
         }
-        Log.d(BAD_STATE, "LRV onStateTransitionStart setFreezeVisibility=true, toState=" + toState);
         setFreezeViewVisibility(true);
     }
 
@@ -131,8 +127,6 @@
         }
         boolean isOverlayEnabled = finalState == OVERVIEW || finalState == OVERVIEW_MODAL_TASK;
         setOverlayEnabled(isOverlayEnabled);
-        Log.d(BAD_STATE, "LRV onStateTransitionComplete setFreezeVisibility=false, finalState="
-                + finalState);
         setFreezeViewVisibility(false);
         if (finalState != OVERVIEW_MODAL_TASK) {
             setOverviewSelectEnabled(false);
diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java
index 3aa24ac..64068ad 100644
--- a/quickstep/src/com/android/quickstep/views/RecentsView.java
+++ b/quickstep/src/com/android/quickstep/views/RecentsView.java
@@ -397,6 +397,39 @@
                 }
             };
 
+    public static final FloatProperty<RecentsView> FIRST_FLOATING_TASK_TRANSLATE_OFFSCREEN =
+            new FloatProperty<RecentsView>("firstFloatingTaskTranslateOffscreen") {
+                @Override
+                public void setValue(RecentsView view, float translation) {
+                    view.getPagedOrientationHandler().setFloatingTaskPrimaryTranslation(
+                            view.mFirstFloatingTaskView,
+                            translation,
+                            view.mActivity.getDeviceProfile()
+                    );
+                }
+
+                @Override
+                public Float get(RecentsView view) {
+                    return view.getPagedOrientationHandler().getFloatingTaskPrimaryTranslation(
+                            view.mFirstFloatingTaskView,
+                            view.mActivity.getDeviceProfile()
+                    );
+                }
+            };
+
+    public static final FloatProperty<RecentsView> SPLIT_INSTRUCTIONS_FADE =
+            new FloatProperty<RecentsView>("splitInstructionsFade") {
+                @Override
+                public void setValue(RecentsView view, float fade) {
+                    view.mSplitInstructionsView.setAlpha(1 - fade);
+                }
+
+                @Override
+                public Float get(RecentsView view) {
+                    return 1 - view.mSplitInstructionsView.getAlpha();
+                }
+            };
+
     // OverScroll constants
     private static final int OVERSCROLL_PAGE_SNAP_ANIMATION_DURATION = 270;
 
@@ -2205,7 +2238,8 @@
             @Nullable AnimatorSet animatorSet, GestureState.GestureEndTarget endTarget,
             TaskViewSimulator[] taskViewSimulators) {
         mCurrentGestureEndTarget = endTarget;
-        if (endTarget == GestureState.GestureEndTarget.RECENTS) {
+        boolean isOverviewEndTarget = endTarget == GestureState.GestureEndTarget.RECENTS;
+        if (isOverviewEndTarget) {
             updateGridProperties();
         }
 
@@ -2234,10 +2268,11 @@
                 }
             }
         }
+        int overviewProgress = isOverviewEndTarget ? 1 : 0;
         if (animatorSet == null) {
-            setOverviewProgress(1);
+            setOverviewProgress(overviewProgress);
         } else {
-            animatorSet.play(ObjectAnimator.ofFloat(this, OVERVIEW_PROGRESS, 1));
+            animatorSet.play(ObjectAnimator.ofFloat(this, OVERVIEW_PROGRESS, overviewProgress));
         }
     }
 
@@ -5291,6 +5326,11 @@
         return mRecentsAnimationController;
     }
 
+    @Nullable
+    public FloatingTaskView getFirstFloatingTaskView() {
+        return mFirstFloatingTaskView;
+    }
+
     /** Update the current activity locus id to show the enabled state of Overview */
     public void updateLocusId() {
         String locusId = "Overview";
diff --git a/quickstep/src/com/android/quickstep/views/TaskView.java b/quickstep/src/com/android/quickstep/views/TaskView.java
index 5602d88..b089155 100644
--- a/quickstep/src/com/android/quickstep/views/TaskView.java
+++ b/quickstep/src/com/android/quickstep/views/TaskView.java
@@ -74,7 +74,7 @@
 import com.android.launcher3.popup.SystemShortcut;
 import com.android.launcher3.statemanager.StatefulActivity;
 import com.android.launcher3.testing.TestLogging;
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 import com.android.launcher3.touch.PagedOrientationHandler;
 import com.android.launcher3.util.ActivityOptionsWrapper;
 import com.android.launcher3.util.ComponentKey;
@@ -866,10 +866,9 @@
 
         int thumbnailTopMargin = deviceProfile.overviewTaskThumbnailTopMarginPx;
         int taskIconHeight = deviceProfile.overviewTaskIconSizePx;
-        int taskMargin = isGridTask ? deviceProfile.overviewTaskMarginGridPx
-                : deviceProfile.overviewTaskMarginPx;
-        int taskIconMargin = thumbnailTopMargin - taskIconHeight - taskMargin;
-        orientationHandler.setTaskIconParams(iconParams, taskIconMargin, taskIconHeight,
+        int taskMargin = deviceProfile.overviewTaskMarginPx;
+
+        orientationHandler.setTaskIconParams(iconParams, taskMargin, taskIconHeight,
                 thumbnailTopMargin, isRtl);
         iconParams.width = iconParams.height = taskIconHeight;
         mIconView.setLayoutParams(iconParams);
diff --git a/quickstep/tests/src/com/android/quickstep/AbstractQuickStepTest.java b/quickstep/tests/src/com/android/quickstep/AbstractQuickStepTest.java
index 09f0858..f190e27 100644
--- a/quickstep/tests/src/com/android/quickstep/AbstractQuickStepTest.java
+++ b/quickstep/tests/src/com/android/quickstep/AbstractQuickStepTest.java
@@ -35,7 +35,7 @@
  * Base class for all instrumentation tests that deal with Quickstep.
  */
 public abstract class AbstractQuickStepTest extends AbstractLauncherUiTest {
-    static final boolean ENABLE_SHELL_TRANSITIONS =
+    public static final boolean ENABLE_SHELL_TRANSITIONS =
             SystemProperties.getBoolean("persist.wm.debug.shell_transit", false);
     @Override
     protected TestRule getRulesInsideActivityMonitor() {
diff --git a/quickstep/tests/src/com/android/quickstep/DeviceProfilePhone3ButtonTest.kt b/quickstep/tests/src/com/android/quickstep/DeviceProfilePhone3ButtonTest.kt
deleted file mode 100644
index 3daf81d..0000000
--- a/quickstep/tests/src/com/android/quickstep/DeviceProfilePhone3ButtonTest.kt
+++ /dev/null
@@ -1,486 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.quickstep
-
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.android.launcher3.DeviceProfile
-import com.android.launcher3.DeviceProfileBaseTest
-import com.google.common.truth.Truth.assertThat
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-
-/**
- * Tests for DeviceProfile for phone with 3-Button navigation.
- */
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-class DeviceProfilePhone3ButtonTest : DeviceProfileBaseTest() {
-
-    lateinit var dp: DeviceProfile
-
-    @Before
-    fun before() {
-        initializeVarsForPhone(isGestureMode = false)
-        dp = newDP()
-    }
-
-    @Test
-    fun isScalableGrid() {
-        assertThat(dp.isScalableGrid).isTrue()
-    }
-
-    @Test
-    fun cellWidthPx() {
-        assertThat(dp.cellWidthPx).isEqualTo(265)
-    }
-
-    @Test
-    fun cellHeightPx() {
-        assertThat(dp.cellHeightPx).isEqualTo(343)
-    }
-
-    @Test
-    fun getCellSizeX() {
-        assertThat(dp.getCellSize().x).isEqualTo(265)
-    }
-
-    @Test
-    fun getCellSizeY() {
-        assertThat(dp.getCellSize().y).isEqualTo(552)
-    }
-
-    @Test
-    fun cellLayoutBorderSpacePxX() {
-        assertThat(dp.cellLayoutBorderSpacePx.x).isEqualTo(66)
-    }
-
-    @Test
-    fun cellLayoutBorderSpacePxY() {
-        assertThat(dp.cellLayoutBorderSpacePx.y).isEqualTo(66)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxLeft() {
-        assertThat(dp.cellLayoutPaddingPx.left).isEqualTo(38)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxTop() {
-        assertThat(dp.cellLayoutPaddingPx.top).isEqualTo(0)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxRight() {
-        assertThat(dp.cellLayoutPaddingPx.right).isEqualTo(38)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxBottom() {
-        assertThat(dp.cellLayoutPaddingPx.bottom).isEqualTo(38)
-    }
-
-    @Test
-    fun iconSizePx() {
-        assertThat(dp.iconSizePx).isEqualTo(196)
-    }
-
-    @Test
-    fun iconTextSizePx() {
-        assertThat(dp.iconTextSizePx).isEqualTo(49)
-    }
-
-    @Test
-    fun iconDrawablePaddingPx() {
-        assertThat(dp.iconDrawablePaddingPx).isEqualTo(25)
-    }
-
-    @Test
-    fun folderCellWidthPx() {
-        assertThat(dp.folderCellWidthPx).isEqualTo(265)
-    }
-
-    @Test
-    fun folderCellHeightPx() {
-        assertThat(dp.folderCellHeightPx).isEqualTo(343)
-    }
-
-    @Test
-    fun folderChildIconSizePx() {
-        assertThat(dp.folderChildIconSizePx).isEqualTo(196)
-    }
-
-    @Test
-    fun folderChildTextSizePx() {
-        assertThat(dp.folderChildTextSizePx).isEqualTo(49)
-    }
-
-    @Test
-    fun folderChildDrawablePaddingPx() {
-        assertThat(dp.folderChildDrawablePaddingPx).isEqualTo(27)
-    }
-
-    @Test
-    fun folderCellLayoutBorderSpaceOriginalPx() {
-        assertThat(dp.folderCellLayoutBorderSpaceOriginalPx).isEqualTo(0)
-    }
-
-    @Test
-    fun folderCellLayoutBorderSpacePxX() {
-        assertThat(dp.folderCellLayoutBorderSpacePx.x).isEqualTo(0)
-    }
-
-    @Test
-    fun folderCellLayoutBorderSpacePxY() {
-        assertThat(dp.folderCellLayoutBorderSpacePx.y).isEqualTo(0)
-    }
-
-    @Test
-    fun bottomSheetTopPadding() {
-        assertThat(dp.bottomSheetTopPadding).isEqualTo(38)
-    }
-
-    @Test
-    fun allAppsShiftRange() {
-        assertThat(dp.allAppsShiftRange).isEqualTo(1050)
-    }
-
-    @Test
-    fun allAppsTopPadding() {
-        assertThat(dp.allAppsTopPadding).isEqualTo(0)
-    }
-
-    @Test
-    fun allAppsIconSizePx() {
-        assertThat(dp.allAppsIconSizePx).isEqualTo(232)
-    }
-
-    @Test
-    fun allAppsIconTextSizePx() {
-        assertThat(dp.allAppsIconTextSizePx).isEqualTo(58)
-    }
-
-    @Test
-    fun allAppsIconDrawablePaddingPx() {
-        assertThat(dp.allAppsIconDrawablePaddingPx).isEqualTo(25)
-    }
-
-    @Test
-    fun allAppsCellHeightPx() {
-        assertThat(dp.allAppsCellHeightPx).isEqualTo(409)
-    }
-
-    @Test
-    fun allAppsCellWidthPx() {
-        assertThat(dp.allAppsCellWidthPx).isEqualTo(265)
-    }
-
-    @Test
-    fun allAppsBorderSpacePxX() {
-        assertThat(dp.allAppsBorderSpacePx.x).isEqualTo(66)
-    }
-
-    @Test
-    fun allAppsBorderSpacePxY() {
-        assertThat(dp.allAppsBorderSpacePx.y).isEqualTo(66)
-    }
-
-    @Test
-    fun numShownAllAppsColumns() {
-        assertThat(dp.numShownAllAppsColumns).isEqualTo(0)
-    }
-
-    @Test
-    fun allAppsLeftRightPadding() {
-        assertThat(dp.allAppsLeftRightPadding).isEqualTo(91)
-    }
-
-    @Test
-    fun allAppsLeftRightMargin() {
-        assertThat(dp.allAppsLeftRightMargin).isEqualTo(0)
-    }
-
-    @Test
-    fun hotseatBarSizePx() {
-        assertThat(dp.hotseatBarSizePx).isEqualTo(669)
-    }
-
-    @Test
-    fun hotseatCellHeightPx() {
-        assertThat(dp.hotseatCellHeightPx).isEqualTo(221)
-    }
-
-    @Test
-    fun hotseatBarBottomPaddingPx() {
-        assertThat(dp.hotseatBarBottomSpacePx).isEqualTo(168)
-    }
-
-    @Test
-    fun hotseatBarSidePaddingStartPx() {
-        assertThat(dp.hotseatBarSidePaddingStartPx).isEqualTo(0)
-    }
-
-    @Test
-    fun hotseatBarSidePaddingEndPx() {
-        assertThat(dp.hotseatBarSidePaddingEndPx).isEqualTo(0)
-    }
-
-    @Test
-    fun hotseatQsbSpace() {
-        assertThat(dp.hotseatQsbSpace).isEqualTo(126)
-    }
-
-    @Test
-    fun hotseatQsbHeight() {
-        assertThat(dp.hotseatQsbHeight).isEqualTo(221)
-    }
-
-    @Test
-    fun springLoadedHotseatBarTopMarginPx() {
-        assertThat(dp.springLoadedHotseatBarTopMarginPx).isEqualTo(266)
-    }
-
-    @Test
-    fun numShownHotseatIcons() {
-        assertThat(dp.numShownHotseatIcons).isEqualTo(4)
-    }
-
-    @Test
-    fun hotseatBorderSpace() {
-        assertThat(dp.hotseatBorderSpace).isEqualTo(135)
-    }
-
-    @Test
-    fun isQsbInline() {
-        assertThat(dp.isQsbInline).isEqualTo(false)
-    }
-
-    @Test
-    fun qsbWidth() {
-        assertThat(dp.qsbWidth).isEqualTo(1189)
-    }
-
-    @Test
-    fun isTaskbarPresent() {
-        assertThat(dp.isTaskbarPresent).isEqualTo(false)
-    }
-
-    @Test
-    fun isTaskbarPresentInApps() {
-        assertThat(dp.isTaskbarPresentInApps).isEqualTo(false)
-    }
-
-    @Test
-    fun taskbarSize() {
-        assertThat(dp.taskbarSize).isEqualTo(0)
-    }
-
-    @Test
-    fun desiredWorkspaceHorizontalMarginPx() {
-        assertThat(dp.desiredWorkspaceHorizontalMarginPx).isEqualTo(91)
-    }
-
-    @Test
-    fun workspacePaddingLeft() {
-        assertThat(dp.workspacePadding.left).isEqualTo(53)
-    }
-
-    @Test
-    fun workspacePaddingTop() {
-        assertThat(dp.workspacePadding.top).isEqualTo(0)
-    }
-
-    @Test
-    fun workspacePaddingRight() {
-        assertThat(dp.workspacePadding.right).isEqualTo(53)
-    }
-
-    @Test
-    fun workspacePaddingBottom() {
-        assertThat(dp.workspacePadding.bottom).isEqualTo(573)
-    }
-
-    @Test
-    fun iconScale() {
-        assertThat(dp.iconScale).isEqualTo(1)
-    }
-
-    @Test
-    fun cellScaleToFit() {
-        assertThat(dp.cellScaleToFit).isEqualTo(1.182266f)
-    }
-
-    @Test
-    fun workspaceTopPadding() {
-        assertThat(dp.workspaceTopPadding).isEqualTo(0)
-    }
-
-    @Test
-    fun workspaceBottomPadding() {
-        assertThat(dp.workspaceBottomPadding).isEqualTo(0)
-    }
-
-    @Test
-    fun overviewTaskMarginPx() {
-        assertThat(dp.overviewTaskMarginPx).isEqualTo(56)
-    }
-
-    @Test
-    fun overviewTaskMarginGridPx() {
-        assertThat(dp.overviewTaskMarginGridPx).isEqualTo(0)
-    }
-
-    @Test
-    fun overviewTaskIconSizePx() {
-        assertThat(dp.overviewTaskIconSizePx).isEqualTo(168)
-    }
-
-    @Test
-    fun overviewTaskIconDrawableSizePx() {
-        assertThat(dp.overviewTaskIconDrawableSizePx).isEqualTo(154)
-    }
-
-    @Test
-    fun overviewTaskIconDrawableSizeGridPx() {
-        assertThat(dp.overviewTaskIconDrawableSizeGridPx).isEqualTo(0)
-    }
-
-    @Test
-    fun overviewTaskThumbnailTopMarginPx() {
-        assertThat(dp.overviewTaskThumbnailTopMarginPx).isEqualTo(280)
-    }
-
-    @Test
-    fun overviewActionsTopMarginPx() {
-        assertThat(dp.overviewActionsTopMarginPx).isEqualTo(84)
-    }
-
-    @Test
-    fun overviewActionsHeight() {
-        assertThat(dp.overviewActionsHeight).isEqualTo(168)
-    }
-
-    @Test
-    fun overviewActionsButtonSpacing() {
-        assertThat(dp.overviewActionsButtonSpacing).isEqualTo(126)
-    }
-
-    @Test
-    fun overviewPageSpacing() {
-        assertThat(dp.overviewPageSpacing).isEqualTo(56)
-    }
-
-    @Test
-    fun overviewRowSpacing() {
-        assertThat(dp.overviewRowSpacing).isEqualTo(-112)
-    }
-
-    @Test
-    fun overviewGridSideMargin() {
-        assertThat(dp.overviewGridSideMargin).isEqualTo(0)
-    }
-
-    @Test
-    fun dropTargetBarTopMarginPx() {
-        assertThat(dp.dropTargetBarTopMarginPx).isEqualTo(112)
-    }
-
-    @Test
-    fun dropTargetBarSizePx() {
-        assertThat(dp.dropTargetBarSizePx).isEqualTo(196)
-    }
-
-    @Test
-    fun dropTargetBarBottomMarginPx() {
-        assertThat(dp.dropTargetBarBottomMarginPx).isEqualTo(56)
-    }
-
-    @Test
-    fun workspaceSpringLoadedMinNextPageVisiblePx() {
-        assertThat(dp.workspaceSpringLoadedMinNextPageVisiblePx).isEqualTo(84)
-    }
-
-    @Test
-    fun getWorkspaceSpringLoadScale() {
-        assertThat(dp.workspaceSpringLoadScale).isEqualTo(0.74417657f)
-    }
-
-    @Test
-    fun getCellLayoutHeight() {
-        assertThat(dp.cellLayoutHeight).isEqualTo(2447)
-    }
-
-    @Test
-    fun getCellLayoutWidth() {
-        assertThat(dp.cellLayoutWidth).isEqualTo(1334)
-    }
-
-    @Test
-    fun getPanelCount() {
-        assertThat(dp.panelCount).isEqualTo(1)
-    }
-
-    @Test
-    fun isVerticalBarLayout() {
-        assertThat(dp.isVerticalBarLayout).isEqualTo(false)
-    }
-
-    @Test
-    fun getCellLayoutSpringLoadShrunkTop() {
-        assertThat(dp.cellLayoutSpringLoadShrunkTop).isEqualTo(364)
-    }
-
-    @Test
-    fun getCellLayoutSpringLoadShrunkBottom() {
-        assertThat(dp.cellLayoutSpringLoadShrunkBottom).isEqualTo(2185)
-    }
-
-    @Test
-    fun getQsbOffsetY() {
-        assertThat(dp.qsbOffsetY).isEqualTo(147)
-    }
-
-    @Test
-    fun getTaskbarOffsetY() {
-        assertThat(dp.taskbarOffsetY).isEqualTo(558)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingLeft() {
-        assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(125)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingTop() {
-        assertThat(dp.getHotseatLayoutPadding(context).top).isEqualTo(0)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingRight() {
-        assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(125)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingBottom() {
-        assertThat(dp.getHotseatLayoutPadding(context).bottom).isEqualTo(448)
-    }
-
-    @Test
-    fun hotseatBarEndOffset() {
-        assertThat(dp.hotseatBarEndOffset).isEqualTo(0)
-    }
-}
\ 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
deleted file mode 100644
index e588c71..0000000
--- a/quickstep/tests/src/com/android/quickstep/DeviceProfilePhoneTest.kt
+++ /dev/null
@@ -1,486 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.quickstep
-
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.android.launcher3.DeviceProfile
-import com.android.launcher3.DeviceProfileBaseTest
-import com.google.common.truth.Truth.assertThat
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-
-/**
- * Tests for DeviceProfile for phone.
- */
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-class DeviceProfilePhoneTest : DeviceProfileBaseTest() {
-
-    lateinit var dp: DeviceProfile
-
-    @Before
-    fun before() {
-        initializeVarsForPhone()
-        dp = newDP()
-    }
-
-    @Test
-    fun isScalableGrid() {
-        assertThat(dp.isScalableGrid).isTrue()
-    }
-
-    @Test
-    fun cellWidthPx() {
-        assertThat(dp.cellWidthPx).isEqualTo(265)
-    }
-
-    @Test
-    fun cellHeightPx() {
-        assertThat(dp.cellHeightPx).isEqualTo(343)
-    }
-
-    @Test
-    fun getCellSizeX() {
-        assertThat(dp.getCellSize().x).isEqualTo(265)
-    }
-
-    @Test
-    fun getCellSizeY() {
-        assertThat(dp.getCellSize().y).isEqualTo(552)
-    }
-
-    @Test
-    fun cellLayoutBorderSpacePxX() {
-        assertThat(dp.cellLayoutBorderSpacePx.x).isEqualTo(66)
-    }
-
-    @Test
-    fun cellLayoutBorderSpacePxY() {
-        assertThat(dp.cellLayoutBorderSpacePx.y).isEqualTo(66)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxLeft() {
-        assertThat(dp.cellLayoutPaddingPx.left).isEqualTo(38)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxTop() {
-        assertThat(dp.cellLayoutPaddingPx.top).isEqualTo(0)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxRight() {
-        assertThat(dp.cellLayoutPaddingPx.right).isEqualTo(38)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxBottom() {
-        assertThat(dp.cellLayoutPaddingPx.bottom).isEqualTo(38)
-    }
-
-    @Test
-    fun iconSizePx() {
-        assertThat(dp.iconSizePx).isEqualTo(196)
-    }
-
-    @Test
-    fun iconTextSizePx() {
-        assertThat(dp.iconTextSizePx).isEqualTo(49)
-    }
-
-    @Test
-    fun iconDrawablePaddingPx() {
-        assertThat(dp.iconDrawablePaddingPx).isEqualTo(25)
-    }
-
-    @Test
-    fun folderCellWidthPx() {
-        assertThat(dp.folderCellWidthPx).isEqualTo(265)
-    }
-
-    @Test
-    fun folderCellHeightPx() {
-        assertThat(dp.folderCellHeightPx).isEqualTo(343)
-    }
-
-    @Test
-    fun folderChildIconSizePx() {
-        assertThat(dp.folderChildIconSizePx).isEqualTo(196)
-    }
-
-    @Test
-    fun folderChildTextSizePx() {
-        assertThat(dp.folderChildTextSizePx).isEqualTo(49)
-    }
-
-    @Test
-    fun folderChildDrawablePaddingPx() {
-        assertThat(dp.folderChildDrawablePaddingPx).isEqualTo(27)
-    }
-
-    @Test
-    fun folderCellLayoutBorderSpaceOriginalPx() {
-        assertThat(dp.folderCellLayoutBorderSpaceOriginalPx).isEqualTo(0)
-    }
-
-    @Test
-    fun folderCellLayoutBorderSpacePxX() {
-        assertThat(dp.folderCellLayoutBorderSpacePx.x).isEqualTo(0)
-    }
-
-    @Test
-    fun folderCellLayoutBorderSpacePxY() {
-        assertThat(dp.folderCellLayoutBorderSpacePx.y).isEqualTo(0)
-    }
-
-    @Test
-    fun bottomSheetTopPadding() {
-        assertThat(dp.bottomSheetTopPadding).isEqualTo(38)
-    }
-
-    @Test
-    fun allAppsShiftRange() {
-        assertThat(dp.allAppsShiftRange).isEqualTo(1050)
-    }
-
-    @Test
-    fun allAppsTopPadding() {
-        assertThat(dp.allAppsTopPadding).isEqualTo(0)
-    }
-
-    @Test
-    fun allAppsIconSizePx() {
-        assertThat(dp.allAppsIconSizePx).isEqualTo(232)
-    }
-
-    @Test
-    fun allAppsIconTextSizePx() {
-        assertThat(dp.allAppsIconTextSizePx).isEqualTo(58)
-    }
-
-    @Test
-    fun allAppsIconDrawablePaddingPx() {
-        assertThat(dp.allAppsIconDrawablePaddingPx).isEqualTo(25)
-    }
-
-    @Test
-    fun allAppsCellHeightPx() {
-        assertThat(dp.allAppsCellHeightPx).isEqualTo(409)
-    }
-
-    @Test
-    fun allAppsCellWidthPx() {
-        assertThat(dp.allAppsCellWidthPx).isEqualTo(265)
-    }
-
-    @Test
-    fun allAppsBorderSpacePxX() {
-        assertThat(dp.allAppsBorderSpacePx.x).isEqualTo(66)
-    }
-
-    @Test
-    fun allAppsBorderSpacePxY() {
-        assertThat(dp.allAppsBorderSpacePx.y).isEqualTo(66)
-    }
-
-    @Test
-    fun numShownAllAppsColumns() {
-        assertThat(dp.numShownAllAppsColumns).isEqualTo(0)
-    }
-
-    @Test
-    fun allAppsLeftRightPadding() {
-        assertThat(dp.allAppsLeftRightPadding).isEqualTo(91)
-    }
-
-    @Test
-    fun allAppsLeftRightMargin() {
-        assertThat(dp.allAppsLeftRightMargin).isEqualTo(0)
-    }
-
-    @Test
-    fun hotseatBarSizePx() {
-        assertThat(dp.hotseatBarSizePx).isEqualTo(669)
-    }
-
-    @Test
-    fun hotseatCellHeightPx() {
-        assertThat(dp.hotseatCellHeightPx).isEqualTo(221)
-    }
-
-    @Test
-    fun hotseatBarBottomPaddingPx() {
-        assertThat(dp.hotseatBarBottomSpacePx).isEqualTo(168)
-    }
-
-    @Test
-    fun hotseatBarSidePaddingStartPx() {
-        assertThat(dp.hotseatBarSidePaddingStartPx).isEqualTo(0)
-    }
-
-    @Test
-    fun hotseatBarSidePaddingEndPx() {
-        assertThat(dp.hotseatBarSidePaddingEndPx).isEqualTo(0)
-    }
-
-    @Test
-    fun hotseatQsbSpace() {
-        assertThat(dp.hotseatQsbSpace).isEqualTo(126)
-    }
-
-    @Test
-    fun hotseatQsbHeight() {
-        assertThat(dp.hotseatQsbHeight).isEqualTo(221)
-    }
-
-    @Test
-    fun springLoadedHotseatBarTopMarginPx() {
-        assertThat(dp.springLoadedHotseatBarTopMarginPx).isEqualTo(266)
-    }
-
-    @Test
-    fun numShownHotseatIcons() {
-        assertThat(dp.numShownHotseatIcons).isEqualTo(4)
-    }
-
-    @Test
-    fun hotseatBorderSpace() {
-        assertThat(dp.hotseatBorderSpace).isEqualTo(135)
-    }
-
-    @Test
-    fun isQsbInline() {
-        assertThat(dp.isQsbInline).isEqualTo(false)
-    }
-
-    @Test
-    fun qsbWidth() {
-        assertThat(dp.qsbWidth).isEqualTo(1189)
-    }
-
-    @Test
-    fun isTaskbarPresent() {
-        assertThat(dp.isTaskbarPresent).isEqualTo(false)
-    }
-
-    @Test
-    fun isTaskbarPresentInApps() {
-        assertThat(dp.isTaskbarPresentInApps).isEqualTo(false)
-    }
-
-    @Test
-    fun taskbarSize() {
-        assertThat(dp.taskbarSize).isEqualTo(0)
-    }
-
-    @Test
-    fun desiredWorkspaceHorizontalMarginPx() {
-        assertThat(dp.desiredWorkspaceHorizontalMarginPx).isEqualTo(91)
-    }
-
-    @Test
-    fun workspacePaddingLeft() {
-        assertThat(dp.workspacePadding.left).isEqualTo(53)
-    }
-
-    @Test
-    fun workspacePaddingTop() {
-        assertThat(dp.workspacePadding.top).isEqualTo(0)
-    }
-
-    @Test
-    fun workspacePaddingRight() {
-        assertThat(dp.workspacePadding.right).isEqualTo(53)
-    }
-
-    @Test
-    fun workspacePaddingBottom() {
-        assertThat(dp.workspacePadding.bottom).isEqualTo(573)
-    }
-
-    @Test
-    fun iconScale() {
-        assertThat(dp.iconScale).isEqualTo(1)
-    }
-
-    @Test
-    fun cellScaleToFit() {
-        assertThat(dp.cellScaleToFit).isEqualTo(1.182266f)
-    }
-
-    @Test
-    fun workspaceTopPadding() {
-        assertThat(dp.workspaceTopPadding).isEqualTo(0)
-    }
-
-    @Test
-    fun workspaceBottomPadding() {
-        assertThat(dp.workspaceBottomPadding).isEqualTo(0)
-    }
-
-    @Test
-    fun overviewTaskMarginPx() {
-        assertThat(dp.overviewTaskMarginPx).isEqualTo(56)
-    }
-
-    @Test
-    fun overviewTaskMarginGridPx() {
-        assertThat(dp.overviewTaskMarginGridPx).isEqualTo(0)
-    }
-
-    @Test
-    fun overviewTaskIconSizePx() {
-        assertThat(dp.overviewTaskIconSizePx).isEqualTo(168)
-    }
-
-    @Test
-    fun overviewTaskIconDrawableSizePx() {
-        assertThat(dp.overviewTaskIconDrawableSizePx).isEqualTo(154)
-    }
-
-    @Test
-    fun overviewTaskIconDrawableSizeGridPx() {
-        assertThat(dp.overviewTaskIconDrawableSizeGridPx).isEqualTo(0)
-    }
-
-    @Test
-    fun overviewTaskThumbnailTopMarginPx() {
-        assertThat(dp.overviewTaskThumbnailTopMarginPx).isEqualTo(280)
-    }
-
-    @Test
-    fun overviewActionsTopMarginPx() {
-        assertThat(dp.overviewActionsTopMarginPx).isEqualTo(84)
-    }
-
-    @Test
-    fun overviewActionsHeight() {
-        assertThat(dp.overviewActionsHeight).isEqualTo(168)
-    }
-
-    @Test
-    fun overviewActionsButtonSpacing() {
-        assertThat(dp.overviewActionsButtonSpacing).isEqualTo(126)
-    }
-
-    @Test
-    fun overviewPageSpacing() {
-        assertThat(dp.overviewPageSpacing).isEqualTo(56)
-    }
-
-    @Test
-    fun overviewRowSpacing() {
-        assertThat(dp.overviewRowSpacing).isEqualTo(-112)
-    }
-
-    @Test
-    fun overviewGridSideMargin() {
-        assertThat(dp.overviewGridSideMargin).isEqualTo(0)
-    }
-
-    @Test
-    fun dropTargetBarTopMarginPx() {
-        assertThat(dp.dropTargetBarTopMarginPx).isEqualTo(112)
-    }
-
-    @Test
-    fun dropTargetBarSizePx() {
-        assertThat(dp.dropTargetBarSizePx).isEqualTo(196)
-    }
-
-    @Test
-    fun dropTargetBarBottomMarginPx() {
-        assertThat(dp.dropTargetBarBottomMarginPx).isEqualTo(56)
-    }
-
-    @Test
-    fun workspaceSpringLoadedMinNextPageVisiblePx() {
-        assertThat(dp.workspaceSpringLoadedMinNextPageVisiblePx).isEqualTo(84)
-    }
-
-    @Test
-    fun getWorkspaceSpringLoadScale() {
-        assertThat(dp.workspaceSpringLoadScale).isEqualTo(0.74417657f)
-    }
-
-    @Test
-    fun getCellLayoutHeight() {
-        assertThat(dp.cellLayoutHeight).isEqualTo(2447)
-    }
-
-    @Test
-    fun getCellLayoutWidth() {
-        assertThat(dp.cellLayoutWidth).isEqualTo(1334)
-    }
-
-    @Test
-    fun getPanelCount() {
-        assertThat(dp.panelCount).isEqualTo(1)
-    }
-
-    @Test
-    fun isVerticalBarLayout() {
-        assertThat(dp.isVerticalBarLayout).isEqualTo(false)
-    }
-
-    @Test
-    fun getCellLayoutSpringLoadShrunkTop() {
-        assertThat(dp.cellLayoutSpringLoadShrunkTop).isEqualTo(364)
-    }
-
-    @Test
-    fun getCellLayoutSpringLoadShrunkBottom() {
-        assertThat(dp.cellLayoutSpringLoadShrunkBottom).isEqualTo(2185)
-    }
-
-    @Test
-    fun getQsbOffsetY() {
-        assertThat(dp.qsbOffsetY).isEqualTo(147)
-    }
-
-    @Test
-    fun getTaskbarOffsetY() {
-        assertThat(dp.taskbarOffsetY).isEqualTo(558)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingLeft() {
-        assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(125)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingTop() {
-        assertThat(dp.getHotseatLayoutPadding(context).top).isEqualTo(0)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingRight() {
-        assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(125)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingBottom() {
-        assertThat(dp.getHotseatLayoutPadding(context).bottom).isEqualTo(448)
-    }
-
-    @Test
-    fun hotseatBarEndOffset() {
-        assertThat(dp.hotseatBarEndOffset).isEqualTo(0)
-    }
-}
\ 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
deleted file mode 100644
index d0c9346..0000000
--- a/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletLandscape3ButtonTest.kt
+++ /dev/null
@@ -1,486 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.quickstep
-
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.android.launcher3.DeviceProfile
-import com.android.launcher3.DeviceProfileBaseTest
-import com.google.common.truth.Truth.assertThat
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-
-/**
- * Tests for DeviceProfile for tablet in landscape with 3-Button navigation.
- */
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-class DeviceProfileTabletLandscape3ButtonTest : DeviceProfileBaseTest() {
-
-    lateinit var dp: DeviceProfile
-
-    @Before
-    fun before() {
-        initializeVarsForTablet(isLandscape = true, isGestureMode = false)
-        dp = newDP()
-    }
-
-    @Test
-    fun isScalableGrid() {
-        assertThat(dp.isScalableGrid).isTrue()
-    }
-
-    @Test
-    fun cellWidthPx() {
-        assertThat(dp.cellWidthPx).isEqualTo(227)
-    }
-
-    @Test
-    fun cellHeightPx() {
-        assertThat(dp.cellHeightPx).isEqualTo(294)
-    }
-
-    @Test
-    fun getCellSizeX() {
-        assertThat(dp.cellSize.x).isEqualTo(558)
-    }
-
-    @Test
-    fun getCellSizeY() {
-        assertThat(dp.cellSize.y).isEqualTo(294)
-    }
-
-    @Test
-    fun cellLayoutBorderSpacePxX() {
-        assertThat(dp.cellLayoutBorderSpacePx.x).isEqualTo(57)
-    }
-
-    @Test
-    fun cellLayoutBorderSpacePxY() {
-        assertThat(dp.cellLayoutBorderSpacePx.y).isEqualTo(57)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxLeft() {
-        assertThat(dp.cellLayoutPaddingPx.left).isEqualTo(59)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxTop() {
-        assertThat(dp.cellLayoutPaddingPx.top).isEqualTo(0)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxRight() {
-        assertThat(dp.cellLayoutPaddingPx.right).isEqualTo(59)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxBottom() {
-        assertThat(dp.cellLayoutPaddingPx.bottom).isEqualTo(59)
-    }
-
-    @Test
-    fun iconSizePx() {
-        assertThat(dp.iconSizePx).isEqualTo(112)
-    }
-
-    @Test
-    fun iconTextSizePx() {
-        assertThat(dp.iconTextSizePx).isEqualTo(28)
-    }
-
-    @Test
-    fun iconDrawablePaddingPx() {
-        assertThat(dp.iconDrawablePaddingPx).isEqualTo(14)
-    }
-
-    @Test
-    fun folderCellWidthPx() {
-        assertThat(dp.folderCellWidthPx).isEqualTo(227)
-    }
-
-    @Test
-    fun folderCellHeightPx() {
-        assertThat(dp.folderCellHeightPx).isEqualTo(294)
-    }
-
-    @Test
-    fun folderChildIconSizePx() {
-        assertThat(dp.folderChildIconSizePx).isEqualTo(112)
-    }
-
-    @Test
-    fun folderChildTextSizePx() {
-        assertThat(dp.folderChildTextSizePx).isEqualTo(28)
-    }
-
-    @Test
-    fun folderChildDrawablePaddingPx() {
-        assertThat(dp.folderChildDrawablePaddingPx).isEqualTo(48)
-    }
-
-    @Test
-    fun folderCellLayoutBorderSpaceOriginalPx() {
-        assertThat(dp.folderCellLayoutBorderSpaceOriginalPx).isEqualTo(0)
-    }
-
-    @Test
-    fun folderCellLayoutBorderSpacePxX() {
-        assertThat(dp.folderCellLayoutBorderSpacePx.x).isEqualTo(0)
-    }
-
-    @Test
-    fun folderCellLayoutBorderSpacePxY() {
-        assertThat(dp.folderCellLayoutBorderSpacePx.y).isEqualTo(0)
-    }
-
-    @Test
-    fun bottomSheetTopPadding() {
-        assertThat(dp.bottomSheetTopPadding).isEqualTo(0)
-    }
-
-    @Test
-    fun allAppsShiftRange() {
-        assertThat(dp.allAppsShiftRange).isEqualTo(1600)
-    }
-
-    @Test
-    fun allAppsTopPadding() {
-        assertThat(dp.allAppsTopPadding).isEqualTo(0)
-    }
-
-    @Test
-    fun allAppsIconSizePx() {
-        assertThat(dp.allAppsIconSizePx).isEqualTo(199)
-    }
-
-    @Test
-    fun allAppsIconTextSizePx() {
-        assertThat(dp.allAppsIconTextSizePx).isEqualTo(50)
-    }
-
-    @Test
-    fun allAppsIconDrawablePaddingPx() {
-        assertThat(dp.allAppsIconDrawablePaddingPx).isEqualTo(14)
-    }
-
-    @Test
-    fun allAppsCellHeightPx() {
-        assertThat(dp.allAppsCellHeightPx).isEqualTo(351)
-    }
-
-    @Test
-    fun allAppsCellWidthPx() {
-        assertThat(dp.allAppsCellWidthPx).isEqualTo(227)
-    }
-
-    @Test
-    fun allAppsBorderSpacePxX() {
-        assertThat(dp.allAppsBorderSpacePx.x).isEqualTo(57)
-    }
-
-    @Test
-    fun allAppsBorderSpacePxY() {
-        assertThat(dp.allAppsBorderSpacePx.y).isEqualTo(57)
-    }
-
-    @Test
-    fun numShownAllAppsColumns() {
-        assertThat(dp.numShownAllAppsColumns).isEqualTo(0)
-    }
-
-    @Test
-    fun allAppsLeftRightPadding() {
-        assertThat(dp.allAppsLeftRightPadding).isEqualTo(64)
-    }
-
-    @Test
-    fun allAppsLeftRightMargin() {
-        assertThat(dp.allAppsLeftRightMargin).isEqualTo(1244)
-    }
-
-    @Test
-    fun hotseatBarSizePx() {
-        assertThat(dp.hotseatBarSizePx).isEqualTo(228)
-    }
-
-    @Test
-    fun hotseatCellHeightPx() {
-        assertThat(dp.hotseatCellHeightPx).isEqualTo(126)
-    }
-
-    @Test
-    fun hotseatBarBottomSpacePx() {
-        assertThat(dp.hotseatBarBottomSpacePx).isEqualTo(116)
-    }
-
-    @Test
-    fun hotseatBarSidePaddingStartPx() {
-        assertThat(dp.hotseatBarSidePaddingStartPx).isEqualTo(0)
-    }
-
-    @Test
-    fun hotseatBarSidePaddingEndPx() {
-        assertThat(dp.hotseatBarSidePaddingEndPx).isEqualTo(0)
-    }
-
-    @Test
-    fun hotseatQsbSpace() {
-        assertThat(dp.hotseatQsbSpace).isEqualTo(56)
-    }
-
-    @Test
-    fun hotseatQsbHeight() {
-        assertThat(dp.hotseatQsbHeight).isEqualTo(126)
-    }
-
-    @Test
-    fun springLoadedHotseatBarTopMarginPx() {
-        assertThat(dp.springLoadedHotseatBarTopMarginPx).isEqualTo(128)
-    }
-
-    @Test
-    fun numShownHotseatIcons() {
-        assertThat(dp.numShownHotseatIcons).isEqualTo(5)
-    }
-
-    @Test
-    fun hotseatBorderSpace() {
-        assertThat(dp.hotseatBorderSpace).isEqualTo(32)
-    }
-
-    @Test
-    fun isQsbInline() {
-        assertThat(dp.isQsbInline).isEqualTo(true)
-    }
-
-    @Test
-    fun qsbWidth() {
-        assertThat(dp.qsbWidth).isEqualTo(1237)
-    }
-
-    @Test
-    fun isTaskbarPresent() {
-        assertThat(dp.isTaskbarPresent).isEqualTo(true)
-    }
-
-    @Test
-    fun isTaskbarPresentInApps() {
-        assertThat(dp.isTaskbarPresentInApps).isEqualTo(false)
-    }
-
-    @Test
-    fun taskbarSize() {
-        assertThat(dp.taskbarSize).isEqualTo(120)
-    }
-
-    @Test
-    fun desiredWorkspaceHorizontalMarginPx() {
-        assertThat(dp.desiredWorkspaceHorizontalMarginPx).isEqualTo(78)
-    }
-
-    @Test
-    fun workspacePaddingLeft() {
-        assertThat(dp.workspacePadding.left).isEqualTo(19)
-    }
-
-    @Test
-    fun workspacePaddingTop() {
-        assertThat(dp.workspacePadding.top).isEqualTo(0)
-    }
-
-    @Test
-    fun workspacePaddingRight() {
-        assertThat(dp.workspacePadding.right).isEqualTo(19)
-    }
-
-    @Test
-    fun workspacePaddingBottom() {
-        assertThat(dp.workspacePadding.bottom).isEqualTo(93)
-    }
-
-    @Test
-    fun iconScale() {
-        assertThat(dp.iconScale).isEqualTo(1)
-    }
-
-    @Test
-    fun cellScaleToFit() {
-        assertThat(dp.cellScaleToFit).isEqualTo(1.7736843f)
-    }
-
-    @Test
-    fun workspaceTopPadding() {
-        assertThat(dp.workspaceTopPadding).isEqualTo(0)
-    }
-
-    @Test
-    fun workspaceBottomPadding() {
-        assertThat(dp.workspaceBottomPadding).isEqualTo(0)
-    }
-
-    @Test
-    fun overviewTaskMarginPx() {
-        assertThat(dp.overviewTaskMarginPx).isEqualTo(32)
-    }
-
-    @Test
-    fun overviewTaskMarginGridPx() {
-        assertThat(dp.overviewTaskMarginGridPx).isEqualTo(32)
-    }
-
-    @Test
-    fun overviewTaskIconSizePx() {
-        assertThat(dp.overviewTaskIconSizePx).isEqualTo(96)
-    }
-
-    @Test
-    fun overviewTaskIconDrawableSizePx() {
-        assertThat(dp.overviewTaskIconDrawableSizePx).isEqualTo(88)
-    }
-
-    @Test
-    fun overviewTaskIconDrawableSizeGridPx() {
-        assertThat(dp.overviewTaskIconDrawableSizeGridPx).isEqualTo(88)
-    }
-
-    @Test
-    fun overviewTaskThumbnailTopMarginPx() {
-        assertThat(dp.overviewTaskThumbnailTopMarginPx).isEqualTo(160)
-    }
-
-    @Test
-    fun overviewActionsTopMarginPx() {
-        assertThat(dp.overviewActionsTopMarginPx).isEqualTo(40)
-    }
-
-    @Test
-    fun overviewActionsHeight() {
-        assertThat(dp.overviewActionsHeight).isEqualTo(96)
-    }
-
-    @Test
-    fun overviewActionsButtonSpacing() {
-        assertThat(dp.overviewActionsButtonSpacing).isEqualTo(72)
-    }
-
-    @Test
-    fun overviewPageSpacing() {
-        assertThat(dp.overviewPageSpacing).isEqualTo(88)
-    }
-
-    @Test
-    fun overviewRowSpacing() {
-        assertThat(dp.overviewRowSpacing).isEqualTo(40)
-    }
-
-    @Test
-    fun overviewGridSideMargin() {
-        assertThat(dp.overviewGridSideMargin).isEqualTo(128)
-    }
-
-    @Test
-    fun dropTargetBarTopMarginPx() {
-        assertThat(dp.dropTargetBarTopMarginPx).isEqualTo(0)
-    }
-
-    @Test
-    fun dropTargetBarSizePx() {
-        assertThat(dp.dropTargetBarSizePx).isEqualTo(144)
-    }
-
-    @Test
-    fun dropTargetBarBottomMarginPx() {
-        assertThat(dp.dropTargetBarBottomMarginPx).isEqualTo(64)
-    }
-
-    @Test
-    fun workspaceSpringLoadedMinNextPageVisiblePx() {
-        assertThat(dp.workspaceSpringLoadedMinNextPageVisiblePx).isEqualTo(48)
-    }
-
-    @Test
-    fun getWorkspaceSpringLoadScale() {
-        assertThat(dp.workspaceSpringLoadScale).isEqualTo(0.7363184f)
-    }
-
-    @Test
-    fun getCellLayoutHeight() {
-        assertThat(dp.cellLayoutHeight).isEqualTo(1407)
-    }
-
-    @Test
-    fun getCellLayoutWidth() {
-        assertThat(dp.cellLayoutWidth).isEqualTo(2522)
-    }
-
-    @Test
-    fun getPanelCount() {
-        assertThat(dp.panelCount).isEqualTo(1)
-    }
-
-    @Test
-    fun isVerticalBarLayout() {
-        assertThat(dp.isVerticalBarLayout).isEqualTo(false)
-    }
-
-    @Test
-    fun getCellLayoutSpringLoadShrunkTop() {
-        assertThat(dp.cellLayoutSpringLoadShrunkTop).isEqualTo(208)
-    }
-
-    @Test
-    fun getCellLayoutSpringLoadShrunkBottom() {
-        assertThat(dp.cellLayoutSpringLoadShrunkBottom).isEqualTo(1244)
-    }
-
-    @Test
-    fun getQsbOffsetY() {
-        assertThat(dp.qsbOffsetY).isEqualTo(109)
-    }
-
-    @Test
-    fun getTaskbarOffsetY() {
-        assertThat(dp.taskbarOffsetY).isEqualTo(112)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingLeft() {
-        assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(1305)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingTop() {
-        assertThat(dp.getHotseatLayoutPadding(context).top).isEqualTo(-7)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingRight() {
-        assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(566)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingBottom() {
-        assertThat(dp.getHotseatLayoutPadding(context).bottom).isEqualTo(109)
-    }
-
-    @Test
-    fun hotseatBarEndOffset() {
-        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
deleted file mode 100644
index 456ed2c..0000000
--- a/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletLandscapeTest.kt
+++ /dev/null
@@ -1,486 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.quickstep
-
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.android.launcher3.DeviceProfile
-import com.android.launcher3.DeviceProfileBaseTest
-import com.google.common.truth.Truth.assertThat
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-
-/**
- * Tests for DeviceProfile for tablet in landscape.
- */
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-class DeviceProfileTabletLandscapeTest : DeviceProfileBaseTest() {
-
-    lateinit var dp: DeviceProfile
-
-    @Before
-    fun before() {
-        initializeVarsForTablet(isLandscape = true)
-        dp = newDP()
-    }
-
-    @Test
-    fun isScalableGrid() {
-        assertThat(dp.isScalableGrid).isTrue()
-    }
-
-    @Test
-    fun cellWidthPx() {
-        assertThat(dp.cellWidthPx).isEqualTo(227)
-    }
-
-    @Test
-    fun cellHeightPx() {
-        assertThat(dp.cellHeightPx).isEqualTo(294)
-    }
-
-    @Test
-    fun getCellSizeX() {
-        assertThat(dp.cellSize.x).isEqualTo(558)
-    }
-
-    @Test
-    fun getCellSizeY() {
-        assertThat(dp.cellSize.y).isEqualTo(294)
-    }
-
-    @Test
-    fun cellLayoutBorderSpacePxX() {
-        assertThat(dp.cellLayoutBorderSpacePx.x).isEqualTo(57)
-    }
-
-    @Test
-    fun cellLayoutBorderSpacePxY() {
-        assertThat(dp.cellLayoutBorderSpacePx.y).isEqualTo(57)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxLeft() {
-        assertThat(dp.cellLayoutPaddingPx.left).isEqualTo(59)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxTop() {
-        assertThat(dp.cellLayoutPaddingPx.top).isEqualTo(0)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxRight() {
-        assertThat(dp.cellLayoutPaddingPx.right).isEqualTo(59)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxBottom() {
-        assertThat(dp.cellLayoutPaddingPx.bottom).isEqualTo(59)
-    }
-
-    @Test
-    fun iconSizePx() {
-        assertThat(dp.iconSizePx).isEqualTo(112)
-    }
-
-    @Test
-    fun iconTextSizePx() {
-        assertThat(dp.iconTextSizePx).isEqualTo(28)
-    }
-
-    @Test
-    fun iconDrawablePaddingPx() {
-        assertThat(dp.iconDrawablePaddingPx).isEqualTo(14)
-    }
-
-    @Test
-    fun folderCellWidthPx() {
-        assertThat(dp.folderCellWidthPx).isEqualTo(227)
-    }
-
-    @Test
-    fun folderCellHeightPx() {
-        assertThat(dp.folderCellHeightPx).isEqualTo(294)
-    }
-
-    @Test
-    fun folderChildIconSizePx() {
-        assertThat(dp.folderChildIconSizePx).isEqualTo(112)
-    }
-
-    @Test
-    fun folderChildTextSizePx() {
-        assertThat(dp.folderChildTextSizePx).isEqualTo(28)
-    }
-
-    @Test
-    fun folderChildDrawablePaddingPx() {
-        assertThat(dp.folderChildDrawablePaddingPx).isEqualTo(48)
-    }
-
-    @Test
-    fun folderCellLayoutBorderSpaceOriginalPx() {
-        assertThat(dp.folderCellLayoutBorderSpaceOriginalPx).isEqualTo(0)
-    }
-
-    @Test
-    fun folderCellLayoutBorderSpacePxX() {
-        assertThat(dp.folderCellLayoutBorderSpacePx.x).isEqualTo(0)
-    }
-
-    @Test
-    fun folderCellLayoutBorderSpacePxY() {
-        assertThat(dp.folderCellLayoutBorderSpacePx.y).isEqualTo(0)
-    }
-
-    @Test
-    fun bottomSheetTopPadding() {
-        assertThat(dp.bottomSheetTopPadding).isEqualTo(0)
-    }
-
-    @Test
-    fun allAppsShiftRange() {
-        assertThat(dp.allAppsShiftRange).isEqualTo(1600)
-    }
-
-    @Test
-    fun allAppsTopPadding() {
-        assertThat(dp.allAppsTopPadding).isEqualTo(0)
-    }
-
-    @Test
-    fun allAppsIconSizePx() {
-        assertThat(dp.allAppsIconSizePx).isEqualTo(199)
-    }
-
-    @Test
-    fun allAppsIconTextSizePx() {
-        assertThat(dp.allAppsIconTextSizePx).isEqualTo(50)
-    }
-
-    @Test
-    fun allAppsIconDrawablePaddingPx() {
-        assertThat(dp.allAppsIconDrawablePaddingPx).isEqualTo(14)
-    }
-
-    @Test
-    fun allAppsCellHeightPx() {
-        assertThat(dp.allAppsCellHeightPx).isEqualTo(351)
-    }
-
-    @Test
-    fun allAppsCellWidthPx() {
-        assertThat(dp.allAppsCellWidthPx).isEqualTo(227)
-    }
-
-    @Test
-    fun allAppsBorderSpacePxX() {
-        assertThat(dp.allAppsBorderSpacePx.x).isEqualTo(57)
-    }
-
-    @Test
-    fun allAppsBorderSpacePxY() {
-        assertThat(dp.allAppsBorderSpacePx.y).isEqualTo(57)
-    }
-
-    @Test
-    fun numShownAllAppsColumns() {
-        assertThat(dp.numShownAllAppsColumns).isEqualTo(0)
-    }
-
-    @Test
-    fun allAppsLeftRightPadding() {
-        assertThat(dp.allAppsLeftRightPadding).isEqualTo(64)
-    }
-
-    @Test
-    fun allAppsLeftRightMargin() {
-        assertThat(dp.allAppsLeftRightMargin).isEqualTo(1244)
-    }
-
-    @Test
-    fun hotseatBarSizePx() {
-        assertThat(dp.hotseatBarSizePx).isEqualTo(228)
-    }
-
-    @Test
-    fun hotseatCellHeightPx() {
-        assertThat(dp.hotseatCellHeightPx).isEqualTo(126)
-    }
-
-    @Test
-    fun hotseatBarBottomSpacePx() {
-        assertThat(dp.hotseatBarBottomSpacePx).isEqualTo(116)
-    }
-
-    @Test
-    fun hotseatBarSidePaddingStartPx() {
-        assertThat(dp.hotseatBarSidePaddingStartPx).isEqualTo(0)
-    }
-
-    @Test
-    fun hotseatBarSidePaddingEndPx() {
-        assertThat(dp.hotseatBarSidePaddingEndPx).isEqualTo(0)
-    }
-
-    @Test
-    fun hotseatQsbSpace() {
-        assertThat(dp.hotseatQsbSpace).isEqualTo(56)
-    }
-
-    @Test
-    fun hotseatQsbHeight() {
-        assertThat(dp.hotseatQsbHeight).isEqualTo(126)
-    }
-
-    @Test
-    fun springLoadedHotseatBarTopMarginPx() {
-        assertThat(dp.springLoadedHotseatBarTopMarginPx).isEqualTo(128)
-    }
-
-    @Test
-    fun numShownHotseatIcons() {
-        assertThat(dp.numShownHotseatIcons).isEqualTo(4)
-    }
-
-    @Test
-    fun hotseatBorderSpace() {
-        assertThat(dp.hotseatBorderSpace).isEqualTo(503)
-    }
-
-    @Test
-    fun isQsbInline() {
-        assertThat(dp.isQsbInline).isEqualTo(true)
-    }
-
-    @Test
-    fun qsbWidth() {
-        assertThat(dp.qsbWidth).isEqualTo(-503)
-    }
-
-    @Test
-    fun isTaskbarPresent() {
-        assertThat(dp.isTaskbarPresent).isEqualTo(true)
-    }
-
-    @Test
-    fun isTaskbarPresentInApps() {
-        assertThat(dp.isTaskbarPresentInApps).isEqualTo(false)
-    }
-
-    @Test
-    fun taskbarSize() {
-        assertThat(dp.taskbarSize).isEqualTo(120)
-    }
-
-    @Test
-    fun desiredWorkspaceHorizontalMarginPx() {
-        assertThat(dp.desiredWorkspaceHorizontalMarginPx).isEqualTo(78)
-    }
-
-    @Test
-    fun workspacePaddingLeft() {
-        assertThat(dp.workspacePadding.left).isEqualTo(19)
-    }
-
-    @Test
-    fun workspacePaddingTop() {
-        assertThat(dp.workspacePadding.top).isEqualTo(0)
-    }
-
-    @Test
-    fun workspacePaddingRight() {
-        assertThat(dp.workspacePadding.right).isEqualTo(19)
-    }
-
-    @Test
-    fun workspacePaddingBottom() {
-        assertThat(dp.workspacePadding.bottom).isEqualTo(93)
-    }
-
-    @Test
-    fun iconScale() {
-        assertThat(dp.iconScale).isEqualTo(1)
-    }
-
-    @Test
-    fun cellScaleToFit() {
-        assertThat(dp.cellScaleToFit).isEqualTo(1.7736843f)
-    }
-
-    @Test
-    fun workspaceTopPadding() {
-        assertThat(dp.workspaceTopPadding).isEqualTo(0)
-    }
-
-    @Test
-    fun workspaceBottomPadding() {
-        assertThat(dp.workspaceBottomPadding).isEqualTo(0)
-    }
-
-    @Test
-    fun overviewTaskMarginPx() {
-        assertThat(dp.overviewTaskMarginPx).isEqualTo(32)
-    }
-
-    @Test
-    fun overviewTaskMarginGridPx() {
-        assertThat(dp.overviewTaskMarginGridPx).isEqualTo(32)
-    }
-
-    @Test
-    fun overviewTaskIconSizePx() {
-        assertThat(dp.overviewTaskIconSizePx).isEqualTo(96)
-    }
-
-    @Test
-    fun overviewTaskIconDrawableSizePx() {
-        assertThat(dp.overviewTaskIconDrawableSizePx).isEqualTo(88)
-    }
-
-    @Test
-    fun overviewTaskIconDrawableSizeGridPx() {
-        assertThat(dp.overviewTaskIconDrawableSizeGridPx).isEqualTo(88)
-    }
-
-    @Test
-    fun overviewTaskThumbnailTopMarginPx() {
-        assertThat(dp.overviewTaskThumbnailTopMarginPx).isEqualTo(160)
-    }
-
-    @Test
-    fun overviewActionsTopMarginPx() {
-        assertThat(dp.overviewActionsTopMarginPx).isEqualTo(40)
-    }
-
-    @Test
-    fun overviewActionsHeight() {
-        assertThat(dp.overviewActionsHeight).isEqualTo(96)
-    }
-
-    @Test
-    fun overviewActionsButtonSpacing() {
-        assertThat(dp.overviewActionsButtonSpacing).isEqualTo(72)
-    }
-
-    @Test
-    fun overviewPageSpacing() {
-        assertThat(dp.overviewPageSpacing).isEqualTo(88)
-    }
-
-    @Test
-    fun overviewRowSpacing() {
-        assertThat(dp.overviewRowSpacing).isEqualTo(40)
-    }
-
-    @Test
-    fun overviewGridSideMargin() {
-        assertThat(dp.overviewGridSideMargin).isEqualTo(128)
-    }
-
-    @Test
-    fun dropTargetBarTopMarginPx() {
-        assertThat(dp.dropTargetBarTopMarginPx).isEqualTo(0)
-    }
-
-    @Test
-    fun dropTargetBarSizePx() {
-        assertThat(dp.dropTargetBarSizePx).isEqualTo(144)
-    }
-
-    @Test
-    fun dropTargetBarBottomMarginPx() {
-        assertThat(dp.dropTargetBarBottomMarginPx).isEqualTo(64)
-    }
-
-    @Test
-    fun workspaceSpringLoadedMinNextPageVisiblePx() {
-        assertThat(dp.workspaceSpringLoadedMinNextPageVisiblePx).isEqualTo(48)
-    }
-
-    @Test
-    fun getWorkspaceSpringLoadScale() {
-        assertThat(dp.workspaceSpringLoadScale).isEqualTo(0.7363184f)
-    }
-
-    @Test
-    fun getCellLayoutHeight() {
-        assertThat(dp.cellLayoutHeight).isEqualTo(1407)
-    }
-
-    @Test
-    fun getCellLayoutWidth() {
-        assertThat(dp.cellLayoutWidth).isEqualTo(2522)
-    }
-
-    @Test
-    fun getPanelCount() {
-        assertThat(dp.panelCount).isEqualTo(1)
-    }
-
-    @Test
-    fun isVerticalBarLayout() {
-        assertThat(dp.isVerticalBarLayout).isEqualTo(false)
-    }
-
-    @Test
-    fun getCellLayoutSpringLoadShrunkTop() {
-        assertThat(dp.cellLayoutSpringLoadShrunkTop).isEqualTo(208)
-    }
-
-    @Test
-    fun getCellLayoutSpringLoadShrunkBottom() {
-        assertThat(dp.cellLayoutSpringLoadShrunkBottom).isEqualTo(1244)
-    }
-
-    @Test
-    fun getQsbOffsetY() {
-        assertThat(dp.qsbOffsetY).isEqualTo(109)
-    }
-
-    @Test
-    fun getTaskbarOffsetY() {
-        assertThat(dp.taskbarOffsetY).isEqualTo(112)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingLeft() {
-        assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(301)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingTop() {
-        assertThat(dp.getHotseatLayoutPadding(context).top).isEqualTo(-7)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingRight() {
-        assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(301)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingBottom() {
-        assertThat(dp.getHotseatLayoutPadding(context).bottom).isEqualTo(109)
-    }
-
-    @Test
-    fun hotseatBarEndOffset() {
-        assertThat(dp.hotseatBarEndOffset).isEqualTo(0)
-    }
-}
\ 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
deleted file mode 100644
index eed3598..0000000
--- a/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletPortrait3ButtonTest.kt
+++ /dev/null
@@ -1,486 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.quickstep
-
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.android.launcher3.DeviceProfile
-import com.android.launcher3.DeviceProfileBaseTest
-import com.google.common.truth.Truth.assertThat
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-
-/**
- * Tests for DeviceProfile for tablet in portrait with 3-Button navigation.
- */
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-class DeviceProfileTabletPortrait3ButtonTest : DeviceProfileBaseTest() {
-
-    lateinit var dp: DeviceProfile
-
-    @Before
-    fun before() {
-        initializeVarsForTablet(isGestureMode = false)
-        dp = newDP()
-    }
-
-    @Test
-    fun isScalableGrid() {
-        assertThat(dp.isScalableGrid).isTrue()
-    }
-
-    @Test
-    fun cellWidthPx() {
-        assertThat(dp.cellWidthPx).isEqualTo(294)
-    }
-
-    @Test
-    fun cellHeightPx() {
-        assertThat(dp.cellHeightPx).isEqualTo(382)
-    }
-
-    @Test
-    fun getCellSizeX() {
-        assertThat(dp.cellSize.x).isEqualTo(294)
-    }
-
-    @Test
-    fun getCellSizeY() {
-        assertThat(dp.cellSize.y).isEqualTo(482)
-    }
-
-    @Test
-    fun cellLayoutBorderSpacePxX() {
-        assertThat(dp.cellLayoutBorderSpacePx.x).isEqualTo(74)
-    }
-
-    @Test
-    fun cellLayoutBorderSpacePxY() {
-        assertThat(dp.cellLayoutBorderSpacePx.y).isEqualTo(74)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxLeft() {
-        assertThat(dp.cellLayoutPaddingPx.left).isEqualTo(72)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxTop() {
-        assertThat(dp.cellLayoutPaddingPx.top).isEqualTo(0)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxRight() {
-        assertThat(dp.cellLayoutPaddingPx.right).isEqualTo(72)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxBottom() {
-        assertThat(dp.cellLayoutPaddingPx.bottom).isEqualTo(72)
-    }
-
-    @Test
-    fun iconSizePx() {
-        assertThat(dp.iconSizePx).isEqualTo(112)
-    }
-
-    @Test
-    fun iconTextSizePx() {
-        assertThat(dp.iconTextSizePx).isEqualTo(28)
-    }
-
-    @Test
-    fun iconDrawablePaddingPx() {
-        assertThat(dp.iconDrawablePaddingPx).isEqualTo(14)
-    }
-
-    @Test
-    fun folderCellWidthPx() {
-        assertThat(dp.folderCellWidthPx).isEqualTo(294)
-    }
-
-    @Test
-    fun folderCellHeightPx() {
-        assertThat(dp.folderCellHeightPx).isEqualTo(382)
-    }
-
-    @Test
-    fun folderChildIconSizePx() {
-        assertThat(dp.folderChildIconSizePx).isEqualTo(112)
-    }
-
-    @Test
-    fun folderChildTextSizePx() {
-        assertThat(dp.folderChildTextSizePx).isEqualTo(28)
-    }
-
-    @Test
-    fun folderChildDrawablePaddingPx() {
-        assertThat(dp.folderChildDrawablePaddingPx).isEqualTo(77)
-    }
-
-    @Test
-    fun folderCellLayoutBorderSpaceOriginalPx() {
-        assertThat(dp.folderCellLayoutBorderSpaceOriginalPx).isEqualTo(0)
-    }
-
-    @Test
-    fun folderCellLayoutBorderSpacePxX() {
-        assertThat(dp.folderCellLayoutBorderSpacePx.x).isEqualTo(0)
-    }
-
-    @Test
-    fun folderCellLayoutBorderSpacePxY() {
-        assertThat(dp.folderCellLayoutBorderSpacePx.y).isEqualTo(0)
-    }
-
-    @Test
-    fun bottomSheetTopPadding() {
-        assertThat(dp.bottomSheetTopPadding).isEqualTo(600)
-    }
-
-    @Test
-    fun allAppsShiftRange() {
-        assertThat(dp.allAppsShiftRange).isEqualTo(1960)
-    }
-
-    @Test
-    fun allAppsTopPadding() {
-        assertThat(dp.allAppsTopPadding).isEqualTo(600)
-    }
-
-    @Test
-    fun allAppsIconSizePx() {
-        assertThat(dp.allAppsIconSizePx).isEqualTo(257)
-    }
-
-    @Test
-    fun allAppsIconTextSizePx() {
-        assertThat(dp.allAppsIconTextSizePx).isEqualTo(64)
-    }
-
-    @Test
-    fun allAppsIconDrawablePaddingPx() {
-        assertThat(dp.allAppsIconDrawablePaddingPx).isEqualTo(14)
-    }
-
-    @Test
-    fun allAppsCellHeightPx() {
-        assertThat(dp.allAppsCellHeightPx).isEqualTo(456)
-    }
-
-    @Test
-    fun allAppsCellWidthPx() {
-        assertThat(dp.allAppsCellWidthPx).isEqualTo(294)
-    }
-
-    @Test
-    fun allAppsBorderSpacePxX() {
-        assertThat(dp.allAppsBorderSpacePx.x).isEqualTo(74)
-    }
-
-    @Test
-    fun allAppsBorderSpacePxY() {
-        assertThat(dp.allAppsBorderSpacePx.y).isEqualTo(74)
-    }
-
-    @Test
-    fun numShownAllAppsColumns() {
-        assertThat(dp.numShownAllAppsColumns).isEqualTo(0)
-    }
-
-    @Test
-    fun allAppsLeftRightPadding() {
-        assertThat(dp.allAppsLeftRightPadding).isEqualTo(56)
-    }
-
-    @Test
-    fun allAppsLeftRightMargin() {
-        assertThat(dp.allAppsLeftRightMargin).isEqualTo(781)
-    }
-
-    @Test
-    fun hotseatBarSizePx() {
-        assertThat(dp.hotseatBarSizePx).isEqualTo(386)
-    }
-
-    @Test
-    fun hotseatCellHeightPx() {
-        assertThat(dp.hotseatCellHeightPx).isEqualTo(126)
-    }
-
-    @Test
-    fun hotseatBarBottomSpacePx() {
-        assertThat(dp.hotseatBarBottomSpacePx).isEqualTo(116)
-    }
-
-    @Test
-    fun hotseatBarSidePaddingStartPx() {
-        assertThat(dp.hotseatBarSidePaddingStartPx).isEqualTo(0)
-    }
-
-    @Test
-    fun hotseatBarSidePaddingEndPx() {
-        assertThat(dp.hotseatBarSidePaddingEndPx).isEqualTo(0)
-    }
-
-    @Test
-    fun hotseatQsbSpace() {
-        assertThat(dp.hotseatQsbSpace).isEqualTo(56)
-    }
-
-    @Test
-    fun hotseatQsbHeight() {
-        assertThat(dp.hotseatQsbHeight).isEqualTo(126)
-    }
-
-    @Test
-    fun springLoadedHotseatBarTopMarginPx() {
-        assertThat(dp.springLoadedHotseatBarTopMarginPx).isEqualTo(216)
-    }
-
-    @Test
-    fun numShownHotseatIcons() {
-        assertThat(dp.numShownHotseatIcons).isEqualTo(4)
-    }
-
-    @Test
-    fun hotseatBorderSpace() {
-        assertThat(dp.hotseatBorderSpace).isEqualTo(32)
-    }
-
-    @Test
-    fun isQsbInline() {
-        assertThat(dp.isQsbInline).isEqualTo(false)
-    }
-
-    @Test
-    fun qsbWidth() {
-        assertThat(dp.qsbWidth).isEqualTo(1216)
-    }
-
-    @Test
-    fun isTaskbarPresent() {
-        assertThat(dp.isTaskbarPresent).isEqualTo(true)
-    }
-
-    @Test
-    fun isTaskbarPresentInApps() {
-        assertThat(dp.isTaskbarPresentInApps).isEqualTo(false)
-    }
-
-    @Test
-    fun taskbarSize() {
-        assertThat(dp.taskbarSize).isEqualTo(120)
-    }
-
-    @Test
-    fun desiredWorkspaceHorizontalMarginPx() {
-        assertThat(dp.desiredWorkspaceHorizontalMarginPx).isEqualTo(101)
-    }
-
-    @Test
-    fun workspacePaddingLeft() {
-        assertThat(dp.workspacePadding.left).isEqualTo(29)
-    }
-
-    @Test
-    fun workspacePaddingTop() {
-        assertThat(dp.workspacePadding.top).isEqualTo(0)
-    }
-
-    @Test
-    fun workspacePaddingRight() {
-        assertThat(dp.workspacePadding.right).isEqualTo(29)
-    }
-
-    @Test
-    fun workspacePaddingBottom() {
-        assertThat(dp.workspacePadding.bottom).isEqualTo(238)
-    }
-
-    @Test
-    fun iconScale() {
-        assertThat(dp.iconScale).isEqualTo(1)
-    }
-
-    @Test
-    fun cellScaleToFit() {
-        assertThat(dp.cellScaleToFit).isEqualTo(2.2988505f)
-    }
-
-    @Test
-    fun workspaceTopPadding() {
-        assertThat(dp.workspaceTopPadding).isEqualTo(0)
-    }
-
-    @Test
-    fun workspaceBottomPadding() {
-        assertThat(dp.workspaceBottomPadding).isEqualTo(0)
-    }
-
-    @Test
-    fun overviewTaskMarginPx() {
-        assertThat(dp.overviewTaskMarginPx).isEqualTo(32)
-    }
-
-    @Test
-    fun overviewTaskMarginGridPx() {
-        assertThat(dp.overviewTaskMarginGridPx).isEqualTo(32)
-    }
-
-    @Test
-    fun overviewTaskIconSizePx() {
-        assertThat(dp.overviewTaskIconSizePx).isEqualTo(96)
-    }
-
-    @Test
-    fun overviewTaskIconDrawableSizePx() {
-        assertThat(dp.overviewTaskIconDrawableSizePx).isEqualTo(88)
-    }
-
-    @Test
-    fun overviewTaskIconDrawableSizeGridPx() {
-        assertThat(dp.overviewTaskIconDrawableSizeGridPx).isEqualTo(88)
-    }
-
-    @Test
-    fun overviewTaskThumbnailTopMarginPx() {
-        assertThat(dp.overviewTaskThumbnailTopMarginPx).isEqualTo(160)
-    }
-
-    @Test
-    fun overviewActionsTopMarginPx() {
-        assertThat(dp.overviewActionsTopMarginPx).isEqualTo(48)
-    }
-
-    @Test
-    fun overviewActionsHeight() {
-        assertThat(dp.overviewActionsHeight).isEqualTo(96)
-    }
-
-    @Test
-    fun overviewActionsButtonSpacing() {
-        assertThat(dp.overviewActionsButtonSpacing).isEqualTo(72)
-    }
-
-    @Test
-    fun overviewPageSpacing() {
-        assertThat(dp.overviewPageSpacing).isEqualTo(88)
-    }
-
-    @Test
-    fun overviewRowSpacing() {
-        assertThat(dp.overviewRowSpacing).isEqualTo(40)
-    }
-
-    @Test
-    fun overviewGridSideMargin() {
-        assertThat(dp.overviewGridSideMargin).isEqualTo(128)
-    }
-
-    @Test
-    fun dropTargetBarTopMarginPx() {
-        assertThat(dp.dropTargetBarTopMarginPx).isEqualTo(220)
-    }
-
-    @Test
-    fun dropTargetBarSizePx() {
-        assertThat(dp.dropTargetBarSizePx).isEqualTo(144)
-    }
-
-    @Test
-    fun dropTargetBarBottomMarginPx() {
-        assertThat(dp.dropTargetBarBottomMarginPx).isEqualTo(96)
-    }
-
-    @Test
-    fun workspaceSpringLoadedMinNextPageVisiblePx() {
-        assertThat(dp.workspaceSpringLoadedMinNextPageVisiblePx).isEqualTo(48)
-    }
-
-    @Test
-    fun getWorkspaceSpringLoadScale() {
-        assertThat(dp.workspaceSpringLoadScale).isEqualTo(0.6741674f)
-    }
-
-    @Test
-    fun getCellLayoutHeight() {
-        assertThat(dp.cellLayoutHeight).isEqualTo(2222)
-    }
-
-    @Test
-    fun getCellLayoutWidth() {
-        assertThat(dp.cellLayoutWidth).isEqualTo(1542)
-    }
-
-    @Test
-    fun getPanelCount() {
-        assertThat(dp.panelCount).isEqualTo(1)
-    }
-
-    @Test
-    fun isVerticalBarLayout() {
-        assertThat(dp.isVerticalBarLayout).isEqualTo(false)
-    }
-
-    @Test
-    fun getCellLayoutSpringLoadShrunkTop() {
-        assertThat(dp.cellLayoutSpringLoadShrunkTop).isEqualTo(460)
-    }
-
-    @Test
-    fun getCellLayoutSpringLoadShrunkBottom() {
-        assertThat(dp.cellLayoutSpringLoadShrunkBottom).isEqualTo(1958)
-    }
-
-    @Test
-    fun getQsbOffsetY() {
-        assertThat(dp.qsbOffsetY).isEqualTo(272)
-    }
-
-    @Test
-    fun getTaskbarOffsetY() {
-        assertThat(dp.taskbarOffsetY).isEqualTo(112)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingLeft() {
-        assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(528)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingTop() {
-        assertThat(dp.getHotseatLayoutPadding(context).top).isEqualTo(151)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingRight() {
-        assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(528)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingBottom() {
-        assertThat(dp.getHotseatLayoutPadding(context).bottom).isEqualTo(109)
-    }
-
-    @Test
-    fun hotseatBarEndOffset() {
-        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
deleted file mode 100644
index 4be3e45..0000000
--- a/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletPortraitTest.kt
+++ /dev/null
@@ -1,486 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.quickstep
-
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.android.launcher3.DeviceProfile
-import com.android.launcher3.DeviceProfileBaseTest
-import com.google.common.truth.Truth.assertThat
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-
-/**
- * Tests for DeviceProfile for tablet in portrait.
- */
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-class DeviceProfileTabletPortraitTest : DeviceProfileBaseTest() {
-
-    lateinit var dp: DeviceProfile
-
-    @Before
-    fun before() {
-        initializeVarsForTablet()
-        dp = newDP()
-    }
-
-    @Test
-    fun isScalableGrid() {
-        assertThat(dp.isScalableGrid).isTrue()
-    }
-
-    @Test
-    fun cellWidthPx() {
-        assertThat(dp.cellWidthPx).isEqualTo(294)
-    }
-
-    @Test
-    fun cellHeightPx() {
-        assertThat(dp.cellHeightPx).isEqualTo(382)
-    }
-
-    @Test
-    fun getCellSizeX() {
-        assertThat(dp.cellSize.x).isEqualTo(294)
-    }
-
-    @Test
-    fun getCellSizeY() {
-        assertThat(dp.cellSize.y).isEqualTo(482)
-    }
-
-    @Test
-    fun cellLayoutBorderSpacePxX() {
-        assertThat(dp.cellLayoutBorderSpacePx.x).isEqualTo(74)
-    }
-
-    @Test
-    fun cellLayoutBorderSpacePxY() {
-        assertThat(dp.cellLayoutBorderSpacePx.y).isEqualTo(74)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxLeft() {
-        assertThat(dp.cellLayoutPaddingPx.left).isEqualTo(72)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxTop() {
-        assertThat(dp.cellLayoutPaddingPx.top).isEqualTo(0)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxRight() {
-        assertThat(dp.cellLayoutPaddingPx.right).isEqualTo(72)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxBottom() {
-        assertThat(dp.cellLayoutPaddingPx.bottom).isEqualTo(72)
-    }
-
-    @Test
-    fun iconSizePx() {
-        assertThat(dp.iconSizePx).isEqualTo(112)
-    }
-
-    @Test
-    fun iconTextSizePx() {
-        assertThat(dp.iconTextSizePx).isEqualTo(28)
-    }
-
-    @Test
-    fun iconDrawablePaddingPx() {
-        assertThat(dp.iconDrawablePaddingPx).isEqualTo(14)
-    }
-
-    @Test
-    fun folderCellWidthPx() {
-        assertThat(dp.folderCellWidthPx).isEqualTo(294)
-    }
-
-    @Test
-    fun folderCellHeightPx() {
-        assertThat(dp.folderCellHeightPx).isEqualTo(382)
-    }
-
-    @Test
-    fun folderChildIconSizePx() {
-        assertThat(dp.folderChildIconSizePx).isEqualTo(112)
-    }
-
-    @Test
-    fun folderChildTextSizePx() {
-        assertThat(dp.folderChildTextSizePx).isEqualTo(28)
-    }
-
-    @Test
-    fun folderChildDrawablePaddingPx() {
-        assertThat(dp.folderChildDrawablePaddingPx).isEqualTo(77)
-    }
-
-    @Test
-    fun folderCellLayoutBorderSpaceOriginalPx() {
-        assertThat(dp.folderCellLayoutBorderSpaceOriginalPx).isEqualTo(0)
-    }
-
-    @Test
-    fun folderCellLayoutBorderSpacePxX() {
-        assertThat(dp.folderCellLayoutBorderSpacePx.x).isEqualTo(0)
-    }
-
-    @Test
-    fun folderCellLayoutBorderSpacePxY() {
-        assertThat(dp.folderCellLayoutBorderSpacePx.y).isEqualTo(0)
-    }
-
-    @Test
-    fun bottomSheetTopPadding() {
-        assertThat(dp.bottomSheetTopPadding).isEqualTo(600)
-    }
-
-    @Test
-    fun allAppsShiftRange() {
-        assertThat(dp.allAppsShiftRange).isEqualTo(1960)
-    }
-
-    @Test
-    fun allAppsTopPadding() {
-        assertThat(dp.allAppsTopPadding).isEqualTo(600)
-    }
-
-    @Test
-    fun allAppsIconSizePx() {
-        assertThat(dp.allAppsIconSizePx).isEqualTo(257)
-    }
-
-    @Test
-    fun allAppsIconTextSizePx() {
-        assertThat(dp.allAppsIconTextSizePx).isEqualTo(64)
-    }
-
-    @Test
-    fun allAppsIconDrawablePaddingPx() {
-        assertThat(dp.allAppsIconDrawablePaddingPx).isEqualTo(14)
-    }
-
-    @Test
-    fun allAppsCellHeightPx() {
-        assertThat(dp.allAppsCellHeightPx).isEqualTo(456)
-    }
-
-    @Test
-    fun allAppsCellWidthPx() {
-        assertThat(dp.allAppsCellWidthPx).isEqualTo(294)
-    }
-
-    @Test
-    fun allAppsBorderSpacePxX() {
-        assertThat(dp.allAppsBorderSpacePx.x).isEqualTo(74)
-    }
-
-    @Test
-    fun allAppsBorderSpacePxY() {
-        assertThat(dp.allAppsBorderSpacePx.y).isEqualTo(74)
-    }
-
-    @Test
-    fun numShownAllAppsColumns() {
-        assertThat(dp.numShownAllAppsColumns).isEqualTo(0)
-    }
-
-    @Test
-    fun allAppsLeftRightPadding() {
-        assertThat(dp.allAppsLeftRightPadding).isEqualTo(56)
-    }
-
-    @Test
-    fun allAppsLeftRightMargin() {
-        assertThat(dp.allAppsLeftRightMargin).isEqualTo(781)
-    }
-
-    @Test
-    fun hotseatBarSizePx() {
-        assertThat(dp.hotseatBarSizePx).isEqualTo(386)
-    }
-
-    @Test
-    fun hotseatCellHeightPx() {
-        assertThat(dp.hotseatCellHeightPx).isEqualTo(126)
-    }
-
-    @Test
-    fun hotseatBarBottomSpacePx() {
-        assertThat(dp.hotseatBarBottomSpacePx).isEqualTo(116)
-    }
-
-    @Test
-    fun hotseatBarSidePaddingStartPx() {
-        assertThat(dp.hotseatBarSidePaddingStartPx).isEqualTo(0)
-    }
-
-    @Test
-    fun hotseatBarSidePaddingEndPx() {
-        assertThat(dp.hotseatBarSidePaddingEndPx).isEqualTo(0)
-    }
-
-    @Test
-    fun hotseatQsbSpace() {
-        assertThat(dp.hotseatQsbSpace).isEqualTo(56)
-    }
-
-    @Test
-    fun hotseatQsbHeight() {
-        assertThat(dp.hotseatQsbHeight).isEqualTo(126)
-    }
-
-    @Test
-    fun springLoadedHotseatBarTopMarginPx() {
-        assertThat(dp.springLoadedHotseatBarTopMarginPx).isEqualTo(216)
-    }
-
-    @Test
-    fun numShownHotseatIcons() {
-        assertThat(dp.numShownHotseatIcons).isEqualTo(4)
-    }
-
-    @Test
-    fun hotseatBorderSpace() {
-        assertThat(dp.hotseatBorderSpace).isEqualTo(256)
-    }
-
-    @Test
-    fun isQsbInline() {
-        assertThat(dp.isQsbInline).isEqualTo(false)
-    }
-
-    @Test
-    fun qsbWidth() {
-        assertThat(dp.qsbWidth).isEqualTo(1216)
-    }
-
-    @Test
-    fun isTaskbarPresent() {
-        assertThat(dp.isTaskbarPresent).isEqualTo(true)
-    }
-
-    @Test
-    fun isTaskbarPresentInApps() {
-        assertThat(dp.isTaskbarPresentInApps).isEqualTo(false)
-    }
-
-    @Test
-    fun taskbarSize() {
-        assertThat(dp.taskbarSize).isEqualTo(120)
-    }
-
-    @Test
-    fun desiredWorkspaceHorizontalMarginPx() {
-        assertThat(dp.desiredWorkspaceHorizontalMarginPx).isEqualTo(101)
-    }
-
-    @Test
-    fun workspacePaddingLeft() {
-        assertThat(dp.workspacePadding.left).isEqualTo(29)
-    }
-
-    @Test
-    fun workspacePaddingTop() {
-        assertThat(dp.workspacePadding.top).isEqualTo(0)
-    }
-
-    @Test
-    fun workspacePaddingRight() {
-        assertThat(dp.workspacePadding.right).isEqualTo(29)
-    }
-
-    @Test
-    fun workspacePaddingBottom() {
-        assertThat(dp.workspacePadding.bottom).isEqualTo(238)
-    }
-
-    @Test
-    fun iconScale() {
-        assertThat(dp.iconScale).isEqualTo(1)
-    }
-
-    @Test
-    fun cellScaleToFit() {
-        assertThat(dp.cellScaleToFit).isEqualTo(2.2988505f)
-    }
-
-    @Test
-    fun workspaceTopPadding() {
-        assertThat(dp.workspaceTopPadding).isEqualTo(0)
-    }
-
-    @Test
-    fun workspaceBottomPadding() {
-        assertThat(dp.workspaceBottomPadding).isEqualTo(0)
-    }
-
-    @Test
-    fun overviewTaskMarginPx() {
-        assertThat(dp.overviewTaskMarginPx).isEqualTo(32)
-    }
-
-    @Test
-    fun overviewTaskMarginGridPx() {
-        assertThat(dp.overviewTaskMarginGridPx).isEqualTo(32)
-    }
-
-    @Test
-    fun overviewTaskIconSizePx() {
-        assertThat(dp.overviewTaskIconSizePx).isEqualTo(96)
-    }
-
-    @Test
-    fun overviewTaskIconDrawableSizePx() {
-        assertThat(dp.overviewTaskIconDrawableSizePx).isEqualTo(88)
-    }
-
-    @Test
-    fun overviewTaskIconDrawableSizeGridPx() {
-        assertThat(dp.overviewTaskIconDrawableSizeGridPx).isEqualTo(88)
-    }
-
-    @Test
-    fun overviewTaskThumbnailTopMarginPx() {
-        assertThat(dp.overviewTaskThumbnailTopMarginPx).isEqualTo(160)
-    }
-
-    @Test
-    fun overviewActionsTopMarginPx() {
-        assertThat(dp.overviewActionsTopMarginPx).isEqualTo(48)
-    }
-
-    @Test
-    fun overviewActionsHeight() {
-        assertThat(dp.overviewActionsHeight).isEqualTo(96)
-    }
-
-    @Test
-    fun overviewActionsButtonSpacing() {
-        assertThat(dp.overviewActionsButtonSpacing).isEqualTo(72)
-    }
-
-    @Test
-    fun overviewPageSpacing() {
-        assertThat(dp.overviewPageSpacing).isEqualTo(88)
-    }
-
-    @Test
-    fun overviewRowSpacing() {
-        assertThat(dp.overviewRowSpacing).isEqualTo(40)
-    }
-
-    @Test
-    fun overviewGridSideMargin() {
-        assertThat(dp.overviewGridSideMargin).isEqualTo(128)
-    }
-
-    @Test
-    fun dropTargetBarTopMarginPx() {
-        assertThat(dp.dropTargetBarTopMarginPx).isEqualTo(220)
-    }
-
-    @Test
-    fun dropTargetBarSizePx() {
-        assertThat(dp.dropTargetBarSizePx).isEqualTo(144)
-    }
-
-    @Test
-    fun dropTargetBarBottomMarginPx() {
-        assertThat(dp.dropTargetBarBottomMarginPx).isEqualTo(96)
-    }
-
-    @Test
-    fun workspaceSpringLoadedMinNextPageVisiblePx() {
-        assertThat(dp.workspaceSpringLoadedMinNextPageVisiblePx).isEqualTo(48)
-    }
-
-    @Test
-    fun getWorkspaceSpringLoadScale() {
-        assertThat(dp.workspaceSpringLoadScale).isEqualTo(0.6741674f)
-    }
-
-    @Test
-    fun getCellLayoutHeight() {
-        assertThat(dp.cellLayoutHeight).isEqualTo(2222)
-    }
-
-    @Test
-    fun getCellLayoutWidth() {
-        assertThat(dp.cellLayoutWidth).isEqualTo(1542)
-    }
-
-    @Test
-    fun getPanelCount() {
-        assertThat(dp.panelCount).isEqualTo(1)
-    }
-
-    @Test
-    fun isVerticalBarLayout() {
-        assertThat(dp.isVerticalBarLayout).isEqualTo(false)
-    }
-
-    @Test
-    fun getCellLayoutSpringLoadShrunkTop() {
-        assertThat(dp.cellLayoutSpringLoadShrunkTop).isEqualTo(460)
-    }
-
-    @Test
-    fun getCellLayoutSpringLoadShrunkBottom() {
-        assertThat(dp.cellLayoutSpringLoadShrunkBottom).isEqualTo(1958)
-    }
-
-    @Test
-    fun getQsbOffsetY() {
-        assertThat(dp.qsbOffsetY).isEqualTo(272)
-    }
-
-    @Test
-    fun getTaskbarOffsetY() {
-        assertThat(dp.taskbarOffsetY).isEqualTo(112)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingLeft() {
-        assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(192)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingTop() {
-        assertThat(dp.getHotseatLayoutPadding(context).top).isEqualTo(151)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingRight() {
-        assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(192)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingBottom() {
-        assertThat(dp.getHotseatLayoutPadding(context).bottom).isEqualTo(109)
-    }
-
-    @Test
-    fun hotseatBarEndOffset() {
-        assertThat(dp.hotseatBarEndOffset).isEqualTo(0)
-    }
-}
\ No newline at end of file
diff --git a/quickstep/tests/src/com/android/quickstep/DeviceProfileTest.kt b/quickstep/tests/src/com/android/quickstep/DeviceProfileTest.kt
new file mode 100644
index 0000000..45a342a
--- /dev/null
+++ b/quickstep/tests/src/com/android/quickstep/DeviceProfileTest.kt
@@ -0,0 +1,1467 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.quickstep
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.launcher3.DeviceProfileBaseTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+
+/**
+ * Tests for DeviceProfile.
+ */
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class DeviceProfileTest : DeviceProfileBaseTest() {
+
+    @Test
+    fun phonePortrait3Button() {
+        initializeVarsForPhone(isGestureMode = false)
+        val dp = newDP()
+
+        assertThat(dump(dp)).isEqualTo("DeviceProfile:\n" +
+                "\t1 dp = 2.625 px\n" +
+                "\tisTablet:false\n" +
+                "\tisPhone:true\n" +
+                "\ttransposeLayoutWithOrientation:true\n" +
+                "\tisGestureMode:false\n" +
+                "\tisLandscape:false\n" +
+                "\tisMultiWindowMode:false\n" +
+                "\tisTwoPanels:false\n" +
+                "\twindowX: 0.0px (0.0dp)\n" +
+                "\twindowY: 0.0px (0.0dp)\n" +
+                "\twidthPx: 1080.0px (411.42856dp)\n" +
+                "\theightPx: 2400.0px (914.2857dp)\n" +
+                "\tavailableWidthPx: 1080.0px (411.42856dp)\n" +
+                "\tavailableHeightPx: 2156.0px (821.3333dp)\n" +
+                "\tmInsets.left: 0.0px (0.0dp)\n" +
+                "\tmInsets.top: 118.0px (44.95238dp)\n" +
+                "\tmInsets.right: 0.0px (0.0dp)\n" +
+                "\tmInsets.bottom: 126.0px (48.0dp)\n" +
+                "\taspectRatio:2.2222223\n" +
+                "\tisScalableGrid:true\n" +
+                "\tinv.numRows: 5\n" +
+                "\tinv.numColumns: 4\n" +
+                "\tinv.numSearchContainerColumns: 4\n" +
+                "\tminCellSize: PointF(80.0, 104.0)dp\n" +
+                "\tcellWidthPx: 210.0px (80.0dp)\n" +
+                "\tcellHeightPx: 272.0px (103.61905dp)\n" +
+                "\tgetCellSize().x: 210.0px (80.0dp)\n" +
+                "\tgetCellSize().y: 272.0px (103.61905dp)\n" +
+                "\tcellLayoutBorderSpacePx Horizontal: 42.0px (16.0dp)\n" +
+                "\tcellLayoutBorderSpacePx Vertical: 42.0px (16.0dp)\n" +
+                "\tcellLayoutPaddingPx.left: 28.0px (10.666667dp)\n" +
+                "\tcellLayoutPaddingPx.top: 28.0px (10.666667dp)\n" +
+                "\tcellLayoutPaddingPx.right: 28.0px (10.666667dp)\n" +
+                "\tcellLayoutPaddingPx.bottom: 28.0px (10.666667dp)\n" +
+                "\ticonSizePx: 157.0px (59.809525dp)\n" +
+                "\ticonTextSizePx: 36.0px (13.714286dp)\n" +
+                "\ticonDrawablePaddingPx: 17.0px (6.4761906dp)\n" +
+                "\tfolderCellWidthPx: 210.0px (80.0dp)\n" +
+                "\tfolderCellHeightPx: 272.0px (103.61905dp)\n" +
+                "\tfolderChildIconSizePx: 158.0px (60.190475dp)\n" +
+                "\tfolderChildTextSizePx: 37.0px (14.095238dp)\n" +
+                "\tfolderChildDrawablePaddingPx: 21.0px (8.0dp)\n" +
+                "\tfolderCellLayoutBorderSpaceOriginalPx: 42.0px (16.0dp)\n" +
+                "\tfolderCellLayoutBorderSpacePx Horizontal: 42.0px (16.0dp)\n" +
+                "\tfolderCellLayoutBorderSpacePx Vertical: 42.0px (16.0dp)\n" +
+                "\tbottomSheetTopPadding: 146.0px (55.61905dp)\n" +
+                "\tallAppsShiftRange: 788.0px (300.1905dp)\n" +
+                "\tallAppsTopPadding: 0.0px (0.0dp)\n" +
+                "\tallAppsIconSizePx: 157.0px (59.809525dp)\n" +
+                "\tallAppsIconTextSizePx: 37.0px (14.095238dp)\n" +
+                "\tallAppsIconDrawablePaddingPx: 18.0px (6.857143dp)\n" +
+                "\tallAppsCellHeightPx: 314.0px (119.61905dp)\n" +
+                "\tallAppsCellWidthPx: 210.0px (80.0dp)\n" +
+                "\tallAppsBorderSpacePxX: 42.0px (16.0dp)\n" +
+                "\tallAppsBorderSpacePxY: 42.0px (16.0dp)\n" +
+                "\tnumShownAllAppsColumns: 4\n" +
+                "\tallAppsLeftRightPadding: 57.0px (21.714285dp)\n" +
+                "\tallAppsLeftRightMargin: 0.0px (0.0dp)\n" +
+                "\thotseatBarSizePx: 511.0px (194.66667dp)\n" +
+                "\tinv.hotseatColumnSpan: 4\n" +
+                "\thotseatCellHeightPx: 177.0px (67.42857dp)\n" +
+                "\thotseatBarBottomSpacePx: 147.0px (56.0dp)\n" +
+                "\thotseatBarSidePaddingStartPx: 0.0px (0.0dp)\n" +
+                "\thotseatBarSidePaddingEndPx: 0.0px (0.0dp)\n" +
+                "\thotseatBarEndOffset: 0.0px (0.0dp)\n" +
+                "\thotseatQsbSpace: 74.0px (28.190475dp)\n" +
+                "\thotseatQsbHeight: 165.0px (62.857143dp)\n" +
+                "\tspringLoadedHotseatBarTopMarginPx: 200.0px (76.190475dp)\n" +
+                "\tgetHotseatLayoutPadding(context).top: 0.0px (0.0dp)\n" +
+                "\tgetHotseatLayoutPadding(context).bottom: 334.0px (127.2381dp)\n" +
+                "\tgetHotseatLayoutPadding(context).left: 83.0px (31.619047dp)\n" +
+                "\tgetHotseatLayoutPadding(context).right: 83.0px (31.619047dp)\n" +
+                "\tnumShownHotseatIcons: 4\n" +
+                "\thotseatBorderSpace: 95.0px (36.190475dp)\n" +
+                "\tisQsbInline: false\n" +
+                "\thotseatQsbWidth: 913.0px (347.8095dp)\n" +
+                "\tisTaskbarPresent:false\n" +
+                "\tisTaskbarPresentInApps:false\n" +
+                "\ttaskbarSize: 0.0px (0.0dp)\n" +
+                "\tdesiredWorkspaceHorizontalMarginPx: 57.0px (21.714285dp)\n" +
+                "\tworkspacePadding.left: 29.0px (11.047619dp)\n" +
+                "\tworkspacePadding.top: 67.0px (25.52381dp)\n" +
+                "\tworkspacePadding.right: 29.0px (11.047619dp)\n" +
+                "\tworkspacePadding.bottom: 504.0px (192.0dp)\n" +
+                "\ticonScale: 0.9981516px (0.38024822dp)\n" +
+                "\tcellScaleToFit : 0.9981516px (0.38024822dp)\n" +
+                "\textraSpace: 211.0px (80.38095dp)\n" +
+                "\tunscaled extraSpace: 211.39073px (80.5298dp)\n" +
+                "\tmaxEmptySpace: 315.0px (120.0dp)\n" +
+                "\tworkspaceTopPadding: 95.0px (36.190475dp)\n" +
+                "\tworkspaceBottomPadding: 116.0px (44.190475dp)\n" +
+                "\toverviewTaskMarginPx: 42.0px (16.0dp)\n" +
+                "\toverviewTaskIconSizePx: 126.0px (48.0dp)\n" +
+                "\toverviewTaskIconDrawableSizePx: 116.0px (44.190475dp)\n" +
+                "\toverviewTaskIconDrawableSizeGridPx: 0.0px (0.0dp)\n" +
+                "\toverviewTaskThumbnailTopMarginPx: 168.0px (64.0dp)\n" +
+                "\toverviewActionsTopMarginPx: 63.0px (24.0dp)\n" +
+                "\toverviewActionsHeight: 126.0px (48.0dp)\n" +
+                "\toverviewActionsButtonSpacing: 95.0px (36.190475dp)\n" +
+                "\toverviewPageSpacing: 42.0px (16.0dp)\n" +
+                "\toverviewRowSpacing: 0.0px (0.0dp)\n" +
+                "\toverviewGridSideMargin: 0.0px (0.0dp)\n" +
+                "\tdropTargetBarTopMarginPx: 84.0px (32.0dp)\n" +
+                "\tdropTargetBarSizePx: 147.0px (56.0dp)\n" +
+                "\tdropTargetBarBottomMarginPx: 42.0px (16.0dp)\n" +
+                "\tgetCellLayoutSpringLoadShrunkTop(): 391.0px (148.95238dp)\n" +
+                "\tgetCellLayoutSpringLoadShrunkBottom(): 1689.0px (643.4286dp)\n" +
+                "\tworkspaceSpringLoadedMinNextPageVisiblePx: 63.0px (24.0dp)\n" +
+                "\tgetWorkspaceSpringLoadScale(): 0.81892747px (0.31197238dp)\n" +
+                "\tgetCellLayoutHeight(): 1585.0px (603.8095dp)\n" +
+                "\tgetCellLayoutWidth(): 1022.0px (389.33334dp)\n")
+    }
+
+    @Test
+    fun phonePortrait() {
+        initializeVarsForPhone()
+        val dp = newDP()
+
+        assertThat(dump(dp)).isEqualTo("DeviceProfile:\n" +
+                "\t1 dp = 2.625 px\n" +
+                "\tisTablet:false\n" +
+                "\tisPhone:true\n" +
+                "\ttransposeLayoutWithOrientation:true\n" +
+                "\tisGestureMode:true\n" +
+                "\tisLandscape:false\n" +
+                "\tisMultiWindowMode:false\n" +
+                "\tisTwoPanels:false\n" +
+                "\twindowX: 0.0px (0.0dp)\n" +
+                "\twindowY: 0.0px (0.0dp)\n" +
+                "\twidthPx: 1080.0px (411.42856dp)\n" +
+                "\theightPx: 2400.0px (914.2857dp)\n" +
+                "\tavailableWidthPx: 1080.0px (411.42856dp)\n" +
+                "\tavailableHeightPx: 2219.0px (845.3333dp)\n" +
+                "\tmInsets.left: 0.0px (0.0dp)\n" +
+                "\tmInsets.top: 118.0px (44.95238dp)\n" +
+                "\tmInsets.right: 0.0px (0.0dp)\n" +
+                "\tmInsets.bottom: 63.0px (24.0dp)\n" +
+                "\taspectRatio:2.2222223\n" +
+                "\tisScalableGrid:true\n" +
+                "\tinv.numRows: 5\n" +
+                "\tinv.numColumns: 4\n" +
+                "\tinv.numSearchContainerColumns: 4\n" +
+                "\tminCellSize: PointF(80.0, 104.0)dp\n" +
+                "\tcellWidthPx: 210.0px (80.0dp)\n" +
+                "\tcellHeightPx: 272.0px (103.61905dp)\n" +
+                "\tgetCellSize().x: 210.0px (80.0dp)\n" +
+                "\tgetCellSize().y: 272.0px (103.61905dp)\n" +
+                "\tcellLayoutBorderSpacePx Horizontal: 42.0px (16.0dp)\n" +
+                "\tcellLayoutBorderSpacePx Vertical: 42.0px (16.0dp)\n" +
+                "\tcellLayoutPaddingPx.left: 28.0px (10.666667dp)\n" +
+                "\tcellLayoutPaddingPx.top: 28.0px (10.666667dp)\n" +
+                "\tcellLayoutPaddingPx.right: 28.0px (10.666667dp)\n" +
+                "\tcellLayoutPaddingPx.bottom: 28.0px (10.666667dp)\n" +
+                "\ticonSizePx: 157.0px (59.809525dp)\n" +
+                "\ticonTextSizePx: 36.0px (13.714286dp)\n" +
+                "\ticonDrawablePaddingPx: 17.0px (6.4761906dp)\n" +
+                "\tfolderCellWidthPx: 210.0px (80.0dp)\n" +
+                "\tfolderCellHeightPx: 272.0px (103.61905dp)\n" +
+                "\tfolderChildIconSizePx: 158.0px (60.190475dp)\n" +
+                "\tfolderChildTextSizePx: 37.0px (14.095238dp)\n" +
+                "\tfolderChildDrawablePaddingPx: 21.0px (8.0dp)\n" +
+                "\tfolderCellLayoutBorderSpaceOriginalPx: 42.0px (16.0dp)\n" +
+                "\tfolderCellLayoutBorderSpacePx Horizontal: 42.0px (16.0dp)\n" +
+                "\tfolderCellLayoutBorderSpacePx Vertical: 42.0px (16.0dp)\n" +
+                "\tbottomSheetTopPadding: 146.0px (55.61905dp)\n" +
+                "\tallAppsShiftRange: 788.0px (300.1905dp)\n" +
+                "\tallAppsTopPadding: 0.0px (0.0dp)\n" +
+                "\tallAppsIconSizePx: 157.0px (59.809525dp)\n" +
+                "\tallAppsIconTextSizePx: 37.0px (14.095238dp)\n" +
+                "\tallAppsIconDrawablePaddingPx: 18.0px (6.857143dp)\n" +
+                "\tallAppsCellHeightPx: 314.0px (119.61905dp)\n" +
+                "\tallAppsCellWidthPx: 210.0px (80.0dp)\n" +
+                "\tallAppsBorderSpacePxX: 42.0px (16.0dp)\n" +
+                "\tallAppsBorderSpacePxY: 42.0px (16.0dp)\n" +
+                "\tnumShownAllAppsColumns: 4\n" +
+                "\tallAppsLeftRightPadding: 57.0px (21.714285dp)\n" +
+                "\tallAppsLeftRightMargin: 0.0px (0.0dp)\n" +
+                "\thotseatBarSizePx: 511.0px (194.66667dp)\n" +
+                "\tinv.hotseatColumnSpan: 4\n" +
+                "\thotseatCellHeightPx: 177.0px (67.42857dp)\n" +
+                "\thotseatBarBottomSpacePx: 126.0px (48.0dp)\n" +
+                "\thotseatBarSidePaddingStartPx: 0.0px (0.0dp)\n" +
+                "\thotseatBarSidePaddingEndPx: 0.0px (0.0dp)\n" +
+                "\thotseatBarEndOffset: 0.0px (0.0dp)\n" +
+                "\thotseatQsbSpace: 95.0px (36.190475dp)\n" +
+                "\thotseatQsbHeight: 165.0px (62.857143dp)\n" +
+                "\tspringLoadedHotseatBarTopMarginPx: 200.0px (76.190475dp)\n" +
+                "\tgetHotseatLayoutPadding(context).top: 0.0px (0.0dp)\n" +
+                "\tgetHotseatLayoutPadding(context).bottom: 334.0px (127.2381dp)\n" +
+                "\tgetHotseatLayoutPadding(context).left: 83.0px (31.619047dp)\n" +
+                "\tgetHotseatLayoutPadding(context).right: 83.0px (31.619047dp)\n" +
+                "\tnumShownHotseatIcons: 4\n" +
+                "\thotseatBorderSpace: 95.0px (36.190475dp)\n" +
+                "\tisQsbInline: false\n" +
+                "\thotseatQsbWidth: 913.0px (347.8095dp)\n" +
+                "\tisTaskbarPresent:false\n" +
+                "\tisTaskbarPresentInApps:false\n" +
+                "\ttaskbarSize: 0.0px (0.0dp)\n" +
+                "\tdesiredWorkspaceHorizontalMarginPx: 57.0px (21.714285dp)\n" +
+                "\tworkspacePadding.left: 29.0px (11.047619dp)\n" +
+                "\tworkspacePadding.top: 67.0px (25.52381dp)\n" +
+                "\tworkspacePadding.right: 29.0px (11.047619dp)\n" +
+                "\tworkspacePadding.bottom: 567.0px (216.0dp)\n" +
+                "\ticonScale: 0.9981516px (0.38024822dp)\n" +
+                "\tcellScaleToFit : 0.9981516px (0.38024822dp)\n" +
+                "\textraSpace: 211.0px (80.38095dp)\n" +
+                "\tunscaled extraSpace: 211.39073px (80.5298dp)\n" +
+                "\tmaxEmptySpace: 315.0px (120.0dp)\n" +
+                "\tworkspaceTopPadding: 95.0px (36.190475dp)\n" +
+                "\tworkspaceBottomPadding: 116.0px (44.190475dp)\n" +
+                "\toverviewTaskMarginPx: 42.0px (16.0dp)\n" +
+                "\toverviewTaskIconSizePx: 126.0px (48.0dp)\n" +
+                "\toverviewTaskIconDrawableSizePx: 116.0px (44.190475dp)\n" +
+                "\toverviewTaskIconDrawableSizeGridPx: 0.0px (0.0dp)\n" +
+                "\toverviewTaskThumbnailTopMarginPx: 168.0px (64.0dp)\n" +
+                "\toverviewActionsTopMarginPx: 63.0px (24.0dp)\n" +
+                "\toverviewActionsHeight: 126.0px (48.0dp)\n" +
+                "\toverviewActionsButtonSpacing: 95.0px (36.190475dp)\n" +
+                "\toverviewPageSpacing: 42.0px (16.0dp)\n" +
+                "\toverviewRowSpacing: 0.0px (0.0dp)\n" +
+                "\toverviewGridSideMargin: 0.0px (0.0dp)\n" +
+                "\tdropTargetBarTopMarginPx: 84.0px (32.0dp)\n" +
+                "\tdropTargetBarSizePx: 147.0px (56.0dp)\n" +
+                "\tdropTargetBarBottomMarginPx: 42.0px (16.0dp)\n" +
+                "\tgetCellLayoutSpringLoadShrunkTop(): 391.0px (148.95238dp)\n" +
+                "\tgetCellLayoutSpringLoadShrunkBottom(): 1689.0px (643.4286dp)\n" +
+                "\tworkspaceSpringLoadedMinNextPageVisiblePx: 63.0px (24.0dp)\n" +
+                "\tgetWorkspaceSpringLoadScale(): 0.81892747px (0.31197238dp)\n" +
+                "\tgetCellLayoutHeight(): 1585.0px (603.8095dp)\n" +
+                "\tgetCellLayoutWidth(): 1022.0px (389.33334dp)\n")
+    }
+
+    @Test
+    fun tabletLandscape3Button() {
+        initializeVarsForTablet(isLandscape = true, isGestureMode = false)
+        val dp = newDP()
+        dp.isTaskbarPresentInApps = true
+
+        assertThat(dump(dp)).isEqualTo("DeviceProfile:\n" +
+                "\t1 dp = 2.0 px\n" +
+                "\tisTablet:true\n" +
+                "\tisPhone:false\n" +
+                "\ttransposeLayoutWithOrientation:false\n" +
+                "\tisGestureMode:false\n" +
+                "\tisLandscape:true\n" +
+                "\tisMultiWindowMode:false\n" +
+                "\tisTwoPanels:false\n" +
+                "\twindowX: 0.0px (0.0dp)\n" +
+                "\twindowY: 0.0px (0.0dp)\n" +
+                "\twidthPx: 2560.0px (1280.0dp)\n" +
+                "\theightPx: 1600.0px (800.0dp)\n" +
+                "\tavailableWidthPx: 2560.0px (1280.0dp)\n" +
+                "\tavailableHeightPx: 1496.0px (748.0dp)\n" +
+                "\tmInsets.left: 0.0px (0.0dp)\n" +
+                "\tmInsets.top: 104.0px (52.0dp)\n" +
+                "\tmInsets.right: 0.0px (0.0dp)\n" +
+                "\tmInsets.bottom: 0.0px (0.0dp)\n" +
+                "\taspectRatio:1.6\n" +
+                "\tisScalableGrid:true\n" +
+                "\tinv.numRows: 5\n" +
+                "\tinv.numColumns: 6\n" +
+                "\tinv.numSearchContainerColumns: 3\n" +
+                "\tminCellSize: PointF(120.0, 104.0)dp\n" +
+                "\tcellWidthPx: 240.0px (120.0dp)\n" +
+                "\tcellHeightPx: 208.0px (104.0dp)\n" +
+                "\tgetCellSize().x: 240.0px (120.0dp)\n" +
+                "\tgetCellSize().y: 208.0px (104.0dp)\n" +
+                "\tcellLayoutBorderSpacePx Horizontal: 128.0px (64.0dp)\n" +
+                "\tcellLayoutBorderSpacePx Vertical: 32.0px (16.0dp)\n" +
+                "\tcellLayoutPaddingPx.left: 59.0px (29.5dp)\n" +
+                "\tcellLayoutPaddingPx.top: 32.0px (16.0dp)\n" +
+                "\tcellLayoutPaddingPx.right: 59.0px (29.5dp)\n" +
+                "\tcellLayoutPaddingPx.bottom: 59.0px (29.5dp)\n" +
+                "\ticonSizePx: 120.0px (60.0dp)\n" +
+                "\ticonTextSizePx: 28.0px (14.0dp)\n" +
+                "\ticonDrawablePaddingPx: 14.0px (7.0dp)\n" +
+                "\tfolderCellWidthPx: 240.0px (120.0dp)\n" +
+                "\tfolderCellHeightPx: 208.0px (104.0dp)\n" +
+                "\tfolderChildIconSizePx: 120.0px (60.0dp)\n" +
+                "\tfolderChildTextSizePx: 28.0px (14.0dp)\n" +
+                "\tfolderChildDrawablePaddingPx: 16.0px (8.0dp)\n" +
+                "\tfolderCellLayoutBorderSpaceOriginalPx: 0.0px (0.0dp)\n" +
+                "\tfolderCellLayoutBorderSpacePx Horizontal: 0.0px (0.0dp)\n" +
+                "\tfolderCellLayoutBorderSpacePx Vertical: 0.0px (0.0dp)\n" +
+                "\tbottomSheetTopPadding: 104.0px (52.0dp)\n" +
+                "\tallAppsShiftRange: 1496.0px (748.0dp)\n" +
+                "\tallAppsTopPadding: 104.0px (52.0dp)\n" +
+                "\tallAppsIconSizePx: 120.0px (60.0dp)\n" +
+                "\tallAppsIconTextSizePx: 28.0px (14.0dp)\n" +
+                "\tallAppsIconDrawablePaddingPx: 14.0px (7.0dp)\n" +
+                "\tallAppsCellHeightPx: 284.0px (142.0dp)\n" +
+                "\tallAppsCellWidthPx: 252.0px (126.0dp)\n" +
+                "\tallAppsBorderSpacePxX: 32.0px (16.0dp)\n" +
+                "\tallAppsBorderSpacePxY: 32.0px (16.0dp)\n" +
+                "\tnumShownAllAppsColumns: 6\n" +
+                "\tallAppsLeftRightPadding: 64.0px (32.0dp)\n" +
+                "\tallAppsLeftRightMargin: 380.0px (190.0dp)\n" +
+                "\thotseatBarSizePx: 200.0px (100.0dp)\n" +
+                "\tinv.hotseatColumnSpan: 4\n" +
+                "\thotseatCellHeightPx: 135.0px (67.5dp)\n" +
+                "\thotseatBarBottomSpacePx: 80.0px (40.0dp)\n" +
+                "\thotseatBarSidePaddingStartPx: 0.0px (0.0dp)\n" +
+                "\thotseatBarSidePaddingEndPx: 0.0px (0.0dp)\n" +
+                "\thotseatBarEndOffset: 705.0px (352.5dp)\n" +
+                "\thotseatQsbSpace: 64.0px (32.0dp)\n" +
+                "\thotseatQsbHeight: 126.0px (63.0dp)\n" +
+                "\tspringLoadedHotseatBarTopMarginPx: 128.0px (64.0dp)\n" +
+                "\tgetHotseatLayoutPadding(context).top: -8.0px (-4.0dp)\n" +
+                "\tgetHotseatLayoutPadding(context).bottom: 73.0px (36.5dp)\n" +
+                "\tgetHotseatLayoutPadding(context).left: 954.0px (477.0dp)\n" +
+                "\tgetHotseatLayoutPadding(context).right: 705.0px (352.5dp)\n" +
+                "\tnumShownHotseatIcons: 6\n" +
+                "\thotseatBorderSpace: 36.0px (18.0dp)\n" +
+                "\tisQsbInline: true\n" +
+                "\thotseatQsbWidth: 619.0px (309.5dp)\n" +
+                "\tisTaskbarPresent:true\n" +
+                "\tisTaskbarPresentInApps:true\n" +
+                "\ttaskbarSize: 120.0px (60.0dp)\n" +
+                "\tdesiredWorkspaceHorizontalMarginPx: 240.0px (120.0dp)\n" +
+                "\tworkspacePadding.left: 181.0px (90.5dp)\n" +
+                "\tworkspacePadding.top: 0.0px (0.0dp)\n" +
+                "\tworkspacePadding.right: 181.0px (90.5dp)\n" +
+                "\tworkspacePadding.bottom: 237.0px (118.5dp)\n" +
+                "\ticonScale: 1.0px (0.5dp)\n" +
+                "\tcellScaleToFit : 1.0px (0.5dp)\n" +
+                "\textraSpace: 104.0px (52.0dp)\n" +
+                "\tunscaled extraSpace: 104.0px (52.0dp)\n" +
+                "\tmaxEmptySpace: 200.0px (100.0dp)\n" +
+                "\tworkspaceTopPadding: 32.0px (16.0dp)\n" +
+                "\tworkspaceBottomPadding: 72.0px (36.0dp)\n" +
+                "\toverviewTaskMarginPx: 32.0px (16.0dp)\n" +
+                "\toverviewTaskIconSizePx: 96.0px (48.0dp)\n" +
+                "\toverviewTaskIconDrawableSizePx: 88.0px (44.0dp)\n" +
+                "\toverviewTaskIconDrawableSizeGridPx: 88.0px (44.0dp)\n" +
+                "\toverviewTaskThumbnailTopMarginPx: 128.0px (64.0dp)\n" +
+                "\toverviewActionsTopMarginPx: 40.0px (20.0dp)\n" +
+                "\toverviewActionsHeight: 96.0px (48.0dp)\n" +
+                "\toverviewActionsButtonSpacing: 72.0px (36.0dp)\n" +
+                "\toverviewPageSpacing: 88.0px (44.0dp)\n" +
+                "\toverviewRowSpacing: 72.0px (36.0dp)\n" +
+                "\toverviewGridSideMargin: 128.0px (64.0dp)\n" +
+                "\tdropTargetBarTopMarginPx: 0.0px (0.0dp)\n" +
+                "\tdropTargetBarSizePx: 144.0px (72.0dp)\n" +
+                "\tdropTargetBarBottomMarginPx: 64.0px (32.0dp)\n" +
+                "\tgetCellLayoutSpringLoadShrunkTop(): 312.0px (156.0dp)\n" +
+                "\tgetCellLayoutSpringLoadShrunkBottom(): 1272.0px (636.0dp)\n" +
+                "\tworkspaceSpringLoadedMinNextPageVisiblePx: 48.0px (24.0dp)\n" +
+                "\tgetWorkspaceSpringLoadScale(): 0.76250994px (0.38125497dp)\n" +
+                "\tgetCellLayoutHeight(): 1259.0px (629.5dp)\n" +
+                "\tgetCellLayoutWidth(): 2198.0px (1099.0dp)\n")
+    }
+
+    @Test
+    fun tabletLandscape() {
+        initializeVarsForTablet(isLandscape = true)
+        val dp = newDP()
+        dp.isTaskbarPresentInApps = true
+
+        assertThat(dump(dp)).isEqualTo("DeviceProfile:\n" +
+                "\t1 dp = 2.0 px\n" +
+                "\tisTablet:true\n" +
+                "\tisPhone:false\n" +
+                "\ttransposeLayoutWithOrientation:false\n" +
+                "\tisGestureMode:true\n" +
+                "\tisLandscape:true\n" +
+                "\tisMultiWindowMode:false\n" +
+                "\tisTwoPanels:false\n" +
+                "\twindowX: 0.0px (0.0dp)\n" +
+                "\twindowY: 0.0px (0.0dp)\n" +
+                "\twidthPx: 2560.0px (1280.0dp)\n" +
+                "\theightPx: 1600.0px (800.0dp)\n" +
+                "\tavailableWidthPx: 2560.0px (1280.0dp)\n" +
+                "\tavailableHeightPx: 1496.0px (748.0dp)\n" +
+                "\tmInsets.left: 0.0px (0.0dp)\n" +
+                "\tmInsets.top: 104.0px (52.0dp)\n" +
+                "\tmInsets.right: 0.0px (0.0dp)\n" +
+                "\tmInsets.bottom: 0.0px (0.0dp)\n" +
+                "\taspectRatio:1.6\n" +
+                "\tisScalableGrid:true\n" +
+                "\tinv.numRows: 5\n" +
+                "\tinv.numColumns: 6\n" +
+                "\tinv.numSearchContainerColumns: 3\n" +
+                "\tminCellSize: PointF(120.0, 104.0)dp\n" +
+                "\tcellWidthPx: 240.0px (120.0dp)\n" +
+                "\tcellHeightPx: 208.0px (104.0dp)\n" +
+                "\tgetCellSize().x: 240.0px (120.0dp)\n" +
+                "\tgetCellSize().y: 208.0px (104.0dp)\n" +
+                "\tcellLayoutBorderSpacePx Horizontal: 128.0px (64.0dp)\n" +
+                "\tcellLayoutBorderSpacePx Vertical: 32.0px (16.0dp)\n" +
+                "\tcellLayoutPaddingPx.left: 59.0px (29.5dp)\n" +
+                "\tcellLayoutPaddingPx.top: 32.0px (16.0dp)\n" +
+                "\tcellLayoutPaddingPx.right: 59.0px (29.5dp)\n" +
+                "\tcellLayoutPaddingPx.bottom: 59.0px (29.5dp)\n" +
+                "\ticonSizePx: 120.0px (60.0dp)\n" +
+                "\ticonTextSizePx: 28.0px (14.0dp)\n" +
+                "\ticonDrawablePaddingPx: 14.0px (7.0dp)\n" +
+                "\tfolderCellWidthPx: 240.0px (120.0dp)\n" +
+                "\tfolderCellHeightPx: 208.0px (104.0dp)\n" +
+                "\tfolderChildIconSizePx: 120.0px (60.0dp)\n" +
+                "\tfolderChildTextSizePx: 28.0px (14.0dp)\n" +
+                "\tfolderChildDrawablePaddingPx: 16.0px (8.0dp)\n" +
+                "\tfolderCellLayoutBorderSpaceOriginalPx: 0.0px (0.0dp)\n" +
+                "\tfolderCellLayoutBorderSpacePx Horizontal: 0.0px (0.0dp)\n" +
+                "\tfolderCellLayoutBorderSpacePx Vertical: 0.0px (0.0dp)\n" +
+                "\tbottomSheetTopPadding: 104.0px (52.0dp)\n" +
+                "\tallAppsShiftRange: 1496.0px (748.0dp)\n" +
+                "\tallAppsTopPadding: 104.0px (52.0dp)\n" +
+                "\tallAppsIconSizePx: 120.0px (60.0dp)\n" +
+                "\tallAppsIconTextSizePx: 28.0px (14.0dp)\n" +
+                "\tallAppsIconDrawablePaddingPx: 14.0px (7.0dp)\n" +
+                "\tallAppsCellHeightPx: 284.0px (142.0dp)\n" +
+                "\tallAppsCellWidthPx: 252.0px (126.0dp)\n" +
+                "\tallAppsBorderSpacePxX: 32.0px (16.0dp)\n" +
+                "\tallAppsBorderSpacePxY: 32.0px (16.0dp)\n" +
+                "\tnumShownAllAppsColumns: 6\n" +
+                "\tallAppsLeftRightPadding: 64.0px (32.0dp)\n" +
+                "\tallAppsLeftRightMargin: 380.0px (190.0dp)\n" +
+                "\thotseatBarSizePx: 200.0px (100.0dp)\n" +
+                "\tinv.hotseatColumnSpan: 4\n" +
+                "\thotseatCellHeightPx: 135.0px (67.5dp)\n" +
+                "\thotseatBarBottomSpacePx: 80.0px (40.0dp)\n" +
+                "\thotseatBarSidePaddingStartPx: 0.0px (0.0dp)\n" +
+                "\thotseatBarSidePaddingEndPx: 0.0px (0.0dp)\n" +
+                "\thotseatBarEndOffset: 0.0px (0.0dp)\n" +
+                "\thotseatQsbSpace: 64.0px (32.0dp)\n" +
+                "\thotseatQsbHeight: 126.0px (63.0dp)\n" +
+                "\tspringLoadedHotseatBarTopMarginPx: 128.0px (64.0dp)\n" +
+                "\tgetHotseatLayoutPadding(context).top: -8.0px (-4.0dp)\n" +
+                "\tgetHotseatLayoutPadding(context).bottom: 73.0px (36.5dp)\n" +
+                "\tgetHotseatLayoutPadding(context).left: 1040.0px (520.0dp)\n" +
+                "\tgetHotseatLayoutPadding(context).right: 300.0px (150.0dp)\n" +
+                "\tnumShownHotseatIcons: 6\n" +
+                "\thotseatBorderSpace: 100.0px (50.0dp)\n" +
+                "\tisQsbInline: true\n" +
+                "\thotseatQsbWidth: 640.0px (320.0dp)\n" +
+                "\tisTaskbarPresent:true\n" +
+                "\tisTaskbarPresentInApps:true\n" +
+                "\ttaskbarSize: 120.0px (60.0dp)\n" +
+                "\tdesiredWorkspaceHorizontalMarginPx: 240.0px (120.0dp)\n" +
+                "\tworkspacePadding.left: 181.0px (90.5dp)\n" +
+                "\tworkspacePadding.top: 0.0px (0.0dp)\n" +
+                "\tworkspacePadding.right: 181.0px (90.5dp)\n" +
+                "\tworkspacePadding.bottom: 237.0px (118.5dp)\n" +
+                "\ticonScale: 1.0px (0.5dp)\n" +
+                "\tcellScaleToFit : 1.0px (0.5dp)\n" +
+                "\textraSpace: 104.0px (52.0dp)\n" +
+                "\tunscaled extraSpace: 104.0px (52.0dp)\n" +
+                "\tmaxEmptySpace: 200.0px (100.0dp)\n" +
+                "\tworkspaceTopPadding: 32.0px (16.0dp)\n" +
+                "\tworkspaceBottomPadding: 72.0px (36.0dp)\n" +
+                "\toverviewTaskMarginPx: 32.0px (16.0dp)\n" +
+                "\toverviewTaskIconSizePx: 96.0px (48.0dp)\n" +
+                "\toverviewTaskIconDrawableSizePx: 88.0px (44.0dp)\n" +
+                "\toverviewTaskIconDrawableSizeGridPx: 88.0px (44.0dp)\n" +
+                "\toverviewTaskThumbnailTopMarginPx: 128.0px (64.0dp)\n" +
+                "\toverviewActionsTopMarginPx: 40.0px (20.0dp)\n" +
+                "\toverviewActionsHeight: 96.0px (48.0dp)\n" +
+                "\toverviewActionsButtonSpacing: 72.0px (36.0dp)\n" +
+                "\toverviewPageSpacing: 88.0px (44.0dp)\n" +
+                "\toverviewRowSpacing: 72.0px (36.0dp)\n" +
+                "\toverviewGridSideMargin: 128.0px (64.0dp)\n" +
+                "\tdropTargetBarTopMarginPx: 0.0px (0.0dp)\n" +
+                "\tdropTargetBarSizePx: 144.0px (72.0dp)\n" +
+                "\tdropTargetBarBottomMarginPx: 64.0px (32.0dp)\n" +
+                "\tgetCellLayoutSpringLoadShrunkTop(): 312.0px (156.0dp)\n" +
+                "\tgetCellLayoutSpringLoadShrunkBottom(): 1272.0px (636.0dp)\n" +
+                "\tworkspaceSpringLoadedMinNextPageVisiblePx: 48.0px (24.0dp)\n" +
+                "\tgetWorkspaceSpringLoadScale(): 0.76250994px (0.38125497dp)\n" +
+                "\tgetCellLayoutHeight(): 1259.0px (629.5dp)\n" +
+                "\tgetCellLayoutWidth(): 2198.0px (1099.0dp)\n")
+    }
+
+    @Test
+    fun tabletPortrait3Button() {
+        initializeVarsForTablet(isGestureMode = false)
+        val dp = newDP()
+        dp.isTaskbarPresentInApps = true
+
+        assertThat(dump(dp)).isEqualTo("DeviceProfile:\n" +
+                "\t1 dp = 2.0 px\n" +
+                "\tisTablet:true\n" +
+                "\tisPhone:false\n" +
+                "\ttransposeLayoutWithOrientation:false\n" +
+                "\tisGestureMode:false\n" +
+                "\tisLandscape:false\n" +
+                "\tisMultiWindowMode:false\n" +
+                "\tisTwoPanels:false\n" +
+                "\twindowX: 0.0px (0.0dp)\n" +
+                "\twindowY: 0.0px (0.0dp)\n" +
+                "\twidthPx: 1600.0px (800.0dp)\n" +
+                "\theightPx: 2560.0px (1280.0dp)\n" +
+                "\tavailableWidthPx: 1600.0px (800.0dp)\n" +
+                "\tavailableHeightPx: 2456.0px (1228.0dp)\n" +
+                "\tmInsets.left: 0.0px (0.0dp)\n" +
+                "\tmInsets.top: 104.0px (52.0dp)\n" +
+                "\tmInsets.right: 0.0px (0.0dp)\n" +
+                "\tmInsets.bottom: 0.0px (0.0dp)\n" +
+                "\taspectRatio:1.6\n" +
+                "\tisScalableGrid:true\n" +
+                "\tinv.numRows: 5\n" +
+                "\tinv.numColumns: 6\n" +
+                "\tinv.numSearchContainerColumns: 3\n" +
+                "\tminCellSize: PointF(102.0, 120.0)dp\n" +
+                "\tcellWidthPx: 204.0px (102.0dp)\n" +
+                "\tcellHeightPx: 240.0px (120.0dp)\n" +
+                "\tgetCellSize().x: 204.0px (102.0dp)\n" +
+                "\tgetCellSize().y: 240.0px (120.0dp)\n" +
+                "\tcellLayoutBorderSpacePx Horizontal: 32.0px (16.0dp)\n" +
+                "\tcellLayoutBorderSpacePx Vertical: 128.0px (64.0dp)\n" +
+                "\tcellLayoutPaddingPx.left: 72.0px (36.0dp)\n" +
+                "\tcellLayoutPaddingPx.top: 72.0px (36.0dp)\n" +
+                "\tcellLayoutPaddingPx.right: 72.0px (36.0dp)\n" +
+                "\tcellLayoutPaddingPx.bottom: 72.0px (36.0dp)\n" +
+                "\ticonSizePx: 120.0px (60.0dp)\n" +
+                "\ticonTextSizePx: 28.0px (14.0dp)\n" +
+                "\ticonDrawablePaddingPx: 14.0px (7.0dp)\n" +
+                "\tfolderCellWidthPx: 204.0px (102.0dp)\n" +
+                "\tfolderCellHeightPx: 240.0px (120.0dp)\n" +
+                "\tfolderChildIconSizePx: 120.0px (60.0dp)\n" +
+                "\tfolderChildTextSizePx: 28.0px (14.0dp)\n" +
+                "\tfolderChildDrawablePaddingPx: 27.0px (13.5dp)\n" +
+                "\tfolderCellLayoutBorderSpaceOriginalPx: 0.0px (0.0dp)\n" +
+                "\tfolderCellLayoutBorderSpacePx Horizontal: 0.0px (0.0dp)\n" +
+                "\tfolderCellLayoutBorderSpacePx Vertical: 0.0px (0.0dp)\n" +
+                "\tbottomSheetTopPadding: 704.0px (352.0dp)\n" +
+                "\tallAppsShiftRange: 1936.0px (968.0dp)\n" +
+                "\tallAppsTopPadding: 624.0px (312.0dp)\n" +
+                "\tallAppsIconSizePx: 120.0px (60.0dp)\n" +
+                "\tallAppsIconTextSizePx: 28.0px (14.0dp)\n" +
+                "\tallAppsIconDrawablePaddingPx: 14.0px (7.0dp)\n" +
+                "\tallAppsCellHeightPx: 316.0px (158.0dp)\n" +
+                "\tallAppsCellWidthPx: 192.0px (96.0dp)\n" +
+                "\tallAppsBorderSpacePxX: 16.0px (8.0dp)\n" +
+                "\tallAppsBorderSpacePxY: 32.0px (16.0dp)\n" +
+                "\tnumShownAllAppsColumns: 6\n" +
+                "\tallAppsLeftRightPadding: 56.0px (28.0dp)\n" +
+                "\tallAppsLeftRightMargin: 128.0px (64.0dp)\n" +
+                "\thotseatBarSizePx: 358.0px (179.0dp)\n" +
+                "\tinv.hotseatColumnSpan: 6\n" +
+                "\thotseatCellHeightPx: 135.0px (67.5dp)\n" +
+                "\thotseatBarBottomSpacePx: 72.0px (36.0dp)\n" +
+                "\thotseatBarSidePaddingStartPx: 0.0px (0.0dp)\n" +
+                "\thotseatBarSidePaddingEndPx: 0.0px (0.0dp)\n" +
+                "\thotseatBarEndOffset: 558.0px (279.0dp)\n" +
+                "\thotseatQsbSpace: 64.0px (32.0dp)\n" +
+                "\thotseatQsbHeight: 126.0px (63.0dp)\n" +
+                "\tspringLoadedHotseatBarTopMarginPx: 216.0px (108.0dp)\n" +
+                "\tgetHotseatLayoutPadding(context).top: 158.0px (79.0dp)\n" +
+                "\tgetHotseatLayoutPadding(context).bottom: 65.0px (32.5dp)\n" +
+                "\tgetHotseatLayoutPadding(context).left: 150.0px (75.0dp)\n" +
+                "\tgetHotseatLayoutPadding(context).right: 558.0px (279.0dp)\n" +
+                "\tnumShownHotseatIcons: 5\n" +
+                "\thotseatBorderSpace: 73.0px (36.5dp)\n" +
+                "\tisQsbInline: false\n" +
+                "\thotseatQsbWidth: 1300.0px (650.0dp)\n" +
+                "\tisTaskbarPresent:true\n" +
+                "\tisTaskbarPresentInApps:true\n" +
+                "\ttaskbarSize: 120.0px (60.0dp)\n" +
+                "\tdesiredWorkspaceHorizontalMarginPx: 108.0px (54.0dp)\n" +
+                "\tworkspacePadding.left: 36.0px (18.0dp)\n" +
+                "\tworkspacePadding.top: 87.0px (43.5dp)\n" +
+                "\tworkspacePadding.right: 36.0px (18.0dp)\n" +
+                "\tworkspacePadding.bottom: 513.0px (256.5dp)\n" +
+                "\ticonScale: 1.0px (0.5dp)\n" +
+                "\tcellScaleToFit : 1.0px (0.5dp)\n" +
+                "\textraSpace: 362.0px (181.0dp)\n" +
+                "\tunscaled extraSpace: 362.0px (181.0dp)\n" +
+                "\tmaxEmptySpace: 19998.0px (9999.0dp)\n" +
+                "\tworkspaceTopPadding: 159.0px (79.5dp)\n" +
+                "\tworkspaceBottomPadding: 203.0px (101.5dp)\n" +
+                "\toverviewTaskMarginPx: 32.0px (16.0dp)\n" +
+                "\toverviewTaskIconSizePx: 96.0px (48.0dp)\n" +
+                "\toverviewTaskIconDrawableSizePx: 88.0px (44.0dp)\n" +
+                "\toverviewTaskIconDrawableSizeGridPx: 88.0px (44.0dp)\n" +
+                "\toverviewTaskThumbnailTopMarginPx: 128.0px (64.0dp)\n" +
+                "\toverviewActionsTopMarginPx: 48.0px (24.0dp)\n" +
+                "\toverviewActionsHeight: 96.0px (48.0dp)\n" +
+                "\toverviewActionsButtonSpacing: 72.0px (36.0dp)\n" +
+                "\toverviewPageSpacing: 88.0px (44.0dp)\n" +
+                "\toverviewRowSpacing: 72.0px (36.0dp)\n" +
+                "\toverviewGridSideMargin: 128.0px (64.0dp)\n" +
+                "\tdropTargetBarTopMarginPx: 220.0px (110.0dp)\n" +
+                "\tdropTargetBarSizePx: 144.0px (72.0dp)\n" +
+                "\tdropTargetBarBottomMarginPx: 96.0px (48.0dp)\n" +
+                "\tgetCellLayoutSpringLoadShrunkTop(): 564.0px (282.0dp)\n" +
+                "\tgetCellLayoutSpringLoadShrunkBottom(): 1986.0px (993.0dp)\n" +
+                "\tworkspaceSpringLoadedMinNextPageVisiblePx: 48.0px (24.0dp)\n" +
+                "\tgetWorkspaceSpringLoadScale(): 0.76616377px (0.38308188dp)\n" +
+                "\tgetCellLayoutHeight(): 1856.0px (928.0dp)\n" +
+                "\tgetCellLayoutWidth(): 1528.0px (764.0dp)\n")
+    }
+
+    @Test
+    fun tabletPortrait() {
+        initializeVarsForTablet()
+        val dp = newDP()
+        dp.isTaskbarPresentInApps = true
+
+        assertThat(dump(dp)).isEqualTo("DeviceProfile:\n" +
+                "\t1 dp = 2.0 px\n" +
+                "\tisTablet:true\n" +
+                "\tisPhone:false\n" +
+                "\ttransposeLayoutWithOrientation:false\n" +
+                "\tisGestureMode:true\n" +
+                "\tisLandscape:false\n" +
+                "\tisMultiWindowMode:false\n" +
+                "\tisTwoPanels:false\n" +
+                "\twindowX: 0.0px (0.0dp)\n" +
+                "\twindowY: 0.0px (0.0dp)\n" +
+                "\twidthPx: 1600.0px (800.0dp)\n" +
+                "\theightPx: 2560.0px (1280.0dp)\n" +
+                "\tavailableWidthPx: 1600.0px (800.0dp)\n" +
+                "\tavailableHeightPx: 2456.0px (1228.0dp)\n" +
+                "\tmInsets.left: 0.0px (0.0dp)\n" +
+                "\tmInsets.top: 104.0px (52.0dp)\n" +
+                "\tmInsets.right: 0.0px (0.0dp)\n" +
+                "\tmInsets.bottom: 0.0px (0.0dp)\n" +
+                "\taspectRatio:1.6\n" +
+                "\tisScalableGrid:true\n" +
+                "\tinv.numRows: 5\n" +
+                "\tinv.numColumns: 6\n" +
+                "\tinv.numSearchContainerColumns: 3\n" +
+                "\tminCellSize: PointF(102.0, 120.0)dp\n" +
+                "\tcellWidthPx: 204.0px (102.0dp)\n" +
+                "\tcellHeightPx: 240.0px (120.0dp)\n" +
+                "\tgetCellSize().x: 204.0px (102.0dp)\n" +
+                "\tgetCellSize().y: 240.0px (120.0dp)\n" +
+                "\tcellLayoutBorderSpacePx Horizontal: 32.0px (16.0dp)\n" +
+                "\tcellLayoutBorderSpacePx Vertical: 128.0px (64.0dp)\n" +
+                "\tcellLayoutPaddingPx.left: 72.0px (36.0dp)\n" +
+                "\tcellLayoutPaddingPx.top: 72.0px (36.0dp)\n" +
+                "\tcellLayoutPaddingPx.right: 72.0px (36.0dp)\n" +
+                "\tcellLayoutPaddingPx.bottom: 72.0px (36.0dp)\n" +
+                "\ticonSizePx: 120.0px (60.0dp)\n" +
+                "\ticonTextSizePx: 28.0px (14.0dp)\n" +
+                "\ticonDrawablePaddingPx: 14.0px (7.0dp)\n" +
+                "\tfolderCellWidthPx: 204.0px (102.0dp)\n" +
+                "\tfolderCellHeightPx: 240.0px (120.0dp)\n" +
+                "\tfolderChildIconSizePx: 120.0px (60.0dp)\n" +
+                "\tfolderChildTextSizePx: 28.0px (14.0dp)\n" +
+                "\tfolderChildDrawablePaddingPx: 27.0px (13.5dp)\n" +
+                "\tfolderCellLayoutBorderSpaceOriginalPx: 0.0px (0.0dp)\n" +
+                "\tfolderCellLayoutBorderSpacePx Horizontal: 0.0px (0.0dp)\n" +
+                "\tfolderCellLayoutBorderSpacePx Vertical: 0.0px (0.0dp)\n" +
+                "\tbottomSheetTopPadding: 704.0px (352.0dp)\n" +
+                "\tallAppsShiftRange: 1936.0px (968.0dp)\n" +
+                "\tallAppsTopPadding: 624.0px (312.0dp)\n" +
+                "\tallAppsIconSizePx: 120.0px (60.0dp)\n" +
+                "\tallAppsIconTextSizePx: 28.0px (14.0dp)\n" +
+                "\tallAppsIconDrawablePaddingPx: 14.0px (7.0dp)\n" +
+                "\tallAppsCellHeightPx: 316.0px (158.0dp)\n" +
+                "\tallAppsCellWidthPx: 192.0px (96.0dp)\n" +
+                "\tallAppsBorderSpacePxX: 16.0px (8.0dp)\n" +
+                "\tallAppsBorderSpacePxY: 32.0px (16.0dp)\n" +
+                "\tnumShownAllAppsColumns: 6\n" +
+                "\tallAppsLeftRightPadding: 56.0px (28.0dp)\n" +
+                "\tallAppsLeftRightMargin: 128.0px (64.0dp)\n" +
+                "\thotseatBarSizePx: 358.0px (179.0dp)\n" +
+                "\tinv.hotseatColumnSpan: 6\n" +
+                "\thotseatCellHeightPx: 135.0px (67.5dp)\n" +
+                "\thotseatBarBottomSpacePx: 72.0px (36.0dp)\n" +
+                "\thotseatBarSidePaddingStartPx: 0.0px (0.0dp)\n" +
+                "\thotseatBarSidePaddingEndPx: 0.0px (0.0dp)\n" +
+                "\thotseatBarEndOffset: 0.0px (0.0dp)\n" +
+                "\thotseatQsbSpace: 64.0px (32.0dp)\n" +
+                "\thotseatQsbHeight: 126.0px (63.0dp)\n" +
+                "\tspringLoadedHotseatBarTopMarginPx: 216.0px (108.0dp)\n" +
+                "\tgetHotseatLayoutPadding(context).top: 158.0px (79.0dp)\n" +
+                "\tgetHotseatLayoutPadding(context).bottom: 65.0px (32.5dp)\n" +
+                "\tgetHotseatLayoutPadding(context).left: 150.0px (75.0dp)\n" +
+                "\tgetHotseatLayoutPadding(context).right: 150.0px (75.0dp)\n" +
+                "\tnumShownHotseatIcons: 6\n" +
+                "\thotseatBorderSpace: 116.0px (58.0dp)\n" +
+                "\tisQsbInline: false\n" +
+                "\thotseatQsbWidth: 1300.0px (650.0dp)\n" +
+                "\tisTaskbarPresent:true\n" +
+                "\tisTaskbarPresentInApps:true\n" +
+                "\ttaskbarSize: 120.0px (60.0dp)\n" +
+                "\tdesiredWorkspaceHorizontalMarginPx: 108.0px (54.0dp)\n" +
+                "\tworkspacePadding.left: 36.0px (18.0dp)\n" +
+                "\tworkspacePadding.top: 87.0px (43.5dp)\n" +
+                "\tworkspacePadding.right: 36.0px (18.0dp)\n" +
+                "\tworkspacePadding.bottom: 513.0px (256.5dp)\n" +
+                "\ticonScale: 1.0px (0.5dp)\n" +
+                "\tcellScaleToFit : 1.0px (0.5dp)\n" +
+                "\textraSpace: 362.0px (181.0dp)\n" +
+                "\tunscaled extraSpace: 362.0px (181.0dp)\n" +
+                "\tmaxEmptySpace: 19998.0px (9999.0dp)\n" +
+                "\tworkspaceTopPadding: 159.0px (79.5dp)\n" +
+                "\tworkspaceBottomPadding: 203.0px (101.5dp)\n" +
+                "\toverviewTaskMarginPx: 32.0px (16.0dp)\n" +
+                "\toverviewTaskIconSizePx: 96.0px (48.0dp)\n" +
+                "\toverviewTaskIconDrawableSizePx: 88.0px (44.0dp)\n" +
+                "\toverviewTaskIconDrawableSizeGridPx: 88.0px (44.0dp)\n" +
+                "\toverviewTaskThumbnailTopMarginPx: 128.0px (64.0dp)\n" +
+                "\toverviewActionsTopMarginPx: 48.0px (24.0dp)\n" +
+                "\toverviewActionsHeight: 96.0px (48.0dp)\n" +
+                "\toverviewActionsButtonSpacing: 72.0px (36.0dp)\n" +
+                "\toverviewPageSpacing: 88.0px (44.0dp)\n" +
+                "\toverviewRowSpacing: 72.0px (36.0dp)\n" +
+                "\toverviewGridSideMargin: 128.0px (64.0dp)\n" +
+                "\tdropTargetBarTopMarginPx: 220.0px (110.0dp)\n" +
+                "\tdropTargetBarSizePx: 144.0px (72.0dp)\n" +
+                "\tdropTargetBarBottomMarginPx: 96.0px (48.0dp)\n" +
+                "\tgetCellLayoutSpringLoadShrunkTop(): 564.0px (282.0dp)\n" +
+                "\tgetCellLayoutSpringLoadShrunkBottom(): 1986.0px (993.0dp)\n" +
+                "\tworkspaceSpringLoadedMinNextPageVisiblePx: 48.0px (24.0dp)\n" +
+                "\tgetWorkspaceSpringLoadScale(): 0.76616377px (0.38308188dp)\n" +
+                "\tgetCellLayoutHeight(): 1856.0px (928.0dp)\n" +
+                "\tgetCellLayoutWidth(): 1528.0px (764.0dp)\n")
+    }
+
+    @Test
+    fun twoPanelLandscape3Button() {
+        initializeVarsForTwoPanel(isLandscape = true, isGestureMode = false)
+        val dp = newDP()
+        dp.isTaskbarPresentInApps = true
+
+        assertThat(dump(dp)).isEqualTo("DeviceProfile:\n" +
+                "\t1 dp = 2.625 px\n" +
+                "\tisTablet:true\n" +
+                "\tisPhone:false\n" +
+                "\ttransposeLayoutWithOrientation:false\n" +
+                "\tisGestureMode:false\n" +
+                "\tisLandscape:true\n" +
+                "\tisMultiWindowMode:false\n" +
+                "\tisTwoPanels:true\n" +
+                "\twindowX: 0.0px (0.0dp)\n" +
+                "\twindowY: 0.0px (0.0dp)\n" +
+                "\twidthPx: 2208.0px (841.1429dp)\n" +
+                "\theightPx: 1840.0px (700.9524dp)\n" +
+                "\tavailableWidthPx: 2208.0px (841.1429dp)\n" +
+                "\tavailableHeightPx: 1730.0px (659.0476dp)\n" +
+                "\tmInsets.left: 0.0px (0.0dp)\n" +
+                "\tmInsets.top: 110.0px (41.904762dp)\n" +
+                "\tmInsets.right: 0.0px (0.0dp)\n" +
+                "\tmInsets.bottom: 0.0px (0.0dp)\n" +
+                "\taspectRatio:1.2\n" +
+                "\tisScalableGrid:true\n" +
+                "\tinv.numRows: 4\n" +
+                "\tinv.numColumns: 4\n" +
+                "\tinv.numSearchContainerColumns: 4\n" +
+                "\tminCellSize: PointF(80.0, 102.0)dp\n" +
+                "\tcellWidthPx: 210.0px (80.0dp)\n" +
+                "\tcellHeightPx: 267.0px (101.71429dp)\n" +
+                "\tgetCellSize().x: 210.0px (80.0dp)\n" +
+                "\tgetCellSize().y: 267.0px (101.71429dp)\n" +
+                "\tcellLayoutBorderSpacePx Horizontal: 52.0px (19.809525dp)\n" +
+                "\tcellLayoutBorderSpacePx Vertical: 52.0px (19.809525dp)\n" +
+                "\tcellLayoutPaddingPx.left: 26.0px (9.904762dp)\n" +
+                "\tcellLayoutPaddingPx.top: 18.0px (6.857143dp)\n" +
+                "\tcellLayoutPaddingPx.right: 26.0px (9.904762dp)\n" +
+                "\tcellLayoutPaddingPx.bottom: 26.0px (9.904762dp)\n" +
+                "\ticonSizePx: 157.0px (59.809525dp)\n" +
+                "\ticonTextSizePx: 36.0px (13.714286dp)\n" +
+                "\ticonDrawablePaddingPx: 17.0px (6.4761906dp)\n" +
+                "\tfolderCellWidthPx: 210.0px (80.0dp)\n" +
+                "\tfolderCellHeightPx: 267.0px (101.71429dp)\n" +
+                "\tfolderChildIconSizePx: 158.0px (60.190475dp)\n" +
+                "\tfolderChildTextSizePx: 37.0px (14.095238dp)\n" +
+                "\tfolderChildDrawablePaddingPx: 19.0px (7.2380953dp)\n" +
+                "\tfolderCellLayoutBorderSpaceOriginalPx: 42.0px (16.0dp)\n" +
+                "\tfolderCellLayoutBorderSpacePx Horizontal: 42.0px (16.0dp)\n" +
+                "\tfolderCellLayoutBorderSpacePx Vertical: 42.0px (16.0dp)\n" +
+                "\tbottomSheetTopPadding: 110.0px (41.904762dp)\n" +
+                "\tallAppsShiftRange: 1730.0px (659.0476dp)\n" +
+                "\tallAppsTopPadding: 110.0px (41.904762dp)\n" +
+                "\tallAppsIconSizePx: 157.0px (59.809525dp)\n" +
+                "\tallAppsIconTextSizePx: 37.0px (14.095238dp)\n" +
+                "\tallAppsIconDrawablePaddingPx: 18.0px (6.857143dp)\n" +
+                "\tallAppsCellHeightPx: 315.0px (120.0dp)\n" +
+                "\tallAppsCellWidthPx: 210.0px (80.0dp)\n" +
+                "\tallAppsBorderSpacePxX: 52.0px (19.809525dp)\n" +
+                "\tallAppsBorderSpacePxY: 42.0px (16.0dp)\n" +
+                "\tnumShownAllAppsColumns: 6\n" +
+                "\tallAppsLeftRightPadding: 137.0px (52.190475dp)\n" +
+                "\tallAppsLeftRightMargin: 207.0px (78.85714dp)\n" +
+                "\thotseatBarSizePx: 417.0px (158.85715dp)\n" +
+                "\tinv.hotseatColumnSpan: 6\n" +
+                "\thotseatCellHeightPx: 177.0px (67.42857dp)\n" +
+                "\thotseatBarBottomSpacePx: 53.0px (20.190475dp)\n" +
+                "\thotseatBarSidePaddingStartPx: 0.0px (0.0dp)\n" +
+                "\thotseatBarSidePaddingEndPx: 0.0px (0.0dp)\n" +
+                "\thotseatBarEndOffset: 744.0px (283.42856dp)\n" +
+                "\thotseatQsbSpace: 74.0px (28.190475dp)\n" +
+                "\thotseatQsbHeight: 165.0px (62.857143dp)\n" +
+                "\tspringLoadedHotseatBarTopMarginPx: 116.0px (44.190475dp)\n" +
+                "\tgetHotseatLayoutPadding(context).top: 197.0px (75.04762dp)\n" +
+                "\tgetHotseatLayoutPadding(context).bottom: 43.0px (16.380953dp)\n" +
+                "\tgetHotseatLayoutPadding(context).left: 106.0px (40.38095dp)\n" +
+                "\tgetHotseatLayoutPadding(context).right: 744.0px (283.42856dp)\n" +
+                "\tnumShownHotseatIcons: 6\n" +
+                "\thotseatBorderSpace: 83.0px (31.619047dp)\n" +
+                "\tisQsbInline: false\n" +
+                "\thotseatQsbWidth: 1467.0px (558.8571dp)\n" +
+                "\tisTaskbarPresent:true\n" +
+                "\tisTaskbarPresentInApps:true\n" +
+                "\ttaskbarSize: 158.0px (60.190475dp)\n" +
+                "\tdesiredWorkspaceHorizontalMarginPx: 79.0px (30.095238dp)\n" +
+                "\tworkspacePadding.left: 53.0px (20.190475dp)\n" +
+                "\tworkspacePadding.top: 0.0px (0.0dp)\n" +
+                "\tworkspacePadding.right: 53.0px (20.190475dp)\n" +
+                "\tworkspacePadding.bottom: 461.0px (175.61905dp)\n" +
+                "\ticonScale: 0.99864316px (0.3804355dp)\n" +
+                "\tcellScaleToFit : 0.99864316px (0.3804355dp)\n" +
+                "\textraSpace: 57.0px (21.714285dp)\n" +
+                "\tunscaled extraSpace: 57.077446px (21.74379dp)\n" +
+                "\tmaxEmptySpace: 131.0px (49.904762dp)\n" +
+                "\tworkspaceTopPadding: 18.0px (6.857143dp)\n" +
+                "\tworkspaceBottomPadding: 39.0px (14.857142dp)\n" +
+                "\toverviewTaskMarginPx: 32.0px (12.190476dp)\n" +
+                "\toverviewTaskIconSizePx: 126.0px (48.0dp)\n" +
+                "\toverviewTaskIconDrawableSizePx: 116.0px (44.190475dp)\n" +
+                "\toverviewTaskIconDrawableSizeGridPx: 116.0px (44.190475dp)\n" +
+                "\toverviewTaskThumbnailTopMarginPx: 158.0px (60.190475dp)\n" +
+                "\toverviewActionsTopMarginPx: 32.0px (12.190476dp)\n" +
+                "\toverviewActionsHeight: 126.0px (48.0dp)\n" +
+                "\toverviewActionsButtonSpacing: 95.0px (36.190475dp)\n" +
+                "\toverviewPageSpacing: 95.0px (36.190475dp)\n" +
+                "\toverviewRowSpacing: 74.0px (28.190475dp)\n" +
+                "\toverviewGridSideMargin: 168.0px (64.0dp)\n" +
+                "\tdropTargetBarTopMarginPx: 0.0px (0.0dp)\n" +
+                "\tdropTargetBarSizePx: 147.0px (56.0dp)\n" +
+                "\tdropTargetBarBottomMarginPx: 42.0px (16.0dp)\n" +
+                "\tgetCellLayoutSpringLoadShrunkTop(): 299.0px (113.90476dp)\n" +
+                "\tgetCellLayoutSpringLoadShrunkBottom(): 1307.0px (497.90475dp)\n" +
+                "\tworkspaceSpringLoadedMinNextPageVisiblePx: 63.0px (24.0dp)\n" +
+                "\tgetWorkspaceSpringLoadScale(): 0.79432625px (0.30260047dp)\n" +
+                "\tgetCellLayoutHeight(): 1269.0px (483.42856dp)\n" +
+                "\tgetCellLayoutWidth(): 1051.0px (400.38095dp)\n")
+    }
+
+    @Test
+    fun twoPanelLandscape() {
+        initializeVarsForTwoPanel(isLandscape = true)
+        val dp = newDP()
+        dp.isTaskbarPresentInApps = true
+
+        assertThat(dump(dp)).isEqualTo("DeviceProfile:\n" +
+                "\t1 dp = 2.625 px\n" +
+                "\tisTablet:true\n" +
+                "\tisPhone:false\n" +
+                "\ttransposeLayoutWithOrientation:false\n" +
+                "\tisGestureMode:true\n" +
+                "\tisLandscape:true\n" +
+                "\tisMultiWindowMode:false\n" +
+                "\tisTwoPanels:true\n" +
+                "\twindowX: 0.0px (0.0dp)\n" +
+                "\twindowY: 0.0px (0.0dp)\n" +
+                "\twidthPx: 2208.0px (841.1429dp)\n" +
+                "\theightPx: 1840.0px (700.9524dp)\n" +
+                "\tavailableWidthPx: 2208.0px (841.1429dp)\n" +
+                "\tavailableHeightPx: 1730.0px (659.0476dp)\n" +
+                "\tmInsets.left: 0.0px (0.0dp)\n" +
+                "\tmInsets.top: 110.0px (41.904762dp)\n" +
+                "\tmInsets.right: 0.0px (0.0dp)\n" +
+                "\tmInsets.bottom: 0.0px (0.0dp)\n" +
+                "\taspectRatio:1.2\n" +
+                "\tisScalableGrid:true\n" +
+                "\tinv.numRows: 4\n" +
+                "\tinv.numColumns: 4\n" +
+                "\tinv.numSearchContainerColumns: 4\n" +
+                "\tminCellSize: PointF(80.0, 102.0)dp\n" +
+                "\tcellWidthPx: 210.0px (80.0dp)\n" +
+                "\tcellHeightPx: 267.0px (101.71429dp)\n" +
+                "\tgetCellSize().x: 210.0px (80.0dp)\n" +
+                "\tgetCellSize().y: 267.0px (101.71429dp)\n" +
+                "\tcellLayoutBorderSpacePx Horizontal: 52.0px (19.809525dp)\n" +
+                "\tcellLayoutBorderSpacePx Vertical: 52.0px (19.809525dp)\n" +
+                "\tcellLayoutPaddingPx.left: 26.0px (9.904762dp)\n" +
+                "\tcellLayoutPaddingPx.top: 18.0px (6.857143dp)\n" +
+                "\tcellLayoutPaddingPx.right: 26.0px (9.904762dp)\n" +
+                "\tcellLayoutPaddingPx.bottom: 26.0px (9.904762dp)\n" +
+                "\ticonSizePx: 157.0px (59.809525dp)\n" +
+                "\ticonTextSizePx: 36.0px (13.714286dp)\n" +
+                "\ticonDrawablePaddingPx: 17.0px (6.4761906dp)\n" +
+                "\tfolderCellWidthPx: 210.0px (80.0dp)\n" +
+                "\tfolderCellHeightPx: 267.0px (101.71429dp)\n" +
+                "\tfolderChildIconSizePx: 158.0px (60.190475dp)\n" +
+                "\tfolderChildTextSizePx: 37.0px (14.095238dp)\n" +
+                "\tfolderChildDrawablePaddingPx: 19.0px (7.2380953dp)\n" +
+                "\tfolderCellLayoutBorderSpaceOriginalPx: 42.0px (16.0dp)\n" +
+                "\tfolderCellLayoutBorderSpacePx Horizontal: 42.0px (16.0dp)\n" +
+                "\tfolderCellLayoutBorderSpacePx Vertical: 42.0px (16.0dp)\n" +
+                "\tbottomSheetTopPadding: 110.0px (41.904762dp)\n" +
+                "\tallAppsShiftRange: 1730.0px (659.0476dp)\n" +
+                "\tallAppsTopPadding: 110.0px (41.904762dp)\n" +
+                "\tallAppsIconSizePx: 157.0px (59.809525dp)\n" +
+                "\tallAppsIconTextSizePx: 37.0px (14.095238dp)\n" +
+                "\tallAppsIconDrawablePaddingPx: 18.0px (6.857143dp)\n" +
+                "\tallAppsCellHeightPx: 315.0px (120.0dp)\n" +
+                "\tallAppsCellWidthPx: 210.0px (80.0dp)\n" +
+                "\tallAppsBorderSpacePxX: 52.0px (19.809525dp)\n" +
+                "\tallAppsBorderSpacePxY: 42.0px (16.0dp)\n" +
+                "\tnumShownAllAppsColumns: 6\n" +
+                "\tallAppsLeftRightPadding: 137.0px (52.190475dp)\n" +
+                "\tallAppsLeftRightMargin: 207.0px (78.85714dp)\n" +
+                "\thotseatBarSizePx: 417.0px (158.85715dp)\n" +
+                "\tinv.hotseatColumnSpan: 6\n" +
+                "\thotseatCellHeightPx: 177.0px (67.42857dp)\n" +
+                "\thotseatBarBottomSpacePx: 53.0px (20.190475dp)\n" +
+                "\thotseatBarSidePaddingStartPx: 0.0px (0.0dp)\n" +
+                "\thotseatBarSidePaddingEndPx: 0.0px (0.0dp)\n" +
+                "\thotseatBarEndOffset: 0.0px (0.0dp)\n" +
+                "\thotseatQsbSpace: 74.0px (28.190475dp)\n" +
+                "\thotseatQsbHeight: 165.0px (62.857143dp)\n" +
+                "\tspringLoadedHotseatBarTopMarginPx: 116.0px (44.190475dp)\n" +
+                "\tgetHotseatLayoutPadding(context).top: 197.0px (75.04762dp)\n" +
+                "\tgetHotseatLayoutPadding(context).bottom: 43.0px (16.380953dp)\n" +
+                "\tgetHotseatLayoutPadding(context).left: 370.0px (140.95238dp)\n" +
+                "\tgetHotseatLayoutPadding(context).right: 370.0px (140.95238dp)\n" +
+                "\tnumShownHotseatIcons: 6\n" +
+                "\thotseatBorderSpace: 105.0px (40.0dp)\n" +
+                "\tisQsbInline: false\n" +
+                "\thotseatQsbWidth: 1467.0px (558.8571dp)\n" +
+                "\tisTaskbarPresent:true\n" +
+                "\tisTaskbarPresentInApps:true\n" +
+                "\ttaskbarSize: 158.0px (60.190475dp)\n" +
+                "\tdesiredWorkspaceHorizontalMarginPx: 79.0px (30.095238dp)\n" +
+                "\tworkspacePadding.left: 53.0px (20.190475dp)\n" +
+                "\tworkspacePadding.top: 0.0px (0.0dp)\n" +
+                "\tworkspacePadding.right: 53.0px (20.190475dp)\n" +
+                "\tworkspacePadding.bottom: 461.0px (175.61905dp)\n" +
+                "\ticonScale: 0.99864316px (0.3804355dp)\n" +
+                "\tcellScaleToFit : 0.99864316px (0.3804355dp)\n" +
+                "\textraSpace: 57.0px (21.714285dp)\n" +
+                "\tunscaled extraSpace: 57.077446px (21.74379dp)\n" +
+                "\tmaxEmptySpace: 131.0px (49.904762dp)\n" +
+                "\tworkspaceTopPadding: 18.0px (6.857143dp)\n" +
+                "\tworkspaceBottomPadding: 39.0px (14.857142dp)\n" +
+                "\toverviewTaskMarginPx: 32.0px (12.190476dp)\n" +
+                "\toverviewTaskIconSizePx: 126.0px (48.0dp)\n" +
+                "\toverviewTaskIconDrawableSizePx: 116.0px (44.190475dp)\n" +
+                "\toverviewTaskIconDrawableSizeGridPx: 116.0px (44.190475dp)\n" +
+                "\toverviewTaskThumbnailTopMarginPx: 158.0px (60.190475dp)\n" +
+                "\toverviewActionsTopMarginPx: 32.0px (12.190476dp)\n" +
+                "\toverviewActionsHeight: 126.0px (48.0dp)\n" +
+                "\toverviewActionsButtonSpacing: 95.0px (36.190475dp)\n" +
+                "\toverviewPageSpacing: 95.0px (36.190475dp)\n" +
+                "\toverviewRowSpacing: 74.0px (28.190475dp)\n" +
+                "\toverviewGridSideMargin: 168.0px (64.0dp)\n" +
+                "\tdropTargetBarTopMarginPx: 0.0px (0.0dp)\n" +
+                "\tdropTargetBarSizePx: 147.0px (56.0dp)\n" +
+                "\tdropTargetBarBottomMarginPx: 42.0px (16.0dp)\n" +
+                "\tgetCellLayoutSpringLoadShrunkTop(): 299.0px (113.90476dp)\n" +
+                "\tgetCellLayoutSpringLoadShrunkBottom(): 1307.0px (497.90475dp)\n" +
+                "\tworkspaceSpringLoadedMinNextPageVisiblePx: 63.0px (24.0dp)\n" +
+                "\tgetWorkspaceSpringLoadScale(): 0.79432625px (0.30260047dp)\n" +
+                "\tgetCellLayoutHeight(): 1269.0px (483.42856dp)\n" +
+                "\tgetCellLayoutWidth(): 1051.0px (400.38095dp)\n")
+    }
+
+    @Test
+    fun twoPanelPortrait3Button() {
+        initializeVarsForTwoPanel(isGestureMode = false)
+        val dp = newDP()
+        dp.isTaskbarPresentInApps = true
+
+        assertThat(dump(dp)).isEqualTo("DeviceProfile:\n" +
+                "\t1 dp = 2.625 px\n" +
+                "\tisTablet:true\n" +
+                "\tisPhone:false\n" +
+                "\ttransposeLayoutWithOrientation:false\n" +
+                "\tisGestureMode:false\n" +
+                "\tisLandscape:false\n" +
+                "\tisMultiWindowMode:false\n" +
+                "\tisTwoPanels:true\n" +
+                "\twindowX: 0.0px (0.0dp)\n" +
+                "\twindowY: 0.0px (0.0dp)\n" +
+                "\twidthPx: 1840.0px (700.9524dp)\n" +
+                "\theightPx: 2208.0px (841.1429dp)\n" +
+                "\tavailableWidthPx: 1840.0px (700.9524dp)\n" +
+                "\tavailableHeightPx: 2098.0px (799.2381dp)\n" +
+                "\tmInsets.left: 0.0px (0.0dp)\n" +
+                "\tmInsets.top: 110.0px (41.904762dp)\n" +
+                "\tmInsets.right: 0.0px (0.0dp)\n" +
+                "\tmInsets.bottom: 0.0px (0.0dp)\n" +
+                "\taspectRatio:1.2\n" +
+                "\tisScalableGrid:true\n" +
+                "\tinv.numRows: 4\n" +
+                "\tinv.numColumns: 4\n" +
+                "\tinv.numSearchContainerColumns: 4\n" +
+                "\tminCellSize: PointF(68.0, 116.0)dp\n" +
+                "\tcellWidthPx: 178.0px (67.809525dp)\n" +
+                "\tcellHeightPx: 304.0px (115.809525dp)\n" +
+                "\tgetCellSize().x: 178.0px (67.809525dp)\n" +
+                "\tgetCellSize().y: 304.0px (115.809525dp)\n" +
+                "\tcellLayoutBorderSpacePx Horizontal: 42.0px (16.0dp)\n" +
+                "\tcellLayoutBorderSpacePx Vertical: 52.0px (19.809525dp)\n" +
+                "\tcellLayoutPaddingPx.left: 21.0px (8.0dp)\n" +
+                "\tcellLayoutPaddingPx.top: 21.0px (8.0dp)\n" +
+                "\tcellLayoutPaddingPx.right: 21.0px (8.0dp)\n" +
+                "\tcellLayoutPaddingPx.bottom: 21.0px (8.0dp)\n" +
+                "\ticonSizePx: 136.0px (51.809525dp)\n" +
+                "\ticonTextSizePx: 31.0px (11.809524dp)\n" +
+                "\ticonDrawablePaddingPx: 17.0px (6.4761906dp)\n" +
+                "\tfolderCellWidthPx: 192.0px (73.14286dp)\n" +
+                "\tfolderCellHeightPx: 304.0px (115.809525dp)\n" +
+                "\tfolderChildIconSizePx: 158.0px (60.190475dp)\n" +
+                "\tfolderChildTextSizePx: 37.0px (14.095238dp)\n" +
+                "\tfolderChildDrawablePaddingPx: 32.0px (12.190476dp)\n" +
+                "\tfolderCellLayoutBorderSpaceOriginalPx: 42.0px (16.0dp)\n" +
+                "\tfolderCellLayoutBorderSpacePx Horizontal: 42.0px (16.0dp)\n" +
+                "\tfolderCellLayoutBorderSpacePx Vertical: 42.0px (16.0dp)\n" +
+                "\tbottomSheetTopPadding: 110.0px (41.904762dp)\n" +
+                "\tallAppsShiftRange: 2098.0px (799.2381dp)\n" +
+                "\tallAppsTopPadding: 110.0px (41.904762dp)\n" +
+                "\tallAppsIconSizePx: 136.0px (51.809525dp)\n" +
+                "\tallAppsIconTextSizePx: 31.0px (11.809524dp)\n" +
+                "\tallAppsIconDrawablePaddingPx: 18.0px (6.857143dp)\n" +
+                "\tallAppsCellHeightPx: 345.0px (131.42857dp)\n" +
+                "\tallAppsCellWidthPx: 178.0px (67.809525dp)\n" +
+                "\tallAppsBorderSpacePxX: 42.0px (16.0dp)\n" +
+                "\tallAppsBorderSpacePxY: 73.0px (27.809525dp)\n" +
+                "\tnumShownAllAppsColumns: 6\n" +
+                "\tallAppsLeftRightPadding: 126.0px (48.0dp)\n" +
+                "\tallAppsLeftRightMargin: 155.0px (59.04762dp)\n" +
+                "\thotseatBarSizePx: 459.0px (174.85715dp)\n" +
+                "\tinv.hotseatColumnSpan: 6\n" +
+                "\thotseatCellHeightPx: 153.0px (58.285713dp)\n" +
+                "\thotseatBarBottomSpacePx: 95.0px (36.190475dp)\n" +
+                "\thotseatBarSidePaddingStartPx: 0.0px (0.0dp)\n" +
+                "\thotseatBarSidePaddingEndPx: 0.0px (0.0dp)\n" +
+                "\thotseatBarEndOffset: 660.0px (251.42857dp)\n" +
+                "\thotseatQsbSpace: 95.0px (36.190475dp)\n" +
+                "\thotseatQsbHeight: 165.0px (62.857143dp)\n" +
+                "\tspringLoadedHotseatBarTopMarginPx: 171.0px (65.14286dp)\n" +
+                "\tgetHotseatLayoutPadding(context).top: 219.0px (83.42857dp)\n" +
+                "\tgetHotseatLayoutPadding(context).bottom: 87.0px (33.142857dp)\n" +
+                "\tgetHotseatLayoutPadding(context).left: 78.0px (29.714285dp)\n" +
+                "\tgetHotseatLayoutPadding(context).right: 660.0px (251.42857dp)\n" +
+                "\tnumShownHotseatIcons: 6\n" +
+                "\thotseatBorderSpace: 57.0px (21.714285dp)\n" +
+                "\tisQsbInline: false\n" +
+                "\thotseatQsbWidth: 1236.0px (470.85715dp)\n" +
+                "\tisTaskbarPresent:true\n" +
+                "\tisTaskbarPresentInApps:true\n" +
+                "\ttaskbarSize: 158.0px (60.190475dp)\n" +
+                "\tdesiredWorkspaceHorizontalMarginPx: 58.0px (22.095238dp)\n" +
+                "\tworkspacePadding.left: 37.0px (14.095238dp)\n" +
+                "\tworkspacePadding.top: 68.0px (25.904762dp)\n" +
+                "\tworkspacePadding.right: 37.0px (14.095238dp)\n" +
+                "\tworkspacePadding.bottom: 615.0px (234.28572dp)\n" +
+                "\ticonScale: 0.9978308px (0.38012603dp)\n" +
+                "\tcellScaleToFit : 0.9978308px (0.38012603dp)\n" +
+                "\textraSpace: 235.0px (89.52381dp)\n" +
+                "\tunscaled extraSpace: 235.51086px (89.71842dp)\n" +
+                "\tmaxEmptySpace: 236.0px (89.90476dp)\n" +
+                "\tworkspaceTopPadding: 89.0px (33.904762dp)\n" +
+                "\tworkspaceBottomPadding: 146.0px (55.61905dp)\n" +
+                "\toverviewTaskMarginPx: 32.0px (12.190476dp)\n" +
+                "\toverviewTaskIconSizePx: 126.0px (48.0dp)\n" +
+                "\toverviewTaskIconDrawableSizePx: 116.0px (44.190475dp)\n" +
+                "\toverviewTaskIconDrawableSizeGridPx: 116.0px (44.190475dp)\n" +
+                "\toverviewTaskThumbnailTopMarginPx: 158.0px (60.190475dp)\n" +
+                "\toverviewActionsTopMarginPx: 63.0px (24.0dp)\n" +
+                "\toverviewActionsHeight: 126.0px (48.0dp)\n" +
+                "\toverviewActionsButtonSpacing: 95.0px (36.190475dp)\n" +
+                "\toverviewPageSpacing: 95.0px (36.190475dp)\n" +
+                "\toverviewRowSpacing: 74.0px (28.190475dp)\n" +
+                "\toverviewGridSideMargin: 168.0px (64.0dp)\n" +
+                "\tdropTargetBarTopMarginPx: 168.0px (64.0dp)\n" +
+                "\tdropTargetBarSizePx: 147.0px (56.0dp)\n" +
+                "\tdropTargetBarBottomMarginPx: 42.0px (16.0dp)\n" +
+                "\tgetCellLayoutSpringLoadShrunkTop(): 467.0px (177.90475dp)\n" +
+                "\tgetCellLayoutSpringLoadShrunkBottom(): 1578.0px (601.1429dp)\n" +
+                "\tworkspaceSpringLoadedMinNextPageVisiblePx: 63.0px (24.0dp)\n" +
+                "\tgetWorkspaceSpringLoadScale(): 0.785159px (0.29910818dp)\n" +
+                "\tgetCellLayoutHeight(): 1415.0px (539.0476dp)\n" +
+                "\tgetCellLayoutWidth(): 883.0px (336.38095dp)\n")
+    }
+
+    @Test
+    fun twoPanelPortrait() {
+        initializeVarsForTwoPanel()
+        val dp = newDP()
+        dp.isTaskbarPresentInApps = true
+
+        assertThat(dump(dp)).isEqualTo("DeviceProfile:\n" +
+                "\t1 dp = 2.625 px\n" +
+                "\tisTablet:true\n" +
+                "\tisPhone:false\n" +
+                "\ttransposeLayoutWithOrientation:false\n" +
+                "\tisGestureMode:true\n" +
+                "\tisLandscape:false\n" +
+                "\tisMultiWindowMode:false\n" +
+                "\tisTwoPanels:true\n" +
+                "\twindowX: 0.0px (0.0dp)\n" +
+                "\twindowY: 0.0px (0.0dp)\n" +
+                "\twidthPx: 1840.0px (700.9524dp)\n" +
+                "\theightPx: 2208.0px (841.1429dp)\n" +
+                "\tavailableWidthPx: 1840.0px (700.9524dp)\n" +
+                "\tavailableHeightPx: 2098.0px (799.2381dp)\n" +
+                "\tmInsets.left: 0.0px (0.0dp)\n" +
+                "\tmInsets.top: 110.0px (41.904762dp)\n" +
+                "\tmInsets.right: 0.0px (0.0dp)\n" +
+                "\tmInsets.bottom: 0.0px (0.0dp)\n" +
+                "\taspectRatio:1.2\n" +
+                "\tisScalableGrid:true\n" +
+                "\tinv.numRows: 4\n" +
+                "\tinv.numColumns: 4\n" +
+                "\tinv.numSearchContainerColumns: 4\n" +
+                "\tminCellSize: PointF(68.0, 116.0)dp\n" +
+                "\tcellWidthPx: 178.0px (67.809525dp)\n" +
+                "\tcellHeightPx: 304.0px (115.809525dp)\n" +
+                "\tgetCellSize().x: 178.0px (67.809525dp)\n" +
+                "\tgetCellSize().y: 304.0px (115.809525dp)\n" +
+                "\tcellLayoutBorderSpacePx Horizontal: 42.0px (16.0dp)\n" +
+                "\tcellLayoutBorderSpacePx Vertical: 52.0px (19.809525dp)\n" +
+                "\tcellLayoutPaddingPx.left: 21.0px (8.0dp)\n" +
+                "\tcellLayoutPaddingPx.top: 21.0px (8.0dp)\n" +
+                "\tcellLayoutPaddingPx.right: 21.0px (8.0dp)\n" +
+                "\tcellLayoutPaddingPx.bottom: 21.0px (8.0dp)\n" +
+                "\ticonSizePx: 136.0px (51.809525dp)\n" +
+                "\ticonTextSizePx: 31.0px (11.809524dp)\n" +
+                "\ticonDrawablePaddingPx: 17.0px (6.4761906dp)\n" +
+                "\tfolderCellWidthPx: 192.0px (73.14286dp)\n" +
+                "\tfolderCellHeightPx: 304.0px (115.809525dp)\n" +
+                "\tfolderChildIconSizePx: 158.0px (60.190475dp)\n" +
+                "\tfolderChildTextSizePx: 37.0px (14.095238dp)\n" +
+                "\tfolderChildDrawablePaddingPx: 32.0px (12.190476dp)\n" +
+                "\tfolderCellLayoutBorderSpaceOriginalPx: 42.0px (16.0dp)\n" +
+                "\tfolderCellLayoutBorderSpacePx Horizontal: 42.0px (16.0dp)\n" +
+                "\tfolderCellLayoutBorderSpacePx Vertical: 42.0px (16.0dp)\n" +
+                "\tbottomSheetTopPadding: 110.0px (41.904762dp)\n" +
+                "\tallAppsShiftRange: 2098.0px (799.2381dp)\n" +
+                "\tallAppsTopPadding: 110.0px (41.904762dp)\n" +
+                "\tallAppsIconSizePx: 136.0px (51.809525dp)\n" +
+                "\tallAppsIconTextSizePx: 31.0px (11.809524dp)\n" +
+                "\tallAppsIconDrawablePaddingPx: 18.0px (6.857143dp)\n" +
+                "\tallAppsCellHeightPx: 345.0px (131.42857dp)\n" +
+                "\tallAppsCellWidthPx: 178.0px (67.809525dp)\n" +
+                "\tallAppsBorderSpacePxX: 42.0px (16.0dp)\n" +
+                "\tallAppsBorderSpacePxY: 73.0px (27.809525dp)\n" +
+                "\tnumShownAllAppsColumns: 6\n" +
+                "\tallAppsLeftRightPadding: 126.0px (48.0dp)\n" +
+                "\tallAppsLeftRightMargin: 155.0px (59.04762dp)\n" +
+                "\thotseatBarSizePx: 459.0px (174.85715dp)\n" +
+                "\tinv.hotseatColumnSpan: 6\n" +
+                "\thotseatCellHeightPx: 153.0px (58.285713dp)\n" +
+                "\thotseatBarBottomSpacePx: 95.0px (36.190475dp)\n" +
+                "\thotseatBarSidePaddingStartPx: 0.0px (0.0dp)\n" +
+                "\thotseatBarSidePaddingEndPx: 0.0px (0.0dp)\n" +
+                "\thotseatBarEndOffset: 0.0px (0.0dp)\n" +
+                "\thotseatQsbSpace: 95.0px (36.190475dp)\n" +
+                "\thotseatQsbHeight: 165.0px (62.857143dp)\n" +
+                "\tspringLoadedHotseatBarTopMarginPx: 171.0px (65.14286dp)\n" +
+                "\tgetHotseatLayoutPadding(context).top: 219.0px (83.42857dp)\n" +
+                "\tgetHotseatLayoutPadding(context).bottom: 87.0px (33.142857dp)\n" +
+                "\tgetHotseatLayoutPadding(context).left: 302.0px (115.04762dp)\n" +
+                "\tgetHotseatLayoutPadding(context).right: 302.0px (115.04762dp)\n" +
+                "\tnumShownHotseatIcons: 6\n" +
+                "\thotseatBorderSpace: 84.0px (32.0dp)\n" +
+                "\tisQsbInline: false\n" +
+                "\thotseatQsbWidth: 1236.0px (470.85715dp)\n" +
+                "\tisTaskbarPresent:true\n" +
+                "\tisTaskbarPresentInApps:true\n" +
+                "\ttaskbarSize: 158.0px (60.190475dp)\n" +
+                "\tdesiredWorkspaceHorizontalMarginPx: 58.0px (22.095238dp)\n" +
+                "\tworkspacePadding.left: 37.0px (14.095238dp)\n" +
+                "\tworkspacePadding.top: 68.0px (25.904762dp)\n" +
+                "\tworkspacePadding.right: 37.0px (14.095238dp)\n" +
+                "\tworkspacePadding.bottom: 615.0px (234.28572dp)\n" +
+                "\ticonScale: 0.9978308px (0.38012603dp)\n" +
+                "\tcellScaleToFit : 0.9978308px (0.38012603dp)\n" +
+                "\textraSpace: 235.0px (89.52381dp)\n" +
+                "\tunscaled extraSpace: 235.51086px (89.71842dp)\n" +
+                "\tmaxEmptySpace: 236.0px (89.90476dp)\n" +
+                "\tworkspaceTopPadding: 89.0px (33.904762dp)\n" +
+                "\tworkspaceBottomPadding: 146.0px (55.61905dp)\n" +
+                "\toverviewTaskMarginPx: 32.0px (12.190476dp)\n" +
+                "\toverviewTaskIconSizePx: 126.0px (48.0dp)\n" +
+                "\toverviewTaskIconDrawableSizePx: 116.0px (44.190475dp)\n" +
+                "\toverviewTaskIconDrawableSizeGridPx: 116.0px (44.190475dp)\n" +
+                "\toverviewTaskThumbnailTopMarginPx: 158.0px (60.190475dp)\n" +
+                "\toverviewActionsTopMarginPx: 63.0px (24.0dp)\n" +
+                "\toverviewActionsHeight: 126.0px (48.0dp)\n" +
+                "\toverviewActionsButtonSpacing: 95.0px (36.190475dp)\n" +
+                "\toverviewPageSpacing: 95.0px (36.190475dp)\n" +
+                "\toverviewRowSpacing: 74.0px (28.190475dp)\n" +
+                "\toverviewGridSideMargin: 168.0px (64.0dp)\n" +
+                "\tdropTargetBarTopMarginPx: 168.0px (64.0dp)\n" +
+                "\tdropTargetBarSizePx: 147.0px (56.0dp)\n" +
+                "\tdropTargetBarBottomMarginPx: 42.0px (16.0dp)\n" +
+                "\tgetCellLayoutSpringLoadShrunkTop(): 467.0px (177.90475dp)\n" +
+                "\tgetCellLayoutSpringLoadShrunkBottom(): 1578.0px (601.1429dp)\n" +
+                "\tworkspaceSpringLoadedMinNextPageVisiblePx: 63.0px (24.0dp)\n" +
+                "\tgetWorkspaceSpringLoadScale(): 0.785159px (0.29910818dp)\n" +
+                "\tgetCellLayoutHeight(): 1415.0px (539.0476dp)\n" +
+                "\tgetCellLayoutWidth(): 883.0px (336.38095dp)\n")
+    }
+
+    @Test
+    fun phoneVerticalBar3Button() {
+        initializeVarsForPhone(isVerticalBar = true, isGestureMode = false)
+        val dp = newDP()
+
+        assertThat(dump(dp)).isEqualTo("DeviceProfile:\n" +
+                "\t1 dp = 2.625 px\n" +
+                "\tisTablet:false\n" +
+                "\tisPhone:true\n" +
+                "\ttransposeLayoutWithOrientation:true\n" +
+                "\tisGestureMode:false\n" +
+                "\tisLandscape:true\n" +
+                "\tisMultiWindowMode:false\n" +
+                "\tisTwoPanels:false\n" +
+                "\twindowX: 0.0px (0.0dp)\n" +
+                "\twindowY: 0.0px (0.0dp)\n" +
+                "\twidthPx: 2400.0px (914.2857dp)\n" +
+                "\theightPx: 1080.0px (411.42856dp)\n" +
+                "\tavailableWidthPx: 2156.0px (821.3333dp)\n" +
+                "\tavailableHeightPx: 1006.0px (383.2381dp)\n" +
+                "\tmInsets.left: 118.0px (44.95238dp)\n" +
+                "\tmInsets.top: 74.0px (28.190475dp)\n" +
+                "\tmInsets.right: 126.0px (48.0dp)\n" +
+                "\tmInsets.bottom: 0.0px (0.0dp)\n" +
+                "\taspectRatio:2.2222223\n" +
+                "\tisScalableGrid:false\n" +
+                "\tinv.numRows: 5\n" +
+                "\tinv.numColumns: 4\n" +
+                "\tinv.numSearchContainerColumns: 4\n" +
+                "\tminCellSize: PointF(80.0, 104.0)dp\n" +
+                "\tcellWidthPx: 153.0px (58.285713dp)\n" +
+                "\tcellHeightPx: 160.0px (60.95238dp)\n" +
+                "\tgetCellSize().x: 461.0px (175.61905dp)\n" +
+                "\tgetCellSize().y: 193.0px (73.52381dp)\n" +
+                "\tcellLayoutBorderSpacePx Horizontal: 0.0px (0.0dp)\n" +
+                "\tcellLayoutBorderSpacePx Vertical: 0.0px (0.0dp)\n" +
+                "\tcellLayoutPaddingPx.left: 53.0px (20.190475dp)\n" +
+                "\tcellLayoutPaddingPx.top: 0.0px (0.0dp)\n" +
+                "\tcellLayoutPaddingPx.right: 53.0px (20.190475dp)\n" +
+                "\tcellLayoutPaddingPx.bottom: 40.0px (15.238095dp)\n" +
+                "\ticonSizePx: 142.0px (54.095238dp)\n" +
+                "\ticonTextSizePx: 0.0px (0.0dp)\n" +
+                "\ticonDrawablePaddingPx: 0.0px (0.0dp)\n" +
+                "\tfolderCellWidthPx: 179.0px (68.190475dp)\n" +
+                "\tfolderCellHeightPx: 212.0px (80.7619dp)\n" +
+                "\tfolderChildIconSizePx: 135.0px (51.42857dp)\n" +
+                "\tfolderChildTextSizePx: 35.0px (13.333333dp)\n" +
+                "\tfolderChildDrawablePaddingPx: 10.0px (3.8095238dp)\n" +
+                "\tfolderCellLayoutBorderSpaceOriginalPx: 42.0px (16.0dp)\n" +
+                "\tfolderCellLayoutBorderSpacePx Horizontal: 42.0px (16.0dp)\n" +
+                "\tfolderCellLayoutBorderSpacePx Vertical: 42.0px (16.0dp)\n" +
+                "\tbottomSheetTopPadding: 114.0px (43.42857dp)\n" +
+                "\tallAppsShiftRange: 788.0px (300.1905dp)\n" +
+                "\tallAppsTopPadding: 0.0px (0.0dp)\n" +
+                "\tallAppsIconSizePx: 158.0px (60.190475dp)\n" +
+                "\tallAppsIconTextSizePx: 37.0px (14.095238dp)\n" +
+                "\tallAppsIconDrawablePaddingPx: 21.0px (8.0dp)\n" +
+                "\tallAppsCellHeightPx: 329.0px (125.333336dp)\n" +
+                "\tallAppsCellWidthPx: 200.0px (76.190475dp)\n" +
+                "\tallAppsBorderSpacePxX: 42.0px (16.0dp)\n" +
+                "\tallAppsBorderSpacePxY: 42.0px (16.0dp)\n" +
+                "\tnumShownAllAppsColumns: 4\n" +
+                "\tallAppsLeftRightPadding: 0.0px (0.0dp)\n" +
+                "\tallAppsLeftRightMargin: 0.0px (0.0dp)\n" +
+                "\thotseatBarSizePx: 247.0px (94.09524dp)\n" +
+                "\tinv.hotseatColumnSpan: 4\n" +
+                "\thotseatCellHeightPx: 160.0px (60.95238dp)\n" +
+                "\thotseatBarBottomSpacePx: 126.0px (48.0dp)\n" +
+                "\thotseatBarSidePaddingStartPx: 63.0px (24.0dp)\n" +
+                "\thotseatBarSidePaddingEndPx: 42.0px (16.0dp)\n" +
+                "\thotseatBarEndOffset: 0.0px (0.0dp)\n" +
+                "\thotseatQsbSpace: 95.0px (36.190475dp)\n" +
+                "\thotseatQsbHeight: 165.0px (62.857143dp)\n" +
+                "\tspringLoadedHotseatBarTopMarginPx: 118.0px (44.95238dp)\n" +
+                "\tgetHotseatLayoutPadding(context).top: 65.0px (24.761906dp)\n" +
+                "\tgetHotseatLayoutPadding(context).bottom: 48.0px (18.285715dp)\n" +
+                "\tgetHotseatLayoutPadding(context).left: 42.0px (16.0dp)\n" +
+                "\tgetHotseatLayoutPadding(context).right: 189.0px (72.0dp)\n" +
+                "\tnumShownHotseatIcons: 4\n" +
+                "\thotseatBorderSpace: 0.0px (0.0dp)\n" +
+                "\tisQsbInline: false\n" +
+                "\thotseatQsbWidth: 1525.0px (580.9524dp)\n" +
+                "\tisTaskbarPresent:false\n" +
+                "\tisTaskbarPresentInApps:false\n" +
+                "\ttaskbarSize: 0.0px (0.0dp)\n" +
+                "\tdesiredWorkspaceHorizontalMarginPx: 0.0px (0.0dp)\n" +
+                "\tworkspacePadding.left: 10.0px (3.8095238dp)\n" +
+                "\tworkspacePadding.top: 0.0px (0.0dp)\n" +
+                "\tworkspacePadding.right: 194.0px (73.90476dp)\n" +
+                "\tworkspacePadding.bottom: 0.0px (0.0dp)\n" +
+                "\ticonScale: 1.0px (0.3809524dp)\n" +
+                "\tcellScaleToFit : 1.0px (0.3809524dp)\n" +
+                "\textraSpace: 166.0px (63.238094dp)\n" +
+                "\tunscaled extraSpace: 166.0px (63.238094dp)\n" +
+                "\tmaxEmptySpace: 184.0px (70.09524dp)\n" +
+                "\tworkspaceTopPadding: 0.0px (0.0dp)\n" +
+                "\tworkspaceBottomPadding: 0.0px (0.0dp)\n" +
+                "\toverviewTaskMarginPx: 42.0px (16.0dp)\n" +
+                "\toverviewTaskIconSizePx: 126.0px (48.0dp)\n" +
+                "\toverviewTaskIconDrawableSizePx: 116.0px (44.190475dp)\n" +
+                "\toverviewTaskIconDrawableSizeGridPx: 0.0px (0.0dp)\n" +
+                "\toverviewTaskThumbnailTopMarginPx: 168.0px (64.0dp)\n" +
+                "\toverviewActionsTopMarginPx: 32.0px (12.190476dp)\n" +
+                "\toverviewActionsHeight: 126.0px (48.0dp)\n" +
+                "\toverviewActionsButtonSpacing: 95.0px (36.190475dp)\n" +
+                "\toverviewPageSpacing: 42.0px (16.0dp)\n" +
+                "\toverviewRowSpacing: 0.0px (0.0dp)\n" +
+                "\toverviewGridSideMargin: 0.0px (0.0dp)\n" +
+                "\tdropTargetBarTopMarginPx: 16.0px (6.095238dp)\n" +
+                "\tdropTargetBarSizePx: 95.0px (36.190475dp)\n" +
+                "\tdropTargetBarBottomMarginPx: 16.0px (6.095238dp)\n" +
+                "\tgetCellLayoutSpringLoadShrunkTop(): 201.0px (76.57143dp)\n" +
+                "\tgetCellLayoutSpringLoadShrunkBottom(): 983.0px (374.4762dp)\n" +
+                "\tworkspaceSpringLoadedMinNextPageVisiblePx: 63.0px (24.0dp)\n" +
+                "\tgetWorkspaceSpringLoadScale(): 0.777336px (0.296128dp)\n" +
+                "\tgetCellLayoutHeight(): 1006.0px (383.2381dp)\n" +
+                "\tgetCellLayoutWidth(): 1952.0px (743.619dp)\n")
+    }
+
+    @Test
+    fun phoneVerticalBar() {
+        initializeVarsForPhone(isVerticalBar = true)
+        val dp = newDP()
+
+        assertThat(dump(dp)).isEqualTo("DeviceProfile:\n" +
+                "\t1 dp = 2.625 px\n" +
+                "\tisTablet:false\n" +
+                "\tisPhone:true\n" +
+                "\ttransposeLayoutWithOrientation:true\n" +
+                "\tisGestureMode:true\n" +
+                "\tisLandscape:true\n" +
+                "\tisMultiWindowMode:false\n" +
+                "\tisTwoPanels:false\n" +
+                "\twindowX: 0.0px (0.0dp)\n" +
+                "\twindowY: 0.0px (0.0dp)\n" +
+                "\twidthPx: 2400.0px (914.2857dp)\n" +
+                "\theightPx: 1080.0px (411.42856dp)\n" +
+                "\tavailableWidthPx: 2282.0px (869.3333dp)\n" +
+                "\tavailableHeightPx: 943.0px (359.2381dp)\n" +
+                "\tmInsets.left: 118.0px (44.95238dp)\n" +
+                "\tmInsets.top: 74.0px (28.190475dp)\n" +
+                "\tmInsets.right: 0.0px (0.0dp)\n" +
+                "\tmInsets.bottom: 63.0px (24.0dp)\n" +
+                "\taspectRatio:2.2222223\n" +
+                "\tisScalableGrid:false\n" +
+                "\tinv.numRows: 5\n" +
+                "\tinv.numColumns: 4\n" +
+                "\tinv.numSearchContainerColumns: 4\n" +
+                "\tminCellSize: PointF(80.0, 104.0)dp\n" +
+                "\tcellWidthPx: 153.0px (58.285713dp)\n" +
+                "\tcellHeightPx: 160.0px (60.95238dp)\n" +
+                "\tgetCellSize().x: 493.0px (187.80952dp)\n" +
+                "\tgetCellSize().y: 180.0px (68.57143dp)\n" +
+                "\tcellLayoutBorderSpacePx Horizontal: 0.0px (0.0dp)\n" +
+                "\tcellLayoutBorderSpacePx Vertical: 0.0px (0.0dp)\n" +
+                "\tcellLayoutPaddingPx.left: 53.0px (20.190475dp)\n" +
+                "\tcellLayoutPaddingPx.top: 0.0px (0.0dp)\n" +
+                "\tcellLayoutPaddingPx.right: 53.0px (20.190475dp)\n" +
+                "\tcellLayoutPaddingPx.bottom: 40.0px (15.238095dp)\n" +
+                "\ticonSizePx: 142.0px (54.095238dp)\n" +
+                "\ticonTextSizePx: 0.0px (0.0dp)\n" +
+                "\ticonDrawablePaddingPx: 0.0px (0.0dp)\n" +
+                "\tfolderCellWidthPx: 163.0px (62.095238dp)\n" +
+                "\tfolderCellHeightPx: 192.0px (73.14286dp)\n" +
+                "\tfolderChildIconSizePx: 123.0px (46.857143dp)\n" +
+                "\tfolderChildTextSizePx: 32.0px (12.190476dp)\n" +
+                "\tfolderChildDrawablePaddingPx: 8.0px (3.047619dp)\n" +
+                "\tfolderCellLayoutBorderSpaceOriginalPx: 42.0px (16.0dp)\n" +
+                "\tfolderCellLayoutBorderSpacePx Horizontal: 42.0px (16.0dp)\n" +
+                "\tfolderCellLayoutBorderSpacePx Vertical: 42.0px (16.0dp)\n" +
+                "\tbottomSheetTopPadding: 114.0px (43.42857dp)\n" +
+                "\tallAppsShiftRange: 788.0px (300.1905dp)\n" +
+                "\tallAppsTopPadding: 0.0px (0.0dp)\n" +
+                "\tallAppsIconSizePx: 158.0px (60.190475dp)\n" +
+                "\tallAppsIconTextSizePx: 37.0px (14.095238dp)\n" +
+                "\tallAppsIconDrawablePaddingPx: 21.0px (8.0dp)\n" +
+                "\tallAppsCellHeightPx: 329.0px (125.333336dp)\n" +
+                "\tallAppsCellWidthPx: 200.0px (76.190475dp)\n" +
+                "\tallAppsBorderSpacePxX: 42.0px (16.0dp)\n" +
+                "\tallAppsBorderSpacePxY: 42.0px (16.0dp)\n" +
+                "\tnumShownAllAppsColumns: 4\n" +
+                "\tallAppsLeftRightPadding: 0.0px (0.0dp)\n" +
+                "\tallAppsLeftRightMargin: 0.0px (0.0dp)\n" +
+                "\thotseatBarSizePx: 247.0px (94.09524dp)\n" +
+                "\tinv.hotseatColumnSpan: 4\n" +
+                "\thotseatCellHeightPx: 160.0px (60.95238dp)\n" +
+                "\thotseatBarBottomSpacePx: 126.0px (48.0dp)\n" +
+                "\thotseatBarSidePaddingStartPx: 63.0px (24.0dp)\n" +
+                "\thotseatBarSidePaddingEndPx: 42.0px (16.0dp)\n" +
+                "\thotseatBarEndOffset: 0.0px (0.0dp)\n" +
+                "\thotseatQsbSpace: 95.0px (36.190475dp)\n" +
+                "\thotseatQsbHeight: 165.0px (62.857143dp)\n" +
+                "\tspringLoadedHotseatBarTopMarginPx: 118.0px (44.95238dp)\n" +
+                "\tgetHotseatLayoutPadding(context).top: 65.0px (24.761906dp)\n" +
+                "\tgetHotseatLayoutPadding(context).bottom: 111.0px (42.285713dp)\n" +
+                "\tgetHotseatLayoutPadding(context).left: 42.0px (16.0dp)\n" +
+                "\tgetHotseatLayoutPadding(context).right: 63.0px (24.0dp)\n" +
+                "\tnumShownHotseatIcons: 4\n" +
+                "\thotseatBorderSpace: 0.0px (0.0dp)\n" +
+                "\tisQsbInline: false\n" +
+                "\thotseatQsbWidth: 1621.0px (617.5238dp)\n" +
+                "\tisTaskbarPresent:false\n" +
+                "\tisTaskbarPresentInApps:false\n" +
+                "\ttaskbarSize: 0.0px (0.0dp)\n" +
+                "\tdesiredWorkspaceHorizontalMarginPx: 0.0px (0.0dp)\n" +
+                "\tworkspacePadding.left: 10.0px (3.8095238dp)\n" +
+                "\tworkspacePadding.top: 0.0px (0.0dp)\n" +
+                "\tworkspacePadding.right: 194.0px (73.90476dp)\n" +
+                "\tworkspacePadding.bottom: 0.0px (0.0dp)\n" +
+                "\ticonScale: 1.0px (0.3809524dp)\n" +
+                "\tcellScaleToFit : 1.0px (0.3809524dp)\n" +
+                "\textraSpace: 103.0px (39.238094dp)\n" +
+                "\tunscaled extraSpace: 103.0px (39.238094dp)\n" +
+                "\tmaxEmptySpace: 131.0px (49.904762dp)\n" +
+                "\tworkspaceTopPadding: 0.0px (0.0dp)\n" +
+                "\tworkspaceBottomPadding: 0.0px (0.0dp)\n" +
+                "\toverviewTaskMarginPx: 42.0px (16.0dp)\n" +
+                "\toverviewTaskIconSizePx: 126.0px (48.0dp)\n" +
+                "\toverviewTaskIconDrawableSizePx: 116.0px (44.190475dp)\n" +
+                "\toverviewTaskIconDrawableSizeGridPx: 0.0px (0.0dp)\n" +
+                "\toverviewTaskThumbnailTopMarginPx: 168.0px (64.0dp)\n" +
+                "\toverviewActionsTopMarginPx: 32.0px (12.190476dp)\n" +
+                "\toverviewActionsHeight: 126.0px (48.0dp)\n" +
+                "\toverviewActionsButtonSpacing: 95.0px (36.190475dp)\n" +
+                "\toverviewPageSpacing: 42.0px (16.0dp)\n" +
+                "\toverviewRowSpacing: 0.0px (0.0dp)\n" +
+                "\toverviewGridSideMargin: 0.0px (0.0dp)\n" +
+                "\tdropTargetBarTopMarginPx: 16.0px (6.095238dp)\n" +
+                "\tdropTargetBarSizePx: 95.0px (36.190475dp)\n" +
+                "\tdropTargetBarBottomMarginPx: 16.0px (6.095238dp)\n" +
+                "\tgetCellLayoutSpringLoadShrunkTop(): 201.0px (76.57143dp)\n" +
+                "\tgetCellLayoutSpringLoadShrunkBottom(): 927.0px (353.14285dp)\n" +
+                "\tworkspaceSpringLoadedMinNextPageVisiblePx: 63.0px (24.0dp)\n" +
+                "\tgetWorkspaceSpringLoadScale(): 0.76988333px (0.2932889dp)\n" +
+                "\tgetCellLayoutHeight(): 943.0px (359.2381dp)\n" +
+                "\tgetCellLayoutWidth(): 2078.0px (791.619dp)\n")
+    }
+}
\ 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
deleted file mode 100644
index 6728540..0000000
--- a/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelLandscape3ButtonTest.kt
+++ /dev/null
@@ -1,486 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.quickstep
-
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.android.launcher3.DeviceProfile
-import com.android.launcher3.DeviceProfileBaseTest
-import com.google.common.truth.Truth.assertThat
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-
-/**
- * Tests for DeviceProfile for two panel in landscape with 3-Button navigation.
- */
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-class DeviceProfileTwoPanelLandscape3ButtonTest : DeviceProfileBaseTest() {
-
-    lateinit var dp: DeviceProfile
-
-    @Before
-    fun before() {
-        initializeVarsForTablet(isLandscape = true, isTwoPanel = true, isGestureMode = false)
-        dp = newDP()
-    }
-
-    @Test
-    fun isScalableGrid() {
-        assertThat(dp.isScalableGrid).isTrue()
-    }
-
-    @Test
-    fun cellWidthPx() {
-        assertThat(dp.cellWidthPx).isEqualTo(200)
-    }
-
-    @Test
-    fun cellHeightPx() {
-        assertThat(dp.cellHeightPx).isEqualTo(260)
-    }
-
-    @Test
-    fun getCellSizeX() {
-        assertThat(dp.cellSize.x).isEqualTo(259)
-    }
-
-    @Test
-    fun getCellSizeY() {
-        assertThat(dp.cellSize.y).isEqualTo(260)
-    }
-
-    @Test
-    fun cellLayoutBorderSpacePxX() {
-        assertThat(dp.cellLayoutBorderSpacePx.x).isEqualTo(50)
-    }
-
-    @Test
-    fun cellLayoutBorderSpacePxY() {
-        assertThat(dp.cellLayoutBorderSpacePx.y).isEqualTo(50)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxLeft() {
-        assertThat(dp.cellLayoutPaddingPx.left).isEqualTo(25)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxTop() {
-        assertThat(dp.cellLayoutPaddingPx.top).isEqualTo(0)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxRight() {
-        assertThat(dp.cellLayoutPaddingPx.right).isEqualTo(25)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxBottom() {
-        assertThat(dp.cellLayoutPaddingPx.bottom).isEqualTo(25)
-    }
-
-    @Test
-    fun iconSizePx() {
-        assertThat(dp.iconSizePx).isEqualTo(112)
-    }
-
-    @Test
-    fun iconTextSizePx() {
-        assertThat(dp.iconTextSizePx).isEqualTo(28)
-    }
-
-    @Test
-    fun iconDrawablePaddingPx() {
-        assertThat(dp.iconDrawablePaddingPx).isEqualTo(14)
-    }
-
-    @Test
-    fun folderCellWidthPx() {
-        assertThat(dp.folderCellWidthPx).isEqualTo(200)
-    }
-
-    @Test
-    fun folderCellHeightPx() {
-        assertThat(dp.folderCellHeightPx).isEqualTo(260)
-    }
-
-    @Test
-    fun folderChildIconSizePx() {
-        assertThat(dp.folderChildIconSizePx).isEqualTo(112)
-    }
-
-    @Test
-    fun folderChildTextSizePx() {
-        assertThat(dp.folderChildTextSizePx).isEqualTo(28)
-    }
-
-    @Test
-    fun folderChildDrawablePaddingPx() {
-        assertThat(dp.folderChildDrawablePaddingPx).isEqualTo(36)
-    }
-
-    @Test
-    fun folderCellLayoutBorderSpaceOriginalPx() {
-        assertThat(dp.folderCellLayoutBorderSpaceOriginalPx).isEqualTo(0)
-    }
-
-    @Test
-    fun folderCellLayoutBorderSpacePxX() {
-        assertThat(dp.folderCellLayoutBorderSpacePx.x).isEqualTo(0)
-    }
-
-    @Test
-    fun folderCellLayoutBorderSpacePxY() {
-        assertThat(dp.folderCellLayoutBorderSpacePx.y).isEqualTo(0)
-    }
-
-    @Test
-    fun bottomSheetTopPadding() {
-        assertThat(dp.bottomSheetTopPadding).isEqualTo(0)
-    }
-
-    @Test
-    fun allAppsShiftRange() {
-        assertThat(dp.allAppsShiftRange).isEqualTo(1600)
-    }
-
-    @Test
-    fun allAppsTopPadding() {
-        assertThat(dp.allAppsTopPadding).isEqualTo(0)
-    }
-
-    @Test
-    fun allAppsIconSizePx() {
-        assertThat(dp.allAppsIconSizePx).isEqualTo(175)
-    }
-
-    @Test
-    fun allAppsIconTextSizePx() {
-        assertThat(dp.allAppsIconTextSizePx).isEqualTo(44)
-    }
-
-    @Test
-    fun allAppsIconDrawablePaddingPx() {
-        assertThat(dp.allAppsIconDrawablePaddingPx).isEqualTo(14)
-    }
-
-    @Test
-    fun allAppsCellHeightPx() {
-        assertThat(dp.allAppsCellHeightPx).isEqualTo(310)
-    }
-
-    @Test
-    fun allAppsCellWidthPx() {
-        assertThat(dp.allAppsCellWidthPx).isEqualTo(200)
-    }
-
-    @Test
-    fun allAppsBorderSpacePxX() {
-        assertThat(dp.allAppsBorderSpacePx.x).isEqualTo(50)
-    }
-
-    @Test
-    fun allAppsBorderSpacePxY() {
-        assertThat(dp.allAppsBorderSpacePx.y).isEqualTo(50)
-    }
-
-    @Test
-    fun numShownAllAppsColumns() {
-        assertThat(dp.numShownAllAppsColumns).isEqualTo(0)
-    }
-
-    @Test
-    fun allAppsLeftRightPadding() {
-        assertThat(dp.allAppsLeftRightPadding).isEqualTo(64)
-    }
-
-    @Test
-    fun allAppsLeftRightMargin() {
-        assertThat(dp.allAppsLeftRightMargin).isEqualTo(1241)
-    }
-
-    @Test
-    fun hotseatBarSizePx() {
-        assertThat(dp.hotseatBarSizePx).isEqualTo(386)
-    }
-
-    @Test
-    fun hotseatCellHeightPx() {
-        assertThat(dp.hotseatCellHeightPx).isEqualTo(126)
-    }
-
-    @Test
-    fun hotseatBarBottomSpacePx() {
-        assertThat(dp.hotseatBarBottomSpacePx).isEqualTo(116)
-    }
-
-    @Test
-    fun hotseatBarSidePaddingStartPx() {
-        assertThat(dp.hotseatBarSidePaddingStartPx).isEqualTo(0)
-    }
-
-    @Test
-    fun hotseatBarSidePaddingEndPx() {
-        assertThat(dp.hotseatBarSidePaddingEndPx).isEqualTo(0)
-    }
-
-    @Test
-    fun hotseatQsbSpace() {
-        assertThat(dp.hotseatQsbSpace).isEqualTo(56)
-    }
-
-    @Test
-    fun hotseatQsbHeight() {
-        assertThat(dp.hotseatQsbHeight).isEqualTo(126)
-    }
-
-    @Test
-    fun springLoadedHotseatBarTopMarginPx() {
-        assertThat(dp.springLoadedHotseatBarTopMarginPx).isEqualTo(128)
-    }
-
-    @Test
-    fun numShownHotseatIcons() {
-        assertThat(dp.numShownHotseatIcons).isEqualTo(6)
-    }
-
-    @Test
-    fun hotseatBorderSpace() {
-        assertThat(dp.hotseatBorderSpace).isEqualTo(32)
-    }
-
-    @Test
-    fun isQsbInline() {
-        assertThat(dp.isQsbInline).isEqualTo(false)
-    }
-
-    @Test
-    fun qsbWidth() {
-        assertThat(dp.qsbWidth).isEqualTo(1039)
-    }
-
-    @Test
-    fun isTaskbarPresent() {
-        assertThat(dp.isTaskbarPresent).isEqualTo(true)
-    }
-
-    @Test
-    fun isTaskbarPresentInApps() {
-        assertThat(dp.isTaskbarPresentInApps).isEqualTo(false)
-    }
-
-    @Test
-    fun taskbarSize() {
-        assertThat(dp.taskbarSize).isEqualTo(120)
-    }
-
-    @Test
-    fun desiredWorkspaceHorizontalMarginPx() {
-        assertThat(dp.desiredWorkspaceHorizontalMarginPx).isEqualTo(68)
-    }
-
-    @Test
-    fun workspacePaddingLeft() {
-        assertThat(dp.workspacePadding.left).isEqualTo(43)
-    }
-
-    @Test
-    fun workspacePaddingTop() {
-        assertThat(dp.workspacePadding.top).isEqualTo(0)
-    }
-
-    @Test
-    fun workspacePaddingRight() {
-        assertThat(dp.workspacePadding.right).isEqualTo(43)
-    }
-
-    @Test
-    fun workspacePaddingBottom() {
-        assertThat(dp.workspacePadding.bottom).isEqualTo(285)
-    }
-
-    @Test
-    fun iconScale() {
-        assertThat(dp.iconScale).isEqualTo(1)
-    }
-
-    @Test
-    fun cellScaleToFit() {
-        assertThat(dp.cellScaleToFit).isEqualTo(1.5657895f)
-    }
-
-    @Test
-    fun workspaceTopPadding() {
-        assertThat(dp.workspaceTopPadding).isEqualTo(0)
-    }
-
-    @Test
-    fun workspaceBottomPadding() {
-        assertThat(dp.workspaceBottomPadding).isEqualTo(0)
-    }
-
-    @Test
-    fun overviewTaskMarginPx() {
-        assertThat(dp.overviewTaskMarginPx).isEqualTo(32)
-    }
-
-    @Test
-    fun overviewTaskMarginGridPx() {
-        assertThat(dp.overviewTaskMarginGridPx).isEqualTo(32)
-    }
-
-    @Test
-    fun overviewTaskIconSizePx() {
-        assertThat(dp.overviewTaskIconSizePx).isEqualTo(96)
-    }
-
-    @Test
-    fun overviewTaskIconDrawableSizePx() {
-        assertThat(dp.overviewTaskIconDrawableSizePx).isEqualTo(88)
-    }
-
-    @Test
-    fun overviewTaskIconDrawableSizeGridPx() {
-        assertThat(dp.overviewTaskIconDrawableSizeGridPx).isEqualTo(88)
-    }
-
-    @Test
-    fun overviewTaskThumbnailTopMarginPx() {
-        assertThat(dp.overviewTaskThumbnailTopMarginPx).isEqualTo(160)
-    }
-
-    @Test
-    fun overviewActionsTopMarginPx() {
-        assertThat(dp.overviewActionsTopMarginPx).isEqualTo(40)
-    }
-
-    @Test
-    fun overviewActionsHeight() {
-        assertThat(dp.overviewActionsHeight).isEqualTo(96)
-    }
-
-    @Test
-    fun overviewActionsButtonSpacing() {
-        assertThat(dp.overviewActionsButtonSpacing).isEqualTo(72)
-    }
-
-    @Test
-    fun overviewPageSpacing() {
-        assertThat(dp.overviewPageSpacing).isEqualTo(88)
-    }
-
-    @Test
-    fun overviewRowSpacing() {
-        assertThat(dp.overviewRowSpacing).isEqualTo(40)
-    }
-
-    @Test
-    fun overviewGridSideMargin() {
-        assertThat(dp.overviewGridSideMargin).isEqualTo(128)
-    }
-
-    @Test
-    fun dropTargetBarTopMarginPx() {
-        assertThat(dp.dropTargetBarTopMarginPx).isEqualTo(0)
-    }
-
-    @Test
-    fun dropTargetBarSizePx() {
-        assertThat(dp.dropTargetBarSizePx).isEqualTo(144)
-    }
-
-    @Test
-    fun dropTargetBarBottomMarginPx() {
-        assertThat(dp.dropTargetBarBottomMarginPx).isEqualTo(64)
-    }
-
-    @Test
-    fun workspaceSpringLoadedMinNextPageVisiblePx() {
-        assertThat(dp.workspaceSpringLoadedMinNextPageVisiblePx).isEqualTo(48)
-    }
-
-    @Test
-    fun getWorkspaceSpringLoadScale() {
-        assertThat(dp.workspaceSpringLoadScale).isEqualTo(0.7226337f)
-    }
-
-    @Test
-    fun getCellLayoutHeight() {
-        assertThat(dp.cellLayoutHeight).isEqualTo(1215)
-    }
-
-    @Test
-    fun getCellLayoutWidth() {
-        assertThat(dp.cellLayoutWidth).isEqualTo(1237)
-    }
-
-    @Test
-    fun getPanelCount() {
-        assertThat(dp.panelCount).isEqualTo(2)
-    }
-
-    @Test
-    fun isVerticalBarLayout() {
-        assertThat(dp.isVerticalBarLayout).isEqualTo(false)
-    }
-
-    @Test
-    fun getCellLayoutSpringLoadShrunkTop() {
-        assertThat(dp.cellLayoutSpringLoadShrunkTop).isEqualTo(208)
-    }
-
-    @Test
-    fun getCellLayoutSpringLoadShrunkBottom() {
-        assertThat(dp.cellLayoutSpringLoadShrunkBottom).isEqualTo(1086)
-    }
-
-    @Test
-    fun getQsbOffsetY() {
-        assertThat(dp.qsbOffsetY).isEqualTo(272)
-    }
-
-    @Test
-    fun getTaskbarOffsetY() {
-        assertThat(dp.taskbarOffsetY).isEqualTo(112)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingLeft() {
-        assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(864)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingTop() {
-        assertThat(dp.getHotseatLayoutPadding(context).top).isEqualTo(151)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingRight() {
-        assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(864)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingBottom() {
-        assertThat(dp.getHotseatLayoutPadding(context).bottom).isEqualTo(109)
-    }
-
-    @Test
-    fun hotseatBarEndOffset() {
-        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
deleted file mode 100644
index ba3ef55..0000000
--- a/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelLandscapeTest.kt
+++ /dev/null
@@ -1,486 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.quickstep
-
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.android.launcher3.DeviceProfile
-import com.android.launcher3.DeviceProfileBaseTest
-import com.google.common.truth.Truth.assertThat
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-
-/**
- * Tests for DeviceProfile for two panel in landscape.
- */
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-class DeviceProfileTwoPanelLandscapeTest : DeviceProfileBaseTest() {
-
-    lateinit var dp: DeviceProfile
-
-    @Before
-    fun before() {
-        initializeVarsForTablet(isLandscape = true, isTwoPanel = true)
-        dp = newDP()
-    }
-
-    @Test
-    fun isScalableGrid() {
-        assertThat(dp.isScalableGrid).isTrue()
-    }
-
-    @Test
-    fun cellWidthPx() {
-        assertThat(dp.cellWidthPx).isEqualTo(200)
-    }
-
-    @Test
-    fun cellHeightPx() {
-        assertThat(dp.cellHeightPx).isEqualTo(260)
-    }
-
-    @Test
-    fun getCellSizeX() {
-        assertThat(dp.cellSize.x).isEqualTo(259)
-    }
-
-    @Test
-    fun getCellSizeY() {
-        assertThat(dp.cellSize.y).isEqualTo(260)
-    }
-
-    @Test
-    fun cellLayoutBorderSpacePxX() {
-        assertThat(dp.cellLayoutBorderSpacePx.x).isEqualTo(50)
-    }
-
-    @Test
-    fun cellLayoutBorderSpacePxY() {
-        assertThat(dp.cellLayoutBorderSpacePx.y).isEqualTo(50)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxLeft() {
-        assertThat(dp.cellLayoutPaddingPx.left).isEqualTo(25)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxTop() {
-        assertThat(dp.cellLayoutPaddingPx.top).isEqualTo(0)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxRight() {
-        assertThat(dp.cellLayoutPaddingPx.right).isEqualTo(25)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxBottom() {
-        assertThat(dp.cellLayoutPaddingPx.bottom).isEqualTo(25)
-    }
-
-    @Test
-    fun iconSizePx() {
-        assertThat(dp.iconSizePx).isEqualTo(112)
-    }
-
-    @Test
-    fun iconTextSizePx() {
-        assertThat(dp.iconTextSizePx).isEqualTo(28)
-    }
-
-    @Test
-    fun iconDrawablePaddingPx() {
-        assertThat(dp.iconDrawablePaddingPx).isEqualTo(14)
-    }
-
-    @Test
-    fun folderCellWidthPx() {
-        assertThat(dp.folderCellWidthPx).isEqualTo(200)
-    }
-
-    @Test
-    fun folderCellHeightPx() {
-        assertThat(dp.folderCellHeightPx).isEqualTo(260)
-    }
-
-    @Test
-    fun folderChildIconSizePx() {
-        assertThat(dp.folderChildIconSizePx).isEqualTo(112)
-    }
-
-    @Test
-    fun folderChildTextSizePx() {
-        assertThat(dp.folderChildTextSizePx).isEqualTo(28)
-    }
-
-    @Test
-    fun folderChildDrawablePaddingPx() {
-        assertThat(dp.folderChildDrawablePaddingPx).isEqualTo(36)
-    }
-
-    @Test
-    fun folderCellLayoutBorderSpaceOriginalPx() {
-        assertThat(dp.folderCellLayoutBorderSpaceOriginalPx).isEqualTo(0)
-    }
-
-    @Test
-    fun folderCellLayoutBorderSpacePxX() {
-        assertThat(dp.folderCellLayoutBorderSpacePx.x).isEqualTo(0)
-    }
-
-    @Test
-    fun folderCellLayoutBorderSpacePxY() {
-        assertThat(dp.folderCellLayoutBorderSpacePx.y).isEqualTo(0)
-    }
-
-    @Test
-    fun bottomSheetTopPadding() {
-        assertThat(dp.bottomSheetTopPadding).isEqualTo(0)
-    }
-
-    @Test
-    fun allAppsShiftRange() {
-        assertThat(dp.allAppsShiftRange).isEqualTo(1600)
-    }
-
-    @Test
-    fun allAppsTopPadding() {
-        assertThat(dp.allAppsTopPadding).isEqualTo(0)
-    }
-
-    @Test
-    fun allAppsIconSizePx() {
-        assertThat(dp.allAppsIconSizePx).isEqualTo(175)
-    }
-
-    @Test
-    fun allAppsIconTextSizePx() {
-        assertThat(dp.allAppsIconTextSizePx).isEqualTo(44)
-    }
-
-    @Test
-    fun allAppsIconDrawablePaddingPx() {
-        assertThat(dp.allAppsIconDrawablePaddingPx).isEqualTo(14)
-    }
-
-    @Test
-    fun allAppsCellHeightPx() {
-        assertThat(dp.allAppsCellHeightPx).isEqualTo(310)
-    }
-
-    @Test
-    fun allAppsCellWidthPx() {
-        assertThat(dp.allAppsCellWidthPx).isEqualTo(200)
-    }
-
-    @Test
-    fun allAppsBorderSpacePxX() {
-        assertThat(dp.allAppsBorderSpacePx.x).isEqualTo(50)
-    }
-
-    @Test
-    fun allAppsBorderSpacePxY() {
-        assertThat(dp.allAppsBorderSpacePx.y).isEqualTo(50)
-    }
-
-    @Test
-    fun numShownAllAppsColumns() {
-        assertThat(dp.numShownAllAppsColumns).isEqualTo(0)
-    }
-
-    @Test
-    fun allAppsLeftRightPadding() {
-        assertThat(dp.allAppsLeftRightPadding).isEqualTo(64)
-    }
-
-    @Test
-    fun allAppsLeftRightMargin() {
-        assertThat(dp.allAppsLeftRightMargin).isEqualTo(1241)
-    }
-
-    @Test
-    fun hotseatBarSizePx() {
-        assertThat(dp.hotseatBarSizePx).isEqualTo(386)
-    }
-
-    @Test
-    fun hotseatCellHeightPx() {
-        assertThat(dp.hotseatCellHeightPx).isEqualTo(126)
-    }
-
-    @Test
-    fun hotseatBarBottomSpacePx() {
-        assertThat(dp.hotseatBarBottomSpacePx).isEqualTo(116)
-    }
-
-    @Test
-    fun hotseatBarSidePaddingStartPx() {
-        assertThat(dp.hotseatBarSidePaddingStartPx).isEqualTo(0)
-    }
-
-    @Test
-    fun hotseatBarSidePaddingEndPx() {
-        assertThat(dp.hotseatBarSidePaddingEndPx).isEqualTo(0)
-    }
-
-    @Test
-    fun hotseatQsbSpace() {
-        assertThat(dp.hotseatQsbSpace).isEqualTo(56)
-    }
-
-    @Test
-    fun hotseatQsbHeight() {
-        assertThat(dp.hotseatQsbHeight).isEqualTo(126)
-    }
-
-    @Test
-    fun springLoadedHotseatBarTopMarginPx() {
-        assertThat(dp.springLoadedHotseatBarTopMarginPx).isEqualTo(128)
-    }
-
-    @Test
-    fun numShownHotseatIcons() {
-        assertThat(dp.numShownHotseatIcons).isEqualTo(6)
-    }
-
-    @Test
-    fun hotseatBorderSpace() {
-        assertThat(dp.hotseatBorderSpace).isEqualTo(73)
-    }
-
-    @Test
-    fun isQsbInline() {
-        assertThat(dp.isQsbInline).isEqualTo(false)
-    }
-
-    @Test
-    fun qsbWidth() {
-        assertThat(dp.qsbWidth).isEqualTo(1039)
-    }
-
-    @Test
-    fun isTaskbarPresent() {
-        assertThat(dp.isTaskbarPresent).isEqualTo(true)
-    }
-
-    @Test
-    fun isTaskbarPresentInApps() {
-        assertThat(dp.isTaskbarPresentInApps).isEqualTo(false)
-    }
-
-    @Test
-    fun taskbarSize() {
-        assertThat(dp.taskbarSize).isEqualTo(120)
-    }
-
-    @Test
-    fun desiredWorkspaceHorizontalMarginPx() {
-        assertThat(dp.desiredWorkspaceHorizontalMarginPx).isEqualTo(68)
-    }
-
-    @Test
-    fun workspacePaddingLeft() {
-        assertThat(dp.workspacePadding.left).isEqualTo(43)
-    }
-
-    @Test
-    fun workspacePaddingTop() {
-        assertThat(dp.workspacePadding.top).isEqualTo(0)
-    }
-
-    @Test
-    fun workspacePaddingRight() {
-        assertThat(dp.workspacePadding.right).isEqualTo(43)
-    }
-
-    @Test
-    fun workspacePaddingBottom() {
-        assertThat(dp.workspacePadding.bottom).isEqualTo(285)
-    }
-
-    @Test
-    fun iconScale() {
-        assertThat(dp.iconScale).isEqualTo(1)
-    }
-
-    @Test
-    fun cellScaleToFit() {
-        assertThat(dp.cellScaleToFit).isEqualTo(1.5657895f)
-    }
-
-    @Test
-    fun workspaceTopPadding() {
-        assertThat(dp.workspaceTopPadding).isEqualTo(0)
-    }
-
-    @Test
-    fun workspaceBottomPadding() {
-        assertThat(dp.workspaceBottomPadding).isEqualTo(0)
-    }
-
-    @Test
-    fun overviewTaskMarginPx() {
-        assertThat(dp.overviewTaskMarginPx).isEqualTo(32)
-    }
-
-    @Test
-    fun overviewTaskMarginGridPx() {
-        assertThat(dp.overviewTaskMarginGridPx).isEqualTo(32)
-    }
-
-    @Test
-    fun overviewTaskIconSizePx() {
-        assertThat(dp.overviewTaskIconSizePx).isEqualTo(96)
-    }
-
-    @Test
-    fun overviewTaskIconDrawableSizePx() {
-        assertThat(dp.overviewTaskIconDrawableSizePx).isEqualTo(88)
-    }
-
-    @Test
-    fun overviewTaskIconDrawableSizeGridPx() {
-        assertThat(dp.overviewTaskIconDrawableSizeGridPx).isEqualTo(88)
-    }
-
-    @Test
-    fun overviewTaskThumbnailTopMarginPx() {
-        assertThat(dp.overviewTaskThumbnailTopMarginPx).isEqualTo(160)
-    }
-
-    @Test
-    fun overviewActionsTopMarginPx() {
-        assertThat(dp.overviewActionsTopMarginPx).isEqualTo(40)
-    }
-
-    @Test
-    fun overviewActionsHeight() {
-        assertThat(dp.overviewActionsHeight).isEqualTo(96)
-    }
-
-    @Test
-    fun overviewActionsButtonSpacing() {
-        assertThat(dp.overviewActionsButtonSpacing).isEqualTo(72)
-    }
-
-    @Test
-    fun overviewPageSpacing() {
-        assertThat(dp.overviewPageSpacing).isEqualTo(88)
-    }
-
-    @Test
-    fun overviewRowSpacing() {
-        assertThat(dp.overviewRowSpacing).isEqualTo(40)
-    }
-
-    @Test
-    fun overviewGridSideMargin() {
-        assertThat(dp.overviewGridSideMargin).isEqualTo(128)
-    }
-
-    @Test
-    fun dropTargetBarTopMarginPx() {
-        assertThat(dp.dropTargetBarTopMarginPx).isEqualTo(0)
-    }
-
-    @Test
-    fun dropTargetBarSizePx() {
-        assertThat(dp.dropTargetBarSizePx).isEqualTo(144)
-    }
-
-    @Test
-    fun dropTargetBarBottomMarginPx() {
-        assertThat(dp.dropTargetBarBottomMarginPx).isEqualTo(64)
-    }
-
-    @Test
-    fun workspaceSpringLoadedMinNextPageVisiblePx() {
-        assertThat(dp.workspaceSpringLoadedMinNextPageVisiblePx).isEqualTo(48)
-    }
-
-    @Test
-    fun getWorkspaceSpringLoadScale() {
-        assertThat(dp.workspaceSpringLoadScale).isEqualTo(0.7226337f)
-    }
-
-    @Test
-    fun getCellLayoutHeight() {
-        assertThat(dp.cellLayoutHeight).isEqualTo(1215)
-    }
-
-    @Test
-    fun getCellLayoutWidth() {
-        assertThat(dp.cellLayoutWidth).isEqualTo(1237)
-    }
-
-    @Test
-    fun getPanelCount() {
-        assertThat(dp.panelCount).isEqualTo(2)
-    }
-
-    @Test
-    fun isVerticalBarLayout() {
-        assertThat(dp.isVerticalBarLayout).isEqualTo(false)
-    }
-
-    @Test
-    fun getCellLayoutSpringLoadShrunkTop() {
-        assertThat(dp.cellLayoutSpringLoadShrunkTop).isEqualTo(208)
-    }
-
-    @Test
-    fun getCellLayoutSpringLoadShrunkBottom() {
-        assertThat(dp.cellLayoutSpringLoadShrunkBottom).isEqualTo(1086)
-    }
-
-    @Test
-    fun getQsbOffsetY() {
-        assertThat(dp.qsbOffsetY).isEqualTo(272)
-    }
-
-    @Test
-    fun getTaskbarOffsetY() {
-        assertThat(dp.taskbarOffsetY).isEqualTo(112)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingLeft() {
-        assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(761)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingTop() {
-        assertThat(dp.getHotseatLayoutPadding(context).top).isEqualTo(151)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingRight() {
-        assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(761)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingBottom() {
-        assertThat(dp.getHotseatLayoutPadding(context).bottom).isEqualTo(109)
-    }
-
-    @Test
-    fun hotseatBarEndOffset() {
-        assertThat(dp.hotseatBarEndOffset).isEqualTo(0)
-    }
-}
\ 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
deleted file mode 100644
index a4b446a..0000000
--- a/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelPortrait3ButtonTest.kt
+++ /dev/null
@@ -1,486 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.quickstep
-
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.android.launcher3.DeviceProfile
-import com.android.launcher3.DeviceProfileBaseTest
-import com.google.common.truth.Truth.assertThat
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-
-/**
- * Tests for DeviceProfile for two panel in portrait with 3-Button navigation.
- */
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-class DeviceProfileTwoPanelPortrait3ButtonTest : DeviceProfileBaseTest() {
-
-    lateinit var dp: DeviceProfile
-
-    @Before
-    fun before() {
-        initializeVarsForTablet(isTwoPanel = true, isGestureMode = false)
-        dp = newDP()
-    }
-
-    @Test
-    fun isScalableGrid() {
-        assertThat(dp.isScalableGrid).isTrue()
-    }
-
-    @Test
-    fun cellWidthPx() {
-        assertThat(dp.cellWidthPx).isEqualTo(153)
-    }
-
-    @Test
-    fun cellHeightPx() {
-        assertThat(dp.cellHeightPx).isEqualTo(199)
-    }
-
-    @Test
-    fun getCellSizeX() {
-        assertThat(dp.cellSize.x).isEqualTo(153)
-    }
-
-    @Test
-    fun getCellSizeY() {
-        assertThat(dp.cellSize.y).isEqualTo(509)
-    }
-
-    @Test
-    fun cellLayoutBorderSpacePxX() {
-        assertThat(dp.cellLayoutBorderSpacePx.x).isEqualTo(38)
-    }
-
-    @Test
-    fun cellLayoutBorderSpacePxY() {
-        assertThat(dp.cellLayoutBorderSpacePx.y).isEqualTo(38)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxLeft() {
-        assertThat(dp.cellLayoutPaddingPx.left).isEqualTo(19)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxTop() {
-        assertThat(dp.cellLayoutPaddingPx.top).isEqualTo(0)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxRight() {
-        assertThat(dp.cellLayoutPaddingPx.right).isEqualTo(19)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxBottom() {
-        assertThat(dp.cellLayoutPaddingPx.bottom).isEqualTo(19)
-    }
-
-    @Test
-    fun iconSizePx() {
-        assertThat(dp.iconSizePx).isEqualTo(112)
-    }
-
-    @Test
-    fun iconTextSizePx() {
-        assertThat(dp.iconTextSizePx).isEqualTo(28)
-    }
-
-    @Test
-    fun iconDrawablePaddingPx() {
-        assertThat(dp.iconDrawablePaddingPx).isEqualTo(14)
-    }
-
-    @Test
-    fun folderCellWidthPx() {
-        assertThat(dp.folderCellWidthPx).isEqualTo(153)
-    }
-
-    @Test
-    fun folderCellHeightPx() {
-        assertThat(dp.folderCellHeightPx).isEqualTo(199)
-    }
-
-    @Test
-    fun folderChildIconSizePx() {
-        assertThat(dp.folderChildIconSizePx).isEqualTo(112)
-    }
-
-    @Test
-    fun folderChildTextSizePx() {
-        assertThat(dp.folderChildTextSizePx).isEqualTo(28)
-    }
-
-    @Test
-    fun folderChildDrawablePaddingPx() {
-        assertThat(dp.folderChildDrawablePaddingPx).isEqualTo(16)
-    }
-
-    @Test
-    fun folderCellLayoutBorderSpaceOriginalPx() {
-        assertThat(dp.folderCellLayoutBorderSpaceOriginalPx).isEqualTo(0)
-    }
-
-    @Test
-    fun folderCellLayoutBorderSpacePxX() {
-        assertThat(dp.folderCellLayoutBorderSpacePx.x).isEqualTo(0)
-    }
-
-    @Test
-    fun folderCellLayoutBorderSpacePxY() {
-        assertThat(dp.folderCellLayoutBorderSpacePx.y).isEqualTo(0)
-    }
-
-    @Test
-    fun bottomSheetTopPadding() {
-        assertThat(dp.bottomSheetTopPadding).isEqualTo(600)
-    }
-
-    @Test
-    fun allAppsShiftRange() {
-        assertThat(dp.allAppsShiftRange).isEqualTo(1960)
-    }
-
-    @Test
-    fun allAppsTopPadding() {
-        assertThat(dp.allAppsTopPadding).isEqualTo(600)
-    }
-
-    @Test
-    fun allAppsIconSizePx() {
-        assertThat(dp.allAppsIconSizePx).isEqualTo(134)
-    }
-
-    @Test
-    fun allAppsIconTextSizePx() {
-        assertThat(dp.allAppsIconTextSizePx).isEqualTo(34)
-    }
-
-    @Test
-    fun allAppsIconDrawablePaddingPx() {
-        assertThat(dp.allAppsIconDrawablePaddingPx).isEqualTo(14)
-    }
-
-    @Test
-    fun allAppsCellHeightPx() {
-        assertThat(dp.allAppsCellHeightPx).isEqualTo(237)
-    }
-
-    @Test
-    fun allAppsCellWidthPx() {
-        assertThat(dp.allAppsCellWidthPx).isEqualTo(153)
-    }
-
-    @Test
-    fun allAppsBorderSpacePxX() {
-        assertThat(dp.allAppsBorderSpacePx.x).isEqualTo(38)
-    }
-
-    @Test
-    fun allAppsBorderSpacePxY() {
-        assertThat(dp.allAppsBorderSpacePx.y).isEqualTo(38)
-    }
-
-    @Test
-    fun numShownAllAppsColumns() {
-        assertThat(dp.numShownAllAppsColumns).isEqualTo(0)
-    }
-
-    @Test
-    fun allAppsLeftRightPadding() {
-        assertThat(dp.allAppsLeftRightPadding).isEqualTo(56)
-    }
-
-    @Test
-    fun allAppsLeftRightMargin() {
-        assertThat(dp.allAppsLeftRightMargin).isEqualTo(763)
-    }
-
-    @Test
-    fun hotseatBarSizePx() {
-        assertThat(dp.hotseatBarSizePx).isEqualTo(386)
-    }
-
-    @Test
-    fun hotseatCellHeightPx() {
-        assertThat(dp.hotseatCellHeightPx).isEqualTo(126)
-    }
-
-    @Test
-    fun hotseatBarBottomSpacePx() {
-        assertThat(dp.hotseatBarBottomSpacePx).isEqualTo(116)
-    }
-
-    @Test
-    fun hotseatBarSidePaddingStartPx() {
-        assertThat(dp.hotseatBarSidePaddingStartPx).isEqualTo(0)
-    }
-
-    @Test
-    fun hotseatBarSidePaddingEndPx() {
-        assertThat(dp.hotseatBarSidePaddingEndPx).isEqualTo(0)
-    }
-
-    @Test
-    fun hotseatQsbSpace() {
-        assertThat(dp.hotseatQsbSpace).isEqualTo(56)
-    }
-
-    @Test
-    fun hotseatQsbHeight() {
-        assertThat(dp.hotseatQsbHeight).isEqualTo(126)
-    }
-
-    @Test
-    fun springLoadedHotseatBarTopMarginPx() {
-        assertThat(dp.springLoadedHotseatBarTopMarginPx).isEqualTo(216)
-    }
-
-    @Test
-    fun numShownHotseatIcons() {
-        assertThat(dp.numShownHotseatIcons).isEqualTo(6)
-    }
-
-    @Test
-    fun hotseatBorderSpace() {
-        assertThat(dp.hotseatBorderSpace).isEqualTo(32)
-    }
-
-    @Test
-    fun isQsbInline() {
-        assertThat(dp.isQsbInline).isEqualTo(false)
-    }
-
-    @Test
-    fun qsbWidth() {
-        assertThat(dp.qsbWidth).isEqualTo(685)
-    }
-
-    @Test
-    fun isTaskbarPresent() {
-        assertThat(dp.isTaskbarPresent).isEqualTo(true)
-    }
-
-    @Test
-    fun isTaskbarPresentInApps() {
-        assertThat(dp.isTaskbarPresentInApps).isEqualTo(false)
-    }
-
-    @Test
-    fun taskbarSize() {
-        assertThat(dp.taskbarSize).isEqualTo(120)
-    }
-
-    @Test
-    fun desiredWorkspaceHorizontalMarginPx() {
-        assertThat(dp.desiredWorkspaceHorizontalMarginPx).isEqualTo(52)
-    }
-
-    @Test
-    fun workspacePaddingLeft() {
-        assertThat(dp.workspacePadding.left).isEqualTo(33)
-    }
-
-    @Test
-    fun workspacePaddingTop() {
-        assertThat(dp.workspacePadding.top).isEqualTo(0)
-    }
-
-    @Test
-    fun workspacePaddingRight() {
-        assertThat(dp.workspacePadding.right).isEqualTo(33)
-    }
-
-    @Test
-    fun workspacePaddingBottom() {
-        assertThat(dp.workspacePadding.bottom).isEqualTo(291)
-    }
-
-    @Test
-    fun iconScale() {
-        assertThat(dp.iconScale).isEqualTo(1)
-    }
-
-    @Test
-    fun cellScaleToFit() {
-        assertThat(dp.cellScaleToFit).isEqualTo(1.1976048f)
-    }
-
-    @Test
-    fun workspaceTopPadding() {
-        assertThat(dp.workspaceTopPadding).isEqualTo(0)
-    }
-
-    @Test
-    fun workspaceBottomPadding() {
-        assertThat(dp.workspaceBottomPadding).isEqualTo(0)
-    }
-
-    @Test
-    fun overviewTaskMarginPx() {
-        assertThat(dp.overviewTaskMarginPx).isEqualTo(32)
-    }
-
-    @Test
-    fun overviewTaskMarginGridPx() {
-        assertThat(dp.overviewTaskMarginGridPx).isEqualTo(32)
-    }
-
-    @Test
-    fun overviewTaskIconSizePx() {
-        assertThat(dp.overviewTaskIconSizePx).isEqualTo(96)
-    }
-
-    @Test
-    fun overviewTaskIconDrawableSizePx() {
-        assertThat(dp.overviewTaskIconDrawableSizePx).isEqualTo(88)
-    }
-
-    @Test
-    fun overviewTaskIconDrawableSizeGridPx() {
-        assertThat(dp.overviewTaskIconDrawableSizeGridPx).isEqualTo(88)
-    }
-
-    @Test
-    fun overviewTaskThumbnailTopMarginPx() {
-        assertThat(dp.overviewTaskThumbnailTopMarginPx).isEqualTo(160)
-    }
-
-    @Test
-    fun overviewActionsTopMarginPx() {
-        assertThat(dp.overviewActionsTopMarginPx).isEqualTo(48)
-    }
-
-    @Test
-    fun overviewActionsHeight() {
-        assertThat(dp.overviewActionsHeight).isEqualTo(96)
-    }
-
-    @Test
-    fun overviewActionsButtonSpacing() {
-        assertThat(dp.overviewActionsButtonSpacing).isEqualTo(72)
-    }
-
-    @Test
-    fun overviewPageSpacing() {
-        assertThat(dp.overviewPageSpacing).isEqualTo(88)
-    }
-
-    @Test
-    fun overviewRowSpacing() {
-        assertThat(dp.overviewRowSpacing).isEqualTo(40)
-    }
-
-    @Test
-    fun overviewGridSideMargin() {
-        assertThat(dp.overviewGridSideMargin).isEqualTo(128)
-    }
-
-    @Test
-    fun dropTargetBarTopMarginPx() {
-        assertThat(dp.dropTargetBarTopMarginPx).isEqualTo(220)
-    }
-
-    @Test
-    fun dropTargetBarSizePx() {
-        assertThat(dp.dropTargetBarSizePx).isEqualTo(144)
-    }
-
-    @Test
-    fun dropTargetBarBottomMarginPx() {
-        assertThat(dp.dropTargetBarBottomMarginPx).isEqualTo(96)
-    }
-
-    @Test
-    fun workspaceSpringLoadedMinNextPageVisiblePx() {
-        assertThat(dp.workspaceSpringLoadedMinNextPageVisiblePx).isEqualTo(48)
-    }
-
-    @Test
-    fun getWorkspaceSpringLoadScale() {
-        assertThat(dp.workspaceSpringLoadScale).isEqualTo(0.69064087f)
-    }
-
-    @Test
-    fun getCellLayoutHeight() {
-        assertThat(dp.cellLayoutHeight).isEqualTo(2169)
-    }
-
-    @Test
-    fun getCellLayoutWidth() {
-        assertThat(dp.cellLayoutWidth).isEqualTo(767)
-    }
-
-    @Test
-    fun getPanelCount() {
-        assertThat(dp.panelCount).isEqualTo(2)
-    }
-
-    @Test
-    fun isVerticalBarLayout() {
-        assertThat(dp.isVerticalBarLayout).isEqualTo(false)
-    }
-
-    @Test
-    fun getCellLayoutSpringLoadShrunkTop() {
-        assertThat(dp.cellLayoutSpringLoadShrunkTop).isEqualTo(460)
-    }
-
-    @Test
-    fun getCellLayoutSpringLoadShrunkBottom() {
-        assertThat(dp.cellLayoutSpringLoadShrunkBottom).isEqualTo(1958)
-    }
-
-    @Test
-    fun getQsbOffsetY() {
-        assertThat(dp.qsbOffsetY).isEqualTo(272)
-    }
-
-    @Test
-    fun getTaskbarOffsetY() {
-        assertThat(dp.taskbarOffsetY).isEqualTo(112)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingLeft() {
-        assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(266)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingTop() {
-        assertThat(dp.getHotseatLayoutPadding(context).top).isEqualTo(151)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingRight() {
-        assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(502)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingBottom() {
-        assertThat(dp.getHotseatLayoutPadding(context).bottom).isEqualTo(109)
-    }
-
-    @Test
-    fun hotseatBarEndOffset() {
-        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
deleted file mode 100644
index 0c5968e..0000000
--- a/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelPortraitTest.kt
+++ /dev/null
@@ -1,486 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.quickstep
-
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.android.launcher3.DeviceProfile
-import com.android.launcher3.DeviceProfileBaseTest
-import com.google.common.truth.Truth.assertThat
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-
-/**
- * Tests for DeviceProfile for two panel in portrait.
- */
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-class DeviceProfileTwoPanelPortraitTest : DeviceProfileBaseTest() {
-
-    lateinit var dp: DeviceProfile
-
-    @Before
-    fun before() {
-        initializeVarsForTablet(isTwoPanel = true)
-        dp = newDP()
-    }
-
-    @Test
-    fun isScalableGrid() {
-        assertThat(dp.isScalableGrid).isTrue()
-    }
-
-    @Test
-    fun cellWidthPx() {
-        assertThat(dp.cellWidthPx).isEqualTo(153)
-    }
-
-    @Test
-    fun cellHeightPx() {
-        assertThat(dp.cellHeightPx).isEqualTo(199)
-    }
-
-    @Test
-    fun getCellSizeX() {
-        assertThat(dp.cellSize.x).isEqualTo(153)
-    }
-
-    @Test
-    fun getCellSizeY() {
-        assertThat(dp.cellSize.y).isEqualTo(509)
-    }
-
-    @Test
-    fun cellLayoutBorderSpacePxX() {
-        assertThat(dp.cellLayoutBorderSpacePx.x).isEqualTo(38)
-    }
-
-    @Test
-    fun cellLayoutBorderSpacePxY() {
-        assertThat(dp.cellLayoutBorderSpacePx.y).isEqualTo(38)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxLeft() {
-        assertThat(dp.cellLayoutPaddingPx.left).isEqualTo(19)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxTop() {
-        assertThat(dp.cellLayoutPaddingPx.top).isEqualTo(0)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxRight() {
-        assertThat(dp.cellLayoutPaddingPx.right).isEqualTo(19)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxBottom() {
-        assertThat(dp.cellLayoutPaddingPx.bottom).isEqualTo(19)
-    }
-
-    @Test
-    fun iconSizePx() {
-        assertThat(dp.iconSizePx).isEqualTo(112)
-    }
-
-    @Test
-    fun iconTextSizePx() {
-        assertThat(dp.iconTextSizePx).isEqualTo(28)
-    }
-
-    @Test
-    fun iconDrawablePaddingPx() {
-        assertThat(dp.iconDrawablePaddingPx).isEqualTo(14)
-    }
-
-    @Test
-    fun folderCellWidthPx() {
-        assertThat(dp.folderCellWidthPx).isEqualTo(153)
-    }
-
-    @Test
-    fun folderCellHeightPx() {
-        assertThat(dp.folderCellHeightPx).isEqualTo(199)
-    }
-
-    @Test
-    fun folderChildIconSizePx() {
-        assertThat(dp.folderChildIconSizePx).isEqualTo(112)
-    }
-
-    @Test
-    fun folderChildTextSizePx() {
-        assertThat(dp.folderChildTextSizePx).isEqualTo(28)
-    }
-
-    @Test
-    fun folderChildDrawablePaddingPx() {
-        assertThat(dp.folderChildDrawablePaddingPx).isEqualTo(16)
-    }
-
-    @Test
-    fun folderCellLayoutBorderSpaceOriginalPx() {
-        assertThat(dp.folderCellLayoutBorderSpaceOriginalPx).isEqualTo(0)
-    }
-
-    @Test
-    fun folderCellLayoutBorderSpacePxX() {
-        assertThat(dp.folderCellLayoutBorderSpacePx.x).isEqualTo(0)
-    }
-
-    @Test
-    fun folderCellLayoutBorderSpacePxY() {
-        assertThat(dp.folderCellLayoutBorderSpacePx.y).isEqualTo(0)
-    }
-
-    @Test
-    fun bottomSheetTopPadding() {
-        assertThat(dp.bottomSheetTopPadding).isEqualTo(600)
-    }
-
-    @Test
-    fun allAppsShiftRange() {
-        assertThat(dp.allAppsShiftRange).isEqualTo(1960)
-    }
-
-    @Test
-    fun allAppsTopPadding() {
-        assertThat(dp.allAppsTopPadding).isEqualTo(600)
-    }
-
-    @Test
-    fun allAppsIconSizePx() {
-        assertThat(dp.allAppsIconSizePx).isEqualTo(134)
-    }
-
-    @Test
-    fun allAppsIconTextSizePx() {
-        assertThat(dp.allAppsIconTextSizePx).isEqualTo(34)
-    }
-
-    @Test
-    fun allAppsIconDrawablePaddingPx() {
-        assertThat(dp.allAppsIconDrawablePaddingPx).isEqualTo(14)
-    }
-
-    @Test
-    fun allAppsCellHeightPx() {
-        assertThat(dp.allAppsCellHeightPx).isEqualTo(237)
-    }
-
-    @Test
-    fun allAppsCellWidthPx() {
-        assertThat(dp.allAppsCellWidthPx).isEqualTo(153)
-    }
-
-    @Test
-    fun allAppsBorderSpacePxX() {
-        assertThat(dp.allAppsBorderSpacePx.x).isEqualTo(38)
-    }
-
-    @Test
-    fun allAppsBorderSpacePxY() {
-        assertThat(dp.allAppsBorderSpacePx.y).isEqualTo(38)
-    }
-
-    @Test
-    fun numShownAllAppsColumns() {
-        assertThat(dp.numShownAllAppsColumns).isEqualTo(0)
-    }
-
-    @Test
-    fun allAppsLeftRightPadding() {
-        assertThat(dp.allAppsLeftRightPadding).isEqualTo(56)
-    }
-
-    @Test
-    fun allAppsLeftRightMargin() {
-        assertThat(dp.allAppsLeftRightMargin).isEqualTo(763)
-    }
-
-    @Test
-    fun hotseatBarSizePx() {
-        assertThat(dp.hotseatBarSizePx).isEqualTo(386)
-    }
-
-    @Test
-    fun hotseatCellHeightPx() {
-        assertThat(dp.hotseatCellHeightPx).isEqualTo(126)
-    }
-
-    @Test
-    fun hotseatBarBottomSpacePx() {
-        assertThat(dp.hotseatBarBottomSpacePx).isEqualTo(116)
-    }
-
-    @Test
-    fun hotseatBarSidePaddingStartPx() {
-        assertThat(dp.hotseatBarSidePaddingStartPx).isEqualTo(0)
-    }
-
-    @Test
-    fun hotseatBarSidePaddingEndPx() {
-        assertThat(dp.hotseatBarSidePaddingEndPx).isEqualTo(0)
-    }
-
-    @Test
-    fun hotseatQsbSpace() {
-        assertThat(dp.hotseatQsbSpace).isEqualTo(56)
-    }
-
-    @Test
-    fun hotseatQsbHeight() {
-        assertThat(dp.hotseatQsbHeight).isEqualTo(126)
-    }
-
-    @Test
-    fun springLoadedHotseatBarTopMarginPx() {
-        assertThat(dp.springLoadedHotseatBarTopMarginPx).isEqualTo(216)
-    }
-
-    @Test
-    fun numShownHotseatIcons() {
-        assertThat(dp.numShownHotseatIcons).isEqualTo(6)
-    }
-
-    @Test
-    fun hotseatBorderSpace() {
-        assertThat(dp.hotseatBorderSpace).isEqualTo(2)
-    }
-
-    @Test
-    fun isQsbInline() {
-        assertThat(dp.isQsbInline).isEqualTo(false)
-    }
-
-    @Test
-    fun qsbWidth() {
-        assertThat(dp.qsbWidth).isEqualTo(685)
-    }
-
-    @Test
-    fun isTaskbarPresent() {
-        assertThat(dp.isTaskbarPresent).isEqualTo(true)
-    }
-
-    @Test
-    fun isTaskbarPresentInApps() {
-        assertThat(dp.isTaskbarPresentInApps).isEqualTo(false)
-    }
-
-    @Test
-    fun taskbarSize() {
-        assertThat(dp.taskbarSize).isEqualTo(120)
-    }
-
-    @Test
-    fun desiredWorkspaceHorizontalMarginPx() {
-        assertThat(dp.desiredWorkspaceHorizontalMarginPx).isEqualTo(52)
-    }
-
-    @Test
-    fun workspacePaddingLeft() {
-        assertThat(dp.workspacePadding.left).isEqualTo(33)
-    }
-
-    @Test
-    fun workspacePaddingTop() {
-        assertThat(dp.workspacePadding.top).isEqualTo(0)
-    }
-
-    @Test
-    fun workspacePaddingRight() {
-        assertThat(dp.workspacePadding.right).isEqualTo(33)
-    }
-
-    @Test
-    fun workspacePaddingBottom() {
-        assertThat(dp.workspacePadding.bottom).isEqualTo(291)
-    }
-
-    @Test
-    fun iconScale() {
-        assertThat(dp.iconScale).isEqualTo(1)
-    }
-
-    @Test
-    fun cellScaleToFit() {
-        assertThat(dp.cellScaleToFit).isEqualTo(1.1976048f)
-    }
-
-    @Test
-    fun workspaceTopPadding() {
-        assertThat(dp.workspaceTopPadding).isEqualTo(0)
-    }
-
-    @Test
-    fun workspaceBottomPadding() {
-        assertThat(dp.workspaceBottomPadding).isEqualTo(0)
-    }
-
-    @Test
-    fun overviewTaskMarginPx() {
-        assertThat(dp.overviewTaskMarginPx).isEqualTo(32)
-    }
-
-    @Test
-    fun overviewTaskMarginGridPx() {
-        assertThat(dp.overviewTaskMarginGridPx).isEqualTo(32)
-    }
-
-    @Test
-    fun overviewTaskIconSizePx() {
-        assertThat(dp.overviewTaskIconSizePx).isEqualTo(96)
-    }
-
-    @Test
-    fun overviewTaskIconDrawableSizePx() {
-        assertThat(dp.overviewTaskIconDrawableSizePx).isEqualTo(88)
-    }
-
-    @Test
-    fun overviewTaskIconDrawableSizeGridPx() {
-        assertThat(dp.overviewTaskIconDrawableSizeGridPx).isEqualTo(88)
-    }
-
-    @Test
-    fun overviewTaskThumbnailTopMarginPx() {
-        assertThat(dp.overviewTaskThumbnailTopMarginPx).isEqualTo(160)
-    }
-
-    @Test
-    fun overviewActionsTopMarginPx() {
-        assertThat(dp.overviewActionsTopMarginPx).isEqualTo(48)
-    }
-
-    @Test
-    fun overviewActionsHeight() {
-        assertThat(dp.overviewActionsHeight).isEqualTo(96)
-    }
-
-    @Test
-    fun overviewActionsButtonSpacing() {
-        assertThat(dp.overviewActionsButtonSpacing).isEqualTo(72)
-    }
-
-    @Test
-    fun overviewPageSpacing() {
-        assertThat(dp.overviewPageSpacing).isEqualTo(88)
-    }
-
-    @Test
-    fun overviewRowSpacing() {
-        assertThat(dp.overviewRowSpacing).isEqualTo(40)
-    }
-
-    @Test
-    fun overviewGridSideMargin() {
-        assertThat(dp.overviewGridSideMargin).isEqualTo(128)
-    }
-
-    @Test
-    fun dropTargetBarTopMarginPx() {
-        assertThat(dp.dropTargetBarTopMarginPx).isEqualTo(220)
-    }
-
-    @Test
-    fun dropTargetBarSizePx() {
-        assertThat(dp.dropTargetBarSizePx).isEqualTo(144)
-    }
-
-    @Test
-    fun dropTargetBarBottomMarginPx() {
-        assertThat(dp.dropTargetBarBottomMarginPx).isEqualTo(96)
-    }
-
-    @Test
-    fun workspaceSpringLoadedMinNextPageVisiblePx() {
-        assertThat(dp.workspaceSpringLoadedMinNextPageVisiblePx).isEqualTo(48)
-    }
-
-    @Test
-    fun getWorkspaceSpringLoadScale() {
-        assertThat(dp.workspaceSpringLoadScale).isEqualTo(0.69064087f)
-    }
-
-    @Test
-    fun getCellLayoutHeight() {
-        assertThat(dp.cellLayoutHeight).isEqualTo(2169)
-    }
-
-    @Test
-    fun getCellLayoutWidth() {
-        assertThat(dp.cellLayoutWidth).isEqualTo(767)
-    }
-
-    @Test
-    fun getPanelCount() {
-        assertThat(dp.panelCount).isEqualTo(2)
-    }
-
-    @Test
-    fun isVerticalBarLayout() {
-        assertThat(dp.isVerticalBarLayout).isEqualTo(false)
-    }
-
-    @Test
-    fun getCellLayoutSpringLoadShrunkTop() {
-        assertThat(dp.cellLayoutSpringLoadShrunkTop).isEqualTo(460)
-    }
-
-    @Test
-    fun getCellLayoutSpringLoadShrunkBottom() {
-        assertThat(dp.cellLayoutSpringLoadShrunkBottom).isEqualTo(1958)
-    }
-
-    @Test
-    fun getQsbOffsetY() {
-        assertThat(dp.qsbOffsetY).isEqualTo(272)
-    }
-
-    @Test
-    fun getTaskbarOffsetY() {
-        assertThat(dp.taskbarOffsetY).isEqualTo(112)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingLeft() {
-        assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(459)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingTop() {
-        assertThat(dp.getHotseatLayoutPadding(context).top).isEqualTo(151)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingRight() {
-        assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(459)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingBottom() {
-        assertThat(dp.getHotseatLayoutPadding(context).bottom).isEqualTo(109)
-    }
-
-    @Test
-    fun hotseatBarEndOffset() {
-        assertThat(dp.hotseatBarEndOffset).isEqualTo(0)
-    }
-}
\ 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
deleted file mode 100644
index 2bad6bb..0000000
--- a/quickstep/tests/src/com/android/quickstep/DeviceProfileVerticalBar3ButtonTest.kt
+++ /dev/null
@@ -1,486 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.quickstep
-
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.android.launcher3.DeviceProfile
-import com.android.launcher3.DeviceProfileBaseTest
-import com.google.common.truth.Truth.assertThat
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-
-/**
- * Tests for DeviceProfile for landscape phone with vertical bar and 3-Button navigation.
- */
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-class DeviceProfileVerticalBar3ButtonTest : DeviceProfileBaseTest() {
-
-    lateinit var dp: DeviceProfile
-
-    @Before
-    fun before() {
-        initializeVarsForPhone(isVerticalBar = true, isGestureMode = false)
-        dp = newDP()
-    }
-
-    @Test
-    fun isScalableGrid() {
-        assertThat(dp.isScalableGrid).isFalse()
-    }
-
-    @Test
-    fun cellWidthPx() {
-        assertThat(dp.cellWidthPx).isEqualTo(210)
-    }
-
-    @Test
-    fun cellHeightPx() {
-        assertThat(dp.cellHeightPx).isEqualTo(221)
-    }
-
-    @Test
-    fun getCellSizeX() {
-        assertThat(dp.cellSize.x).isEqualTo(675)
-    }
-
-    @Test
-    fun getCellSizeY() {
-        assertThat(dp.cellSize.y).isEqualTo(321)
-    }
-
-    @Test
-    fun cellLayoutBorderSpacePxX() {
-        assertThat(dp.cellLayoutBorderSpacePx.x).isEqualTo(0)
-    }
-
-    @Test
-    fun cellLayoutBorderSpacePxY() {
-        assertThat(dp.cellLayoutBorderSpacePx.y).isEqualTo(0)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxLeft() {
-        assertThat(dp.cellLayoutPaddingPx.left).isEqualTo(70)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxTop() {
-        assertThat(dp.cellLayoutPaddingPx.top).isEqualTo(0)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxRight() {
-        assertThat(dp.cellLayoutPaddingPx.right).isEqualTo(70)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxBottom() {
-        assertThat(dp.cellLayoutPaddingPx.bottom).isEqualTo(53)
-    }
-
-    @Test
-    fun iconSizePx() {
-        assertThat(dp.iconSizePx).isEqualTo(196)
-    }
-
-    @Test
-    fun iconTextSizePx() {
-        assertThat(dp.iconTextSizePx).isEqualTo(0)
-    }
-
-    @Test
-    fun iconDrawablePaddingPx() {
-        assertThat(dp.iconDrawablePaddingPx).isEqualTo(0)
-    }
-
-    @Test
-    fun folderCellWidthPx() {
-        assertThat(dp.folderCellWidthPx).isEqualTo(260)
-    }
-
-    @Test
-    fun folderCellHeightPx() {
-        assertThat(dp.folderCellHeightPx).isEqualTo(304)
-    }
-
-    @Test
-    fun folderChildIconSizePx() {
-        assertThat(dp.folderChildIconSizePx).isEqualTo(196)
-    }
-
-    @Test
-    fun folderChildTextSizePx() {
-        assertThat(dp.folderChildTextSizePx).isEqualTo(49)
-    }
-
-    @Test
-    fun folderChildDrawablePaddingPx() {
-        assertThat(dp.folderChildDrawablePaddingPx).isEqualTo(14)
-    }
-
-    @Test
-    fun folderCellLayoutBorderSpaceOriginalPx() {
-        assertThat(dp.folderCellLayoutBorderSpaceOriginalPx).isEqualTo(0)
-    }
-
-    @Test
-    fun folderCellLayoutBorderSpacePxX() {
-        assertThat(dp.folderCellLayoutBorderSpacePx.x).isEqualTo(0)
-    }
-
-    @Test
-    fun folderCellLayoutBorderSpacePxY() {
-        assertThat(dp.folderCellLayoutBorderSpacePx.y).isEqualTo(0)
-    }
-
-    @Test
-    fun bottomSheetTopPadding() {
-        assertThat(dp.bottomSheetTopPadding).isEqualTo(53)
-    }
-
-    @Test
-    fun allAppsShiftRange() {
-        assertThat(dp.allAppsShiftRange).isEqualTo(1050)
-    }
-
-    @Test
-    fun allAppsTopPadding() {
-        assertThat(dp.allAppsTopPadding).isEqualTo(0)
-    }
-
-    @Test
-    fun allAppsIconSizePx() {
-        assertThat(dp.allAppsIconSizePx).isEqualTo(196)
-    }
-
-    @Test
-    fun allAppsIconTextSizePx() {
-        assertThat(dp.allAppsIconTextSizePx).isEqualTo(49)
-    }
-
-    @Test
-    fun allAppsIconDrawablePaddingPx() {
-        assertThat(dp.allAppsIconDrawablePaddingPx).isEqualTo(28)
-    }
-
-    @Test
-    fun allAppsCellHeightPx() {
-        assertThat(dp.allAppsCellHeightPx).isEqualTo(422)
-    }
-
-    @Test
-    fun allAppsCellWidthPx() {
-        assertThat(dp.allAppsCellWidthPx).isEqualTo(252)
-    }
-
-    @Test
-    fun allAppsBorderSpacePxX() {
-        assertThat(dp.allAppsBorderSpacePx.x).isEqualTo(56)
-    }
-
-    @Test
-    fun allAppsBorderSpacePxY() {
-        assertThat(dp.allAppsBorderSpacePx.y).isEqualTo(56)
-    }
-
-    @Test
-    fun numShownAllAppsColumns() {
-        assertThat(dp.numShownAllAppsColumns).isEqualTo(0)
-    }
-
-    @Test
-    fun allAppsLeftRightPadding() {
-        assertThat(dp.allAppsLeftRightPadding).isEqualTo(0)
-    }
-
-    @Test
-    fun allAppsLeftRightMargin() {
-        assertThat(dp.allAppsLeftRightMargin).isEqualTo(0)
-    }
-
-    @Test
-    fun hotseatBarSizePx() {
-        assertThat(dp.hotseatBarSizePx).isEqualTo(336)
-    }
-
-    @Test
-    fun hotseatCellHeightPx() {
-        assertThat(dp.hotseatCellHeightPx).isEqualTo(221)
-    }
-
-    @Test
-    fun hotseatBarBottomSpacePx() {
-        assertThat(dp.hotseatBarBottomSpacePx).isEqualTo(168)
-    }
-
-    @Test
-    fun hotseatBarSidePaddingStartPx() {
-        assertThat(dp.hotseatBarSidePaddingStartPx).isEqualTo(84)
-    }
-
-    @Test
-    fun hotseatBarSidePaddingEndPx() {
-        assertThat(dp.hotseatBarSidePaddingEndPx).isEqualTo(56)
-    }
-
-    @Test
-    fun hotseatQsbSpace() {
-        assertThat(dp.hotseatQsbSpace).isEqualTo(126)
-    }
-
-    @Test
-    fun hotseatQsbHeight() {
-        assertThat(dp.hotseatQsbHeight).isEqualTo(221)
-    }
-
-    @Test
-    fun springLoadedHotseatBarTopMarginPx() {
-        assertThat(dp.springLoadedHotseatBarTopMarginPx).isEqualTo(158)
-    }
-
-    @Test
-    fun numShownHotseatIcons() {
-        assertThat(dp.numShownHotseatIcons).isEqualTo(4)
-    }
-
-    @Test
-    fun hotseatBorderSpace() {
-        assertThat(dp.hotseatBorderSpace).isEqualTo(0)
-    }
-
-    @Test
-    fun isQsbInline() {
-        assertThat(dp.isQsbInline).isEqualTo(false)
-    }
-
-    @Test
-    fun qsbWidth() {
-        assertThat(dp.qsbWidth).isEqualTo(2221)
-    }
-
-    @Test
-    fun isTaskbarPresent() {
-        assertThat(dp.isTaskbarPresent).isEqualTo(false)
-    }
-
-    @Test
-    fun isTaskbarPresentInApps() {
-        assertThat(dp.isTaskbarPresentInApps).isEqualTo(false)
-    }
-
-    @Test
-    fun taskbarSize() {
-        assertThat(dp.taskbarSize).isEqualTo(0)
-    }
-
-    @Test
-    fun desiredWorkspaceHorizontalMarginPx() {
-        assertThat(dp.desiredWorkspaceHorizontalMarginPx).isEqualTo(0)
-    }
-
-    @Test
-    fun workspacePaddingLeft() {
-        assertThat(dp.workspacePadding.left).isEqualTo(14)
-    }
-
-    @Test
-    fun workspacePaddingTop() {
-        assertThat(dp.workspacePadding.top).isEqualTo(0)
-    }
-
-    @Test
-    fun workspacePaddingRight() {
-        assertThat(dp.workspacePadding.right).isEqualTo(266)
-    }
-
-    @Test
-    fun workspacePaddingBottom() {
-        assertThat(dp.workspacePadding.bottom).isEqualTo(0)
-    }
-
-    @Test
-    fun iconScale() {
-        assertThat(dp.iconScale).isEqualTo(1)
-    }
-
-    @Test
-    fun cellScaleToFit() {
-        assertThat(dp.cellScaleToFit).isEqualTo(1.0f)
-    }
-
-    @Test
-    fun workspaceTopPadding() {
-        assertThat(dp.workspaceTopPadding).isEqualTo(0)
-    }
-
-    @Test
-    fun workspaceBottomPadding() {
-        assertThat(dp.workspaceBottomPadding).isEqualTo(0)
-    }
-
-    @Test
-    fun overviewTaskMarginPx() {
-        assertThat(dp.overviewTaskMarginPx).isEqualTo(56)
-    }
-
-    @Test
-    fun overviewTaskMarginGridPx() {
-        assertThat(dp.overviewTaskMarginGridPx).isEqualTo(0)
-    }
-
-    @Test
-    fun overviewTaskIconSizePx() {
-        assertThat(dp.overviewTaskIconSizePx).isEqualTo(168)
-    }
-
-    @Test
-    fun overviewTaskIconDrawableSizePx() {
-        assertThat(dp.overviewTaskIconDrawableSizePx).isEqualTo(154)
-    }
-
-    @Test
-    fun overviewTaskIconDrawableSizeGridPx() {
-        assertThat(dp.overviewTaskIconDrawableSizeGridPx).isEqualTo(0)
-    }
-
-    @Test
-    fun overviewTaskThumbnailTopMarginPx() {
-        assertThat(dp.overviewTaskThumbnailTopMarginPx).isEqualTo(280)
-    }
-
-    @Test
-    fun overviewActionsTopMarginPx() {
-        assertThat(dp.overviewActionsTopMarginPx).isEqualTo(42)
-    }
-
-    @Test
-    fun overviewActionsHeight() {
-        assertThat(dp.overviewActionsHeight).isEqualTo(168)
-    }
-
-    @Test
-    fun overviewActionsButtonSpacing() {
-        assertThat(dp.overviewActionsButtonSpacing).isEqualTo(126)
-    }
-
-    @Test
-    fun overviewPageSpacing() {
-        assertThat(dp.overviewPageSpacing).isEqualTo(56)
-    }
-
-    @Test
-    fun overviewRowSpacing() {
-        assertThat(dp.overviewRowSpacing).isEqualTo(-112)
-    }
-
-    @Test
-    fun overviewGridSideMargin() {
-        assertThat(dp.overviewGridSideMargin).isEqualTo(0)
-    }
-
-    @Test
-    fun dropTargetBarTopMarginPx() {
-        assertThat(dp.dropTargetBarTopMarginPx).isEqualTo(21)
-    }
-
-    @Test
-    fun dropTargetBarSizePx() {
-        assertThat(dp.dropTargetBarSizePx).isEqualTo(126)
-    }
-
-    @Test
-    fun dropTargetBarBottomMarginPx() {
-        assertThat(dp.dropTargetBarBottomMarginPx).isEqualTo(21)
-    }
-
-    @Test
-    fun workspaceSpringLoadedMinNextPageVisiblePx() {
-        assertThat(dp.workspaceSpringLoadedMinNextPageVisiblePx).isEqualTo(84)
-    }
-
-    @Test
-    fun getWorkspaceSpringLoadScale() {
-        assertThat(dp.workspaceSpringLoadScale).isEqualTo(0.8880597f)
-    }
-
-    @Test
-    fun getCellLayoutHeight() {
-        assertThat(dp.cellLayoutHeight).isEqualTo(1340)
-    }
-
-    @Test
-    fun getCellLayoutWidth() {
-        assertThat(dp.cellLayoutWidth).isEqualTo(2840)
-    }
-
-    @Test
-    fun getPanelCount() {
-        assertThat(dp.panelCount).isEqualTo(1)
-    }
-
-    @Test
-    fun isVerticalBarLayout() {
-        assertThat(dp.isVerticalBarLayout).isEqualTo(true)
-    }
-
-    @Test
-    fun getCellLayoutSpringLoadShrunkTop() {
-        assertThat(dp.cellLayoutSpringLoadShrunkTop).isEqualTo(168)
-    }
-
-    @Test
-    fun getCellLayoutSpringLoadShrunkBottom() {
-        assertThat(dp.cellLayoutSpringLoadShrunkBottom).isEqualTo(1358)
-    }
-
-    @Test
-    fun getQsbOffsetY() {
-        assertThat(dp.qsbOffsetY).isEqualTo(147)
-    }
-
-    @Test
-    fun getTaskbarOffsetY() {
-        assertThat(dp.taskbarOffsetY).isEqualTo(225)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingLeft() {
-        assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(56)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingTop() {
-        assertThat(dp.getHotseatLayoutPadding(context).top).isEqualTo(0)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingRight() {
-        assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(84)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingBottom() {
-        assertThat(dp.getHotseatLayoutPadding(context).bottom).isEqualTo(165)
-    }
-
-    @Test
-    fun hotseatBarEndOffset() {
-        assertThat(dp.hotseatBarEndOffset).isEqualTo(0)
-    }
-}
\ 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
deleted file mode 100644
index 6256a43..0000000
--- a/quickstep/tests/src/com/android/quickstep/DeviceProfileVerticalBarTest.kt
+++ /dev/null
@@ -1,486 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.quickstep
-
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.android.launcher3.DeviceProfile
-import com.android.launcher3.DeviceProfileBaseTest
-import com.google.common.truth.Truth.assertThat
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-
-/**
- * Tests for DeviceProfile for landscape phone with vertical bar.
- */
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-class DeviceProfileVerticalBarTest : DeviceProfileBaseTest() {
-
-    lateinit var dp: DeviceProfile
-
-    @Before
-    fun before() {
-        initializeVarsForPhone(isVerticalBar = true)
-        dp = newDP()
-    }
-
-    @Test
-    fun isScalableGrid() {
-        assertThat(dp.isScalableGrid).isFalse()
-    }
-
-    @Test
-    fun cellWidthPx() {
-        assertThat(dp.cellWidthPx).isEqualTo(210)
-    }
-
-    @Test
-    fun cellHeightPx() {
-        assertThat(dp.cellHeightPx).isEqualTo(221)
-    }
-
-    @Test
-    fun getCellSizeX() {
-        assertThat(dp.cellSize.x).isEqualTo(675)
-    }
-
-    @Test
-    fun getCellSizeY() {
-        assertThat(dp.cellSize.y).isEqualTo(321)
-    }
-
-    @Test
-    fun cellLayoutBorderSpacePxX() {
-        assertThat(dp.cellLayoutBorderSpacePx.x).isEqualTo(0)
-    }
-
-    @Test
-    fun cellLayoutBorderSpacePxY() {
-        assertThat(dp.cellLayoutBorderSpacePx.y).isEqualTo(0)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxLeft() {
-        assertThat(dp.cellLayoutPaddingPx.left).isEqualTo(70)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxTop() {
-        assertThat(dp.cellLayoutPaddingPx.top).isEqualTo(0)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxRight() {
-        assertThat(dp.cellLayoutPaddingPx.right).isEqualTo(70)
-    }
-
-    @Test
-    fun cellLayoutPaddingPxBottom() {
-        assertThat(dp.cellLayoutPaddingPx.bottom).isEqualTo(53)
-    }
-
-    @Test
-    fun iconSizePx() {
-        assertThat(dp.iconSizePx).isEqualTo(196)
-    }
-
-    @Test
-    fun iconTextSizePx() {
-        assertThat(dp.iconTextSizePx).isEqualTo(0)
-    }
-
-    @Test
-    fun iconDrawablePaddingPx() {
-        assertThat(dp.iconDrawablePaddingPx).isEqualTo(0)
-    }
-
-    @Test
-    fun folderCellWidthPx() {
-        assertThat(dp.folderCellWidthPx).isEqualTo(260)
-    }
-
-    @Test
-    fun folderCellHeightPx() {
-        assertThat(dp.folderCellHeightPx).isEqualTo(304)
-    }
-
-    @Test
-    fun folderChildIconSizePx() {
-        assertThat(dp.folderChildIconSizePx).isEqualTo(196)
-    }
-
-    @Test
-    fun folderChildTextSizePx() {
-        assertThat(dp.folderChildTextSizePx).isEqualTo(49)
-    }
-
-    @Test
-    fun folderChildDrawablePaddingPx() {
-        assertThat(dp.folderChildDrawablePaddingPx).isEqualTo(14)
-    }
-
-    @Test
-    fun folderCellLayoutBorderSpaceOriginalPx() {
-        assertThat(dp.folderCellLayoutBorderSpaceOriginalPx).isEqualTo(0)
-    }
-
-    @Test
-    fun folderCellLayoutBorderSpacePxX() {
-        assertThat(dp.folderCellLayoutBorderSpacePx.x).isEqualTo(0)
-    }
-
-    @Test
-    fun folderCellLayoutBorderSpacePxY() {
-        assertThat(dp.folderCellLayoutBorderSpacePx.y).isEqualTo(0)
-    }
-
-    @Test
-    fun bottomSheetTopPadding() {
-        assertThat(dp.bottomSheetTopPadding).isEqualTo(53)
-    }
-
-    @Test
-    fun allAppsShiftRange() {
-        assertThat(dp.allAppsShiftRange).isEqualTo(1050)
-    }
-
-    @Test
-    fun allAppsTopPadding() {
-        assertThat(dp.allAppsTopPadding).isEqualTo(0)
-    }
-
-    @Test
-    fun allAppsIconSizePx() {
-        assertThat(dp.allAppsIconSizePx).isEqualTo(196)
-    }
-
-    @Test
-    fun allAppsIconTextSizePx() {
-        assertThat(dp.allAppsIconTextSizePx).isEqualTo(49)
-    }
-
-    @Test
-    fun allAppsIconDrawablePaddingPx() {
-        assertThat(dp.allAppsIconDrawablePaddingPx).isEqualTo(28)
-    }
-
-    @Test
-    fun allAppsCellHeightPx() {
-        assertThat(dp.allAppsCellHeightPx).isEqualTo(422)
-    }
-
-    @Test
-    fun allAppsCellWidthPx() {
-        assertThat(dp.allAppsCellWidthPx).isEqualTo(252)
-    }
-
-    @Test
-    fun allAppsBorderSpacePxX() {
-        assertThat(dp.allAppsBorderSpacePx.x).isEqualTo(56)
-    }
-
-    @Test
-    fun allAppsBorderSpacePxY() {
-        assertThat(dp.allAppsBorderSpacePx.y).isEqualTo(56)
-    }
-
-    @Test
-    fun numShownAllAppsColumns() {
-        assertThat(dp.numShownAllAppsColumns).isEqualTo(0)
-    }
-
-    @Test
-    fun allAppsLeftRightPadding() {
-        assertThat(dp.allAppsLeftRightPadding).isEqualTo(0)
-    }
-
-    @Test
-    fun allAppsLeftRightMargin() {
-        assertThat(dp.allAppsLeftRightMargin).isEqualTo(0)
-    }
-
-    @Test
-    fun hotseatBarSizePx() {
-        assertThat(dp.hotseatBarSizePx).isEqualTo(336)
-    }
-
-    @Test
-    fun hotseatCellHeightPx() {
-        assertThat(dp.hotseatCellHeightPx).isEqualTo(221)
-    }
-
-    @Test
-    fun hotseatBarBottomSpacePx() {
-        assertThat(dp.hotseatBarBottomSpacePx).isEqualTo(168)
-    }
-
-    @Test
-    fun hotseatBarSidePaddingStartPx() {
-        assertThat(dp.hotseatBarSidePaddingStartPx).isEqualTo(84)
-    }
-
-    @Test
-    fun hotseatBarSidePaddingEndPx() {
-        assertThat(dp.hotseatBarSidePaddingEndPx).isEqualTo(56)
-    }
-
-    @Test
-    fun hotseatQsbSpace() {
-        assertThat(dp.hotseatQsbSpace).isEqualTo(126)
-    }
-
-    @Test
-    fun hotseatQsbHeight() {
-        assertThat(dp.hotseatQsbHeight).isEqualTo(221)
-    }
-
-    @Test
-    fun springLoadedHotseatBarTopMarginPx() {
-        assertThat(dp.springLoadedHotseatBarTopMarginPx).isEqualTo(158)
-    }
-
-    @Test
-    fun numShownHotseatIcons() {
-        assertThat(dp.numShownHotseatIcons).isEqualTo(4)
-    }
-
-    @Test
-    fun hotseatBorderSpace() {
-        assertThat(dp.hotseatBorderSpace).isEqualTo(0)
-    }
-
-    @Test
-    fun isQsbInline() {
-        assertThat(dp.isQsbInline).isEqualTo(false)
-    }
-
-    @Test
-    fun qsbWidth() {
-        assertThat(dp.qsbWidth).isEqualTo(2221)
-    }
-
-    @Test
-    fun isTaskbarPresent() {
-        assertThat(dp.isTaskbarPresent).isEqualTo(false)
-    }
-
-    @Test
-    fun isTaskbarPresentInApps() {
-        assertThat(dp.isTaskbarPresentInApps).isEqualTo(false)
-    }
-
-    @Test
-    fun taskbarSize() {
-        assertThat(dp.taskbarSize).isEqualTo(0)
-    }
-
-    @Test
-    fun desiredWorkspaceHorizontalMarginPx() {
-        assertThat(dp.desiredWorkspaceHorizontalMarginPx).isEqualTo(0)
-    }
-
-    @Test
-    fun workspacePaddingLeft() {
-        assertThat(dp.workspacePadding.left).isEqualTo(14)
-    }
-
-    @Test
-    fun workspacePaddingTop() {
-        assertThat(dp.workspacePadding.top).isEqualTo(0)
-    }
-
-    @Test
-    fun workspacePaddingRight() {
-        assertThat(dp.workspacePadding.right).isEqualTo(266)
-    }
-
-    @Test
-    fun workspacePaddingBottom() {
-        assertThat(dp.workspacePadding.bottom).isEqualTo(0)
-    }
-
-    @Test
-    fun iconScale() {
-        assertThat(dp.iconScale).isEqualTo(1)
-    }
-
-    @Test
-    fun cellScaleToFit() {
-        assertThat(dp.cellScaleToFit).isEqualTo(1.0f)
-    }
-
-    @Test
-    fun workspaceTopPadding() {
-        assertThat(dp.workspaceTopPadding).isEqualTo(0)
-    }
-
-    @Test
-    fun workspaceBottomPadding() {
-        assertThat(dp.workspaceBottomPadding).isEqualTo(0)
-    }
-
-    @Test
-    fun overviewTaskMarginPx() {
-        assertThat(dp.overviewTaskMarginPx).isEqualTo(56)
-    }
-
-    @Test
-    fun overviewTaskMarginGridPx() {
-        assertThat(dp.overviewTaskMarginGridPx).isEqualTo(0)
-    }
-
-    @Test
-    fun overviewTaskIconSizePx() {
-        assertThat(dp.overviewTaskIconSizePx).isEqualTo(168)
-    }
-
-    @Test
-    fun overviewTaskIconDrawableSizePx() {
-        assertThat(dp.overviewTaskIconDrawableSizePx).isEqualTo(154)
-    }
-
-    @Test
-    fun overviewTaskIconDrawableSizeGridPx() {
-        assertThat(dp.overviewTaskIconDrawableSizeGridPx).isEqualTo(0)
-    }
-
-    @Test
-    fun overviewTaskThumbnailTopMarginPx() {
-        assertThat(dp.overviewTaskThumbnailTopMarginPx).isEqualTo(280)
-    }
-
-    @Test
-    fun overviewActionsTopMarginPx() {
-        assertThat(dp.overviewActionsTopMarginPx).isEqualTo(42)
-    }
-
-    @Test
-    fun overviewActionsHeight() {
-        assertThat(dp.overviewActionsHeight).isEqualTo(168)
-    }
-
-    @Test
-    fun overviewActionsButtonSpacing() {
-        assertThat(dp.overviewActionsButtonSpacing).isEqualTo(126)
-    }
-
-    @Test
-    fun overviewPageSpacing() {
-        assertThat(dp.overviewPageSpacing).isEqualTo(56)
-    }
-
-    @Test
-    fun overviewRowSpacing() {
-        assertThat(dp.overviewRowSpacing).isEqualTo(-112)
-    }
-
-    @Test
-    fun overviewGridSideMargin() {
-        assertThat(dp.overviewGridSideMargin).isEqualTo(0)
-    }
-
-    @Test
-    fun dropTargetBarTopMarginPx() {
-        assertThat(dp.dropTargetBarTopMarginPx).isEqualTo(21)
-    }
-
-    @Test
-    fun dropTargetBarSizePx() {
-        assertThat(dp.dropTargetBarSizePx).isEqualTo(126)
-    }
-
-    @Test
-    fun dropTargetBarBottomMarginPx() {
-        assertThat(dp.dropTargetBarBottomMarginPx).isEqualTo(21)
-    }
-
-    @Test
-    fun workspaceSpringLoadedMinNextPageVisiblePx() {
-        assertThat(dp.workspaceSpringLoadedMinNextPageVisiblePx).isEqualTo(84)
-    }
-
-    @Test
-    fun getWorkspaceSpringLoadScale() {
-        assertThat(dp.workspaceSpringLoadScale).isEqualTo(0.8880597f)
-    }
-
-    @Test
-    fun getCellLayoutHeight() {
-        assertThat(dp.cellLayoutHeight).isEqualTo(1340)
-    }
-
-    @Test
-    fun getCellLayoutWidth() {
-        assertThat(dp.cellLayoutWidth).isEqualTo(2840)
-    }
-
-    @Test
-    fun getPanelCount() {
-        assertThat(dp.panelCount).isEqualTo(1)
-    }
-
-    @Test
-    fun isVerticalBarLayout() {
-        assertThat(dp.isVerticalBarLayout).isEqualTo(true)
-    }
-
-    @Test
-    fun getCellLayoutSpringLoadShrunkTop() {
-        assertThat(dp.cellLayoutSpringLoadShrunkTop).isEqualTo(168)
-    }
-
-    @Test
-    fun getCellLayoutSpringLoadShrunkBottom() {
-        assertThat(dp.cellLayoutSpringLoadShrunkBottom).isEqualTo(1358)
-    }
-
-    @Test
-    fun getQsbOffsetY() {
-        assertThat(dp.qsbOffsetY).isEqualTo(147)
-    }
-
-    @Test
-    fun getTaskbarOffsetY() {
-        assertThat(dp.taskbarOffsetY).isEqualTo(225)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingLeft() {
-        assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(56)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingTop() {
-        assertThat(dp.getHotseatLayoutPadding(context).top).isEqualTo(0)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingRight() {
-        assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(84)
-    }
-
-    @Test
-    fun getHotseatLayoutPaddingBottom() {
-        assertThat(dp.getHotseatLayoutPadding(context).bottom).isEqualTo(165)
-    }
-
-    @Test
-    fun hotseatBarEndOffset() {
-        assertThat(dp.hotseatBarEndOffset).isEqualTo(0)
-    }
-}
\ No newline at end of file
diff --git a/quickstep/tests/src/com/android/quickstep/HotseatWidthCalculationTest.kt b/quickstep/tests/src/com/android/quickstep/HotseatWidthCalculationTest.kt
new file mode 100644
index 0000000..3967f75
--- /dev/null
+++ b/quickstep/tests/src/com/android/quickstep/HotseatWidthCalculationTest.kt
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.quickstep
+
+import android.graphics.Rect
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.launcher3.DeviceProfileBaseTest
+import com.android.launcher3.util.WindowBounds
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class HotseatWidthCalculationTest : DeviceProfileBaseTest() {
+
+    /**
+     * This is a case when after setting the hotseat, the space needs to be recalculated
+     * but it doesn't need to change QSB width or remove icons
+     */
+    @Test
+    fun distribute_border_space_when_space_is_enough_portrait() {
+        initializeVarsForTablet(isGestureMode = false)
+        windowBounds = WindowBounds(Rect(0, 0, 1800, 2560), Rect(0, 104, 0, 0))
+        val dp = newDP()
+        dp.isTaskbarPresentInApps = true
+
+        assertThat(dp.hotseatBarEndOffset).isEqualTo(558)
+        assertThat(dp.numShownHotseatIcons).isEqualTo(6)
+        assertThat(dp.hotseatBorderSpace).isEqualTo(69)
+
+        assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(176)
+        assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(558)
+
+        assertThat(dp.isQsbInline).isFalse()
+        assertThat(dp.hotseatQsbWidth).isEqualTo(1445)
+    }
+
+    /**
+     * This is a case when after setting the hotseat, and recalculating spaces
+     * it still needs to remove icons for everything to fit
+     */
+    @Test
+    fun decrease_num_of_icons_when_not_enough_space_portrait() {
+        initializeVarsForTablet(isGestureMode = false)
+        windowBounds = WindowBounds(Rect(0, 0, 1300, 2560), Rect(0, 104, 0, 0))
+        val dp = newDP()
+        dp.isTaskbarPresentInApps = true
+
+        assertThat(dp.hotseatBarEndOffset).isEqualTo(558)
+        assertThat(dp.numShownHotseatIcons).isEqualTo(4)
+        assertThat(dp.hotseatBorderSpace).isEqualTo(76)
+
+        assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(122)
+        assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(558)
+
+        assertThat(dp.isQsbInline).isFalse()
+        assertThat(dp.hotseatQsbWidth).isEqualTo(1058)
+    }
+
+    /**
+     * This is a case when after setting the hotseat, the space needs to be recalculated
+     * but it doesn't need to change QSB width or remove icons
+     */
+    @Test
+    fun distribute_border_space_when_space_is_enough_landscape() {
+        initializeVarsForTwoPanel(isGestureMode = false, isLandscape = true)
+        val dp = newDP()
+        dp.isTaskbarPresentInApps = true
+
+        assertThat(dp.hotseatBarEndOffset).isEqualTo(744)
+        assertThat(dp.numShownHotseatIcons).isEqualTo(6)
+        assertThat(dp.hotseatBorderSpace).isEqualTo(83)
+
+        assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(106)
+        assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(744)
+
+        assertThat(dp.isQsbInline).isFalse()
+        assertThat(dp.hotseatQsbWidth).isEqualTo(1467)
+    }
+
+    /**
+     * This is a case when the hotseat spans a certain amount of columns
+     * and the nav buttons push the hotseat to the side, but not enough to change the border space.
+     */
+    @Test
+    fun nav_buttons_dont_interfere_with_required_hotseat_width() {
+        initializeVarsForTablet(isGestureMode = false, isLandscape = true)
+        inv?.apply {
+            hotseatColumnSpan = IntArray(4) { 4 }
+            inlineQsb = BooleanArray(4) { false }
+        }
+        val dp = newDP()
+        dp.isTaskbarPresentInApps = true
+
+        assertThat(dp.hotseatBarEndOffset).isEqualTo(705)
+        assertThat(dp.numShownHotseatIcons).isEqualTo(6)
+        assertThat(dp.hotseatBorderSpace).isEqualTo(108)
+
+        assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(631)
+        assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(705)
+
+        assertThat(dp.isQsbInline).isFalse()
+        assertThat(dp.hotseatQsbWidth).isEqualTo(1227)
+    }
+
+    /**
+     * This is a case when after setting the hotseat, the QSB width needs to be changed to fit
+     */
+    @Test
+    fun decrease_qsb_when_not_enough_space_landscape() {
+        initializeVarsForTablet(isGestureMode = false, isLandscape = true)
+        windowBounds = WindowBounds(Rect(0, 0, 2460, 1600), Rect(0, 104, 0, 0))
+        val dp = newDP()
+        dp.isTaskbarPresentInApps = true
+
+        assertThat(dp.hotseatBarEndOffset).isEqualTo(705)
+        assertThat(dp.numShownHotseatIcons).isEqualTo(6)
+        assertThat(dp.hotseatBorderSpace).isEqualTo(36)
+
+        assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(884)
+        assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(705)
+
+        assertThat(dp.isQsbInline).isTrue()
+        assertThat(dp.hotseatQsbWidth).isEqualTo(559)
+    }
+
+    /**
+     * This is a case when after setting the hotseat, changing QSB width, and recalculating spaces
+     * it still needs to remove icons for everything to fit
+     */
+    @Test
+    fun decrease_num_of_icons_when_not_enough_space_landscape() {
+        initializeVarsForTablet(isGestureMode = false, isLandscape = true)
+        windowBounds = WindowBounds(Rect(0, 0, 2260, 1600), Rect(0, 104, 0, 0))
+        val dp = newDP()
+        dp.isTaskbarPresentInApps = true
+
+        assertThat(dp.hotseatBarEndOffset).isEqualTo(705)
+        assertThat(dp.numShownHotseatIcons).isEqualTo(5)
+        assertThat(dp.hotseatBorderSpace).isEqualTo(56)
+
+        assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(801)
+        assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(705)
+
+        assertThat(dp.isQsbInline).isTrue()
+        assertThat(dp.hotseatQsbWidth).isEqualTo(480)
+    }
+}
diff --git a/quickstep/tests/src/com/android/quickstep/OrientationTouchTransformerTest.java b/quickstep/tests/src/com/android/quickstep/OrientationTouchTransformerTest.java
index 1c15e1e..c822578 100644
--- a/quickstep/tests/src/com/android/quickstep/OrientationTouchTransformerTest.java
+++ b/quickstep/tests/src/com/android/quickstep/OrientationTouchTransformerTest.java
@@ -41,7 +41,7 @@
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.filters.SmallTest;
 
-import com.android.launcher3.ResourceUtils;
+import com.android.launcher3.testing.shared.ResourceUtils;
 import com.android.launcher3.util.DisplayController;
 import com.android.launcher3.util.RotationUtils;
 import com.android.launcher3.util.WindowBounds;
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/drawable/ic_all_apps_bg_hand.xml b/res/drawable/ic_all_apps_bg_hand.xml
deleted file mode 100644
index 7f3fe14..0000000
--- a/res/drawable/ic_all_apps_bg_hand.xml
+++ /dev/null
@@ -1,100 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<vector
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:width="208dp"
-    android:height="212dp"
-    android:viewportWidth="208.0"
-    android:viewportHeight="212.0">
-    <path
-        android:fillColor="#1A000000"
-        android:pathData="M89.4,61.8H85l-1.6-1.5c5.5-6.4,8.8-14.7,8.8-23.7C92.2,16.6,76,0.3,55.9,0.3
-        S19.5,16.6,19.5,36.6S35.8,73,55.9,73c9,0,17.3-3.3,23.7-8.8l1.5,1.6v4.4l40.5,40.4l8.3-8.3L89.4,61.8z M54,66.6
-        c-13.9,0-28.8-16-28.8-30S41.5,8.9,55.4,8.9S81,22.7,81,36.6S67.9,66.6,54,66.6z"/>
-    <path
-        android:fillColor="#1A000000"
-        android:pathData="M33.4,29.2l-0.3-1.8l-4.2-3.1L18.1,26l-3.1,4.2l0.3,1.8L4.5,33.7L9,62.5
-        c0.2,1.5,1.6,2.5,3.1,2.3l34.2-5.3c1.5-0.2,2.5-1.6,2.3-3.1l-4.4-28.8L33.4,29.2z"/>
-    <path
-        android:fillColor="#3367D6"
-        android:pathData="M30.2,27.9l-0.3-1.8l-4.1-3L15,24.7l-3,4.1l0.3,1.8L1.6,32.3L6,60.9
-        c0.2,1.5,1.6,2.5,3.1,2.3L43,57.9c1.5-0.2,2.5-1.6,2.3-3.1l-4.4-28.6L30.2,27.9z M26.6,28.4l-10.7,1.6l-0.3-1.8l10.7-1.6L26.6,28.4z"/>
-    <group>
-        <clip-path
-            android:pathData="M25.1,37.7a28.9,28.9 0 1,0 57.8,0a28.9,28.9 0 1,0 -57.8,0"/>
-        <path
-            android:fillColor="#4285F4"
-            android:pathData="M41.7,23l-0.3-2.1l-4.9-3.6l-12.6,1.9l-3.6,4.9l0.3,2.1L8.1,28.1l5.2,33.7
-                c0.3,1.7,1.9,2.9,3.6,2.7l40-6.1c1.7-0.3,2.9-1.9,2.7-3.6L54.4,21L41.7,23z M37.5,23.6l-12.6,1.9l-0.3-2.1l12.6-1.9L37.5,23.6z"/>
-    </group>
-    <path
-        android:fillColor="?android:attr/colorControlHighlight"
-        android:pathData="M87.5,62.9h-4.4l-1.6-1.5c5.5-6.4,8.8-14.7,8.8-23.7C90.3,17.7,74,1.4,54,1.4
-        S17.6,17.7,17.6,37.7S33.9,74.1,54,74.1c9,0,17.3-3.3,23.7-8.8l1.5,1.6v4.4l40.5,40.4l8.3-8.3L87.5,62.9z M54,64.2
-        c-14.7,0-26.5-11.8-26.5-26.5S39.3,11.2,54,11.2s26.5,11.8,26.5,26.5S68.6,64.2,54,64.2z"/>
-    <path
-        android:fillColor="#1A000000"
-        android:pathData="M153.4,112.9c-14.9-17.2-38.6-9.1-38.6-9.1l-10.2-11.3c0,0-4.8-5.9-9-3.7
-        c-7,3.6-0.6,10.7-0.6,10.7s12.3,15.1,15.4,20.1c2.1,3.4,8.4,4.5,10.1,4.9l17.1,3.7l-0.9-0.7l-1-0.7L153.4,112.9z"/>
-    <path
-        android:fillColor="#FFDBA6"
-        android:pathData="M152.1,113.9c-14.9-17.2-37.6-8-37.6-8l-11.1-12.3c0,0-4.8-5.9-9-3.7
-        c-7,3.6-0.6,10.7-0.6,10.7s12.3,15.1,15.4,20.1c2.1,3.4,8.4,4.5,10.1,4.9l19,4.1"/>
-    <path
-        android:fillColor="#1A000000"
-        android:pathData="M148.6,77.9c0.6,0.7,2,2.5,2.1,2.6c1.1,1.7,6.2,13.6,11.8,35.1c0,0.1,1.9,3,1.9,3.1
-        c0,0,0.1,0.1,0.1,0.2c0,0,0,0,0-0.1c0.9,1.3,4.4,6.6,8.9,13.7c0.1,0.2,0.3,0.5,0.4,0.7c0,0.1,0.1,0.1,0.1,0.2
-        c0.2,0.3,0.4,0.6,0.6,0.9c0.1-0.1,0.2-0.2,0.3-0.3c0.2-0.3,0.6-0.3,0.8,0c2.9,4.8,21.2,35,26.7,49c2.1,5.3,3.2,8.4,3.6,11.6
-        c0.3,2.3,0,4.4-1.2,6c1.5-1.9,3.5-6.8-1.5-19c-1.2-2.9-2.8-6.5-4.8-10.5c-7.5-15.2-20-35.6-22.4-39.6c-0.2-0.3-0.6-0.3-0.8,0
-        c-0.2,0.2-0.3,0.4-0.5,0.6c-4.5-7.1-8.2-12.6-8.8-13.5c-0.1-0.1-1.9-3-1.9-3.1c-5.7-21.6-10.7-33.4-11.8-35.1
-        c-0.1-0.1-1.5-1.9-2.1-2.6l-6.5-8.3c-1.9-2.3-4.2-4.1-6.7-2.3c-2.5,1.8-1.6,4.5-0.1,7.1l3.3,5.2l7-2
-        C147.7,77.4,148.1,77.3,148.6,77.9z"/>
-    <path
-        android:fillColor="#FFDBA6"
-        android:pathData="M148.6,77.9l-6.5-8.3c-1.9-2.3-4.2-4.1-6.7-2.3l0,0l0,0c-2.5,1.8-1.6,4.5-0.1,7.1l3.8,6L148.6,77.9C148.6,77.9,148.6,77.9,148.6,77.9z"/>
-    <path
-        android:fillColor="#1A000000"
-        android:pathData="M151.1,92.5l-19.7-25.3c-1.9-2.3-4.2-4.1-6.7-2.3l0,0l0,0c-2.5,1.8-1.6,4.5-0.1,7.1l17.1,27.2L151.1,92.5z"/>
-    <path
-        android:fillColor="#FFDBA6"
-        android:pathData="M149.7,92.9l-19.7-25.3c-1.9-2.3-4.2-4.1-6.7-2.3l0,0l0,0c-2.5,1.8-1.6,4.5-0.1,7.1l17.1,27.2L149.7,92.9z"/>
-    <path
-        android:fillColor="#1A000000"
-        android:pathData="M141.6,94.6l-20.8-26.7c-2.1-2.5-4.4-4.3-7.1-2.5l0,0l0,0c-2.6,1.9-1.7,4.7-0.1,7.5l18,28.6L141.6,94.6z"/>
-    <path
-        android:fillColor="#FFDBA6"
-        android:pathData="M140.1,95l-20.8-26.7c-2.1-2.5-4.4-4.3-7.1-2.5l0,0h0c-2.6,1.9-1.7,4.7-0.1,7.5l18,28.6L140.1,95z"/>
-    <path
-        android:fillColor="#1A000000"
-        android:pathData="M140.4,99.1c-0.5-0.6-2.1-7.5-2.8-7.3l-15.9-6.9c-0.3,0-0.5-0.1-0.7-0.3l-2.3-3.5
-        l-0.4-0.6L100,54.5c-1.5-2-3.3-4-5.3-4.3c-0.7-0.1-1.3-0.2-2,0.2v0c-1,0.6-1.2,1.5-1.3,2.4c-0.2,1.8,0.6,3.9,1.6,5.9L108.5,87
-        l0.2,0.4l6.6,11.7l0,0c2.5,4.5,4.4,10.5,4.4,10.7L140.4,99.1"/>
-    <path
-        android:fillColor="#FFDBA6"
-        android:pathData="M129.7,125.1c3,0.7,8.1,4,11.8,9.1c2.7,3.7,5.5,8.3,8.2,13
-        c7.6-2.3,19.9-6.8,24.9-12.9c-0.2-0.3-0.4-0.6-0.6-0.9c0-0.1-0.1-0.1-0.1-0.2c-0.1-0.2-0.3-0.5-0.4-0.7c-4.5-7.1-8-12.4-8.9-13.7
-        c0,0,0,0,0,0.1c0-0.1-0.1-0.1-0.1-0.2c-0.1-0.1-1.9-3-1.9-3.1c-5.7-21.5-10.7-33.4-11.8-35.1c-0.1-0.1-1.5-1.9-2.1-2.6
-        c-0.5-0.6-0.9-0.5-1.6-0.3l-26.8,7.7c-0.3,0-0.5-0.1-0.7-0.3l-2.3-3.5l-0.4-0.6L98.5,54.8c-1.5-2-3.3-4-5.3-4.3
-        c-0.7-0.1-1.3-0.2-2,0.2c-1,0.6-1.2,1.5-1.3,2.4c-0.2,1.8,0.6,3.9,1.6,5.9L107,87.3l0.2,0.4l6.6,11.7l0,0
-        c2.5,4.5,4.4,10.5,4.4,10.7L129.7,125.1"/>
-    <path
-        android:fillColor="?android:attr/colorForeground"
-        android:pathData="M202.3,183.1c-5.4-14.1-23.8-44.3-26.7-49c-0.2-0.3-0.6-0.3-0.8,0
-        c-5.1,6.6-19,11.4-26.5,13.6c-0.3,0.1-1,0.1-1.2,0.6c-0.2,0.4,0.1,1,0.2,1.1c7.8,12.9,14.7,27.9,15.3,29.3c0,0.1,0.1,0.1,0.1,0.2
-        l9.6,22.9c0,0,0,0,0,0l1.7,4.1c1.4,2.7,3,4.3,5.3,5.1c1.5,0.5,2.1,0.6,3.2,0.6c4.8,0.1,15.2-6.1,20.5-9.4c2.7-1.7,3.3-4.4,2.9-7.6
-        C205.5,191.5,204.4,188.4,202.3,183.1z"/>
-</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_all_apps_bg_icon_1.xml b/res/drawable/ic_all_apps_bg_icon_1.xml
deleted file mode 100644
index d226ac6..0000000
--- a/res/drawable/ic_all_apps_bg_icon_1.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="48dp"
-        android:height="48dp"
-        android:viewportWidth="48.0"
-        android:viewportHeight="48.0">
-
-    <path
-        android:fillColor="#1A000000"
-        android:pathData="M44.28,30.96c4.84-10.68,0.09-23.27-10.59-28.11S10.42,2.74,5.58,13.42
-        C1,23.54,6.5,35.92,16.62,40.51l0,0l-3.23,7.12C27.84,47,39.79,40.86,44.28,30.96z" />
-    <path
-        android:fillColor="?android:attr/colorPrimary"
-        android:pathData="M41.75,30.05c4.84-10.68,0.09-23.27-10.59-28.11S7.9,1.83,3.06,12.51
-        c-4.59,10.12,0.92,22.5,11.03,27.09l0,0l-3.23,7.12C25.31,46.09,37.26,39.94,41.75,30.05z" />
-</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_all_apps_bg_icon_2.xml b/res/drawable/ic_all_apps_bg_icon_2.xml
deleted file mode 100644
index 5966d99..0000000
--- a/res/drawable/ic_all_apps_bg_icon_2.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="48dp"
-        android:height="48dp"
-        android:viewportWidth="48.0"
-        android:viewportHeight="48.0">
-
-    <path
-        android:fillColor="#1A000000"
-        android:pathData="M20.54,44.59c0.57-0.04,1.15-0.38,1.67-1.04l24.23-30.62c0.62-0.78,0.77-1.54,0.52-2.12
-        c-0.25-0.58-0.9-0.99-1.89-1.1L6.2,5.99C5.39,5.91,4.74,6.08,4.32,6.44l0,0C3.7,6.97,3.55,7.88,4.01,8.96l14.54,34.09
-        C19,44.13,19.75,44.65,20.54,44.59L20.54,44.59z" />
-    <path
-        android:fillColor="?android:attr/colorPrimary"
-        android:pathData="M18.49,43.22c0.57-0.04,1.15-0.38,1.67-1.04l24.23-30.62c0.62-0.78,0.77-1.54,0.52-2.12
-        c-0.25-0.58-0.9-0.99-1.89-1.1L4.15,4.62C3.34,4.54,2.69,4.71,2.27,5.08l0,0C1.65,5.6,1.5,6.52,1.96,7.6L16.5,41.69
-        C16.96,42.76,17.7,43.28,18.49,43.22L18.49,43.22z" />
-</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_all_apps_bg_icon_3.xml b/res/drawable/ic_all_apps_bg_icon_3.xml
deleted file mode 100644
index b18f8bc..0000000
--- a/res/drawable/ic_all_apps_bg_icon_3.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="48dp"
-        android:height="48dp"
-        android:viewportWidth="48.0"
-        android:viewportHeight="48.0">
-
-    <path
-        android:fillColor="#1A000000"
-        android:pathData="M25.18,1.27c-12.32,0-23.41,9.99-23.41,22.31s11.09,22.31,23.41,22.31
-        s22.31-9.99,22.31-22.31S37.5,1.27,25.18,1.27z M25.18,33.55c-5.5,0-14.35-5.1-14.35-10.6s8.32-12.19,13.82-12.19
-        c5.5,0,10.49,7.33,10.49,12.83S30.68,33.55,25.18,33.55z" />
-    <path
-        android:fillColor="?android:attr/colorPrimary"
-        android:pathData="M22.93,0.22c-12.32,0-22.31,9.99-22.31,22.31s9.99,22.31,22.31,22.31
-        s22.31-9.99,22.31-22.31S35.25,0.22,22.93,0.22z M22.93,32.5c-5.5,0-9.97-4.46-9.97-9.97s4.46-9.97,9.97-9.97
-        c5.5,0,9.97,4.46,9.97,9.97S28.43,32.5,22.93,32.5z" />
-    <path
-        android:fillColor="?android:attr/colorPrimary"
-        android:pathData="M14.81,22.53a8.12,8.12 0 1,0 16.24,0a8.12,8.12 0 1,0 -16.24,0z" />
-</vector>
diff --git a/res/drawable/ic_all_apps_bg_icon_4.xml b/res/drawable/ic_all_apps_bg_icon_4.xml
deleted file mode 100644
index 8eb4d90..0000000
--- a/res/drawable/ic_all_apps_bg_icon_4.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="48dp"
-        android:height="48dp"
-        android:viewportWidth="48.0"
-        android:viewportHeight="48.0">
-
-    <path
-        android:fillColor="#1A000000"
-        android:pathData="M11.53,8.02l23.39-5.73c1.61-0.39,3.25,0.6,3.64,2.21l7.64,31.19
-        c0.39,1.61-0.6,3.25-2.21,3.64L12.8,46.97c-1.61,0.39-3.25-0.6-3.64-2.21L3.43,21.37L11.53,8.02z" />
-    <path
-        android:fillColor="?android:attr/colorPrimary"
-        android:pathData="M9.2,6.53L32.59,0.8C34.2,0.4,35.84,1.4,36.23,3l7.64,31.19c0.39,1.61-0.6,3.25-2.21,3.64
-        l-31.19,7.64c-1.61,0.39-3.25-0.6-3.64-2.21L1.11,19.87L9.2,6.53z" />
-    <path
-        android:fillColor="#1A000000"
-        android:pathData="M9.27,6.47l1.91,7.8c0.4,1.62-0.59,3.24-2.21,3.64l-7.8,1.91L9.27,6.47z" />
-</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_block_shadow.xml b/res/drawable/ic_block_shadow.xml
deleted file mode 100644
index 045fe8d..0000000
--- a/res/drawable/ic_block_shadow.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2020 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-        http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<com.android.launcher3.graphics.ShadowDrawable
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:src="@drawable/ic_block_no_shadow"
-    android:elevation="@dimen/drop_target_shadow_elevation" />
diff --git a/res/drawable/ic_remove_shadow.xml b/res/drawable/ic_remove_shadow.xml
deleted file mode 100644
index 48abc10..0000000
--- a/res/drawable/ic_remove_shadow.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-        http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<com.android.launcher3.graphics.ShadowDrawable
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:src="@drawable/ic_remove_no_shadow"
-    android:elevation="@dimen/drop_target_shadow_elevation" />
diff --git a/res/drawable/ic_setup_shadow.xml b/res/drawable/ic_setup_shadow.xml
deleted file mode 100644
index 10aeee6..0000000
--- a/res/drawable/ic_setup_shadow.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-        http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<com.android.launcher3.graphics.ShadowDrawable
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:src="@drawable/ic_setting"
-    android:elevation="@dimen/drop_target_shadow_elevation" />
diff --git a/res/drawable/ic_uninstall_shadow.xml b/res/drawable/ic_uninstall_shadow.xml
deleted file mode 100644
index b441b0e..0000000
--- a/res/drawable/ic_uninstall_shadow.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-        http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<com.android.launcher3.graphics.ShadowDrawable
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:src="@drawable/ic_uninstall_no_shadow"
-    android:elevation="@dimen/drop_target_shadow_elevation" />
diff --git a/res/layout/all_apps_search_market.xml b/res/layout/all_apps_search_market.xml
deleted file mode 100644
index 6f2dd3d..0000000
--- a/res/layout/all_apps_search_market.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2015 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<TextView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/search_market_text"
-    android:layout_width="match_parent"
-    android:layout_height="48dp"
-    android:gravity="center"
-    android:paddingLeft="@dimen/dynamic_grid_edge_margin"
-    android:paddingRight="@dimen/dynamic_grid_edge_margin"
-    android:fontFamily="sans-serif-medium"
-    android:textSize="14sp"
-    android:textColor="?android:attr/colorAccent"
-    android:text="@string/all_apps_search_market_message"
-    android:textAllCaps="true"
-    android:focusable="true"
-    android:background="?android:selectableItemBackground" />
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 445bfda..a699667 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Deursoek programme"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Laai tans programme …"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"Kon geen programme kry wat by \"<xliff:g id="QUERY">%1$s</xliff:g>\" pas nie"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Soek meer programme"</string>
     <string name="label_application" msgid="8531721983832654978">"Program"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Alle programme"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Kennisgewings"</string>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index 474cd9f..b7d4a7d 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"መተግበሪያዎችን ፈልግ"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"መተግበሪያዎችን በመጫን ላይ…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"ከ«<xliff:g id="QUERY">%1$s</xliff:g>» ጋር የሚዛመዱ ምንም መተግበሪያዎች አልተገኙም"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"ተጨማሪ መተግበሪያዎች ይፈልጉ"</string>
     <string name="label_application" msgid="8531721983832654978">"መተግበሪያ"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"ሁሉም መተግበሪያዎች"</string>
     <string name="notifications_header" msgid="1404149926117359025">"ማሳወቂያዎች"</string>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index a4f7c03..e075559 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"بحث في التطبيقات"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"جارٍ تحميل التطبيقات…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"لم يتم العثور على أي تطبيقات تتطابق مع \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"البحث عن مزيد من التطبيقات"</string>
     <string name="label_application" msgid="8531721983832654978">"تطبيق"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"جميع التطبيقات"</string>
     <string name="notifications_header" msgid="1404149926117359025">"الإشعارات"</string>
diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml
index beb9619..ba14e97 100644
--- a/res/values-as/strings.xml
+++ b/res/values-as/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"এপসমূহ সন্ধান কৰক"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"এপসমূহ ল’ড কৰি থকা হৈছে…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\"ৰ সৈতে মিলা কোনো এপ্ বিচাৰি পোৱা নগ\'ল"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"আৰু অধিক এপবোৰ সন্ধান কৰক"</string>
     <string name="label_application" msgid="8531721983832654978">"এপ্"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"আটাইবোৰ এপ্"</string>
     <string name="notifications_header" msgid="1404149926117359025">"জাননীসমূহ"</string>
@@ -73,7 +72,7 @@
     <string name="all_apps_button_work_label" msgid="7270707118948892488">"কৰ্মস্থানৰ এপৰ তালিকা"</string>
     <string name="remove_drop_target_label" msgid="7812859488053230776">"আঁতৰাওক"</string>
     <string name="uninstall_drop_target_label" msgid="4722034217958379417">"আনইনষ্টল কৰক"</string>
-    <string name="app_info_drop_target_label" msgid="692894985365717661">"এপ সম্পৰ্কীয় তথ্য"</string>
+    <string name="app_info_drop_target_label" msgid="692894985365717661">"এপ্‌ সম্পৰ্কীয় তথ্য"</string>
     <string name="install_drop_target_label" msgid="2539096853673231757">"ইনষ্টল কৰক"</string>
     <string name="dismiss_prediction_label" msgid="3357562989568808658">"এপৰ পৰামৰ্শ নিদিব"</string>
     <string name="pin_prediction" msgid="4196423321649756498">"পূৰ্বানুমান কৰা এপ্‌টো পিন কৰক"</string>
diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml
index 93e6f08..2e07405 100644
--- a/res/values-az/strings.xml
+++ b/res/values-az/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Tətbiqləri axtarın"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Tətbiqlər yüklənir…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"<xliff:g id="QUERY">%1$s</xliff:g> sorğusuna uyğun tətbiq tapılmadı"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Daha çox tətbiq üçün axtarış edin"</string>
     <string name="label_application" msgid="8531721983832654978">"Tətbiq"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Bütün tətbiqlər"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Bildirişlər"</string>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index ded4dc9..cc6e908 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Pretražite aplikacije"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Aplikacije se učitavaju…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"Nije pronađena nijedna aplikacija za „<xliff:g id="QUERY">%1$s</xliff:g>“"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Pretraži još aplikacija"</string>
     <string name="label_application" msgid="8531721983832654978">"Aplikacija"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Sve aplikacije"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Obaveštenja"</string>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index 7fa8341..69a16ba 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Пошук праграм"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Праграмы загружаюцца…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"Праграм, якія адпавядаюць запыту \"<xliff:g id="QUERY">%1$s</xliff:g>\", не знойдзена"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Шукаць іншыя праграмы"</string>
     <string name="label_application" msgid="8531721983832654978">"Праграма"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Усе праграмы"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Апавяшчэнні"</string>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 62b7796..549c8ea 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Търсене в приложенията"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Приложенията се зареждат…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"Няма намерени приложения, съответстващи на „<xliff:g id="QUERY">%1$s</xliff:g>“"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Търсене на още приложения"</string>
     <string name="label_application" msgid="8531721983832654978">"Приложение"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Всички приложения"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Известия"</string>
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
index 1be272b..9683182 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"অ্যাপ খুঁজুন"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"অ্যাপ লোড হচ্ছে…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\" এর সাথে মেলে এমন কোনো অ্যাপ পাওয়া যায়নি"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"আরও অ্যাপ্লিকেশানের জন্য খুঁজুন"</string>
     <string name="label_application" msgid="8531721983832654978">"অ্যাপ"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"সব অ্যাপ"</string>
     <string name="notifications_header" msgid="1404149926117359025">"বিজ্ঞপ্তি"</string>
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
index 639b6b3..f99525f 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Pretražite aplikacije"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Aplikacije se učitavaju…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"Nije pronađena nijedna aplikacija za upit \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Pretraži više aplikacija"</string>
     <string name="label_application" msgid="8531721983832654978">"Aplikacija"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Sve aplikacije"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Obavještenja"</string>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index ee35fd3..d8ede15 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Cerca aplicacions"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"S\'estan carregant les aplicacions…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"No s\'ha trobat cap aplicació que coincideixi amb \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Cerca més aplicacions"</string>
     <string name="label_application" msgid="8531721983832654978">"Aplicació"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Totes les aplicacions"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Notificacions"</string>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 1b418c6..e4d46e4 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Hledat v aplikacích"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Načítání aplikací…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"Dotazu „<xliff:g id="QUERY">%1$s</xliff:g>“ neodpovídají žádné aplikace"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Vyhledat další aplikace"</string>
     <string name="label_application" msgid="8531721983832654978">"Aplikace"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Všechny aplikace"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Oznámení"</string>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 5cdadcd..4da7b84 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Søg efter apps"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Indlæser apps…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"Der blev ikke fundet nogen apps, som matcher \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Søg efter flere apps"</string>
     <string name="label_application" msgid="8531721983832654978">"App"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Alle apps"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Notifikationer"</string>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index b75ef9d..3c2514f 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Apps finden"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Apps werden geladen…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"Keine Apps für \"<xliff:g id="QUERY">%1$s</xliff:g>\" gefunden"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Weitere Apps suchen"</string>
     <string name="label_application" msgid="8531721983832654978">"App"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Alle Apps"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Benachrichtigungen"</string>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 99c9e23..ae9a8fd 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Αναζήτηση εφαρμογών"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Φόρτωση εφαρμογών…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"Δεν βρέθηκαν εφαρμογές αντιστοίχισης για \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Αναζήτηση περισσότερων εφαρμογών"</string>
     <string name="label_application" msgid="8531721983832654978">"Εφαρμογή"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Όλες οι εφαρμογές"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Ειδοποιήσεις"</string>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index 97f0528..4f15eb5 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Search apps"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Loading apps…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"No apps found matching \'<xliff:g id="QUERY">%1$s</xliff:g>\'"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Search for more apps"</string>
     <string name="label_application" msgid="8531721983832654978">"App"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"All apps"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Notifications"</string>
diff --git a/res/values-en-rCA/strings.xml b/res/values-en-rCA/strings.xml
index 97f0528..4f15eb5 100644
--- a/res/values-en-rCA/strings.xml
+++ b/res/values-en-rCA/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Search apps"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Loading apps…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"No apps found matching \'<xliff:g id="QUERY">%1$s</xliff:g>\'"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Search for more apps"</string>
     <string name="label_application" msgid="8531721983832654978">"App"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"All apps"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Notifications"</string>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index 97f0528..4f15eb5 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Search apps"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Loading apps…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"No apps found matching \'<xliff:g id="QUERY">%1$s</xliff:g>\'"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Search for more apps"</string>
     <string name="label_application" msgid="8531721983832654978">"App"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"All apps"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Notifications"</string>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index 97f0528..4f15eb5 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Search apps"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Loading apps…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"No apps found matching \'<xliff:g id="QUERY">%1$s</xliff:g>\'"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Search for more apps"</string>
     <string name="label_application" msgid="8531721983832654978">"App"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"All apps"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Notifications"</string>
diff --git a/res/values-en-rXC/strings.xml b/res/values-en-rXC/strings.xml
index 4977beb..e644c23 100644
--- a/res/values-en-rXC/strings.xml
+++ b/res/values-en-rXC/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‏‎‏‏‎‎‏‏‎‏‎‎‏‏‎‎‎‎‏‏‏‏‎‎‏‎‏‏‎‏‎‏‎‎‏‏‏‏‎‎‏‎‎‎‏‏‎‎‏‏‏‎‏‎‎‎‎‏‎‎‏‏‏‎‎Search apps‎‏‎‎‏‎"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‏‎‏‎‏‏‏‏‎‏‎‏‏‏‎‏‎‎‏‎‎‎‎‏‏‎‏‎‏‎‏‏‏‎‏‏‏‏‏‎‎‎‏‎‏‏‏‏‏‏‎‏‎‏‎‎‎Loading apps…‎‏‎‎‏‎"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‏‏‎‏‎‏‏‎‎‎‏‏‎‏‎‎‏‏‏‏‎‏‎‏‎‏‎‎‎‎‎‏‏‏‏‏‎‎‎‏‏‎‎‏‎‏‎‏‏‏‏‎‏‎‏‎‎‎‎‎‎‏‎‏‎‎No apps found matching \"‎‏‎‎‏‏‎<xliff:g id="QUERY">%1$s</xliff:g>‎‏‎‎‏‏‏‎\"‎‏‎‎‏‎"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‏‎‏‏‎‎‏‎‏‏‏‏‎‏‎‏‏‏‏‏‎‎‎‏‎‏‎‎‏‏‏‏‏‎‎‏‏‎‏‏‏‏‏‎‎‏‎‏‏‏‏‎‎‏‏‎‎‏‏‎‏‎‎‎‎Search for more apps‎‏‎‎‏‎"</string>
     <string name="label_application" msgid="8531721983832654978">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‎‎‏‏‎‏‏‎‎‎‎‏‏‏‏‏‏‎‎‎‎‏‏‏‏‏‎‎‎‏‎‏‏‏‏‎‎‏‎‎‎‎‏‎‎‏‎‎‎‎‎‏‎‎App‎‏‎‎‏‎"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‏‏‏‏‎‎‎‏‎‏‏‎‎‏‏‎‏‏‏‎‏‎‎‏‎‏‏‎‏‏‏‏‏‎‎‎‏‏‏‏‏‏‎‎‎‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‎‎‎‏‏‏‎All apps‎‏‎‎‏‎"</string>
     <string name="notifications_header" msgid="1404149926117359025">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‏‎‏‏‎‎‏‏‎‏‏‏‏‏‎‎‏‎‎‎‏‎‏‎‏‏‏‎‏‎‏‏‎‎‎‏‎‏‎‏‏‎‎‏‏‏‎‏‏‎‏‏‏‏‎‏‏‎‏‏‎‎‎‏‎Notifications‎‏‎‎‏‎"</string>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 3ed312b..0bc8f4f 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Buscar apps"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Cargando apps…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"No hay apps que coincidan con \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Buscar más apps"</string>
     <string name="label_application" msgid="8531721983832654978">"App"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Todas las apps"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Notificaciones"</string>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 567ff0d..4045ad3 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Buscar aplicaciones"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Cargando aplicaciones…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"No se han encontrado aplicaciones que contengan \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Buscar más aplicaciones"</string>
     <string name="label_application" msgid="8531721983832654978">"Aplicación"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Todas las aplicaciones"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Notificaciones"</string>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index c34a003..effd140 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Otsige rakendusi"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Rakenduste laadimine …"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"Päringule „<xliff:g id="QUERY">%1$s</xliff:g>” ei vastanud ükski rakendus"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Otsi rohkem rakendusi"</string>
     <string name="label_application" msgid="8531721983832654978">"Rakendus"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Kõik rakendused"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Märguanded"</string>
diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml
index 55e0c3c..9e2d9a4 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Bilatu aplikazioetan"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Aplikazioak kargatzen…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"Ez da aurkitu \"<xliff:g id="QUERY">%1$s</xliff:g>\" bilaketaren emaitzarik"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Bilatu aplikazio gehiago"</string>
     <string name="label_application" msgid="8531721983832654978">"Aplikazioa"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Aplikazio guztiak"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Jakinarazpenak"</string>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 12db5bd..a1acda0 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"جستجوی برنامه‌ها"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"درحال بارگیری برنامه‌‌ها…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"هیچ برنامه‌ای در مطابقت با «<xliff:g id="QUERY">%1$s</xliff:g>» پیدا نشد"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"جستجوی برنامه‌های بیشتر"</string>
     <string name="label_application" msgid="8531721983832654978">"برنامه"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"همه برنامه‌ها"</string>
     <string name="notifications_header" msgid="1404149926117359025">"اعلان‌ها"</string>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 135c452..89e4106 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Hae sovelluksia"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Ladataan sovelluksia…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"<xliff:g id="QUERY">%1$s</xliff:g> ei palauttanut sovelluksia."</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Hae lisää sovelluksia"</string>
     <string name="label_application" msgid="8531721983832654978">"Sovellus"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Kaikki sovellukset"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Ilmoitukset"</string>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 446a507..448569d 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Rechercher dans les applications"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Chargement des applications en cours…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"Aucune application trouvée correspondant à « <xliff:g id="QUERY">%1$s</xliff:g> »"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Rechercher plus d\'applications"</string>
     <string name="label_application" msgid="8531721983832654978">"Application"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Toutes les applications"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Notifications"</string>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 1d623b1..a6856fc 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Rechercher dans les applications"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Chargement des applications…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"Aucune application ne correspond à la requête \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Rechercher plus d\'applications"</string>
     <string name="label_application" msgid="8531721983832654978">"Application"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Toutes les applis"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Notifications"</string>
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index 256c4d3..045d8d7 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Buscar aplicacións"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Cargando aplicacións…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"Non se atoparon aplicacións que coincidan con \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Buscar máis aplicacións"</string>
     <string name="label_application" msgid="8531721983832654978">"Aplicación"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Todas as aplicacións"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Notificacións"</string>
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
index f1e1996..7288570 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"શોધ ઍપ્લિકેશનો"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"ઍપ્લિકેશનો લોડ કરી રહ્યું છે…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\"થી મેળ ખાતી કોઈ ઍપ્લિકેશનો મળી નથી"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"વધુ ઍપ્લિકેશનો શોધો"</string>
     <string name="label_application" msgid="8531721983832654978">"ઍપ"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"બધી ઍપ"</string>
     <string name="notifications_header" msgid="1404149926117359025">"નોટિફિકેશન"</string>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 1b05040..5e71f33 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"ऐप सर्च करें"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"ऐप्लिकेशन लोड हो रहे हैं…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\" से मिलता-जुलता कोई ऐप्लिकेशन नहीं मिला"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"और ऐप सर्च करें"</string>
     <string name="label_application" msgid="8531721983832654978">"ऐप्लिकेशन"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"सभी ऐप्लिकेशन"</string>
     <string name="notifications_header" msgid="1404149926117359025">"सूचनाएं"</string>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 4a0fbe8..a1369e8 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Pretraži aplikacije"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Učitavanje aplikacija…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"Nema aplikacija podudarnih s upitom \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Traži više aplikacija"</string>
     <string name="label_application" msgid="8531721983832654978">"Aplikacija"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Sve aplikacije"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Obavijesti"</string>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index c1e527d..a5d4835 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Alkalmazások keresése"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Alkalmazások betöltése…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"Nem található alkalmazás a(z) „<xliff:g id="QUERY">%1$s</xliff:g>” lekérdezésre"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"További alkalmazások keresése"</string>
     <string name="label_application" msgid="8531721983832654978">"Alkalmazás"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Összes alkalmazás"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Értesítések"</string>
diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml
index f0d01f1..44c3a96 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Որոնել հավելվածներ"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Հավելվածների բեռնում…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"«<xliff:g id="QUERY">%1$s</xliff:g>» հարցմանը համապատասխանող հավելվածներ չեն գտնվել"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Որոնել այլ հավելվածներ"</string>
     <string name="label_application" msgid="8531721983832654978">"Հավելված"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Բոլոր հավելվածները"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Ծանուցումներ"</string>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 1a97a45..e46026e 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Telusuri aplikasi"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Memuat aplikasi…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"Tidak ditemukan aplikasi yang cocok dengan \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Telusuri aplikasi lainnya"</string>
     <string name="label_application" msgid="8531721983832654978">"Aplikasi"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Semua aplikasi"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Notifikasi"</string>
diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml
index a1959f8..92be25b 100644
--- a/res/values-is/strings.xml
+++ b/res/values-is/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Leita í forritum"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Hleður forrit…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"Ekki fundust forrit sem samsvara „<xliff:g id="QUERY">%1$s</xliff:g>“"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Leita að fleiri forritum"</string>
     <string name="label_application" msgid="8531721983832654978">"Forrit"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Öll forrit"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Tilkynningar"</string>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 302efcb..b5b7add 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Cerca nelle app"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Caricamento delle app…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"Nessuna app trovata corrispondente a \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Cerca altre app"</string>
     <string name="label_application" msgid="8531721983832654978">"App"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Tutte le app"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Notifiche"</string>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 15e200f..6b4d129 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"חיפוש אפליקציות"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"טעינת אפליקציות מתבצעת…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"לא נמצאו אפליקציות התואמות ל-\"<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"חיפוש אפליקציות נוספות"</string>
     <string name="label_application" msgid="8531721983832654978">"אפליקציה"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"כל האפליקציות"</string>
     <string name="notifications_header" msgid="1404149926117359025">"התראות"</string>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 2fd3ab5..484be1f 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"アプリを検索"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"アプリを読み込んでいます…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"「<xliff:g id="QUERY">%1$s</xliff:g>」に一致するアプリは見つかりませんでした"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"他のアプリを検索"</string>
     <string name="label_application" msgid="8531721983832654978">"アプリ"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"すべてのアプリ"</string>
     <string name="notifications_header" msgid="1404149926117359025">"通知"</string>
diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml
index 24f95dd..8437dd8 100644
--- a/res/values-ka/strings.xml
+++ b/res/values-ka/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"აპების ძიება"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"აპები იტვირთება…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"„<xliff:g id="QUERY">%1$s</xliff:g>“-ის თანხვედრი აპები არ მოიძებნა"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"მეტი აპის პოვნა"</string>
     <string name="label_application" msgid="8531721983832654978">"აპი"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"ყველა აპი"</string>
     <string name="notifications_header" msgid="1404149926117359025">"შეტყობინებები"</string>
diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml
index 8ed7ec5..ec3ee18 100644
--- a/res/values-kk/strings.xml
+++ b/res/values-kk/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Қолданбаларды іздеу"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Қолданбалар жүктелуде…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\" сұрауына сәйкес келетін қолданбалар жоқ"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Қосымша қолданбалар іздеу"</string>
     <string name="label_application" msgid="8531721983832654978">"Қолданба"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Барлық қолданба"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Хабарландырулар"</string>
diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml
index 306449c..f1c1d08 100644
--- a/res/values-km/strings.xml
+++ b/res/values-km/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"ស្វែងរក​កម្មវិធី"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"កំពុងផ្ទុកកម្មវិធី…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"រកមិនឃើញកម្មវិធី​ដែលត្រូវគ្នាជាមួយ \"<xliff:g id="QUERY">%1$s</xliff:g>\" ទេ"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"ស្វែងរកកម្មវិធីច្រើនទៀត"</string>
     <string name="label_application" msgid="8531721983832654978">"កម្មវិធី"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"កម្មវិធី​ទាំងអស់"</string>
     <string name="notifications_header" msgid="1404149926117359025">"ការ​ជូនដំណឹង"</string>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
index a9b89b5..72eaeac 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಹುಡುಕಿ"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ..."</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\" ಹೊಂದಿಕೆಯ ಯಾವುದೇ ಅಪ್ಲಿಕೇಶನ್‌ಗಳು ಕಂಡುಬಂದಿಲ್ಲ"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"ಮತ್ತಷ್ಟು ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಹುಡುಕಿ"</string>
     <string name="label_application" msgid="8531721983832654978">"ಆ್ಯಪ್"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"ಎಲ್ಲಾ ಆ್ಯಪ್‌ಗಳು"</string>
     <string name="notifications_header" msgid="1404149926117359025">"ಅಧಿಸೂಚನೆಗಳು"</string>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 0935aa1..f6b8ff7 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"앱 검색"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"앱 로드 중…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"\'<xliff:g id="QUERY">%1$s</xliff:g>\'과(와) 일치하는 앱이 없습니다."</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"더 많은 앱 검색"</string>
     <string name="label_application" msgid="8531721983832654978">"앱"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"모든 앱"</string>
     <string name="notifications_header" msgid="1404149926117359025">"알림"</string>
diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml
index 755e274..84b7993 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Колдонмолорду издөө"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Колдонмолор жүктөлүүдө…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\" сурамына дал келген колдонмолор табылган жок"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Көбүрөөк колдонмолорду издөө"</string>
     <string name="label_application" msgid="8531721983832654978">"Колдонмо"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Бардык колдонмолор"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Билдирмелер"</string>
diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml
index 9e75492..d8b55f8 100644
--- a/res/values-lo/strings.xml
+++ b/res/values-lo/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"ຊອກຫາແອັບ"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"ກໍາລັງໂຫຼດແອັບ…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"ບໍ່ພົບແອັບທີ່ກົງກັບ \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"ຊອກຫາແອັບເພີ່ມເຕີມ"</string>
     <string name="label_application" msgid="8531721983832654978">"ແອັບ"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"ແອັບທັງໝົດ"</string>
     <string name="notifications_header" msgid="1404149926117359025">"ການແຈ້ງເຕືອນ"</string>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index bbe0cfa..e68362d 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Paieškos programos"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Įkeliamos programos…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"Nerasta jokių užklausą „<xliff:g id="QUERY">%1$s</xliff:g>“ atitinkančių programų"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Ieškoti daugiau programų"</string>
     <string name="label_application" msgid="8531721983832654978">"Programa"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Visos programos"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Pranešimai"</string>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index b5836ef..75f6d1a 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Meklēt lietotnes"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Notiek lietotņu ielāde…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"Vaicājumam “<xliff:g id="QUERY">%1$s</xliff:g>” neatbilda neviena lietotne"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Meklēt citas lietotnes"</string>
     <string name="label_application" msgid="8531721983832654978">"Lietotne"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Visas lietotnes"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Paziņojumi"</string>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
index d452eba..fef9bbe 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Пребарувајте апликации"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Се вчитуваат апликации…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"Не се најдени апликации што одговараат на „<xliff:g id="QUERY">%1$s</xliff:g>“"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Пребарај други апликации"</string>
     <string name="label_application" msgid="8531721983832654978">"Апликација"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Сите апликации"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Известувања"</string>
diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml
index df532c0..802ea81 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"ആപ്പുകൾ തിരയുക"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"ആപ്പുകൾ ലോഡുചെയ്യുന്നു..."</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\" എന്നതുമായി പൊരുത്തപ്പെടുന്ന ആപ്പുകളൊന്നും കണ്ടെത്തിയില്ല"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"കൂടുതൽ ആപ്പുകൾക്ക് തിരയുക"</string>
     <string name="label_application" msgid="8531721983832654978">"ആപ്പ്"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"എല്ലാ ആപ്പുകളും"</string>
     <string name="notifications_header" msgid="1404149926117359025">"അറിയിപ്പുകൾ"</string>
diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml
index c71aaff..f091cb8 100644
--- a/res/values-mn/strings.xml
+++ b/res/values-mn/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Апп хайх"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Аппыг ачаалж байна..."</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\"-д тохирох апп олдсонгүй"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Бусад апп-г хайх"</string>
     <string name="label_application" msgid="8531721983832654978">"Апп"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Бүх апп"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Мэдэгдэл"</string>
diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml
index e871073..d6535ce 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"अ‍ॅप्स शोधा"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"अ‍ॅप्स लोड करत आहे…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\" शी जुळणारे कोणतेही अ‍ॅप्स आढळले नाहीत"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"अधिक अ‍ॅप्स शोधा"</string>
     <string name="label_application" msgid="8531721983832654978">"ॲप"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"सर्व अ‍ॅप्स"</string>
     <string name="notifications_header" msgid="1404149926117359025">"सूचना"</string>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index cbfb551..edd0530 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Cari apl"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Memuatkan apl…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"Tiada apl yang ditemui sepadan dengan \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Cari lagi apl"</string>
     <string name="label_application" msgid="8531721983832654978">"Apl"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Semua apl"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Pemberitahuan"</string>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index 984ec4c..bf66399 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"ရှာဖွေမှု အက်ပ်များ"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"အက်ပ်များကို ဖွင့်နေသည်…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\" နှင့်ကိုက်ညီသည့် အပ်ပ်များကို မတွေ့ပါ"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"နောက်ထပ် အက်ပ်များကို ရှာပါ"</string>
     <string name="label_application" msgid="8531721983832654978">"အက်ပ်"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"အက်ပ်အားလုံး"</string>
     <string name="notifications_header" msgid="1404149926117359025">"အကြောင်းကြားချက်များ"</string>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index b29ee77..3e08d10 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Søk etter apper"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Laster inn appene …"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"Fant ingen apper som samsvarer med «<xliff:g id="QUERY">%1$s</xliff:g>»"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Søk etter flere apper"</string>
     <string name="label_application" msgid="8531721983832654978">"App"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Alle apper"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Varsler"</string>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
index fcc1ece..8cef63d 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"खोजसम्बन्धी एपहरू"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"एपहरू लोड गर्दै…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\" सँग मिल्दो कुनै एप भेटिएन"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"थप एपहरू खोज्नुहोस्"</string>
     <string name="label_application" msgid="8531721983832654978">"एप"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"सबै एप"</string>
     <string name="notifications_header" msgid="1404149926117359025">"सूचनाहरू"</string>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index bd41952..4b203b7 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Apps zoeken"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Apps laden…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"Er zijn geen apps gevonden die overeenkomen met \'<xliff:g id="QUERY">%1$s</xliff:g>\'"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Zoeken naar meer apps"</string>
     <string name="label_application" msgid="8531721983832654978">"App"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Alle apps"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Meldingen"</string>
diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml
index 95fa000..dd5561d 100644
--- a/res/values-or/strings.xml
+++ b/res/values-or/strings.xml
@@ -38,7 +38,7 @@
     <string name="widget_accessible_dims_format" msgid="3640149169885301790">"%1$d ଓସାର ଓ %2$d ଉଚ୍ଚ"</string>
     <string name="widget_preview_context_description" msgid="9045841361655787574">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> ୱିଜେଟ୍"</string>
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"ମୂଳସ୍କ୍ରିନର ଆଖପାଖରେ ୱିଜେଟକୁ ମୁଭ କରିବା ପାଇଁ ଏହାକୁ ସ୍ପର୍ଶ କରି ଧରି ରଖନ୍ତୁ"</string>
-    <string name="add_to_home_screen" msgid="9168649446635919791">"ମୂଳସ୍କ୍ରିନରେ ଯୋଗ କରନ୍ତୁ"</string>
+    <string name="add_to_home_screen" msgid="9168649446635919791">"ହୋମ ସ୍କ୍ରିନରେ ଯୋଗ କରନ୍ତୁ"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g>ର ୱିଜେଟ୍ ମୂଳସ୍କ୍ରିନରେ ଯୋଡ଼ାଗଲା"</string>
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{#ଟି ୱିଜେଟ୍}other{#ଟି ୱିଜେଟ୍}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{#ଟି ସର୍ଟକଟ୍}other{#ଟି ସର୍ଟକଟ୍}}"</string>
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"ଆପ୍‌ ଖୋଜନ୍ତୁ"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"ଆପ୍‌ ଲୋଡ୍‌ ହେଉଛି..."</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\" ସହିତ ମେଳ ହେଉଥିବା କୌଣସି ଆପ୍‌ ମିଳିଲା ନାହିଁ"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"ଅଧିକ ଆପ୍‌ ଖୋଜନ୍ତୁ"</string>
     <string name="label_application" msgid="8531721983832654978">"ଆପ୍"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"ସବୁ ଆପ"</string>
     <string name="notifications_header" msgid="1404149926117359025">"ବିଜ୍ଞପ୍ତି"</string>
@@ -131,7 +130,7 @@
     <string name="dialog_remove" msgid="6510806469849709407">"କାଢ଼ି ଦିଅନ୍ତୁ"</string>
     <string name="widgets_list" msgid="796804551140113767">"ୱିଜେଟ୍ ତାଲିକା"</string>
     <string name="widgets_list_closed" msgid="6141506579418771922">"ୱିଜେଟ୍ ତାଲିକା ବନ୍ଦ ହୋଇଛି"</string>
-    <string name="action_add_to_workspace" msgid="215894119683164916">"ମୂଳସ୍କ୍ରିନରେ ଯୋଗ କରନ୍ତୁ"</string>
+    <string name="action_add_to_workspace" msgid="215894119683164916">"ହୋମ ସ୍କ୍ରିନରେ ଯୋଗ କରନ୍ତୁ"</string>
     <string name="action_move_here" msgid="2170188780612570250">"ଆଇଟମ୍‌କୁ ଏଠାକୁ ଘୁଞ୍ଚାନ୍ତୁ"</string>
     <string name="item_added_to_workspace" msgid="4211073925752213539">"ହୋମ୍‌ ସ୍କ୍ରୀନରେ ଆଇଟମ୍‌ ଯୋଡ଼ାଗଲା"</string>
     <string name="item_removed" msgid="851119963877842327">"ଆଇଟମକୁ କାଢ଼ି ଦିଆଯାଇଛି"</string>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index 01fbee0..a291a92 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"ਐਪਾਂ ਖੋਜੋ"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"ਐਪਾਂ ਨੂੰ ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ..."</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\" ਨਾਲ ਮੇਲ ਖਾਂਦੀਆਂ ਕੋਈ ਐਪਾਂ ਨਹੀਂ ਮਿਲੀਆਂ"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"ਹੋਰ ਐਪਾਂ ਖੋਜੋ"</string>
     <string name="label_application" msgid="8531721983832654978">"ਐਪ"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"ਸਾਰੀਆਂ ਐਪਾਂ"</string>
     <string name="notifications_header" msgid="1404149926117359025">"ਸੂਚਨਾਵਾਂ"</string>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 4b46f0b..448a56b 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Wyszukaj aplikacje"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Ładuję aplikacje…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"Nie znaleziono aplikacji pasujących do zapytania „<xliff:g id="QUERY">%1$s</xliff:g>”"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Wyszukaj więcej aplikacji"</string>
     <string name="label_application" msgid="8531721983832654978">"Aplikacja"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Wszystkie aplikacje"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Powiadomienia"</string>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index dbfa0cb..e2d8c9d 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Pesquisar aplicações"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"A carregar aplicações…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"Nenhuma app correspondente a \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Pesquisar mais aplicações"</string>
     <string name="label_application" msgid="8531721983832654978">"Aplicação"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Todas as apps"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Notificações"</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 3a5ed5b..98e8607 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Pesquisar apps"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Carregando apps…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"Nenhum app encontrado que corresponda a \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Pesquisar mais apps"</string>
     <string name="label_application" msgid="8531721983832654978">"App"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Todos os apps"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Notificações"</string>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 6061ea5..794609e 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Caută aplicații"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Se încarcă aplicații…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"Nu s-a găsit nicio aplicație pentru „<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Caută mai multe aplicații"</string>
     <string name="label_application" msgid="8531721983832654978">"Aplicație"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Toate aplicațiile"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Notificări"</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 0ad12bd..5987321 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Поиск приложений"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Загрузка приложений…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"По запросу \"<xliff:g id="QUERY">%1$s</xliff:g>\" ничего не найдено"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Искать другие приложения"</string>
     <string name="label_application" msgid="8531721983832654978">"Приложение"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Все приложения"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Уведомления"</string>
diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml
index cf3dc64..e030432 100644
--- a/res/values-si/strings.xml
+++ b/res/values-si/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"යෙදුම් සොයන්න"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"යෙදුම් පූරණය වෙමින්…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\" සමග ගැළපෙන යෙදුම් හමු නොවිණි"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"තව යෙදුම් සඳහා සොයන්න"</string>
     <string name="label_application" msgid="8531721983832654978">"යෙදුම"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"සියලු යෙදුම්"</string>
     <string name="notifications_header" msgid="1404149926117359025">"දැනුම්දීම්"</string>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index e3bcc52..ff2c226 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Hľadať aplikácie"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Načítavajú sa aplikácie…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"Nenašli sa žiadne aplikácie zodpovedajúce dopytu <xliff:g id="QUERY">%1$s</xliff:g>"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Hľadať ďalšie aplikácie"</string>
     <string name="label_application" msgid="8531721983832654978">"Aplikácia"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Všetky aplikácie"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Upozornenia"</string>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 5f952cf..b1f93e8 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Iskanje programov"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Nalaganje aplikacij …"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"Ni aplikacij, ki bi ustrezale poizvedbi »<xliff:g id="QUERY">%1$s</xliff:g>«"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Iskanje več aplikacij"</string>
     <string name="label_application" msgid="8531721983832654978">"Aplikacija"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Vse aplikacije"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Obvestila"</string>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index 9f29a87..99bcbaa 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Kërko për aplikacione"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Po ngarkon aplikacionet..."</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"Nuk u gjet asnjë aplikacion që përputhet me \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Kërko për më shumë aplikacione"</string>
     <string name="label_application" msgid="8531721983832654978">"Aplikacioni"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Të gjitha aplikacionet"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Njoftimet"</string>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 948d9b6..460a73e 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Претражите апликације"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Апликације се учитавају…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"Није пронађена ниједна апликација за „<xliff:g id="QUERY">%1$s</xliff:g>“"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Претражи још апликација"</string>
     <string name="label_application" msgid="8531721983832654978">"Апликација"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Све апликације"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Обавештења"</string>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index c35adb0..6ec274b 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Sök efter appar"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Läser in appar …"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"Inga appar som matchar <xliff:g id="QUERY">%1$s</xliff:g> hittades"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Sök efter fler appar"</string>
     <string name="label_application" msgid="8531721983832654978">"App"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Alla appar"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Aviseringar"</string>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index c233cc4..147c6e1 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Tafuta programu"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Inapakia programu..."</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"Haikupata programu zozote zinazolingana na \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Tafuta programu zaidi"</string>
     <string name="label_application" msgid="8531721983832654978">"Programu"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Programu zote"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Arifa"</string>
diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml
index bfec460..d8eacf5 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"ஆப்ஸில் தேடுக"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"ஆப்ஸை ஏற்றுகிறது…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\" உடன் பொருந்தும் ஆப்ஸ் இல்லை"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"கூடுதல் பயன்பாடுகளைத் தேடு"</string>
     <string name="label_application" msgid="8531721983832654978">"ஆப்ஸ்"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"அனைத்து ஆப்ஸும்"</string>
     <string name="notifications_header" msgid="1404149926117359025">"அறிவிப்புகள்"</string>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index 1d25371..08bccad 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"యాప్‌ల కోసం సెర్చ్ చేయండి"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"అప్లికేషన్‌లను లోడ్ చేస్తోంది…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\"కి సరిపోలే అప్లికేషన్‌లేవీ కనుగొనబడలేదు"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"మరిన్ని యాప్‌ల కోసం సెర్చ్ చేయండి"</string>
     <string name="label_application" msgid="8531721983832654978">"యాప్"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"అన్ని యాప్‌లు"</string>
     <string name="notifications_header" msgid="1404149926117359025">"నోటిఫికేషన్‌లు"</string>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index f633b5f..deb4834 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"ค้นหาแอป"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"กำลังโหลดแอป…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"ไม่พบแอปที่ตรงกับ \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"ค้นหาแอปเพิ่มเติม"</string>
     <string name="label_application" msgid="8531721983832654978">"แอป"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"แอปทั้งหมด"</string>
     <string name="notifications_header" msgid="1404149926117359025">"การแจ้งเตือน"</string>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index de4f952..a4cd808 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Maghanap ng mga app"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Naglo-load ng mga app…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"Walang nahanap na app na tumutugma sa \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Maghanap ng higit pang mga app"</string>
     <string name="label_application" msgid="8531721983832654978">"App"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Lahat ng app"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Mga Notification"</string>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index f41284b..c30c2e5 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Uygulamalarda ara"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Uygulamalar yükleniyor…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\" ile eşleşen uygulama bulunamadı"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Başka uygulamalar ara"</string>
     <string name="label_application" msgid="8531721983832654978">"Uygulama"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Tüm uygulamalar"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Bildirimler"</string>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 360950e..70f8e95 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Пошук додатків"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Завантаження додатків…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"Немає додатків для запиту \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Шукати ще додатки"</string>
     <string name="label_application" msgid="8531721983832654978">"Додаток"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Усі додатки"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Сповіщення"</string>
diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml
index e68e43e..3d90187 100644
--- a/res/values-ur/strings.xml
+++ b/res/values-ur/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"ایپس تلاش کریں"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"ایپس لوڈ کی جا رہی ہیں…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"\"<xliff:g id="QUERY">%1$s</xliff:g>\" سے مماثل کوئی ایپس نہیں ملیں"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"مزید ایپس تلاش کریں"</string>
     <string name="label_application" msgid="8531721983832654978">"ایپ"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"سبھی ایپس"</string>
     <string name="notifications_header" msgid="1404149926117359025">"اطلاعات"</string>
diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml
index 9c7ed56..04d07ec 100644
--- a/res/values-uz/strings.xml
+++ b/res/values-uz/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Ilovalarni qidirish"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Ilovalar yuklanmoqda…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"“<xliff:g id="QUERY">%1$s</xliff:g>” bilan mos hech qanday ilova topilmadi"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Boshqa ilovalarni qidirish"</string>
     <string name="label_application" msgid="8531721983832654978">"Ilova"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Barcha ilovalar"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Bildirishnomalar"</string>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 30167fa..2329992 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Tìm kiếm ứng dụng"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Đang tải ứng dụng…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"Không tìm thấy ứng dụng nào phù hợp với \"<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Tìm kiếm thêm ứng dụng"</string>
     <string name="label_application" msgid="8531721983832654978">"Ứng dụng"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Tất cả ứng dụng"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Thông báo"</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 141d165..929cffa 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"搜索应用"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"正在加载应用…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"未找到与“<xliff:g id="QUERY">%1$s</xliff:g>”相符的应用"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"搜索更多应用"</string>
     <string name="label_application" msgid="8531721983832654978">"应用"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"所有应用"</string>
     <string name="notifications_header" msgid="1404149926117359025">"通知"</string>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index 2ff233b..1aea757 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"搜尋應用程式"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"正在載入應用程式…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"找不到與「<xliff:g id="QUERY">%1$s</xliff:g>」相符的應用程式"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"搜尋更多應用程式"</string>
     <string name="label_application" msgid="8531721983832654978">"應用程式"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"所有應用程式"</string>
     <string name="notifications_header" msgid="1404149926117359025">"通知"</string>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 91cfd82..25a7d21 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"搜尋應用程式"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"正在載入應用程式…"</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"找不到與「<xliff:g id="QUERY">%1$s</xliff:g>」相符的應用程式"</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"搜尋更多應用程式"</string>
     <string name="label_application" msgid="8531721983832654978">"應用程式"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"所有應用程式"</string>
     <string name="notifications_header" msgid="1404149926117359025">"通知"</string>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 12e8568..151ce27 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -59,7 +59,6 @@
     <string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Sesha izinhlelo zokusebenza"</string>
     <string name="all_apps_loading_message" msgid="5813968043155271636">"Ilayisha izinhlelo zokusebenza..."</string>
     <string name="all_apps_no_search_results" msgid="3200346862396363786">"Azikho izinhlelo zokusebenza ezitholiwe ezifana ne-\"<xliff:g id="QUERY">%1$s</xliff:g>\""</string>
-    <string name="all_apps_search_market_message" msgid="1366263386197059176">"Sesha izinhlelo zokusebenza eziningi"</string>
     <string name="label_application" msgid="8531721983832654978">"Uhlelo lokusebenza"</string>
     <string name="all_apps_label" msgid="5015784846527570951">"Zonke izinhlelo zokusebenza"</string>
     <string name="notifications_header" msgid="1404149926117359025">"Izaziso"</string>
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index 3b71585..28d094b 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -158,9 +158,6 @@
 
         <!-- numHotseatIcons defaults to numColumns, if not specified -->
         <attr name="numHotseatIcons" format="integer" />
-        <!-- Number of icons to use when shrinking the hotseat size,
-         defaults to numHotseatIcons / 2 -->
-        <attr name="numShrunkenHotseatIcons" format="integer" />
         <!-- Number of icons to use when extending the hotseat size,
          defaults to 2 * numHotseatIcons -->
         <attr name="numExtendedHotseatIcons" format="integer" />
@@ -328,15 +325,6 @@
         if not specified -->
         <attr name="allAppsBorderSpaceTwoPanelLandscapeVertical" format="float" />
 
-        <!-- defaults to borderSpaceDps, if not specified -->
-        <attr name="hotseatBorderSpace" format="float" />
-        <!-- defaults to hotseatBorderSpace, if not specified -->
-        <attr name="hotseatBorderSpaceLandscape" format="float" />
-        <!-- defaults to hotseatBorderSpace, if not specified -->
-        <attr name="hotseatBorderSpaceTwoPanelLandscape" format="float" />
-        <!-- defaults to hotseatBorderSpace, if not specified -->
-        <attr name="hotseatBorderSpaceTwoPanelPortrait" format="float" />
-
         <!-- defaults to res.hotseat_bar_bottom_space_default, if not specified -->
         <attr name="hotseatBarBottomSpace" format="float" />
         <!-- defaults to hotseatBarBottomSpace, if not specified -->
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index b19e739..546ee35 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -108,9 +108,6 @@
     <dimen name="all_apps_search_bar_content_overlap">24dp</dimen>
     <dimen name="all_apps_search_bar_bottom_padding">30dp</dimen>
     <dimen name="all_apps_empty_search_message_top_offset">40dp</dimen>
-    <dimen name="all_apps_empty_search_bg_top_offset">144dp</dimen>
-    <dimen name="all_apps_background_canvas_width">700dp</dimen>
-    <dimen name="all_apps_background_canvas_height">475dp</dimen>
     <dimen name="all_apps_header_pill_height">48dp</dimen>
     <dimen name="all_apps_header_pill_corner_radius">12dp</dimen>
     <dimen name="all_apps_header_tab_height">48dp</dimen>
@@ -357,6 +354,8 @@
     <dimen name="taskbar_stashed_size">0dp</dimen>
     <dimen name="qsb_widget_height">0dp</dimen>
     <dimen name="qsb_shadow_height">0dp</dimen>
+    <dimen name="min_hotseat_icon_space">18dp</dimen>
+    <dimen name="min_hotseat_qsb_width">0dp</dimen>
     <dimen name="taskbar_icon_size">44dp</dimen>
     <!-- Note that this applies to both sides of all icons, so visible space is double this. -->
     <dimen name="taskbar_icon_spacing">8dp</dimen>
@@ -381,7 +380,6 @@
     <dimen name="task_thumbnail_icon_drawable_size">0dp</dimen>
     <dimen name="task_thumbnail_icon_drawable_size_grid">0dp</dimen>
     <dimen name="overview_task_margin">0dp</dimen>
-    <dimen name="overview_task_margin_grid">0dp</dimen>
     <dimen name="overview_actions_height">0dp</dimen>
     <dimen name="overview_actions_button_spacing">0dp</dimen>
     <dimen name="overview_actions_margin_gesture">0dp</dimen>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 2addf50..3eb08ba 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -128,8 +128,6 @@
     <string name="all_apps_loading_message">Loading apps&#8230;</string>
     <!-- No-search-results text. [CHAR_LIMIT=50] -->
     <string name="all_apps_no_search_results">No apps found matching \"<xliff:g id="query" example="Android">%1$s</xliff:g>\"</string>
-    <!-- Label for the button which allows the user to get app search results. [CHAR_LIMIT=50] -->
-    <string name="all_apps_search_market_message">Search for more apps</string>
     <!-- Label for an icon representing any generic app. [CHAR_LIMIT=50] -->
     <string name="label_application">App</string>
     <!-- Label for the header text of the All Apps section in All Apps view, used to separate Predicted Apps and Actions section from All Apps section. [CHAR_LIMIT=50] -->
diff --git a/res/values/styles.xml b/res/values/styles.xml
index a8cbf08..90553a1 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -292,17 +292,6 @@
 
     <style name="TextTitle" parent="@android:style/TextAppearance.DeviceDefault" />
 
-    <style name="AllAppsEmptySearchBackground">
-        <item name="android:colorPrimary">#E0E0E0</item>
-        <item name="android:colorControlHighlight">#19BDBDBD</item>
-        <item name="android:colorForeground">@color/all_apps_bg_hand_fill</item>
-    </style>
-    <style name="AllAppsEmptySearchBackground.Dark">
-        <item name="android:colorPrimary">#9AA0A6</item>
-        <item name="android:colorControlHighlight">#19DFE1E5</item>
-        <item name="android:colorForeground">@color/all_apps_bg_hand_fill_dark</item>
-    </style>
-
     <style name="Button.TopRounded.Bordered" parent="@android:style/Widget.Material.Button">
         <item name="android:background">@drawable/button_top_rounded_bordered_ripple</item>
         <item name="android:stateListAnimator">@null</item>
diff --git a/res/xml/device_profiles.xml b/res/xml/device_profiles.xml
index 0238e7d..407f217 100644
--- a/res/xml/device_profiles.xml
+++ b/res/xml/device_profiles.xml
@@ -200,8 +200,6 @@
             launcher:allAppsBorderSpaceHorizontal="8"
             launcher:allAppsBorderSpaceVertical="16"
             launcher:allAppsBorderSpaceLandscape="16"
-            launcher:hotseatBorderSpace="58"
-            launcher:hotseatBorderSpaceLandscape="50.4"
             launcher:hotseatBarBottomSpace="76"
             launcher:hotseatBarBottomSpaceLandscape="40"
             launcher:canBeDefault="true" />
diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java
index 52960a9..9f3e1fa 100644
--- a/src/com/android/launcher3/CellLayout.java
+++ b/src/com/android/launcher3/CellLayout.java
@@ -496,8 +496,8 @@
 
                     // Draw reorder drag target.
                     debugPaint.setColor(Color.RED);
-                    canvas.drawCircle(cellCenter[0], cellCenter[1], getReorderRadius(targetCell),
-                            debugPaint);
+                    canvas.drawCircle(cellCenter[0], cellCenter[1],
+                            getReorderRadius(targetCell, 1, 1), debugPaint);
 
                     // Draw folder creation drag target.
                     if (canCreateFolder) {
@@ -912,18 +912,18 @@
         DeviceProfile grid = mActivity.getDeviceProfile();
         float iconVisibleRadius = ICON_VISIBLE_AREA_FACTOR * grid.iconSizePx / 2;
         // Halfway between reorder radius and icon.
-        return (getReorderRadius(targetCell) + iconVisibleRadius) / 2;
+        return (getReorderRadius(targetCell, 1, 1) + iconVisibleRadius) / 2;
     }
 
     /**
      * Returns the max distance from the center of a cell that will start to reorder on drag over.
      */
-    public float getReorderRadius(int[] targetCell) {
+    public float getReorderRadius(int[] targetCell, int spanX, int spanY) {
         int[] centerPoint = mTmpPoint;
         getWorkspaceCellVisualCenter(targetCell[0], targetCell[1], centerPoint);
 
         Rect cellBoundsWithSpacing = mTempRect;
-        cellToRect(targetCell[0], targetCell[1], 1, 1, cellBoundsWithSpacing);
+        cellToRect(targetCell[0], targetCell[1], spanX, spanY, cellBoundsWithSpacing);
         cellBoundsWithSpacing.inset(-mBorderSpace.x / 2, -mBorderSpace.y / 2);
 
         if (canCreateFolder(getChildAt(targetCell[0], targetCell[1]))) {
diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java
index 3a2227a..f27eb79 100644
--- a/src/com/android/launcher3/DeviceProfile.java
+++ b/src/com/android/launcher3/DeviceProfile.java
@@ -20,26 +20,28 @@
 import static com.android.launcher3.InvariantDeviceProfile.INDEX_LANDSCAPE;
 import static com.android.launcher3.InvariantDeviceProfile.INDEX_TWO_PANEL_LANDSCAPE;
 import static com.android.launcher3.InvariantDeviceProfile.INDEX_TWO_PANEL_PORTRAIT;
-import static com.android.launcher3.ResourceUtils.pxFromDp;
 import static com.android.launcher3.Utilities.dpiFromPx;
 import static com.android.launcher3.Utilities.pxFromSp;
 import static com.android.launcher3.folder.ClippedFolderIconLayoutRule.ICON_OVERLAP_FACTOR;
+import static com.android.launcher3.icons.GraphicsUtils.getShapePath;
+import static com.android.launcher3.testing.shared.ResourceUtils.pxFromDp;
 
 import android.annotation.SuppressLint;
 import android.content.Context;
 import android.content.res.Configuration;
 import android.content.res.Resources;
-import android.graphics.Path;
 import android.graphics.Point;
 import android.graphics.PointF;
 import android.graphics.Rect;
 import android.util.DisplayMetrics;
+import android.util.SparseArray;
 import android.view.Surface;
 
+import androidx.annotation.NonNull;
+
 import com.android.launcher3.CellLayout.ContainerType;
 import com.android.launcher3.DevicePaddings.DevicePadding;
 import com.android.launcher3.icons.DotRenderer;
-import com.android.launcher3.icons.GraphicsUtils;
 import com.android.launcher3.icons.IconNormalizer;
 import com.android.launcher3.uioverrides.ApiWrapper;
 import com.android.launcher3.util.DisplayController;
@@ -53,6 +55,8 @@
 public class DeviceProfile {
 
     private static final int DEFAULT_DOT_SIZE = 100;
+    private static final float ALL_APPS_TABLET_MAX_ROWS = 5.5f;
+
     // Ratio of empty space, qsb should take up to appear visually centered.
     private final float mQsbCenterFactor;
 
@@ -108,8 +112,6 @@
 
     public final int edgeMarginPx;
     public final float workspaceContentScale;
-    private float mWorkspaceSpringLoadShrunkTop;
-    private float mWorkspaceSpringLoadShrunkBottom;
     public final int workspaceSpringLoadedMinNextPageVisiblePx;
 
     private final int extraSpace;
@@ -156,7 +158,7 @@
     public int folderChildDrawablePaddingPx;
 
     // Hotseat
-    public final int numShownHotseatIcons;
+    public int numShownHotseatIcons;
     public int hotseatCellHeightPx;
     public final boolean areNavButtonsInline;
     // In portrait: size = height, in landscape: size = width
@@ -168,13 +170,12 @@
     // Start is the side next to the nav bar, end is the side next to the workspace
     public final int hotseatBarSidePaddingStartPx;
     public final int hotseatBarSidePaddingEndPx;
+    public int hotseatQsbWidth; // only used when isQsbInline
     public final int hotseatQsbHeight;
     public final int hotseatQsbVisualHeight;
     private final int hotseatQsbShadowHeight;
     public int hotseatBorderSpace;
 
-    public int qsbWidth; // only used when isQsbInline
-
     // All apps
     public Point allAppsBorderSpacePx;
     public int allAppsShiftRange;
@@ -191,7 +192,6 @@
 
     // Overview
     public int overviewTaskMarginPx;
-    public int overviewTaskMarginGridPx;
     public int overviewTaskIconSizePx;
     public int overviewTaskIconDrawableSizePx;
     public int overviewTaskIconDrawableSizeGridPx;
@@ -220,13 +220,12 @@
     // Insets
     private final Rect mInsets = new Rect();
     public final Rect workspacePadding = new Rect();
-    private final Rect mHotseatBarPadding = new Rect();
     // When true, nav bar is on the left side of the screen.
     private boolean mIsSeascape;
 
     // Notification dots
-    public DotRenderer mDotRendererWorkSpace;
-    public DotRenderer mDotRendererAllApps;
+    public final DotRenderer mDotRendererWorkSpace;
+    public final DotRenderer mDotRendererAllApps;
 
     // Taskbar
     public boolean isTaskbarPresent;
@@ -240,8 +239,8 @@
 
     /** TODO: Once we fully migrate to staged split, remove "isMultiWindowMode" */
     DeviceProfile(Context context, InvariantDeviceProfile inv, Info info, WindowBounds windowBounds,
-            boolean isMultiWindowMode, boolean transposeLayoutWithOrientation,
-            boolean useTwoPanels, boolean isGestureMode) {
+            SparseArray<DotRenderer> dotRendererCache, boolean isMultiWindowMode,
+            boolean transposeLayoutWithOrientation, boolean useTwoPanels, boolean isGestureMode) {
 
         this.inv = inv;
         this.isLandscape = windowBounds.isLandscape();
@@ -312,10 +311,6 @@
                 + res.getDimensionPixelSize(R.dimen.bottom_sheet_extra_top_padding)
                 + (isTablet ? 0 : edgeMarginPx); // phones need edgeMarginPx additional padding
 
-        allAppsTopPadding = isTablet ? bottomSheetTopPadding : 0;
-        allAppsShiftRange = isTablet
-                ? heightPx - allAppsTopPadding
-                : res.getDimensionPixelSize(R.dimen.all_apps_starting_vertical_translate);
         folderLabelTextScale = res.getFloat(R.dimen.folder_label_text_scale);
         folderContentPaddingLeftRight =
                 res.getDimensionPixelSize(R.dimen.folder_content_padding_left_right);
@@ -367,15 +362,9 @@
                 && hotseatQsbHeight > 0;
         isQsbInline = inv.inlineQsb[mTypeIndex] && canQsbInline;
 
-        // We shrink hotseat sizes regardless of orientation, if nav buttons are inline and QSB
-        // might be inline in either orientations, to keep hotseat size consistent across rotation.
         areNavButtonsInline = isTaskbarPresent && !isGestureMode;
-        if (areNavButtonsInline && canQsbInline) {
-            numShownHotseatIcons = inv.numShrunkenHotseatIcons;
-        } else {
-            numShownHotseatIcons =
-                    isTwoPanels ? inv.numDatabaseHotseatIcons : inv.numShownHotseatIcons;
-        }
+        numShownHotseatIcons =
+                isTwoPanels ? inv.numDatabaseHotseatIcons : inv.numShownHotseatIcons;
 
         numShownAllAppsColumns =
                 isTwoPanels ? inv.numDatabaseAllAppsColumns : inv.numAllAppsColumns;
@@ -426,25 +415,18 @@
         }
 
         overviewTaskMarginPx = res.getDimensionPixelSize(R.dimen.overview_task_margin);
-        overviewTaskMarginGridPx = res.getDimensionPixelSize(R.dimen.overview_task_margin_grid);
         overviewTaskIconSizePx = res.getDimensionPixelSize(R.dimen.task_thumbnail_icon_size);
         overviewTaskIconDrawableSizePx =
                 res.getDimensionPixelSize(R.dimen.task_thumbnail_icon_drawable_size);
         overviewTaskIconDrawableSizeGridPx =
                 res.getDimensionPixelSize(R.dimen.task_thumbnail_icon_drawable_size_grid);
-        overviewTaskThumbnailTopMarginPx = overviewTaskIconSizePx + overviewTaskMarginPx * 2;
+        overviewTaskThumbnailTopMarginPx = overviewTaskIconSizePx + overviewTaskMarginPx;
         overviewActionsTopMarginPx = res.getDimensionPixelSize(R.dimen.overview_actions_top_margin);
         overviewPageSpacing = res.getDimensionPixelSize(R.dimen.overview_page_spacing);
         overviewActionsButtonSpacing = res.getDimensionPixelSize(
                 R.dimen.overview_actions_button_spacing);
         overviewActionsHeight = res.getDimensionPixelSize(R.dimen.overview_actions_height);
-        // Grid task's top margin is only overviewTaskIconSizePx + overviewTaskMarginGridPx, but
-        // overviewTaskThumbnailTopMarginPx is applied to all TaskThumbnailView, so exclude the
-        // extra  margin when calculating row spacing.
-        int extraTopMargin = overviewTaskThumbnailTopMarginPx - overviewTaskIconSizePx
-                - overviewTaskMarginGridPx;
-        overviewRowSpacing = res.getDimensionPixelSize(R.dimen.overview_grid_row_spacing)
-                - extraTopMargin;
+        overviewRowSpacing = res.getDimensionPixelSize(R.dimen.overview_grid_row_spacing);
         overviewGridSideMargin = res.getDimensionPixelSize(R.dimen.overview_grid_side_margin);
 
         // Calculate all of the remaining variables.
@@ -472,24 +454,45 @@
         updateWorkspacePadding();
 
         // Hotseat and QSB width depends on updated cellSize and workspace padding
-        hotseatBorderSpace = calculateHotseatBorderSpace();
-        qsbWidth = calculateQsbWidth();
+        recalculateHotseatWidthAndBorderSpace(res);
+
+        // AllApps height calculation depends on updated cellSize
+        if (isTablet) {
+            int collapseHandleHeight =
+                    res.getDimensionPixelOffset(R.dimen.bottom_sheet_handle_area_height);
+            int contentHeight = heightPx - collapseHandleHeight - hotseatQsbHeight;
+            int targetContentHeight = (int) (allAppsCellHeightPx * ALL_APPS_TABLET_MAX_ROWS);
+            allAppsTopPadding = Math.max(mInsets.top, contentHeight - targetContentHeight);
+            allAppsShiftRange = heightPx - allAppsTopPadding;
+        } else {
+            allAppsTopPadding = 0;
+            allAppsShiftRange =
+                    res.getDimensionPixelSize(R.dimen.all_apps_starting_vertical_translate);
+        }
 
         flingToDeleteThresholdVelocity = res.getDimensionPixelSize(
                 R.dimen.drag_flingToDeleteMinVelocity);
 
         // This is done last, after iconSizePx is calculated above.
-        Path dotPath = GraphicsUtils.getShapePath(DEFAULT_DOT_SIZE);
-        mDotRendererWorkSpace = new DotRenderer(iconSizePx, dotPath, DEFAULT_DOT_SIZE);
-        mDotRendererAllApps = iconSizePx == allAppsIconSizePx ? mDotRendererWorkSpace :
-                new DotRenderer(allAppsIconSizePx, dotPath, DEFAULT_DOT_SIZE);
+        mDotRendererWorkSpace = createDotRenderer(iconSizePx, dotRendererCache);
+        mDotRendererAllApps = createDotRenderer(allAppsIconSizePx, dotRendererCache);
+    }
+
+    private static DotRenderer createDotRenderer(
+            int size, @NonNull SparseArray<DotRenderer> cache) {
+        DotRenderer renderer = cache.get(size);
+        if (renderer == null) {
+            renderer = new DotRenderer(size, getShapePath(DEFAULT_DOT_SIZE), DEFAULT_DOT_SIZE);
+            cache.put(size, renderer);
+        }
+        return renderer;
     }
 
     /**
      * QSB width is always calculated because when in 3 button nav the width doesn't follow the
      * width of the hotseat.
      */
-    private int calculateQsbWidth() {
+    private int calculateQsbWidth(int hotseatBorderSpace) {
         if (isQsbInline) {
             int columns = getPanelCount() * inv.numColumns;
             return getIconToIconWidthForColumns(columns)
@@ -536,6 +539,70 @@
         }
     }
 
+    private void recalculateHotseatWidthAndBorderSpace(Resources res) {
+        hotseatBorderSpace = calculateHotseatBorderSpace();
+        hotseatQsbWidth = calculateQsbWidth(hotseatBorderSpace);
+        // Spaces should be correct when there nav buttons are not inline
+        if (!areNavButtonsInline) {
+            return;
+        }
+
+        // Get the maximum width that the hotseat can be
+        int columns = getPanelCount() * inv.numColumns;
+        int maxHotseatWidth = getIconToIconWidthForColumns(columns);
+        int sideSpace = (availableWidthPx - maxHotseatWidth) / 2;
+        int inlineButtonsOverlap = Math.max(0, hotseatBarEndOffset - sideSpace);
+        // decrease how much the nav buttons go "inside" the hotseat
+        maxHotseatWidth -= inlineButtonsOverlap;
+
+        // Get how much space is required to show the hotseat with QSB
+        int requiredWidth = getHotseatRequiredWidth();
+
+        // If spaces are fine, use them
+        if (requiredWidth <= maxHotseatWidth) {
+            return;
+        }
+
+        // Calculate the difference of widths and remove a little from each space between icons
+        // and QSB if it's inline
+        int spaceDiff = requiredWidth - maxHotseatWidth;
+        int numOfSpaces = numShownHotseatIcons - (isQsbInline ? 0 : 1);
+        hotseatBorderSpace -= (spaceDiff / numOfSpaces);
+
+        int minHotseatIconSpaceDp = res.getDimensionPixelSize(R.dimen.min_hotseat_icon_space);
+        int minHotseatQsbWidthDp = res.getDimensionPixelSize(R.dimen.min_hotseat_qsb_width);
+
+        if (hotseatBorderSpace >= minHotseatIconSpaceDp) {
+            return;
+        }
+
+        // Border space can't be less than the minimum
+        hotseatBorderSpace = minHotseatIconSpaceDp;
+        requiredWidth = getHotseatRequiredWidth();
+
+        // If there is an inline qsb, change its size
+        if (isQsbInline) {
+            hotseatQsbWidth -= requiredWidth - maxHotseatWidth;
+            if (hotseatQsbWidth >= minHotseatQsbWidthDp) {
+                return;
+            }
+
+            // QSB can't be less than the minimum
+            hotseatQsbWidth = minHotseatQsbWidthDp;
+        }
+
+        // If it still doesn't fit, start removing icons
+        do {
+            numShownHotseatIcons--;
+            requiredWidth = getHotseatRequiredWidth();
+        } while (requiredWidth > maxHotseatWidth && numShownHotseatIcons > 1);
+
+        // Add back some space between the icons
+        spaceDiff = maxHotseatWidth - requiredWidth;
+        numOfSpaces = numShownHotseatIcons - (isQsbInline ? 0 : 1);
+        hotseatBorderSpace += (spaceDiff / numOfSpaces);
+    }
+
     private Point getCellLayoutBorderSpace(InvariantDeviceProfile idp) {
         return getCellLayoutBorderSpace(idp, 1f);
     }
@@ -576,10 +643,16 @@
                 widthPx, heightPx, availableWidthPx, availableHeightPx, rotationHint);
         bounds.bounds.offsetTo(windowX, windowY);
         bounds.insets.set(mInsets);
+
+        SparseArray<DotRenderer> dotRendererCache = new SparseArray<>();
+        dotRendererCache.put(iconSizePx, mDotRendererWorkSpace);
+        dotRendererCache.put(allAppsIconSizePx, mDotRendererAllApps);
+
         return new Builder(context, inv, mInfo)
                 .setWindowBounds(bounds)
                 .setUseTwoPanels(isTwoPanels)
                 .setMultiWindowMode(isMultiWindowMode)
+                .setDotRendererCache(dotRendererCache)
                 .setGestureMode(isGestureMode);
     }
 
@@ -762,15 +835,10 @@
      */
     private int calculateHotseatBorderSpace() {
         if (!isScalableGrid) return 0;
-        //TODO(http://b/228998082) remove this when 3 button spaces are fixed
-        if (areNavButtonsInline) {
-            return pxFromDp(inv.hotseatBorderSpaces[mTypeIndex], mMetrics);
-        } else {
-            int columns = inv.hotseatColumnSpan[mTypeIndex];
-            float hotseatWidthPx = getIconToIconWidthForColumns(columns);
-            float hotseatIconsTotalPx = iconSizePx * numShownHotseatIcons;
-            return (int) (hotseatWidthPx - hotseatIconsTotalPx) / (numShownHotseatIcons - 1);
-        }
+        int columns = inv.hotseatColumnSpan[mTypeIndex];
+        float hotseatWidthPx = getIconToIconWidthForColumns(columns);
+        float hotseatIconsTotalPx = iconSizePx * numShownHotseatIcons;
+        return (int) (hotseatWidthPx - hotseatIconsTotalPx) / (numShownHotseatIcons - 1);
     }
 
 
@@ -918,40 +986,39 @@
      * Gets the space in px from the bottom of last item in the vertical-bar hotseat to the
      * bottom of the screen.
      */
-    private int getVerticalHotseatLastItemBottomOffset() {
+    private int getVerticalHotseatLastItemBottomOffset(Context context) {
+        Rect hotseatBarPadding = getHotseatLayoutPadding(context);
         int cellHeight = calculateCellHeight(
-                heightPx - mHotseatBarPadding.top - mHotseatBarPadding.bottom, hotseatBorderSpace,
+                heightPx - hotseatBarPadding.top - hotseatBarPadding.bottom, hotseatBorderSpace,
                 numShownHotseatIcons);
         int extraIconEndSpacing = (cellHeight - iconSizePx) / 2;
-        return extraIconEndSpacing + mHotseatBarPadding.bottom;
+        return extraIconEndSpacing + hotseatBarPadding.bottom;
     }
 
     /**
      * Gets the scaled top of the workspace in px for the spring-loaded edit state.
      */
     public float getCellLayoutSpringLoadShrunkTop() {
-        mWorkspaceSpringLoadShrunkTop = mInsets.top + dropTargetBarTopMarginPx + dropTargetBarSizePx
+        return mInsets.top + dropTargetBarTopMarginPx + dropTargetBarSizePx
                 + dropTargetBarBottomMarginPx;
-        return mWorkspaceSpringLoadShrunkTop;
     }
 
     /**
      * Gets the scaled bottom of the workspace in px for the spring-loaded edit state.
      */
-    public float getCellLayoutSpringLoadShrunkBottom() {
+    public float getCellLayoutSpringLoadShrunkBottom(Context context) {
         int topOfHotseat = hotseatBarSizePx + springLoadedHotseatBarTopMarginPx;
-        mWorkspaceSpringLoadShrunkBottom =
-                heightPx - (isVerticalBarLayout() ? getVerticalHotseatLastItemBottomOffset()
-                        : topOfHotseat);
-        return mWorkspaceSpringLoadShrunkBottom;
+        return heightPx - (isVerticalBarLayout()
+                ? getVerticalHotseatLastItemBottomOffset(context) : topOfHotseat);
     }
 
     /**
      * Gets the scale of the workspace for the spring-loaded edit state.
      */
-    public float getWorkspaceSpringLoadScale() {
-        float scale = (getCellLayoutSpringLoadShrunkBottom() - getCellLayoutSpringLoadShrunkTop())
-                / getCellLayoutHeight();
+    public float getWorkspaceSpringLoadScale(Context context) {
+        float scale =
+                (getCellLayoutSpringLoadShrunkBottom(context) - getCellLayoutSpringLoadShrunkTop())
+                        / getCellLayoutHeight();
         scale = Math.min(scale, 1f);
 
         // Reduce scale if next pages would not be visible after scaling the workspace
@@ -1036,6 +1103,7 @@
      * Returns the padding for hotseat view
      */
     public Rect getHotseatLayoutPadding(Context context) {
+        Rect hotseatBarPadding = new Rect();
         if (isVerticalBarLayout()) {
             // The hotseat icons will be placed in the middle of the hotseat cells.
             // Changing the hotseatCellHeightPx is not affecting hotseat icon positions
@@ -1049,10 +1117,10 @@
                     + diffOverlapFactor), 0);
 
             if (isSeascape()) {
-                mHotseatBarPadding.set(mInsets.left + hotseatBarSidePaddingStartPx, paddingTop,
+                hotseatBarPadding.set(mInsets.left + hotseatBarSidePaddingStartPx, paddingTop,
                         hotseatBarSidePaddingEndPx, paddingBottom);
             } else {
-                mHotseatBarPadding.set(hotseatBarSidePaddingEndPx, paddingTop,
+                hotseatBarPadding.set(hotseatBarSidePaddingEndPx, paddingTop,
                         mInsets.right + hotseatBarSidePaddingStartPx, paddingBottom);
             }
         } else if (isTaskbarPresent) {
@@ -1062,33 +1130,30 @@
                     hotseatBarSizePx - hotseatBarBottomPadding - hotseatCellHeightPx;
 
             // Push icons to the side
-            int additionalQsbSpace = isQsbInline ? qsbWidth + hotseatBorderSpace : 0;
-            int requiredWidth = iconSizePx * numShownHotseatIcons
-                    + hotseatBorderSpace * (numShownHotseatIcons - 1)
-                    + additionalQsbSpace;
+            int requiredWidth = getHotseatRequiredWidth();
             int hotseatWidth = Math.min(requiredWidth, availableWidthPx - hotseatBarEndOffset);
             int sideSpacing = (availableWidthPx - hotseatWidth) / 2;
 
-            mHotseatBarPadding.set(sideSpacing, hotseatBarTopPadding, sideSpacing,
+            hotseatBarPadding.set(sideSpacing, hotseatBarTopPadding, sideSpacing,
                     hotseatBarBottomPadding);
 
             boolean isRtl = Utilities.isRtl(context.getResources());
             if (isRtl) {
-                mHotseatBarPadding.right += additionalQsbSpace;
+                hotseatBarPadding.right += getAdditionalQsbSpace();
             } else {
-                mHotseatBarPadding.left += additionalQsbSpace;
+                hotseatBarPadding.left += getAdditionalQsbSpace();
             }
 
             if (hotseatBarEndOffset > sideSpacing) {
                 int diff = isRtl
                         ? sideSpacing - hotseatBarEndOffset
                         : hotseatBarEndOffset - sideSpacing;
-                mHotseatBarPadding.left -= diff;
-                mHotseatBarPadding.right += diff;
+                hotseatBarPadding.left -= diff;
+                hotseatBarPadding.right += diff;
             }
         } else if (isScalableGrid) {
-            int sideSpacing = (availableWidthPx - qsbWidth) / 2;
-            mHotseatBarPadding.set(sideSpacing,
+            int sideSpacing = (availableWidthPx - hotseatQsbWidth) / 2;
+            hotseatBarPadding.set(sideSpacing,
                     0,
                     sideSpacing,
                     getHotseatBarBottomPadding());
@@ -1100,7 +1165,7 @@
             float workspaceCellWidth = (float) widthPx / inv.numColumns;
             float hotseatCellWidth = (float) widthPx / numShownHotseatIcons;
             int hotseatAdjustment = Math.round((workspaceCellWidth - hotseatCellWidth) / 2);
-            mHotseatBarPadding.set(
+            hotseatBarPadding.set(
                     hotseatAdjustment + workspacePadding.left + cellLayoutPaddingPx.left
                             + mInsets.left,
                     0,
@@ -1108,7 +1173,21 @@
                             + mInsets.right,
                     getHotseatBarBottomPadding());
         }
-        return mHotseatBarPadding;
+        return hotseatBarPadding;
+    }
+
+    private int getAdditionalQsbSpace() {
+        return isQsbInline ? hotseatQsbWidth + hotseatBorderSpace : 0;
+    }
+
+    /**
+     * Calculate how much space the hotseat needs to be shown completely
+     */
+    private int getHotseatRequiredWidth() {
+        int additionalQsbSpace = getAdditionalQsbSpace();
+        return iconSizePx * numShownHotseatIcons
+                + hotseatBorderSpace * (numShownHotseatIcons - 1)
+                + additionalQsbSpace;
     }
 
     /**
@@ -1246,8 +1325,8 @@
         return "\t" + name + ": " + value + "px (" + dpiFromPx(value, mMetrics.densityDpi) + "dp)";
     }
 
-    // LINT.IfChange
-    public void dump(String prefix, PrintWriter writer) {
+    /** Dumps various DeviceProfile variables to the specified writer. */
+    public void dump(Context context, String prefix, PrintWriter writer) {
         writer.println(prefix + "DeviceProfile:");
         writer.println(prefix + "\t1 dp = " + mMetrics.density + " px");
 
@@ -1293,9 +1372,12 @@
                 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));
 
@@ -1345,14 +1427,19 @@
         writer.println(prefix + pxToDpStr("hotseatQsbHeight", hotseatQsbHeight));
         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));
+        Rect hotseatLayoutPadding = getHotseatLayoutPadding(context);
+        writer.println(prefix + pxToDpStr("getHotseatLayoutPadding(context).top",
+                hotseatLayoutPadding.top));
+        writer.println(prefix + pxToDpStr("getHotseatLayoutPadding(context).bottom",
+                hotseatLayoutPadding.bottom));
+        writer.println(prefix + pxToDpStr("getHotseatLayoutPadding(context).left",
+                hotseatLayoutPadding.left));
+        writer.println(prefix + pxToDpStr("getHotseatLayoutPadding(context).right",
+                hotseatLayoutPadding.right));
         writer.println(prefix + "\tnumShownHotseatIcons: " + numShownHotseatIcons);
         writer.println(prefix + pxToDpStr("hotseatBorderSpace", hotseatBorderSpace));
         writer.println(prefix + "\tisQsbInline: " + isQsbInline);
-        writer.println(prefix + pxToDpStr("qsbWidth", qsbWidth));
+        writer.println(prefix + pxToDpStr("hotseatQsbWidth", hotseatQsbWidth));
 
         writer.println(prefix + "\tisTaskbarPresent:" + isTaskbarPresent);
         writer.println(prefix + "\tisTaskbarPresentInApps:" + isTaskbarPresentInApps);
@@ -1379,7 +1466,6 @@
         writer.println(prefix + pxToDpStr("workspaceBottomPadding", workspaceBottomPadding));
 
         writer.println(prefix + pxToDpStr("overviewTaskMarginPx", overviewTaskMarginPx));
-        writer.println(prefix + pxToDpStr("overviewTaskMarginGridPx", overviewTaskMarginGridPx));
         writer.println(prefix + pxToDpStr("overviewTaskIconSizePx", overviewTaskIconSizePx));
         writer.println(prefix + pxToDpStr("overviewTaskIconDrawableSizePx",
                 overviewTaskIconDrawableSizePx));
@@ -1402,30 +1488,17 @@
         writer.println(
                 prefix + pxToDpStr("dropTargetBarBottomMarginPx", dropTargetBarBottomMarginPx));
 
-        writer.println(
-                prefix + pxToDpStr("workspaceSpringLoadShrunkTop", mWorkspaceSpringLoadShrunkTop));
-        writer.println(prefix + pxToDpStr("workspaceSpringLoadShrunkBottom",
-                mWorkspaceSpringLoadShrunkBottom));
+        writer.println(prefix + pxToDpStr("getCellLayoutSpringLoadShrunkTop()",
+                getCellLayoutSpringLoadShrunkTop()));
+        writer.println(prefix + pxToDpStr("getCellLayoutSpringLoadShrunkBottom()",
+                getCellLayoutSpringLoadShrunkBottom(context)));
         writer.println(prefix + pxToDpStr("workspaceSpringLoadedMinNextPageVisiblePx",
                 workspaceSpringLoadedMinNextPageVisiblePx));
-        writer.println(
-                prefix + pxToDpStr("getWorkspaceSpringLoadScale()", getWorkspaceSpringLoadScale()));
+        writer.println(prefix + pxToDpStr("getWorkspaceSpringLoadScale()",
+                getWorkspaceSpringLoadScale(context)));
         writer.println(prefix + pxToDpStr("getCellLayoutHeight()", getCellLayoutHeight()));
         writer.println(prefix + pxToDpStr("getCellLayoutWidth()", getCellLayoutWidth()));
     }
-    // LINT.ThenChange(
-    //     packages/apps/Launcher3/quickstep/tests/src/com/android/quickstep/DeviceProfilePhoneTest.kt,
-    //     packages/apps/Launcher3/quickstep/tests/src/com/android/quickstep/DeviceProfileVerticalBarTest.kt,
-    //     packages/apps/Launcher3/quickstep/tests/src/com/android/quickstep/DeviceProfilePhone3ButtonTest.kt,
-    //     packages/apps/Launcher3/quickstep/tests/src/com/android/quickstep/DeviceProfileVerticalBar3ButtonTest.kt,
-    //     packages/apps/Launcher3/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletLandscapeTest.kt,
-    //     packages/apps/Launcher3/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletPortraitTest.kt,
-    //     packages/apps/Launcher3/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletLandscape3ButtonTest.kt,
-    //     packages/apps/Launcher3/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletPortrait3ButtonTest.kt,
-    //     packages/apps/Launcher3/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelLandscapeTest.kt,
-    //     packages/apps/Launcher3/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelPortraitTest.kt,
-    //     packages/apps/Launcher3/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelLandscape3ButtonTest.kt,
-    //     packages/apps/Launcher3/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelPortrait3ButtonTest.kt)
 
     private static Context getContext(Context c, Info info, int orientation, WindowBounds bounds) {
         Configuration config = new Configuration(c.getResources().getConfiguration());
@@ -1490,6 +1563,8 @@
         private Boolean mTransposeLayoutWithOrientation;
         private Boolean mIsGestureMode;
 
+        private SparseArray<DotRenderer> mDotRendererCache;
+
         public Builder(Context context, InvariantDeviceProfile inv, Info info) {
             mContext = context;
             mInv = inv;
@@ -1506,6 +1581,10 @@
             return this;
         }
 
+        public Builder setDotRendererCache(SparseArray<DotRenderer> dotRendererCache) {
+            mDotRendererCache = dotRendererCache;
+            return this;
+        }
 
         public Builder setWindowBounds(WindowBounds bounds) {
             mWindowBounds = bounds;
@@ -1532,8 +1611,12 @@
             if (mIsGestureMode == null) {
                 mIsGestureMode = DisplayController.getNavigationMode(mContext).hasGestures;
             }
-            return new DeviceProfile(mContext, mInv, mInfo, mWindowBounds, mIsMultiWindowMode,
-                    mTransposeLayoutWithOrientation, mUseTwoPanels, mIsGestureMode);
+            if (mDotRendererCache == null) {
+                mDotRendererCache = new SparseArray<>();
+            }
+            return new DeviceProfile(mContext, mInv, mInfo, mWindowBounds, mDotRendererCache,
+                    mIsMultiWindowMode, mTransposeLayoutWithOrientation, mUseTwoPanels,
+                    mIsGestureMode);
         }
     }
 
diff --git a/src/com/android/launcher3/DropTargetBar.java b/src/com/android/launcher3/DropTargetBar.java
index c1304d4..d64cb26 100644
--- a/src/com/android/launcher3/DropTargetBar.java
+++ b/src/com/android/launcher3/DropTargetBar.java
@@ -37,7 +37,7 @@
 import com.android.launcher3.dragndrop.DragController;
 import com.android.launcher3.dragndrop.DragController.DragListener;
 import com.android.launcher3.dragndrop.DragOptions;
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 
 /*
  * The top bar containing various drop targets: Delete/App Info/Uninstall.
@@ -175,7 +175,7 @@
             secondButton.setPadding(horizontalPadding, verticalPadding, horizontalPadding,
                     verticalPadding);
 
-            float scale = dp.getWorkspaceSpringLoadScale();
+            float scale = dp.getWorkspaceSpringLoadScale(mLauncher);
             int scaledPanelWidth = (int) (dp.getCellLayoutWidth() * scale);
 
             int availableWidth;
@@ -232,7 +232,7 @@
 
         DeviceProfile dp = mLauncher.getDeviceProfile();
         // Center vertical bar over scaled workspace, accounting for hotseat offset.
-        float scale = dp.getWorkspaceSpringLoadScale();
+        float scale = dp.getWorkspaceSpringLoadScale(mLauncher);
         Workspace<?> ws = mLauncher.getWorkspace();
         int barCenter;
         if (dp.isTwoPanels) {
diff --git a/src/com/android/launcher3/FastScrollRecyclerView.java b/src/com/android/launcher3/FastScrollRecyclerView.java
index 94903f2..747b755 100644
--- a/src/com/android/launcher3/FastScrollRecyclerView.java
+++ b/src/com/android/launcher3/FastScrollRecyclerView.java
@@ -57,7 +57,9 @@
     @Override
     protected void onAttachedToWindow() {
         super.onAttachedToWindow();
-        bindFastScrollbar();
+        if (mScrollbar == null || !mScrollbar.hasRecyclerView()) {
+            bindFastScrollbar();
+        }
     }
 
     public void bindFastScrollbar() {
diff --git a/src/com/android/launcher3/Hotseat.java b/src/com/android/launcher3/Hotseat.java
index 05ed319..bf492a9 100644
--- a/src/com/android/launcher3/Hotseat.java
+++ b/src/com/android/launcher3/Hotseat.java
@@ -47,7 +47,6 @@
     private Consumer<Boolean> mOnVisibilityAggregatedCallback;
 
     private final View mQsb;
-    private final int mQsbHeight;
 
     public Hotseat(Context context) {
         this(context, null);
@@ -62,8 +61,6 @@
 
         mQsb = LayoutInflater.from(context).inflate(R.layout.search_container_hotseat, this, false);
         addView(mQsb);
-
-        mQsbHeight = getResources().getDimensionPixelSize(R.dimen.qsb_widget_height);
     }
 
     /**
@@ -171,29 +168,29 @@
     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
         super.onMeasure(widthMeasureSpec, heightMeasureSpec);
 
-        int qsbWidth = mActivity.getDeviceProfile().qsbWidth;
-
-        mQsb.measure(MeasureSpec.makeMeasureSpec(qsbWidth, MeasureSpec.EXACTLY),
-                MeasureSpec.makeMeasureSpec(mQsbHeight, MeasureSpec.EXACTLY));
+        DeviceProfile dp = mActivity.getDeviceProfile();
+        mQsb.measure(MeasureSpec.makeMeasureSpec(dp.hotseatQsbWidth, MeasureSpec.EXACTLY),
+                MeasureSpec.makeMeasureSpec(dp.hotseatQsbHeight, MeasureSpec.EXACTLY));
     }
 
     @Override
     protected void onLayout(boolean changed, int l, int t, int r, int b) {
         super.onLayout(changed, l, t, r, b);
 
-        int qsbWidth = mQsb.getMeasuredWidth();
+        int qsbMeasuredWidth = mQsb.getMeasuredWidth();
         int left;
-        if (mActivity.getDeviceProfile().isQsbInline) {
-            int qsbSpace = mActivity.getDeviceProfile().hotseatBorderSpace;
+        DeviceProfile dp = mActivity.getDeviceProfile();
+        if (dp.isQsbInline) {
+            int qsbSpace = dp.hotseatBorderSpace;
             left = Utilities.isRtl(getResources()) ? r - getPaddingRight() + qsbSpace
-                    : l + getPaddingLeft() - qsbWidth - qsbSpace;
+                    : l + getPaddingLeft() - qsbMeasuredWidth - qsbSpace;
         } else {
-            left = (r - l - qsbWidth) / 2;
+            left = (r - l - qsbMeasuredWidth) / 2;
         }
-        int right = left + qsbWidth;
+        int right = left + qsbMeasuredWidth;
 
-        int bottom = b - t - mActivity.getDeviceProfile().getQsbOffsetY();
-        int top = bottom - mQsbHeight;
+        int bottom = b - t - dp.getQsbOffsetY();
+        int top = bottom - dp.hotseatQsbHeight;
         mQsb.layout(left, top, right, bottom);
     }
 
diff --git a/src/com/android/launcher3/InvariantDeviceProfile.java b/src/com/android/launcher3/InvariantDeviceProfile.java
index c051292..21eba00 100644
--- a/src/com/android/launcher3/InvariantDeviceProfile.java
+++ b/src/com/android/launcher3/InvariantDeviceProfile.java
@@ -48,8 +48,10 @@
 import androidx.annotation.VisibleForTesting;
 import androidx.core.content.res.ResourcesCompat;
 
+import com.android.launcher3.icons.DotRenderer;
 import com.android.launcher3.model.DeviceGridState;
 import com.android.launcher3.provider.RestoreDbTask;
+import com.android.launcher3.testing.shared.ResourceUtils;
 import com.android.launcher3.util.DisplayController;
 import com.android.launcher3.util.DisplayController.Info;
 import com.android.launcher3.util.IntArray;
@@ -126,7 +128,6 @@
 
     public PointF[] borderSpaces;
     public float folderBorderSpace;
-    public float[] hotseatBorderSpaces;
     public int inlineNavButtonsEndSpacing;
 
     public float[] horizontalMargin;
@@ -144,11 +145,6 @@
     public int numShownHotseatIcons;
 
     /**
-     * Number of icons inside the hotseat area when using 3 buttons navigation.
-     */
-    public int numShrunkenHotseatIcons;
-
-    /**
      * Number of icons inside the hotseat area that is stored in the database. This is greater than
      * or equal to numnShownHotseatIcons, allowing for a seamless transition between two hotseat
      * sizes that share the same DB.
@@ -174,7 +170,7 @@
     public String dbFile;
     public int defaultLayoutId;
     int demoModeLayoutId;
-    boolean[] inlineQsb = new boolean[COUNT_SIZES];
+    public boolean[] inlineQsb = new boolean[COUNT_SIZES];
 
     /**
      * An immutable list of supported profiles.
@@ -362,11 +358,9 @@
         horizontalMargin = displayOption.horizontalMargin;
 
         numShownHotseatIcons = closestProfile.numHotseatIcons;
-        numShrunkenHotseatIcons = closestProfile.numShrunkenHotseatIcons;
         numDatabaseHotseatIcons = deviceType == TYPE_MULTI_DISPLAY
                 ? closestProfile.numDatabaseHotseatIcons : closestProfile.numHotseatIcons;
         hotseatColumnSpan = closestProfile.hotseatColumnSpan;
-        hotseatBorderSpaces = displayOption.hotseatBorderSpaces;
         hotseatBarBottomSpace = displayOption.hotseatBarBottomSpace;
         hotseatQsbSpace = displayOption.hotseatQsbSpace;
 
@@ -395,10 +389,12 @@
 
         final List<DeviceProfile> localSupportedProfiles = new ArrayList<>();
         defaultWallpaperSize = new Point(displayInfo.currentSize);
+        SparseArray<DotRenderer> dotRendererCache = new SparseArray<>();
         for (WindowBounds bounds : displayInfo.supportedBounds) {
             localSupportedProfiles.add(new DeviceProfile.Builder(context, this, displayInfo)
                     .setUseTwoPanels(deviceType == TYPE_MULTI_DISPLAY)
                     .setWindowBounds(bounds)
+                    .setDotRendererCache(dotRendererCache)
                     .build());
 
             // Wallpaper size should be the maximum of the all possible sizes Launcher expects
@@ -733,7 +729,6 @@
         private final int numAllAppsColumns;
         private final int numDatabaseAllAppsColumns;
         private final int numHotseatIcons;
-        private final int numShrunkenHotseatIcons;
         private final int numDatabaseHotseatIcons;
 
         private final int[] hotseatColumnSpan = new int[COUNT_SIZES];
@@ -773,8 +768,6 @@
 
             numHotseatIcons = a.getInt(
                     R.styleable.GridDisplayOption_numHotseatIcons, numColumns);
-            numShrunkenHotseatIcons = a.getInt(
-                    R.styleable.GridDisplayOption_numShrunkenHotseatIcons, numHotseatIcons / 2);
             numDatabaseHotseatIcons = a.getInt(
                     R.styleable.GridDisplayOption_numExtendedHotseatIcons, 2 * numHotseatIcons);
 
@@ -838,8 +831,6 @@
         private float folderBorderSpace;
         private final PointF[] borderSpaces = new PointF[COUNT_SIZES];
         private final float[] horizontalMargin = new float[COUNT_SIZES];
-        //TODO(http://b/228998082) remove this when 3 button spaces are fixed
-        private final float[] hotseatBorderSpaces = new float[COUNT_SIZES];
         private final float[] hotseatBarBottomSpace = new float[COUNT_SIZES];
         private final float[] hotseatQsbSpace = new float[COUNT_SIZES];
 
@@ -1055,18 +1046,6 @@
                     R.styleable.ProfileDisplayOption_horizontalMarginTwoPanelPortrait,
                     horizontalMargin[INDEX_DEFAULT]);
 
-            hotseatBorderSpaces[INDEX_DEFAULT] = a.getFloat(
-                    R.styleable.ProfileDisplayOption_hotseatBorderSpace, borderSpace);
-            hotseatBorderSpaces[INDEX_LANDSCAPE] = a.getFloat(
-                    R.styleable.ProfileDisplayOption_hotseatBorderSpaceLandscape,
-                    hotseatBorderSpaces[INDEX_DEFAULT]);
-            hotseatBorderSpaces[INDEX_TWO_PANEL_LANDSCAPE] = a.getFloat(
-                    R.styleable.ProfileDisplayOption_hotseatBorderSpaceTwoPanelLandscape,
-                    hotseatBorderSpaces[INDEX_DEFAULT]);
-            hotseatBorderSpaces[INDEX_TWO_PANEL_PORTRAIT] = a.getFloat(
-                    R.styleable.ProfileDisplayOption_hotseatBorderSpaceTwoPanelPortrait,
-                    hotseatBorderSpaces[INDEX_DEFAULT]);
-
             hotseatBarBottomSpace[INDEX_DEFAULT] = a.getFloat(
                     R.styleable.ProfileDisplayOption_hotseatBarBottomSpace,
                     ResourcesCompat.getFloat(context.getResources(),
@@ -1129,7 +1108,6 @@
                 minCellSize[i].x *= w;
                 minCellSize[i].y *= w;
                 horizontalMargin[i] *= w;
-                hotseatBorderSpaces[i] *= w;
                 hotseatBarBottomSpace[i] *= w;
                 hotseatQsbSpace[i] *= w;
                 allAppsCellSize[i].x *= w;
@@ -1154,7 +1132,6 @@
                 minCellSize[i].x += p.minCellSize[i].x;
                 minCellSize[i].y += p.minCellSize[i].y;
                 horizontalMargin[i] += p.horizontalMargin[i];
-                hotseatBorderSpaces[i] += p.hotseatBorderSpaces[i];
                 hotseatBarBottomSpace[i] += p.hotseatBarBottomSpace[i];
                 hotseatQsbSpace[i] += p.hotseatQsbSpace[i];
                 allAppsCellSize[i].x += p.allAppsCellSize[i].x;
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index 9c62251..5ee9aa8 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -60,7 +60,6 @@
 import static com.android.launcher3.popup.SystemShortcut.WIDGETS;
 import static com.android.launcher3.states.RotationHelper.REQUEST_LOCK;
 import static com.android.launcher3.states.RotationHelper.REQUEST_NONE;
-import static com.android.launcher3.testing.TestProtocol.BAD_STATE;
 import static com.android.launcher3.util.ItemInfoMatcher.forFolderMatch;
 
 import android.animation.Animator;
@@ -177,7 +176,7 @@
 import com.android.launcher3.statemanager.StatefulActivity;
 import com.android.launcher3.states.RotationHelper;
 import com.android.launcher3.testing.TestLogging;
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 import com.android.launcher3.touch.AllAppsSwipeController;
 import com.android.launcher3.touch.ItemClickHandler;
 import com.android.launcher3.uioverrides.plugins.PluginManagerWrapper;
@@ -513,7 +512,6 @@
 
         if (!mModel.addCallbacksAndLoad(this)) {
             if (!internalStateHandled) {
-                Log.d(BAD_STATE, "Launcher onCreate not binding sync, prevent drawing");
                 // If we are not binding synchronously, pause drawing until initial bind complete,
                 // so that the system could continue to show the device loading prompt
                 mOnInitialBindListener = Boolean.FALSE::booleanValue;
@@ -636,7 +634,10 @@
 
     @Override
     public void onIdpChanged(boolean modelPropertiesChanged) {
-        initDeviceProfile(mDeviceProfile.inv);
+        if (!initDeviceProfile(mDeviceProfile.inv)) {
+            return;
+        }
+
         dispatchDeviceProfileChanged();
         reapplyUi();
         mDragLayer.recreateControllers();
@@ -659,9 +660,17 @@
         mDragLayer.onOneHandedModeStateChanged(activated);
     }
 
-    protected void initDeviceProfile(InvariantDeviceProfile idp) {
+    /**
+     * Returns {@code true} if a new DeviceProfile is initialized, and {@code false} otherwise.
+     */
+    protected boolean initDeviceProfile(InvariantDeviceProfile idp) {
         // Load configuration-specific DeviceProfile
-        mDeviceProfile = idp.getDeviceProfile(this);
+        DeviceProfile deviceProfile = idp.getDeviceProfile(this);
+        if (mDeviceProfile == deviceProfile) {
+            return false;
+        }
+
+        mDeviceProfile = deviceProfile;
         if (isInMultiWindowMode()) {
             mDeviceProfile = mDeviceProfile.getMultiWindowProfile(
                     this, getMultiWindowDisplaySize());
@@ -669,6 +678,7 @@
 
         onDeviceProfileInitiated();
         mModelWriter = mModel.getWriter(getDeviceProfile().isVerticalBarLayout(), true, this);
+        return true;
     }
 
     public RotationHelper getRotationHelper() {
@@ -3017,14 +3027,17 @@
         writer.println(prefix + "\tmAppWidgetHost.isListening: " + mAppWidgetHost.isListening());
 
         if (mViewCapture != null) {
-            writer.println(prefix + "\tmViewCapture: " + mViewCapture.dumpToString());
+            writer.print(prefix + "\tmViewCapture: ");
+            writer.flush();
+            mViewCapture.dump(fd);
+            writer.println();
         }
 
         // Extra logging for general debugging
         mDragLayer.dump(prefix, writer);
         mStateManager.dump(prefix, writer);
         mPopupDataProvider.dump(prefix, writer);
-        mDeviceProfile.dump(prefix, writer);
+        mDeviceProfile.dump(this, prefix, writer);
 
         try {
             FileLog.flushAll(writer);
diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java
index de0d300..f790789 100644
--- a/src/com/android/launcher3/LauncherModel.java
+++ b/src/com/android/launcher3/LauncherModel.java
@@ -63,7 +63,7 @@
 import com.android.launcher3.pm.PackageInstallInfo;
 import com.android.launcher3.pm.UserCache;
 import com.android.launcher3.shortcuts.ShortcutRequest;
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 import com.android.launcher3.util.IntSet;
 import com.android.launcher3.util.ItemInfoMatcher;
 import com.android.launcher3.util.PackageUserKey;
diff --git a/src/com/android/launcher3/LauncherState.java b/src/com/android/launcher3/LauncherState.java
index 8b5cdbd..4532ed4 100644
--- a/src/com/android/launcher3/LauncherState.java
+++ b/src/com/android/launcher3/LauncherState.java
@@ -19,16 +19,16 @@
 import static com.android.launcher3.anim.Interpolators.DEACCEL_2;
 import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_HOME;
 import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_OVERVIEW;
-import static com.android.launcher3.testing.TestProtocol.ALL_APPS_STATE_ORDINAL;
-import static com.android.launcher3.testing.TestProtocol.BACKGROUND_APP_STATE_ORDINAL;
-import static com.android.launcher3.testing.TestProtocol.HINT_STATE_ORDINAL;
-import static com.android.launcher3.testing.TestProtocol.HINT_STATE_TWO_BUTTON_ORDINAL;
-import static com.android.launcher3.testing.TestProtocol.NORMAL_STATE_ORDINAL;
-import static com.android.launcher3.testing.TestProtocol.OVERVIEW_MODAL_TASK_STATE_ORDINAL;
-import static com.android.launcher3.testing.TestProtocol.OVERVIEW_SPLIT_SELECT_ORDINAL;
-import static com.android.launcher3.testing.TestProtocol.OVERVIEW_STATE_ORDINAL;
-import static com.android.launcher3.testing.TestProtocol.QUICK_SWITCH_STATE_ORDINAL;
-import static com.android.launcher3.testing.TestProtocol.SPRING_LOADED_STATE_ORDINAL;
+import static com.android.launcher3.testing.shared.TestProtocol.ALL_APPS_STATE_ORDINAL;
+import static com.android.launcher3.testing.shared.TestProtocol.BACKGROUND_APP_STATE_ORDINAL;
+import static com.android.launcher3.testing.shared.TestProtocol.HINT_STATE_ORDINAL;
+import static com.android.launcher3.testing.shared.TestProtocol.HINT_STATE_TWO_BUTTON_ORDINAL;
+import static com.android.launcher3.testing.shared.TestProtocol.NORMAL_STATE_ORDINAL;
+import static com.android.launcher3.testing.shared.TestProtocol.OVERVIEW_MODAL_TASK_STATE_ORDINAL;
+import static com.android.launcher3.testing.shared.TestProtocol.OVERVIEW_SPLIT_SELECT_ORDINAL;
+import static com.android.launcher3.testing.shared.TestProtocol.OVERVIEW_STATE_ORDINAL;
+import static com.android.launcher3.testing.shared.TestProtocol.QUICK_SWITCH_STATE_ORDINAL;
+import static com.android.launcher3.testing.shared.TestProtocol.SPRING_LOADED_STATE_ORDINAL;
 
 import android.content.Context;
 import android.graphics.Color;
@@ -38,7 +38,7 @@
 import com.android.launcher3.statemanager.StateManager;
 import com.android.launcher3.states.HintState;
 import com.android.launcher3.states.SpringLoadedState;
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 import com.android.launcher3.uioverrides.states.AllAppsState;
 import com.android.launcher3.uioverrides.states.OverviewState;
 
diff --git a/src/com/android/launcher3/SessionCommitReceiver.java b/src/com/android/launcher3/SessionCommitReceiver.java
index b81637f..bcd4c3f 100644
--- a/src/com/android/launcher3/SessionCommitReceiver.java
+++ b/src/com/android/launcher3/SessionCommitReceiver.java
@@ -31,7 +31,7 @@
 import com.android.launcher3.logging.FileLog;
 import com.android.launcher3.model.ItemInstallQueue;
 import com.android.launcher3.pm.InstallSessionHelper;
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 import com.android.launcher3.util.Executors;
 
 /**
diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java
index dc8c739..d0dbaf4 100644
--- a/src/com/android/launcher3/Utilities.java
+++ b/src/com/android/launcher3/Utilities.java
@@ -88,6 +88,7 @@
 import com.android.launcher3.pm.ShortcutConfigActivityInfo;
 import com.android.launcher3.shortcuts.ShortcutKey;
 import com.android.launcher3.shortcuts.ShortcutRequest;
+import com.android.launcher3.testing.shared.ResourceUtils;
 import com.android.launcher3.util.IntArray;
 import com.android.launcher3.util.PackageManagerHelper;
 import com.android.launcher3.util.SplitConfigurationOptions.SplitPositionOption;
@@ -525,10 +526,11 @@
     }
 
     public static int pxFromSp(float size, DisplayMetrics metrics, float scale) {
-        return Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,
-                size, metrics) * scale);
+        float value = scale * TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, size, metrics);
+        return ResourceUtils.roundPxValueFromFloat(value);
     }
 
+
     public static String createDbSelectionQuery(String columnName, IntArray values) {
         return String.format(Locale.ENGLISH, "%s IN (%s)", columnName, values.toConcatString());
     }
diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java
index e6dea8f..2bc5e64 100644
--- a/src/com/android/launcher3/Workspace.java
+++ b/src/com/android/launcher3/Workspace.java
@@ -30,7 +30,6 @@
 import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_HOME;
 import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_SWIPELEFT;
 import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_SWIPERIGHT;
-import static com.android.launcher3.testing.TestProtocol.BAD_STATE;
 
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
@@ -169,7 +168,7 @@
     /**
      * CellInfo for the cell that is currently being dragged
      */
-    private CellLayout.CellInfo mDragInfo;
+    protected CellLayout.CellInfo mDragInfo;
 
     /**
      * Target drop area calculated during last acceptDrop call.
@@ -214,7 +213,7 @@
     private boolean mUnlockWallpaperFromDefaultPageOnLayout;
 
     public static final int REORDER_TIMEOUT = 650;
-    private final Alarm mReorderAlarm = new Alarm();
+    protected final Alarm mReorderAlarm = new Alarm();
     private PreviewBackground mFolderCreateBg;
     private FolderIcon mDragOverFolderIcon = null;
     private boolean mCreateUserFolderOnDrop = false;
@@ -242,7 +241,7 @@
     private static final int DRAG_MODE_CREATE_FOLDER = 1;
     private static final int DRAG_MODE_ADD_TO_FOLDER = 2;
     private static final int DRAG_MODE_REORDER = 3;
-    private int mDragMode = DRAG_MODE_NONE;
+    protected int mDragMode = DRAG_MODE_NONE;
     @Thunk int mLastReorderX = -1;
     @Thunk int mLastReorderY = -1;
 
@@ -1248,7 +1247,6 @@
         // different effects based on device performance. On at least one relatively high-end
         // device I've tried, translating the launcher causes things to get quite laggy.
         mLauncher.getDragLayer().setTranslationX(transX);
-        Log.d(BAD_STATE, "Workspace onOverlayScrollChanged DragLayer ALPHA_INDEX_OVERLAY=" + alpha);
         mLauncher.getDragLayer().getAlphaProperty(ALPHA_INDEX_OVERLAY).setValue(alpha);
     }
 
@@ -1980,10 +1978,10 @@
 
                 // If the item being dropped is a shortcut and the nearest drop
                 // cell also contains a shortcut, then create a folder with the two shortcuts.
-                if (createUserFolderIfNecessary(cell, container,
-                        dropTargetLayout, mTargetCell, distance, false, d)
+                if (createUserFolderIfNecessary(cell, container, dropTargetLayout, mTargetCell,
+                        distance, false, d)
                         || addToExistingFolderIfNecessary(cell, dropTargetLayout, mTargetCell,
-                                distance, d, false)) {
+                        distance, d, false)) {
                     mLauncher.getStateManager().goToState(NORMAL, SPRING_LOADED_EXIT_DELAY);
                     return;
                 }
@@ -2012,8 +2010,8 @@
                     mTargetCell[0] = mTargetCell[1] = -1;
                 } else {
                     mTargetCell = dropTargetLayout.performReorder((int) mDragViewVisualCenter[0],
-                            (int) mDragViewVisualCenter[1], minSpanX, minSpanY, spanX, spanY, cell,
-                            mTargetCell, resultSpan, CellLayout.MODE_ON_DROP);
+                            (int) mDragViewVisualCenter[1], minSpanX, minSpanY, spanX, spanY,
+                            cell, mTargetCell, resultSpan, CellLayout.MODE_ON_DROP);
                 }
 
                 boolean foundCell = mTargetCell[0] >= 0 && mTargetCell[1] >= 0;
@@ -2297,7 +2295,7 @@
         }
     }
 
-    private void cleanupFolderCreation() {
+    protected void cleanupFolderCreation() {
         if (mFolderCreateBg != null) {
             mFolderCreateBg.animateToRest();
         }
@@ -2310,7 +2308,7 @@
         }
     }
 
-    private void cleanupReorder(boolean cancelAlarm) {
+    protected void cleanupReorder(boolean cancelAlarm) {
         // Any pending reorders are canceled
         if (cancelAlarm) {
             mReorderAlarm.cancelAlarm();
@@ -2402,26 +2400,7 @@
                     mDragViewVisualCenter[0], (int) mDragViewVisualCenter[1], item.spanX,
                     item.spanY, child, mTargetCell);
 
-            if (!nearestDropOccupied) {
-                mDragTargetLayout.visualizeDropLocation(mTargetCell[0], mTargetCell[1],
-                        item.spanX, item.spanY, d);
-            } else if ((mDragMode == DRAG_MODE_NONE || mDragMode == DRAG_MODE_REORDER)
-                    && !mReorderAlarm.alarmPending()
-                    && (mLastReorderX != reorderX || mLastReorderY != reorderY)
-                    && targetCellDistance < mDragTargetLayout.getReorderRadius(mTargetCell)) {
-
-                int[] resultSpan = new int[2];
-                mDragTargetLayout.performReorder((int) mDragViewVisualCenter[0],
-                        (int) mDragViewVisualCenter[1], minSpanX, minSpanY, item.spanX, item.spanY,
-                        child, mTargetCell, resultSpan, CellLayout.MODE_SHOW_REORDER_HINT);
-
-                // Otherwise, if we aren't adding to or creating a folder and there's no pending
-                // reorder, then we schedule a reorder
-                ReorderAlarmListener listener = new ReorderAlarmListener(mDragViewVisualCenter,
-                        minSpanX, minSpanY, item.spanX, item.spanY, d, child);
-                mReorderAlarm.setOnAlarmListener(listener);
-                mReorderAlarm.setAlarm(REORDER_TIMEOUT);
-            }
+            manageReorderOnDragOver(d, targetCellDistance, nearestDropOccupied, minSpanX, minSpanY);
 
             if (mDragMode == DRAG_MODE_CREATE_FOLDER || mDragMode == DRAG_MODE_ADD_TO_FOLDER ||
                     !nearestDropOccupied) {
@@ -2432,6 +2411,35 @@
         }
     }
 
+    protected void manageReorderOnDragOver(DragObject d, float targetCellDistance,
+            boolean nearestDropOccupied, int minSpanX, int minSpanY) {
+
+        ItemInfo item = d.dragInfo;
+        final View child = (mDragInfo == null) ? null : mDragInfo.cell;
+        int reorderX = mTargetCell[0];
+        int reorderY = mTargetCell[1];
+        if (!nearestDropOccupied) {
+            mDragTargetLayout.visualizeDropLocation(mTargetCell[0], mTargetCell[1],
+                    item.spanX, item.spanY, d);
+        } else if ((mDragMode == DRAG_MODE_NONE || mDragMode == DRAG_MODE_REORDER)
+                && !mReorderAlarm.alarmPending()
+                && (mLastReorderX != reorderX || mLastReorderY != reorderY)
+                && targetCellDistance < mDragTargetLayout.getReorderRadius(mTargetCell, item.spanX,
+                item.spanY)) {
+
+            int[] resultSpan = new int[2];
+            mDragTargetLayout.performReorder((int) mDragViewVisualCenter[0],
+                    (int) mDragViewVisualCenter[1], minSpanX, minSpanY, item.spanX, item.spanY,
+                    child, mTargetCell, resultSpan, CellLayout.MODE_SHOW_REORDER_HINT);
+
+            // Otherwise, if we aren't adding to or creating a folder and there's no pending
+            // reorder, then we schedule a reorder
+            ReorderAlarmListener listener = new ReorderAlarmListener(mDragViewVisualCenter,
+                    minSpanX, minSpanY, item.spanX, item.spanY, d, child);
+            mReorderAlarm.setOnAlarmListener(listener);
+            mReorderAlarm.setAlarm(REORDER_TIMEOUT);
+        }
+    }
     /**
      * Updates {@link #mDragTargetLayout} and {@link #mDragOverlappingLayout}
      * based on the DragObject's position.
diff --git a/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java b/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java
index 53a6fd7..e33e44e 100644
--- a/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java
+++ b/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java
@@ -16,7 +16,6 @@
 package com.android.launcher3.allapps;
 
 import android.content.Context;
-import android.content.Intent;
 import android.util.AttributeSet;
 import android.view.KeyEvent;
 import android.view.MotionEvent;
@@ -32,7 +31,6 @@
 import com.android.launcher3.allapps.BaseAllAppsAdapter.AdapterItem;
 import com.android.launcher3.allapps.search.SearchAdapterProvider;
 import com.android.launcher3.config.FeatureFlags;
-import com.android.launcher3.util.PackageManagerHelper;
 import com.android.launcher3.views.AppLauncher;
 
 import java.util.ArrayList;
@@ -77,13 +75,6 @@
 
     /** Updates all apps container with the latest search query. */
     public void setLastSearchQuery(String query) {
-        Intent marketSearchIntent = PackageManagerHelper.getMarketSearchIntent(
-                mActivityContext, query);
-        OnClickListener marketSearchClickListener = (v) -> mActivityContext.startActivitySafely(v,
-                marketSearchIntent, null);
-        for (int i = 0; i < mAH.size(); i++) {
-            mAH.get(i).mAdapter.setLastSearchQuery(query, marketSearchClickListener);
-        }
         mIsSearching = true;
         rebindAdapters();
         mHeader.setCollapsed(true);
diff --git a/src/com/android/launcher3/allapps/AllAppsBackgroundDrawable.java b/src/com/android/launcher3/allapps/AllAppsBackgroundDrawable.java
deleted file mode 100644
index 3830a93..0000000
--- a/src/com/android/launcher3/allapps/AllAppsBackgroundDrawable.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.launcher3.allapps;
-
-import android.animation.ObjectAnimator;
-import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.Canvas;
-import android.graphics.ColorFilter;
-import android.graphics.PixelFormat;
-import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
-import android.view.ContextThemeWrapper;
-import android.view.Gravity;
-
-import com.android.launcher3.LauncherAnimUtils;
-import com.android.launcher3.R;
-import com.android.launcher3.util.Themes;
-
-/**
- * This is a custom composite drawable that has a fixed virtual size and dynamically lays out its
- * children images relatively within its bounds.  This way, we can reduce the memory usage of a
- * single, large sparsely populated image.
- */
-public class AllAppsBackgroundDrawable extends Drawable {
-
-    /**
-     * A helper class to position and orient a drawable to be drawn.
-     */
-    protected static class TransformedImageDrawable {
-        private Drawable mImage;
-        private float mXPercent;
-        private float mYPercent;
-        private int mGravity;
-        private int mAlpha;
-
-        /**
-         * @param gravity If one of the Gravity center values, the x and y offset will take the width
-         *                and height of the image into account to center the image to the offset.
-         */
-        public TransformedImageDrawable(Context context, int resourceId, float xPct, float yPct,
-                int gravity) {
-            mImage = context.getDrawable(resourceId);
-            mXPercent = xPct;
-            mYPercent = yPct;
-            mGravity = gravity;
-        }
-
-        public void setAlpha(int alpha) {
-            mImage.setAlpha(alpha);
-            mAlpha = alpha;
-        }
-
-        public int getAlpha() {
-            return mAlpha;
-        }
-
-        public void updateBounds(Rect bounds) {
-            int width = mImage.getIntrinsicWidth();
-            int height = mImage.getIntrinsicHeight();
-            int left = bounds.left + (int) (mXPercent * bounds.width());
-            int top = bounds.top + (int) (mYPercent * bounds.height());
-            if ((mGravity & Gravity.CENTER_HORIZONTAL) == Gravity.CENTER_HORIZONTAL) {
-                left -= (width / 2);
-            }
-            if ((mGravity & Gravity.CENTER_VERTICAL) == Gravity.CENTER_VERTICAL) {
-                top -= (height / 2);
-            }
-            mImage.setBounds(left, top, left + width, top + height);
-        }
-
-        public void draw(Canvas canvas) {
-            mImage.draw(canvas);
-        }
-
-        public Rect getBounds() {
-            return mImage.getBounds();
-        }
-    }
-
-    protected final TransformedImageDrawable mHand;
-    protected final TransformedImageDrawable[] mIcons;
-    private final int mWidth;
-    private final int mHeight;
-
-    private ObjectAnimator mBackgroundAnim;
-
-    public AllAppsBackgroundDrawable(Context context) {
-        Resources res = context.getResources();
-        mWidth = res.getDimensionPixelSize(R.dimen.all_apps_background_canvas_width);
-        mHeight = res.getDimensionPixelSize(R.dimen.all_apps_background_canvas_height);
-
-        context = new ContextThemeWrapper(context,
-                Themes.getAttrBoolean(context, R.attr.isMainColorDark)
-                        ? R.style.AllAppsEmptySearchBackground_Dark
-                        : R.style.AllAppsEmptySearchBackground);
-        mHand = new TransformedImageDrawable(context, R.drawable.ic_all_apps_bg_hand,
-                0.575f, 0.f, Gravity.CENTER_HORIZONTAL);
-        mIcons = new TransformedImageDrawable[4];
-        mIcons[0] = new TransformedImageDrawable(context, R.drawable.ic_all_apps_bg_icon_1,
-                0.375f, 0, Gravity.CENTER_HORIZONTAL);
-        mIcons[1] = new TransformedImageDrawable(context, R.drawable.ic_all_apps_bg_icon_2,
-                0.3125f, 0.2f, Gravity.CENTER_HORIZONTAL);
-        mIcons[2] = new TransformedImageDrawable(context, R.drawable.ic_all_apps_bg_icon_3,
-                0.475f, 0.26f, Gravity.CENTER_HORIZONTAL);
-        mIcons[3] = new TransformedImageDrawable(context, R.drawable.ic_all_apps_bg_icon_4,
-                0.7f, 0.125f, Gravity.CENTER_HORIZONTAL);
-    }
-
-    /**
-     * Animates the background alpha.
-     */
-    public void animateBgAlpha(float finalAlpha, int duration) {
-        int finalAlphaI = (int) (finalAlpha * 255f);
-        if (getAlpha() != finalAlphaI) {
-            mBackgroundAnim = cancelAnimator(mBackgroundAnim);
-            mBackgroundAnim = ObjectAnimator.ofInt(this, LauncherAnimUtils.DRAWABLE_ALPHA,
-                    finalAlphaI);
-            mBackgroundAnim.setDuration(duration);
-            mBackgroundAnim.start();
-        }
-    }
-
-    /**
-     * Sets the background alpha immediately.
-     */
-    public void setBgAlpha(float finalAlpha) {
-        int finalAlphaI = (int) (finalAlpha * 255f);
-        if (getAlpha() != finalAlphaI) {
-            mBackgroundAnim = cancelAnimator(mBackgroundAnim);
-            setAlpha(finalAlphaI);
-        }
-    }
-
-    @Override
-    public int getIntrinsicWidth() {
-        return mWidth;
-    }
-
-    @Override
-    public int getIntrinsicHeight() {
-        return mHeight;
-    }
-
-    @Override
-    public void draw(Canvas canvas) {
-        mHand.draw(canvas);
-        for (int i = 0; i < mIcons.length; i++) {
-            mIcons[i].draw(canvas);
-        }
-    }
-
-    @Override
-    protected void onBoundsChange(Rect bounds) {
-        super.onBoundsChange(bounds);
-        mHand.updateBounds(bounds);
-        for (int i = 0; i < mIcons.length; i++) {
-            mIcons[i].updateBounds(bounds);
-        }
-        invalidateSelf();
-    }
-
-    @Override
-    public void setAlpha(int alpha) {
-        mHand.setAlpha(alpha);
-        for (int i = 0; i < mIcons.length; i++) {
-            mIcons[i].setAlpha(alpha);
-        }
-        invalidateSelf();
-    }
-
-    @Override
-    public int getAlpha() {
-        return mHand.getAlpha();
-    }
-
-    @Override
-    public void setColorFilter(ColorFilter colorFilter) {
-        // Do nothing
-    }
-
-    @Override
-    public int getOpacity() {
-        return PixelFormat.TRANSLUCENT;
-    }
-
-    private ObjectAnimator cancelAnimator(ObjectAnimator animator) {
-        if (animator != null) {
-            animator.cancel();
-        }
-        return null;
-    }
-}
diff --git a/src/com/android/launcher3/allapps/AllAppsRecyclerView.java b/src/com/android/launcher3/allapps/AllAppsRecyclerView.java
index de34416..31e3890 100644
--- a/src/com/android/launcher3/allapps/AllAppsRecyclerView.java
+++ b/src/com/android/launcher3/allapps/AllAppsRecyclerView.java
@@ -24,13 +24,10 @@
 import static com.android.launcher3.util.UiThreadHelper.hideKeyboardAsync;
 
 import android.content.Context;
-import android.content.res.Resources;
 import android.graphics.Canvas;
-import android.graphics.drawable.Drawable;
 import android.util.AttributeSet;
 import android.util.Log;
 import android.util.SparseIntArray;
-import android.view.MotionEvent;
 
 import androidx.recyclerview.widget.RecyclerView;
 
@@ -39,7 +36,6 @@
 import com.android.launcher3.LauncherAppState;
 import com.android.launcher3.R;
 import com.android.launcher3.Utilities;
-import com.android.launcher3.config.FeatureFlags;
 import com.android.launcher3.logging.StatsLogManager;
 import com.android.launcher3.views.ActivityContext;
 import com.android.launcher3.views.RecyclerViewFastScroller;
@@ -89,10 +85,6 @@
         }
     };
 
-    // The empty-search result background
-    protected AllAppsBackgroundDrawable mEmptySearchBackground;
-    protected int mEmptySearchBackgroundTopOffset;
-
     public AllAppsRecyclerView(Context context) {
         this(context, null);
     }
@@ -108,9 +100,6 @@
     public AllAppsRecyclerView(Context context, AttributeSet attrs, int defStyleAttr,
             int defStyleRes) {
         super(context, attrs, defStyleAttr);
-        Resources res = getResources();
-        mEmptySearchBackgroundTopOffset = res.getDimensionPixelSize(
-                R.dimen.all_apps_empty_search_bg_top_offset);
         mNumAppsPerRow = LauncherAppState.getIDP(context).numColumns;
         mFastScrollHelper = new AllAppsFastScrollHelper(this);
     }
@@ -132,7 +121,6 @@
         int approxRows = (int) Math.ceil(grid.availableHeightPx / grid.allAppsIconSizePx);
         pool.setMaxRecycledViews(AllAppsGridAdapter.VIEW_TYPE_EMPTY_SEARCH, 1);
         pool.setMaxRecycledViews(AllAppsGridAdapter.VIEW_TYPE_ALL_APPS_DIVIDER, 1);
-        pool.setMaxRecycledViews(AllAppsGridAdapter.VIEW_TYPE_SEARCH_MARKET, 1);
         pool.setMaxRecycledViews(AllAppsGridAdapter.VIEW_TYPE_ICON, approxRows
                 * (mNumAppsPerRow + 1));
 
@@ -143,10 +131,6 @@
 
     @Override
     public void onDraw(Canvas c) {
-        // Draw the background
-        if (mEmptySearchBackground != null && mEmptySearchBackground.getAlpha() > 0) {
-            mEmptySearchBackground.draw(c);
-        }
         if (DEBUG) {
             Log.d(TAG, "onDraw at = " + System.currentTimeMillis());
         }
@@ -158,33 +142,13 @@
     }
 
     @Override
-    protected boolean verifyDrawable(Drawable who) {
-        return who == mEmptySearchBackground || super.verifyDrawable(who);
-    }
-
-    @Override
     protected void onSizeChanged(int w, int h, int oldw, int oldh) {
-        updateEmptySearchBackgroundBounds();
         updatePoolSize();
     }
 
     public void onSearchResultsChanged() {
         // Always scroll the view to the top so the user can see the changed results
         scrollToTop();
-
-        if (mApps.hasNoFilteredResults() && !FeatureFlags.ENABLE_DEVICE_SEARCH.get()) {
-            if (mEmptySearchBackground == null) {
-                mEmptySearchBackground = new AllAppsBackgroundDrawable(getContext());
-                mEmptySearchBackground.setAlpha(0);
-                mEmptySearchBackground.setCallback(this);
-                updateEmptySearchBackgroundBounds();
-            }
-            mEmptySearchBackground.animateBgAlpha(1f, 150);
-        } else if (mEmptySearchBackground != null) {
-            // For the time being, we just immediately hide the background to ensure that it does
-            // not overlap with the results
-            mEmptySearchBackground.setBgAlpha(0f);
-        }
     }
 
     @Override
@@ -208,16 +172,6 @@
         }
     }
 
-    @Override
-    public boolean onInterceptTouchEvent(MotionEvent e) {
-        boolean result = super.onInterceptTouchEvent(e);
-        if (!result && e.getAction() == MotionEvent.ACTION_DOWN
-                && mEmptySearchBackground != null && mEmptySearchBackground.getAlpha() > 0) {
-            mEmptySearchBackground.setHotspot(e.getX(), e.getY());
-        }
-        return result;
-    }
-
     /**
      * Maps the touch (from 0..1) to the adapter position that should be visible.
      */
@@ -393,22 +347,6 @@
         return mScrollbar;
     }
 
-    /**
-     * Updates the bounds of the empty search background.
-     */
-    private void updateEmptySearchBackgroundBounds() {
-        if (mEmptySearchBackground == null) {
-            return;
-        }
-
-        // Center the empty search background on this new view bounds
-        int x = (getMeasuredWidth() - mEmptySearchBackground.getIntrinsicWidth()) / 2;
-        int y = mEmptySearchBackgroundTopOffset;
-        mEmptySearchBackground.setBounds(x, y,
-                x + mEmptySearchBackground.getIntrinsicWidth(),
-                y + mEmptySearchBackground.getIntrinsicHeight());
-    }
-
     @Override
     public boolean hasOverlappingRendering() {
         return false;
diff --git a/src/com/android/launcher3/allapps/AllAppsTransitionController.java b/src/com/android/launcher3/allapps/AllAppsTransitionController.java
index bdab03f..ecc9d7e 100644
--- a/src/com/android/launcher3/allapps/AllAppsTransitionController.java
+++ b/src/com/android/launcher3/allapps/AllAppsTransitionController.java
@@ -232,7 +232,15 @@
                 // Reset pull back progress and alpha after switching states.
                 ALL_APPS_PULL_BACK_TRANSLATION.set(this, 0f);
                 ALL_APPS_PULL_BACK_ALPHA.set(this, 1f);
-                mLauncher.getAppsView().getSearchUiManager().getEditText().hideKeyboard();
+
+                // We only want to close the keyboard if the animation has completed successfully.
+                // The reason is that with keyboard sync, if the user swipes down from All Apps with
+                // the keyboard open and then changes their mind and swipes back up, we want the
+                // keyboard to remain open. However an onCancel signal is sent to the listeners
+                // (success = false), so we need to check for that.
+                if (success) {
+                    mLauncher.getAppsView().getSearchUiManager().getEditText().hideKeyboard();
+                }
             });
         }
 
diff --git a/src/com/android/launcher3/allapps/AlphabeticalAppsList.java b/src/com/android/launcher3/allapps/AlphabeticalAppsList.java
index 8bbe216..fc1b830 100644
--- a/src/com/android/launcher3/allapps/AlphabeticalAppsList.java
+++ b/src/com/android/launcher3/allapps/AlphabeticalAppsList.java
@@ -15,17 +15,12 @@
  */
 package com.android.launcher3.allapps;
 
-import static com.android.launcher3.allapps.BaseAllAppsAdapter.VIEW_TYPE_ALL_APPS_DIVIDER;
-import static com.android.launcher3.allapps.BaseAllAppsAdapter.VIEW_TYPE_EMPTY_SEARCH;
-import static com.android.launcher3.allapps.BaseAllAppsAdapter.VIEW_TYPE_SEARCH_MARKET;
-
 import android.content.Context;
 
 import androidx.annotation.Nullable;
 import androidx.recyclerview.widget.DiffUtil;
 
 import com.android.launcher3.allapps.BaseAllAppsAdapter.AdapterItem;
-import com.android.launcher3.config.FeatureFlags;
 import com.android.launcher3.model.data.AppInfo;
 import com.android.launcher3.model.data.ItemInfo;
 import com.android.launcher3.util.LabelComparator;
@@ -173,13 +168,6 @@
     }
 
     /**
-     * Returns whether there are no filtered results.
-     */
-    public boolean hasNoFilteredResults() {
-        return hasSearchResults() && mAccessibilityResultsCount == 0;
-    }
-
-    /**
      * Sets results list for search
      */
     public boolean setSearchResults(ArrayList<AdapterItem> results) {
@@ -249,15 +237,6 @@
         // ordered set of sections
         if (hasSearchResults()) {
             mAdapterItems.addAll(mSearchResults);
-            if (!FeatureFlags.ENABLE_DEVICE_SEARCH.get()) {
-                // Append the search market item
-                if (hasNoFilteredResults()) {
-                    mAdapterItems.add(new AdapterItem(VIEW_TYPE_EMPTY_SEARCH));
-                } else {
-                    mAdapterItems.add(new AdapterItem(VIEW_TYPE_ALL_APPS_DIVIDER));
-                }
-                mAdapterItems.add(new AdapterItem(VIEW_TYPE_SEARCH_MARKET));
-            }
         } else {
             int position = 0;
             if (mWorkProviderManager != null) {
diff --git a/src/com/android/launcher3/allapps/BaseAllAppsAdapter.java b/src/com/android/launcher3/allapps/BaseAllAppsAdapter.java
index 459fa88..6990e57 100644
--- a/src/com/android/launcher3/allapps/BaseAllAppsAdapter.java
+++ b/src/com/android/launcher3/allapps/BaseAllAppsAdapter.java
@@ -19,7 +19,6 @@
 
 import android.content.Context;
 import android.content.res.Resources;
-import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.View.OnClickListener;
@@ -54,19 +53,13 @@
     public static final int VIEW_TYPE_ICON = 1 << 1;
     // The message shown when there are no filtered results
     public static final int VIEW_TYPE_EMPTY_SEARCH = 1 << 2;
-    // The message to continue to a market search when there are no filtered results
-    public static final int VIEW_TYPE_SEARCH_MARKET = 1 << 3;
-
-    // We use various dividers for various purposes.  They share enough attributes to reuse layouts,
-    // but differ in enough attributes to require different view types
-
     // A divider that separates the apps list and the search market button
-    public static final int VIEW_TYPE_ALL_APPS_DIVIDER = 1 << 4;
+    public static final int VIEW_TYPE_ALL_APPS_DIVIDER = 1 << 3;
 
-    public static final int VIEW_TYPE_WORK_EDU_CARD = 1 << 5;
-    public static final int VIEW_TYPE_WORK_DISABLED_CARD = 1 << 6;
+    public static final int VIEW_TYPE_WORK_EDU_CARD = 1 << 4;
+    public static final int VIEW_TYPE_WORK_DISABLED_CARD = 1 << 5;
 
-    public static final int NEXT_ID = 7;
+    public static final int NEXT_ID = 6;
 
     // Common view type masks
     public static final int VIEW_TYPE_MASK_DIVIDER = VIEW_TYPE_ALL_APPS_DIVIDER;
@@ -117,7 +110,7 @@
         }
 
         protected boolean isCountedForAccessibility() {
-            return viewType == VIEW_TYPE_ICON || viewType == VIEW_TYPE_SEARCH_MARKET;
+            return viewType == VIEW_TYPE_ICON;
         }
 
         /**
@@ -139,15 +132,12 @@
     protected final T mActivityContext;
     protected final AlphabeticalAppsList<T> mApps;
     // The text to show when there are no search results and no market search handler.
-    protected String mEmptySearchMessage;
     protected int mAppsPerRow;
 
     protected final LayoutInflater mLayoutInflater;
     protected final OnClickListener mOnIconClickListener;
     protected OnLongClickListener mOnIconLongClickListener = INSTANCE_ALL_APPS;
     protected OnFocusChangeListener mIconFocusListener;
-    // The click listener to send off to the market app, updated each time the search query changes.
-    private OnClickListener mMarketSearchClickListener;
     private final int mExtraHeight;
 
     public BaseAllAppsAdapter(T activityContext, LayoutInflater inflater,
@@ -155,7 +145,6 @@
         Resources res = activityContext.getResources();
         mActivityContext = activityContext;
         mApps = apps;
-        mEmptySearchMessage = res.getString(R.string.all_apps_loading_message);
         mLayoutInflater = inflater;
 
         mOnIconClickListener = mActivityContext.getItemOnClickListener();
@@ -186,16 +175,6 @@
     }
 
     /**
-     * Sets the last search query that was made, used to show when there are no results and to also
-     * seed the intent for searching the market.
-     */
-    public void setLastSearchQuery(String query, OnClickListener marketSearchClickListener) {
-        Resources res = mActivityContext.getResources();
-        mEmptySearchMessage = res.getString(R.string.all_apps_no_search_results, query);
-        mMarketSearchClickListener = marketSearchClickListener;
-    }
-
-    /**
      * Returns the layout manager.
      */
     public abstract RecyclerView.LayoutManager getLayoutManager();
@@ -222,11 +201,6 @@
             case VIEW_TYPE_EMPTY_SEARCH:
                 return new ViewHolder(mLayoutInflater.inflate(R.layout.all_apps_empty_search,
                         parent, false));
-            case VIEW_TYPE_SEARCH_MARKET:
-                View searchMarketView = mLayoutInflater.inflate(R.layout.all_apps_search_market,
-                        parent, false);
-                searchMarketView.setOnClickListener(mMarketSearchClickListener);
-                return new ViewHolder(searchMarketView);
             case VIEW_TYPE_ALL_APPS_DIVIDER:
                 return new ViewHolder(mLayoutInflater.inflate(
                         R.layout.all_apps_divider, parent, false));
@@ -248,26 +222,21 @@
     @Override
     public void onBindViewHolder(ViewHolder holder, int position) {
         switch (holder.getItemViewType()) {
-            case VIEW_TYPE_ICON:
+            case VIEW_TYPE_ICON: {
                 AdapterItem adapterItem = mApps.getAdapterItems().get(position);
                 BubbleTextView icon = (BubbleTextView) holder.itemView;
                 icon.reset();
                 icon.applyFromApplicationInfo(adapterItem.itemInfo);
                 break;
-            case VIEW_TYPE_EMPTY_SEARCH:
-                TextView emptyViewText = (TextView) holder.itemView;
-                emptyViewText.setText(mEmptySearchMessage);
-                emptyViewText.setGravity(mApps.hasNoFilteredResults() ? Gravity.CENTER :
-                        Gravity.START | Gravity.CENTER_VERTICAL);
-                break;
-            case VIEW_TYPE_SEARCH_MARKET:
-                TextView searchView = (TextView) holder.itemView;
-                if (mMarketSearchClickListener != null) {
-                    searchView.setVisibility(View.VISIBLE);
-                } else {
-                    searchView.setVisibility(View.GONE);
+            }
+            case VIEW_TYPE_EMPTY_SEARCH: {
+                AppInfo info = mApps.getAdapterItems().get(position).itemInfo;
+                if (info != null) {
+                    ((TextView) holder.itemView).setText(mActivityContext.getString(
+                            R.string.all_apps_no_search_results, info.title));
                 }
                 break;
+            }
             case VIEW_TYPE_ALL_APPS_DIVIDER:
             case VIEW_TYPE_WORK_DISABLED_CARD:
                 // nothing to do
diff --git a/src/com/android/launcher3/allapps/WorkModeSwitch.java b/src/com/android/launcher3/allapps/WorkModeSwitch.java
index aee7c4c..fedc91f 100644
--- a/src/com/android/launcher3/allapps/WorkModeSwitch.java
+++ b/src/com/android/launcher3/allapps/WorkModeSwitch.java
@@ -91,12 +91,12 @@
         MarginLayoutParams lp = (MarginLayoutParams) getLayoutParams();
         if (lp != null) {
             int bottomMargin = getResources().getDimensionPixelSize(R.dimen.work_fab_margin_bottom);
+            DeviceProfile dp = ActivityContext.lookupContext(getContext()).getDeviceProfile();
             if (FeatureFlags.ENABLE_FLOATING_SEARCH_BAR.get()) {
                 bottomMargin <<= 1;  // Double margin to add space above search bar.
-                bottomMargin += getResources().getDimensionPixelSize(R.dimen.qsb_widget_height);
+                bottomMargin += dp.hotseatQsbHeight;
             }
 
-            DeviceProfile dp = ActivityContext.lookupContext(getContext()).getDeviceProfile();
             if (!dp.isGestureMode) {
                 if (dp.isTaskbarPresent) {
                     bottomMargin += dp.taskbarSize;
diff --git a/src/com/android/launcher3/allapps/search/AppsSearchContainerLayout.java b/src/com/android/launcher3/allapps/search/AppsSearchContainerLayout.java
index 6539c05..52d8f63 100644
--- a/src/com/android/launcher3/allapps/search/AppsSearchContainerLayout.java
+++ b/src/com/android/launcher3/allapps/search/AppsSearchContainerLayout.java
@@ -131,7 +131,7 @@
     public void initializeSearch(ActivityAllAppsContainerView<?> appsView) {
         mAppsView = appsView;
         mSearchBarController.initialize(
-                new DefaultAppSearchAlgorithm(getContext()),
+                new DefaultAppSearchAlgorithm(getContext(), true),
                 this, mLauncher, this);
     }
 
diff --git a/src/com/android/launcher3/allapps/search/DefaultAppSearchAlgorithm.java b/src/com/android/launcher3/allapps/search/DefaultAppSearchAlgorithm.java
index 4eceb71..d2d7a6c 100644
--- a/src/com/android/launcher3/allapps/search/DefaultAppSearchAlgorithm.java
+++ b/src/com/android/launcher3/allapps/search/DefaultAppSearchAlgorithm.java
@@ -15,6 +15,7 @@
  */
 package com.android.launcher3.allapps.search;
 
+import static com.android.launcher3.allapps.BaseAllAppsAdapter.VIEW_TYPE_EMPTY_SEARCH;
 import static com.android.launcher3.util.Executors.MAIN_EXECUTOR;
 
 import android.content.Context;
@@ -44,10 +45,16 @@
 
     private final LauncherAppState mAppState;
     private final Handler mResultHandler;
+    private final boolean mAddNoResultsMessage;
 
     public DefaultAppSearchAlgorithm(Context context) {
+        this(context, false);
+    }
+
+    public DefaultAppSearchAlgorithm(Context context, boolean addNoResultsMessage) {
         mAppState = LauncherAppState.getInstance(context);
         mResultHandler = new Handler(MAIN_EXECUTOR.getLooper());
+        mAddNoResultsMessage = addNoResultsMessage;
     }
 
     @Override
@@ -63,11 +70,23 @@
             @Override
             public void execute(LauncherAppState app, BgDataModel dataModel, AllAppsList apps) {
                 ArrayList<AdapterItem> result = getTitleMatchResult(apps.data, query);
+                if (mAddNoResultsMessage && result.isEmpty()) {
+                    result.add(getEmptyMessageAdapterItem(query));
+                }
                 mResultHandler.post(() -> callback.onSearchResult(query, result));
             }
         });
     }
 
+    private static AdapterItem getEmptyMessageAdapterItem(String query) {
+        AdapterItem item = new AdapterItem(VIEW_TYPE_EMPTY_SEARCH);
+        // Add a place holder info to propagate the query
+        AppInfo placeHolder = new AppInfo();
+        placeHolder.title = query;
+        item.itemInfo = placeHolder;
+        return item;
+    }
+
     /**
      * Filters {@link AppInfo}s matching specified query
      */
diff --git a/src/com/android/launcher3/compat/AccessibilityManagerCompat.java b/src/com/android/launcher3/compat/AccessibilityManagerCompat.java
index dd58123..770e931 100644
--- a/src/com/android/launcher3/compat/AccessibilityManagerCompat.java
+++ b/src/com/android/launcher3/compat/AccessibilityManagerCompat.java
@@ -27,7 +27,7 @@
 import androidx.annotation.Nullable;
 
 import com.android.launcher3.Utilities;
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 
 public class AccessibilityManagerCompat {
 
diff --git a/src/com/android/launcher3/dragndrop/DragController.java b/src/com/android/launcher3/dragndrop/DragController.java
index 35cdfef..8616f35 100644
--- a/src/com/android/launcher3/dragndrop/DragController.java
+++ b/src/com/android/launcher3/dragndrop/DragController.java
@@ -34,7 +34,7 @@
 import com.android.launcher3.logging.InstanceId;
 import com.android.launcher3.model.data.ItemInfo;
 import com.android.launcher3.model.data.WorkspaceItemInfo;
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 import com.android.launcher3.util.TouchController;
 import com.android.launcher3.views.ActivityContext;
 
diff --git a/src/com/android/launcher3/dragndrop/LauncherDragController.java b/src/com/android/launcher3/dragndrop/LauncherDragController.java
index dcbfa50..75f4ad6 100644
--- a/src/com/android/launcher3/dragndrop/LauncherDragController.java
+++ b/src/com/android/launcher3/dragndrop/LauncherDragController.java
@@ -37,7 +37,7 @@
 import com.android.launcher3.R;
 import com.android.launcher3.accessibility.DragViewStateAnnouncer;
 import com.android.launcher3.model.data.ItemInfo;
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 
 /**
  * Drag controller for Launcher activity
diff --git a/src/com/android/launcher3/graphics/ShadowDrawable.java b/src/com/android/launcher3/graphics/ShadowDrawable.java
deleted file mode 100644
index d8a7070..0000000
--- a/src/com/android/launcher3/graphics/ShadowDrawable.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.launcher3.graphics;
-
-import android.annotation.TargetApi;
-import android.content.res.Resources;
-import android.content.res.TypedArray;
-import android.graphics.Bitmap;
-import android.graphics.BlurMaskFilter;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.ColorFilter;
-import android.graphics.Paint;
-import android.graphics.PixelFormat;
-import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
-import android.os.Build;
-import android.util.AttributeSet;
-
-import com.android.launcher3.R;
-import com.android.launcher3.icons.BitmapRenderer;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.IOException;
-
-/**
- * A drawable which adds shadow around a child drawable.
- */
-@TargetApi(Build.VERSION_CODES.O)
-public class ShadowDrawable extends Drawable {
-
-    private final Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
-
-    private final ShadowDrawableState mState;
-
-    @SuppressWarnings("unused")
-    public ShadowDrawable() {
-        this(new ShadowDrawableState());
-    }
-
-    private ShadowDrawable(ShadowDrawableState state) {
-        mState = state;
-    }
-
-    @Override
-    public void draw(Canvas canvas) {
-        Rect bounds = getBounds();
-        if (bounds.isEmpty()) {
-            return;
-        }
-        if (mState.mLastDrawnBitmap == null) {
-            regenerateBitmapCache();
-        }
-        canvas.drawBitmap(mState.mLastDrawnBitmap, null, bounds, mPaint);
-    }
-
-    @Override
-    public void setAlpha(int alpha) {
-        mPaint.setAlpha(alpha);
-        invalidateSelf();
-    }
-
-    @Override
-    public void setColorFilter(ColorFilter colorFilter) {
-        mPaint.setColorFilter(colorFilter);
-        invalidateSelf();
-    }
-
-    @Override
-    public ConstantState getConstantState() {
-        return mState;
-    }
-
-    @Override
-    public int getOpacity() {
-        return PixelFormat.TRANSLUCENT;
-    }
-
-    @Override
-    public int getIntrinsicHeight() {
-        return mState.mIntrinsicHeight;
-    }
-
-    @Override
-    public int getIntrinsicWidth() {
-        return mState.mIntrinsicWidth;
-    }
-
-    @Override
-    public boolean canApplyTheme() {
-        return mState.canApplyTheme();
-    }
-
-    @Override
-    public void applyTheme(Resources.Theme t) {
-        TypedArray ta = t.obtainStyledAttributes(new int[] {R.attr.isWorkspaceDarkText});
-        boolean isDark = ta.getBoolean(0, false);
-        ta.recycle();
-        if (mState.mIsDark != isDark) {
-            mState.mIsDark = isDark;
-            mState.mLastDrawnBitmap = null;
-            invalidateSelf();
-        }
-    }
-
-    private void regenerateBitmapCache() {
-        // Call mutate, so that the pixel allocation by the underlying vector drawable is cleared.
-        Drawable d = mState.mChildState.newDrawable().mutate();
-        d.setBounds(mState.mShadowSize, mState.mShadowSize,
-                mState.mIntrinsicWidth - mState.mShadowSize,
-                mState.mIntrinsicHeight - mState.mShadowSize);
-        d.setTint(mState.mIsDark ? mState.mDarkTintColor : Color.WHITE);
-
-        if (mState.mIsDark) {
-            // Dark text do not have any shadow, but just the bitmap
-            mState.mLastDrawnBitmap = BitmapRenderer.createHardwareBitmap(
-                    mState.mIntrinsicWidth, mState.mIntrinsicHeight, d::draw);
-        } else {
-            Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
-            paint.setMaskFilter(new BlurMaskFilter(mState.mShadowSize, BlurMaskFilter.Blur.NORMAL));
-
-            // Generate the shadow bitmap
-            int[] offset = new int[2];
-            Bitmap shadow = BitmapRenderer.createSoftwareBitmap(
-                    mState.mIntrinsicWidth, mState.mIntrinsicHeight, d::draw)
-                    .extractAlpha(paint, offset);
-
-            paint.setMaskFilter(null);
-            paint.setColor(mState.mShadowColor);
-            mState.mLastDrawnBitmap = BitmapRenderer.createHardwareBitmap(
-                    mState.mIntrinsicWidth, mState.mIntrinsicHeight, c -> {
-                        c.drawBitmap(shadow, offset[0], offset[1], paint);
-                        d.draw(c);
-                    });
-        }
-    }
-
-    @Override
-    public void inflate(Resources r, XmlPullParser parser, AttributeSet attrs,
-            Resources.Theme theme) throws XmlPullParserException, IOException {
-        super.inflate(r, parser, attrs, theme);
-
-        final TypedArray a = theme == null
-                ? r.obtainAttributes(attrs, R.styleable.ShadowDrawable)
-                : theme.obtainStyledAttributes(attrs, R.styleable.ShadowDrawable, 0, 0);
-        try {
-            Drawable d = a.getDrawable(R.styleable.ShadowDrawable_android_src);
-            if (d == null) {
-                throw new XmlPullParserException("missing src attribute");
-            }
-            mState.mShadowColor = a.getColor(
-                    R.styleable.ShadowDrawable_android_shadowColor, Color.BLACK);
-            mState.mShadowSize = a.getDimensionPixelSize(
-                    R.styleable.ShadowDrawable_android_elevation, 0);
-            mState.mDarkTintColor = a.getColor(
-                    R.styleable.ShadowDrawable_darkTintColor, Color.BLACK);
-
-            mState.mIntrinsicHeight = d.getIntrinsicHeight() + 2 * mState.mShadowSize;
-            mState.mIntrinsicWidth = d.getIntrinsicWidth() + 2 * mState.mShadowSize;
-            mState.mChangingConfigurations = d.getChangingConfigurations();
-
-            mState.mChildState = d.getConstantState();
-        } finally {
-            a.recycle();
-        }
-    }
-
-    private static class ShadowDrawableState extends ConstantState {
-
-        int mChangingConfigurations;
-        int mIntrinsicWidth;
-        int mIntrinsicHeight;
-
-        int mShadowColor;
-        int mShadowSize;
-        int mDarkTintColor;
-
-        boolean mIsDark;
-        Bitmap mLastDrawnBitmap;
-        ConstantState mChildState;
-
-        @Override
-        public Drawable newDrawable() {
-            return new ShadowDrawable(this);
-        }
-
-        @Override
-        public int getChangingConfigurations() {
-            return mChangingConfigurations;
-        }
-
-        @Override
-        public boolean canApplyTheme() {
-            return true;
-        }
-    }
-}
diff --git a/src/com/android/launcher3/graphics/SysUiScrim.java b/src/com/android/launcher3/graphics/SysUiScrim.java
index f0766c5..185b8d3 100644
--- a/src/com/android/launcher3/graphics/SysUiScrim.java
+++ b/src/com/android/launcher3/graphics/SysUiScrim.java
@@ -43,7 +43,7 @@
 
 import com.android.launcher3.BaseDraggingActivity;
 import com.android.launcher3.R;
-import com.android.launcher3.ResourceUtils;
+import com.android.launcher3.testing.shared.ResourceUtils;
 import com.android.launcher3.Utilities;
 import com.android.launcher3.config.FeatureFlags;
 import com.android.launcher3.util.DynamicResource;
diff --git a/src/com/android/launcher3/model/AddWorkspaceItemsTask.java b/src/com/android/launcher3/model/AddWorkspaceItemsTask.java
index 31ef2e5..4c0f1ae 100644
--- a/src/com/android/launcher3/model/AddWorkspaceItemsTask.java
+++ b/src/com/android/launcher3/model/AddWorkspaceItemsTask.java
@@ -36,7 +36,7 @@
 import com.android.launcher3.model.data.WorkspaceItemInfo;
 import com.android.launcher3.pm.InstallSessionHelper;
 import com.android.launcher3.pm.PackageInstallInfo;
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 import com.android.launcher3.util.IntArray;
 import com.android.launcher3.util.PackageManagerHelper;
 
diff --git a/src/com/android/launcher3/model/AllAppsList.java b/src/com/android/launcher3/model/AllAppsList.java
index 4875d83..95150dc 100644
--- a/src/com/android/launcher3/model/AllAppsList.java
+++ b/src/com/android/launcher3/model/AllAppsList.java
@@ -18,6 +18,7 @@
 
 import static com.android.launcher3.model.data.AppInfo.COMPONENT_KEY_COMPARATOR;
 import static com.android.launcher3.model.data.AppInfo.EMPTY_ARRAY;
+import static com.android.launcher3.testing.shared.TestProtocol.INCORRECT_INFO_UPDATED;
 
 import android.content.ComponentName;
 import android.content.Context;
@@ -38,6 +39,7 @@
 import com.android.launcher3.model.data.AppInfo;
 import com.android.launcher3.model.data.ItemInfo;
 import com.android.launcher3.pm.PackageInstallInfo;
+import com.android.launcher3.testing.shared.TestProtocol;
 import com.android.launcher3.util.FlagOp;
 import com.android.launcher3.util.PackageManagerHelper;
 import com.android.launcher3.util.SafeCloseable;
@@ -270,8 +272,14 @@
     }
 
     public void updateIconsAndLabels(HashSet<String> packages, UserHandle user) {
+        if (TestProtocol.sDebugTracing) {
+            Log.i(INCORRECT_INFO_UPDATED, "updateIconsAndLabels: packages=" + packages);
+        }
         for (AppInfo info : data) {
             if (info.user.equals(user) && packages.contains(info.componentName.getPackageName())) {
+                if (TestProtocol.sDebugTracing) {
+                    Log.i(INCORRECT_INFO_UPDATED, "updateIconsAndLabels: updating info=" + info);
+                }
                 mIconCache.updateTitleAndIcon(info);
                 info.sectionName = mIndex.computeSectionName(info.title);
                 mDataChanged = true;
diff --git a/src/com/android/launcher3/model/BaseLoaderResults.java b/src/com/android/launcher3/model/BaseLoaderResults.java
index b50ab58..8c6428b 100644
--- a/src/com/android/launcher3/model/BaseLoaderResults.java
+++ b/src/com/android/launcher3/model/BaseLoaderResults.java
@@ -33,7 +33,7 @@
 import com.android.launcher3.model.data.AppInfo;
 import com.android.launcher3.model.data.ItemInfo;
 import com.android.launcher3.model.data.LauncherAppWidgetInfo;
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 import com.android.launcher3.util.IntArray;
 import com.android.launcher3.util.IntSet;
 import com.android.launcher3.util.LooperExecutor;
diff --git a/src/com/android/launcher3/model/ItemInstallQueue.java b/src/com/android/launcher3/model/ItemInstallQueue.java
index 5a220f7..229bb2d 100644
--- a/src/com/android/launcher3/model/ItemInstallQueue.java
+++ b/src/com/android/launcher3/model/ItemInstallQueue.java
@@ -49,7 +49,7 @@
 import com.android.launcher3.model.data.WorkspaceItemInfo;
 import com.android.launcher3.shortcuts.ShortcutKey;
 import com.android.launcher3.shortcuts.ShortcutRequest;
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 import com.android.launcher3.util.MainThreadInitializedObject;
 import com.android.launcher3.util.PersistedItemArray;
 import com.android.launcher3.util.Preconditions;
diff --git a/src/com/android/launcher3/model/ModelUtils.java b/src/com/android/launcher3/model/ModelUtils.java
index 422af43..1ced0b1 100644
--- a/src/com/android/launcher3/model/ModelUtils.java
+++ b/src/com/android/launcher3/model/ModelUtils.java
@@ -29,7 +29,7 @@
 import com.android.launcher3.icons.LauncherIcons;
 import com.android.launcher3.model.data.ItemInfo;
 import com.android.launcher3.model.data.WorkspaceItemInfo;
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 import com.android.launcher3.util.IntArray;
 import com.android.launcher3.util.IntSet;
 
diff --git a/src/com/android/launcher3/pm/InstallSessionHelper.java b/src/com/android/launcher3/pm/InstallSessionHelper.java
index 618f926..9da6670 100644
--- a/src/com/android/launcher3/pm/InstallSessionHelper.java
+++ b/src/com/android/launcher3/pm/InstallSessionHelper.java
@@ -39,7 +39,7 @@
 import com.android.launcher3.config.FeatureFlags;
 import com.android.launcher3.logging.FileLog;
 import com.android.launcher3.model.ItemInstallQueue;
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 import com.android.launcher3.util.IntArray;
 import com.android.launcher3.util.IntSet;
 import com.android.launcher3.util.MainThreadInitializedObject;
diff --git a/src/com/android/launcher3/pm/InstallSessionTracker.java b/src/com/android/launcher3/pm/InstallSessionTracker.java
index 75cf7a8..b16aaa2 100644
--- a/src/com/android/launcher3/pm/InstallSessionTracker.java
+++ b/src/com/android/launcher3/pm/InstallSessionTracker.java
@@ -30,7 +30,7 @@
 
 import androidx.annotation.WorkerThread;
 
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 import com.android.launcher3.util.PackageUserKey;
 
 import java.lang.ref.WeakReference;
diff --git a/src/com/android/launcher3/states/RotationHelper.java b/src/com/android/launcher3/states/RotationHelper.java
index 38b62d4..fd8b2e5 100644
--- a/src/com/android/launcher3/states/RotationHelper.java
+++ b/src/com/android/launcher3/states/RotationHelper.java
@@ -23,19 +23,21 @@
 import static com.android.launcher3.Utilities.dpiFromPx;
 import static com.android.launcher3.util.window.WindowManagerProxy.MIN_TABLET_WIDTH;
 
+import android.content.Context;
 import android.content.SharedPreferences;
 import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
 
 import com.android.launcher3.BaseActivity;
 import com.android.launcher3.DeviceProfile;
 import com.android.launcher3.Utilities;
+import com.android.launcher3.util.DisplayController;
 import com.android.launcher3.util.UiThreadHelper;
 
 /**
  * Utility class to manage launcher rotation
  */
 public class RotationHelper implements OnSharedPreferenceChangeListener,
-        DeviceProfile.OnDeviceProfileChangeListener {
+        DisplayController.DisplayInfoChangeListener {
 
     private static final String TAG = "RotationHelper";
 
@@ -119,8 +121,8 @@
     }
 
     @Override
-    public void onDeviceProfileChanged(DeviceProfile dp) {
-        boolean ignoreAutoRotateSettings = dp.isTablet;
+    public void onDisplayInfoChanged(Context context, DisplayController.Info info, int flags) {
+        boolean ignoreAutoRotateSettings = info.isTablet(info.realBounds);
         if (mIgnoreAutoRotateSettings != ignoreAutoRotateSettings) {
             setIgnoreAutoRotateSettings(ignoreAutoRotateSettings);
             notifyChange();
@@ -157,8 +159,10 @@
     public void initialize() {
         if (!mInitialized) {
             mInitialized = true;
-            setIgnoreAutoRotateSettings(mActivity.getDeviceProfile().isTablet);
-            mActivity.addOnDeviceProfileChangeListener(this);
+            DisplayController displayController = DisplayController.INSTANCE.get(mActivity);
+            DisplayController.Info info = displayController.getInfo();
+            setIgnoreAutoRotateSettings(info.isTablet(info.realBounds));
+            displayController.addChangeListener(this);
             notifyChange();
         }
     }
@@ -166,7 +170,7 @@
     public void destroy() {
         if (!mDestroyed) {
             mDestroyed = true;
-            mActivity.removeOnDeviceProfileChangeListener(this);
+            DisplayController.INSTANCE.get(mActivity).removeChangeListener(this);
             mActivity = null;
             if (mSharedPrefs != null) {
                 mSharedPrefs.unregisterOnSharedPreferenceChangeListener(this);
diff --git a/src/com/android/launcher3/states/SpringLoadedState.java b/src/com/android/launcher3/states/SpringLoadedState.java
index a205ab5..b63715c 100644
--- a/src/com/android/launcher3/states/SpringLoadedState.java
+++ b/src/com/android/launcher3/states/SpringLoadedState.java
@@ -52,13 +52,13 @@
         }
 
         float shrunkTop = grid.getCellLayoutSpringLoadShrunkTop();
-        float scale = grid.getWorkspaceSpringLoadScale();
+        float scale = grid.getWorkspaceSpringLoadScale(launcher);
 
         float halfHeight = ws.getHeight() / 2;
         float myCenter = ws.getTop() + halfHeight;
         float cellTopFromCenter = halfHeight - ws.getChildAt(0).getTop();
         float actualCellTop = myCenter - cellTopFromCenter * scale;
-        return new ScaleAndTranslation(scale, 0, (shrunkTop - actualCellTop) / scale);
+        return new ScaleAndTranslation(scale, 0, shrunkTop - actualCellTop);
     }
 
     @Override
diff --git a/src/com/android/launcher3/states/StateAnimationConfig.java b/src/com/android/launcher3/states/StateAnimationConfig.java
index f99519d..54735f0 100644
--- a/src/com/android/launcher3/states/StateAnimationConfig.java
+++ b/src/com/android/launcher3/states/StateAnimationConfig.java
@@ -64,6 +64,8 @@
             ANIM_DEPTH,
             ANIM_OVERVIEW_ACTIONS_FADE,
             ANIM_WORKSPACE_PAGE_TRANSLATE_X,
+            ANIM_OVERVIEW_SPLIT_SELECT_FLOATING_TASK_TRANSLATE_OFFSCREEN,
+            ANIM_OVERVIEW_SPLIT_SELECT_INSTRUCTIONS_FADE
     })
     @Retention(RetentionPolicy.SOURCE)
     public @interface AnimType {}
@@ -84,8 +86,10 @@
     public static final int ANIM_DEPTH = 13;
     public static final int ANIM_OVERVIEW_ACTIONS_FADE = 14;
     public static final int ANIM_WORKSPACE_PAGE_TRANSLATE_X = 15;
+    public static final int ANIM_OVERVIEW_SPLIT_SELECT_FLOATING_TASK_TRANSLATE_OFFSCREEN = 17;
+    public static final int ANIM_OVERVIEW_SPLIT_SELECT_INSTRUCTIONS_FADE = 18;
 
-    private static final int ANIM_TYPES_COUNT = 17;
+    private static final int ANIM_TYPES_COUNT = 19;
 
     protected final Interpolator[] mInterpolators = new Interpolator[ANIM_TYPES_COUNT];
 
diff --git a/src/com/android/launcher3/testing/TestInformationHandler.java b/src/com/android/launcher3/testing/TestInformationHandler.java
index 0334b96..d3c9bc9 100644
--- a/src/com/android/launcher3/testing/TestInformationHandler.java
+++ b/src/com/android/launcher3/testing/TestInformationHandler.java
@@ -41,6 +41,9 @@
 import com.android.launcher3.R;
 import com.android.launcher3.Workspace;
 import com.android.launcher3.dragndrop.DragLayer;
+import com.android.launcher3.testing.shared.HotseatCellCenterRequest;
+import com.android.launcher3.testing.shared.TestProtocol;
+import com.android.launcher3.testing.shared.WorkspaceCellCenterRequest;
 import com.android.launcher3.util.ResourceBasedOverride;
 import com.android.launcher3.widget.picker.WidgetsFullSheet;
 
diff --git a/src/com/android/launcher3/testing/TestLogging.java b/src/com/android/launcher3/testing/TestLogging.java
index 103b565..c151606 100644
--- a/src/com/android/launcher3/testing/TestLogging.java
+++ b/src/com/android/launcher3/testing/TestLogging.java
@@ -22,6 +22,7 @@
 import android.view.MotionEvent;
 
 import com.android.launcher3.Utilities;
+import com.android.launcher3.testing.shared.TestProtocol;
 
 import java.util.function.BiConsumer;
 
diff --git a/src/com/android/launcher3/testing/HotseatCellCenterRequest.java b/src/com/android/launcher3/testing/shared/HotseatCellCenterRequest.java
similarity index 98%
rename from src/com/android/launcher3/testing/HotseatCellCenterRequest.java
rename to src/com/android/launcher3/testing/shared/HotseatCellCenterRequest.java
index cbb847e..7eb035a 100644
--- a/src/com/android/launcher3/testing/HotseatCellCenterRequest.java
+++ b/src/com/android/launcher3/testing/shared/HotseatCellCenterRequest.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.launcher3.testing;
+package com.android.launcher3.testing.shared;
 
 import android.os.Parcel;
 import android.os.Parcelable;
diff --git a/src/com/android/launcher3/ResourceUtils.java b/src/com/android/launcher3/testing/shared/ResourceUtils.java
similarity index 71%
rename from src/com/android/launcher3/ResourceUtils.java
rename to src/com/android/launcher3/testing/shared/ResourceUtils.java
index f709aca..551aeaf 100644
--- a/src/com/android/launcher3/ResourceUtils.java
+++ b/src/com/android/launcher3/testing/shared/ResourceUtils.java
@@ -14,13 +14,14 @@
  * limitations under the License.
  */
 
-package com.android.launcher3;
+package com.android.launcher3.testing.shared;
 
 import android.content.res.Resources;
 import android.util.DisplayMetrics;
 import android.util.TypedValue;
 
 public class ResourceUtils {
+    private static final float EPSILON = 0.0001f;
     public static final int DEFAULT_NAVBAR_VALUE = 48;
     public static final int INVALID_RESOURCE_HANDLE = -1;
     public static final String NAVBAR_LANDSCAPE_LEFT_RIGHT_SIZE = "navigation_bar_width";
@@ -71,7 +72,25 @@
     }
 
     public static int pxFromDp(float size, DisplayMetrics metrics, float scale) {
-        return size < 0 ? INVALID_RESOURCE_HANDLE : Math.round(scale
-                * TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, size, metrics));
+        float value = scale * TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, size, metrics);
+        return size < 0 ? INVALID_RESOURCE_HANDLE : roundPxValueFromFloat(value);
+    }
+
+    /**
+     * Rounds a pixel value, taking into account floating point errors.
+     *
+     * <p>If a dp (or sp) value typically returns a half pixel, such as 20dp at a 2.625 density
+     * returning 52.5px, there is a small chance that due to floating-point errors, the value will
+     * be stored as 52.499999. As we round to the nearest pixel, this could cause a 1px difference
+     * in final values, which we correct for in this method.
+     */
+    public static int roundPxValueFromFloat(float value) {
+        float fraction = (float) (value - Math.floor(value));
+        if (Math.abs(0.5f - fraction) < EPSILON) {
+            // Note: we add for negative values as well, as Math.round brings -.5 to the next
+            // "highest" value, e.g. Math.round(-2.5) == -2 [i.e. (int)Math.floor(a + 0.5d)]
+            value += EPSILON;
+        }
+        return Math.round(value);
     }
 }
diff --git a/src/com/android/launcher3/testing/TestInformationRequest.java b/src/com/android/launcher3/testing/shared/TestInformationRequest.java
similarity index 94%
rename from src/com/android/launcher3/testing/TestInformationRequest.java
rename to src/com/android/launcher3/testing/shared/TestInformationRequest.java
index 272ae56..38282032 100644
--- a/src/com/android/launcher3/testing/TestInformationRequest.java
+++ b/src/com/android/launcher3/testing/shared/TestInformationRequest.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.launcher3.testing;
+package com.android.launcher3.testing.shared;
 
 import android.os.Parcelable;
 
diff --git a/src/com/android/launcher3/testing/TestProtocol.java b/src/com/android/launcher3/testing/shared/TestProtocol.java
similarity index 98%
rename from src/com/android/launcher3/testing/TestProtocol.java
rename to src/com/android/launcher3/testing/shared/TestProtocol.java
index 9bc9067..67efb58 100644
--- a/src/com/android/launcher3/testing/TestProtocol.java
+++ b/src/com/android/launcher3/testing/shared/TestProtocol.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.launcher3.testing;
+package com.android.launcher3.testing.shared;
 
 /**
  * Protocol for custom accessibility events for communication with UI Automation tests.
@@ -136,8 +136,8 @@
     public static final String NO_DROP_TARGET = "b/195031154";
     public static final String NULL_INT_SET = "b/200572078";
     public static final String MISSING_PROMISE_ICON = "b/202985412";
-    public static final String BAD_STATE = "b/223498680";
     public static final String TASKBAR_IN_APP_STATE = "b/227657604";
+    public static final String INCORRECT_INFO_UPDATED = "b/239465630";
 
     public static final String REQUEST_EMULATE_DISPLAY = "emulate-display";
     public static final String REQUEST_STOP_EMULATE_DISPLAY = "stop-emulate-display";
diff --git a/src/com/android/launcher3/testing/WorkspaceCellCenterRequest.java b/src/com/android/launcher3/testing/shared/WorkspaceCellCenterRequest.java
similarity index 98%
rename from src/com/android/launcher3/testing/WorkspaceCellCenterRequest.java
rename to src/com/android/launcher3/testing/shared/WorkspaceCellCenterRequest.java
index 71ab09f..80dbef8 100644
--- a/src/com/android/launcher3/testing/WorkspaceCellCenterRequest.java
+++ b/src/com/android/launcher3/testing/shared/WorkspaceCellCenterRequest.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.launcher3.testing;
+package com.android.launcher3.testing.shared;
 
 import android.os.Parcel;
 import android.os.Parcelable;
diff --git a/src/com/android/launcher3/touch/ItemClickHandler.java b/src/com/android/launcher3/touch/ItemClickHandler.java
index e95a787..5fa30bc 100644
--- a/src/com/android/launcher3/touch/ItemClickHandler.java
+++ b/src/com/android/launcher3/touch/ItemClickHandler.java
@@ -61,7 +61,7 @@
 import com.android.launcher3.pm.InstallSessionHelper;
 import com.android.launcher3.shortcuts.ShortcutKey;
 import com.android.launcher3.testing.TestLogging;
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 import com.android.launcher3.util.ItemInfoMatcher;
 import com.android.launcher3.util.PackageManagerHelper;
 import com.android.launcher3.views.FloatingIconView;
diff --git a/src/com/android/launcher3/touch/ItemLongClickListener.java b/src/com/android/launcher3/touch/ItemLongClickListener.java
index 53cd416..73f994f 100644
--- a/src/com/android/launcher3/touch/ItemLongClickListener.java
+++ b/src/com/android/launcher3/touch/ItemLongClickListener.java
@@ -36,7 +36,7 @@
 import com.android.launcher3.logging.StatsLogManager.StatsLogger;
 import com.android.launcher3.model.data.ItemInfo;
 import com.android.launcher3.testing.TestLogging;
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 import com.android.launcher3.views.BubbleTextHolder;
 import com.android.launcher3.widget.LauncherAppWidgetHostView;
 
diff --git a/src/com/android/launcher3/touch/LandscapePagedViewHandler.java b/src/com/android/launcher3/touch/LandscapePagedViewHandler.java
index fa4eb70..9ac1c0e 100644
--- a/src/com/android/launcher3/touch/LandscapePagedViewHandler.java
+++ b/src/com/android/launcher3/touch/LandscapePagedViewHandler.java
@@ -523,6 +523,7 @@
         iconParams.rightMargin = -taskIconHeight - taskIconMargin / 2;
         iconParams.leftMargin = 0;
         iconParams.topMargin = thumbnailTopMargin / 2;
+        iconParams.bottomMargin = 0;
     }
 
     @Override
@@ -580,4 +581,22 @@
             FloatProperty secondary, DeviceProfile deviceProfile) {
         return new Pair<>(primary, secondary);
     }
+
+    @Override
+    public float getFloatingTaskOffscreenTranslationTarget(View floatingTask, RectF onScreenRect,
+            @StagePosition int stagePosition, DeviceProfile dp) {
+        float currentTranslationY = floatingTask.getTranslationY();
+        return currentTranslationY - onScreenRect.height();
+    }
+
+    @Override
+    public void setFloatingTaskPrimaryTranslation(View floatingTask, float translation,
+            DeviceProfile dp) {
+        floatingTask.setTranslationY(translation);
+    }
+
+    @Override
+    public Float getFloatingTaskPrimaryTranslation(View floatingTask, DeviceProfile dp) {
+        return floatingTask.getTranslationY();
+    }
 }
diff --git a/src/com/android/launcher3/touch/PagedOrientationHandler.java b/src/com/android/launcher3/touch/PagedOrientationHandler.java
index 6bc021b..1a8d355 100644
--- a/src/com/android/launcher3/touch/PagedOrientationHandler.java
+++ b/src/com/android/launcher3/touch/PagedOrientationHandler.java
@@ -34,9 +34,9 @@
 
 import com.android.launcher3.DeviceProfile;
 import com.android.launcher3.util.SplitConfigurationOptions;
+import com.android.launcher3.util.SplitConfigurationOptions.SplitBounds;
 import com.android.launcher3.util.SplitConfigurationOptions.SplitPositionOption;
 import com.android.launcher3.util.SplitConfigurationOptions.StagePosition;
-import com.android.launcher3.util.SplitConfigurationOptions.SplitBounds;
 
 import java.util.List;
 
@@ -242,6 +242,41 @@
      */
     void fixBoundsForHomeAnimStartRect(RectF outStartRect, DeviceProfile deviceProfile);
 
+    /**
+     * Determine the target translation for animating the FloatingTaskView out. This value could
+     * either be an x-coordinate or a y-coordinate, depending on which way the FloatingTaskView was
+     * docked.
+     *
+     * @param floatingTask The FloatingTaskView.
+     * @param onScreenRect The current on-screen dimensions of the FloatingTaskView.
+     * @param stagePosition STAGE_POSITION_TOP_OR_LEFT or STAGE_POSITION_BOTTOM_OR_RIGHT.
+     * @param dp The device profile.
+     * @return A float. When an animation translates the FloatingTaskView to this position, it will
+     * appear to tuck away off the edge of the screen.
+     */
+    float getFloatingTaskOffscreenTranslationTarget(View floatingTask, RectF onScreenRect,
+            @StagePosition int stagePosition, DeviceProfile dp);
+
+    /**
+     * Sets the translation of a FloatingTaskView along its "slide-in/slide-out" axis (could be
+     * either x or y), depending on how the view is oriented.
+     *
+     * @param floatingTask The FloatingTaskView to be translated.
+     * @param translation The target translation value.
+     * @param dp The current device profile.
+     */
+    void setFloatingTaskPrimaryTranslation(View floatingTask, float translation, DeviceProfile dp);
+
+    /**
+     * Gets the translation of a FloatingTaskView along its "slide-in/slide-out" axis (could be
+     * either x or y), depending on how the view is oriented.
+     *
+     * @param floatingTask The FloatingTaskView in question.
+     * @param dp The current device profile.
+     * @return The current translation value.
+     */
+    Float getFloatingTaskPrimaryTranslation(View floatingTask, DeviceProfile dp);
+
     class ChildBounds {
 
         public final int primaryDimension;
diff --git a/src/com/android/launcher3/touch/PortraitPagedViewHandler.java b/src/com/android/launcher3/touch/PortraitPagedViewHandler.java
index 181dca5..dd9f642 100644
--- a/src/com/android/launcher3/touch/PortraitPagedViewHandler.java
+++ b/src/com/android/launcher3/touch/PortraitPagedViewHandler.java
@@ -52,9 +52,9 @@
 import com.android.launcher3.Utilities;
 import com.android.launcher3.util.DisplayController;
 import com.android.launcher3.util.SplitConfigurationOptions;
+import com.android.launcher3.util.SplitConfigurationOptions.SplitBounds;
 import com.android.launcher3.util.SplitConfigurationOptions.SplitPositionOption;
 import com.android.launcher3.util.SplitConfigurationOptions.StagePosition;
-import com.android.launcher3.util.SplitConfigurationOptions.SplitBounds;
 import com.android.launcher3.views.BaseDragLayer;
 
 import java.util.List;
@@ -658,8 +658,9 @@
     public void setTaskIconParams(FrameLayout.LayoutParams iconParams, int taskIconMargin,
             int taskIconHeight, int thumbnailTopMargin, boolean isRtl) {
         iconParams.gravity = TOP | CENTER_HORIZONTAL;
+        // Reset margins, since they may have been set on rotation
         iconParams.leftMargin = iconParams.rightMargin = 0;
-        iconParams.topMargin = taskIconMargin;
+        iconParams.topMargin = iconParams.bottomMargin = 0;
     }
 
     @Override
@@ -756,4 +757,36 @@
             return new Pair<>(secondary, primary);
         }
     }
+
+    @Override
+    public float getFloatingTaskOffscreenTranslationTarget(View floatingTask, RectF onScreenRect,
+            @StagePosition int stagePosition, DeviceProfile dp) {
+        if (dp.isLandscape) {
+            float currentTranslationX = floatingTask.getTranslationX();
+            return stagePosition == STAGE_POSITION_TOP_OR_LEFT
+                    ? currentTranslationX - onScreenRect.width()
+                    : currentTranslationX + onScreenRect.width();
+        } else {
+            float currentTranslationY = floatingTask.getTranslationY();
+            return currentTranslationY - onScreenRect.height();
+        }
+    }
+
+    @Override
+    public void setFloatingTaskPrimaryTranslation(View floatingTask, float translation,
+            DeviceProfile dp) {
+        if (dp.isLandscape) {
+            floatingTask.setTranslationX(translation);
+        } else {
+            floatingTask.setTranslationY(translation);
+        }
+
+    }
+
+    @Override
+    public Float getFloatingTaskPrimaryTranslation(View floatingTask, DeviceProfile dp) {
+        return dp.isLandscape
+                ? floatingTask.getTranslationX()
+                : floatingTask.getTranslationY();
+    }
 }
diff --git a/src/com/android/launcher3/touch/SeascapePagedViewHandler.java b/src/com/android/launcher3/touch/SeascapePagedViewHandler.java
index 339f910..387e980 100644
--- a/src/com/android/launcher3/touch/SeascapePagedViewHandler.java
+++ b/src/com/android/launcher3/touch/SeascapePagedViewHandler.java
@@ -216,6 +216,7 @@
         iconParams.leftMargin = -taskIconHeight - taskIconMargin / 2;
         iconParams.rightMargin = 0;
         iconParams.topMargin = thumbnailTopMargin / 2;
+        iconParams.bottomMargin = 0;
     }
 
     @Override
diff --git a/src/com/android/launcher3/touch/WorkspaceTouchListener.java b/src/com/android/launcher3/touch/WorkspaceTouchListener.java
index 17bbdf1..6cb021b 100644
--- a/src/com/android/launcher3/touch/WorkspaceTouchListener.java
+++ b/src/com/android/launcher3/touch/WorkspaceTouchListener.java
@@ -43,7 +43,7 @@
 import com.android.launcher3.dragndrop.DragLayer;
 import com.android.launcher3.logger.LauncherAtom;
 import com.android.launcher3.testing.TestLogging;
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 
 /**
  * Helper class to handle touch on empty space in workspace and show options popup on long press
diff --git a/src/com/android/launcher3/util/DisplayController.java b/src/com/android/launcher3/util/DisplayController.java
index 15fe1d9..94f9f25 100644
--- a/src/com/android/launcher3/util/DisplayController.java
+++ b/src/com/android/launcher3/util/DisplayController.java
@@ -19,7 +19,7 @@
 import static android.view.Display.DEFAULT_DISPLAY;
 import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
 
-import static com.android.launcher3.ResourceUtils.INVALID_RESOURCE_HANDLE;
+import static com.android.launcher3.testing.shared.ResourceUtils.INVALID_RESOURCE_HANDLE;
 import static com.android.launcher3.Utilities.dpiFromPx;
 import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_NAVIGATION_MODE_2_BUTTON;
 import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_NAVIGATION_MODE_3_BUTTON;
@@ -46,7 +46,7 @@
 import androidx.annotation.AnyThread;
 import androidx.annotation.UiThread;
 
-import com.android.launcher3.ResourceUtils;
+import com.android.launcher3.testing.shared.ResourceUtils;
 import com.android.launcher3.Utilities;
 import com.android.launcher3.logging.StatsLogManager.LauncherEvent;
 import com.android.launcher3.util.window.CachedDisplayInfo;
@@ -278,11 +278,11 @@
         public final float fontScale;
         private final int densityDpi;
         public final NavigationMode navigationMode;
-
         private final PortraitSize mScreenSizeDp;
 
+        // WindowBounds
+        public final WindowBounds realBounds;
         public final Set<WindowBounds> supportedBounds = new ArraySet<>();
-
         private final ArrayMap<CachedDisplayInfo, WindowBounds[]> mPerDisplayBounds =
                 new ArrayMap<>();
 
@@ -310,7 +310,7 @@
             mPerDisplayBounds.putAll(perDisplayBoundsCache);
             WindowBounds[] cachedValue = mPerDisplayBounds.get(normalizedDisplayInfo);
 
-            WindowBounds realBounds = wmProxy.getRealBounds(displayInfoContext, displayInfo);
+            realBounds = wmProxy.getRealBounds(displayInfoContext, displayInfo);
             if (cachedValue == null) {
                 // Unexpected normalizedDisplayInfo is found, recreate the cache
                 Log.e(TAG, "Unexpected normalizedDisplayInfo found, invalidating cache");
diff --git a/src/com/android/launcher3/util/ViewCapture.java b/src/com/android/launcher3/util/ViewCapture.java
index 140971b..cf9ea69 100644
--- a/src/com/android/launcher3/util/ViewCapture.java
+++ b/src/com/android/launcher3/util/ViewCapture.java
@@ -21,6 +21,7 @@
 import android.os.SystemClock;
 import android.os.Trace;
 import android.util.Base64;
+import android.util.Base64OutputStream;
 import android.util.Log;
 import android.view.View;
 import android.view.ViewGroup;
@@ -32,6 +33,9 @@
 import com.android.launcher3.view.ViewCaptureData.FrameData;
 import com.android.launcher3.view.ViewCaptureData.ViewNode;
 
+import java.io.FileDescriptor;
+import java.io.FileOutputStream;
+import java.io.OutputStream;
 import java.util.concurrent.FutureTask;
 
 /**
@@ -73,7 +77,7 @@
     /**
      * Creates a proto of all the data captured so far.
      */
-    public String dumpToString() {
+    public void dump(FileDescriptor out) {
         Handler handler = mRoot.getHandler();
         if (handler == null) {
             handler = Executors.MAIN_EXECUTOR.getHandler();
@@ -84,12 +88,15 @@
         } else {
             handler.post(task);
         }
-        try {
-            return Base64.encodeToString(task.get().toByteArray(),
+        try (OutputStream os = new FileOutputStream(out)) {
+            ExportedData data = task.get();
+            Base64OutputStream encodedOS = new Base64OutputStream(os,
                     Base64.NO_CLOSE | Base64.NO_PADDING | Base64.NO_WRAP);
+            data.writeTo(encodedOS);
+            encodedOS.close();
+            os.flush();
         } catch (Exception e) {
             Log.e(TAG, "Error capturing proto", e);
-            return "--error--";
         }
     }
 
diff --git a/src/com/android/launcher3/util/window/WindowManagerProxy.java b/src/com/android/launcher3/util/window/WindowManagerProxy.java
index d5a065a..582ff8d 100644
--- a/src/com/android/launcher3/util/window/WindowManagerProxy.java
+++ b/src/com/android/launcher3/util/window/WindowManagerProxy.java
@@ -17,13 +17,13 @@
 
 import static android.view.Display.DEFAULT_DISPLAY;
 
-import static com.android.launcher3.ResourceUtils.INVALID_RESOURCE_HANDLE;
-import static com.android.launcher3.ResourceUtils.NAVBAR_HEIGHT;
-import static com.android.launcher3.ResourceUtils.NAVBAR_HEIGHT_LANDSCAPE;
-import static com.android.launcher3.ResourceUtils.NAVBAR_LANDSCAPE_LEFT_RIGHT_SIZE;
-import static com.android.launcher3.ResourceUtils.STATUS_BAR_HEIGHT;
-import static com.android.launcher3.ResourceUtils.STATUS_BAR_HEIGHT_LANDSCAPE;
-import static com.android.launcher3.ResourceUtils.STATUS_BAR_HEIGHT_PORTRAIT;
+import static com.android.launcher3.testing.shared.ResourceUtils.INVALID_RESOURCE_HANDLE;
+import static com.android.launcher3.testing.shared.ResourceUtils.NAVBAR_HEIGHT;
+import static com.android.launcher3.testing.shared.ResourceUtils.NAVBAR_HEIGHT_LANDSCAPE;
+import static com.android.launcher3.testing.shared.ResourceUtils.NAVBAR_LANDSCAPE_LEFT_RIGHT_SIZE;
+import static com.android.launcher3.testing.shared.ResourceUtils.STATUS_BAR_HEIGHT;
+import static com.android.launcher3.testing.shared.ResourceUtils.STATUS_BAR_HEIGHT_LANDSCAPE;
+import static com.android.launcher3.testing.shared.ResourceUtils.STATUS_BAR_HEIGHT_PORTRAIT;
 import static com.android.launcher3.Utilities.dpiFromPx;
 import static com.android.launcher3.util.MainThreadInitializedObject.forOverride;
 import static com.android.launcher3.util.RotationUtils.deltaRotation;
@@ -48,7 +48,7 @@
 import android.view.WindowMetrics;
 
 import com.android.launcher3.R;
-import com.android.launcher3.ResourceUtils;
+import com.android.launcher3.testing.shared.ResourceUtils;
 import com.android.launcher3.Utilities;
 import com.android.launcher3.util.MainThreadInitializedObject;
 import com.android.launcher3.util.ResourceBasedOverride;
diff --git a/src/com/android/launcher3/views/OptionsPopupView.java b/src/com/android/launcher3/views/OptionsPopupView.java
index 2a9a8a5..d301925 100644
--- a/src/com/android/launcher3/views/OptionsPopupView.java
+++ b/src/com/android/launcher3/views/OptionsPopupView.java
@@ -50,7 +50,7 @@
 import com.android.launcher3.popup.ArrowPopup;
 import com.android.launcher3.shortcuts.DeepShortcutView;
 import com.android.launcher3.testing.TestLogging;
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 import com.android.launcher3.widget.picker.WidgetsFullSheet;
 
 import java.util.ArrayList;
diff --git a/src/com/android/launcher3/views/RecyclerViewFastScroller.java b/src/com/android/launcher3/views/RecyclerViewFastScroller.java
index 11ca130..6e6512d 100644
--- a/src/com/android/launcher3/views/RecyclerViewFastScroller.java
+++ b/src/com/android/launcher3/views/RecyclerViewFastScroller.java
@@ -174,6 +174,11 @@
         ta.recycle();
     }
 
+    /** @return whether there is a RecyclerView bound to this scroller. */
+    public boolean hasRecyclerView() {
+        return mRv != null;
+    }
+
     public void setRecyclerView(FastScrollRecyclerView rv, TextView popupView) {
         if (mRv != null && mOnScrollListener != null) {
             mRv.removeOnScrollListener(mOnScrollListener);
diff --git a/src/com/android/launcher3/widget/BaseWidgetSheet.java b/src/com/android/launcher3/widget/BaseWidgetSheet.java
index 8962c4f..5cffd48 100644
--- a/src/com/android/launcher3/widget/BaseWidgetSheet.java
+++ b/src/com/android/launcher3/widget/BaseWidgetSheet.java
@@ -42,7 +42,7 @@
 import com.android.launcher3.dragndrop.DragOptions;
 import com.android.launcher3.popup.PopupDataProvider;
 import com.android.launcher3.testing.TestLogging;
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 import com.android.launcher3.touch.ItemLongClickListener;
 import com.android.launcher3.util.SystemUiController;
 import com.android.launcher3.util.Themes;
diff --git a/src/com/android/launcher3/widget/LauncherAppWidgetHost.java b/src/com/android/launcher3/widget/LauncherAppWidgetHost.java
index 98a960c..5ce8fcf 100644
--- a/src/com/android/launcher3/widget/LauncherAppWidgetHost.java
+++ b/src/com/android/launcher3/widget/LauncherAppWidgetHost.java
@@ -42,7 +42,7 @@
 import com.android.launcher3.model.WidgetsModel;
 import com.android.launcher3.model.data.ItemInfo;
 import com.android.launcher3.testing.TestLogging;
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 import com.android.launcher3.widget.custom.CustomWidgetManager;
 
 import java.util.ArrayList;
diff --git a/src/com/android/launcher3/widget/PendingItemDragHelper.java b/src/com/android/launcher3/widget/PendingItemDragHelper.java
index 46c0b99..c8d528b 100644
--- a/src/com/android/launcher3/widget/PendingItemDragHelper.java
+++ b/src/com/android/launcher3/widget/PendingItemDragHelper.java
@@ -42,7 +42,7 @@
 import com.android.launcher3.icons.FastBitmapDrawable;
 import com.android.launcher3.icons.LauncherIcons;
 import com.android.launcher3.icons.RoundDrawableWrapper;
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 import com.android.launcher3.widget.dragndrop.AppWidgetHostViewDragListener;
 import com.android.launcher3.widget.util.WidgetSizes;
 
diff --git a/src/com/android/launcher3/widget/picker/WidgetsFullSheet.java b/src/com/android/launcher3/widget/picker/WidgetsFullSheet.java
index 88d9723..0d9198f 100644
--- a/src/com/android/launcher3/widget/picker/WidgetsFullSheet.java
+++ b/src/com/android/launcher3/widget/picker/WidgetsFullSheet.java
@@ -19,7 +19,7 @@
 
 import static com.android.launcher3.LauncherAnimUtils.VIEW_TRANSLATE_Y;
 import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_WIDGETSTRAY_SEARCHED;
-import static com.android.launcher3.testing.TestProtocol.NORMAL_STATE_ORDINAL;
+import static com.android.launcher3.testing.shared.TestProtocol.NORMAL_STATE_ORDINAL;
 
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
diff --git a/tests/Android.bp b/tests/Android.bp
index 54cded0..1584308 100644
--- a/tests/Android.bp
+++ b/tests/Android.bp
@@ -24,6 +24,18 @@
       "src/**/*.java",
       "src/**/*.kt"
     ],
+    exclude_srcs: [
+        ":launcher-non-quickstep-tests-src"
+    ],
+}
+
+// Source code used for non-quickstep tests
+filegroup {
+    name: "launcher-non-quickstep-tests-src",
+    srcs: [
+       "src/com/android/launcher3/nonquickstep/**/*.java",
+       "src/com/android/launcher3/nonquickstep/**/*.kt",
+    ],
 }
 
 // Source code used for oop test helpers
@@ -84,6 +96,7 @@
     name: "Launcher3Tests",
     srcs: [
         ":launcher-tests-src",
+        ":launcher-non-quickstep-tests-src",
     ],
     static_libs: ["Launcher3TestLib"],
     libs: [
diff --git a/tests/src/com/android/launcher3/DeviceProfileBaseTest.kt b/tests/src/com/android/launcher3/DeviceProfileBaseTest.kt
index 7465db5..cf6be7f 100644
--- a/tests/src/com/android/launcher3/DeviceProfileBaseTest.kt
+++ b/tests/src/com/android/launcher3/DeviceProfileBaseTest.kt
@@ -17,11 +17,14 @@
 
 import android.content.Context
 import android.graphics.PointF
+import android.graphics.Rect
+import android.util.SparseArray
 import androidx.test.core.app.ApplicationProvider
 import com.android.launcher3.util.DisplayController.Info
 import com.android.launcher3.util.WindowBounds
 import org.junit.Before
 import org.mockito.ArgumentMatchers.any
+import org.mockito.ArgumentMatchers.anyInt
 import org.mockito.Mockito.mock
 import java.io.PrintWriter
 import java.io.StringWriter
@@ -37,6 +40,9 @@
     protected var transposeLayoutWithOrientation: Boolean = false
     protected var useTwoPanels: Boolean = false
     protected var isGestureMode: Boolean = true
+    protected var devicePaddingsMock: DevicePaddings = mock(DevicePaddings::class.java)
+    protected var staticdevicePaddingsMock: DevicePaddings.DevicePadding =
+            mock(DevicePaddings.DevicePadding::class.java)
 
     @Before
     fun setUp() {
@@ -51,6 +57,7 @@
         inv,
         info,
         windowBounds,
+        SparseArray(),
         isMultiWindowMode,
         transposeLayoutWithOrientation,
         useTwoPanels,
@@ -60,112 +67,278 @@
     protected fun initializeVarsForPhone(isGestureMode: Boolean = true,
                                          isVerticalBar: Boolean = false) {
         val (x, y) = if (isVerticalBar)
-            Pair(3120, 1440)
+            Pair(2400, 1080)
         else
-            Pair(1440, 3120)
+            Pair(1080, 2400)
 
-        windowBounds = WindowBounds(x, y, x, y - 100, 0)
+        windowBounds = WindowBounds(Rect(0, 0, x, y), Rect(
+                if (isVerticalBar) 118 else 0,
+                if (isVerticalBar) 74 else 118,
+                if (!isGestureMode && isVerticalBar) 126 else 0,
+                if (isGestureMode) 63 else if (isVerticalBar) 0 else 126))
 
         whenever(info.isTablet(any())).thenReturn(false)
-        whenever(info.getDensityDpi()).thenReturn(560)
+        whenever(info.getDensityDpi()).thenReturn(420)
         whenever(info.smallestSizeDp(any())).thenReturn(411f)
+        whenever(devicePaddingsMock.getDevicePadding(anyInt())).thenReturn(staticdevicePaddingsMock)
+        whenever(staticdevicePaddingsMock.getWorkspaceTopPadding(anyInt())).thenReturn(95)
+        whenever(staticdevicePaddingsMock.getWorkspaceBottomPadding(anyInt())).thenReturn(116)
+        whenever(staticdevicePaddingsMock.maxEmptySpacePx)
+                .thenReturn(if (isVerticalBar) if (isGestureMode) 131 else 184 else 315)
 
         this.isGestureMode = isGestureMode
+        transposeLayoutWithOrientation = true
 
-        inv = newScalableInvariantDeviceProfile().apply {
+        inv = InvariantDeviceProfile().apply {
+            numRows = 5
+            numColumns = 4
+            numSearchContainerColumns = 4
+
+            numFolderRows = 3
+            numFolderColumns = 3
+            iconSize = floatArrayOf(60f, 54f, 60f, 60f)
+            iconTextSize = FloatArray(4) { 14f }
             deviceType = InvariantDeviceProfile.TYPE_PHONE
-            transposeLayoutWithOrientation = isVerticalBar
+
+            minCellSize = listOf(
+                    PointF(80f, 104f),
+                    PointF(80f, 104f),
+                    PointF(80f, 104f),
+                    PointF(80f, 104f)
+            ).toTypedArray()
+
+            borderSpaces = listOf(
+                    PointF(16f, 16f),
+                    PointF(16f, 16f),
+                    PointF(16f, 16f),
+                    PointF(16f, 16f)
+            ).toTypedArray()
+            folderBorderSpace = 16f
+            inlineNavButtonsEndSpacing = R.dimen.taskbar_button_margin_4_5
+
+            horizontalMargin = FloatArray(4) { 22f }
+
+            allAppsCellSize = listOf(
+                    PointF(80f, 104f),
+                    PointF(80f, 104f),
+                    PointF(80f, 104f),
+                    PointF(80f, 104f)
+            ).toTypedArray()
+            allAppsIconSize = floatArrayOf(60f, 60f, 60f, 60f)
+            allAppsIconTextSize = FloatArray(4) { 14f }
+            allAppsBorderSpaces = listOf(
+                    PointF(16f, 16f),
+                    PointF(16f, 16f),
+                    PointF(16f, 16f),
+                    PointF(16f, 16f)
+            ).toTypedArray()
+
+            numShownHotseatIcons = 4
+
+            numDatabaseHotseatIcons = 4
+
+            hotseatColumnSpan = IntArray(4) { 4 }
+            hotseatBarBottomSpace = FloatArray(4) { 48f }
+            hotseatQsbSpace = FloatArray(4) { 36f }
+
+            numAllAppsColumns = 4
+
+            isScalable = true
+
+            inlineQsb = BooleanArray(4) { false }
+
+            devicePaddings = devicePaddingsMock
         }
     }
 
     protected fun initializeVarsForTablet(isLandscape: Boolean = false,
-                                          isTwoPanel: Boolean = false,
                                           isGestureMode: Boolean = true) {
         val (x, y) = if (isLandscape)
             Pair(2560, 1600)
         else
             Pair(1600, 2560)
 
-        windowBounds = WindowBounds(x, y, x, y - 100, 0)
+        windowBounds =
+                WindowBounds(Rect(0, 0, x, y), Rect(0, 104, 0, 0))
 
         whenever(info.isTablet(any())).thenReturn(true)
         whenever(info.getDensityDpi()).thenReturn(320)
         whenever(info.smallestSizeDp(any())).thenReturn(800f)
+        whenever(devicePaddingsMock.getDevicePadding(anyInt())).thenReturn(staticdevicePaddingsMock)
+        whenever(staticdevicePaddingsMock.getWorkspaceTopPadding(anyInt()))
+                .thenReturn(if (isLandscape) 32 else 159)
+        whenever(staticdevicePaddingsMock.getWorkspaceBottomPadding(anyInt()))
+                .thenReturn(if (isLandscape) 72 else 203)
+        whenever(staticdevicePaddingsMock.maxEmptySpacePx).thenReturn(if (isLandscape) 200 else 19998)
+
 
         this.isGestureMode = isGestureMode
-        useTwoPanels = isTwoPanel
+        useTwoPanels = false
 
-        inv = newScalableInvariantDeviceProfile().apply {
-            deviceType = if (isTwoPanel)
-                InvariantDeviceProfile.TYPE_MULTI_DISPLAY else InvariantDeviceProfile.TYPE_TABLET
+        inv = InvariantDeviceProfile().apply {
+            numRows = 5
+            numColumns = 6
+            numSearchContainerColumns = 3
+
+            iconSize = FloatArray(4) { 60f }
+            iconTextSize = FloatArray(4) { 14f }
+            deviceType = InvariantDeviceProfile.TYPE_TABLET
+
+            minCellSize = listOf(
+                    PointF(102f, 120f),
+                    PointF(120f, 104f),
+                    PointF(102f, 120f),
+                    PointF(102f, 120f)
+            ).toTypedArray()
+
+            borderSpaces = listOf(
+                    PointF(16f, 64f),
+                    PointF(64f, 16f),
+                    PointF(16f, 64f),
+                    PointF(16f, 64f)
+            ).toTypedArray()
+            inlineNavButtonsEndSpacing = R.dimen.taskbar_button_margin_6_5
+
+            horizontalMargin = floatArrayOf(54f, 120f, 54f, 54f)
+
+            allAppsCellSize = listOf(
+                    PointF(96f, 142f),
+                    PointF(126f, 126f),
+                    PointF(96f, 142f),
+                    PointF(96f, 142f)
+            ).toTypedArray()
+            allAppsIconSize = FloatArray(4) { 60f }
+            allAppsIconTextSize = FloatArray(4) { 14f }
+            allAppsBorderSpaces = listOf(
+                    PointF(8f, 16f),
+                    PointF(16f, 16f),
+                    PointF(8f, 16f),
+                    PointF(8f, 16f)
+            ).toTypedArray()
+
+            numShownHotseatIcons = 6
+
+            numDatabaseHotseatIcons = 6
+
+            hotseatColumnSpan = intArrayOf(6, 4, 6, 6)
+            hotseatBarBottomSpace = floatArrayOf(36f, 40f, 36f, 36f)
+            hotseatQsbSpace = FloatArray(4) { 32f }
+
+            numAllAppsColumns = 6
+
+            isScalable = true
+            devicePaddingId = 2132148242 // "@xml/paddings_6x5"
+
             inlineQsb = booleanArrayOf(
                     false,
-                    isLandscape,
+                    true,
                     false,
                     false
             )
+
+            devicePaddings = devicePaddingsMock
         }
     }
 
-    /**
-     * A very generic grid, just to make qsb tests work. For real calculations, make sure to use
-     * values that better represent a real grid.
-     */
-    protected fun newScalableInvariantDeviceProfile(): InvariantDeviceProfile =
-        InvariantDeviceProfile().apply {
-            isScalable = true
-            numColumns = 4
-            numRows = 4
-            numShownHotseatIcons = 4
-            numDatabaseHotseatIcons = 6
-            numShrunkenHotseatIcons = 5
-            horizontalMargin = FloatArray(4) { 22f }
-            borderSpaces = listOf(
-                PointF(16f, 16f),
-                PointF(16f, 16f),
-                PointF(16f, 16f),
-                PointF(16f, 16f)
-            ).toTypedArray()
-            allAppsBorderSpaces = listOf(
-                PointF(16f, 16f),
-                PointF(16f, 16f),
-                PointF(16f, 16f),
-                PointF(16f, 16f)
-            ).toTypedArray()
-            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 }
-            iconTextSize = FloatArray(4) { 14f }
-            allAppsIconTextSize = FloatArray(4) { 14f }
-            minCellSize = listOf(
-                PointF(64f, 83f),
-                PointF(64f, 83f),
-                PointF(64f, 83f),
-                PointF(64f, 83f)
-            ).toTypedArray()
-            allAppsCellSize = listOf(
-                PointF(64f, 83f),
-                PointF(64f, 83f),
-                PointF(64f, 83f),
-                PointF(64f, 83f)
-            ).toTypedArray()
-            inlineQsb = booleanArrayOf(
-                false,
-                false,
-                false,
-                false
-            )
-        }
+    protected fun initializeVarsForTwoPanel(isLandscape: Boolean = false,
+            isGestureMode: Boolean = true) {
+        val (x, y) = if (isLandscape)
+            Pair(2208, 1840)
+        else
+            Pair(1840, 2208)
 
-    fun dump(dp: DeviceProfile): StringWriter {
+        windowBounds = WindowBounds(Rect(0, 0, x, y),
+                Rect(0, 110, 0, 0))
+
+        whenever(info.isTablet(any())).thenReturn(true)
+        whenever(info.getDensityDpi()).thenReturn(420)
+        whenever(info.smallestSizeDp(any())).thenReturn(700f)
+        whenever(devicePaddingsMock.getDevicePadding(anyInt())).thenReturn(staticdevicePaddingsMock)
+
+        val topPadding = if (isLandscape) 18 else 89
+        val bottomPadding = if (isLandscape) 39 else 146
+        val maxEmptySpace = if (isLandscape) 131 else 236
+        whenever(staticdevicePaddingsMock.getWorkspaceTopPadding(anyInt())).thenReturn(topPadding)
+        whenever(staticdevicePaddingsMock.getWorkspaceBottomPadding(anyInt()))
+                .thenReturn(bottomPadding)
+        whenever(staticdevicePaddingsMock.maxEmptySpacePx).thenReturn(maxEmptySpace)
+
+        this.isGestureMode = isGestureMode
+        useTwoPanels = true
+
+        inv = InvariantDeviceProfile().apply {
+            numRows = 4
+            numColumns = 4
+            numSearchContainerColumns = 4
+
+            numFolderRows = 3
+            numFolderColumns = 4
+            iconSize = floatArrayOf(60f, 52f, 52f, 60f)
+            iconTextSize = floatArrayOf(14f, 14f, 12f, 14f)
+            deviceType = InvariantDeviceProfile.TYPE_MULTI_DISPLAY
+
+            minCellSize = listOf(
+                    PointF(80f, 104f),
+                    PointF(80f, 104f),
+                    PointF(68f, 116f),
+                    PointF(80f, 102f)
+            ).toTypedArray()
+
+            borderSpaces = listOf(
+                    PointF(16f, 16f),
+                    PointF(16f, 16f),
+                    PointF(16f, 20f),
+                    PointF(20f, 20f)
+            ).toTypedArray()
+            folderBorderSpace = 16f
+            inlineNavButtonsEndSpacing = R.dimen.taskbar_button_margin_4_4
+
+            horizontalMargin = floatArrayOf(21.5f, 21.5f, 22.5f, 30.5f)
+
+            allAppsCellSize = listOf(
+                    PointF(0f, 0f),
+                    PointF(0f, 0f),
+                    PointF(68f, 104f),
+                    PointF(80f, 104f)
+            ).toTypedArray()
+            allAppsIconSize = floatArrayOf(60f, 60f, 52f, 60f)
+            allAppsIconTextSize = floatArrayOf(14f, 14f, 12f, 14f)
+            allAppsBorderSpaces = listOf(
+                    PointF(16f, 16f),
+                    PointF(16f, 16f),
+                    PointF(16f, 28f),
+                    PointF(20f, 16f)
+            ).toTypedArray()
+
+            numShownHotseatIcons = 6
+
+            numDatabaseHotseatIcons = 6
+
+            hotseatColumnSpan = IntArray(4) { 6 }
+            hotseatBarBottomSpace = floatArrayOf(48f, 48f, 36f, 20f)
+            hotseatQsbSpace = floatArrayOf(36f, 36f, 36f, 28f)
+
+            numAllAppsColumns = 6
+            numDatabaseAllAppsColumns = 6
+
+            isScalable = true
+
+            inlineQsb = booleanArrayOf(
+                    false,
+                    false,
+                    false,
+                    false
+            )
+
+            devicePaddings = devicePaddingsMock
+        }
+    }
+
+    fun dump(dp: DeviceProfile): String {
         val stringWriter = StringWriter()
         val printWriter = PrintWriter(stringWriter)
-        dp.dump("", printWriter)
+        dp.dump(context, "", printWriter)
         printWriter.flush()
-        return stringWriter
+        return stringWriter.toString()
     }
 }
\ No newline at end of file
diff --git a/tests/src/com/android/launcher3/HotseatShownIconsTest.kt b/tests/src/com/android/launcher3/HotseatShownIconsTest.kt
deleted file mode 100644
index 5dabb33..0000000
--- a/tests/src/com/android/launcher3/HotseatShownIconsTest.kt
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.launcher3
-
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.SmallTest
-import com.android.launcher3.InvariantDeviceProfile.TYPE_MULTI_DISPLAY
-import com.android.launcher3.InvariantDeviceProfile.TYPE_PHONE
-import com.android.launcher3.InvariantDeviceProfile.TYPE_TABLET
-import com.google.common.truth.Truth.assertThat
-import org.junit.Test
-import org.junit.runner.RunWith
-
-/**
- * Test for [DeviceProfile]
- */
-@SmallTest
-@RunWith(AndroidJUnit4::class)
-class HotseatShownIconsTest : DeviceProfileBaseTest() {
-
-    @Test
-    fun hotseat_size_is_shrunk_if_needed_when_large_screen() {
-        initializeVarsForTablet(isLandscape = true)
-        inv = newScalableInvariantDeviceProfile().apply {
-            deviceType = TYPE_MULTI_DISPLAY
-            inlineQsb = booleanArrayOf(
-                false,
-                false,
-                false,
-                true // two panels landscape
-            )
-        }
-        useTwoPanels = true
-
-        isGestureMode = false
-        val dp = newDP()
-
-        if (dp.hotseatQsbHeight > 0) {
-            assertThat(dp.isQsbInline).isTrue()
-            assertThat(dp.numShownHotseatIcons).isEqualTo(5)
-        } else { // Launcher3 doesn't have QSB height
-            assertThat(dp.isQsbInline).isFalse()
-            assertThat(dp.numShownHotseatIcons).isEqualTo(6)
-        }
-    }
-
-    /**
-     * For consistency, the hotseat should shrink if any orientation on the device type has an
-     * inline qsb
-     */
-    @Test
-    fun hotseat_size_is_shrunk_even_in_portrait_when_large_screen() {
-        initializeVarsForTablet()
-        inv = newScalableInvariantDeviceProfile().apply {
-            deviceType = TYPE_MULTI_DISPLAY
-            inlineQsb = booleanArrayOf(
-                false,
-                false,
-                false,
-                true // two panels landscape
-            )
-        }
-        useTwoPanels = true
-
-        isGestureMode = false
-        val dp = newDP()
-
-        if (dp.hotseatQsbHeight > 0) {
-            assertThat(dp.isQsbInline).isFalse()
-            assertThat(dp.numShownHotseatIcons).isEqualTo(5)
-        } else { // Launcher3 doesn't have QSB height
-            assertThat(dp.isQsbInline).isFalse()
-            assertThat(dp.numShownHotseatIcons).isEqualTo(6)
-        }
-    }
-
-    @Test
-    fun hotseat_size_is_default_when_small_screen() {
-        initializeVarsForPhone()
-        inv = newScalableInvariantDeviceProfile().apply {
-            deviceType = TYPE_MULTI_DISPLAY
-        }
-        useTwoPanels = true
-
-        val dp = newDP()
-
-        assertThat(dp.numShownHotseatIcons).isEqualTo(4)
-    }
-
-    @Test
-    fun hotseat_size_is_not_shrunk_on_gesture_tablet() {
-        initializeVarsForTablet(isLandscape = true)
-        inv = newScalableInvariantDeviceProfile().apply {
-            deviceType = TYPE_TABLET
-            inlineQsb = booleanArrayOf(
-                    false,
-                    true, // landscape
-                    false,
-                    false
-            )
-            numShownHotseatIcons = 6
-        }
-
-        isGestureMode = true
-        val dp = newDP()
-
-        if (dp.hotseatQsbHeight > 0) {
-            assertThat(dp.isQsbInline).isTrue()
-            assertThat(dp.numShownHotseatIcons).isEqualTo(6)
-        } else { // Launcher3 doesn't have QSB height
-            assertThat(dp.isQsbInline).isFalse()
-            assertThat(dp.numShownHotseatIcons).isEqualTo(6)
-        }
-    }
-
-    @Test
-    fun hotseat_size_is_shrunk_if_needed_on_tablet() {
-        initializeVarsForTablet(isLandscape = true)
-        inv = newScalableInvariantDeviceProfile().apply {
-            deviceType = TYPE_TABLET
-            inlineQsb = booleanArrayOf(
-                false,
-                true, // landscape
-                false,
-                false
-            )
-            numShownHotseatIcons = 6
-        }
-
-        isGestureMode = false
-        val dp = newDP()
-
-        if (dp.hotseatQsbHeight > 0) {
-            assertThat(dp.isQsbInline).isTrue()
-            assertThat(dp.numShownHotseatIcons).isEqualTo(5)
-        } else { // Launcher3 doesn't have QSB height
-            assertThat(dp.isQsbInline).isFalse()
-            assertThat(dp.numShownHotseatIcons).isEqualTo(6)
-        }
-    }
-
-    /**
-     * For consistency, the hotseat should shrink if any orientation on the device type has an
-     * inline qsb
-     */
-    @Test
-    fun hotseat_size_is_shrunk_even_in_portrait_on_tablet() {
-        initializeVarsForTablet()
-        inv = newScalableInvariantDeviceProfile().apply {
-            deviceType = TYPE_TABLET
-            inlineQsb = booleanArrayOf(
-                false,
-                true, // landscape
-                false,
-                false
-            )
-            numShownHotseatIcons = 6
-        }
-
-        isGestureMode = false
-        val dp = newDP()
-
-        if (dp.hotseatQsbHeight > 0) {
-            assertThat(dp.isQsbInline).isFalse()
-            assertThat(dp.numShownHotseatIcons).isEqualTo(5)
-        } else { // Launcher3 doesn't have QSB height
-            assertThat(dp.isQsbInline).isFalse()
-            assertThat(dp.numShownHotseatIcons).isEqualTo(6)
-        }
-    }
-
-}
\ No newline at end of file
diff --git a/tests/src/com/android/launcher3/deviceemulator/models/DeviceEmulationData.java b/tests/src/com/android/launcher3/deviceemulator/models/DeviceEmulationData.java
index 8d275cc..55b7bf1 100644
--- a/tests/src/com/android/launcher3/deviceemulator/models/DeviceEmulationData.java
+++ b/tests/src/com/android/launcher3/deviceemulator/models/DeviceEmulationData.java
@@ -17,10 +17,10 @@
 
 import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
 
-import static com.android.launcher3.ResourceUtils.NAVBAR_HEIGHT;
-import static com.android.launcher3.ResourceUtils.NAVBAR_HEIGHT_LANDSCAPE;
-import static com.android.launcher3.ResourceUtils.NAVBAR_LANDSCAPE_LEFT_RIGHT_SIZE;
-import static com.android.launcher3.ResourceUtils.getDimenByName;
+import static com.android.launcher3.testing.shared.ResourceUtils.NAVBAR_HEIGHT;
+import static com.android.launcher3.testing.shared.ResourceUtils.NAVBAR_HEIGHT_LANDSCAPE;
+import static com.android.launcher3.testing.shared.ResourceUtils.NAVBAR_LANDSCAPE_LEFT_RIGHT_SIZE;
+import static com.android.launcher3.testing.shared.ResourceUtils.getDimenByName;
 
 import android.content.Context;
 import android.content.res.Resources;
diff --git a/tests/src/com/android/launcher3/model/CacheDataUpdatedTaskTest.java b/tests/src/com/android/launcher3/model/CacheDataUpdatedTaskTest.java
index dba0a40..960d27d 100644
--- a/tests/src/com/android/launcher3/model/CacheDataUpdatedTaskTest.java
+++ b/tests/src/com/android/launcher3/model/CacheDataUpdatedTaskTest.java
@@ -1,5 +1,7 @@
 package com.android.launcher3.model;
 
+import static com.android.launcher3.testing.shared.TestProtocol.INCORRECT_INFO_UPDATED;
+
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotSame;
@@ -14,6 +16,7 @@
 import android.os.Process;
 import android.os.UserHandle;
 import android.os.UserManager;
+import android.util.Log;
 
 import androidx.annotation.NonNull;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -26,6 +29,7 @@
 import com.android.launcher3.model.data.AppInfo;
 import com.android.launcher3.model.data.ItemInfo;
 import com.android.launcher3.model.data.WorkspaceItemInfo;
+import com.android.launcher3.testing.shared.TestProtocol;
 import com.android.launcher3.util.LauncherModelHelper;
 
 import org.junit.After;
@@ -43,12 +47,15 @@
 @RunWith(AndroidJUnit4.class)
 public class CacheDataUpdatedTaskTest {
 
+    private static final String TAG = "CacheDataUpdatedTaskTest";
+
     private static final String NEW_LABEL_PREFIX = "new-label-";
 
     private LauncherModelHelper mModelHelper;
 
     @Before
     public void setup() throws Exception {
+        TestProtocol.sDebugTracing = true;
         mModelHelper = new LauncherModelHelper();
         mModelHelper.initializeData("cache_data_updated_task_data");
 
@@ -88,6 +95,7 @@
     @After
     public void tearDown() {
         mModelHelper.destroy();
+        TestProtocol.sDebugTracing = false;
     }
 
     private CacheDataUpdatedTask newTask(int op, String... pkg) {
@@ -111,6 +119,7 @@
         // Verify that only app1 var updated in allAppsList
         assertFalse(mModelHelper.getAllAppsList().data.isEmpty());
         for (AppInfo info : mModelHelper.getAllAppsList().data) {
+            Log.i(INCORRECT_INFO_UPDATED, "testCacheUpdate_update_apps: checking info=" + info);
             if (info.componentName.getPackageName().equals("app1")) {
                 assertFalse(info.bitmap.isNullOrLowRes());
             } else {
diff --git a/tests/src/com/android/launcher3/nonquickstep/HotseatWidthCalculationTest.kt b/tests/src/com/android/launcher3/nonquickstep/HotseatWidthCalculationTest.kt
new file mode 100644
index 0000000..55520e8
--- /dev/null
+++ b/tests/src/com/android/launcher3/nonquickstep/HotseatWidthCalculationTest.kt
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.launcher3.nonquickstep
+
+import android.graphics.Rect
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.launcher3.DeviceProfileBaseTest
+import com.android.launcher3.util.WindowBounds
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class HotseatWidthCalculationTest : DeviceProfileBaseTest() {
+
+    /**
+     * This is a case when after setting the hotseat, the space needs to be recalculated
+     * but it doesn't need to change QSB width or remove icons
+     */
+    @Test
+    fun distribute_border_space_when_space_is_enough_portrait() {
+        initializeVarsForTablet(isGestureMode = false)
+        windowBounds = WindowBounds(Rect(0, 0, 1800, 2560), Rect(0, 104, 0, 0))
+        val dp = newDP()
+        dp.isTaskbarPresentInApps = true
+
+        assertThat(dp.hotseatBarEndOffset).isEqualTo(0)
+        assertThat(dp.numShownHotseatIcons).isEqualTo(6)
+        assertThat(dp.hotseatBorderSpace).isEqualTo(145)
+
+        assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(177)
+        assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(177)
+
+        assertThat(dp.isQsbInline).isFalse()
+        assertThat(dp.hotseatQsbWidth).isEqualTo(1445)
+    }
+
+    /**
+     * This is a case when after setting the hotseat, and recalculating spaces
+     * it still needs to remove icons for everything to fit
+     */
+    @Test
+    fun decrease_num_of_icons_when_not_enough_space_portrait() {
+        initializeVarsForTablet(isGestureMode = false)
+        windowBounds = WindowBounds(Rect(0, 0, 1300, 2560), Rect(0, 104, 0, 0))
+        val dp = newDP()
+        dp.isTaskbarPresentInApps = true
+
+        assertThat(dp.hotseatBarEndOffset).isEqualTo(0)
+        assertThat(dp.numShownHotseatIcons).isEqualTo(6)
+        assertThat(dp.hotseatBorderSpace).isEqualTo(94)
+
+        assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(121)
+        assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(121)
+
+        assertThat(dp.isQsbInline).isFalse()
+        assertThat(dp.hotseatQsbWidth).isEqualTo(1058)
+    }
+
+    /**
+     * This is a case when after setting the hotseat, the space needs to be recalculated
+     * but it doesn't need to change QSB width or remove icons
+     */
+    @Test
+    fun distribute_border_space_when_space_is_enough_landscape() {
+        initializeVarsForTwoPanel(isGestureMode = false, isLandscape = true)
+        val dp = newDP()
+        dp.isTaskbarPresentInApps = true
+
+        assertThat(dp.hotseatBarEndOffset).isEqualTo(0)
+        assertThat(dp.numShownHotseatIcons).isEqualTo(6)
+        assertThat(dp.hotseatBorderSpace).isEqualTo(105)
+
+        assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(370)
+        assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(370)
+
+        assertThat(dp.isQsbInline).isFalse()
+        assertThat(dp.hotseatQsbWidth).isEqualTo(1467)
+    }
+
+    /**
+     * This is a case when the hotseat spans a certain amount of columns
+     * and the nav buttons push the hotseat to the side, but not enough to change the border space.
+     */
+    @Test
+    fun nav_buttons_dont_interfere_with_required_hotseat_width() {
+        initializeVarsForTablet(isGestureMode = false, isLandscape = true)
+        inv?.apply {
+            hotseatColumnSpan = IntArray(4) { 4 }
+            inlineQsb = BooleanArray(4) { false }
+        }
+        val dp = newDP()
+        dp.isTaskbarPresentInApps = true
+
+        assertThat(dp.hotseatBarEndOffset).isEqualTo(0)
+        assertThat(dp.numShownHotseatIcons).isEqualTo(6)
+        assertThat(dp.hotseatBorderSpace).isEqualTo(100)
+
+        assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(668)
+        assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(668)
+
+        assertThat(dp.isQsbInline).isFalse()
+        assertThat(dp.hotseatQsbWidth).isEqualTo(1224)
+    }
+
+    /**
+     * This is a case when after setting the hotseat, the QSB width needs to be changed to fit
+     */
+    @Test
+    fun decrease_qsb_when_not_enough_space_landscape() {
+        initializeVarsForTablet(isGestureMode = false, isLandscape = true)
+        windowBounds = WindowBounds(Rect(0, 0, 2460, 1600), Rect(0, 104, 0, 0))
+        val dp = newDP()
+        dp.isTaskbarPresentInApps = true
+
+        assertThat(dp.hotseatBarEndOffset).isEqualTo(0)
+        assertThat(dp.numShownHotseatIcons).isEqualTo(6)
+        assertThat(dp.hotseatBorderSpace).isEqualTo(96)
+
+        assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(643)
+        assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(643)
+
+        assertThat(dp.isQsbInline).isFalse()
+        assertThat(dp.hotseatQsbWidth).isEqualTo(1174)
+    }
+
+    /**
+     * This is a case when after setting the hotseat, changing QSB width, and recalculating spaces
+     * it still needs to remove icons for everything to fit
+     */
+    @Test
+    fun decrease_num_of_icons_when_not_enough_space_landscape() {
+        initializeVarsForTablet(isGestureMode = false, isLandscape = true)
+        windowBounds = WindowBounds(Rect(0, 0, 2260, 1600), Rect(0, 104, 0, 0))
+        val dp = newDP()
+        dp.isTaskbarPresentInApps = true
+
+        assertThat(dp.hotseatBarEndOffset).isEqualTo(0)
+        assertThat(dp.numShownHotseatIcons).isEqualTo(6)
+        assertThat(dp.hotseatBorderSpace).isEqualTo(89)
+
+        assertThat(dp.getHotseatLayoutPadding(context).left).isEqualTo(589)
+        assertThat(dp.getHotseatLayoutPadding(context).right).isEqualTo(589)
+
+        assertThat(dp.isQsbInline).isFalse()
+        assertThat(dp.hotseatQsbWidth).isEqualTo(1081)
+    }
+}
diff --git a/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java b/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java
index 1f6e1ec..304153f 100644
--- a/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java
+++ b/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java
@@ -61,7 +61,7 @@
 import com.android.launcher3.tapl.LauncherInstrumentation.ContainerType;
 import com.android.launcher3.tapl.TestHelpers;
 import com.android.launcher3.testcomponent.TestCommandReceiver;
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 import com.android.launcher3.util.LooperExecutor;
 import com.android.launcher3.util.PackageManagerHelper;
 import com.android.launcher3.util.Wait;
diff --git a/tests/src/com/android/launcher3/ui/PortraitLandscapeRunner.java b/tests/src/com/android/launcher3/ui/PortraitLandscapeRunner.java
index 8f2d528..266f0ae 100644
--- a/tests/src/com/android/launcher3/ui/PortraitLandscapeRunner.java
+++ b/tests/src/com/android/launcher3/ui/PortraitLandscapeRunner.java
@@ -4,7 +4,6 @@
 import android.view.Surface;
 
 import com.android.launcher3.tapl.TestHelpers;
-import com.android.launcher3.testing.TestProtocol;
 
 import org.junit.rules.TestRule;
 import org.junit.runner.Description;
diff --git a/tests/tapl/com/android/launcher3/tapl/AllApps.java b/tests/tapl/com/android/launcher3/tapl/AllApps.java
index bfb115d..4791846 100644
--- a/tests/tapl/com/android/launcher3/tapl/AllApps.java
+++ b/tests/tapl/com/android/launcher3/tapl/AllApps.java
@@ -29,7 +29,7 @@
 import androidx.test.uiautomator.StaleObjectException;
 import androidx.test.uiautomator.UiObject2;
 
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 
 import java.util.stream.Collectors;
 
diff --git a/tests/tapl/com/android/launcher3/tapl/AppIcon.java b/tests/tapl/com/android/launcher3/tapl/AppIcon.java
index e28f0af..d221259 100644
--- a/tests/tapl/com/android/launcher3/tapl/AppIcon.java
+++ b/tests/tapl/com/android/launcher3/tapl/AppIcon.java
@@ -22,7 +22,7 @@
 import androidx.test.uiautomator.BySelector;
 import androidx.test.uiautomator.UiObject2;
 
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 
 import java.util.regex.Pattern;
 
diff --git a/tests/tapl/com/android/launcher3/tapl/AppIconMenuItem.java b/tests/tapl/com/android/launcher3/tapl/AppIconMenuItem.java
index 5cf5aba..284168b 100644
--- a/tests/tapl/com/android/launcher3/tapl/AppIconMenuItem.java
+++ b/tests/tapl/com/android/launcher3/tapl/AppIconMenuItem.java
@@ -18,7 +18,7 @@
 
 import androidx.test.uiautomator.UiObject2;
 
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 
 /**
  * Menu item in an app icon menu.
diff --git a/tests/tapl/com/android/launcher3/tapl/Background.java b/tests/tapl/com/android/launcher3/tapl/Background.java
index 589e13c..eb8d055 100644
--- a/tests/tapl/com/android/launcher3/tapl/Background.java
+++ b/tests/tapl/com/android/launcher3/tapl/Background.java
@@ -19,7 +19,7 @@
 import static android.view.accessibility.AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED;
 
 import static com.android.launcher3.tapl.OverviewTask.TASK_START_EVENT;
-import static com.android.launcher3.testing.TestProtocol.OVERVIEW_STATE_ORDINAL;
+import static com.android.launcher3.testing.shared.TestProtocol.OVERVIEW_STATE_ORDINAL;
 
 import android.graphics.Point;
 import android.os.SystemClock;
@@ -28,7 +28,7 @@
 import androidx.annotation.NonNull;
 import androidx.test.uiautomator.UiObject2;
 
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 
 import java.util.List;
 import java.util.regex.Pattern;
diff --git a/tests/tapl/com/android/launcher3/tapl/FolderIcon.java b/tests/tapl/com/android/launcher3/tapl/FolderIcon.java
index 9b4717f..0c453bd 100644
--- a/tests/tapl/com/android/launcher3/tapl/FolderIcon.java
+++ b/tests/tapl/com/android/launcher3/tapl/FolderIcon.java
@@ -21,7 +21,7 @@
 import androidx.annotation.NonNull;
 import androidx.test.uiautomator.UiObject2;
 
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 
 /**
  * Folder Icon, an app folder in workspace.
diff --git a/tests/tapl/com/android/launcher3/tapl/Launchable.java b/tests/tapl/com/android/launcher3/tapl/Launchable.java
index 33fea2d..3dcb437 100644
--- a/tests/tapl/com/android/launcher3/tapl/Launchable.java
+++ b/tests/tapl/com/android/launcher3/tapl/Launchable.java
@@ -16,7 +16,7 @@
 
 package com.android.launcher3.tapl;
 
-import static com.android.launcher3.testing.TestProtocol.SPRING_LOADED_STATE_ORDINAL;
+import static com.android.launcher3.testing.shared.TestProtocol.SPRING_LOADED_STATE_ORDINAL;
 
 import android.graphics.Point;
 import android.view.MotionEvent;
@@ -26,7 +26,7 @@
 import androidx.test.uiautomator.UiObject2;
 import androidx.test.uiautomator.Until;
 
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 
 /**
  * Ancestor for AppIcon and AppMenuItem.
diff --git a/tests/tapl/com/android/launcher3/tapl/LaunchedAppState.java b/tests/tapl/com/android/launcher3/tapl/LaunchedAppState.java
index 046d36b..04167839 100644
--- a/tests/tapl/com/android/launcher3/tapl/LaunchedAppState.java
+++ b/tests/tapl/com/android/launcher3/tapl/LaunchedAppState.java
@@ -16,9 +16,9 @@
 
 package com.android.launcher3.tapl;
 
-import static com.android.launcher3.testing.TestProtocol.REQUEST_DISABLE_MANUAL_TASKBAR_STASHING;
-import static com.android.launcher3.testing.TestProtocol.REQUEST_ENABLE_MANUAL_TASKBAR_STASHING;
-import static com.android.launcher3.testing.TestProtocol.REQUEST_STASHED_TASKBAR_HEIGHT;
+import static com.android.launcher3.testing.shared.TestProtocol.REQUEST_DISABLE_MANUAL_TASKBAR_STASHING;
+import static com.android.launcher3.testing.shared.TestProtocol.REQUEST_ENABLE_MANUAL_TASKBAR_STASHING;
+import static com.android.launcher3.testing.shared.TestProtocol.REQUEST_STASHED_TASKBAR_HEIGHT;
 
 import android.graphics.Point;
 import android.graphics.Rect;
@@ -27,7 +27,7 @@
 
 import androidx.test.uiautomator.By;
 
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 
 /**
  * Background state operations specific to when an app has been launched.
diff --git a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java
index 5f92097..caaeef8 100644
--- a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java
+++ b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java
@@ -23,7 +23,7 @@
 
 import static com.android.launcher3.tapl.Folder.FOLDER_CONTENT_RES_ID;
 import static com.android.launcher3.tapl.TestHelpers.getOverviewPackageName;
-import static com.android.launcher3.testing.TestProtocol.NORMAL_STATE_ORDINAL;
+import static com.android.launcher3.testing.shared.TestProtocol.NORMAL_STATE_ORDINAL;
 
 import android.app.ActivityManager;
 import android.app.Instrumentation;
@@ -65,9 +65,9 @@
 import androidx.test.uiautomator.UiObject2;
 import androidx.test.uiautomator.Until;
 
-import com.android.launcher3.ResourceUtils;
-import com.android.launcher3.testing.TestInformationRequest;
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.ResourceUtils;
+import com.android.launcher3.testing.shared.TestInformationRequest;
+import com.android.launcher3.testing.shared.TestProtocol;
 import com.android.systemui.shared.system.ContextUtils;
 import com.android.systemui.shared.system.QuickStepContract;
 
diff --git a/tests/tapl/com/android/launcher3/tapl/LogEventChecker.java b/tests/tapl/com/android/launcher3/tapl/LogEventChecker.java
index 710e3cd..672c6e0 100644
--- a/tests/tapl/com/android/launcher3/tapl/LogEventChecker.java
+++ b/tests/tapl/com/android/launcher3/tapl/LogEventChecker.java
@@ -15,13 +15,13 @@
  */
 package com.android.launcher3.tapl;
 
-import static com.android.launcher3.testing.TestProtocol.SEQUENCE_MAIN;
-import static com.android.launcher3.testing.TestProtocol.SEQUENCE_PILFER;
-import static com.android.launcher3.testing.TestProtocol.SEQUENCE_TIS;
+import static com.android.launcher3.testing.shared.TestProtocol.SEQUENCE_MAIN;
+import static com.android.launcher3.testing.shared.TestProtocol.SEQUENCE_PILFER;
+import static com.android.launcher3.testing.shared.TestProtocol.SEQUENCE_TIS;
 
 import android.os.SystemClock;
 
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 
 import java.util.ArrayList;
 import java.util.HashMap;
diff --git a/tests/tapl/com/android/launcher3/tapl/OverviewActions.java b/tests/tapl/com/android/launcher3/tapl/OverviewActions.java
index 5710713..386deac 100644
--- a/tests/tapl/com/android/launcher3/tapl/OverviewActions.java
+++ b/tests/tapl/com/android/launcher3/tapl/OverviewActions.java
@@ -19,7 +19,7 @@
 import androidx.annotation.NonNull;
 import androidx.test.uiautomator.UiObject2;
 
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 
 /**
  * View containing overview actions
diff --git a/tests/tapl/com/android/launcher3/tapl/OverviewTask.java b/tests/tapl/com/android/launcher3/tapl/OverviewTask.java
index ac7424e..72a39df 100644
--- a/tests/tapl/com/android/launcher3/tapl/OverviewTask.java
+++ b/tests/tapl/com/android/launcher3/tapl/OverviewTask.java
@@ -24,7 +24,7 @@
 import androidx.test.uiautomator.BySelector;
 import androidx.test.uiautomator.UiObject2;
 
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 
 import java.util.List;
 import java.util.regex.Pattern;
diff --git a/tests/tapl/com/android/launcher3/tapl/Taskbar.java b/tests/tapl/com/android/launcher3/tapl/Taskbar.java
index b5a08c3..5d9be36 100644
--- a/tests/tapl/com/android/launcher3/tapl/Taskbar.java
+++ b/tests/tapl/com/android/launcher3/tapl/Taskbar.java
@@ -15,8 +15,8 @@
  */
 package com.android.launcher3.tapl;
 
-import static com.android.launcher3.testing.TestProtocol.REQUEST_DISABLE_MANUAL_TASKBAR_STASHING;
-import static com.android.launcher3.testing.TestProtocol.REQUEST_ENABLE_MANUAL_TASKBAR_STASHING;
+import static com.android.launcher3.testing.shared.TestProtocol.REQUEST_DISABLE_MANUAL_TASKBAR_STASHING;
+import static com.android.launcher3.testing.shared.TestProtocol.REQUEST_ENABLE_MANUAL_TASKBAR_STASHING;
 
 import android.graphics.Point;
 import android.os.SystemClock;
diff --git a/tests/tapl/com/android/launcher3/tapl/TaskbarAppIconMenuItem.java b/tests/tapl/com/android/launcher3/tapl/TaskbarAppIconMenuItem.java
index 69a8a08..424c58e 100644
--- a/tests/tapl/com/android/launcher3/tapl/TaskbarAppIconMenuItem.java
+++ b/tests/tapl/com/android/launcher3/tapl/TaskbarAppIconMenuItem.java
@@ -17,7 +17,7 @@
 
 import androidx.test.uiautomator.UiObject2;
 
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 
 import java.util.regex.Pattern;
 
diff --git a/tests/tapl/com/android/launcher3/tapl/Widget.java b/tests/tapl/com/android/launcher3/tapl/Widget.java
index e1a09af..29eb46c 100644
--- a/tests/tapl/com/android/launcher3/tapl/Widget.java
+++ b/tests/tapl/com/android/launcher3/tapl/Widget.java
@@ -23,7 +23,7 @@
 import androidx.test.uiautomator.UiObject2;
 import androidx.test.uiautomator.Until;
 
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 
 import java.util.regex.Pattern;
 
diff --git a/tests/tapl/com/android/launcher3/tapl/Widgets.java b/tests/tapl/com/android/launcher3/tapl/Widgets.java
index 7fd68c0..96e2e3f 100644
--- a/tests/tapl/com/android/launcher3/tapl/Widgets.java
+++ b/tests/tapl/com/android/launcher3/tapl/Widgets.java
@@ -27,7 +27,7 @@
 import androidx.test.uiautomator.UiObject2;
 import androidx.test.uiautomator.Until;
 
-import com.android.launcher3.testing.TestProtocol;
+import com.android.launcher3.testing.shared.TestProtocol;
 
 import java.util.Collection;
 
diff --git a/tests/tapl/com/android/launcher3/tapl/Workspace.java b/tests/tapl/com/android/launcher3/tapl/Workspace.java
index 6044b06..efbdb23 100644
--- a/tests/tapl/com/android/launcher3/tapl/Workspace.java
+++ b/tests/tapl/com/android/launcher3/tapl/Workspace.java
@@ -18,8 +18,8 @@
 
 import static android.view.accessibility.AccessibilityEvent.TYPE_VIEW_SCROLLED;
 
-import static com.android.launcher3.testing.TestProtocol.ALL_APPS_STATE_ORDINAL;
-import static com.android.launcher3.testing.TestProtocol.NORMAL_STATE_ORDINAL;
+import static com.android.launcher3.testing.shared.TestProtocol.ALL_APPS_STATE_ORDINAL;
+import static com.android.launcher3.testing.shared.TestProtocol.NORMAL_STATE_ORDINAL;
 
 import static junit.framework.TestCase.assertNotNull;
 import static junit.framework.TestCase.assertTrue;
@@ -39,9 +39,9 @@
 import androidx.test.uiautomator.UiObject2;
 import androidx.test.uiautomator.Until;
 
-import com.android.launcher3.testing.HotseatCellCenterRequest;
-import com.android.launcher3.testing.TestProtocol;
-import com.android.launcher3.testing.WorkspaceCellCenterRequest;
+import com.android.launcher3.testing.shared.HotseatCellCenterRequest;
+import com.android.launcher3.testing.shared.TestProtocol;
+import com.android.launcher3.testing.shared.WorkspaceCellCenterRequest;
 
 import java.util.List;
 import java.util.Map;