Merge "Import translations. DO NOT MERGE ANYWHERE" into tm-qpr-dev
diff --git a/quickstep/res/drawable/keyboard_quick_switch_overview_button_background.xml b/quickstep/res/drawable/keyboard_quick_switch_overview_button_background.xml
new file mode 100644
index 0000000..286a3c4
--- /dev/null
+++ b/quickstep/res/drawable/keyboard_quick_switch_overview_button_background.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2023 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.
+-->
+<shape
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+    android:shape="rectangle">
+    <solid android:color="?androidprv:attr/colorSurfaceVariant" />
+    <corners android:radius="@dimen/keyboard_quick_switch_task_view_radius" />
+</shape>
diff --git a/quickstep/res/drawable/keyboard_quick_switch_task_view_background.xml b/quickstep/res/drawable/keyboard_quick_switch_task_view_background.xml
new file mode 100644
index 0000000..d0aac8c
--- /dev/null
+++ b/quickstep/res/drawable/keyboard_quick_switch_task_view_background.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2023 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.
+-->
+<shape
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <solid android:color="@android:color/transparent" />
+    <corners android:radius="@dimen/keyboard_quick_switch_task_view_radius" />
+</shape>
diff --git a/quickstep/res/drawable/keyboard_quick_switch_view_background.xml b/quickstep/res/drawable/keyboard_quick_switch_view_background.xml
new file mode 100644
index 0000000..19aaed4
--- /dev/null
+++ b/quickstep/res/drawable/keyboard_quick_switch_view_background.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2023 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.
+-->
+<shape
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <solid android:color="?attr/overviewScrimColor" />
+    <corners android:radius="@dimen/keyboard_quick_switch_view_radius" />
+</shape>
diff --git a/quickstep/res/layout-land/keyboard_quick_switch_taskview.xml b/quickstep/res/layout-land/keyboard_quick_switch_taskview.xml
new file mode 100644
index 0000000..18c0e1f
--- /dev/null
+++ b/quickstep/res/layout-land/keyboard_quick_switch_taskview.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2023 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<com.android.launcher3.taskbar.KeyboardQuickSwitchTaskView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:launcher="http://schemas.android.com/apk/res-auto"
+    android:layout_width="@dimen/keyboard_quick_switch_taskview_width"
+    android:layout_height="@dimen/keyboard_quick_switch_taskview_height"
+    android:importantForAccessibility="yes"
+    android:background="@drawable/keyboard_quick_switch_task_view_background"
+    android:clipToOutline="true"
+    launcher:borderColor="?androidprv:attr/colorAccentSecondaryVariant">
+
+    <include
+        layout="@layout/keyboard_quick_switch_thumbnail"
+        android:id="@+id/thumbnail1"
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toStartOf="@id/thumbnail2"/>
+
+    <include
+        layout="@layout/keyboard_quick_switch_thumbnail"
+        android:id="@+id/thumbnail2"
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        android:visibility="gone"
+        android:layout_marginStart="@dimen/keyboard_quick_switch_split_view_spacing"
+
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintStart_toEndOf="@id/thumbnail1"
+        app:layout_constraintEnd_toEndOf="parent"/>
+
+</com.android.launcher3.taskbar.KeyboardQuickSwitchTaskView>
diff --git a/quickstep/res/layout/keyboard_quick_switch_overview.xml b/quickstep/res/layout/keyboard_quick_switch_overview.xml
new file mode 100644
index 0000000..bf21a3e
--- /dev/null
+++ b/quickstep/res/layout/keyboard_quick_switch_overview.xml
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2023 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<com.android.launcher3.taskbar.KeyboardQuickSwitchTaskView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:launcher="http://schemas.android.com/apk/res-auto"
+    android:layout_width="@dimen/keyboard_quick_switch_taskview_width"
+    android:layout_height="@dimen/keyboard_quick_switch_taskview_height"
+    android:background="@drawable/keyboard_quick_switch_overview_button_background"
+    android:clipToOutline="true"
+    android:importantForAccessibility="yes"
+    launcher:borderColor="?androidprv:attr/colorAccentSecondaryVariant">
+
+    <ImageView
+        android:id="@+id/icon"
+        android:layout_width="@dimen/keyboard_quick_switch_recents_icon_size"
+        android:layout_height="@dimen/keyboard_quick_switch_recents_icon_size"
+        android:layout_marginBottom="8dp"
+        android:src="@drawable/ic_empty_recents"
+
+        app:tint="?android:attr/textColorPrimary"
+        app:layout_constraintVertical_chainStyle="packed"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintBottom_toTopOf="@id/text"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"/>
+
+    <TextView
+        style="@style/KeyboardQuickSwitchOverview"
+        android:id="@+id/text"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:textAlignment="center"
+
+        app:layout_constraintTop_toBottomOf="@id/icon"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"/>
+
+</com.android.launcher3.taskbar.KeyboardQuickSwitchTaskView>
diff --git a/quickstep/res/layout/keyboard_quick_switch_taskview.xml b/quickstep/res/layout/keyboard_quick_switch_taskview.xml
new file mode 100644
index 0000000..48e6276
--- /dev/null
+++ b/quickstep/res/layout/keyboard_quick_switch_taskview.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2023 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<com.android.launcher3.taskbar.KeyboardQuickSwitchTaskView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:launcher="http://schemas.android.com/apk/res-auto"
+    android:layout_width="@dimen/keyboard_quick_switch_taskview_width"
+    android:layout_height="@dimen/keyboard_quick_switch_taskview_height"
+    android:importantForAccessibility="yes"
+    android:background="@drawable/keyboard_quick_switch_task_view_background"
+    android:clipToOutline="true"
+    launcher:borderColor="?androidprv:attr/colorAccentSecondaryVariant">
+
+        <include
+            layout="@layout/keyboard_quick_switch_thumbnail"
+            android:id="@+id/thumbnail1"
+            android:layout_width="match_parent"
+            android:layout_height="0dp"
+
+            app:layout_constraintTop_toTopOf="parent"
+            app:layout_constraintBottom_toTopOf="@id/thumbnail2"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"/>
+
+        <include
+            layout="@layout/keyboard_quick_switch_thumbnail"
+            android:id="@+id/thumbnail2"
+            android:layout_width="match_parent"
+            android:layout_height="0dp"
+            android:visibility="gone"
+            android:layout_marginTop="@dimen/keyboard_quick_switch_split_view_spacing"
+
+            app:layout_constraintTop_toBottomOf="@id/thumbnail1"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:layout_constraintEnd_toEndOf="parent"/>
+
+</com.android.launcher3.taskbar.KeyboardQuickSwitchTaskView>
diff --git a/quickstep/res/layout/keyboard_quick_switch_thumbnail.xml b/quickstep/res/layout/keyboard_quick_switch_thumbnail.xml
new file mode 100644
index 0000000..cd6587c
--- /dev/null
+++ b/quickstep/res/layout/keyboard_quick_switch_thumbnail.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2023 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.
+-->
+<ImageView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:scaleType="centerCrop"
+    android:background="@drawable/keyboard_quick_switch_task_view_background"
+    android:clipToOutline="true"/>
diff --git a/quickstep/res/layout/keyboard_quick_switch_view.xml b/quickstep/res/layout/keyboard_quick_switch_view.xml
new file mode 100644
index 0000000..5c20a2d
--- /dev/null
+++ b/quickstep/res/layout/keyboard_quick_switch_view.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2023 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<com.android.launcher3.taskbar.KeyboardQuickSwitchView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:paddingVertical="@dimen/keyboard_quick_switch_view_spacing"
+    android:layout_marginTop="@dimen/keyboard_quick_switch_margin_top"
+    android:layout_marginHorizontal="@dimen/keyboard_quick_switch_margin_ends"
+    android:background="@drawable/keyboard_quick_switch_view_background"
+    android:clipToOutline="true"
+    android:alpha="0"
+    android:visibility="invisible"
+    android:focusableInTouchMode="true">
+
+    <HorizontalScrollView
+        android:id="@+id/scroll_view"
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        android:fillViewport="true"
+        android:scrollbars="none"
+        android:alpha="0"
+        android:visibility="invisible"
+
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintStart_toStartOf="parent">
+
+        <androidx.constraintlayout.widget.ConstraintLayout
+            android:id="@+id/content"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"/>
+
+    </HorizontalScrollView>
+
+</com.android.launcher3.taskbar.KeyboardQuickSwitchView>
diff --git a/quickstep/res/layout/task_desktop.xml b/quickstep/res/layout/task_desktop.xml
index 96aabb4..2ec9d4c 100644
--- a/quickstep/res/layout/task_desktop.xml
+++ b/quickstep/res/layout/task_desktop.xml
@@ -17,12 +17,15 @@
 
 <com.android.quickstep.views.DesktopTaskView
     xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+    xmlns:launcher="http://schemas.android.com/apk/res-auto"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:clipChildren="true"
     android:clipToOutline="true"
     android:defaultFocusHighlightEnabled="false"
-    android:focusable="true">
+    android:focusable="true"
+    launcher:borderColor="?androidprv:attr/colorAccentSecondaryVariant">
 
     <View
         android:id="@+id/background"
diff --git a/quickstep/res/values-land/dimens.xml b/quickstep/res/values-land/dimens.xml
index 30983c4..ee594c8 100644
--- a/quickstep/res/values-land/dimens.xml
+++ b/quickstep/res/values-land/dimens.xml
@@ -82,4 +82,6 @@
     <dimen name="taskbar_suw_frame">96dp</dimen>
     <dimen name="taskbar_suw_insets">24dp</dimen>
 
-</resources>
\ No newline at end of file
+    <dimen name="keyboard_quick_switch_taskview_width">205dp</dimen>
+    <dimen name="keyboard_quick_switch_taskview_height">119dp</dimen>
+</resources>
diff --git a/quickstep/res/values/dimens.xml b/quickstep/res/values/dimens.xml
index fb04cc0..d5e8351 100644
--- a/quickstep/res/values/dimens.xml
+++ b/quickstep/res/values/dimens.xml
@@ -331,4 +331,13 @@
 
     <!-- Keyboard Quick Switch -->
     <dimen name="keyboard_quick_switch_border_width">4dp</dimen>
+    <dimen name="keyboard_quick_switch_taskview_width">104dp</dimen>
+    <dimen name="keyboard_quick_switch_taskview_height">134dp</dimen>
+    <dimen name="keyboard_quick_switch_recents_icon_size">20dp</dimen>
+    <dimen name="keyboard_quick_switch_margin_top">56dp</dimen>
+    <dimen name="keyboard_quick_switch_margin_ends">16dp</dimen>
+    <dimen name="keyboard_quick_switch_view_spacing">16dp</dimen>
+    <dimen name="keyboard_quick_switch_split_view_spacing">2dp</dimen>
+    <dimen name="keyboard_quick_switch_view_radius">28dp</dimen>
+    <dimen name="keyboard_quick_switch_task_view_radius">16dp</dimen>
 </resources>
diff --git a/quickstep/res/values/strings.xml b/quickstep/res/values/strings.xml
index d2f5802..01d92d1 100644
--- a/quickstep/res/values/strings.xml
+++ b/quickstep/res/values/strings.xml
@@ -282,4 +282,12 @@
     <string name="move_drop_target_top_or_left">Move to top&#47;left</string>
     <!-- Label for moving drop target to the bottom or right side of the screen, depending on orientation (from the Taskbar only). -->
     <string name="move_drop_target_bottom_or_right">Move to bottom&#47;right</string>
