diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
index 3145ec3..2280b95 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
@@ -23,8 +23,8 @@
 
 import static com.android.launcher3.AbstractFloatingView.TYPE_ALL;
 import static com.android.launcher3.AbstractFloatingView.TYPE_REBIND_SAFE;
-import static com.android.launcher3.testing.shared.ResourceUtils.getBoolByName;
 import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_FOLDER_OPEN;
+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;
@@ -846,6 +846,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/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java
index 2df9b9c..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.testing.shared.ResourceUtils;
 import com.android.launcher3.Utilities;
 import com.android.launcher3.config.FeatureFlags;
 import com.android.launcher3.provider.RestoreDbTask;
@@ -73,6 +72,7 @@
 import com.android.launcher3.taskbar.TaskbarActivityContext;
 import com.android.launcher3.taskbar.TaskbarManager;
 import com.android.launcher3.testing.TestLogging;
+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;
@@ -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/tests/src/com/android/quickstep/DeviceProfilePhone3ButtonTest.kt b/quickstep/tests/src/com/android/quickstep/DeviceProfilePhone3ButtonTest.kt
deleted file mode 100644
index f41de72..0000000
--- a/quickstep/tests/src/com/android/quickstep/DeviceProfilePhone3ButtonTest.kt
+++ /dev/null
@@ -1,481 +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 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(224)
-    }
-
-    @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(0)
-    }
-
-    @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 fe3fd00..0000000
--- a/quickstep/tests/src/com/android/quickstep/DeviceProfilePhoneTest.kt
+++ /dev/null
@@ -1,481 +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 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(224)
-    }
-
-    @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(0)
-    }
-
-    @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 33866f0..0000000
--- a/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletLandscape3ButtonTest.kt
+++ /dev/null
@@ -1,481 +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 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(128)
-    }
-
-    @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(72)
-    }
-
-    @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 e61a890..0000000
--- a/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletLandscapeTest.kt
+++ /dev/null
@@ -1,481 +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 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(128)
-    }
-
-    @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(72)
-    }
-
-    @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 3f350de..0000000
--- a/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletPortrait3ButtonTest.kt
+++ /dev/null
@@ -1,481 +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 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(128)
-    }
-
-    @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(72)
-    }
-
-    @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 444f7ea..0000000
--- a/quickstep/tests/src/com/android/quickstep/DeviceProfileTabletPortraitTest.kt
+++ /dev/null
@@ -1,481 +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 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(128)
-    }
-
-    @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(72)
-    }
-
-    @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..1208a2a
--- /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" +
+                "\tqsbWidth: 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" +
+                "\tqsbWidth: 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: 597.0px (298.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: 959.0px (479.5dp)\n" +
+                "\tgetHotseatLayoutPadding(context).right: 597.0px (298.5dp)\n" +
+                "\tnumShownHotseatIcons: 5\n" +
+                "\thotseatBorderSpace: 101.0px (50.5dp)\n" +
+                "\tisQsbInline: true\n" +
+                "\tqsbWidth: 855.0px (427.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" +
+                "\tqsbWidth: 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: 1856.0px (928.0dp)\n" +
+                "\tallAppsTopPadding: 704.0px (352.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: 460.0px (230.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: 76.0px (38.0dp)\n" +
+                "\tgetHotseatLayoutPadding(context).right: 460.0px (230.0dp)\n" +
+                "\tnumShownHotseatIcons: 5\n" +
+                "\thotseatBorderSpace: 116.0px (58.0dp)\n" +
+                "\tisQsbInline: false\n" +
+                "\tqsbWidth: 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: 1856.0px (928.0dp)\n" +
+                "\tallAppsTopPadding: 704.0px (352.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" +
+                "\tqsbWidth: 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: 216.0px (82.28571dp)\n" +
+                "\tgetHotseatLayoutPadding(context).right: 744.0px (283.42856dp)\n" +
+                "\tnumShownHotseatIcons: 6\n" +
+                "\thotseatBorderSpace: 61.0px (23.238094dp)\n" +
+                "\tisQsbInline: false\n" +
+                "\tqsbWidth: 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" +
+                "\tqsbWidth: 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: 128.0px (48.761906dp)\n" +
+                "\tgetHotseatLayoutPadding(context).right: 660.0px (251.42857dp)\n" +
+                "\tnumShownHotseatIcons: 6\n" +
+                "\thotseatBorderSpace: 47.0px (17.904762dp)\n" +
+                "\tisQsbInline: false\n" +
+                "\tqsbWidth: 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" +
+                "\tqsbWidth: 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" +
+                "\tqsbWidth: 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" +
+                "\tqsbWidth: 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 92ab2b1..0000000
--- a/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelLandscape3ButtonTest.kt
+++ /dev/null
@@ -1,481 +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 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(128)
-    }
-
-    @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(72)
-    }
-
-    @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 6c730ca..0000000
--- a/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelLandscapeTest.kt
+++ /dev/null
@@ -1,481 +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 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(128)
-    }
-
-    @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(72)
-    }
-
-    @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 9048b3b..0000000
--- a/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelPortrait3ButtonTest.kt
+++ /dev/null
@@ -1,481 +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 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(128)
-    }
-
-    @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(72)
-    }
-
-    @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 b737c3a..0000000
--- a/quickstep/tests/src/com/android/quickstep/DeviceProfileTwoPanelPortraitTest.kt
+++ /dev/null
@@ -1,481 +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 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(128)
-    }
-
-    @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(72)
-    }
-
-    @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 d90f56b..0000000
--- a/quickstep/tests/src/com/android/quickstep/DeviceProfileVerticalBar3ButtonTest.kt
+++ /dev/null
@@ -1,481 +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 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(224)
-    }
-
-    @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(0)
-    }
-
-    @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 522a650..0000000
--- a/quickstep/tests/src/com/android/quickstep/DeviceProfileVerticalBarTest.kt
+++ /dev/null
@@ -1,481 +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 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(224)
-    }
-
-    @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(0)
-    }
-
-    @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/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java
index 44eb4f7..0faa75d 100644
--- a/src/com/android/launcher3/DeviceProfile.java
+++ b/src/com/android/launcher3/DeviceProfile.java
@@ -20,10 +20,10 @@
 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.testing.shared.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.testing.shared.ResourceUtils.pxFromDp;
 
 import android.annotation.SuppressLint;
 import android.content.Context;