+
+    <!-- Label for quick switch tile showing how many more apps are available [CHAR LIMIT=NONE] -->
+    <string name="quick_switch_overflow">{count, plural,
+            =1{Show # more app.}
+            other{Show # more apps.}
+        }</string>
+    <!-- Accessibility label for quick switch tiles showing split tasks [CHAR LIMIT=NONE] -->
+    <string name="quick_switch_split_task"><xliff:g id="app_name_1" example="Chrome">%1$s</xliff:g> and <xliff:g id="app_name_2" example="Gmail">%2$s</xliff:g></string>
 </resources>
diff --git a/quickstep/res/values/styles.xml b/quickstep/res/values/styles.xml
index 6119eb6..4417407 100644
--- a/quickstep/res/values/styles.xml
+++ b/quickstep/res/values/styles.xml
@@ -223,4 +223,11 @@
         <item name="android:fontFamily">google-sans-text</item>
         <item name="android:textSize">14sp</item>
     </style>
-</resources>
\ No newline at end of file
+
+    <style name="KeyboardQuickSwitchOverview">
+        <item name="fontFamily">google-sans-text</item>
+        <item name="android:textSize">14sp</item>
+        <item name="android:textColor">?android:attr/textColorPrimary</item>
+        <item name="lineHeight">20sp</item>
+    </style>
+</resources>
diff --git a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchController.java b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchController.java
new file mode 100644
index 0000000..c4962cd
--- /dev/null
+++ b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchController.java
@@ -0,0 +1,192 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.launcher3.taskbar;
+
+import android.content.ComponentName;
+import android.content.pm.ActivityInfo;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.android.launcher3.R;
+import com.android.launcher3.taskbar.overlay.TaskbarOverlayContext;
+import com.android.quickstep.RecentsModel;
+import com.android.quickstep.util.GroupTask;
+import com.android.systemui.shared.recents.model.Task;
+import com.android.systemui.shared.recents.model.ThumbnailData;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.function.Consumer;
+import java.util.stream.Collectors;
+
+/**
+ * Handles initialization of the {@link KeyboardQuickSwitchViewController}.
+ */
+public final class KeyboardQuickSwitchController implements
+        TaskbarControllers.LoggableTaskbarController {
+
+    static final int MAX_TASKS = 6;
+
+    @NonNull private final ControllerCallbacks mControllerCallbacks = new ControllerCallbacks();
+
+    // Initialized on init
+    @Nullable private RecentsModel mModel;
+
+    // Used to keep track of the last requested task list id, so that we do not request to load the
+    // tasks again if we have already requested it and the task list has not changed
+    private int mTaskListChangeId = -1;
+    // Only empty before the recent tasks list has been loaded the first time
+    @NonNull private List<GroupTask> mTasks = new ArrayList<>();
+    private int mNumHiddenTasks = 0;
+
+    // Initialized in init
+    private TaskbarControllers mControllers;
+
+    @Nullable private KeyboardQuickSwitchViewController mQuickSwitchViewController;
+
+    /** Initialize the controller. */
+    public void init(@NonNull TaskbarControllers controllers) {
+        mControllers = controllers;
+        mModel = RecentsModel.INSTANCE.get(controllers.taskbarActivityContext);
+    }
+
+    void onConfigurationChanged(@ActivityInfo.Config int configChanges) {
+        if (mQuickSwitchViewController == null) {
+            return;
+        }
+        if ((configChanges & (ActivityInfo.CONFIG_KEYBOARD
+                | ActivityInfo.CONFIG_KEYBOARD_HIDDEN)) != 0) {
+            mQuickSwitchViewController.closeQuickSwitchView(true);
+            return;
+        }
+        int currentFocusedIndex = mQuickSwitchViewController.getCurrentFocusedIndex();
+        onDestroy();
+        if (currentFocusedIndex != -1) {
+            mControllers.taskbarActivityContext.getMainThreadHandler().post(
+                    () -> openQuickSwitchView(currentFocusedIndex));
+        }
+    }
+
+    void openQuickSwitchView() {
+        openQuickSwitchView(-1);
+    }
+
+    private void openQuickSwitchView(int currentFocusedIndex) {
+        if (mQuickSwitchViewController != null) {
+            return;
+        }
+        TaskbarOverlayContext overlayContext =
+                mControllers.taskbarOverlayController.requestWindow();
+        KeyboardQuickSwitchView keyboardQuickSwitchView =
+                (KeyboardQuickSwitchView) overlayContext.getLayoutInflater()
+                        .inflate(
+                                R.layout.keyboard_quick_switch_view,
+                                overlayContext.getDragLayer(),
+                                /* attachToRoot= */ false);
+        mQuickSwitchViewController = new KeyboardQuickSwitchViewController(
+                mControllers, overlayContext, keyboardQuickSwitchView, mControllerCallbacks);
+
+        if (mModel.isTaskListValid(mTaskListChangeId)) {
+            mQuickSwitchViewController.openQuickSwitchView(
+                    mTasks, mNumHiddenTasks, /* updateTasks= */ false, currentFocusedIndex);
+            return;
+        }
+        mTaskListChangeId = mModel.getTasks((tasks) -> {
+            // Only store MAX_TASK tasks, from most to least recent
+            Collections.reverse(tasks);
+            mTasks = tasks.stream().limit(MAX_TASKS).collect(Collectors.toList());
+            mNumHiddenTasks = Math.max(0, tasks.size() - MAX_TASKS);
+            mQuickSwitchViewController.openQuickSwitchView(
+                    mTasks, mNumHiddenTasks, /* updateTasks= */ true, currentFocusedIndex);
+        });
+    }
+
+    void closeQuickSwitchView() {
+        if (mQuickSwitchViewController == null) {
+            return;
+        }
+        mQuickSwitchViewController.closeQuickSwitchView(true);
+    }
+
+    /**
+     * See {@link TaskbarUIController#launchFocusedTask()}
+     */
+    int launchFocusedTask() {
+        // Return -1 so that the RecentsView is not incorrectly opened when the user closes the
+        // quick switch view by tapping the screen.
+        return mQuickSwitchViewController == null
+                ? -1 : mQuickSwitchViewController.launchFocusedTask();
+    }
+
+    void onDestroy() {
+        if (mQuickSwitchViewController != null) {
+            mQuickSwitchViewController.onDestroy();
+        }
+    }
+
+    @Override
+    public void dumpLogs(String prefix, PrintWriter pw) {
+        pw.println(prefix + "KeyboardQuickSwitchController:");
+
+        pw.println(prefix + "\tisOpen=" + (mQuickSwitchViewController != null));
+        pw.println(prefix + "\tmNumHiddenTasks=" + mNumHiddenTasks);
+        pw.println(prefix + "\tmTaskListChangeId=" + mTaskListChangeId);
+        pw.println(prefix + "\tmTasks=[");
+        for (GroupTask task : mTasks) {
+            Task task1 = task.task1;
+            Task task2 = task.task2;
+            ComponentName cn1 = task1.getTopComponent();
+            ComponentName cn2 = task2 != null ? task2.getTopComponent() : null;
+            pw.println(prefix + "\t\tt1: (id=" + task1.key.id
+                    + "; package=" + (cn1 != null ? cn1.getPackageName() + ")" : "no package)")
+                    + " t2: (id=" + (task2 != null ? task2.key.id : "-1")
+                    + "; package=" + (cn2 != null ? cn2.getPackageName() + ")"
+                    : "no package)"));
+        }
+        pw.println(prefix + "\t]");
+
+        if (mQuickSwitchViewController != null) {
+            mQuickSwitchViewController.dumpLogs(prefix + '\t', pw);
+        }
+    }
+
+    class ControllerCallbacks {
+
+        int getTaskCount() {
+            return mNumHiddenTasks == 0 ? mTasks.size() : MAX_TASKS + 1;
+        }
+
+        @Nullable
+        GroupTask getTaskAt(int index) {
+            return index < 0 || index >= mTasks.size() ? null : mTasks.get(index);
+        }
+
+        void updateThumbnailInBackground(Task task, Consumer<ThumbnailData> callback) {
+            mModel.getThumbnailCache().updateThumbnailInBackground(task, callback);
+        }
+
+        void updateTitleInBackground(Task task, Consumer<Task> callback) {
+            mModel.getIconCache().updateIconInBackground(task, callback);
+        }
+
+        void onCloseComplete() {
+            mQuickSwitchViewController = null;
+        }
+    }
+}
diff --git a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchTaskView.java b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchTaskView.java
new file mode 100644
index 0000000..84129fd
--- /dev/null
+++ b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchTaskView.java
@@ -0,0 +1,173 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.launcher3.taskbar;
+
+import static com.android.quickstep.util.BorderAnimator.DEFAULT_BORDER_COLOR;
+
+import android.animation.Animator;
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.util.AttributeSet;
+import android.widget.ImageView;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.constraintlayout.widget.ConstraintLayout;
+
+import com.android.launcher3.R;
+import com.android.quickstep.util.BorderAnimator;
+import com.android.systemui.shared.recents.model.Task;
+import com.android.systemui.shared.recents.model.ThumbnailData;
+
+import java.util.function.Consumer;
+
+/**
+ * A view that displays a recent task during a keyboard quick switch.
+ */
+public class KeyboardQuickSwitchTaskView extends ConstraintLayout {
+
+    @NonNull private final BorderAnimator mBorderAnimator;
+
+    @Nullable private ImageView mThumbnailView1;
+    @Nullable private ImageView mThumbnailView2;
+
+    public KeyboardQuickSwitchTaskView(@NonNull Context context) {
+        this(context, null);
+    }
+
+    public KeyboardQuickSwitchTaskView(@NonNull Context context, @Nullable AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    public KeyboardQuickSwitchTaskView(
+            @NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+        this(context, attrs, defStyleAttr, 0);
+    }
+
+    public KeyboardQuickSwitchTaskView(
+            @NonNull Context context,
+            @Nullable AttributeSet attrs,
+            int defStyleAttr,
+            int defStyleRes) {
+        super(context, attrs, defStyleAttr, defStyleRes);
+        setWillNotDraw(false);
+        Resources resources = context.getResources();
+        mBorderAnimator = new BorderAnimator(
+                /* borderBoundsBuilder= */ bounds -> bounds.set(0, 0, getWidth(), getHeight()),
+                /* borderWidthPx= */ resources.getDimensionPixelSize(
+                        R.dimen.keyboard_quick_switch_border_width),
+                /* borderRadiusPx= */ resources.getDimensionPixelSize(
+                        R.dimen.keyboard_quick_switch_task_view_radius),
+                /* borderColor= */ attrs == null
+                        ? DEFAULT_BORDER_COLOR
+                        : context.getTheme()
+                                .obtainStyledAttributes(
+                                        attrs,
+                                        R.styleable.TaskView,
+                                        defStyleAttr,
+                                        defStyleRes)
+                                .getColor(
+                                        R.styleable.TaskView_borderColor,
+                                        DEFAULT_BORDER_COLOR),
+                /* invalidateViewCallback= */ KeyboardQuickSwitchTaskView.this::invalidate);
+    }
+
+    @Override
+    protected void onFinishInflate() {
+        super.onFinishInflate();
+
+        mThumbnailView1 = findViewById(R.id.thumbnail1);
+        mThumbnailView2 = findViewById(R.id.thumbnail2);
+    }
+
+    @NonNull
+    protected Animator getFocusAnimator(boolean focused) {
+        return mBorderAnimator.buildAnimator(focused);
+    }
+
+    @Override
+    public void draw(Canvas canvas) {
+        super.draw(canvas);
+        mBorderAnimator.drawBorder(canvas);
+    }
+
+    protected void setThumbnails(
+            @NonNull Task task1,
+            @Nullable Task task2,
+            @Nullable ThumbnailUpdateFunction thumbnailUpdateFunction,
+            @Nullable TitleUpdateFunction titleUpdateFunction) {
+        applyThumbnail(mThumbnailView1, task1, thumbnailUpdateFunction);
+        applyThumbnail(mThumbnailView2, task2, thumbnailUpdateFunction);
+
+        if (titleUpdateFunction == null) {
+            setContentDescription(task2 == null
+                    ? task1.titleDescription
+                    : getContext().getString(
+                            R.string.quick_switch_split_task,
+                            task1.titleDescription,
+                            task2.titleDescription));
+            return;
+        }
+        titleUpdateFunction.updateTitleInBackground(task1, t ->
+                setContentDescription(task1.titleDescription));
+        if (task2 == null) {
+            return;
+        }
+        titleUpdateFunction.updateTitleInBackground(task2, t ->
+                setContentDescription(getContext().getString(
+                        R.string.quick_switch_split_task,
+                        task1.titleDescription,
+                        task2.titleDescription)));
+    }
+
+    private void applyThumbnail(
+            @Nullable ImageView thumbnailView,
+            @Nullable Task task,
+            @Nullable ThumbnailUpdateFunction updateFunction) {
+        if (thumbnailView == null) {
+            return;
+        }
+        if (task == null) {
+            return;
+        }
+        if (updateFunction == null) {
+            applyThumbnail(thumbnailView, task.thumbnail);
+            return;
+        }
+        updateFunction.updateThumbnailInBackground(
+                task, thumbnailData -> applyThumbnail(thumbnailView, thumbnailData));
+    }
+
+    private void applyThumbnail(
+            @NonNull ImageView thumbnailView, ThumbnailData thumbnailData) {
+        Bitmap bm = thumbnailData == null ? null : thumbnailData.thumbnail;
+
+        thumbnailView.setVisibility(VISIBLE);
+        thumbnailView.setImageBitmap(bm);
+    }
+
+    protected interface ThumbnailUpdateFunction {
+
+        void updateThumbnailInBackground(Task task, Consumer<ThumbnailData> callback);
+    }
+
+    protected interface TitleUpdateFunction {
+
+        void updateTitleInBackground(Task task, Consumer<Task> callback);
+    }
+}
diff --git a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchView.java b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchView.java
new file mode 100644
index 0000000..94d62b2
--- /dev/null
+++ b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchView.java
@@ -0,0 +1,497 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.launcher3.taskbar;
+
+import static androidx.constraintlayout.widget.ConstraintLayout.LayoutParams.PARENT_ID;
+
+import static com.android.launcher3.taskbar.KeyboardQuickSwitchController.MAX_TASKS;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.AnimatorSet;
+import android.animation.ObjectAnimator;
+import android.content.Context;
+import android.content.res.Resources;
+import android.graphics.Outline;
+import android.graphics.Rect;
+import android.icu.text.MessageFormat;
+import android.util.AttributeSet;
+import android.view.KeyEvent;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewOutlineProvider;
+import android.view.ViewTreeObserver;
+import android.view.animation.Interpolator;
+import android.widget.HorizontalScrollView;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.constraintlayout.widget.ConstraintLayout;
+
+import com.android.launcher3.R;
+import com.android.launcher3.Utilities;
+import com.android.launcher3.anim.AnimatedFloat;
+import com.android.launcher3.anim.Interpolators;
+import com.android.quickstep.util.GroupTask;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+
+/**
+ * View that allows quick switching between recent tasks through keyboard alt-tab and alt-shift-tab
+ * commands.
+ */
+public class KeyboardQuickSwitchView extends ConstraintLayout {
+
+    private static final long OUTLINE_ANIMATION_DURATION_MS = 333;
+    private static final float OUTLINE_START_HEIGHT_FACTOR = 0.45f;
+    private static final float OUTLINE_START_RADIUS_FACTOR = 0.25f;
+    private static final Interpolator OPEN_OUTLINE_INTERPOLATOR =
+            Interpolators.EMPHASIZED_DECELERATE;
+    private static final Interpolator CLOSE_OUTLINE_INTERPOLATOR =
+            Interpolators.EMPHASIZED_ACCELERATE;
+
+    private static final long ALPHA_ANIMATION_DURATION_MS = 83;
+    private static final long ALPHA_ANIMATION_START_DELAY_MS = 67;
+
+    private static final long CONTENT_TRANSLATION_X_ANIMATION_DURATION_MS = 500;
+    private static final long CONTENT_TRANSLATION_Y_ANIMATION_DURATION_MS = 333;
+    private static final float CONTENT_START_TRANSLATION_X_DP = 32;
+    private static final float CONTENT_START_TRANSLATION_Y_DP = 40;
+    private static final Interpolator OPEN_TRANSLATION_X_INTERPOLATOR = Interpolators.EMPHASIZED;
+    private static final Interpolator OPEN_TRANSLATION_Y_INTERPOLATOR =
+            Interpolators.EMPHASIZED_DECELERATE;
+    private static final Interpolator CLOSE_TRANSLATION_Y_INTERPOLATOR =
+            Interpolators.EMPHASIZED_ACCELERATE;
+
+    private static final long CONTENT_ALPHA_ANIMATION_DURATION_MS = 83;
+    private static final long CONTENT_ALPHA_ANIMATION_START_DELAY_MS = 83;
+
+    private final AnimatedFloat mOutlineAnimationProgress = new AnimatedFloat(
+            this::invalidateOutline);
+
+    private HorizontalScrollView mScrollView;
+    private ConstraintLayout mContent;
+
+    private int mTaskViewHeight;
+    private int mSpacing;
+    private int mOutlineRadius;
+    private boolean mIsRtl;
+
+    @Nullable private AnimatorSet mOpenAnimation;
+
+    @Nullable private KeyboardQuickSwitchViewController.ViewCallbacks mViewCallbacks;
+
+    public KeyboardQuickSwitchView(@NonNull Context context) {
+        this(context, null);
+    }
+
+    public KeyboardQuickSwitchView(@NonNull Context context, @Nullable AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    public KeyboardQuickSwitchView(@NonNull Context context, @Nullable AttributeSet attrs,
+            int defStyleAttr) {
+        this(context, attrs, defStyleAttr, 0);
+    }
+
+    public KeyboardQuickSwitchView(@NonNull Context context, @Nullable AttributeSet attrs,
+            int defStyleAttr,
+            int defStyleRes) {
+        super(context, attrs, defStyleAttr, defStyleRes);
+    }
+
+    @Override
+    protected void onFinishInflate() {
+        super.onFinishInflate();
+        mScrollView = findViewById(R.id.scroll_view);
+        mContent = findViewById(R.id.content);
+
+        Resources resources = getResources();
+        mTaskViewHeight = resources.getDimensionPixelSize(
+                R.dimen.keyboard_quick_switch_taskview_height);
+        mSpacing = resources.getDimensionPixelSize(R.dimen.keyboard_quick_switch_view_spacing);
+        mOutlineRadius = resources.getDimensionPixelSize(R.dimen.keyboard_quick_switch_view_radius);
+        mIsRtl = Utilities.isRtl(resources);
+    }
+
+    @NonNull
+    private KeyboardQuickSwitchTaskView createAndAddTaskView(
+            int index,
+            int width,
+            boolean isFinalView,
+            boolean updateTasks,
+            @NonNull LayoutInflater layoutInflater,
+            @Nullable View previousView,
+            @NonNull List<GroupTask> groupTasks) {
+        KeyboardQuickSwitchTaskView taskView = (KeyboardQuickSwitchTaskView) layoutInflater.inflate(
+                R.layout.keyboard_quick_switch_taskview, mContent, false);
+        taskView.setId(View.generateViewId());
+        taskView.setOnClickListener(v -> mViewCallbacks.launchTappedTask(index));
+
+        LayoutParams lp = new LayoutParams(width, mTaskViewHeight);
+        // Create a right-to-left ordering of views (or left-to-right in RTL locales)
+        if (previousView != null) {
+            lp.endToStart = previousView.getId();
+        } else {
+            lp.endToEnd = PARENT_ID;
+        }
+        lp.topToTop = PARENT_ID;
+        lp.bottomToBottom = PARENT_ID;
+        // Add spacing between views
+        lp.setMarginEnd(mSpacing);
+        if (isFinalView) {
+            // Add spacing to the start of the final view so that scrolling ends with some padding.
+            lp.startToStart = PARENT_ID;
+            lp.setMarginStart(mSpacing);
+            lp.horizontalBias = 1f;
+        }
+
+        GroupTask groupTask = groupTasks.get(index);
+        taskView.setThumbnails(
+                groupTask.task1,
+                groupTask.task2,
+                updateTasks ? mViewCallbacks::updateThumbnailInBackground : null,
+                updateTasks ? mViewCallbacks::updateTitleInBackground : null);
+
+        mContent.addView(taskView, lp);
+        return taskView;
+    }
+
+    private void createAndAddOverviewButton(
+            int width,
+            @NonNull LayoutInflater layoutInflater,
+            @Nullable View previousView,
+            @NonNull String overflowString) {
+        KeyboardQuickSwitchTaskView overviewButton =
+                (KeyboardQuickSwitchTaskView) layoutInflater.inflate(
+                        R.layout.keyboard_quick_switch_overview, this, false);
+        overviewButton.setOnClickListener(v -> mViewCallbacks.launchTappedTask(MAX_TASKS));
+
+        overviewButton.<TextView>findViewById(R.id.text).setText(overflowString);
+
+        ConstraintLayout.LayoutParams lp = new ConstraintLayout.LayoutParams(
+                width, mTaskViewHeight);
+        lp.startToStart = PARENT_ID;
+        lp.endToStart = previousView.getId();
+        lp.topToTop = PARENT_ID;
+        lp.bottomToBottom = PARENT_ID;
+        lp.setMarginEnd(mSpacing);
+        lp.setMarginStart(mSpacing);
+
+        mContent.addView(overviewButton, lp);
+    }
+
+    protected void applyLoadPlan(
+            @NonNull Context context,
+            @NonNull List<GroupTask> groupTasks,
+            int numHiddenTasks,
+            boolean updateTasks,
+            int currentFocusIndexOverride,
+            @NonNull KeyboardQuickSwitchViewController.ViewCallbacks viewCallbacks) {
+        if (groupTasks.isEmpty()) {
+            // Do not show the quick switch view.
+            return;
+        }
+        mViewCallbacks = viewCallbacks;
+        Resources resources = context.getResources();
+        int width = resources.getDimensionPixelSize(R.dimen.keyboard_quick_switch_taskview_width);
+        View previousView = null;
+
+        LayoutInflater layoutInflater = LayoutInflater.from(context);
+        int tasksToDisplay = Math.min(MAX_TASKS, groupTasks.size());
+        for (int i = 0; i < tasksToDisplay; i++) {
+            previousView = createAndAddTaskView(
+                    i,
+                    width,
+                    /* isFinalView= */ i == tasksToDisplay - 1 && numHiddenTasks == 0,
+                    updateTasks,
+                    layoutInflater,
+                    previousView,
+                    groupTasks);
+        }
+
+        if (numHiddenTasks > 0) {
+            HashMap<String, Integer> args = new HashMap<>();
+            args.put("count", numHiddenTasks);
+            createAndAddOverviewButton(
+                    width,
+                    layoutInflater,
+                    previousView,
+                    new MessageFormat(
+                            resources.getString(R.string.quick_switch_overflow),
+                            Locale.getDefault()).format(args));
+        }
+
+        getViewTreeObserver().addOnGlobalLayoutListener(
+                new ViewTreeObserver.OnGlobalLayoutListener() {
+                    @Override
+                    public void onGlobalLayout() {
+                        animateOpen(currentFocusIndexOverride);
+
+                        getViewTreeObserver().removeOnGlobalLayoutListener(this);
+                    }
+                });
+    }
+
+    protected Animator getCloseAnimation() {
+        AnimatorSet closeAnimation = new AnimatorSet();
+
+        Animator outlineAnimation = mOutlineAnimationProgress.animateToValue(0f);
+        outlineAnimation.setDuration(OUTLINE_ANIMATION_DURATION_MS);
+        outlineAnimation.setInterpolator(CLOSE_OUTLINE_INTERPOLATOR);
+        closeAnimation.play(outlineAnimation);
+
+        Animator alphaAnimation = ObjectAnimator.ofFloat(this, ALPHA, 1f, 0f);
+        alphaAnimation.setStartDelay(ALPHA_ANIMATION_START_DELAY_MS);
+        alphaAnimation.setDuration(ALPHA_ANIMATION_DURATION_MS);
+        closeAnimation.play(alphaAnimation);
+
+        Animator translationYAnimation = ObjectAnimator.ofFloat(
+                mScrollView, TRANSLATION_Y, 0, -Utilities.dpToPx(CONTENT_START_TRANSLATION_Y_DP));
+        translationYAnimation.setDuration(CONTENT_TRANSLATION_Y_ANIMATION_DURATION_MS);
+        translationYAnimation.setInterpolator(CLOSE_TRANSLATION_Y_INTERPOLATOR);
+        closeAnimation.play(translationYAnimation);
+
+        Animator contentAlphaAnimation = ObjectAnimator.ofFloat(mScrollView, ALPHA, 1f, 0f);
+        contentAlphaAnimation.setDuration(CONTENT_ALPHA_ANIMATION_DURATION_MS);
+        closeAnimation.play(contentAlphaAnimation);
+
+        closeAnimation.addListener(new AnimatorListenerAdapter() {
+            @Override
+            public void onAnimationStart(Animator animation) {
+                super.onAnimationStart(animation);
+                if (mOpenAnimation != null) {
+                    mOpenAnimation.cancel();
+                }
+            }
+        });
+
+        return closeAnimation;
+    }
+
+    private void animateOpen(int currentFocusIndexOverride) {
+        if (mOpenAnimation != null) {
+            // Restart animation since currentFocusIndexOverride can change the initial scroll.
+            mOpenAnimation.cancel();
+        }
+        mOpenAnimation = new AnimatorSet();
+
+        Animator outlineAnimation = mOutlineAnimationProgress.animateToValue(1f);
+        outlineAnimation.setDuration(OUTLINE_ANIMATION_DURATION_MS);
+        mOpenAnimation.play(outlineAnimation);
+
+        Animator alphaAnimation = ObjectAnimator.ofFloat(this, ALPHA, 0f, 1f);
+        alphaAnimation.setDuration(ALPHA_ANIMATION_DURATION_MS);
+        mOpenAnimation.play(alphaAnimation);
+
+        Animator translationXAnimation = ObjectAnimator.ofFloat(
+                mScrollView, TRANSLATION_X, -Utilities.dpToPx(CONTENT_START_TRANSLATION_X_DP), 0);
+        translationXAnimation.setDuration(CONTENT_TRANSLATION_X_ANIMATION_DURATION_MS);
+        translationXAnimation.setInterpolator(OPEN_TRANSLATION_X_INTERPOLATOR);
+        mOpenAnimation.play(translationXAnimation);
+
+        Animator translationYAnimation = ObjectAnimator.ofFloat(
+                mScrollView, TRANSLATION_Y, -Utilities.dpToPx(CONTENT_START_TRANSLATION_Y_DP), 0);
+        translationYAnimation.setDuration(CONTENT_TRANSLATION_Y_ANIMATION_DURATION_MS);
+        translationYAnimation.setInterpolator(OPEN_TRANSLATION_Y_INTERPOLATOR);
+        mOpenAnimation.play(translationYAnimation);
+
+        Animator contentAlphaAnimation = ObjectAnimator.ofFloat(mScrollView, ALPHA, 0f, 1f);
+        contentAlphaAnimation.setStartDelay(CONTENT_ALPHA_ANIMATION_START_DELAY_MS);
+        contentAlphaAnimation.setDuration(CONTENT_ALPHA_ANIMATION_DURATION_MS);
+        mOpenAnimation.play(contentAlphaAnimation);
+
+        ViewOutlineProvider outlineProvider = getOutlineProvider();
+        mOpenAnimation.addListener(new AnimatorListenerAdapter() {
+            @Override
+            public void onAnimationStart(Animator animation) {
+                super.onAnimationStart(animation);
+                setClipToPadding(false);
+                setOutlineProvider(new ViewOutlineProvider() {
+                    @Override
+                    public void getOutline(View view, Outline outline) {
+                        outline.setRoundRect(
+                                /* rect= */ new Rect(
+                                        /* left= */ 0,
+                                        /* top= */ 0,
+                                        /* right= */ getWidth(),
+                                        /* bottom= */
+                                        (int) (getHeight() * Utilities.mapBoundToRange(
+                                                mOutlineAnimationProgress.value,
+                                                /* lowerBound= */ 0f,
+                                                /* upperBound= */ 1f,
+                                                /* toMin= */ OUTLINE_START_HEIGHT_FACTOR,
+                                                /* toMax= */ 1f,
+                                                OPEN_OUTLINE_INTERPOLATOR))),
+                                /* radius= */ mOutlineRadius * Utilities.mapBoundToRange(
+                                        mOutlineAnimationProgress.value,
+                                        /* lowerBound= */ 0f,
+                                        /* upperBound= */ 1f,
+                                        /* toMin= */ OUTLINE_START_RADIUS_FACTOR,
+                                        /* toMax= */ 1f,
+                                        OPEN_OUTLINE_INTERPOLATOR));
+                    }
+                });
+                if (currentFocusIndexOverride == -1) {
+                    initializeScroll(/* index= */ 0, /* shouldTruncateTarget= */ false);
+                } else {
+                    animateFocusMove(-1, currentFocusIndexOverride);
+                }
+                mScrollView.setVisibility(VISIBLE);
+                setVisibility(VISIBLE);
+                requestFocus();
+            }
+
+            @Override
+            public void onAnimationEnd(Animator animation) {
+                super.onAnimationEnd(animation);
+                setClipToPadding(true);
+                setOutlineProvider(outlineProvider);
+                invalidateOutline();
+                mOpenAnimation = null;
+            }
+        });
+
+        mOpenAnimation.start();
+    }
+
+    protected void animateFocusMove(int fromIndex, int toIndex) {
+        KeyboardQuickSwitchTaskView focusedTask = getTaskAt(toIndex);
+        if (focusedTask == null) {
+            return;
+        }
+        AnimatorSet focusAnimation = new AnimatorSet();
+        focusAnimation.play(focusedTask.getFocusAnimator(true));
+
+        KeyboardQuickSwitchTaskView previouslyFocusedTask = getTaskAt(fromIndex);
+        if (previouslyFocusedTask != null) {
+            focusAnimation.play(previouslyFocusedTask.getFocusAnimator(false));
+        }
+
+        focusAnimation.addListener(new AnimatorListenerAdapter() {
+            @Override
+            public void onAnimationStart(Animator animation) {
+                super.onAnimationStart(animation);
+                focusedTask.requestAccessibilityFocus();
+                if (fromIndex == -1) {
+                    int firstVisibleTaskIndex = toIndex == 0
+                            ? toIndex
+                            : getTaskAt(toIndex - 1) == null
+                                    ? toIndex : toIndex - 1;
+                    // Scroll so that the previous task view is truncated as a visual hint that
+                    // there are more tasks
+                    initializeScroll(
+                            firstVisibleTaskIndex,
+                            /* shouldTruncateTarget= */ firstVisibleTaskIndex != toIndex);
+                } else if (toIndex > fromIndex || toIndex == 0) {
+                    // Scrolling to next task view
+                    if (mIsRtl) {
+                        scrollRightTo(focusedTask);
+                    } else {
+                        scrollLeftTo(focusedTask);
+                    }
+                } else {
+                    // Scrolling to previous task view
+                    if (mIsRtl) {
+                        scrollLeftTo(focusedTask);
+                    } else {
+                        scrollRightTo(focusedTask);
+                    }
+                }
+                if (mViewCallbacks != null) {
+                    mViewCallbacks.updateCurrentFocusIndex(toIndex);
+                }
+            }
+        });
+
+        focusAnimation.start();
+    }
+
+    @Override
+    public boolean onKeyUp(int keyCode, KeyEvent event) {
+        return (mViewCallbacks != null && mViewCallbacks.onKeyUp(keyCode, event))
+                || super.onKeyUp(keyCode, event);
+    }
+
+    private void initializeScroll(int index, boolean shouldTruncateTarget) {
+        View task = getTaskAt(index);
+        if (task == null) {
+            return;
+        }
+        if (mIsRtl) {
+            scrollRightTo(
+                    task, shouldTruncateTarget, /* smoothScroll= */ false);
+        } else {
+            scrollLeftTo(
+                    task, shouldTruncateTarget, /* smoothScroll= */ false);
+        }
+    }
+
+    private void scrollRightTo(@NonNull View targetTask) {
+        scrollRightTo(targetTask, /* shouldTruncateTarget= */ false, /* smoothScroll= */ true);
+    }
+
+    private void scrollRightTo(
+            @NonNull View targetTask, boolean shouldTruncateTarget, boolean smoothScroll) {
+        if (smoothScroll && !shouldScroll(targetTask, shouldTruncateTarget)) {
+            return;
+        }
+        int scrollTo = targetTask.getLeft() - mSpacing
+                + (shouldTruncateTarget ? targetTask.getWidth() / 2 : 0);
+        // Scroll so that the focused task is to the left of the list
+        if (smoothScroll) {
+            mScrollView.smoothScrollTo(scrollTo, 0);
+        } else {
+            mScrollView.scrollTo(scrollTo, 0);
+        }
+    }
+
+    private void scrollLeftTo(@NonNull View targetTask) {
+        scrollLeftTo(targetTask, /* shouldTruncateTarget= */ false, /* smoothScroll= */ true);
+    }
+
+    private void scrollLeftTo(
+            @NonNull View targetTask, boolean shouldTruncateTarget, boolean smoothScroll) {
+        if (smoothScroll && !shouldScroll(targetTask, shouldTruncateTarget)) {
+            return;
+        }
+        int scrollTo = targetTask.getRight() + mSpacing - mScrollView.getWidth()
+                - (shouldTruncateTarget ? targetTask.getWidth() / 2 : 0);
+        // Scroll so that the focused task is to the right of the list
+        if (smoothScroll) {
+            mScrollView.smoothScrollTo(scrollTo, 0);
+        } else {
+            mScrollView.scrollTo(scrollTo, 0);
+        }
+    }
+
+    private boolean shouldScroll(@NonNull View targetTask, boolean shouldTruncateTarget) {
+        boolean isTargetTruncated =
+                targetTask.getRight() + mSpacing > mScrollView.getScrollX() + mScrollView.getWidth()
+                        || Math.max(0, targetTask.getLeft() - mSpacing) < mScrollView.getScrollX();
+
+        return isTargetTruncated && !shouldTruncateTarget;
+    }
+
+    @Nullable
+    protected KeyboardQuickSwitchTaskView getTaskAt(int index) {
+        return index < 0 || index >= mContent.getChildCount()
+                ? null : (KeyboardQuickSwitchTaskView) mContent.getChildAt(index);
+    }
+}
diff --git a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchViewController.java b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchViewController.java
new file mode 100644
index 0000000..f0f361e
--- /dev/null
+++ b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchViewController.java
@@ -0,0 +1,200 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.launcher3.taskbar;
+
+import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR;
+
+import android.animation.Animator;
+import android.view.KeyEvent;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.android.launcher3.anim.AnimationSuccessListener;
+import com.android.launcher3.taskbar.overlay.TaskbarOverlayContext;
+import com.android.launcher3.taskbar.overlay.TaskbarOverlayDragLayer;
+import com.android.quickstep.util.GroupTask;
+import com.android.systemui.shared.recents.model.Task;
+import com.android.systemui.shared.recents.model.ThumbnailData;
+import com.android.systemui.shared.system.ActivityManagerWrapper;
+
+import java.io.PrintWriter;
+import java.util.List;
+import java.util.function.Consumer;
+
+/**
+ * Handles initialization of the {@link KeyboardQuickSwitchView} and supplies it with the list of
+ * tasks.
+ */
+public class KeyboardQuickSwitchViewController {
+
+    @NonNull private final ViewCallbacks mViewCallbacks = new ViewCallbacks();
+    @NonNull private final TaskbarControllers mControllers;
+    @NonNull private final TaskbarOverlayContext mOverlayContext;
+    @NonNull private final KeyboardQuickSwitchView mKeyboardQuickSwitchView;
+    @NonNull private final KeyboardQuickSwitchController.ControllerCallbacks mControllerCallbacks;
+
+    @Nullable private Animator mCloseAnimation;
+
+    private int mCurrentFocusIndex = -1;
+
+    protected KeyboardQuickSwitchViewController(
+            @NonNull TaskbarControllers controllers,
+            @NonNull TaskbarOverlayContext overlayContext,
+            @NonNull KeyboardQuickSwitchView keyboardQuickSwitchView,
+            @NonNull KeyboardQuickSwitchController.ControllerCallbacks controllerCallbacks) {
+        mControllers = controllers;
+        mOverlayContext = overlayContext;
+        mKeyboardQuickSwitchView = keyboardQuickSwitchView;
+        mControllerCallbacks = controllerCallbacks;
+    }
+
+    protected int getCurrentFocusedIndex() {
+        return mCurrentFocusIndex;
+    }
+
+    protected void openQuickSwitchView(
+            @NonNull List<GroupTask> tasks,
+            int numHiddenTasks,
+            boolean updateTasks,
+            int currentFocusIndexOverride) {
+        TaskbarOverlayDragLayer dragLayer = mOverlayContext.getDragLayer();
+        dragLayer.addView(mKeyboardQuickSwitchView);
+        dragLayer.runOnClickOnce(v -> closeQuickSwitchView(true));
+
+        mKeyboardQuickSwitchView.applyLoadPlan(
+                mOverlayContext,
+                tasks,
+                numHiddenTasks,
+                updateTasks,
+                currentFocusIndexOverride,
+                mViewCallbacks);
+    }
+
+    protected void closeQuickSwitchView(boolean animate) {
+        if (mCloseAnimation != null) {
+            if (animate) {
+                // Let currently-running animation finish.
+                return;
+            } else {
+                mCloseAnimation.cancel();
+            }
+        }
+        if (!animate) {
+            mCloseAnimation = null;
+            onCloseComplete();
+            return;
+        }
+        mCloseAnimation = mKeyboardQuickSwitchView.getCloseAnimation();
+
+        mCloseAnimation.addListener(new AnimationSuccessListener() {
+            @Override
+            public void onAnimationSuccess(Animator animator) {
+                mCloseAnimation = null;
+                onCloseComplete();
+            }
+        });
+        mCloseAnimation.start();
+    }
+
+    /**
+     * Launched the currently-focused task.
+     *
+     * Returns index -1 iff the RecentsView shouldn't be opened.
+     *
+     * If the index is not -1, then the {@link com.android.quickstep.views.TaskView} at the returned
+     * index will be focused.
+     */
+    protected int launchFocusedTask() {
+        // Launch the second-most recent task if the user quick switches too quickly, if possible.
+        return launchTaskAt(mCurrentFocusIndex == -1
+                ? (mControllerCallbacks.getTaskCount() > 1 ? 1 : 0) : mCurrentFocusIndex);
+    }
+
+    private int launchTaskAt(int index) {
+        KeyboardQuickSwitchTaskView taskView = mKeyboardQuickSwitchView.getTaskAt(index);
+        GroupTask task = mControllerCallbacks.getTaskAt(index);
+        if (taskView == null || task == null) {
+            return Math.max(0, index);
+        } else if (task.task2 == null) {
+            UI_HELPER_EXECUTOR.execute(() ->
+                    ActivityManagerWrapper.getInstance().startActivityFromRecents(
+                            task.task1.key,
+                            mControllers.taskbarActivityContext.getActivityLaunchOptions(
+                                    taskView, null).options));
+        } else {
+            mControllers.uiController.launchSplitTasks(taskView, task);
+        }
+        return -1;
+    }
+
+    private void onCloseComplete() {
+        mOverlayContext.getDragLayer().removeView(mKeyboardQuickSwitchView);
+        mControllerCallbacks.onCloseComplete();
+    }
+
+    protected void onDestroy() {
+        closeQuickSwitchView(false);
+    }
+
+    public void dumpLogs(String prefix, PrintWriter pw) {
+        pw.println(prefix + "KeyboardQuickSwitchViewController:");
+
+        pw.println(prefix + "\thasFocus=" + mKeyboardQuickSwitchView.hasFocus());
+        pw.println(prefix + "\tcloseAnimationRunning=" + (mCloseAnimation != null));
+        pw.println(prefix + "\tmCurrentFocusIndex=" + mCurrentFocusIndex);
+    }
+
+    class ViewCallbacks {
+
+        boolean onKeyUp(int keyCode, KeyEvent event) {
+            if (keyCode != KeyEvent.KEYCODE_TAB) {
+                return false;
+            }
+            int taskCount = mControllerCallbacks.getTaskCount();
+            int toIndex = mCurrentFocusIndex == -1
+                    // Focus the second-most recent app if possible
+                    ? (taskCount > 1 ? 1 : 0)
+                    : (event.isShiftPressed()
+                            // focus a more recent task or loop back to the opposite end
+                            ? Math.max(0, mCurrentFocusIndex == 0
+                                    ? taskCount - 1 : mCurrentFocusIndex - 1)
+                            // focus a less recent app or loop back to the opposite end
+                            : ((mCurrentFocusIndex + 1) % taskCount));
+
+            mKeyboardQuickSwitchView.animateFocusMove(mCurrentFocusIndex, toIndex);
+
+            return true;
+        }
+
+        void updateCurrentFocusIndex(int index) {
+            mCurrentFocusIndex = index;
+        }
+
+        void launchTappedTask(int index) {
+            KeyboardQuickSwitchViewController.this.launchTaskAt(index);
+            closeQuickSwitchView(true);
+        }
+
+        void updateThumbnailInBackground(Task task, Consumer<ThumbnailData> callback) {
+            mControllerCallbacks.updateThumbnailInBackground(task, callback);
+        }
+
+        void updateTitleInBackground(Task task, Consumer<Task> callback) {
+            mControllerCallbacks.updateTitleInBackground(task, callback);
+        }
+    }
+}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
index c0c14a3..6e746ef 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
@@ -15,7 +15,6 @@
  */
 package com.android.launcher3.taskbar;
 
-import static android.app.ActivityTaskManager.INVALID_TASK_ID;
 import static android.content.pm.PackageManager.FEATURE_PC;
 import static android.os.Trace.TRACE_TAG_APP;
 import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
@@ -236,7 +235,8 @@
                 isDesktopMode
                         ? new DesktopTaskbarRecentAppsController(this)
                         : TaskbarRecentAppsController.DEFAULT,
-                new TaskbarEduTooltipController(this));
+                new TaskbarEduTooltipController(this),
+                new KeyboardQuickSwitchController());
     }
 
     public void init(@NonNull TaskbarSharedState sharedState) {
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java
index ea70de4..931d79f 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java
@@ -59,6 +59,7 @@
     public final TaskbarTranslationController taskbarTranslationController;
     public final TaskbarOverlayController taskbarOverlayController;
     public final TaskbarEduTooltipController taskbarEduTooltipController;
+    public final KeyboardQuickSwitchController keyboardQuickSwitchController;
 
     @Nullable private LoggableTaskbarController[] mControllersToLog = null;
     @Nullable private BackgroundRendererController[] mBackgroundRendererControllers = null;
@@ -103,7 +104,8 @@
             VoiceInteractionWindowController voiceInteractionWindowController,
             TaskbarTranslationController taskbarTranslationController,
             TaskbarRecentAppsController taskbarRecentAppsController,
-            TaskbarEduTooltipController taskbarEduTooltipController) {
+            TaskbarEduTooltipController taskbarEduTooltipController,
+            KeyboardQuickSwitchController keyboardQuickSwitchController) {
         this.taskbarActivityContext = taskbarActivityContext;
         this.taskbarDragController = taskbarDragController;
         this.navButtonController = navButtonController;
@@ -127,6 +129,7 @@
         this.taskbarTranslationController = taskbarTranslationController;
         this.taskbarRecentAppsController = taskbarRecentAppsController;
         this.taskbarEduTooltipController = taskbarEduTooltipController;
+        this.keyboardQuickSwitchController = keyboardQuickSwitchController;
     }
 
     /**
@@ -159,6 +162,7 @@
         taskbarRecentAppsController.init(this);
         taskbarTranslationController.init(this);
         taskbarEduTooltipController.init(this);
+        keyboardQuickSwitchController.init(this);
 
         mControllersToLog = new LoggableTaskbarController[] {
                 taskbarDragController, navButtonController, navbarButtonsViewController,
@@ -167,7 +171,7 @@
                 stashedHandleViewController, taskbarStashController, taskbarEduController,
                 taskbarAutohideSuspendController, taskbarPopupController, taskbarInsetsController,
                 voiceInteractionWindowController, taskbarTranslationController,
-                taskbarEduTooltipController
+                taskbarEduTooltipController, keyboardQuickSwitchController
         };
         mBackgroundRendererControllers = new BackgroundRendererController[] {
                 taskbarDragLayerController, taskbarScrimViewController,
@@ -191,6 +195,7 @@
     public void onConfigurationChanged(@Config int configChanges) {
         navbarButtonsViewController.onConfigurationChanged(configChanges);
         taskbarDragLayerController.onConfigurationChanged();
+        keyboardQuickSwitchController.onConfigurationChanged(configChanges);
     }
 
     /**
@@ -216,6 +221,7 @@
         taskbarInsetsController.onDestroy();
         voiceInteractionWindowController.onDestroy();
         taskbarRecentAppsController.onDestroy();
+        keyboardQuickSwitchController.onDestroy();
 
         mControllersToLog = null;
         mBackgroundRendererControllers = null;
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java
index 30d6eb4..115b99e 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java
@@ -15,6 +15,7 @@
  */
 package com.android.launcher3.taskbar;
 
+import static com.android.launcher3.config.FeatureFlags.ENABLE_MATERIAL_U_POPUP;
 import static com.android.launcher3.util.SplitConfigurationOptions.getLogEventForPosition;
 
 import android.content.Intent;
@@ -56,6 +57,7 @@
 
 import java.io.PrintWriter;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Objects;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
@@ -152,9 +154,28 @@
             return null;
         }
 
-        final PopupContainerWithArrow<BaseTaskbarContext> container =
-                (PopupContainerWithArrow<BaseTaskbarContext>) context.getLayoutInflater().inflate(
-                        R.layout.popup_container, context.getDragLayer(), false);
+        PopupContainerWithArrow<BaseTaskbarContext> container;
+        int deepShortcutCount = mPopupDataProvider.getShortcutCountForItem(item);
+        // TODO(b/198438631): add support for INSTALL shortcut factory
+        List<SystemShortcut> systemShortcuts = getSystemShortcuts()
+                .map(s -> s.getShortcut(context, item, icon))
+                .filter(Objects::nonNull)
+                .collect(Collectors.toList());
+
+        if (ENABLE_MATERIAL_U_POPUP.get()) {
+            container = (PopupContainerWithArrow) context.getLayoutInflater().inflate(
+                    R.layout.popup_container_material_u, context.getDragLayer(), false);
+            container.populateAndShowRowsMaterialU(icon, deepShortcutCount, systemShortcuts);
+        } else {
+            container = (PopupContainerWithArrow) context.getLayoutInflater().inflate(
+                    R.layout.popup_container, context.getDragLayer(), false);
+            container.populateAndShow(
+                    icon,
+                    deepShortcutCount,
+                    mPopupDataProvider.getNotificationKeysForItem(item),
+                    systemShortcuts);
+        }
+
         container.addOnAttachStateChangeListener(
                 new PopupLiveUpdateHandler<BaseTaskbarContext>(context, container) {
                     @Override
@@ -165,15 +186,6 @@
         // TODO (b/198438631): configure for taskbar/context
         container.setPopupItemDragHandler(new TaskbarPopupItemDragHandler());
         mControllers.taskbarDragController.addDragListener(container);
-
-        container.populateAndShow(icon,
-                mPopupDataProvider.getShortcutCountForItem(item),
-                mPopupDataProvider.getNotificationKeysForItem(item),
-                // TODO (b/198438631): add support for INSTALL shortcut factory
-                getSystemShortcuts()
-                        .map(s -> s.getShortcut(context, item, icon))
-                        .filter(Objects::nonNull)
-                        .collect(Collectors.toList()));
         container.requestFocus();
 
         // Make focusable to receive back events
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java
index a388388..6324715 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java
@@ -231,6 +231,38 @@
     }
 
     /**
+     * Opens the Keyboard Quick Switch View.
+     *
+     * This will set the focus to the first task from the right (from the left in RTL)
+     */
+    public void openQuickSwitchView() {
+        mControllers.keyboardQuickSwitchController.openQuickSwitchView();
+    }
+
+    /**
+     * Closes the Keyboard Quick Switch View.
+     *
+     * No-op if the view is already closed
+     */
+    public void closeQuickSwitchView() {
+        mControllers.keyboardQuickSwitchController.closeQuickSwitchView();
+    }
+
+    /**
+     * Launches the focused task and closes the Keyboard Quick Switch View.
+     *
+     * If the overlay or view are closed, or the overview task is focused, then Overview is
+     * launched. If the overview task is launched, then the first hidden task is focused.
+     *
+     * @return the index of what task should be focused in ; -1 iff Overview shouldn't be launched
+     */
+    public int launchFocusedTask() {
+        int focusedTaskIndex = mControllers.keyboardQuickSwitchController.launchFocusedTask();
+        mControllers.keyboardQuickSwitchController.closeQuickSwitchView();
+        return focusedTaskIndex;
+    }
+
+    /**
      * Launches the focused task in splitscreen.
      *
      * No-op if the view is not yet open.
diff --git a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonQuickSwitchTouchController.java b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonQuickSwitchTouchController.java
index f78d9cf..847114a 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonQuickSwitchTouchController.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonQuickSwitchTouchController.java
@@ -76,6 +76,7 @@
 import com.android.quickstep.util.LayoutUtils;
 import com.android.quickstep.util.MotionPauseDetector;
 import com.android.quickstep.util.WorkspaceRevealAnim;
+import com.android.quickstep.views.DesktopTaskView;
 import com.android.quickstep.views.LauncherRecentsView;
 import com.android.quickstep.views.RecentsView;
 
@@ -164,6 +165,10 @@
         if ((stateFlags & SYSUI_STATE_OVERVIEW_DISABLED) != 0) {
             return false;
         }
+        if (DesktopTaskView.DESKTOP_MODE_SUPPORTED) {
+            // TODO(b/268075592): add support for quickswitch to/from desktop
+            return false;
+        }
         return true;
     }
 
diff --git a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/QuickSwitchTouchController.java b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/QuickSwitchTouchController.java
index c5383c3..f941b02 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/QuickSwitchTouchController.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/QuickSwitchTouchController.java
@@ -48,6 +48,7 @@
 import com.android.launcher3.util.NavigationMode;
 import com.android.quickstep.SystemUiProxy;
 import com.android.quickstep.TaskUtils;
+import com.android.quickstep.views.DesktopTaskView;
 import com.android.quickstep.views.RecentsView;
 import com.android.quickstep.views.TaskView;
 
@@ -78,6 +79,10 @@
         if ((ev.getEdgeFlags() & Utilities.EDGE_NAV_BAR) == 0) {
             return false;
         }
+        if (DesktopTaskView.DESKTOP_MODE_SUPPORTED) {
+            // TODO(b/268075592): add support for quickswitch to/from desktop
+            return false;
+        }
         return true;
     }
 
diff --git a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
index 3f6eb94..1122e00 100644
--- a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
+++ b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
@@ -1167,6 +1167,11 @@
             return LAST_TASK;
         }
 
+        if (DesktopTaskView.DESKTOP_MODE_SUPPORTED && endTarget == NEW_TASK) {
+            // TODO(b/268075592): add support for quickswitch to/from desktop
+            return LAST_TASK;
+        }
+
         return endTarget;
     }
 
diff --git a/quickstep/src/com/android/quickstep/OverviewCommandHelper.java b/quickstep/src/com/android/quickstep/OverviewCommandHelper.java
index b5240fd..d0fd65f 100644
--- a/quickstep/src/com/android/quickstep/OverviewCommandHelper.java
+++ b/quickstep/src/com/android/quickstep/OverviewCommandHelper.java
@@ -31,7 +31,10 @@
 import androidx.annotation.Nullable;
 import androidx.annotation.UiThread;
 
+import com.android.launcher3.DeviceProfile;
+import com.android.launcher3.config.FeatureFlags;
 import com.android.launcher3.statemanager.StatefulActivity;
+import com.android.launcher3.taskbar.TaskbarUIController;
 import com.android.launcher3.util.RunnableList;
 import com.android.quickstep.RecentsAnimationCallbacks.RecentsAnimationListener;
 import com.android.quickstep.views.RecentsView;
@@ -174,8 +177,25 @@
                 mOverviewComponentObserver.getActivityInterface();
         RecentsView recents = activityInterface.getVisibleRecentsView();
         if (recents == null) {
+            T activity = activityInterface.getCreatedActivity();
+            DeviceProfile dp = activity == null ? null : activity.getDeviceProfile();
+            TaskbarUIController uiController = activityInterface.getTaskbarController();
+            boolean allowQuickSwitch = FeatureFlags.ENABLE_KEYBOARD_QUICK_SWITCH.get()
+                    && uiController != null
+                    && dp != null
+                    && (dp.isTablet || dp.isTwoPanels);
+
             if (cmd.type == TYPE_HIDE) {
-                // already hidden
+                if (!allowQuickSwitch) {
+                    return true;
+                }
+                mTaskFocusIndexOverride = uiController.launchFocusedTask();
+                if (mTaskFocusIndexOverride == -1) {
+                    return true;
+                }
+            }
+            if (cmd.type == TYPE_KEYBOARD_INPUT && allowQuickSwitch) {
+                uiController.openQuickSwitchView();
                 return true;
             }
             if (cmd.type == TYPE_HOME) {
diff --git a/quickstep/src/com/android/quickstep/util/BorderAnimator.java b/quickstep/src/com/android/quickstep/util/BorderAnimator.java
index 532edb2..1f1c15b 100644
--- a/quickstep/src/com/android/quickstep/util/BorderAnimator.java
+++ b/quickstep/src/com/android/quickstep/util/BorderAnimator.java
@@ -38,7 +38,8 @@
  * 1. Create an instance in the target view.
  * 2. Override the target view's {@link android.view.View#draw(Canvas)} method and call
  *      {@link BorderAnimator#drawBorder(Canvas)} after {@code super.draw(canvas)}.
- * 3. Call {@link BorderAnimator#buildAnimator(boolean)} and start the animation where appropriate.
+ * 3. Call {@link BorderAnimator#buildAnimator(boolean)} and start the animation or call
+ *      {@link BorderAnimator#setBorderVisible(boolean)} where appropriate.
  */
 public final class BorderAnimator {
 
@@ -138,6 +139,7 @@
     /**
      * Builds the border appearance/disappearance animation.
      */
+    @NonNull
     public Animator buildAnimator(boolean isAppearing) {
         mBorderBoundsBuilder.updateBorderBounds(mBorderBounds);
         mRunningBorderAnimation = mBorderAnimationProgress.animateToValue(isAppearing ? 1f : 0f);
@@ -151,6 +153,18 @@
     }
 
     /**
+     * Immediately shows/hides the border without an animation.
+     *
+     * To animate the appearance/disappearance, see {@link BorderAnimator#buildAnimator(boolean)}
+     */
+    public void setBorderVisible(boolean visible) {
+        if (mRunningBorderAnimation != null) {
+            mRunningBorderAnimation.end();
+        }
+        mBorderAnimationProgress.updateValue(visible ? 1f : 0f);
+    }
+
+    /**
      * Callback to update the border bounds when building this animation.
      */
     public interface BorderBoundsBuilder {
diff --git a/quickstep/src/com/android/quickstep/views/DesktopTaskView.java b/quickstep/src/com/android/quickstep/views/DesktopTaskView.java
index 0ac682f..2770049 100644
--- a/quickstep/src/com/android/quickstep/views/DesktopTaskView.java
+++ b/quickstep/src/com/android/quickstep/views/DesktopTaskView.java
@@ -133,6 +133,12 @@
     }
 
     @Override
+    protected void updateBorderBounds(Rect bounds) {
+        bounds.set(mBackgroundView.getLeft(), mBackgroundView.getTop(), mBackgroundView.getRight(),
+                mBackgroundView.getBottom());
+    }
+
+    @Override
     public void bind(Task task, RecentsOrientedState orientedState) {
         bind(Collections.singletonList(task), orientedState);
     }
diff --git a/quickstep/tests/src/com/android/launcher3/taskbar/TaskbarBaseTestCase.kt b/quickstep/tests/src/com/android/launcher3/taskbar/TaskbarBaseTestCase.kt
index 8a78d8c..28229a6 100644
--- a/quickstep/tests/src/com/android/launcher3/taskbar/TaskbarBaseTestCase.kt
+++ b/quickstep/tests/src/com/android/launcher3/taskbar/TaskbarBaseTestCase.kt
@@ -52,6 +52,7 @@
     @Mock lateinit var taskbarTranslationController: TaskbarTranslationController
     @Mock lateinit var taskbarOverlayController: TaskbarOverlayController
     @Mock lateinit var taskbarEduTooltipController: TaskbarEduTooltipController
+    @Mock lateinit var keyboardQuickSwitchController: KeyboardQuickSwitchController
 
     lateinit var mTaskbarControllers: TaskbarControllers
 
@@ -90,6 +91,7 @@
                 taskbarTranslationController,
                 taskbarRecentAppsController,
                 taskbarEduTooltipController,
+                keyboardQuickSwitchController
             )
     }
 }
diff --git a/res/drawable/popup_background_material_u.xml b/res/drawable/popup_background_material_u.xml
new file mode 100644
index 0000000..4d40ba8
--- /dev/null
+++ b/res/drawable/popup_background_material_u.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2023 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.
+-->
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+    <solid android:color="?attr/popupColorPrimary"/>
+    <corners android:radius="@dimen/dialogCornerRadius"/>
+</shape>
\ No newline at end of file
diff --git a/res/layout/deep_shortcut_container.xml b/res/layout/deep_shortcut_container.xml
new file mode 100644
index 0000000..b6c3f56
--- /dev/null
+++ b/res/layout/deep_shortcut_container.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2023 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.
+-->
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/deep_shortcuts_container"
+    android:background="@drawable/popup_background_material_u"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:tag="@string/popup_container_iterate_children"
+    android:elevation="@dimen/deep_shortcuts_elevation"
+    android:orientation="vertical"/>
\ No newline at end of file
diff --git a/res/layout/deep_shortcut_material_u.xml b/res/layout/deep_shortcut_material_u.xml
new file mode 100644
index 0000000..fc019e9
--- /dev/null
+++ b/res/layout/deep_shortcut_material_u.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2023 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<com.android.launcher3.shortcuts.DeepShortcutView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:launcher="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/deep_shortcut_material"
+    android:layout_width="@dimen/bg_popup_item_width"
+    android:layout_height="@dimen/bg_popup_item_height"
+    android:elevation="@dimen/deep_shortcuts_elevation"
+    android:background="@drawable/middle_item_primary"
+    android:theme="@style/PopupItem" >
+
+    <com.android.launcher3.shortcuts.DeepShortcutTextView
+        style="@style/BaseIcon"
+        android:id="@+id/bubble_text"
+        android:background="?android:attr/selectableItemBackground"
+        android:gravity="start|center_vertical"
+        android:textAlignment="viewStart"
+        android:paddingStart="@dimen/deep_shortcuts_text_padding_start"
+        android:paddingEnd="@dimen/popup_padding_end"
+        android:drawablePadding="@dimen/deep_shortcut_drawable_padding"
+        android:singleLine="true"
+        android:ellipsize="end"
+        android:textSize="14sp"
+        android:textColor="?android:attr/textColorPrimary"
+        launcher:layoutHorizontal="true"
+        launcher:iconDisplay="shortcut_popup"
+        launcher:iconSizeOverride="@dimen/deep_shortcut_icon_size" />
+
+    <View
+        android:id="@+id/icon"
+        android:layout_width="@dimen/deep_shortcut_icon_size"
+        android:layout_height="@dimen/deep_shortcut_icon_size"
+        android:layout_marginStart="@dimen/popup_padding_start"
+        android:layout_gravity="start|center_vertical"
+        android:background="@drawable/ic_deepshortcut_placeholder"/>
+</com.android.launcher3.shortcuts.DeepShortcutView>
\ No newline at end of file
diff --git a/res/layout/home_settings.xml b/res/layout/home_settings.xml
index 0f2461a..c0f16e2 100644
--- a/res/layout/home_settings.xml
+++ b/res/layout/home_settings.xml
@@ -12,6 +12,9 @@
         android:layout_marginHorizontal="@dimen/developer_options_filter_margins"
         android:hint="@string/developer_options_filter_hint"
         android:visibility="gone"
+        android:inputType="text"
+        android:maxLines="1"
+        android:imeOptions="actionDone"
         />
 
     <FrameLayout
diff --git a/res/layout/popup_container_material_u.xml b/res/layout/popup_container_material_u.xml
new file mode 100644
index 0000000..d3036b6
--- /dev/null
+++ b/res/layout/popup_container_material_u.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2023 The Android Open Source Project
+
+     Licensed under the Apache License, Version 2.0 (the "License");
+     you may not use this file except in compliance with the License.
+     You may obtain a copy of the License at
+
+          http://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+-->
+<com.android.launcher3.popup.PopupContainerWithArrow
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/popup_container"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:orientation="vertical"/>
\ No newline at end of file
diff --git a/res/layout/system_shortcut.xml b/res/layout/system_shortcut.xml
index 21d532e..cbd7fa4 100644
--- a/res/layout/system_shortcut.xml
+++ b/res/layout/system_shortcut.xml
@@ -18,6 +18,7 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="@dimen/bg_popup_item_width"
     android:layout_height="wrap_content"
+    android:id="@+id/system_shortcut"
     android:minHeight="@dimen/bg_popup_item_height"
     android:elevation="@dimen/deep_shortcuts_elevation"
     android:background="@drawable/middle_item_primary"
diff --git a/res/layout/system_shortcut_icons.xml b/res/layout/system_shortcut_icons_container.xml
similarity index 89%
rename from res/layout/system_shortcut_icons.xml
rename to res/layout/system_shortcut_icons_container.xml
index 775a45f..ee104d9 100644
--- a/res/layout/system_shortcut_icons.xml
+++ b/res/layout/system_shortcut_icons_container.xml
@@ -26,7 +26,7 @@
     android:clipToPadding="true">
 
     <Space android:layout_width="0dp"
-           android:layout_height="match_parent"
-           android:layout_weight="1"
-           android:id="@+id/separator"/>
+        android:layout_height="match_parent"
+        android:layout_weight="1"
+        android:id="@+id/separator"/>
 </LinearLayout>
diff --git a/res/layout/system_shortcut_icons.xml b/res/layout/system_shortcut_icons_container_material_u.xml
similarity index 73%
copy from res/layout/system_shortcut_icons.xml
copy to res/layout/system_shortcut_icons_container_material_u.xml
index 775a45f..afd11e6 100644
--- a/res/layout/system_shortcut_icons.xml
+++ b/res/layout/system_shortcut_icons_container_material_u.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
+<!-- Copyright (C) 2023 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.
@@ -17,16 +17,16 @@
 <LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/system_shortcut_icons"
+    android:tag="@string/popup_container_iterate_children"
     android:layout_width="match_parent"
     android:layout_height="@dimen/system_shortcut_header_height"
     android:orientation="horizontal"
     android:gravity="end|center_vertical"
-    android:background="@drawable/single_item_primary"
-    android:elevation="@dimen/deep_shortcuts_elevation"
-    android:clipToPadding="true">
+    android:background="@drawable/popup_background_material_u"
+    android:elevation="@dimen/deep_shortcuts_elevation">
 
     <Space android:layout_width="0dp"
-           android:layout_height="match_parent"
-           android:layout_weight="1"
-           android:id="@+id/separator"/>
+        android:layout_height="match_parent"
+        android:layout_weight="1"
+        android:id="@+id/separator"/>
 </LinearLayout>
diff --git a/res/layout/system_shortcut_rows_container_material_u.xml b/res/layout/system_shortcut_rows_container_material_u.xml
new file mode 100644
index 0000000..006e280
--- /dev/null
+++ b/res/layout/system_shortcut_rows_container_material_u.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2023 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.
+-->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/system_shortcuts_container"
+    android:background="@drawable/popup_background_material_u"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:tag="@string/popup_container_iterate_children"
+    android:elevation="@dimen/deep_shortcuts_elevation"
+    android:orientation="vertical"/>
diff --git a/res/layout/system_shortcut_icons.xml b/res/layout/widget_shortcut_container_material_u.xml
similarity index 71%
copy from res/layout/system_shortcut_icons.xml
copy to res/layout/widget_shortcut_container_material_u.xml
index 775a45f..aab34e3 100644
--- a/res/layout/system_shortcut_icons.xml
+++ b/res/layout/widget_shortcut_container_material_u.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
+<!-- Copyright (C) 2023 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.
@@ -16,17 +16,12 @@
 
 <LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/system_shortcut_icons"
+    android:id="@+id/widget_shortcut_container"
+    android:background="@drawable/popup_background_material_u"
     android:layout_width="match_parent"
     android:layout_height="@dimen/system_shortcut_header_height"
     android:orientation="horizontal"
     android:gravity="end|center_vertical"
-    android:background="@drawable/single_item_primary"
     android:elevation="@dimen/deep_shortcuts_elevation"