@@ -108,8 +108,6 @@
 
     public final int edgeMarginPx;
     public final float workspaceContentScale;
-    private float mWorkspaceSpringLoadShrunkTop;
-    private float mWorkspaceSpringLoadShrunkBottom;
     public final int workspaceSpringLoadedMinNextPageVisiblePx;
 
     private final int extraSpace;
@@ -219,7 +217,6 @@
     // 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;
 
@@ -910,40 +907,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
@@ -1028,6 +1024,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
@@ -1041,10 +1038,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) {
@@ -1061,26 +1058,26 @@
             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 += additionalQsbSpace;
             } else {
-                mHotseatBarPadding.left += additionalQsbSpace;
+                hotseatBarPadding.left += additionalQsbSpace;
             }
 
             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,
+            hotseatBarPadding.set(sideSpacing,
                     0,
                     sideSpacing,
                     getHotseatBarBottomPadding());
@@ -1092,7 +1089,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,
@@ -1100,7 +1097,7 @@
                             + mInsets.right,
                     getHotseatBarBottomPadding());
         }
-        return mHotseatBarPadding;
+        return hotseatBarPadding;
     }
 
     /**
@@ -1238,8 +1235,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");
 
@@ -1285,9 +1282,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));
 
@@ -1337,10 +1337,15 @@
         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);
@@ -1393,30 +1398,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());
diff --git a/src/com/android/launcher3/DropTargetBar.java b/src/com/android/launcher3/DropTargetBar.java
index 3eb2ee0..d64cb26 100644
--- a/src/com/android/launcher3/DropTargetBar.java
+++ b/src/com/android/launcher3/DropTargetBar.java
@@ -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/Launcher.java b/src/com/android/launcher3/Launcher.java
index 4611408..ff9fe90 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -3036,7 +3036,7 @@
         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/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/states/SpringLoadedState.java b/src/com/android/launcher3/states/SpringLoadedState.java
index a205ab5..3ca8ba2 100644
--- a/src/com/android/launcher3/states/SpringLoadedState.java
+++ b/src/com/android/launcher3/states/SpringLoadedState.java
@@ -52,7 +52,7 @@
         }
 
         float shrunkTop = grid.getCellLayoutSpringLoadShrunkTop();
-        float scale = grid.getWorkspaceSpringLoadScale();
+        float scale = grid.getWorkspaceSpringLoadScale(launcher);
 
         float halfHeight = ws.getHeight() / 2;
         float myCenter = ws.getTop() + halfHeight;
diff --git a/src/com/android/launcher3/testing/shared/ResourceUtils.java b/src/com/android/launcher3/testing/shared/ResourceUtils.java
index af462cc..551aeaf 100644
--- a/src/com/android/launcher3/testing/shared/ResourceUtils.java
+++ b/src/com/android/launcher3/testing/shared/ResourceUtils.java
@@ -21,6 +21,7 @@
 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/tests/src/com/android/launcher3/DeviceProfileBaseTest.kt b/tests/src/com/android/launcher3/DeviceProfileBaseTest.kt
index 7465db5..4732fc1 100644
--- a/tests/src/com/android/launcher3/DeviceProfileBaseTest.kt
+++ b/tests/src/com/android/launcher3/DeviceProfileBaseTest.kt
@@ -17,11 +17,13 @@
 
 import android.content.Context
 import android.graphics.PointF
+import android.graphics.Rect
 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 +39,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() {
@@ -60,112 +65,287 @@
     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
+            hotseatBorderSpaces = FloatArray(4) { 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
+
+            numShrunkenHotseatIcons = 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()
+            hotseatBorderSpaces = floatArrayOf(58f, 50.4f, 58f, 58f)
+            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
+
+            numShrunkenHotseatIcons = 5
+
+            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
+            hotseatBorderSpaces = floatArrayOf(36f, 36f, 18f, 23.3f)
+            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
+
+            numShrunkenHotseatIcons = 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
index 5dabb33..95651ca 100644
--- a/tests/src/com/android/launcher3/HotseatShownIconsTest.kt
+++ b/tests/src/com/android/launcher3/HotseatShownIconsTest.kt
@@ -34,7 +34,7 @@
     @Test
     fun hotseat_size_is_shrunk_if_needed_when_large_screen() {
         initializeVarsForTablet(isLandscape = true)
-        inv = newScalableInvariantDeviceProfile().apply {
+        inv = inv!!.apply {
             deviceType = TYPE_MULTI_DISPLAY
             inlineQsb = booleanArrayOf(
                 false,
@@ -64,7 +64,7 @@
     @Test
     fun hotseat_size_is_shrunk_even_in_portrait_when_large_screen() {
         initializeVarsForTablet()
-        inv = newScalableInvariantDeviceProfile().apply {
+        inv = inv!!.apply {
             deviceType = TYPE_MULTI_DISPLAY
             inlineQsb = booleanArrayOf(
                 false,
@@ -90,7 +90,7 @@
     @Test
     fun hotseat_size_is_default_when_small_screen() {
         initializeVarsForPhone()
-        inv = newScalableInvariantDeviceProfile().apply {
+        inv = inv!!.apply {
             deviceType = TYPE_MULTI_DISPLAY
         }
         useTwoPanels = true
@@ -103,7 +103,7 @@
     @Test
     fun hotseat_size_is_not_shrunk_on_gesture_tablet() {
         initializeVarsForTablet(isLandscape = true)
-        inv = newScalableInvariantDeviceProfile().apply {
+        inv = inv!!.apply {
             deviceType = TYPE_TABLET
             inlineQsb = booleanArrayOf(
                     false,
@@ -129,7 +129,7 @@
     @Test
     fun hotseat_size_is_shrunk_if_needed_on_tablet() {
         initializeVarsForTablet(isLandscape = true)
-        inv = newScalableInvariantDeviceProfile().apply {
+        inv = inv!!.apply {
             deviceType = TYPE_TABLET
             inlineQsb = booleanArrayOf(
                 false,
@@ -159,7 +159,7 @@
     @Test
     fun hotseat_size_is_shrunk_even_in_portrait_on_tablet() {
         initializeVarsForTablet()
-        inv = newScalableInvariantDeviceProfile().apply {
+        inv = inv!!.apply {
             deviceType = TYPE_TABLET
             inlineQsb = booleanArrayOf(
                 false,