-    android:clipToPadding="true">
-
-    <Space android:layout_width="0dp"
-           android:layout_height="match_parent"
-           android:layout_weight="1"
-           android:id="@+id/separator"/>
-</LinearLayout>
+    android:tag="@string/popup_container_iterate_children"
+    android:clipToPadding="true"/>
\ No newline at end of file
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 1794b19..7b97abc 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Raak en hou die legstuk om dit op die tuisskerm rond te beweeg"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Voeg by tuisskerm"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g>-legstuk by tuisskerm gevoeg"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# legstuk}other{# legstukke}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# kortpad}other{# kortpaaie}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index be7a737..6208fb1 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"በመነሻ ማያ ገጽ አካባቢ ላይ ለማንቀሳቀስ ነክተው ይያዙት"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"ወደ መነሻ ማያ ገጽ አክል"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> ምግብር ወደ መነሻ ማያ ገጽ ታክሏል"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# ምግብር}one{# ምግብሮች}other{# ምግብሮች}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# አቋራጭ}one{# አቋራጭ}other{# አቋራጮች}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>፣ <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 1aaa659..a38fe0b 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"انقر مع الاستمرار على التطبيق المصغّر لنقله إلى الشاشة الرئيسية."</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"إضافة إلى الشاشة الرئيسية"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"تمت إضافة الأداة <xliff:g id="WIDGET_NAME">%1$s</xliff:g> إلى الشاشة الرئيسية."</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{تطبيق مصغّر واحد}zero{# تطبيق مصغّر}two{تطبيقان مصغّران}few{# تطبيقات مصغّرة}many{# تطبيقًا مصغّرًا}other{# تطبيق مصغّر}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{اختصار واحد}zero{# اختصار}two{اختصاران}few{# اختصارات}many{# اختصارًا}other{# اختصار}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>، <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml
index 5dd751e..3a67edb 100644
--- a/res/values-as/strings.xml
+++ b/res/values-as/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"ৱিজেটটো গৃহ স্ক্ৰীনৰ আশে-পাশে নিবলৈ সেইটোত স্পৰ্শ কৰি ধৰি ৰাখক"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"গৃহ স্ক্ৰীনত যোগ কৰক"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> ৱিজেটটো গৃহ স্ক্ৰীনত যোগ দিয়া হৈছে"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# টা ৱিজেট}one{# টা ৱিজেট}other{# টা ৱিজেট}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# টা শ্বৰ্টকাট}one{# টা শ্বৰ্টকাট}other{# টা শ্বৰ্টকাট}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml
index 9b3d60c..326ac68 100644
--- a/res/values-az/strings.xml
+++ b/res/values-az/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Əsas ekranda hərəkət etdirmək üçün vidcetə toxunub saxlayın"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Əsas ekrana əlavə edin"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> vidceti əsas ekrana əlavə edildi"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# vidcet}other{# vidcet}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# qısayol}other{# qısayol}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index 9061ef4..fc656bd 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Dodirnite i zadržite vidžet da biste ga pomerali po početnom ekranu"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Dodaj na početni ekran"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"Dodali ste vidžet <xliff:g id="WIDGET_NAME">%1$s</xliff:g> na početni ekran"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# vidžet}one{# vidžet}few{# vidžeta}other{# vidžeta}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# prečica}one{# prečica}few{# prečice}other{# prečica}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index 6bd6450..d5097c3 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Утрымліваючы віджэт націснутым, перамяшчайце яго па галоўным экране"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Дадаць на галоўны экран"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"Віджэт \"<xliff:g id="WIDGET_NAME">%1$s</xliff:g>\" дададзены на галоўны экран"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# віджэт}one{# віджэт}few{# віджэты}many{# віджэтаў}other{# віджэта}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# ярлык}one{# ярлык}few{# ярлыкі}many{# ярлыкоў}other{# ярлыка}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 68707a8..ff40365 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Докоснете приспособлението и го задръжте, за да го местите на началния екран"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Добавяне към началния екран"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"Приспособлението <xliff:g id="WIDGET_NAME">%1$s</xliff:g> е добавено към началния екран"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# приспособление}other{# приспособления}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# пряк път}other{# преки пътя}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
index 31704bc..509c68a 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"হোম স্ক্রিনের যেকোনও জায়গায় নিয়ে যেতে, উইজেট টাচ করে ধরে থাকুন"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"হোম স্ক্রিনে যোগ করুন"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> উইজেট হোম স্ক্রিনে যোগ করা হয়েছে"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{#টি উইজেট}one{#টি উইজেট}other{#টি উইজেট}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{#টি শর্টকাট}one{#টি শর্টকাট}other{#টি শর্টকাট}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
index 4b197d7..46bac11 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -37,6 +37,7 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Dodirnite i držite vidžet da ga pomjerate po početnom ekranu"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Dodaj na početni ekran"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"Vidžet <xliff:g id="WIDGET_NAME">%1$s</xliff:g> je dodan na početni ekran"</string>
+    <string name="suggested_widgets_header_title" msgid="1844314680798145222">"Prijedlozi"</string>
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# vidžet}one{# vidžet}few{# vidžeta}other{# vidžeta}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# prečica}one{# prečica}few{# prečice}other{# prečica}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 275cba2..739bd98 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Mantén premut el widget per moure\'l per la pantalla d\'inici"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Afegeix a la pantalla d\'inici"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"El widget <xliff:g id="WIDGET_NAME">%1$s</xliff:g> s\'ha afegit a la pantalla d\'inici"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# widget}other{# widgets}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# drecera}other{# dreceres}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index af1ed17..fac5e9f 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Pokud chcete widgetem pohybovat po ploše, podržte ho"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Přidat na plochu"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"Widget <xliff:g id="WIDGET_NAME">%1$s</xliff:g> byl přidán na plochu"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{ # widget}few{# widgety}many{# widgetu}other{# widgetů}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# zkratka}few{# zkratky}many{# zkratky}other{# zkratek}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 2ac056a..2125ed7 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Hold widgetten nede for at flytte den rundt på startskærmen"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Føj til startskærm"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"Widgetten <xliff:g id="WIDGET_NAME">%1$s</xliff:g> blev føjet til startskærmen"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# widget}one{# widget}other{# widgets}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# genvej}one{# genvej}other{# genveje}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index c688916..29a2c5b 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Wenn du das Widget auf dem Startbildschirm verschieben möchtest, halte es gedrückt"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Zum Startbildschirm hinzufügen"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g>-Widget zum Startbildschirm hinzugefügt"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# Widget}other{# Widgets}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# Verknüpfung}other{# Verknüpfungen}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 80307c6..0c64060 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Αγγίξτε παρατεταμένα το γραφικό στοιχείο για να το μετακινήσετε στην αρχική οθόνη"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Προσθήκη στην αρχική οθόνη"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"Το γραφικό στοιχείο <xliff:g id="WIDGET_NAME">%1$s</xliff:g> προστέθηκε στην αρχική οθόνη."</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# γραφικό στοιχείο}other{# γραφικά στοιχεία}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# συντόμευση}other{# συντομεύσεις}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index 22ab551..ef9dfb3 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -37,6 +37,7 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Touch and hold the widget to move it around the home screen"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Add to home screen"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> widget added to home screen"</string>
+    <string name="suggested_widgets_header_title" msgid="1844314680798145222">"Suggestions"</string>
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# widget}other{# widgets}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# shortcut}other{# shortcuts}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-en-rCA/strings.xml b/res/values-en-rCA/strings.xml
index 22838ea..a623919 100644
--- a/res/values-en-rCA/strings.xml
+++ b/res/values-en-rCA/strings.xml
@@ -37,6 +37,7 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Touch &amp; hold the widget to move it around the home screen"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Add to home screen"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> widget added to home screen"</string>
+    <string name="suggested_widgets_header_title" msgid="1844314680798145222">"Suggestions"</string>
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# widget}other{# widgets}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# shortcut}other{# shortcuts}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index 22ab551..ef9dfb3 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -37,6 +37,7 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Touch and hold the widget to move it around the home screen"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Add to home screen"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> widget added to home screen"</string>
+    <string name="suggested_widgets_header_title" msgid="1844314680798145222">"Suggestions"</string>
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# widget}other{# widgets}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# shortcut}other{# shortcuts}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index 22ab551..ef9dfb3 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -37,6 +37,7 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Touch and hold the widget to move it around the home screen"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Add to home screen"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> widget added to home screen"</string>
+    <string name="suggested_widgets_header_title" msgid="1844314680798145222">"Suggestions"</string>
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# widget}other{# widgets}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# shortcut}other{# shortcuts}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-en-rXC/strings.xml b/res/values-en-rXC/strings.xml
index a885f00..da3fea1 100644
--- a/res/values-en-rXC/strings.xml
+++ b/res/values-en-rXC/strings.xml
@@ -37,6 +37,7 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‎‏‎‏‎‎‏‎‎‏‎‎‎‏‎‏‏‏‎‏‏‎‏‎‏‏‎‎‏‎‎‎‏‏‏‏‎‏‎‏‎‏‏‏‏‏‏‎‎‎‏‏‏‏‎‎Touch &amp; hold the widget to move it around the home screen‎‏‎‎‏‎"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‏‏‏‏‏‏‏‏‏‏‎‎‏‏‏‏‎‏‏‎‎‏‎‏‏‎‎‎‎‏‏‎‎‎‎‎‎‏‏‎‎‎‏‏‎‏‎‎‎‎‏‏‎‏‏‎‎‏‏‎‏‎‏‏‏‏‎Add to home screen‎‏‎‎‏‎"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‏‏‎‏‏‏‏‎‏‏‏‎‎‎‏‏‏‎‎‎‏‎‎‎‏‎‏‎‎‏‎‎‏‏‏‎‏‎‎‏‎‏‏‏‏‏‎‎‏‏‎‏‎‎‎‎‎‏‎‏‏‏‏‏‏‎‎‏‎‎‏‏‎<xliff:g id="WIDGET_NAME">%1$s</xliff:g>‎‏‎‎‏‏‏‎ widget added to home screen‎‏‎‎‏‎"</string>
+    <string name="suggested_widgets_header_title" msgid="1844314680798145222">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‏‎‏‏‏‎‎‏‏‎‎‏‏‎‎‎‎‏‎‏‎‎‏‎‎‏‏‎‏‏‏‎‎‎‏‏‏‎‏‏‎‎‎‎‎‎‏‎‏‏‏‎‏‎‏‎‏‏‎‎‎‏‏‎‎Suggestions‎‏‎‎‏‎"</string>
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‏‎‎‎‎‏‎‎‎‎‎‏‏‎‏‎‎‏‎‎‏‏‏‎‎‎‏‎‏‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‏‎‎‎‎‎‎‎# widget‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‏‏‏‏‎‏‏‎‎‏‏‏‎‎‎‎‏‎‎‎‎‎‏‏‎‏‎‎‏‎‎‏‏‏‎‎‎‏‎‏‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‏‏‎‎‏‎‎‎‎‎‎‎# widgets‎‏‎‎‏‎}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‎‏‎‎‎‏‏‎‎‏‎‏‎‎‎‏‏‎‏‎‎‏‏‏‎‎‏‏‎‏‎‏‏‎‏‏‎‏‎‏‏‏‎‎‎‏‏‎‏‏‏‏‎‏‎# shortcut‎‏‎‎‏‎}other{‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‎‏‎‎‎‏‏‎‎‏‎‏‎‎‎‏‏‎‏‎‎‏‏‏‎‎‏‏‎‏‎‏‏‎‏‏‎‏‎‏‏‏‎‎‎‏‏‎‏‏‏‏‎‏‎# shortcuts‎‏‎‎‏‎}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‏‏‏‏‏‎‎‏‎‎‎‎‎‎‏‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‎‎‏‏‎‎‏‎‏‎‎‎‎‎‎‏‎‎‏‏‎‏‏‏‏‎‏‏‏‏‎‎‎‎‏‎‎‏‏‎<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>‎‏‎‎‏‏‏‎, ‎‏‎‎‏‏‎<xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>‎‏‎‎‏‏‏‎‎‏‎‎‏‎"</string>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 3a21f15..b01679f 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Mantén presionado el widget para moverlo por la pantalla principal"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Agregar a pantalla principal"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"Se agregó el widget de <xliff:g id="WIDGET_NAME">%1$s</xliff:g> a la pantalla principal"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# widget}other{# widgets}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# acceso directo}other{# accesos directos}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index af9cc27..73dcad5 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Mantén pulsado el widget para moverlo por la pantalla de inicio"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Añadir a pantalla de inicio"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"Widget <xliff:g id="WIDGET_NAME">%1$s</xliff:g> añadido a la pantalla de inicio"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# widget}other{# widgets}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# acceso directo}other{# accesos directos}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index b8d12a3..efeb853 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Vidina teisaldamiseks avakuval puudutage vidinat ja hoidke seda all"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Lisa avakuvale"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"Vidin <xliff:g id="WIDGET_NAME">%1$s</xliff:g> lisati avakuvale"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# vidin}other{# vidinat}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# otsetee}other{# otseteed}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml
index 530a5a0..d0b6f54 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Widgeta hasierako pantailan zehar mugitzeko, eduki ezazu sakatuta"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Gehitu hasierako pantailan"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> widgeta hasierako pantailan gehitu da"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# widget}other{# widget}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# lasterbide}other{# lasterbide}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index cb811f3..5ec5b54 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"ابزارک را لمس کنید و نگه دارید تا بتوانید آن را در صفحه اصلی حرکت دهید"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"افزودن به صفحه اصلی"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"ابزارک <xliff:g id="WIDGET_NAME">%1$s</xliff:g> به صفحه اصلی اضافه شد"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{‏# ابزارک}one{‏# ابزارک}other{‏# ابزارک}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{‏# میان‌بر}one{‏# میان‌بر}other{‏# میان‌بر}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>،<xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 92fe859..1b02c14 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Voit siirtää widgetiä aloitusnäytöllä koskettamalla sitä pitkään"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Lisää aloitusnäytölle"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"Widget lisätty aloitusnäytölle: <xliff:g id="WIDGET_NAME">%1$s</xliff:g>"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# widget}other{# widgetiä}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# pikakuvake}other{# pikakuvaketta}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index db35665..604cb31 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Maintenez le doigt sur le widget pour le déplacer sur l\'écran d\'accueil"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Ajouter à l\'écran d\'accueil"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"Le widget <xliff:g id="WIDGET_NAME">%1$s</xliff:g> a été ajouté à l\'écran d\'accueil"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# widget}one{# widget}other{# widgets}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# raccourci}one{# raccourci}other{# raccourcis}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 571a03e..1d22a5f 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Appuyez de manière prolongée sur le widget pour le déplacer sur l\'écran d\'accueil"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Ajouter à l\'écran d\'accueil"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"Widget <xliff:g id="WIDGET_NAME">%1$s</xliff:g> ajouté à l\'écran d\'accueil"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# widget}one{# widget}other{# widgets}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# raccourci}one{# raccourci}other{# raccourcis}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index 2ed64a1..8e90cbc 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Mantén premido o widget para movelo pola pantalla de inicio"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Engadir á pantalla de inicio"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"Engadiuse o widget <xliff:g id="WIDGET_NAME">%1$s</xliff:g> á pantalla de inicio"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# widget}other{# widgets}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# atallo}other{# atallos}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
index 719f531..487fb9e 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"વિજેટને હોમ સ્ક્રીનની આજુબાજુ ખસેડવા માટે, તેને ટચ કરીને થોડીવાર દબાવી રાખો"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"હોમ સ્ક્રીનમાં ઉમેરો"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"હોમ સ્ક્રીન પર <xliff:g id="WIDGET_NAME">%1$s</xliff:g> વિજેટ ઉમેર્યુ"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# વિજેટ}one{# વિજેટ}other{# વિજેટ}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# શૉર્ટકટ}one{# શૉર્ટકટ}other{# શૉર્ટકટ}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index eacd252..d937288 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"होम स्क्रीन पर इधर-उधर ले जाने के लिए, विजेट को दबाकर रखें"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"होम स्क्रीन पर जोड़ें"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> विजेट को होम स्क्रीन पर जोड़ा गया"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# विजेट}one{# विजेट}other{# विजेट}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# शॉर्टकट}one{# शॉर्टकट}other{# शॉर्टकट}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index eeeade0..66b5ef9 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -37,6 +37,7 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Dodirnite i zadržite widget da biste ga pomicali po početnom zaslonu"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Dodaj na početni zaslon"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"Widget <xliff:g id="WIDGET_NAME">%1$s</xliff:g> dodan je na početni zaslon"</string>
+    <string name="suggested_widgets_header_title" msgid="1844314680798145222">"Prijedlozi"</string>
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# widget}one{# widget}few{# widgeta}other{# widgeta}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# prečac}one{# prečac}few{# prečaca}other{# prečaca}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 330fd69..e25fc8d 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Tartsa lenyomva a modult a kezdőképernyőn való mozgatáshoz"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Hozzáadás a kezdőképernyőhöz"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> modul hozzáadva a kezdőképernyőhöz"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# modul}other{# modul}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# gyorsparancs}other{# gyorsparancs}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml
index cf01672..bdb2259 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Հպեք վիջեթին և պահեք՝ հիմնական էկրան տեղափոխելու համար"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Ավելացնել հիմնական էկրանին"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> վիջեթն ավելացվել է հիմնական էկրանին"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# վիջեթ}one{# վիջեթ}other{# վիջեթ}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# դյուրանցում}one{# դյուրանցում}other{# դյուրանցում}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index fdccae3..ec3531b 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Sentuh lama widget untuk memindahkannya di sekitar layar utama"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Tambahkan ke layar utama"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"Widget <xliff:g id="WIDGET_NAME">%1$s</xliff:g> ditambahkan ke layar utama"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# widget}other{# widget}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# pintasan}other{# pintasan}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml
index 8ddfddc..ee57fbc 100644
--- a/res/values-is/strings.xml
+++ b/res/values-is/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Haltu fingri á græjunni til að hreyfa hana um heimaskjáinn"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Bæta á heimaskjá"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> græju bætt við heimaskjá"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# græja}one{# græja}other{# græjur}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# flýtileið}one{# flýtileið}other{# flýtileiðir}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 1c7cbe1..6a20454 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Tocca e tieni premuto il widget per spostarlo nella schermata Home"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Aggiungi alla schermata Home"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"Widget <xliff:g id="WIDGET_NAME">%1$s</xliff:g> aggiunto alla schermata Home"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# widget}other{# widget}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# scorciatoia}other{# scorciatoie}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 3bb65b4..191efb8 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"לוחצים לחיצה ארוכה על הווידג\'ט כדי להזיז אותו במסך הבית"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"הוספה למסך הבית"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"הווידג\'ט <xliff:g id="WIDGET_NAME">%1$s</xliff:g> נוסף למסך הבית"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{ווידג\'ט אחד}one{# ווידג\'טים}two{# ווידג\'טים}other{# ווידג\'טים}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{קיצור דרך אחד}one{# קיצורי דרך}two{# קיצורי דרך}other{# קיצורי דרך}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 02dcba6..117ba4d 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"ウィジェットを押し続けると、ホーム画面上に移動できます"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"ホーム画面に追加"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"「<xliff:g id="WIDGET_NAME">%1$s</xliff:g>」ウィジェットをホーム画面に追加しました"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# 件のウィジェット}other{# 件のウィジェット}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# 件のショートカット}other{# 件のショートカット}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>、<xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml
index 2e684b2..c563e36 100644
--- a/res/values-ka/strings.xml
+++ b/res/values-ka/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"ხანგრძლივად შეეხეთ ვიჯეტს მთავარ ეკრანზე მის გადასაადგილებლად"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"მთავარ ეკრანზე დამატება"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> ვიჯეტი დამატებულია მთავარ ეკრანზე"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# ვიჯეტი}other{# ვიჯეტი}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# მალსახმობი}other{# მალსახმობი}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml
index 4caffb3..1a28773 100644
--- a/res/values-kk/strings.xml
+++ b/res/values-kk/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Негізгі экран бойынша жылжыту үшін виджетті басып ұстаңыз."</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Негізгі экранға қосу"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> виджеті негізгі экранға енгізілді."</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# виджет}other{# виджет}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# таңбаша}other{# таңбаша}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml
index 1039a89..fcde08f 100644
--- a/res/values-km/strings.xml
+++ b/res/values-km/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"ចុចលើធាតុក្រាហ្វិកឱ្យជាប់ ដើម្បីផ្លាស់ទីវាជុំវិញអេក្រង់ដើម"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"បញ្ចូល​ទៅក្នុង​អេក្រង់​ដើម"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"បានបញ្ចូល​ធាតុក្រាហ្វិក <xliff:g id="WIDGET_NAME">%1$s</xliff:g> ទៅ​អេក្រង់ដើម"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{ធាតុ​ក្រាហ្វិក #}other{ធាតុ​ក្រាហ្វិក #}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{ផ្លូវកាត់ #}other{ផ្លូវកាត់ #}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
index fa97690..e15b94e 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"ಹೋಮ್ ಸ್ಕ್ರೀನ್ ಸುತ್ತ ವಿಜೆಟ್ ಅನ್ನು ಸರಿಸಲು, ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಒತ್ತಿ ಹಿಡಿದುಕೊಳ್ಳಿ"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"ಹೋಮ್ ಸ್ಕ್ರೀನ್‌ಗೆ ಸೇರಿಸಿ"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"ಹೋಮ್‌ಸ್ಕ್ರೀನ್‌ಗೆ <xliff:g id="WIDGET_NAME">%1$s</xliff:g> ವಿಜೆಟ್ ಅನ್ನು ಸೇರಿಸಲಾಗಿದೆ"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# ವಿಜೆಟ್}one{# ವಿಜೆಟ್‌ಗಳು}other{# ವಿಜೆಟ್‌ಗಳು}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# ಶಾರ್ಟ್‌ಕಟ್}one{# ಶಾರ್ಟ್‌ಕಟ್‌ಗಳು}other{# ಶಾರ್ಟ್‌ಕಟ್‌ಗಳು}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index b1c9a16..48ca19d 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"홈 화면에서 위젯을 이동하려면 길게 터치하세요."</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"홈 화면에 추가"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> 위젯이 홈 화면에 추가됨"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{위젯 #개}other{위젯 #개}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{바로가기 #개}other{바로가기 #개}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml
index 18672f5..a2a3f0c 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Башкы экранга жылдыруу үчүн виджетти коё бербей басып туруңуз"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Башкы экранга кошуу"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> виджети башкы экранга кошулду"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# виджет}other{# виджет}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# ыкчам баскыч}other{# ыкчам баскыч}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-land/dimens.xml b/res/values-land/dimens.xml
index 422240c..d0c26aa 100644
--- a/res/values-land/dimens.xml
+++ b/res/values-land/dimens.xml
@@ -23,7 +23,6 @@
 
     <!-- Dynamic grid -->
     <dimen name="dynamic_grid_edge_margin">15.28dp</dimen>
-    <dimen name="dynamic_grid_icon_drawable_padding">4dp</dimen>
     <dimen name="dynamic_grid_drop_target_size">36dp</dimen>
     <dimen name="cell_layout_padding">20dp</dimen>
 
diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml
index 5a773ae..2de7cc1 100644
--- a/res/values-lo/strings.xml
+++ b/res/values-lo/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"ແຕະໃສ່ວິດເຈັດຄ້າງໄວ້ເພື່ອຍ້າຍມັນໄປມາຢູ່ໂຮມສະກຣີນ"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"ເພີ່ມໃສ່ໂຮມສະກຣີນ"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"ເພີ່ມວິດເຈັດ <xliff:g id="WIDGET_NAME">%1$s</xliff:g> ໃສ່ໂຮມສະກຣີນແລ້ວ"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# ວິດເຈັດ}other{# ວິດເຈັດ}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# ທາງລັດ}other{# ທາງລັດ}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index a01c1cd..93f3d3f 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Paliesdami ir palaikydami valdiklį galite judėti pagrindiniame ekrane"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Pridėti prie pagrindinio ekrano"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"Valdiklis „<xliff:g id="WIDGET_NAME">%1$s</xliff:g>“ pridėtas prie pagrindinio ekrano"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# valdiklis}one{# valdiklis}few{# valdikliai}many{# valdiklio}other{# valdiklių}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# spartusis klavišas}one{# spartusis klavišas}few{# spartieji klavišai}many{# sparčiojo klavišo}other{# sparčiųjų klavišų}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index a5e3ed8..cf6f259 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Pieskarieties logrīkam un turiet to, lai to pārvietotu pa sākuma ekrānu."</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Pievienot sākuma ekrānam"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"Logrīks “<xliff:g id="WIDGET_NAME">%1$s</xliff:g>” ir pievienots sākuma ekrānam"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# logrīks}zero{# logrīku}one{# logrīks}other{# logrīki}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# saīsne}zero{# saīšņu}one{# saīsne}other{# saīsnes}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
index 8418ed2..12bd5fd 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Допрете го и задржете го виџетот за да го движите наоколу на почетниот екран"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Додај на почетниот екран"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"Виџетот <xliff:g id="WIDGET_NAME">%1$s</xliff:g> е додаден на почетниот екран"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# виџет}one{# виџет}other{# виџети}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# кратенка}one{# кратенка}other{# кратенки}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml
index 945e5ba..af36000 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"ഹോം സ്‌ക്രീനിന് ചുറ്റും വിജറ്റ് നീക്കാൻ അതിൽ സ്‌പർശിച്ച് പിടിക്കുക"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"ഹോം സ്‌ക്രീനിലേക്ക് ചേർക്കുക"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> വിജറ്റ് ഹോം സ്‌ക്രീനിലേക്ക് ചേർത്തു"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# വിജറ്റ്}other{# വിജറ്റുകൾ}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# കുറുക്കുവഴി}other{# കുറുക്കുവഴികൾ}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml
index a3754ce..be82db3 100644
--- a/res/values-mn/strings.xml
+++ b/res/values-mn/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Виджетийг үндсэн нүүрний эргэн тойронд зөөхийн тулд түүнд хүрээд, удаан дарна уу"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Үндсэн нүүрэнд нэмэх"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> виджетийг үндсэн нүүрэнд нэмсэн"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# виджет}other{# виджет}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# товчлол}other{# товчлол}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml
index ac7a09b..513e608 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"होम स्क्रीनवर ते हलवण्यासाठी विजेटला स्पर्श करा आणि धरून ठेवा"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"होम स्क्रीनवर जोडा"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> हे विजेट तुमच्या होम स्क्रीनवर जोडले आहे"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# विजेट}other{# विजेट}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# शॉर्टकट}other{# शॉर्टकट}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index 263ef48..c41c70b 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Sentuh &amp; tahan widget untuk menggerakkan widget di sekitar skrin utama"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Tambahkan pada skrin utama"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"Widget <xliff:g id="WIDGET_NAME">%1$s</xliff:g> ditambahkan pada skrin utama"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# widget}other{# widget}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# pintasan}other{# pintasan}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index e62e050..7cccad4 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"ပင်မစာမျက်နှာတွင်ရွှေ့ရန် ဝိဂျက်ကို တို့ထိ၍ ဖိထားပါ"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"ပင်မစာမျက်နှာတွင် ထည့်ရန်"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> ဝိဂျက်ကို ပင်မစာမျက်နှာတွင် ထည့်လိုက်ပြီ"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{ဝိဂျက် # ခု}other{ဝိဂျက် # ခု}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{ဖြတ်လမ်းလင့်ခ် # ခု}other{ဖြတ်လမ်းလင့်ခ် # ခု}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>၊ <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 2471081..1d8d153 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Trykk og hold på modulen for å bevege den rundt på startskjermen"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Legg til på startskjermen"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g>-modulen er lagt til på startskjermen"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# modul}other{# moduler}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# snarvei}other{# snarveier}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
index 0cd7f95..f07f16c 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"विजेटलाई होम स्क्रिनमा यताउता सार्न त्यसमा टच एन्ड होल्ड गर्नुहोस्"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"होम स्क्रिनमा राख्नुहोस्"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"होम स्क्रिनमा <xliff:g id="WIDGET_NAME">%1$s</xliff:g> विजेट हालियो"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# विजेट}other{# वटा विजेट}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# सर्टकट}other{# वटा सर्टकट}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 5e6ed97..5685643 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Tik op de widget en houd vast om deze te verplaatsen op het startscherm"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Toevoegen aan startscherm"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"Widget <xliff:g id="WIDGET_NAME">%1$s</xliff:g> toegevoegd aan startscherm"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# widget}other{# widgets}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# snelkoppeling}other{# snelkoppelingen}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml
index a0509b1..e4e5877 100644
--- a/res/values-or/strings.xml
+++ b/res/values-or/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"ହୋମ ସ୍କ୍ରିନର ଆଖପାଖରେ ୱିଜେଟକୁ ମୁଭ କରିବା ପାଇଁ ଏହାକୁ ସ୍ପର୍ଶ କରି ଧରି ରଖନ୍ତୁ"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"ହୋମ ସ୍କ୍ରିନରେ ଯୋଗ କରନ୍ତୁ"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g>ର ୱିଜେଟ ହୋମ ସ୍କ୍ରିନରେ ଯୋଡ଼ାଗଲା"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{#ଟି ୱିଜେଟ୍}other{#ଟି ୱିଜେଟ୍}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{#ଟି ସର୍ଟକଟ୍}other{#ଟି ସର୍ଟକଟ୍}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index 2bb7274..1a78d95 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"ਵਿਜੇਟ ਨੂੰ ਹੋਮ ਸਕ੍ਰੀਨ \'ਤੇ ਇੱਧਰ-ਉੱਧਰ ਲਿਜਾਉਣ ਲਈ ਸਪਰਸ਼ ਕਰ ਕੇ ਦਬਾਈ ਰੱਖੋ"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"ਹੋਮ ਸਕ੍ਰੀਨ \'ਤੇ ਸ਼ਾਮਲ ਕਰੋ"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> ਵਿਜੇਟ ਨੂੰ ਹੋਮ ਸਕ੍ਰੀਨ \'ਤੇ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# ਵਿਜੇਟ}one{# ਵਿਜੇਟ}other{# ਵਿਜੇਟ}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# ਸ਼ਾਰਟਕੱਟ}one{# ਸ਼ਾਰਟਕੱਟ}other{# ਸ਼ਾਰਟਕੱਟ}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index f79d0d2..ea379d2 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Kliknij i przytrzymaj widżet, aby poruszać nim po ekranie głównym"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Dodaj do ekranu głównego"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"Widżet <xliff:g id="WIDGET_NAME">%1$s</xliff:g> został dodany do ekranu głównego"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# widżet}few{# widżety}many{# widżetów}other{# widżetu}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# skrót}few{# skróty}many{# skrótów}other{# skrótu}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index db86366..b56f857 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -37,6 +37,7 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Toque sem soltar no widget para o mover no ecrã principal"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Adicionar ao ecrã principal"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"Widget <xliff:g id="WIDGET_NAME">%1$s</xliff:g> adicionado ao ecrã principal"</string>
+    <string name="suggested_widgets_header_title" msgid="1844314680798145222">"Sugestões"</string>
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# widget}other{# widgets}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# atalho}other{# atalhos}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index fea3ca9..b2f420c 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Toque no widget e o pressione para definir a posição dele na tela inicial"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Adicionar à tela inicial"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"Widget <xliff:g id="WIDGET_NAME">%1$s</xliff:g> adicionado à tela inicial"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# widget}one{# widget}other{# widgets}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# atalho}one{# atalho}other{# atalhos}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 242649e..1af20f3 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Atinge lung widgetul pentru a-l muta pe ecranul de pornire"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Adaugă pe ecranul de pornire"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"Widgetul <xliff:g id="WIDGET_NAME">%1$s</xliff:g> a fost adăugat pe ecranul de pornire"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# widget}few{# widgeturi}other{# de widgeturi}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# comandă rapidă}few{# comenzi rapide}other{# de comenzi rapide}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g> <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index c14e4d1..345eed5 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Нажмите на виджет и удерживайте его, чтобы переместить в нужное место на главном экране."</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Добавить на главный экран"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"Виджет \"<xliff:g id="WIDGET_NAME">%1$s</xliff:g>\" добавлен на главный экран"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# виджет}one{# виджет}few{# виджета}many{# виджетов}other{# виджета}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# ярлык}one{# ярлык}few{# ярлыка}many{# ярлыков}other{# ярлыка}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml
index 27a81cf..67700a9 100644
--- a/res/values-si/strings.xml
+++ b/res/values-si/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"විජට් එක මුල් පිටු තිරය වටා ගෙන යාමට විජට් එක ස්පර්ශ කර අල්ලාගෙන සිටින්න"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"මුල් තිරය වෙත එක් කරන්න"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> විජට්ටුව මුල් පිටු තිරය වෙත එක් කරන ලදි"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{විජට් #}one{විජට් #}other{විජට් #}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{කෙටි මං #}one{කෙටි මං #}other{කෙටි මං #}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index 973ec86..a7c7c58 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Pridržaním môžete miniaplikáciu posúvať po ploche"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Pridať na plochu"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"Na plochu bola pridaná miniaplikácia <xliff:g id="WIDGET_NAME">%1$s</xliff:g>"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# miniaplikácia}few{# miniaplikácie}many{# widgets}other{# miniaplikácií}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# odkaz}few{# odkazy}many{# shortcuts}other{# odkazov}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index a2720b6..ff49ffe 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Dotaknite se pripomočka in ga pridržite, če ga želite premikati po začetnem zaslonu."</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Dodaj na začetni zaslon"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"Pripomoček »<xliff:g id="WIDGET_NAME">%1$s</xliff:g>« je dodan na začetni zaslon."</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# pripomoček}one{# pripomoček}two{# pripomočka}few{# pripomočki}other{# pripomočkov}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# bližnjica}one{# bližnjica}two{# bližnjici}few{# bližnjice}other{# bližnjic}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index dd25a36..1bba697 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Prek dhe mbaj të shtypur miniaplikacionin për ta lëvizur atë nëpër ekranin bazë"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Shto në ekranin bazë"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"Miniaplikacioni <xliff:g id="WIDGET_NAME">%1$s</xliff:g> u shtua në ekranin bazë"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# miniaplikacion}other{# miniaplikacione}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# shkurtore}other{# shkurtore}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 14212d7..667eaf5 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Додирните и задржите виџет да бисте га померали по почетном екрану"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Додај на почетни екран"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"Додали сте виџет <xliff:g id="WIDGET_NAME">%1$s</xliff:g> на почетни екран"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# виџет}one{# виџет}few{# виџета}other{# виџета}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# пречица}one{# пречица}few{# пречице}other{# пречица}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 05cb231..3ebea21 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Tryck länge på widgeten om du vill flytta den på startskärmen"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Lägg till på startskärmen"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"Widget för <xliff:g id="WIDGET_NAME">%1$s</xliff:g> har lagts till på startskärmen"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# widget}other{# widgetar}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# genväg}other{# genvägar}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 5624d4a..f4ac880 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Gusa na ushikilie wijeti ili uisogeze kwenye skrini ya kwanza"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Weka kwenye skrini ya kwanza"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"Umeongeza wijeti ya <xliff:g id="WIDGET_NAME">%1$s</xliff:g> kwenye skrini ya kwanza"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{Wijeti #}other{Wijeti #}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{Njia # ya mkato}other{Njia # za mkato}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-sw600dp/dimens.xml b/res/values-sw600dp/dimens.xml
index 0af0603..cc1f09e 100644
--- a/res/values-sw600dp/dimens.xml
+++ b/res/values-sw600dp/dimens.xml
@@ -35,7 +35,6 @@
 
 <!-- Dynamic grid -->
     <dimen name="dynamic_grid_edge_margin">9dp</dimen>
-    <dimen name="dynamic_grid_icon_drawable_padding">7dp</dimen>
     <dimen name="cell_layout_padding">9dp</dimen>
 
 <!-- Hotseat -->
diff --git a/res/values-sw600dp/styles.xml b/res/values-sw600dp/styles.xml
new file mode 100644
index 0000000..63bd46b
--- /dev/null
+++ b/res/values-sw600dp/styles.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+  ~ Copyright (C) 2023 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.
+  -->
+
+<resources>
+    <style name="CellStyleDefault">
+        <item name="iconDrawablePadding">7dp</item>
+    </style>
+</resources>
\ No newline at end of file
diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml
index 4213ea4..e0c44c8 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"முகப்புத் திரையைச் சுற்றி விட்ஜெட்டை நகர்த்த அதைத் தொட்டுப் பிடியுங்கள்"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"முகப்புத் திரையில் சேர்"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> விட்ஜெட் முகப்புத் திரையில் சேர்க்கப்பட்டது"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# விட்ஜெட்}other{# விட்ஜெட்டுகள்}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# ஷார்ட்கட்}other{# ஷார்ட்கட்கள்}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index e8ef4fa..8617a28 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"విడ్జెట్‌ను మొదటి స్క్రీన్ చుట్టూ తిప్పడానికి దాన్ని తాకి, &amp; నొక్కి ఉంచండి"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"మొదటి స్క్రీన్‌కు జోడించండి"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"మొదటి స్క్రీన్‌కు <xliff:g id="WIDGET_NAME">%1$s</xliff:g> విడ్జెట్ జోడించబడింది"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# విడ్జెట్}other{# విడ్జెట్‌లు}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# షార్ట్‌కట్}other{# షార్ట్‌కట్‌లు}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 85289e4..24ed95d 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"แตะวิดเจ็ตค้างไว้เพื่อย้ายไปรอบๆ หน้าจอหลัก"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"เพิ่มลงในหน้าจอหลัก"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"เพิ่มวิดเจ็ต <xliff:g id="WIDGET_NAME">%1$s</xliff:g> ลงในหน้าจอหลักแล้ว"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{วิดเจ็ต # รายการ}other{วิดเจ็ต # รายการ}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{ทางลัด # รายการ}other{ทางลัด # รายการ}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index ec6bc5f..7567bbb 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Pindutin nang matagal ang widget para ilipat-lipat ito sa home screen"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Idagdag sa home screen"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"Idinagdag sa home screen ang widget na <xliff:g id="WIDGET_NAME">%1$s</xliff:g>"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# widget}one{# widget}other{# na widget}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# shortcut}one{# shortcut}other{# na shortcut}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index c485994..df6a7e7 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Ana ekranda taşımak için widget\'a dokunup basılı tutun"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Ana ekrana ekle"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> widget\'ı ana ekrana eklendi"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# widget}other{# widget}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# kısayol}other{# kısayol}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index d375756..5ef5b65 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Натисніть і втримуйте віджет, щоб перемістити його в потрібне місце на головному екрані"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Додати на головний екран"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"Віджет <xliff:g id="WIDGET_NAME">%1$s</xliff:g> додано на головний екран"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# віджет}one{# віджет}few{# віджети}many{# віджетів}other{# віджета}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# ярлик}one{# ярлик}few{# ярлики}many{# ярликів}other{# ярлика}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml
index 13a0962..e3c10c6 100644
--- a/res/values-ur/strings.xml
+++ b/res/values-ur/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"ویجیٹ کو ہوم اسکرین کے چاروں طرف منتقل کرنے کے لیے اسے ٹچ کریں اور دبائے رکھیں"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"ہوم اسکرین میں شامل کریں"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> ویجیٹ کو ہوم اسکرین میں شامل کیا گیا"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# ویجیٹ}other{# ویجیٹس}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# شارٹ کٹ}other{# شارٹ کٹس}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>، <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml
index a3859fd..79860f3 100644
--- a/res/values-uz/strings.xml
+++ b/res/values-uz/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Bosh ekranda surish uchun vidjet ustiga bosib turing"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Bosh ekranga chiqarish"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> vidjeti bosh ekranga qoʻshildi"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# ta vidjet}other{# ta vidjet}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# ta yorliq}other{# ta yorliq}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 6924aed..e128e2c 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Chạm và giữ tiện ích để di chuyển tiện ích đó xung quanh màn hình chính"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Thêm vào màn hình chính"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"Đã thêm tiện ích <xliff:g id="WIDGET_NAME">%1$s</xliff:g> vào màn hình chính"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# tiện ích}other{# tiện ích}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# lối tắt}other{# lối tắt}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 5011df8..860dbe4 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"轻触并按住此微件即可在主屏幕上随意移动它"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"添加到主屏幕"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"已将“<xliff:g id="WIDGET_NAME">%1$s</xliff:g>”微件添加到主屏幕"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# 个微件}other{# 个微件}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# 个快捷方式}other{# 个快捷方式}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>,<xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index d14ce53..e3ba417 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"按住小工具即可移到主畫面的任何位置"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"加去主畫面"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"已經將「<xliff:g id="WIDGET_NAME">%1$s</xliff:g>」小工具加咗去主畫面"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# 個小工具}other{# 個小工具}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# 個捷徑}other{# 個捷徑}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>、<xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 45cbc7f..fc00cc8 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"按住小工具即可將它移到主畫面上的任何位置"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"新增至主畫面"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"已將「<xliff:g id="WIDGET_NAME">%1$s</xliff:g>」小工具新增到主畫面"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# 項小工具}other{# 項小工具}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# 個捷徑}other{# 個捷徑}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>、<xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index ec4a0d9..0688385 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -37,6 +37,8 @@
     <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Thinta uphinde ubambe iwijethi ukuyihambisa kusikrini sasekhaya"</string>
     <string name="add_to_home_screen" msgid="9168649446635919791">"Faka kusikrini sasekhaya"</string>
     <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"Iwijethi ye-<xliff:g id="WIDGET_NAME">%1$s</xliff:g> yengezwe kusikrini sasekhaya"</string>
+    <!-- no translation found for suggested_widgets_header_title (1844314680798145222) -->
+    <skip />
     <string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{iwijethi #}one{amawijethi #}other{amawijethi #}}"</string>
     <string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{isinqamuleli #}one{izinqamuleli #}other{izinqamuleli #}}"</string>
     <string name="widgets_and_shortcuts_count" msgid="7209136747878365116">"<xliff:g id="WIDGETS_COUNT">%1$s</xliff:g>, <xliff:g id="SHORTCUTS_COUNT">%2$s</xliff:g>"</string>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 9d2aa06..ba6e547 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -21,7 +21,6 @@
     <!-- Dynamic Grid -->
     <dimen name="dynamic_grid_edge_margin">10.77dp</dimen>
     <dimen name="dynamic_grid_left_right_margin">8dp</dimen>
-    <dimen name="dynamic_grid_icon_drawable_padding">7dp</dimen>
     <!-- Minimum amount of next page visible in spring loaded mode -->
     <dimen name="dynamic_grid_spring_loaded_min_next_space_visible">24dp</dimen>
 
@@ -349,7 +348,7 @@
     <dimen name="developer_options_filter_margins">10dp</dimen>
 
     <!-- Theming related -->
-    <dimen name="default_dialog_corner_radius">8dp</dimen>
+    <dimen name="default_dialog_corner_radius">26dp</dimen>
     <dimen name="dialogCornerRadius">@dimen/default_dialog_corner_radius</dimen>
 
     <!-- Onboarding bottomsheet related -->
diff --git a/src/com/android/launcher3/InvariantDeviceProfile.java b/src/com/android/launcher3/InvariantDeviceProfile.java
index 604c1b8..2fb0fa6 100644
--- a/src/com/android/launcher3/InvariantDeviceProfile.java
+++ b/src/com/android/launcher3/InvariantDeviceProfile.java
@@ -16,6 +16,7 @@
 
 package com.android.launcher3;
 
+import static com.android.launcher3.LauncherPrefs.GRID_NAME;
 import static com.android.launcher3.Utilities.dpiFromPx;
 import static com.android.launcher3.config.FeatureFlags.ENABLE_DEVICE_PROFILE_LOGGING;
 import static com.android.launcher3.config.FeatureFlags.ENABLE_TWO_PANEL_HOME;
@@ -93,8 +94,6 @@
     public static final int TYPE_MULTI_DISPLAY = 1;
     public static final int TYPE_TABLET = 2;
 
-    private static final String KEY_IDP_GRID_NAME = "idp_grid_name";
-
     private static final float ICON_SIZE_DEFINED_IN_APP_DP = 48;
 
     // Constants that affects the interpolation curve between statically defined device profile
@@ -207,8 +206,7 @@
         String gridName = getCurrentGridName(context);
         String newGridName = initGrid(context, gridName);
         if (!newGridName.equals(gridName)) {
-            LauncherPrefs.getPrefs(context).edit().putString(KEY_IDP_GRID_NAME, newGridName)
-                    .apply();
+            LauncherPrefs.get(context).put(GRID_NAME, newGridName);
         }
         new DeviceGridState(this).writeToPrefs(context);
 
@@ -316,7 +314,7 @@
     }
 
     public static String getCurrentGridName(Context context) {
-        return LauncherPrefs.getPrefs(context).getString(KEY_IDP_GRID_NAME, null);
+        return LauncherPrefs.get(context).get(GRID_NAME);
     }
 
     private String initGrid(Context context, String gridName) {
@@ -458,9 +456,8 @@
 
 
     public void setCurrentGrid(Context context, String gridName) {
-        Context appContext = context.getApplicationContext();
-        LauncherPrefs.getPrefs(appContext).edit().putString(KEY_IDP_GRID_NAME, gridName).apply();
-        MAIN_EXECUTOR.execute(() -> onConfigChanged(appContext));
+        LauncherPrefs.get(context).put(GRID_NAME, gridName);
+        MAIN_EXECUTOR.execute(() -> onConfigChanged(context.getApplicationContext()));
     }
 
     private Object[] toModelState() {
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index 41632f7..8097fd7 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -3211,7 +3211,7 @@
     }
 
     @Override
-    public boolean shouldUseColorExtractionForPopup() {
+    public boolean canUseMultipleShadesForPopup() {
         return getTopOpenViewWithType(this, TYPE_FOLDER) == null
                 && getStateManager().getState() != LauncherState.ALL_APPS;
     }
diff --git a/src/com/android/launcher3/LauncherPrefs.kt b/src/com/android/launcher3/LauncherPrefs.kt
index 2e07e30..befaa64 100644
--- a/src/com/android/launcher3/LauncherPrefs.kt
+++ b/src/com/android/launcher3/LauncherPrefs.kt
@@ -4,6 +4,8 @@
 import android.content.SharedPreferences
 import android.content.SharedPreferences.OnSharedPreferenceChangeListener
 import androidx.annotation.VisibleForTesting
+import com.android.launcher3.LauncherFiles.DEVICE_PREFERENCES_KEY
+import com.android.launcher3.LauncherFiles.SHARED_PREFERENCES_KEY
 import com.android.launcher3.allapps.WorkProfileManager
 import com.android.launcher3.model.DeviceGridState
 import com.android.launcher3.pm.InstallSessionHelper
@@ -20,11 +22,10 @@
 class LauncherPrefs(private val context: Context) {
 
     /** Wrapper around `getInner` for a `ContextualItem` */
-    fun <T : Any> get(item: ContextualItem<T>): T =
-        getInner(item, item.defaultValueFromContext(context))
+    fun <T> get(item: ContextualItem<T>): T = getInner(item, item.defaultValueFromContext(context))
 
     /** Wrapper around `getInner` for an `Item` */
-    fun <T : Any> get(item: ConstantItem<T>): T = getInner(item, item.defaultValue)
+    fun <T> get(item: ConstantItem<T>): T = getInner(item, item.defaultValue)
 
     /**
      * Retrieves the value for an [Item] from [SharedPreferences]. It handles method typing via the
@@ -32,11 +33,11 @@
      * `String`, `Boolean`, `Float`, `Int`, `Long`, or `Set<String>`.
      */
     @Suppress("IMPLICIT_CAST_TO_ANY", "UNCHECKED_CAST")
-    private fun <T : Any> getInner(item: Item, default: T): T {
+    private fun <T> getInner(item: Item, default: T): T {
         val sp = context.getSharedPreferences(item.sharedPrefFile, Context.MODE_PRIVATE)
 
-        return when (default::class.java) {
-            String::class.java -> sp.getString(item.sharedPrefKey, default as String)
+        return when (item.type) {
+            String::class.java -> sp.getString(item.sharedPrefKey, default as? String)
             Boolean::class.java,
             java.lang.Boolean::class.java -> sp.getBoolean(item.sharedPrefKey, default as Boolean)
             Int::class.java,
@@ -45,11 +46,10 @@
             java.lang.Float::class.java -> sp.getFloat(item.sharedPrefKey, default as Float)
             Long::class.java,
             java.lang.Long::class.java -> sp.getLong(item.sharedPrefKey, default as Long)
-            Set::class.java -> sp.getStringSet(item.sharedPrefKey, default as Set<String>)
+            Set::class.java -> sp.getStringSet(item.sharedPrefKey, default as? Set<String>)
             else ->
                 throw IllegalArgumentException(
-                    "item type: ${default::class.java}" +
-                        " is not compatible with sharedPref methods"
+                    "item type: ${item.type}" + " is not compatible with sharedPref methods"
                 )
         }
             as T
@@ -224,39 +224,36 @@
             backedUpItem(RestoreDbTask.RESTORED_DEVICE_TYPE, InvariantDeviceProfile.TYPE_PHONE)
         @JvmField val APP_WIDGET_IDS = backedUpItem(RestoreDbTask.APPWIDGET_IDS, "")
         @JvmField val OLD_APP_WIDGET_IDS = backedUpItem(RestoreDbTask.APPWIDGET_OLD_IDS, "")
+        @JvmField val GRID_NAME = ConstantItem("idp_grid_name", true, null, String::class.java)
         @JvmField
         val ALLOW_ROTATION =
-            backedUpItem(RotationHelper.ALLOW_ROTATION_PREFERENCE_KEY) {
+            backedUpItem(RotationHelper.ALLOW_ROTATION_PREFERENCE_KEY, Boolean::class.java) {
                 RotationHelper.getAllowRotationDefaultValue(DisplayController.INSTANCE.get(it).info)
             }
 
         @VisibleForTesting
         @JvmStatic
         fun <T> backedUpItem(sharedPrefKey: String, defaultValue: T): ConstantItem<T> =
-            ConstantItem(sharedPrefKey, LauncherFiles.SHARED_PREFERENCES_KEY, defaultValue)
+            ConstantItem(sharedPrefKey, true, defaultValue)
 
         @JvmStatic
         fun <T> backedUpItem(
             sharedPrefKey: String,
+            type: Class<out T>,
             defaultValueFromContext: (c: Context) -> T
-        ): ContextualItem<T> =
-            ContextualItem(
-                sharedPrefKey,
-                LauncherFiles.SHARED_PREFERENCES_KEY,
-                defaultValueFromContext
-            )
+        ): ContextualItem<T> = ContextualItem(sharedPrefKey, true, defaultValueFromContext, type)
 
         @VisibleForTesting
         @JvmStatic
         fun <T> nonRestorableItem(sharedPrefKey: String, defaultValue: T): ConstantItem<T> =
-            ConstantItem(sharedPrefKey, LauncherFiles.DEVICE_PREFERENCES_KEY, defaultValue)
+            ConstantItem(sharedPrefKey, false, defaultValue)
 
         @Deprecated("Don't use shared preferences directly. Use other LauncherPref methods.")
         @JvmStatic
         fun getPrefs(context: Context): SharedPreferences {
             // Use application context for shared preferences, so we use single cached instance
             return context.applicationContext.getSharedPreferences(
-                LauncherFiles.SHARED_PREFERENCES_KEY,
+                SHARED_PREFERENCES_KEY,
                 Context.MODE_PRIVATE
             )
         }
@@ -266,7 +263,7 @@
         fun getDevicePrefs(context: Context): SharedPreferences {
             // Use application context for shared preferences, so we use a single cached instance
             return context.applicationContext.getSharedPreferences(
-                LauncherFiles.DEVICE_PREFERENCES_KEY,
+                DEVICE_PREFERENCES_KEY,
                 Context.MODE_PRIVATE
             )
         }
@@ -275,21 +272,26 @@
 
 abstract class Item {
     abstract val sharedPrefKey: String
-    abstract val sharedPrefFile: String
+    abstract val isBackedUp: Boolean
+    abstract val type: Class<*>
+    val sharedPrefFile: String = if (isBackedUp) SHARED_PREFERENCES_KEY else DEVICE_PREFERENCES_KEY
 
     fun <T> to(value: T): Pair<Item, T> = Pair(this, value)
 }
 
 data class ConstantItem<T>(
     override val sharedPrefKey: String,
-    override val sharedPrefFile: String,
-    val defaultValue: T
+    override val isBackedUp: Boolean,
+    val defaultValue: T,
+    // The default value can be null. If so, the type needs to be explicitly stated, or else NPE
+    override val type: Class<out T> = defaultValue!!::class.java
 ) : Item()
 
 data class ContextualItem<T>(
     override val sharedPrefKey: String,
-    override val sharedPrefFile: String,
-    private val defaultSupplier: (c: Context) -> T
+    override val isBackedUp: Boolean,
+    private val defaultSupplier: (c: Context) -> T,
+    override val type: Class<out T>
 ) : Item() {
     private var default: T? = null
 
diff --git a/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java b/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java
index dd37bab..7641728 100644
--- a/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java
+++ b/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java
@@ -439,9 +439,11 @@
             return;
         }
 
-        RecyclerView.ItemDecoration decoration = getMainAdapterProvider().getDecorator();
-        getSearchRecyclerView().removeItemDecoration(decoration);
-        getSearchRecyclerView().addItemDecoration(decoration);
+        if (!FeatureFlags.ENABLE_SEARCH_RESULT_BACKGROUND_DRAWABLES.get()) {
+            RecyclerView.ItemDecoration decoration = getMainAdapterProvider().getDecorator();
+            getSearchRecyclerView().removeItemDecoration(decoration);
+            getSearchRecyclerView().addItemDecoration(decoration);
+        }
 
         // replaceAppsRVcontainer() needs to use both mUsingTabs value to remove the old view AND
         // showTabs value to create new view. Hence the mUsingTabs new value assignment MUST happen
diff --git a/src/com/android/launcher3/graphics/SysUiScrim.java b/src/com/android/launcher3/graphics/SysUiScrim.java
index 11e7dc8..e983a30 100644
--- a/src/com/android/launcher3/graphics/SysUiScrim.java
+++ b/src/com/android/launcher3/graphics/SysUiScrim.java
@@ -32,11 +32,10 @@
 import android.util.DisplayMetrics;
 import android.util.FloatProperty;
 import android.view.View;
-import android.view.WindowInsets;
 
 import com.android.launcher3.BaseDraggingActivity;
+import com.android.launcher3.DeviceProfile;
 import com.android.launcher3.R;
-import com.android.launcher3.Utilities;
 import com.android.launcher3.config.FeatureFlags;
 import com.android.launcher3.testing.shared.ResourceUtils;
 import com.android.launcher3.util.DynamicResource;
@@ -185,21 +184,18 @@
 
     /**
      * Determines whether to draw the top and/or bottom scrim based on new insets.
+     *
+     * In order for the bottom scrim to be drawn this 3 condition should be meet at the same time:
+     * the device is in 3 button navigation, the taskbar is not present and the Hotseat is
+     * horizontal
      */
     public void onInsetsChanged(Rect insets) {
+        DeviceProfile dp = mActivity.getDeviceProfile();
         mDrawTopScrim = mTopScrim != null && insets.top > 0;
         mDrawBottomScrim = mBottomMask != null
-                && !mActivity.getDeviceProfile().isVerticalBarLayout()
-                && hasBottomNavButtons();
-    }
-
-    private boolean hasBottomNavButtons() {
-        if (Utilities.ATLEAST_Q && mActivity.getRootView() != null
-                && mActivity.getRootView().getRootWindowInsets() != null) {
-            WindowInsets windowInsets = mActivity.getRootView().getRootWindowInsets();
-            return windowInsets.getTappableElementInsets().bottom > 0;
-        }
-        return true;
+                && !dp.isVerticalBarLayout()
+                && !dp.isGestureMode
+                && !dp.isTaskbarPresent;
     }
 
     @Override
diff --git a/src/com/android/launcher3/popup/ArrowPopup.java b/src/com/android/launcher3/popup/ArrowPopup.java
index 9a745ab..c23ea8a 100644
--- a/src/com/android/launcher3/popup/ArrowPopup.java
+++ b/src/com/android/launcher3/popup/ArrowPopup.java
@@ -21,6 +21,7 @@
 import static com.android.launcher3.anim.Interpolators.ACCELERATED_EASE;
 import static com.android.launcher3.anim.Interpolators.DECELERATED_EASE;
 import static com.android.launcher3.anim.Interpolators.LINEAR;
+import static com.android.launcher3.config.FeatureFlags.ENABLE_MATERIAL_U_POPUP;
 
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
@@ -116,7 +117,7 @@
 
     private final String mIterateChildrenTag;
 
-    private final int[] mColorIds;
+    protected final int[] mColorIds;
 
     public ArrowPopup(Context context, AttributeSet attrs, int defStyleAttr) {
         super(context, attrs, defStyleAttr);
@@ -125,8 +126,8 @@
         mActivityContext = ActivityContext.lookupContext(context);
         mIsRtl = Utilities.isRtl(getResources());
 
-        int backgroundColor = Themes.getAttrColor(context, R.attr.popupColorPrimary);
-        mArrowColor = backgroundColor;
+        int popupPrimaryColor = Themes.getAttrColor(context, R.attr.popupColorPrimary);
+        mArrowColor = popupPrimaryColor;
         mElevation = getResources().getDimension(R.dimen.deep_shortcuts_elevation);
 
         // Initialize arrow view
@@ -143,18 +144,18 @@
 
         int smallerRadius = resources.getDimensionPixelSize(R.dimen.popup_smaller_radius);
         mRoundedTop = new GradientDrawable();
-        mRoundedTop.setColor(backgroundColor);
+        mRoundedTop.setColor(popupPrimaryColor);
         mRoundedTop.setCornerRadii(new float[] { mOutlineRadius, mOutlineRadius, mOutlineRadius,
                 mOutlineRadius, smallerRadius, smallerRadius, smallerRadius, smallerRadius});
 
         mRoundedBottom = new GradientDrawable();
-        mRoundedBottom.setColor(backgroundColor);
+        mRoundedBottom.setColor(popupPrimaryColor);
         mRoundedBottom.setCornerRadii(new float[] { smallerRadius, smallerRadius, smallerRadius,
                 smallerRadius, mOutlineRadius, mOutlineRadius, mOutlineRadius, mOutlineRadius});
 
         mIterateChildrenTag = getContext().getString(R.string.popup_container_iterate_children);
 
-        if (mActivityContext.shouldUseColorExtractionForPopup()) {
+        if (!ENABLE_MATERIAL_U_POPUP.get() && mActivityContext.canUseMultipleShadesForPopup()) {
             mColorIds = new int[]{R.color.popup_shade_first, R.color.popup_shade_second,
                     R.color.popup_shade_third};
         } else {
@@ -241,15 +242,23 @@
                 mlp.bottomMargin = 0;
 
                 if (colors != null) {
-                    backgroundColor = colors[numVisibleChild % colors.length];
+                    if (!ENABLE_MATERIAL_U_POPUP.get()) {
+                        backgroundColor = colors[numVisibleChild % colors.length];
+                    }
+
+                    if (ENABLE_MATERIAL_U_POPUP.get() && isShortcutContainer(view)) {
+                        setChildColor(view, colors[0], colorAnimator);
+                        mArrowColor = colors[0];
+                    }
                 }
 
                 // Arrow color matches the first child or the last child.
-                if (mIsAboveIcon || (numVisibleChild == 0 && viewGroup == this)) {
+                if (!ENABLE_MATERIAL_U_POPUP.get()
+                        && (mIsAboveIcon || (numVisibleChild == 0 && viewGroup == this))) {
                     mArrowColor = backgroundColor;
                 }
 
-                if (view instanceof ViewGroup && mIterateChildrenTag.equals(view.getTag())) {
+                if (view instanceof ViewGroup && isShortcutContainer(view)) {
                     assignMarginsAndBackgrounds((ViewGroup) view, backgroundColor);
                     numVisibleChild++;
                     continue;
@@ -287,6 +296,13 @@
     }
 
     /**
+     * Returns {@code true} if view is a layout container of shortcuts
+     */
+    boolean isShortcutContainer(View view) {
+        return mIterateChildrenTag.equals(view.getTag());
+    }
+
+    /**
      * Sets the background color of the child.
      */
     protected void setChildColor(View view, int color, AnimatorSet animatorSetOut) {
@@ -308,7 +324,7 @@
      */
     protected void reorderAndShow(int viewsToFlip) {
         setupForDisplay();
-        boolean reverseOrder = mIsAboveIcon;
+        boolean reverseOrder = !ENABLE_MATERIAL_U_POPUP.get() && mIsAboveIcon;
         if (reverseOrder) {
             reverseOrder(viewsToFlip);
         }
@@ -634,7 +650,7 @@
         for (int i = group.getChildCount() - 1; i >= 0; --i) {
             View view = group.getChildAt(i);
             if (view.getVisibility() == VISIBLE && view instanceof ViewGroup) {
-                if (mIterateChildrenTag.equals(view.getTag())) {
+                if (isShortcutContainer(view)) {
                     fadeInChildViews((ViewGroup) view, alphaValues, startDelay, duration, out);
                     continue;
                 }
diff --git a/src/com/android/launcher3/popup/PopupContainerWithArrow.java b/src/com/android/launcher3/popup/PopupContainerWithArrow.java
index 4da588e..8fef5c6 100644
--- a/src/com/android/launcher3/popup/PopupContainerWithArrow.java
+++ b/src/com/android/launcher3/popup/PopupContainerWithArrow.java
@@ -17,12 +17,16 @@
 package com.android.launcher3.popup;
 
 import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_SHORTCUTS;
+import static com.android.launcher3.Utilities.ATLEAST_P;
 import static com.android.launcher3.Utilities.squaredHypot;
 import static com.android.launcher3.Utilities.squaredTouchSlop;
+import static com.android.launcher3.config.FeatureFlags.ENABLE_MATERIAL_U_POPUP;
 import static com.android.launcher3.popup.PopupPopulator.MAX_SHORTCUTS;
 import static com.android.launcher3.popup.PopupPopulator.MAX_SHORTCUTS_IF_NOTIFICATIONS;
 import static com.android.launcher3.util.Executors.MODEL_EXECUTOR;
 
+import static java.util.Collections.emptyList;
+
 import android.animation.AnimatorSet;
 import android.animation.LayoutTransition;
 import android.annotation.TargetApi;
@@ -39,6 +43,8 @@
 import android.view.ViewGroup;
 import android.widget.ImageView;
 
+import androidx.annotation.LayoutRes;
+
 import com.android.launcher3.AbstractFloatingView;
 import com.android.launcher3.BaseDraggingActivity;
 import com.android.launcher3.BubbleTextView;
@@ -82,20 +88,20 @@
 public class PopupContainerWithArrow<T extends Context & ActivityContext>
         extends ArrowPopup<T> implements DragSource, DragController.DragListener {
 
-    private final List<DeepShortcutView> mShortcuts = new ArrayList<>();
+    private final List<DeepShortcutView> mDeepShortcuts = new ArrayList<>();
     private final PointF mInterceptTouchDown = new PointF();
 
     private final int mStartDragThreshold;
 
+    private static final int SHORTCUT_COLLAPSE_THRESHOLD = 6;
+
     private BubbleTextView mOriginalIcon;
     private int mNumNotifications;
     private NotificationContainer mNotificationContainer;
     private int mContainerWidth;
 
     private ViewGroup mWidgetContainer;
-
     private ViewGroup mDeepShortcutContainer;
-
     private ViewGroup mSystemShortcutContainer;
 
     protected PopupItemDragHandler mPopupItemDragHandler;
@@ -211,19 +217,27 @@
             return null;
         }
 
-        final PopupContainerWithArrow<Launcher> container =
-                (PopupContainerWithArrow) launcher.getLayoutInflater().inflate(
-                        R.layout.popup_container, launcher.getDragLayer(), false);
-        container.configureForLauncher(launcher);
-
+        PopupContainerWithArrow<Launcher> container;
         PopupDataProvider popupDataProvider = launcher.getPopupDataProvider();
-        container.populateAndShow(icon,
-                popupDataProvider.getShortcutCountForItem(item),
-                popupDataProvider.getNotificationKeysForItem(item),
-                launcher.getSupportedShortcuts()
-                        .map(s -> s.getShortcut(launcher, item, icon))
-                        .filter(Objects::nonNull)
-                        .collect(Collectors.toList()));
+        int deepShortcutCount = popupDataProvider.getShortcutCountForItem(item);
+        List<SystemShortcut> systemShortcuts = launcher.getSupportedShortcuts()
+                .map(s -> s.getShortcut(launcher, item, icon))
+                .filter(Objects::nonNull)
+                .collect(Collectors.toList());
+        if (ENABLE_MATERIAL_U_POPUP.get()) {
+            container = (PopupContainerWithArrow) launcher.getLayoutInflater().inflate(
+                    R.layout.popup_container_material_u, launcher.getDragLayer(), false);
+            container.populateAndShowRowsMaterialU(icon, deepShortcutCount, systemShortcuts);
+        } else {
+            container = (PopupContainerWithArrow) launcher.getLayoutInflater().inflate(
+                    R.layout.popup_container, launcher.getDragLayer(), false);
+            container.populateAndShow(
+                    icon,
+                    deepShortcutCount,
+                    popupDataProvider.getNotificationKeysForItem(item),
+                    systemShortcuts);
+        }
+        container.configureForLauncher(launcher);
         launcher.refreshAndBindWidgetsForPackageUser(PackageUserKey.fromItemInfo(item));
         container.requestFocus();
         return container;
@@ -246,7 +260,7 @@
             initializeSystemShortcut(R.layout.system_shortcut, this, shortcuts.get(0));
             return;
         }
-        mSystemShortcutContainer = inflateAndAdd(R.layout.system_shortcut_icons, this);
+        mSystemShortcutContainer = inflateAndAdd(R.layout.system_shortcut_icons_container, this);
         for (SystemShortcut shortcut : shortcuts) {
             initializeSystemShortcut(
                     R.layout.system_shortcut_icon_only, mSystemShortcutContainer,
@@ -281,17 +295,7 @@
             mDeepShortcutContainer = findViewById(R.id.deep_shortcuts_container);
         }
         if (hasDeepShortcuts) {
-            // Remove the widget shortcut fom the list
-            List<SystemShortcut> systemShortcuts = shortcuts
-                    .stream()
-                    .filter(shortcut -> !(shortcut instanceof SystemShortcut.Widgets))
-                    .collect(Collectors.toList());
-            Optional<SystemShortcut.Widgets> widgetShortcutOpt = shortcuts
-                    .stream()
-                    .filter(shortcut -> shortcut instanceof SystemShortcut.Widgets)
-                    .map(SystemShortcut.Widgets.class::cast)
-                    .findFirst();
-
+            List<SystemShortcut> systemShortcuts = getNonWidgetSystemShortcuts(shortcuts);
             // if there are deep shortcuts, we might want to increase the width of shortcuts to fit
             // horizontally laid out system shortcuts.
             mContainerWidth = Math.max(mContainerWidth,
@@ -304,10 +308,10 @@
             for (int i = shortcutCount; i > 0; i--) {
                 DeepShortcutView v = inflateAndAdd(R.layout.deep_shortcut, mDeepShortcutContainer);
                 v.getLayoutParams().width = mContainerWidth;
-                mShortcuts.add(v);
+                mDeepShortcuts.add(v);
             }
             updateHiddenShortcuts();
-
+            Optional<SystemShortcut.Widgets> widgetShortcutOpt = getWidgetShortcut(shortcuts);
             if (widgetShortcutOpt.isPresent()) {
                 if (mWidgetContainer == null) {
                     mWidgetContainer = inflateAndAdd(R.layout.widget_shortcut_container,
@@ -327,21 +331,151 @@
         }
 
         reorderAndShow(viewsToFlip);
+        showPopupContainer((ItemInfo) originalIcon.getTag(), notificationKeys);
+    }
 
-        ItemInfo originalItemInfo = (ItemInfo) originalIcon.getTag();
-        if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
-            setAccessibilityPaneTitle(getTitleForAccessibility());
+    /**
+     * Populate and show shortcuts for the Launcher U app shortcut design.
+     * Will inflate the container and shortcut View instances for the popup container.
+     * @param originalIcon App icon that the popup is shown for
+     * @param deepShortcutCount Number of DeepShortcutView instances to add to container
+     * @param systemShortcuts List of SystemShortcuts to add to container
+     */
+    public void populateAndShowRowsMaterialU(final BubbleTextView originalIcon,
+            int deepShortcutCount, List<SystemShortcut> systemShortcuts) {
+
+        mOriginalIcon = originalIcon;
+        mContainerWidth = getResources().getDimensionPixelSize(R.dimen.bg_popup_item_width);
+
+        if (deepShortcutCount > 0) {
+            addAllShortcutsMaterialU(deepShortcutCount, systemShortcuts);
+        } else if (!systemShortcuts.isEmpty()) {
+            addSystemShortcutsMaterialU(systemShortcuts,
+                    R.layout.system_shortcut_rows_container_material_u,
+                    R.layout.system_shortcut);
         }
 
-        mOriginalIcon.setForceHideDot(true);
+        // no reversing needed for U design
+        reorderAndShow(0);
+        showPopupContainer((ItemInfo) originalIcon.getTag(), /* notificationKeys= */ emptyList());
+    }
 
+    /**
+     * Animates and loads shortcuts on background thread for this popup container
+     */
+    private void showPopupContainer(ItemInfo originalItemInfo,
+            List<NotificationKeyData> notificationKeys) {
+
+        if (ATLEAST_P) {
+            setAccessibilityPaneTitle(getTitleForAccessibility());
+        }
+        mOriginalIcon.setForceHideDot(true);
         // All views are added. Animate layout from now on.
         setLayoutTransition(new LayoutTransition());
-
         // Load the shortcuts on a background thread and update the container as it animates.
         MODEL_EXECUTOR.getHandler().postAtFrontOfQueue(PopupPopulator.createUpdateRunnable(
                 mActivityContext, originalItemInfo, new Handler(Looper.getMainLooper()),
-                this, mShortcuts, notificationKeys));
+                this, mDeepShortcuts, notificationKeys));
+    }
+
+    /**
+     * Adds any Deep Shortcuts, System Shortcuts and the Widget Shortcut to their respective
+     * containers
+     * @param deepShortcutCount number of DeepShortcutView instances
+     * @param systemShortcuts List of SystemShortcuts
+     */
+    private void addAllShortcutsMaterialU(int deepShortcutCount,
+            List<SystemShortcut> systemShortcuts) {
+
+        if (deepShortcutCount + systemShortcuts.size() <= SHORTCUT_COLLAPSE_THRESHOLD) {
+            // add all system shortcuts including widgets shortcut to same container
+            addSystemShortcutsMaterialU(systemShortcuts,
+                    R.layout.system_shortcut_rows_container_material_u,
+                    R.layout.system_shortcut);
+            addDeepShortcutsMaterialU(deepShortcutCount);
+            return;
+        }
+
+        List<SystemShortcut> nonWidgetSystemShortcuts =
+                getNonWidgetSystemShortcuts(systemShortcuts);
+        // If total shortcuts over threshold, collapse system shortcuts to single row
+        addSystemShortcutsMaterialU(nonWidgetSystemShortcuts,
+                R.layout.system_shortcut_icons_container_material_u,
+                R.layout.system_shortcut_icon_only);
+        // May need to recalculate row width
+        mContainerWidth = Math.max(mContainerWidth,
+                nonWidgetSystemShortcuts.size() * getResources()
+                        .getDimensionPixelSize(R.dimen.system_shortcut_header_icon_touch_size));
+        // Add widget shortcut to separate container
+        Optional<SystemShortcut.Widgets> widgetShortcutOpt = getWidgetShortcut(systemShortcuts);
+        if (widgetShortcutOpt.isPresent()) {
+            mWidgetContainer = inflateAndAdd(R.layout.widget_shortcut_container_material_u,
+                    this);
+            initializeWidgetShortcut(mWidgetContainer, widgetShortcutOpt.get());
+        }
+        addDeepShortcutsMaterialU(deepShortcutCount);
+    }
+
+    /**
+     * Finds the first instance of the Widgets Shortcut from the SystemShortcut List
+     * @param systemShortcuts List of SystemShortcut instances to search
+     * @return Optional Widgets SystemShortcut
+     */
+    private static Optional<SystemShortcut.Widgets> getWidgetShortcut(
+            List<SystemShortcut> systemShortcuts) {
+        return systemShortcuts
+                .stream()
+                .filter(shortcut -> shortcut instanceof SystemShortcut.Widgets)
+                .map(SystemShortcut.Widgets.class::cast)
+                .findFirst();
+    }
+
+    /**
+     * Returns list of [systemShortcuts] without the Widgets shortcut instance if found
+     * @param systemShortcuts list of SystemShortcuts to filter from
+     * @return systemShortcuts without the Widgets Shortcut
+     */
+    private static List<SystemShortcut> getNonWidgetSystemShortcuts(
+            List<SystemShortcut> systemShortcuts) {
+
+        return systemShortcuts
+                .stream()
+                .filter(shortcut -> !(shortcut instanceof SystemShortcut.Widgets))
+                .collect(Collectors.toList());
+    }
+
+    /**
+     * Inflates the given systemShortcutContainerLayout as a container, and populates with
+     * the systemShortcuts as views using the systemShortcutLayout
+     * @param systemShortcuts List of SystemShortcut to inflate as Views
+     * @param systemShortcutContainerLayout Layout Resource for the Container of shortcut Views
+     * @param systemShortcutLayout Layout Resource for the individual shortcut Views
+     */
+    private void addSystemShortcutsMaterialU(List<SystemShortcut> systemShortcuts,
+            @LayoutRes int systemShortcutContainerLayout, @LayoutRes int systemShortcutLayout) {
+
+        if (systemShortcuts.size() == 0) {
+            return;
+        }
+        mSystemShortcutContainer = inflateAndAdd(systemShortcutContainerLayout, this);
+        for (SystemShortcut shortcut : systemShortcuts) {
+            initializeSystemShortcut(systemShortcutLayout, mSystemShortcutContainer, shortcut);
+        }
+    }
+
+    /**
+     * Inflates and adds [deepShortcutCount] number of DeepShortcutView for the  to a new container
+     * @param deepShortcutCount number of DeepShortcutView instances to add
+     */
+    private void addDeepShortcutsMaterialU(int deepShortcutCount) {
+        mDeepShortcutContainer = inflateAndAdd(R.layout.deep_shortcut_container, this);
+        for (int i = deepShortcutCount; i > 0; i--) {
+            DeepShortcutView v = inflateAndAdd(R.layout.deep_shortcut_material_u,
+                    mDeepShortcutContainer);
+            v.getLayoutParams().width = mContainerWidth;
+            mDeepShortcuts.add(v);
+        }
+        updateHiddenShortcuts();
     }
 
     protected NotificationContainer getNotificationContainer() {
@@ -391,9 +525,9 @@
         int allowedCount = mNotificationContainer != null
                 ? MAX_SHORTCUTS_IF_NOTIFICATIONS : MAX_SHORTCUTS;
 
-        int total = mShortcuts.size();
+        int total = mDeepShortcuts.size();
         for (int i = 0; i < total; i++) {
-            DeepShortcutView view = mShortcuts.get(i);
+            DeepShortcutView view = mDeepShortcuts.get(i);
             view.setVisibility(i >= allowedCount ? GONE : VISIBLE);
         }
     }
diff --git a/src/com/android/launcher3/popup/PopupDataProvider.java b/src/com/android/launcher3/popup/PopupDataProvider.java
index 69c96ff..44e3dd6 100644
--- a/src/com/android/launcher3/popup/PopupDataProvider.java
+++ b/src/com/android/launcher3/popup/PopupDataProvider.java
@@ -242,7 +242,7 @@
     public WidgetsListContentEntry getSelectedAppWidgets(PackageUserKey packageUserKey) {
         return (WidgetsListContentEntry) mAllWidgets.stream()
                 .filter(row -> row instanceof WidgetsListContentEntry
-                        && row.mPkgItem.packageName.equals(packageUserKey.mPackageName))
+                        && PackageUserKey.fromPackageItemInfo(row.mPkgItem).equals(packageUserKey))
                 .findAny()
                 .orElse(null);
     }
diff --git a/src/com/android/launcher3/secondarydisplay/SecondaryDragLayer.java b/src/com/android/launcher3/secondarydisplay/SecondaryDragLayer.java
index c8455b8..2ffe34f 100644
--- a/src/com/android/launcher3/secondarydisplay/SecondaryDragLayer.java
+++ b/src/com/android/launcher3/secondarydisplay/SecondaryDragLayer.java
@@ -18,6 +18,7 @@
 import static android.view.View.MeasureSpec.EXACTLY;
 import static android.view.View.MeasureSpec.makeMeasureSpec;
 
+import static com.android.launcher3.config.FeatureFlags.ENABLE_MATERIAL_U_POPUP;
 import static com.android.launcher3.popup.SystemShortcut.APP_INFO;
 
 import android.content.Context;
@@ -203,14 +204,22 @@
             systemShortcuts.add(mPinnedAppsAdapter.getSystemShortcut(item, v));
         }
         systemShortcuts.add(APP_INFO.getShortcut(mActivity, item, v));
-
-        final PopupContainerWithArrow container =
-                (PopupContainerWithArrow) mActivity.getLayoutInflater().inflate(
-                        R.layout.popup_container, mActivity.getDragLayer(), false);
-
-        container.populateAndShow((BubbleTextView) v,
-                popupDataProvider.getShortcutCountForItem(item),
-                Collections.emptyList(), systemShortcuts);
+        int deepShortcutCount = popupDataProvider.getShortcutCountForItem(item);
+        final PopupContainerWithArrow<SecondaryDisplayLauncher> container;
+        if (ENABLE_MATERIAL_U_POPUP.get()) {
+            container = (PopupContainerWithArrow) mActivity.getLayoutInflater().inflate(
+                    R.layout.popup_container_material_u, mActivity.getDragLayer(), false);
+            container.populateAndShowRowsMaterialU((BubbleTextView) v, deepShortcutCount,
+                    systemShortcuts);
+        } else {
+            container = (PopupContainerWithArrow) mActivity.getLayoutInflater().inflate(
+                    R.layout.popup_container, mActivity.getDragLayer(), false);
+            container.populateAndShow(
+                    (BubbleTextView) v,
+                    deepShortcutCount,
+                    Collections.emptyList(),
+                    systemShortcuts);
+        }
         container.requestFocus();
 
         if (!FeatureFlags.SECONDARY_DRAG_N_DROP_TO_PIN.get() || !mActivity.isAppDrawerShown()) {
diff --git a/src/com/android/launcher3/views/ActivityContext.java b/src/com/android/launcher3/views/ActivityContext.java
index 2ab4601..f7837f5 100644
--- a/src/com/android/launcher3/views/ActivityContext.java
+++ b/src/com/android/launcher3/views/ActivityContext.java
@@ -199,9 +199,9 @@
     }
 
     /**
-     * Returns {@code true} if popups should use color extraction.
+     * Returns {@code true} if popups can use a range of color shades instead of a singular color.
      */
-    default boolean shouldUseColorExtractionForPopup() {
+    default boolean canUseMultipleShadesForPopup() {
         return true;
     }
 
diff --git a/src/com/android/launcher3/views/OptionsPopupView.java b/src/com/android/launcher3/views/OptionsPopupView.java
index 5b57e22..315cbad 100644
--- a/src/com/android/launcher3/views/OptionsPopupView.java
+++ b/src/com/android/launcher3/views/OptionsPopupView.java
@@ -15,12 +15,16 @@
  */
 package com.android.launcher3.views;
 
+import static androidx.core.content.ContextCompat.getColorStateList;
+
+import static com.android.launcher3.config.FeatureFlags.ENABLE_MATERIAL_U_POPUP;
 import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.IGNORE;
 import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_SETTINGS_BUTTON_TAP_OR_LONGPRESS;
 import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_WIDGETSTRAY_BUTTON_TAP_OR_LONGPRESS;
 
 import android.content.Context;
 import android.content.Intent;
+import android.graphics.Color;
 import android.graphics.Rect;
 import android.graphics.RectF;
 import android.graphics.drawable.Drawable;
@@ -31,6 +35,7 @@
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.view.View.OnLongClickListener;
+import android.view.ViewGroup;
 import android.widget.Toast;
 
 import androidx.annotation.Nullable;
@@ -139,6 +144,16 @@
         mTargetRect.roundOut(outPos);
     }
 
+    @Override
+    public void assignMarginsAndBackgrounds(ViewGroup viewGroup) {
+        if (ENABLE_MATERIAL_U_POPUP.get()) {
+            assignMarginsAndBackgrounds(viewGroup,
+                    getColorStateList(getContext(), mColorIds[0]).getDefaultColor());
+        } else {
+            assignMarginsAndBackgrounds(viewGroup, Color.TRANSPARENT);
+        }
+    }
+
     public static OptionsPopupView show(ActivityContext launcher, RectF targetRect,
             List<OptionItem> items, boolean shouldAddArrow) {
         return show(launcher, targetRect, items, shouldAddArrow, 0 /* width */);
diff --git a/src/com/android/launcher3/widget/picker/WidgetsListSearchHeaderHolder.java b/src/com/android/launcher3/widget/picker/WidgetsListSearchHeaderHolder.java
deleted file mode 100644
index 9562af3..0000000
--- a/src/com/android/launcher3/widget/picker/WidgetsListSearchHeaderHolder.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.launcher3.widget.picker;
-
-import androidx.recyclerview.widget.RecyclerView.ViewHolder;
-
-/**
- * A {@link ViewHolder} for {@link WidgetsListHeader} of an app, which renders the app icon, the app
- * name, label and a button for showing / hiding widgets.
- */
-public final class WidgetsListSearchHeaderHolder extends ViewHolder {
-    final WidgetsListHeader mWidgetsListHeader;
-
-    public WidgetsListSearchHeaderHolder(WidgetsListHeader view) {
-        super(view);
-
-        mWidgetsListHeader = view;
-    }
-}
diff --git a/tests/src/com/android/launcher3/AbstractDeviceProfileTest.kt b/tests/src/com/android/launcher3/AbstractDeviceProfileTest.kt
index dcc669b..0fe8bee 100644
--- a/tests/src/com/android/launcher3/AbstractDeviceProfileTest.kt
+++ b/tests/src/com/android/launcher3/AbstractDeviceProfileTest.kt
@@ -93,6 +93,24 @@
                     gesturePx = 0,
                     cutoutPx = 0
                 ),
+            "twopanel-phone" to
+                DeviceSpec(
+                    Pair(1080, 2092),
+                    densityDpi = 420,
+                    statusBarNaturalPx = 133,
+                    statusBarRotatedPx = 110,
+                    gesturePx = 63,
+                    cutoutPx = 133
+                ),
+            "twopanel-tablet" to
+                DeviceSpec(
+                    Pair(2208, 1840),
+                    densityDpi = 420,
+                    statusBarNaturalPx = 110,
+                    statusBarRotatedPx = 133,
+                    gesturePx = 0,
+                    cutoutPx = 0
+                )
         )
 
     protected fun initializeVarsForPhone(
diff --git a/tests/src/com/android/launcher3/LauncherPrefsTest.kt b/tests/src/com/android/launcher3/LauncherPrefsTest.kt
index 31e8d30..d40a7bc 100644
--- a/tests/src/com/android/launcher3/LauncherPrefsTest.kt
+++ b/tests/src/com/android/launcher3/LauncherPrefsTest.kt
@@ -13,7 +13,7 @@
 private val TEST_BOOLEAN_ITEM = LauncherPrefs.nonRestorableItem("1", false)
 private val TEST_STRING_ITEM = LauncherPrefs.nonRestorableItem("2", "( ͡❛ ͜ʖ ͡❛)")
 private val TEST_INT_ITEM = LauncherPrefs.nonRestorableItem("3", -1)
-private val TEST_CONTEXTUAL_ITEM = LauncherPrefs.backedUpItem("4") { true }
+private val TEST_CONTEXTUAL_ITEM = ContextualItem("4", true, { true }, Boolean::class.java)
 
 @SmallTest
 @RunWith(AndroidJUnit4::class)
diff --git a/tests/src/com/android/launcher3/nonquickstep/DeviceProfileDumpTest.kt b/tests/src/com/android/launcher3/nonquickstep/DeviceProfileDumpTest.kt
new file mode 100644
index 0000000..d981267
--- /dev/null
+++ b/tests/src/com/android/launcher3/nonquickstep/DeviceProfileDumpTest.kt
@@ -0,0 +1,1626 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.launcher3.nonquickstep
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.android.launcher3.AbstractDeviceProfileTest
+import com.android.launcher3.DeviceProfile
+import com.android.launcher3.InvariantDeviceProfile
+import com.google.common.truth.Truth.assertThat
+import java.io.PrintWriter
+import java.io.StringWriter
+import org.junit.Test
+import org.junit.runner.RunWith
+
+/** Tests for DeviceProfile. */
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class DeviceProfileDumpTest : AbstractDeviceProfileTest() {
+
+    @Test
+    fun phonePortrait3Button() {
+        initializeVarsForPhone(deviceSpecs["phone"]!!, isGestureMode = false)
+        val dp = getDeviceProfileForGrid("5_by_5")
+
+        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:false\n" +
+                    "\tinv.numRows: 5\n" +
+                    "\tinv.numColumns: 5\n" +
+                    "\tinv.numSearchContainerColumns: 5\n" +
+                    "\tminCellSize: PointF(0.0, 0.0)dp\n" +
+                    "\tcellWidthPx: 165.0px (62.857143dp)\n" +
+                    "\tcellHeightPx: 235.0px (89.52381dp)\n" +
+                    "\tgetCellSize().x: 207.0px (78.85714dp)\n" +
+                    "\tgetCellSize().y: 379.0px (144.38095dp)\n" +
+                    "\tcellLayoutBorderSpacePx Horizontal: 0.0px (0.0dp)\n" +
+                    "\tcellLayoutBorderSpacePx Vertical: 0.0px (0.0dp)\n" +
+                    "\tcellLayoutPaddingPx.left: 21.0px (8.0dp)\n" +
+                    "\tcellLayoutPaddingPx.top: 28.0px (10.666667dp)\n" +
+                    "\tcellLayoutPaddingPx.right: 21.0px (8.0dp)\n" +
+                    "\tcellLayoutPaddingPx.bottom: 28.0px (10.666667dp)\n" +
+                    "\ticonSizePx: 147.0px (56.0dp)\n" +
+                    "\ticonTextSizePx: 38.0px (14.476191dp)\n" +
+                    "\ticonDrawablePaddingPx: 18.0px (6.857143dp)\n" +
+                    "\tfolderCellWidthPx: 195.0px (74.28571dp)\n" +
+                    "\tfolderCellHeightPx: 230.0px (87.61905dp)\n" +
+                    "\tfolderChildIconSizePx: 147.0px (56.0dp)\n" +
+                    "\tfolderChildTextSizePx: 38.0px (14.476191dp)\n" +
+                    "\tfolderChildDrawablePaddingPx: 10.0px (3.8095238dp)\n" +
+                    "\tfolderCellLayoutBorderSpacePx: 0.0px (0.0dp)\n" +
+                    "\tfolderContentPaddingLeftRight: 21.0px (8.0dp)\n" +
+                    "\tfolderTopPadding: 63.0px (24.0dp)\n" +
+                    "\tfolderFooterHeight: 147.0px (56.0dp)\n" +
+                    "\tbottomSheetTopPadding: 146.0px (55.61905dp)\n" +
+                    "\tbottomSheetOpenDuration: 267\n" +
+                    "\tbottomSheetCloseDuration: 267\n" +
+                    "\tbottomSheetWorkspaceScale: 1.0\n" +
+                    "\tbottomSheetDepth: 0.0\n" +
+                    "\tallAppsShiftRange: 788.0px (300.1905dp)\n" +
+                    "\tallAppsTopPadding: 0.0px (0.0dp)\n" +
+                    "\tallAppsOpenDuration: 600\n" +
+                    "\tallAppsCloseDuration: 300\n" +
+                    "\tallAppsIconSizePx: 147.0px (56.0dp)\n" +
+                    "\tallAppsIconTextSizePx: 38.0px (14.476191dp)\n" +
+                    "\tallAppsIconDrawablePaddingPx: 21.0px (8.0dp)\n" +
+                    "\tallAppsCellHeightPx: 315.0px (120.0dp)\n" +
+                    "\tallAppsCellWidthPx: 189.0px (72.0dp)\n" +
+                    "\tallAppsBorderSpacePxX: 42.0px (16.0dp)\n" +
+                    "\tallAppsBorderSpacePxY: 42.0px (16.0dp)\n" +
+                    "\tnumShownAllAppsColumns: 5\n" +
+                    "\tallAppsLeftRightPadding: 21.0px (8.0dp)\n" +
+                    "\tallAppsLeftRightMargin: 0.0px (0.0dp)\n" +
+                    "\thotseatBarSizePx: 294.0px (112.0dp)\n" +
+                    "\tinv.hotseatColumnSpan: 5\n" +
+                    "\thotseatCellHeightPx: 166.0px (63.238094dp)\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: 0.0px (0.0dp)\n" +
+                    "\thotseatQsbHeight: 0.0px (0.0dp)\n" +
+                    "\tspringLoadedHotseatBarTopMarginPx: 200.0px (76.190475dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).top: 0.0px (0.0dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).bottom: 128.0px (48.761906dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).left: 21.0px (8.0dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).right: 21.0px (8.0dp)\n" +
+                    "\tnumShownHotseatIcons: 5\n" +
+                    "\thotseatBorderSpace: 0.0px (0.0dp)\n" +
+                    "\tisQsbInline: false\n" +
+                    "\thotseatQsbWidth: 0.0px (0.0dp)\n" +
+                    "\tisTaskbarPresent:false\n" +
+                    "\tisTaskbarPresentInApps:false\n" +
+                    "\ttaskbarSize: 0.0px (0.0dp)\n" +
+                    "\tdesiredWorkspaceHorizontalMarginPx: 21.0px (8.0dp)\n" +
+                    "\tworkspacePadding.left: 0.0px (0.0dp)\n" +
+                    "\tworkspacePadding.top: 0.0px (0.0dp)\n" +
+                    "\tworkspacePadding.right: 0.0px (0.0dp)\n" +
+                    "\tworkspacePadding.bottom: 203.0px (77.333336dp)\n" +
+                    "\ticonScale: 1.0px (0.3809524dp)\n" +
+                    "\tcellScaleToFit : 1.0px (0.3809524dp)\n" +
+                    "\textraSpace: 722.0px (275.0476dp)\n" +
+                    "\tunscaled extraSpace: 722.0px (275.0476dp)\n" +
+                    "\tmaxEmptySpace: 0.0px (0.0dp)\n" +
+                    "\tworkspaceTopPadding: 0.0px (0.0dp)\n" +
+                    "\tworkspaceBottomPadding: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskMarginPx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskIconSizePx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskIconDrawableSizePx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskIconDrawableSizeGridPx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskThumbnailTopMarginPx: 0.0px (0.0dp)\n" +
+                    "\toverviewActionsTopMarginPx: 0.0px (0.0dp)\n" +
+                    "\toverviewActionsHeight: 0.0px (0.0dp)\n" +
+                    "\toverviewActionsClaimedSpaceBelow: 126.0px (48.0dp)\n" +
+                    "\toverviewActionsButtonSpacing: 0.0px (0.0dp)\n" +
+                    "\toverviewPageSpacing: 0.0px (0.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(): 1906.0px (726.0952dp)\n" +
+                    "\tworkspaceSpringLoadedMinNextPageVisiblePx: 63.0px (24.0dp)\n" +
+                    "\tgetWorkspaceSpringLoadScale(): 0.77572966px (0.29551607dp)\n" +
+                    "\tgetCellLayoutHeight(): 1953.0px (744.0dp)\n" +
+                    "\tgetCellLayoutWidth(): 1080.0px (411.42856dp)\n"
+            )
+    }
+
+    @Test
+    fun phonePortrait() {
+        initializeVarsForPhone(deviceSpecs["phone"]!!)
+        val dp = getDeviceProfileForGrid("5_by_5")
+
+        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:false\n" +
+                    "\tinv.numRows: 5\n" +
+                    "\tinv.numColumns: 5\n" +
+                    "\tinv.numSearchContainerColumns: 5\n" +
+                    "\tminCellSize: PointF(0.0, 0.0)dp\n" +
+                    "\tcellWidthPx: 165.0px (62.857143dp)\n" +
+                    "\tcellHeightPx: 235.0px (89.52381dp)\n" +
+                    "\tgetCellSize().x: 207.0px (78.85714dp)\n" +
+                    "\tgetCellSize().y: 383.0px (145.90475dp)\n" +
+                    "\tcellLayoutBorderSpacePx Horizontal: 0.0px (0.0dp)\n" +
+                    "\tcellLayoutBorderSpacePx Vertical: 0.0px (0.0dp)\n" +
+                    "\tcellLayoutPaddingPx.left: 21.0px (8.0dp)\n" +
+                    "\tcellLayoutPaddingPx.top: 28.0px (10.666667dp)\n" +
+                    "\tcellLayoutPaddingPx.right: 21.0px (8.0dp)\n" +
+                    "\tcellLayoutPaddingPx.bottom: 28.0px (10.666667dp)\n" +
+                    "\ticonSizePx: 147.0px (56.0dp)\n" +
+                    "\ticonTextSizePx: 38.0px (14.476191dp)\n" +
+                    "\ticonDrawablePaddingPx: 18.0px (6.857143dp)\n" +
+                    "\tfolderCellWidthPx: 195.0px (74.28571dp)\n" +
+                    "\tfolderCellHeightPx: 230.0px (87.61905dp)\n" +
+                    "\tfolderChildIconSizePx: 147.0px (56.0dp)\n" +
+                    "\tfolderChildTextSizePx: 38.0px (14.476191dp)\n" +
+                    "\tfolderChildDrawablePaddingPx: 10.0px (3.8095238dp)\n" +
+                    "\tfolderCellLayoutBorderSpacePx: 0.0px (0.0dp)\n" +
+                    "\tfolderContentPaddingLeftRight: 21.0px (8.0dp)\n" +
+                    "\tfolderTopPadding: 63.0px (24.0dp)\n" +
+                    "\tfolderFooterHeight: 147.0px (56.0dp)\n" +
+                    "\tbottomSheetTopPadding: 146.0px (55.61905dp)\n" +
+                    "\tbottomSheetOpenDuration: 267\n" +
+                    "\tbottomSheetCloseDuration: 267\n" +
+                    "\tbottomSheetWorkspaceScale: 1.0\n" +
+                    "\tbottomSheetDepth: 0.0\n" +
+                    "\tallAppsShiftRange: 788.0px (300.1905dp)\n" +
+                    "\tallAppsTopPadding: 0.0px (0.0dp)\n" +
+                    "\tallAppsOpenDuration: 600\n" +
+                    "\tallAppsCloseDuration: 300\n" +
+                    "\tallAppsIconSizePx: 147.0px (56.0dp)\n" +
+                    "\tallAppsIconTextSizePx: 38.0px (14.476191dp)\n" +
+                    "\tallAppsIconDrawablePaddingPx: 21.0px (8.0dp)\n" +
+                    "\tallAppsCellHeightPx: 315.0px (120.0dp)\n" +
+                    "\tallAppsCellWidthPx: 189.0px (72.0dp)\n" +
+                    "\tallAppsBorderSpacePxX: 42.0px (16.0dp)\n" +
+                    "\tallAppsBorderSpacePxY: 42.0px (16.0dp)\n" +
+                    "\tnumShownAllAppsColumns: 5\n" +
+                    "\tallAppsLeftRightPadding: 21.0px (8.0dp)\n" +
+                    "\tallAppsLeftRightMargin: 0.0px (0.0dp)\n" +
+                    "\thotseatBarSizePx: 273.0px (104.0dp)\n" +
+                    "\tinv.hotseatColumnSpan: 5\n" +
+                    "\thotseatCellHeightPx: 166.0px (63.238094dp)\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: 0.0px (0.0dp)\n" +
+                    "\thotseatQsbHeight: 0.0px (0.0dp)\n" +
+                    "\tspringLoadedHotseatBarTopMarginPx: 200.0px (76.190475dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).top: 0.0px (0.0dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).bottom: 107.0px (40.761906dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).left: 21.0px (8.0dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).right: 21.0px (8.0dp)\n" +
+                    "\tnumShownHotseatIcons: 5\n" +
+                    "\thotseatBorderSpace: 0.0px (0.0dp)\n" +
+                    "\tisQsbInline: false\n" +
+                    "\thotseatQsbWidth: 0.0px (0.0dp)\n" +
+                    "\tisTaskbarPresent:false\n" +
+                    "\tisTaskbarPresentInApps:false\n" +
+                    "\ttaskbarSize: 0.0px (0.0dp)\n" +
+                    "\tdesiredWorkspaceHorizontalMarginPx: 21.0px (8.0dp)\n" +
+                    "\tworkspacePadding.left: 0.0px (0.0dp)\n" +
+                    "\tworkspacePadding.top: 0.0px (0.0dp)\n" +
+                    "\tworkspacePadding.right: 0.0px (0.0dp)\n" +
+                    "\tworkspacePadding.bottom: 245.0px (93.333336dp)\n" +
+                    "\ticonScale: 1.0px (0.3809524dp)\n" +
+                    "\tcellScaleToFit : 1.0px (0.3809524dp)\n" +
+                    "\textraSpace: 743.0px (283.0476dp)\n" +
+                    "\tunscaled extraSpace: 743.0px (283.0476dp)\n" +
+                    "\tmaxEmptySpace: 0.0px (0.0dp)\n" +
+                    "\tworkspaceTopPadding: 0.0px (0.0dp)\n" +
+                    "\tworkspaceBottomPadding: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskMarginPx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskIconSizePx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskIconDrawableSizePx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskIconDrawableSizeGridPx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskThumbnailTopMarginPx: 0.0px (0.0dp)\n" +
+                    "\toverviewActionsTopMarginPx: 0.0px (0.0dp)\n" +
+                    "\toverviewActionsHeight: 0.0px (0.0dp)\n" +
+                    "\toverviewActionsClaimedSpaceBelow: 63.0px (24.0dp)\n" +
+                    "\toverviewActionsButtonSpacing: 0.0px (0.0dp)\n" +
+                    "\toverviewPageSpacing: 0.0px (0.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(): 1927.0px (734.0952dp)\n" +
+                    "\tworkspaceSpringLoadedMinNextPageVisiblePx: 63.0px (24.0dp)\n" +
+                    "\tgetWorkspaceSpringLoadScale(): 0.7781155px (0.29642496dp)\n" +
+                    "\tgetCellLayoutHeight(): 1974.0px (752.0dp)\n" +
+                    "\tgetCellLayoutWidth(): 1080.0px (411.42856dp)\n"
+            )
+    }
+
+    @Test
+    fun phoneVerticalBar3Button() {
+        initializeVarsForPhone(deviceSpecs["phone"]!!, isVerticalBar = true, isGestureMode = false)
+        val dp = getDeviceProfileForGrid("5_by_5")
+
+        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: 5\n" +
+                    "\tinv.numSearchContainerColumns: 5\n" +
+                    "\tminCellSize: PointF(0.0, 0.0)dp\n" +
+                    "\tcellWidthPx: 158.0px (60.190475dp)\n" +
+                    "\tcellHeightPx: 166.0px (63.238094dp)\n" +
+                    "\tgetCellSize().x: 368.0px (140.19048dp)\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: 147.0px (56.0dp)\n" +
+                    "\ticonTextSizePx: 0.0px (0.0dp)\n" +
+                    "\ticonDrawablePaddingPx: 0.0px (0.0dp)\n" +
+                    "\tfolderCellWidthPx: 142.0px (54.095238dp)\n" +
+                    "\tfolderCellHeightPx: 168.0px (64.0dp)\n" +
+                    "\tfolderChildIconSizePx: 108.0px (41.142857dp)\n" +
+                    "\tfolderChildTextSizePx: 28.0px (10.666667dp)\n" +
+                    "\tfolderChildDrawablePaddingPx: 7.0px (2.6666667dp)\n" +
+                    "\tfolderCellLayoutBorderSpacePx: 0.0px (0.0dp)\n" +
+                    "\tfolderContentPaddingLeftRight: 21.0px (8.0dp)\n" +
+                    "\tfolderTopPadding: 63.0px (24.0dp)\n" +
+                    "\tfolderFooterHeight: 147.0px (56.0dp)\n" +
+                    "\tbottomSheetTopPadding: 114.0px (43.42857dp)\n" +
+                    "\tbottomSheetOpenDuration: 267\n" +
+                    "\tbottomSheetCloseDuration: 267\n" +
+                    "\tbottomSheetWorkspaceScale: 1.0\n" +
+                    "\tbottomSheetDepth: 0.0\n" +
+                    "\tallAppsShiftRange: 788.0px (300.1905dp)\n" +
+                    "\tallAppsTopPadding: 0.0px (0.0dp)\n" +
+                    "\tallAppsOpenDuration: 600\n" +
+                    "\tallAppsCloseDuration: 300\n" +
+                    "\tallAppsIconSizePx: 147.0px (56.0dp)\n" +
+                    "\tallAppsIconTextSizePx: 38.0px (14.476191dp)\n" +
+                    "\tallAppsIconDrawablePaddingPx: 21.0px (8.0dp)\n" +
+                    "\tallAppsCellHeightPx: 321.0px (122.28571dp)\n" +
+                    "\tallAppsCellWidthPx: 189.0px (72.0dp)\n" +
+                    "\tallAppsBorderSpacePxX: 42.0px (16.0dp)\n" +
+                    "\tallAppsBorderSpacePxY: 42.0px (16.0dp)\n" +
+                    "\tnumShownAllAppsColumns: 5\n" +
+                    "\tallAppsLeftRightPadding: 0.0px (0.0dp)\n" +
+                    "\tallAppsLeftRightMargin: 0.0px (0.0dp)\n" +
+                    "\thotseatBarSizePx: 252.0px (96.0dp)\n" +
+                    "\tinv.hotseatColumnSpan: 5\n" +
+                    "\thotseatCellHeightPx: 166.0px (63.238094dp)\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: 0.0px (0.0dp)\n" +
+                    "\thotseatQsbHeight: 0.0px (0.0dp)\n" +
+                    "\tspringLoadedHotseatBarTopMarginPx: 118.0px (44.95238dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).top: 64.0px (24.380953dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).bottom: 49.0px (18.666666dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).left: 42.0px (16.0dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).right: 189.0px (72.0dp)\n" +
+                    "\tnumShownHotseatIcons: 5\n" +
+                    "\thotseatBorderSpace: 0.0px (0.0dp)\n" +
+                    "\tisQsbInline: false\n" +
+                    "\thotseatQsbWidth: 0.0px (0.0dp)\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: 199.0px (75.809525dp)\n" +
+                    "\tworkspacePadding.bottom: 0.0px (0.0dp)\n" +
+                    "\ticonScale: 1.0px (0.3809524dp)\n" +
+                    "\tcellScaleToFit : 1.0px (0.3809524dp)\n" +
+                    "\textraSpace: 136.0px (51.809525dp)\n" +
+                    "\tunscaled extraSpace: 136.0px (51.809525dp)\n" +
+                    "\tmaxEmptySpace: 0.0px (0.0dp)\n" +
+                    "\tworkspaceTopPadding: 0.0px (0.0dp)\n" +
+                    "\tworkspaceBottomPadding: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskMarginPx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskIconSizePx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskIconDrawableSizePx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskIconDrawableSizeGridPx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskThumbnailTopMarginPx: 0.0px (0.0dp)\n" +
+                    "\toverviewActionsTopMarginPx: 0.0px (0.0dp)\n" +
+                    "\toverviewActionsHeight: 0.0px (0.0dp)\n" +
+                    "\toverviewActionsClaimedSpaceBelow: 0.0px (0.0dp)\n" +
+                    "\toverviewActionsButtonSpacing: 0.0px (0.0dp)\n" +
+                    "\toverviewPageSpacing: 0.0px (0.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(): 1008.0px (384.0dp)\n" +
+                    "\tworkspaceSpringLoadedMinNextPageVisiblePx: 63.0px (24.0dp)\n" +
+                    "\tgetWorkspaceSpringLoadScale(): 0.8021869px (0.305595dp)\n" +
+                    "\tgetCellLayoutHeight(): 1006.0px (383.2381dp)\n" +
+                    "\tgetCellLayoutWidth(): 1947.0px (741.7143dp)\n"
+            )
+    }
+
+    @Test
+    fun phoneVerticalBar() {
+        initializeVarsForPhone(deviceSpecs["phone"]!!, isVerticalBar = true)
+        val dp = getDeviceProfileForGrid("5_by_5")
+
+        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: 5\n" +
+                    "\tinv.numSearchContainerColumns: 5\n" +
+                    "\tminCellSize: PointF(0.0, 0.0)dp\n" +
+                    "\tcellWidthPx: 158.0px (60.190475dp)\n" +
+                    "\tcellHeightPx: 166.0px (63.238094dp)\n" +
+                    "\tgetCellSize().x: 393.0px (149.71428dp)\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: 147.0px (56.0dp)\n" +
+                    "\ticonTextSizePx: 0.0px (0.0dp)\n" +
+                    "\ticonDrawablePaddingPx: 0.0px (0.0dp)\n" +
+                    "\tfolderCellWidthPx: 128.0px (48.761906dp)\n" +
+                    "\tfolderCellHeightPx: 152.0px (57.904762dp)\n" +
+                    "\tfolderChildIconSizePx: 98.0px (37.333332dp)\n" +
+                    "\tfolderChildTextSizePx: 25.0px (9.523809dp)\n" +
+                    "\tfolderChildDrawablePaddingPx: 6.0px (2.2857144dp)\n" +
+                    "\tfolderCellLayoutBorderSpacePx: 0.0px (0.0dp)\n" +
+                    "\tfolderContentPaddingLeftRight: 21.0px (8.0dp)\n" +
+                    "\tfolderTopPadding: 63.0px (24.0dp)\n" +
+                    "\tfolderFooterHeight: 147.0px (56.0dp)\n" +
+                    "\tbottomSheetTopPadding: 114.0px (43.42857dp)\n" +
+                    "\tbottomSheetOpenDuration: 267\n" +
+                    "\tbottomSheetCloseDuration: 267\n" +
+                    "\tbottomSheetWorkspaceScale: 1.0\n" +
+                    "\tbottomSheetDepth: 0.0\n" +
+                    "\tallAppsShiftRange: 788.0px (300.1905dp)\n" +
+                    "\tallAppsTopPadding: 0.0px (0.0dp)\n" +
+                    "\tallAppsOpenDuration: 600\n" +
+                    "\tallAppsCloseDuration: 300\n" +
+                    "\tallAppsIconSizePx: 147.0px (56.0dp)\n" +
+                    "\tallAppsIconTextSizePx: 38.0px (14.476191dp)\n" +
+                    "\tallAppsIconDrawablePaddingPx: 21.0px (8.0dp)\n" +
+                    "\tallAppsCellHeightPx: 321.0px (122.28571dp)\n" +
+                    "\tallAppsCellWidthPx: 189.0px (72.0dp)\n" +
+                    "\tallAppsBorderSpacePxX: 42.0px (16.0dp)\n" +
+                    "\tallAppsBorderSpacePxY: 42.0px (16.0dp)\n" +
+                    "\tnumShownAllAppsColumns: 5\n" +
+                    "\tallAppsLeftRightPadding: 0.0px (0.0dp)\n" +
+                    "\tallAppsLeftRightMargin: 0.0px (0.0dp)\n" +
+                    "\thotseatBarSizePx: 252.0px (96.0dp)\n" +
+                    "\tinv.hotseatColumnSpan: 5\n" +
+                    "\thotseatCellHeightPx: 166.0px (63.238094dp)\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: 0.0px (0.0dp)\n" +
+                    "\thotseatQsbHeight: 0.0px (0.0dp)\n" +
+                    "\tspringLoadedHotseatBarTopMarginPx: 118.0px (44.95238dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).top: 64.0px (24.380953dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).bottom: 112.0px (42.666668dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).left: 42.0px (16.0dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).right: 63.0px (24.0dp)\n" +
+                    "\tnumShownHotseatIcons: 5\n" +
+                    "\thotseatBorderSpace: 0.0px (0.0dp)\n" +
+                    "\tisQsbInline: false\n" +
+                    "\thotseatQsbWidth: 0.0px (0.0dp)\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: 199.0px (75.809525dp)\n" +
+                    "\tworkspacePadding.bottom: 0.0px (0.0dp)\n" +
+                    "\ticonScale: 1.0px (0.3809524dp)\n" +
+                    "\tcellScaleToFit : 1.0px (0.3809524dp)\n" +
+                    "\textraSpace: 73.0px (27.809525dp)\n" +
+                    "\tunscaled extraSpace: 73.0px (27.809525dp)\n" +
+                    "\tmaxEmptySpace: 0.0px (0.0dp)\n" +
+                    "\tworkspaceTopPadding: 0.0px (0.0dp)\n" +
+                    "\tworkspaceBottomPadding: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskMarginPx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskIconSizePx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskIconDrawableSizePx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskIconDrawableSizeGridPx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskThumbnailTopMarginPx: 0.0px (0.0dp)\n" +
+                    "\toverviewActionsTopMarginPx: 0.0px (0.0dp)\n" +
+                    "\toverviewActionsHeight: 0.0px (0.0dp)\n" +
+                    "\toverviewActionsClaimedSpaceBelow: 63.0px (24.0dp)\n" +
+                    "\toverviewActionsButtonSpacing: 0.0px (0.0dp)\n" +
+                    "\toverviewPageSpacing: 0.0px (0.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(): 952.0px (362.66666dp)\n" +
+                    "\tworkspaceSpringLoadedMinNextPageVisiblePx: 63.0px (24.0dp)\n" +
+                    "\tgetWorkspaceSpringLoadScale(): 0.79639447px (0.30338836dp)\n" +
+                    "\tgetCellLayoutHeight(): 943.0px (359.2381dp)\n" +
+                    "\tgetCellLayoutWidth(): 2073.0px (789.7143dp)\n"
+            )
+    }
+
+    @Test
+    fun tabletLandscape3Button() {
+        initializeVarsForTablet(deviceSpecs["tablet"]!!, isLandscape = true, isGestureMode = false)
+        val dp = getDeviceProfileForGrid("6_by_5")
+        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: 25.0px (12.5dp)\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: 397.0px (198.5dp)\n" +
+                    "\tfolderCellHeightPx: 371.0px (185.5dp)\n" +
+                    "\tfolderChildIconSizePx: 99.0px (49.5dp)\n" +
+                    "\tfolderChildTextSizePx: 23.0px (11.5dp)\n" +
+                    "\tfolderChildDrawablePaddingPx: 80.0px (40.0dp)\n" +
+                    "\tfolderCellLayoutBorderSpacePx: 0.0px (0.0dp)\n" +
+                    "\tfolderContentPaddingLeftRight: 0.0px (0.0dp)\n" +
+                    "\tfolderTopPadding: 48.0px (24.0dp)\n" +
+                    "\tfolderFooterHeight: 0.0px (0.0dp)\n" +
+                    "\tbottomSheetTopPadding: 104.0px (52.0dp)\n" +
+                    "\tbottomSheetOpenDuration: 500\n" +
+                    "\tbottomSheetCloseDuration: 500\n" +
+                    "\tbottomSheetWorkspaceScale: 0.97\n" +
+                    "\tbottomSheetDepth: 0.0\n" +
+                    "\tallAppsShiftRange: 1496.0px (748.0dp)\n" +
+                    "\tallAppsTopPadding: 104.0px (52.0dp)\n" +
+                    "\tallAppsOpenDuration: 500\n" +
+                    "\tallAppsCloseDuration: 500\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: 32.0px (16.0dp)\n" +
+                    "\tallAppsLeftRightMargin: 412.0px (206.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: 0.0px (0.0dp)\n" +
+                    "\thotseatQsbHeight: 0.0px (0.0dp)\n" +
+                    "\tspringLoadedHotseatBarTopMarginPx: 128.0px (64.0dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).top: 0.0px (0.0dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).bottom: 65.0px (32.5dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).left: 668.0px (334.0dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).right: 668.0px (334.0dp)\n" +
+                    "\tnumShownHotseatIcons: 6\n" +
+                    "\thotseatBorderSpace: 100.0px (50.0dp)\n" +
+                    "\tisQsbInline: false\n" +
+                    "\thotseatQsbWidth: 1224.0px (612.0dp)\n" +
+                    "\tisTaskbarPresent:false\n" +
+                    "\tisTaskbarPresentInApps:true\n" +
+                    "\ttaskbarSize: 0.0px (0.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: 244.0px (122.0dp)\n" +
+                    "\ticonScale: 1.0px (0.5dp)\n" +
+                    "\tcellScaleToFit : 1.0px (0.5dp)\n" +
+                    "\textraSpace: 80.0px (40.0dp)\n" +
+                    "\tunscaled extraSpace: 80.0px (40.0dp)\n" +
+                    "\tmaxEmptySpace: 200.0px (100.0dp)\n" +
+                    "\tworkspaceTopPadding: 25.0px (12.5dp)\n" +
+                    "\tworkspaceBottomPadding: 55.0px (27.5dp)\n" +
+                    "\toverviewTaskMarginPx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskIconSizePx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskIconDrawableSizePx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskIconDrawableSizeGridPx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskThumbnailTopMarginPx: 0.0px (0.0dp)\n" +
+                    "\toverviewActionsTopMarginPx: 0.0px (0.0dp)\n" +
+                    "\toverviewActionsHeight: 0.0px (0.0dp)\n" +
+                    "\toverviewActionsClaimedSpaceBelow: 0.0px (0.0dp)\n" +
+                    "\toverviewActionsButtonSpacing: 0.0px (0.0dp)\n" +
+                    "\toverviewPageSpacing: 0.0px (0.0dp)\n" +
+                    "\toverviewRowSpacing: 0.0px (0.0dp)\n" +
+                    "\toverviewGridSideMargin: 0.0px (0.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.76677316px (0.38338658dp)\n" +
+                    "\tgetCellLayoutHeight(): 1252.0px (626.0dp)\n" +
+                    "\tgetCellLayoutWidth(): 2198.0px (1099.0dp)\n"
+            )
+    }
+
+    @Test
+    fun tabletLandscape() {
+        initializeVarsForTablet(deviceSpecs["tablet"]!!, isLandscape = true)
+        val dp = getDeviceProfileForGrid("6_by_5")
+        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: 25.0px (12.5dp)\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: 397.0px (198.5dp)\n" +
+                    "\tfolderCellHeightPx: 371.0px (185.5dp)\n" +
+                    "\tfolderChildIconSizePx: 99.0px (49.5dp)\n" +
+                    "\tfolderChildTextSizePx: 23.0px (11.5dp)\n" +
+                    "\tfolderChildDrawablePaddingPx: 80.0px (40.0dp)\n" +
+                    "\tfolderCellLayoutBorderSpacePx: 0.0px (0.0dp)\n" +
+                    "\tfolderContentPaddingLeftRight: 0.0px (0.0dp)\n" +
+                    "\tfolderTopPadding: 48.0px (24.0dp)\n" +
+                    "\tfolderFooterHeight: 0.0px (0.0dp)\n" +
+                    "\tbottomSheetTopPadding: 104.0px (52.0dp)\n" +
+                    "\tbottomSheetOpenDuration: 500\n" +
+                    "\tbottomSheetCloseDuration: 500\n" +
+                    "\tbottomSheetWorkspaceScale: 0.97\n" +
+                    "\tbottomSheetDepth: 0.0\n" +
+                    "\tallAppsShiftRange: 1496.0px (748.0dp)\n" +
+                    "\tallAppsTopPadding: 104.0px (52.0dp)\n" +
+                    "\tallAppsOpenDuration: 500\n" +
+                    "\tallAppsCloseDuration: 500\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: 32.0px (16.0dp)\n" +
+                    "\tallAppsLeftRightMargin: 412.0px (206.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: 0.0px (0.0dp)\n" +
+                    "\thotseatQsbHeight: 0.0px (0.0dp)\n" +
+                    "\tspringLoadedHotseatBarTopMarginPx: 128.0px (64.0dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).top: 0.0px (0.0dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).bottom: 65.0px (32.5dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).left: 668.0px (334.0dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).right: 668.0px (334.0dp)\n" +
+                    "\tnumShownHotseatIcons: 6\n" +
+                    "\thotseatBorderSpace: 100.0px (50.0dp)\n" +
+                    "\tisQsbInline: false\n" +
+                    "\thotseatQsbWidth: 1224.0px (612.0dp)\n" +
+                    "\tisTaskbarPresent:false\n" +
+                    "\tisTaskbarPresentInApps:true\n" +
+                    "\ttaskbarSize: 0.0px (0.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: 244.0px (122.0dp)\n" +
+                    "\ticonScale: 1.0px (0.5dp)\n" +
+                    "\tcellScaleToFit : 1.0px (0.5dp)\n" +
+                    "\textraSpace: 80.0px (40.0dp)\n" +
+                    "\tunscaled extraSpace: 80.0px (40.0dp)\n" +
+                    "\tmaxEmptySpace: 200.0px (100.0dp)\n" +
+                    "\tworkspaceTopPadding: 25.0px (12.5dp)\n" +
+                    "\tworkspaceBottomPadding: 55.0px (27.5dp)\n" +
+                    "\toverviewTaskMarginPx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskIconSizePx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskIconDrawableSizePx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskIconDrawableSizeGridPx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskThumbnailTopMarginPx: 0.0px (0.0dp)\n" +
+                    "\toverviewActionsTopMarginPx: 0.0px (0.0dp)\n" +
+                    "\toverviewActionsHeight: 0.0px (0.0dp)\n" +
+                    "\toverviewActionsClaimedSpaceBelow: 0.0px (0.0dp)\n" +
+                    "\toverviewActionsButtonSpacing: 0.0px (0.0dp)\n" +
+                    "\toverviewPageSpacing: 0.0px (0.0dp)\n" +
+                    "\toverviewRowSpacing: 0.0px (0.0dp)\n" +
+                    "\toverviewGridSideMargin: 0.0px (0.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.76677316px (0.38338658dp)\n" +
+                    "\tgetCellLayoutHeight(): 1252.0px (626.0dp)\n" +
+                    "\tgetCellLayoutWidth(): 2198.0px (1099.0dp)\n"
+            )
+    }
+
+    @Test
+    fun tabletPortrait3Button() {
+        initializeVarsForTablet(deviceSpecs["tablet"]!!, isGestureMode = false)
+        val dp = getDeviceProfileForGrid("6_by_5")
+        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: 408.0px (204.0dp)\n" +
+                    "\tfolderCellHeightPx: 648.0px (324.0dp)\n" +
+                    "\tfolderChildIconSizePx: 120.0px (60.0dp)\n" +
+                    "\tfolderChildTextSizePx: 28.0px (14.0dp)\n" +
+                    "\tfolderChildDrawablePaddingPx: 163.0px (81.5dp)\n" +
+                    "\tfolderCellLayoutBorderSpacePx: 0.0px (0.0dp)\n" +
+                    "\tfolderContentPaddingLeftRight: 0.0px (0.0dp)\n" +
+                    "\tfolderTopPadding: 48.0px (24.0dp)\n" +
+                    "\tfolderFooterHeight: 0.0px (0.0dp)\n" +
+                    "\tbottomSheetTopPadding: 704.0px (352.0dp)\n" +
+                    "\tbottomSheetOpenDuration: 500\n" +
+                    "\tbottomSheetCloseDuration: 500\n" +
+                    "\tbottomSheetWorkspaceScale: 0.97\n" +
+                    "\tbottomSheetDepth: 0.0\n" +
+                    "\tallAppsShiftRange: 1810.0px (905.0dp)\n" +
+                    "\tallAppsTopPadding: 750.0px (375.0dp)\n" +
+                    "\tallAppsOpenDuration: 500\n" +
+                    "\tallAppsCloseDuration: 500\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: 32.0px (16.0dp)\n" +
+                    "\tallAppsLeftRightMargin: 152.0px (76.0dp)\n" +
+                    "\thotseatBarSizePx: 272.0px (136.0dp)\n" +
+                    "\tinv.hotseatColumnSpan: 6\n" +
+                    "\thotseatCellHeightPx: 135.0px (67.5dp)\n" +
+                    "\thotseatBarBottomSpacePx: 152.0px (76.0dp)\n" +
+                    "\thotseatBarSidePaddingStartPx: 0.0px (0.0dp)\n" +
+                    "\thotseatBarSidePaddingEndPx: 0.0px (0.0dp)\n" +
+                    "\thotseatBarEndOffset: 0.0px (0.0dp)\n" +
+                    "\thotseatQsbSpace: 0.0px (0.0dp)\n" +
+                    "\thotseatQsbHeight: 0.0px (0.0dp)\n" +
+                    "\tspringLoadedHotseatBarTopMarginPx: 216.0px (108.0dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).top: 0.0px (0.0dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).bottom: 137.0px (68.5dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).left: 150.0px (75.0dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).right: 150.0px (75.0dp)\n" +
+                    "\tnumShownHotseatIcons: 6\n" +
+                    "\thotseatBorderSpace: 116.0px (58.0dp)\n" +
+                    "\tisQsbInline: false\n" +
+                    "\thotseatQsbWidth: 1300.0px (650.0dp)\n" +
+                    "\tisTaskbarPresent:false\n" +
+                    "\tisTaskbarPresentInApps:true\n" +
+                    "\ttaskbarSize: 0.0px (0.0dp)\n" +
+                    "\tdesiredWorkspaceHorizontalMarginPx: 108.0px (54.0dp)\n" +
+                    "\tworkspacePadding.left: 36.0px (18.0dp)\n" +
+                    "\tworkspacePadding.top: 132.0px (66.0dp)\n" +
+                    "\tworkspacePadding.right: 36.0px (18.0dp)\n" +
+                    "\tworkspacePadding.bottom: 468.0px (234.0dp)\n" +
+                    "\ticonScale: 1.0px (0.5dp)\n" +
+                    "\tcellScaleToFit : 1.0px (0.5dp)\n" +
+                    "\textraSpace: 424.0px (212.0dp)\n" +
+                    "\tunscaled extraSpace: 424.0px (212.0dp)\n" +
+                    "\tmaxEmptySpace: 19998.0px (9999.0dp)\n" +
+                    "\tworkspaceTopPadding: 204.0px (102.0dp)\n" +
+                    "\tworkspaceBottomPadding: 220.0px (110.0dp)\n" +
+                    "\toverviewTaskMarginPx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskIconSizePx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskIconDrawableSizePx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskIconDrawableSizeGridPx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskThumbnailTopMarginPx: 0.0px (0.0dp)\n" +
+                    "\toverviewActionsTopMarginPx: 0.0px (0.0dp)\n" +
+                    "\toverviewActionsHeight: 0.0px (0.0dp)\n" +
+                    "\toverviewActionsClaimedSpaceBelow: 0.0px (0.0dp)\n" +
+                    "\toverviewActionsButtonSpacing: 0.0px (0.0dp)\n" +
+                    "\toverviewPageSpacing: 0.0px (0.0dp)\n" +
+                    "\toverviewRowSpacing: 0.0px (0.0dp)\n" +
+                    "\toverviewGridSideMargin: 0.0px (0.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(): 2072.0px (1036.0dp)\n" +
+                    "\tworkspaceSpringLoadedMinNextPageVisiblePx: 48.0px (24.0dp)\n" +
+                    "\tgetWorkspaceSpringLoadScale(): 0.8125px (0.40625dp)\n" +
+                    "\tgetCellLayoutHeight(): 1856.0px (928.0dp)\n" +
+                    "\tgetCellLayoutWidth(): 1528.0px (764.0dp)\n"
+            )
+    }
+
+    @Test
+    fun tabletPortrait() {
+        initializeVarsForTablet(deviceSpecs["tablet"]!!)
+        val dp = getDeviceProfileForGrid("6_by_5")
+        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: 408.0px (204.0dp)\n" +
+                    "\tfolderCellHeightPx: 648.0px (324.0dp)\n" +
+                    "\tfolderChildIconSizePx: 120.0px (60.0dp)\n" +
+                    "\tfolderChildTextSizePx: 28.0px (14.0dp)\n" +
+                    "\tfolderChildDrawablePaddingPx: 163.0px (81.5dp)\n" +
+                    "\tfolderCellLayoutBorderSpacePx: 0.0px (0.0dp)\n" +
+                    "\tfolderContentPaddingLeftRight: 0.0px (0.0dp)\n" +
+                    "\tfolderTopPadding: 48.0px (24.0dp)\n" +
+                    "\tfolderFooterHeight: 0.0px (0.0dp)\n" +
+                    "\tbottomSheetTopPadding: 704.0px (352.0dp)\n" +
+                    "\tbottomSheetOpenDuration: 500\n" +
+                    "\tbottomSheetCloseDuration: 500\n" +
+                    "\tbottomSheetWorkspaceScale: 0.97\n" +
+                    "\tbottomSheetDepth: 0.0\n" +
+                    "\tallAppsShiftRange: 1810.0px (905.0dp)\n" +
+                    "\tallAppsTopPadding: 750.0px (375.0dp)\n" +
+                    "\tallAppsOpenDuration: 500\n" +
+                    "\tallAppsCloseDuration: 500\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: 32.0px (16.0dp)\n" +
+                    "\tallAppsLeftRightMargin: 152.0px (76.0dp)\n" +
+                    "\thotseatBarSizePx: 272.0px (136.0dp)\n" +
+                    "\tinv.hotseatColumnSpan: 6\n" +
+                    "\thotseatCellHeightPx: 135.0px (67.5dp)\n" +
+                    "\thotseatBarBottomSpacePx: 152.0px (76.0dp)\n" +
+                    "\thotseatBarSidePaddingStartPx: 0.0px (0.0dp)\n" +
+                    "\thotseatBarSidePaddingEndPx: 0.0px (0.0dp)\n" +
+                    "\thotseatBarEndOffset: 0.0px (0.0dp)\n" +
+                    "\thotseatQsbSpace: 0.0px (0.0dp)\n" +
+                    "\thotseatQsbHeight: 0.0px (0.0dp)\n" +
+                    "\tspringLoadedHotseatBarTopMarginPx: 216.0px (108.0dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).top: 0.0px (0.0dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).bottom: 137.0px (68.5dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).left: 150.0px (75.0dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).right: 150.0px (75.0dp)\n" +
+                    "\tnumShownHotseatIcons: 6\n" +
+                    "\thotseatBorderSpace: 116.0px (58.0dp)\n" +
+                    "\tisQsbInline: false\n" +
+                    "\thotseatQsbWidth: 1300.0px (650.0dp)\n" +
+                    "\tisTaskbarPresent:false\n" +
+                    "\tisTaskbarPresentInApps:true\n" +
+                    "\ttaskbarSize: 0.0px (0.0dp)\n" +
+                    "\tdesiredWorkspaceHorizontalMarginPx: 108.0px (54.0dp)\n" +
+                    "\tworkspacePadding.left: 36.0px (18.0dp)\n" +
+                    "\tworkspacePadding.top: 132.0px (66.0dp)\n" +
+                    "\tworkspacePadding.right: 36.0px (18.0dp)\n" +
+                    "\tworkspacePadding.bottom: 468.0px (234.0dp)\n" +
+                    "\ticonScale: 1.0px (0.5dp)\n" +
+                    "\tcellScaleToFit : 1.0px (0.5dp)\n" +
+                    "\textraSpace: 424.0px (212.0dp)\n" +
+                    "\tunscaled extraSpace: 424.0px (212.0dp)\n" +
+                    "\tmaxEmptySpace: 19998.0px (9999.0dp)\n" +
+                    "\tworkspaceTopPadding: 204.0px (102.0dp)\n" +
+                    "\tworkspaceBottomPadding: 220.0px (110.0dp)\n" +
+                    "\toverviewTaskMarginPx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskIconSizePx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskIconDrawableSizePx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskIconDrawableSizeGridPx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskThumbnailTopMarginPx: 0.0px (0.0dp)\n" +
+                    "\toverviewActionsTopMarginPx: 0.0px (0.0dp)\n" +
+                    "\toverviewActionsHeight: 0.0px (0.0dp)\n" +
+                    "\toverviewActionsClaimedSpaceBelow: 0.0px (0.0dp)\n" +
+                    "\toverviewActionsButtonSpacing: 0.0px (0.0dp)\n" +
+                    "\toverviewPageSpacing: 0.0px (0.0dp)\n" +
+                    "\toverviewRowSpacing: 0.0px (0.0dp)\n" +
+                    "\toverviewGridSideMargin: 0.0px (0.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(): 2072.0px (1036.0dp)\n" +
+                    "\tworkspaceSpringLoadedMinNextPageVisiblePx: 48.0px (24.0dp)\n" +
+                    "\tgetWorkspaceSpringLoadScale(): 0.8125px (0.40625dp)\n" +
+                    "\tgetCellLayoutHeight(): 1856.0px (928.0dp)\n" +
+                    "\tgetCellLayoutWidth(): 1528.0px (764.0dp)\n"
+            )
+    }
+
+    @Test
+    fun twoPanelLandscape3Button() {
+        initializeVarsForTwoPanel(
+            deviceSpecs["twopanel-tablet"]!!,
+            deviceSpecs["twopanel-phone"]!!,
+            isLandscape = true,
+            isGestureMode = false
+        )
+        val dp = getDeviceProfileForGrid("4_by_4")
+        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:false\n" +
+                    "\tinv.numRows: 4\n" +
+                    "\tinv.numColumns: 4\n" +
+                    "\tinv.numSearchContainerColumns: 4\n" +
+                    "\tminCellSize: PointF(0.0, 0.0)dp\n" +
+                    "\tcellWidthPx: 159.0px (60.57143dp)\n" +
+                    "\tcellHeightPx: 223.0px (84.95238dp)\n" +
+                    "\tgetCellSize().x: 270.0px (102.85714dp)\n" +
+                    "\tgetCellSize().y: 342.0px (130.28572dp)\n" +
+                    "\tcellLayoutBorderSpacePx Horizontal: 0.0px (0.0dp)\n" +
+                    "\tcellLayoutBorderSpacePx Vertical: 0.0px (0.0dp)\n" +
+                    "\tcellLayoutPaddingPx.left: 0.0px (0.0dp)\n" +
+                    "\tcellLayoutPaddingPx.top: 0.0px (0.0dp)\n" +
+                    "\tcellLayoutPaddingPx.right: 0.0px (0.0dp)\n" +
+                    "\tcellLayoutPaddingPx.bottom: 0.0px (0.0dp)\n" +
+                    "\ticonSizePx: 141.0px (53.714287dp)\n" +
+                    "\ticonTextSizePx: 34.0px (12.952381dp)\n" +
+                    "\ticonDrawablePaddingPx: 18.0px (6.857143dp)\n" +
+                    "\tfolderCellWidthPx: 189.0px (72.0dp)\n" +
+                    "\tfolderCellHeightPx: 219.0px (83.42857dp)\n" +
+                    "\tfolderChildIconSizePx: 141.0px (53.714287dp)\n" +
+                    "\tfolderChildTextSizePx: 34.0px (12.952381dp)\n" +
+                    "\tfolderChildDrawablePaddingPx: 10.0px (3.8095238dp)\n" +
+                    "\tfolderCellLayoutBorderSpacePx: 0.0px (0.0dp)\n" +
+                    "\tfolderContentPaddingLeftRight: 21.0px (8.0dp)\n" +
+                    "\tfolderTopPadding: 63.0px (24.0dp)\n" +
+                    "\tfolderFooterHeight: 147.0px (56.0dp)\n" +
+                    "\tbottomSheetTopPadding: 110.0px (41.904762dp)\n" +
+                    "\tbottomSheetOpenDuration: 500\n" +
+                    "\tbottomSheetCloseDuration: 500\n" +
+                    "\tbottomSheetWorkspaceScale: 0.97\n" +
+                    "\tbottomSheetDepth: 1.0\n" +
+                    "\tallAppsShiftRange: 1730.0px (659.0476dp)\n" +
+                    "\tallAppsTopPadding: 110.0px (41.904762dp)\n" +
+                    "\tallAppsOpenDuration: 500\n" +
+                    "\tallAppsCloseDuration: 500\n" +
+                    "\tallAppsIconSizePx: 141.0px (53.714287dp)\n" +
+                    "\tallAppsIconTextSizePx: 34.0px (12.952381dp)\n" +
+                    "\tallAppsIconDrawablePaddingPx: 21.0px (8.0dp)\n" +
+                    "\tallAppsCellHeightPx: 315.0px (120.0dp)\n" +
+                    "\tallAppsCellWidthPx: 183.0px (69.71429dp)\n" +
+                    "\tallAppsBorderSpacePxX: 42.0px (16.0dp)\n" +
+                    "\tallAppsBorderSpacePxY: 42.0px (16.0dp)\n" +
+                    "\tnumShownAllAppsColumns: 8\n" +
+                    "\tallAppsLeftRightPadding: 42.0px (16.0dp)\n" +
+                    "\tallAppsLeftRightMargin: 183.0px (69.71429dp)\n" +
+                    "\thotseatBarSizePx: 267.0px (101.71429dp)\n" +
+                    "\tinv.hotseatColumnSpan: 4\n" +
+                    "\thotseatCellHeightPx: 159.0px (60.57143dp)\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: 0.0px (0.0dp)\n" +
+                    "\thotseatQsbHeight: 0.0px (0.0dp)\n" +
+                    "\tspringLoadedHotseatBarTopMarginPx: 116.0px (44.190475dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).top: 0.0px (0.0dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).bottom: 108.0px (41.142857dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).left: 113.0px (43.04762dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).right: 113.0px (43.04762dp)\n" +
+                    "\tnumShownHotseatIcons: 6\n" +
+                    "\thotseatBorderSpace: 0.0px (0.0dp)\n" +
+                    "\tisQsbInline: false\n" +
+                    "\thotseatQsbWidth: 0.0px (0.0dp)\n" +
+                    "\tisTaskbarPresent:false\n" +
+                    "\tisTaskbarPresentInApps:true\n" +
+                    "\ttaskbarSize: 0.0px (0.0dp)\n" +
+                    "\tdesiredWorkspaceHorizontalMarginPx: 21.0px (8.0dp)\n" +
+                    "\tworkspacePadding.left: 21.0px (8.0dp)\n" +
+                    "\tworkspacePadding.top: 30.0px (11.428572dp)\n" +
+                    "\tworkspacePadding.right: 21.0px (8.0dp)\n" +
+                    "\tworkspacePadding.bottom: 330.0px (125.71429dp)\n" +
+                    "\ticonScale: 1.0px (0.3809524dp)\n" +
+                    "\tcellScaleToFit : 1.0px (0.3809524dp)\n" +
+                    "\textraSpace: 478.0px (182.09525dp)\n" +
+                    "\tunscaled extraSpace: 478.0px (182.09525dp)\n" +
+                    "\tmaxEmptySpace: 0.0px (0.0dp)\n" +
+                    "\tworkspaceTopPadding: 0.0px (0.0dp)\n" +
+                    "\tworkspaceBottomPadding: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskMarginPx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskIconSizePx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskIconDrawableSizePx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskIconDrawableSizeGridPx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskThumbnailTopMarginPx: 0.0px (0.0dp)\n" +
+                    "\toverviewActionsTopMarginPx: 0.0px (0.0dp)\n" +
+                    "\toverviewActionsHeight: 0.0px (0.0dp)\n" +
+                    "\toverviewActionsClaimedSpaceBelow: 0.0px (0.0dp)\n" +
+                    "\toverviewActionsButtonSpacing: 0.0px (0.0dp)\n" +
+                    "\toverviewPageSpacing: 0.0px (0.0dp)\n" +
+                    "\toverviewRowSpacing: 0.0px (0.0dp)\n" +
+                    "\toverviewGridSideMargin: 0.0px (0.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(): 1457.0px (555.0476dp)\n" +
+                    "\tworkspaceSpringLoadedMinNextPageVisiblePx: 63.0px (24.0dp)\n" +
+                    "\tgetWorkspaceSpringLoadScale(): 0.8452555px (0.32200208dp)\n" +
+                    "\tgetCellLayoutHeight(): 1370.0px (521.9048dp)\n" +
+                    "\tgetCellLayoutWidth(): 1083.0px (412.57144dp)\n"
+            )
+    }
+
+    @Test
+    fun twoPanelLandscape() {
+        initializeVarsForTwoPanel(
+            deviceSpecs["twopanel-tablet"]!!,
+            deviceSpecs["twopanel-phone"]!!,
+            isLandscape = true
+        )
+        val dp = getDeviceProfileForGrid("4_by_4")
+        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:false\n" +
+                    "\tinv.numRows: 4\n" +
+                    "\tinv.numColumns: 4\n" +
+                    "\tinv.numSearchContainerColumns: 4\n" +
+                    "\tminCellSize: PointF(0.0, 0.0)dp\n" +
+                    "\tcellWidthPx: 159.0px (60.57143dp)\n" +
+                    "\tcellHeightPx: 223.0px (84.95238dp)\n" +
+                    "\tgetCellSize().x: 270.0px (102.85714dp)\n" +
+                    "\tgetCellSize().y: 342.0px (130.28572dp)\n" +
+                    "\tcellLayoutBorderSpacePx Horizontal: 0.0px (0.0dp)\n" +
+                    "\tcellLayoutBorderSpacePx Vertical: 0.0px (0.0dp)\n" +
+                    "\tcellLayoutPaddingPx.left: 0.0px (0.0dp)\n" +
+                    "\tcellLayoutPaddingPx.top: 0.0px (0.0dp)\n" +
+                    "\tcellLayoutPaddingPx.right: 0.0px (0.0dp)\n" +
+                    "\tcellLayoutPaddingPx.bottom: 0.0px (0.0dp)\n" +
+                    "\ticonSizePx: 141.0px (53.714287dp)\n" +
+                    "\ticonTextSizePx: 34.0px (12.952381dp)\n" +
+                    "\ticonDrawablePaddingPx: 18.0px (6.857143dp)\n" +
+                    "\tfolderCellWidthPx: 189.0px (72.0dp)\n" +
+                    "\tfolderCellHeightPx: 219.0px (83.42857dp)\n" +
+                    "\tfolderChildIconSizePx: 141.0px (53.714287dp)\n" +
+                    "\tfolderChildTextSizePx: 34.0px (12.952381dp)\n" +
+                    "\tfolderChildDrawablePaddingPx: 10.0px (3.8095238dp)\n" +
+                    "\tfolderCellLayoutBorderSpacePx: 0.0px (0.0dp)\n" +
+                    "\tfolderContentPaddingLeftRight: 21.0px (8.0dp)\n" +
+                    "\tfolderTopPadding: 63.0px (24.0dp)\n" +
+                    "\tfolderFooterHeight: 147.0px (56.0dp)\n" +
+                    "\tbottomSheetTopPadding: 110.0px (41.904762dp)\n" +
+                    "\tbottomSheetOpenDuration: 500\n" +
+                    "\tbottomSheetCloseDuration: 500\n" +
+                    "\tbottomSheetWorkspaceScale: 0.97\n" +
+                    "\tbottomSheetDepth: 1.0\n" +
+                    "\tallAppsShiftRange: 1730.0px (659.0476dp)\n" +
+                    "\tallAppsTopPadding: 110.0px (41.904762dp)\n" +
+                    "\tallAppsOpenDuration: 500\n" +
+                    "\tallAppsCloseDuration: 500\n" +
+                    "\tallAppsIconSizePx: 141.0px (53.714287dp)\n" +
+                    "\tallAppsIconTextSizePx: 34.0px (12.952381dp)\n" +
+                    "\tallAppsIconDrawablePaddingPx: 21.0px (8.0dp)\n" +
+                    "\tallAppsCellHeightPx: 315.0px (120.0dp)\n" +
+                    "\tallAppsCellWidthPx: 183.0px (69.71429dp)\n" +
+                    "\tallAppsBorderSpacePxX: 42.0px (16.0dp)\n" +
+                    "\tallAppsBorderSpacePxY: 42.0px (16.0dp)\n" +
+                    "\tnumShownAllAppsColumns: 8\n" +
+                    "\tallAppsLeftRightPadding: 42.0px (16.0dp)\n" +
+                    "\tallAppsLeftRightMargin: 183.0px (69.71429dp)\n" +
+                    "\thotseatBarSizePx: 267.0px (101.71429dp)\n" +
+                    "\tinv.hotseatColumnSpan: 4\n" +
+                    "\thotseatCellHeightPx: 159.0px (60.57143dp)\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: 0.0px (0.0dp)\n" +
+                    "\thotseatQsbHeight: 0.0px (0.0dp)\n" +
+                    "\tspringLoadedHotseatBarTopMarginPx: 116.0px (44.190475dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).top: 0.0px (0.0dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).bottom: 108.0px (41.142857dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).left: 113.0px (43.04762dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).right: 113.0px (43.04762dp)\n" +
+                    "\tnumShownHotseatIcons: 6\n" +
+                    "\thotseatBorderSpace: 0.0px (0.0dp)\n" +
+                    "\tisQsbInline: false\n" +
+                    "\thotseatQsbWidth: 0.0px (0.0dp)\n" +
+                    "\tisTaskbarPresent:false\n" +
+                    "\tisTaskbarPresentInApps:true\n" +
+                    "\ttaskbarSize: 0.0px (0.0dp)\n" +
+                    "\tdesiredWorkspaceHorizontalMarginPx: 21.0px (8.0dp)\n" +
+                    "\tworkspacePadding.left: 21.0px (8.0dp)\n" +
+                    "\tworkspacePadding.top: 30.0px (11.428572dp)\n" +
+                    "\tworkspacePadding.right: 21.0px (8.0dp)\n" +
+                    "\tworkspacePadding.bottom: 330.0px (125.71429dp)\n" +
+                    "\ticonScale: 1.0px (0.3809524dp)\n" +
+                    "\tcellScaleToFit : 1.0px (0.3809524dp)\n" +
+                    "\textraSpace: 478.0px (182.09525dp)\n" +
+                    "\tunscaled extraSpace: 478.0px (182.09525dp)\n" +
+                    "\tmaxEmptySpace: 0.0px (0.0dp)\n" +
+                    "\tworkspaceTopPadding: 0.0px (0.0dp)\n" +
+                    "\tworkspaceBottomPadding: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskMarginPx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskIconSizePx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskIconDrawableSizePx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskIconDrawableSizeGridPx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskThumbnailTopMarginPx: 0.0px (0.0dp)\n" +
+                    "\toverviewActionsTopMarginPx: 0.0px (0.0dp)\n" +
+                    "\toverviewActionsHeight: 0.0px (0.0dp)\n" +
+                    "\toverviewActionsClaimedSpaceBelow: 0.0px (0.0dp)\n" +
+                    "\toverviewActionsButtonSpacing: 0.0px (0.0dp)\n" +
+                    "\toverviewPageSpacing: 0.0px (0.0dp)\n" +
+                    "\toverviewRowSpacing: 0.0px (0.0dp)\n" +
+                    "\toverviewGridSideMargin: 0.0px (0.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(): 1457.0px (555.0476dp)\n" +
+                    "\tworkspaceSpringLoadedMinNextPageVisiblePx: 63.0px (24.0dp)\n" +
+                    "\tgetWorkspaceSpringLoadScale(): 0.8452555px (0.32200208dp)\n" +
+                    "\tgetCellLayoutHeight(): 1370.0px (521.9048dp)\n" +
+                    "\tgetCellLayoutWidth(): 1083.0px (412.57144dp)\n"
+            )
+    }
+
+    @Test
+    fun twoPanelPortrait3Button() {
+        initializeVarsForTwoPanel(
+            deviceSpecs["twopanel-tablet"]!!,
+            deviceSpecs["twopanel-phone"]!!,
+            isGestureMode = false
+        )
+        val dp = getDeviceProfileForGrid("4_by_4")
+        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: 2075.0px (790.4762dp)\n" +
+                    "\tmInsets.left: 0.0px (0.0dp)\n" +
+                    "\tmInsets.top: 133.0px (50.666668dp)\n" +
+                    "\tmInsets.right: 0.0px (0.0dp)\n" +
+                    "\tmInsets.bottom: 0.0px (0.0dp)\n" +
+                    "\taspectRatio:1.2\n" +
+                    "\tisScalableGrid:false\n" +
+                    "\tinv.numRows: 4\n" +
+                    "\tinv.numColumns: 4\n" +
+                    "\tinv.numSearchContainerColumns: 4\n" +
+                    "\tminCellSize: PointF(0.0, 0.0)dp\n" +
+                    "\tcellWidthPx: 159.0px (60.57143dp)\n" +
+                    "\tcellHeightPx: 223.0px (84.95238dp)\n" +
+                    "\tgetCellSize().x: 224.0px (85.333336dp)\n" +
+                    "\tgetCellSize().y: 430.0px (163.80952dp)\n" +
+                    "\tcellLayoutBorderSpacePx Horizontal: 0.0px (0.0dp)\n" +
+                    "\tcellLayoutBorderSpacePx Vertical: 0.0px (0.0dp)\n" +
+                    "\tcellLayoutPaddingPx.left: 0.0px (0.0dp)\n" +
+                    "\tcellLayoutPaddingPx.top: 0.0px (0.0dp)\n" +
+                    "\tcellLayoutPaddingPx.right: 0.0px (0.0dp)\n" +
+                    "\tcellLayoutPaddingPx.bottom: 0.0px (0.0dp)\n" +
+                    "\ticonSizePx: 141.0px (53.714287dp)\n" +
+                    "\ticonTextSizePx: 34.0px (12.952381dp)\n" +
+                    "\ticonDrawablePaddingPx: 18.0px (6.857143dp)\n" +
+                    "\tfolderCellWidthPx: 189.0px (72.0dp)\n" +
+                    "\tfolderCellHeightPx: 219.0px (83.42857dp)\n" +
+                    "\tfolderChildIconSizePx: 141.0px (53.714287dp)\n" +
+                    "\tfolderChildTextSizePx: 34.0px (12.952381dp)\n" +
+                    "\tfolderChildDrawablePaddingPx: 10.0px (3.8095238dp)\n" +
+                    "\tfolderCellLayoutBorderSpacePx: 0.0px (0.0dp)\n" +
+                    "\tfolderContentPaddingLeftRight: 21.0px (8.0dp)\n" +
+                    "\tfolderTopPadding: 63.0px (24.0dp)\n" +
+                    "\tfolderFooterHeight: 147.0px (56.0dp)\n" +
+                    "\tbottomSheetTopPadding: 133.0px (50.666668dp)\n" +
+                    "\tbottomSheetOpenDuration: 500\n" +
+                    "\tbottomSheetCloseDuration: 500\n" +
+                    "\tbottomSheetWorkspaceScale: 0.97\n" +
+                    "\tbottomSheetDepth: 1.0\n" +
+                    "\tallAppsShiftRange: 1826.0px (695.619dp)\n" +
+                    "\tallAppsTopPadding: 382.0px (145.5238dp)\n" +
+                    "\tallAppsOpenDuration: 500\n" +
+                    "\tallAppsCloseDuration: 500\n" +
+                    "\tallAppsIconSizePx: 141.0px (53.714287dp)\n" +
+                    "\tallAppsIconTextSizePx: 34.0px (12.952381dp)\n" +
+                    "\tallAppsIconDrawablePaddingPx: 21.0px (8.0dp)\n" +
+                    "\tallAppsCellHeightPx: 315.0px (120.0dp)\n" +
+                    "\tallAppsCellWidthPx: 183.0px (69.71429dp)\n" +
+                    "\tallAppsBorderSpacePxX: 42.0px (16.0dp)\n" +
+                    "\tallAppsBorderSpacePxY: 42.0px (16.0dp)\n" +
+                    "\tnumShownAllAppsColumns: 8\n" +
+                    "\tallAppsLeftRightPadding: 42.0px (16.0dp)\n" +
+                    "\tallAppsLeftRightMargin: 1.0px (0.3809524dp)\n" +
+                    "\thotseatBarSizePx: 267.0px (101.71429dp)\n" +
+                    "\tinv.hotseatColumnSpan: 4\n" +
+                    "\thotseatCellHeightPx: 159.0px (60.57143dp)\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: 0.0px (0.0dp)\n" +
+                    "\thotseatQsbHeight: 0.0px (0.0dp)\n" +
+                    "\tspringLoadedHotseatBarTopMarginPx: 171.0px (65.14286dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).top: 0.0px (0.0dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).bottom: 108.0px (41.142857dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).left: 98.0px (37.333332dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).right: 98.0px (37.333332dp)\n" +
+                    "\tnumShownHotseatIcons: 6\n" +
+                    "\thotseatBorderSpace: 0.0px (0.0dp)\n" +
+                    "\tisQsbInline: false\n" +
+                    "\thotseatQsbWidth: 0.0px (0.0dp)\n" +
+                    "\tisTaskbarPresent:false\n" +
+                    "\tisTaskbarPresentInApps:true\n" +
+                    "\ttaskbarSize: 0.0px (0.0dp)\n" +
+                    "\tdesiredWorkspaceHorizontalMarginPx: 21.0px (8.0dp)\n" +
+                    "\tworkspacePadding.left: 21.0px (8.0dp)\n" +
+                    "\tworkspacePadding.top: 24.0px (9.142858dp)\n" +
+                    "\tworkspacePadding.right: 21.0px (8.0dp)\n" +
+                    "\tworkspacePadding.bottom: 330.0px (125.71429dp)\n" +
+                    "\ticonScale: 1.0px (0.3809524dp)\n" +
+                    "\tcellScaleToFit : 1.0px (0.3809524dp)\n" +
+                    "\textraSpace: 829.0px (315.8095dp)\n" +
+                    "\tunscaled extraSpace: 829.0px (315.8095dp)\n" +
+                    "\tmaxEmptySpace: 0.0px (0.0dp)\n" +
+                    "\tworkspaceTopPadding: 0.0px (0.0dp)\n" +
+                    "\tworkspaceBottomPadding: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskMarginPx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskIconSizePx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskIconDrawableSizePx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskIconDrawableSizeGridPx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskThumbnailTopMarginPx: 0.0px (0.0dp)\n" +
+                    "\toverviewActionsTopMarginPx: 0.0px (0.0dp)\n" +
+                    "\toverviewActionsHeight: 0.0px (0.0dp)\n" +
+                    "\toverviewActionsClaimedSpaceBelow: 0.0px (0.0dp)\n" +
+                    "\toverviewActionsButtonSpacing: 0.0px (0.0dp)\n" +
+                    "\toverviewPageSpacing: 0.0px (0.0dp)\n" +
+                    "\toverviewRowSpacing: 0.0px (0.0dp)\n" +
+                    "\toverviewGridSideMargin: 0.0px (0.0dp)\n" +
+                    "\tdropTargetBarTopMarginPx: 168.0px (64.0dp)\n" +
+                    "\tdropTargetBarSizePx: 147.0px (56.0dp)\n" +
+                    "\tdropTargetBarBottomMarginPx: 42.0px (16.0dp)\n" +
+                    "\tgetCellLayoutSpringLoadShrunkTop(): 490.0px (186.66667dp)\n" +
+                    "\tgetCellLayoutSpringLoadShrunkBottom(): 1770.0px (674.2857dp)\n" +
+                    "\tworkspaceSpringLoadedMinNextPageVisiblePx: 63.0px (24.0dp)\n" +
+                    "\tgetWorkspaceSpringLoadScale(): 0.7437536px (0.2833347dp)\n" +
+                    "\tgetCellLayoutHeight(): 1721.0px (655.619dp)\n" +
+                    "\tgetCellLayoutWidth(): 899.0px (342.4762dp)\n"
+            )
+    }
+
+    @Test
+    fun twoPanelPortrait() {
+        initializeVarsForTwoPanel(deviceSpecs["twopanel-tablet"]!!, deviceSpecs["twopanel-phone"]!!)
+        val dp = getDeviceProfileForGrid("4_by_4")
+        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: 2075.0px (790.4762dp)\n" +
+                    "\tmInsets.left: 0.0px (0.0dp)\n" +
+                    "\tmInsets.top: 133.0px (50.666668dp)\n" +
+                    "\tmInsets.right: 0.0px (0.0dp)\n" +
+                    "\tmInsets.bottom: 0.0px (0.0dp)\n" +
+                    "\taspectRatio:1.2\n" +
+                    "\tisScalableGrid:false\n" +
+                    "\tinv.numRows: 4\n" +
+                    "\tinv.numColumns: 4\n" +
+                    "\tinv.numSearchContainerColumns: 4\n" +
+                    "\tminCellSize: PointF(0.0, 0.0)dp\n" +
+                    "\tcellWidthPx: 159.0px (60.57143dp)\n" +
+                    "\tcellHeightPx: 223.0px (84.95238dp)\n" +
+                    "\tgetCellSize().x: 224.0px (85.333336dp)\n" +
+                    "\tgetCellSize().y: 430.0px (163.80952dp)\n" +
+                    "\tcellLayoutBorderSpacePx Horizontal: 0.0px (0.0dp)\n" +
+                    "\tcellLayoutBorderSpacePx Vertical: 0.0px (0.0dp)\n" +
+                    "\tcellLayoutPaddingPx.left: 0.0px (0.0dp)\n" +
+                    "\tcellLayoutPaddingPx.top: 0.0px (0.0dp)\n" +
+                    "\tcellLayoutPaddingPx.right: 0.0px (0.0dp)\n" +
+                    "\tcellLayoutPaddingPx.bottom: 0.0px (0.0dp)\n" +
+                    "\ticonSizePx: 141.0px (53.714287dp)\n" +
+                    "\ticonTextSizePx: 34.0px (12.952381dp)\n" +
+                    "\ticonDrawablePaddingPx: 18.0px (6.857143dp)\n" +
+                    "\tfolderCellWidthPx: 189.0px (72.0dp)\n" +
+                    "\tfolderCellHeightPx: 219.0px (83.42857dp)\n" +
+                    "\tfolderChildIconSizePx: 141.0px (53.714287dp)\n" +
+                    "\tfolderChildTextSizePx: 34.0px (12.952381dp)\n" +
+                    "\tfolderChildDrawablePaddingPx: 10.0px (3.8095238dp)\n" +
+                    "\tfolderCellLayoutBorderSpacePx: 0.0px (0.0dp)\n" +
+                    "\tfolderContentPaddingLeftRight: 21.0px (8.0dp)\n" +
+                    "\tfolderTopPadding: 63.0px (24.0dp)\n" +
+                    "\tfolderFooterHeight: 147.0px (56.0dp)\n" +
+                    "\tbottomSheetTopPadding: 133.0px (50.666668dp)\n" +
+                    "\tbottomSheetOpenDuration: 500\n" +
+                    "\tbottomSheetCloseDuration: 500\n" +
+                    "\tbottomSheetWorkspaceScale: 0.97\n" +
+                    "\tbottomSheetDepth: 1.0\n" +
+                    "\tallAppsShiftRange: 1826.0px (695.619dp)\n" +
+                    "\tallAppsTopPadding: 382.0px (145.5238dp)\n" +
+                    "\tallAppsOpenDuration: 500\n" +
+                    "\tallAppsCloseDuration: 500\n" +
+                    "\tallAppsIconSizePx: 141.0px (53.714287dp)\n" +
+                    "\tallAppsIconTextSizePx: 34.0px (12.952381dp)\n" +
+                    "\tallAppsIconDrawablePaddingPx: 21.0px (8.0dp)\n" +
+                    "\tallAppsCellHeightPx: 315.0px (120.0dp)\n" +
+                    "\tallAppsCellWidthPx: 183.0px (69.71429dp)\n" +
+                    "\tallAppsBorderSpacePxX: 42.0px (16.0dp)\n" +
+                    "\tallAppsBorderSpacePxY: 42.0px (16.0dp)\n" +
+                    "\tnumShownAllAppsColumns: 8\n" +
+                    "\tallAppsLeftRightPadding: 42.0px (16.0dp)\n" +
+                    "\tallAppsLeftRightMargin: 1.0px (0.3809524dp)\n" +
+                    "\thotseatBarSizePx: 267.0px (101.71429dp)\n" +
+                    "\tinv.hotseatColumnSpan: 4\n" +
+                    "\thotseatCellHeightPx: 159.0px (60.57143dp)\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: 0.0px (0.0dp)\n" +
+                    "\thotseatQsbHeight: 0.0px (0.0dp)\n" +
+                    "\tspringLoadedHotseatBarTopMarginPx: 171.0px (65.14286dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).top: 0.0px (0.0dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).bottom: 108.0px (41.142857dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).left: 98.0px (37.333332dp)\n" +
+                    "\tgetHotseatLayoutPadding(context).right: 98.0px (37.333332dp)\n" +
+                    "\tnumShownHotseatIcons: 6\n" +
+                    "\thotseatBorderSpace: 0.0px (0.0dp)\n" +
+                    "\tisQsbInline: false\n" +
+                    "\thotseatQsbWidth: 0.0px (0.0dp)\n" +
+                    "\tisTaskbarPresent:false\n" +
+                    "\tisTaskbarPresentInApps:true\n" +
+                    "\ttaskbarSize: 0.0px (0.0dp)\n" +
+                    "\tdesiredWorkspaceHorizontalMarginPx: 21.0px (8.0dp)\n" +
+                    "\tworkspacePadding.left: 21.0px (8.0dp)\n" +
+                    "\tworkspacePadding.top: 24.0px (9.142858dp)\n" +
+                    "\tworkspacePadding.right: 21.0px (8.0dp)\n" +
+                    "\tworkspacePadding.bottom: 330.0px (125.71429dp)\n" +
+                    "\ticonScale: 1.0px (0.3809524dp)\n" +
+                    "\tcellScaleToFit : 1.0px (0.3809524dp)\n" +
+                    "\textraSpace: 829.0px (315.8095dp)\n" +
+                    "\tunscaled extraSpace: 829.0px (315.8095dp)\n" +
+                    "\tmaxEmptySpace: 0.0px (0.0dp)\n" +
+                    "\tworkspaceTopPadding: 0.0px (0.0dp)\n" +
+                    "\tworkspaceBottomPadding: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskMarginPx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskIconSizePx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskIconDrawableSizePx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskIconDrawableSizeGridPx: 0.0px (0.0dp)\n" +
+                    "\toverviewTaskThumbnailTopMarginPx: 0.0px (0.0dp)\n" +
+                    "\toverviewActionsTopMarginPx: 0.0px (0.0dp)\n" +
+                    "\toverviewActionsHeight: 0.0px (0.0dp)\n" +
+                    "\toverviewActionsClaimedSpaceBelow: 0.0px (0.0dp)\n" +
+                    "\toverviewActionsButtonSpacing: 0.0px (0.0dp)\n" +
+                    "\toverviewPageSpacing: 0.0px (0.0dp)\n" +
+                    "\toverviewRowSpacing: 0.0px (0.0dp)\n" +
+                    "\toverviewGridSideMargin: 0.0px (0.0dp)\n" +
+                    "\tdropTargetBarTopMarginPx: 168.0px (64.0dp)\n" +
+                    "\tdropTargetBarSizePx: 147.0px (56.0dp)\n" +
+                    "\tdropTargetBarBottomMarginPx: 42.0px (16.0dp)\n" +
+                    "\tgetCellLayoutSpringLoadShrunkTop(): 490.0px (186.66667dp)\n" +
+                    "\tgetCellLayoutSpringLoadShrunkBottom(): 1770.0px (674.2857dp)\n" +
+                    "\tworkspaceSpringLoadedMinNextPageVisiblePx: 63.0px (24.0dp)\n" +
+                    "\tgetWorkspaceSpringLoadScale(): 0.7437536px (0.2833347dp)\n" +
+                    "\tgetCellLayoutHeight(): 1721.0px (655.619dp)\n" +
+                    "\tgetCellLayoutWidth(): 899.0px (342.4762dp)\n"
+            )
+    }
+
+    private fun getDeviceProfileForGrid(gridName: String): DeviceProfile {
+        return InvariantDeviceProfile(context, gridName).getDeviceProfile(context)
+    }
+
+    private fun dump(dp: DeviceProfile): String {
+        val stringWriter = StringWriter()
+        val printWriter = PrintWriter(stringWriter)
+        dp.dump(context, "", printWriter)
+        printWriter.flush()
+        return stringWriter.toString()
+    }
+}