Merge "Hide scroll arrows from Alt+Tab UI" into main
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 517bd6d..1bce9b3 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -59,6 +59,7 @@
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.SHOW_WORK_APPS" />
+ <action android:name="android.intent.action.ALL_APPS" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.MONKEY"/>
diff --git a/aconfig/launcher.aconfig b/aconfig/launcher.aconfig
index d3c5c01..b083390 100644
--- a/aconfig/launcher.aconfig
+++ b/aconfig/launcher.aconfig
@@ -694,3 +694,13 @@
purpose: PURPOSE_BUGFIX
}
}
+
+flag {
+ name: "enable_taskbar_for_direct_boot"
+ namespace: "launcher"
+ description: "Initializes parts of Taskbar before onUserUnlocked"
+ bug: "324485921"
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
+}
diff --git a/go/AndroidManifest-launcher.xml b/go/AndroidManifest-launcher.xml
index 2223036..bef7180 100644
--- a/go/AndroidManifest-launcher.xml
+++ b/go/AndroidManifest-launcher.xml
@@ -57,6 +57,7 @@
android:enabled="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
+ <action android:name="android.intent.action.ALL_APPS" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.MONKEY"/>
diff --git a/quickstep/AndroidManifest-launcher.xml b/quickstep/AndroidManifest-launcher.xml
index 80d8154..d6aa886 100644
--- a/quickstep/AndroidManifest-launcher.xml
+++ b/quickstep/AndroidManifest-launcher.xml
@@ -57,6 +57,7 @@
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.SHOW_WORK_APPS" />
+ <action android:name="android.intent.action.ALL_APPS" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.MONKEY"/>
diff --git a/quickstep/res/drawable/ic_save_app_pair_left_right.xml b/quickstep/res/drawable/ic_save_app_pair_left_right.xml
index b104f44..509bc98 100644
--- a/quickstep/res/drawable/ic_save_app_pair_left_right.xml
+++ b/quickstep/res/drawable/ic_save_app_pair_left_right.xml
@@ -1,28 +1,25 @@
-<?xml version="1.0" encoding="utf-8"?>
-
<!--
- Copyright (C) 2024 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.
--->
-
+ ~ Copyright (C) 2025 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24"
- android:viewportHeight="24">
- <path
- android:pathData="M8.5,4.5H3.5C2.4,4.5 1.5,5.4 1.5,6.5V18.5C1.5,19.6 2.4,20.5 3.5,20.5H8.5C9.6,20.5 10.5,19.6 10.5,18.5V6.5C10.5,5.4 9.6,4.5 8.5,4.5ZM8.5,18.5H3.5V6.5H8.5V18.5ZM14.5,6.5H19.5V13.5H21.5V6.5C21.5,5.4 20.6,4.5 19.5,4.5H14.5C13.4,4.5 12.5,5.4 12.5,6.5V18.5C12.5,19.6 13.4,20.5 14.5,20.5H15.5V18.5H14.5V6.5ZM20.5,14.5V16.5H22.5V18.5H20.5V20.5H18.5V18.5H16.5V16.5H18.5V14.5H20.5Z"
- android:fillColor="#48473A"
- android:fillType="evenOdd"/>
+ android:width="20dp"
+ android:height="20dp"
+ android:tint="?attr/colorControlNormal"
+ android:viewportHeight="960"
+ android:viewportWidth="960">
+ <path
+ android:fillColor="@android:color/white"
+ android:pathData="M744,816L720,816Q704.7,816 694.35,805.71Q684,795.42 684,780.21Q684,765 694.35,754.5Q704.7,744 720,744L744,744L744,720Q744,704.7 754.29,694.35Q764.58,684 779.79,684Q795,684 805.5,694.35Q816,704.7 816,720L816,744L840,744Q855.3,744 865.65,754.29Q876,764.58 876,779.79Q876,795 865.65,805.5Q855.3,816 840,816L816,816L816,840Q816,855.3 805.71,865.65Q795.42,876 780.21,876Q765,876 754.5,865.65Q744,855.3 744,840L744,816ZM215.74,816Q186,816 165,794.85Q144,773.7 144,744L144,216Q144,186.3 165.18,165.15Q186.35,144 216.09,144L360.26,144Q390,144 411,165.15Q432,186.3 432,216L432,744Q432,773.7 410.82,794.85Q389.65,816 359.91,816L215.74,816ZM616,816Q581,816 554.5,796Q528,776 528,743.95L528,216Q528,186.3 549.18,165.15Q570.35,144 600.09,144L744.26,144Q774,144 795,165.15Q816,186.3 816,216L816,616Q807,614 798,613Q789,612 780,612Q709.79,612 660.9,661Q612,710 612,780Q612,789 613,798Q614,807 616,816Z" />
</vector>
diff --git a/quickstep/res/drawable/ic_save_app_pair_up_down.xml b/quickstep/res/drawable/ic_save_app_pair_up_down.xml
index 86f110c..282751c 100644
--- a/quickstep/res/drawable/ic_save_app_pair_up_down.xml
+++ b/quickstep/res/drawable/ic_save_app_pair_up_down.xml
@@ -1,28 +1,25 @@
-<?xml version="1.0" encoding="utf-8"?>
-
<!--
- Copyright (C) 2024 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.
--->
-
+ ~ Copyright (C) 2025 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24"
- android:viewportHeight="24">
- <path
- android:pathData="M18,2L6,2C4.9,2 4,2.9 4,4L4,9C4,10.1 4.9,11 6,11L18,11C19.1,11 20,10.1 20,9L20,4C20,2.9 19.1,2 18,2ZM18,9L6,9L6,4L18,4L18,9ZM18,13L6,13C4.9,13 4,13.9 4,15L4,20C4,21.1 4.9,22 6,22L13,22L13,20L6,20L6,15L18,15L18,16L20,16L20,15C20,13.9 19.1,13 18,13ZM16,17L18,17L18,19L20,19L20,21L18,21L18,23L16,23L16,21L14,21L14,19L16,19L16,17Z"
- android:fillColor="#48473A"
- android:fillType="evenOdd"/>
-</vector>
+ android:width="20dp"
+ android:height="20dp"
+ android:tint="?attr/colorControlNormal"
+ android:viewportHeight="960"
+ android:viewportWidth="960">
+ <path
+ android:fillColor="@android:color/white"
+ android:pathData="M744,816L720,816Q704.7,816 694.35,805.71Q684,795.42 684,780.21Q684,765 694.35,754.5Q704.7,744 720,744L744,744L744,720Q744,704.7 754.29,694.35Q764.58,684 779.79,684Q795,684 805.5,694.35Q816,704.7 816,720L816,744L840,744Q855.3,744 865.65,754.29Q876,764.58 876,779.79Q876,795 865.65,805.5Q855.3,816 840,816L816,816L816,840Q816,855.3 805.71,865.65Q795.42,876 780.21,876Q765,876 754.5,865.65Q744,855.3 744,840L744,816ZM216,432Q183,432 163.5,412.5Q144,393 144,360L144,216Q144,183 163.5,163.5Q183,144 216,144L744,144Q777,144 796.5,163.5Q816,183 816,216L816,360Q816,393 796.5,412.5Q777,432 744,432L216,432ZM215.62,816Q183,816 163.5,796.5Q144,777 144,744L144,600Q144,567 163.5,547.5Q183,528 216,528L744,528Q777,528 796.5,547.5Q816,567 816,600L816,616Q808,614 798.06,613Q788.13,612 780,612Q709.44,612 660.72,661.5Q612,711 612,780Q612,789.94 612.5,798.97Q613,808 615,816L215.62,816Z" />
+</vector>
\ No newline at end of file
diff --git a/quickstep/res/layout/task.xml b/quickstep/res/layout/task.xml
index 4abfbbe..3aac1b6 100644
--- a/quickstep/res/layout/task.xml
+++ b/quickstep/res/layout/task.xml
@@ -29,8 +29,8 @@
launcher:hoverBorderColor="@color/materialColorPrimary">
<ViewStub
- android:id="@+id/task_content_view"
- android:inflatedId="@id/task_content_view"
+ android:id="@+id/snapshot"
+ android:inflatedId="@id/snapshot"
android:layout_width="match_parent"
android:layout_height="match_parent" />
diff --git a/quickstep/res/layout/task_content_view.xml b/quickstep/res/layout/task_content_view.xml
deleted file mode 100644
index 9055ccd..0000000
--- a/quickstep/res/layout/task_content_view.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
- ~ Copyright (C) 2025 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.quickstep.task.thumbnail.TaskContentView xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/task_content_view"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical" />
\ No newline at end of file
diff --git a/quickstep/res/layout/task_grouped.xml b/quickstep/res/layout/task_grouped.xml
index a7c4856..3e6f5ed 100644
--- a/quickstep/res/layout/task_grouped.xml
+++ b/quickstep/res/layout/task_grouped.xml
@@ -34,14 +34,14 @@
launcher:hoverBorderColor="@color/materialColorPrimary">
<ViewStub
- android:id="@+id/task_content_view"
- android:inflatedId="@id/task_content_view"
+ android:id="@+id/snapshot"
+ android:inflatedId="@id/snapshot"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<ViewStub
- android:id="@+id/bottomright_task_content_view"
- android:inflatedId="@id/bottomright_task_content_view"
+ android:id="@+id/bottomright_snapshot"
+ android:inflatedId="@id/bottomright_snapshot"
android:layout_width="match_parent"
android:layout_height="match_parent" />
diff --git a/quickstep/res/layout/task_header_view.xml b/quickstep/res/layout/task_header_view.xml
deleted file mode 100644
index 849153f..0000000
--- a/quickstep/res/layout/task_header_view.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
- Copyright (C) 2025 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.quickstep.views.TaskHeaderView xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:app="http://schemas.android.com/apk/res-auto"
- android:id="@+id/task_header_view"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:paddingTop="@dimen/task_thumbnail_header_padding_top_bottom"
- android:paddingBottom="@dimen/task_thumbnail_header_padding_top_bottom"
- android:paddingStart="@dimen/task_thumbnail_header_padding_start_end"
- android:paddingEnd="@dimen/task_thumbnail_header_padding_start_end"
- android:background="@drawable/task_thumbnail_header_bg">
- <ImageView
- android:id="@+id/header_app_icon"
- android:layout_width="@dimen/task_thumbnail_header_icon_size"
- android:layout_height="@dimen/task_thumbnail_header_icon_size"
- android:layout_marginStart="@dimen/task_thumbnail_header_margin_between_views"
- android:layout_marginEnd="@dimen/task_thumbnail_header_margin_between_views"
- android:contentDescription="@string/header_app_icon_description"
- app:layout_constraintBottom_toBottomOf="parent"
- app:layout_constraintStart_toStartOf="parent"
- app:layout_constraintTop_toTopOf="parent" />
- <TextView
- android:id="@+id/header_app_title"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginStart="@dimen/task_thumbnail_header_margin_between_views"
- android:layout_marginEnd="@dimen/task_thumbnail_header_margin_between_views"
- android:maxLines="1"
- android:text="@string/header_default_app_title"
- app:layout_constraintBottom_toBottomOf="parent"
- app:layout_constraintStart_toEndOf="@id/header_app_icon"
- app:layout_constraintTop_toTopOf="parent" />
- <ImageButton
- android:id="@+id/header_close_button"
- android:layout_width="@dimen/task_thumbnail_header_icon_size"
- android:layout_height="@dimen/task_thumbnail_header_icon_size"
- android:layout_marginStart="@dimen/task_thumbnail_header_margin_between_views"
- android:layout_marginEnd="@dimen/task_thumbnail_header_margin_between_views"
- android:background="@null"
- android:contentDescription="@string/header_close_icon_description"
- android:src="@drawable/task_header_close_button"
- android:tint="@android:color/darker_gray"
- app:layout_constraintBottom_toBottomOf="parent"
- app:layout_constraintEnd_toEndOf="parent"
- app:layout_constraintHorizontal_bias="1"
- app:layout_constraintStart_toEndOf="@id/header_app_title"
- app:layout_constraintTop_toTopOf="parent" />
-</com.android.quickstep.views.TaskHeaderView>
diff --git a/quickstep/res/layout/task_thumbnail.xml b/quickstep/res/layout/task_thumbnail.xml
index 8280e13..3b96615 100644
--- a/quickstep/res/layout/task_thumbnail.xml
+++ b/quickstep/res/layout/task_thumbnail.xml
@@ -17,8 +17,7 @@
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/snapshot"
android:layout_width="match_parent"
- android:layout_height="0dp"
- android:layout_weight="1" >
+ android:layout_height="match_parent" >
<com.android.quickstep.views.FixedSizeImageView
android:id="@+id/task_thumbnail"
diff --git a/quickstep/res/layout/task_thumbnail_view_header.xml b/quickstep/res/layout/task_thumbnail_view_header.xml
new file mode 100644
index 0000000..70e4a42
--- /dev/null
+++ b/quickstep/res/layout/task_thumbnail_view_header.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ Copyright (C) 2025 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.quickstep.views.TaskThumbnailViewHeader
+ 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:id="@+id/task_thumbnail_view_header"
+ android:background="@drawable/task_thumbnail_header_bg">
+
+ <androidx.constraintlayout.widget.ConstraintLayout
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/task_thumbnail_header_height"
+ android:layout_marginStart="@dimen/task_thumbnail_header_margin_edge"
+ android:layout_marginEnd="@dimen/task_thumbnail_header_margin_edge"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintTop_toTopOf="parent">
+ <ImageView
+ android:id="@+id/header_app_icon"
+ android:contentDescription="@string/header_app_icon_description"
+ android:layout_width="@dimen/task_thumbnail_header_icon_size"
+ android:layout_height="@dimen/task_thumbnail_header_icon_size"
+ android:layout_marginEnd="@dimen/task_thumbnail_header_margin_between_views"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintEnd_toStartOf="@id/header_app_title"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintHorizontal_bias="0"
+ app:layout_constraintVertical_bias="0.5"
+ app:layout_constraintHorizontal_chainStyle="spread_inside" />
+ <TextView
+ android:id="@+id/header_app_title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="@dimen/task_thumbnail_header_margin_between_views"
+ android:layout_marginEnd="@dimen/task_thumbnail_header_margin_between_views"
+ android:text="@string/header_default_app_title"
+ app:layout_constraintStart_toEndOf="@id/header_app_icon"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintHorizontal_bias="0"
+ app:layout_constraintVertical_bias="0.5" />
+ <ImageButton
+ android:id="@+id/header_close_button"
+ android:contentDescription="@string/header_close_icon_description"
+ android:layout_width="@dimen/task_thumbnail_header_icon_size"
+ android:layout_height="@dimen/task_thumbnail_header_icon_size"
+ android:layout_marginStart="@dimen/task_thumbnail_header_margin_between_views"
+ android:src="@drawable/task_header_close_button"
+ android:tint="@android:color/darker_gray"
+ android:background="@null"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintTop_toTopOf="parent"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintHorizontal_bias="1"
+ app:layout_constraintVertical_bias="0.5" />
+ </androidx.constraintlayout.widget.ConstraintLayout>
+</com.android.quickstep.views.TaskThumbnailViewHeader>
diff --git a/quickstep/res/values-af/strings.xml b/quickstep/res/values-af/strings.xml
index c2f572b..025a7d0 100644
--- a/quickstep/res/values-af/strings.xml
+++ b/quickstep/res/values-af/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Skuif na links bo"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Skuif na regs onder"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Maak app as ’n borrel oop"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Onlangse apps"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Onlangse applys"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{meer app}other{meer apps}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Werkskerm"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> en <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, item <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> van <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-am/strings.xml b/quickstep/res/values-am/strings.xml
index e335423..fc4c4c4 100644
--- a/quickstep/res/values-am/strings.xml
+++ b/quickstep/res/values-am/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"ወደ ላይ/ግራ ይውሰዱ"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"ወደ ታች/ቀኝ ይውሰዱ"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"መተግበሪያን እንደ ዓረፋ ይክፈቱ"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"የቅርብ ጊዜ መተግበሪያዎች"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"የቅርብ ጊዜ መተግበሪያ ዝርዝር"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{ተጨማሪ መተግበሪያ}one{ተጨማሪ መተግበሪያ}other{ተጨማሪ መተግበሪያዎች}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"ዴስክቶፕ"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> እና <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>፣ ንጥል <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> ከ<xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-ar/strings.xml b/quickstep/res/values-ar/strings.xml
index 8fbc23b..17bcbee 100644
--- a/quickstep/res/values-ar/strings.xml
+++ b/quickstep/res/values-ar/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"الانتقال إلى يمين الشاشة أو أعلاها"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"الانتقال إلى يسار الشاشة أو أسفلها"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"فتح التطبيق كفقاعة"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"التطبيقات المستخدَمة مؤخرًا"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"قائمة التطبيقات المستخدَمة مؤخرًا"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{تطبيق واحد آخر}zero{تطبيق آخر}two{تطبيقان آخران}few{تطبيقات أخرى}many{تطبيقًا آخر}other{تطبيق آخر}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"وضع الكمبيوتر المكتبي"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"\"<xliff:g id="APP_NAME_1">%1$s</xliff:g>\" و\"<xliff:g id="APP_NAME_2">%2$s</xliff:g>\""</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>، العنصر رقم <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> من إجمالي <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-as/strings.xml b/quickstep/res/values-as/strings.xml
index 8c1ccda..0f8126b 100644
--- a/quickstep/res/values-as/strings.xml
+++ b/quickstep/res/values-as/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"ওপৰৰ বাঁওফাললৈ নিয়ক"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"তলৰ সোঁফাললৈ নিয়ক"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"বাবল হিচাপে এপ্টো খোলক"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"শেহতীয়া এপ্সমূহ"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"শেহতীয়া এপৰ সূচী"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{অধিক এপ্}one{অধিক এপ্}other{অধিক এপ্}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"ডেস্কটপ"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> আৰু <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>টাৰ ভিতৰত <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>তম বস্তু"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-az/strings.xml b/quickstep/res/values-az/strings.xml
index 53de211..f88a48c 100644
--- a/quickstep/res/values-az/strings.xml
+++ b/quickstep/res/values-az/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Yuxarı/sola köçürün"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Aşağı/sağa köçürün"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Tətbiqi yumrucuq kimi açın"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Son tətbiqlər"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Son tətbiq siyahısı"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{əlavə tətbiq}other{əlavə tətbiq}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Masaüstü"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> və <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, element <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>/<xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-b+sr+Latn/strings.xml b/quickstep/res/values-b+sr+Latn/strings.xml
index 1db58be..8b60c14 100644
--- a/quickstep/res/values-b+sr+Latn/strings.xml
+++ b/quickstep/res/values-b+sr+Latn/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Premesti gore levo"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Premesti dole desno"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Otvori aplikaciju kao oblačić"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Nedavne aplikacije"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Lista nedavnih aplikacija"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{dodatna aplikacija}one{dodatna aplikacija}few{dodatne aplikacije}other{dodatnih aplikacija}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Računar"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> i <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, stavka <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> od <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-be/strings.xml b/quickstep/res/values-be/strings.xml
index 20c914d..f0d4ee4 100644
--- a/quickstep/res/values-be/strings.xml
+++ b/quickstep/res/values-be/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Перамясціць уверх/улева"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Перамясціць уніз/управа"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Адкрыць праграму ва ўсплывальным акне"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Нядаўнія праграмы"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Спіс нядаўніх праграм"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{даступная праграма}one{даступная праграма}few{даступныя праграмы}many{даступных праграм}other{даступнай праграмы}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Працоўны стол"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> і <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, элемент <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> з <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-bg/strings.xml b/quickstep/res/values-bg/strings.xml
index 414219a..1040186 100644
--- a/quickstep/res/values-bg/strings.xml
+++ b/quickstep/res/values-bg/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Преместване горе/вляво"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Преместване долу/вдясно"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Отваряне на приложението като балонче"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Скорошни приложения"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Списък със скорошни приложения"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{допълнително приложение}other{допълнителни приложения}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Режим за настолни компютри"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> и <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, елемент <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> от <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-bn/strings.xml b/quickstep/res/values-bn/strings.xml
index 001c008..2c70067 100644
--- a/quickstep/res/values-bn/strings.xml
+++ b/quickstep/res/values-bn/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"উপরে/বাঁদিকে সরান"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"নিচে/ডানদিকে সরান"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"বাবল হিসেবে অ্যাপ খুলুন"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"সম্প্রতি ব্যবহৃত অ্যাপ"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"সাম্প্রতিক অ্যাপের তালিকা"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{আরও অ্যাপ}one{আরও অ্যাপ}other{আরও অ্যাপ}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"ডেস্কটপ"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> ও <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>টি টাস্কের মধ্যে <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> নম্বর আইটেম"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-bs/strings.xml b/quickstep/res/values-bs/strings.xml
index 1eb88aa..45bde4c 100644
--- a/quickstep/res/values-bs/strings.xml
+++ b/quickstep/res/values-bs/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Premjesti gore lijevo"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Premjesti dolje desno"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Otvori aplikaciju kao oblačić"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Nedavne aplikacije"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Liste nedavnih aplikacija"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{dodatna aplikacija}one{dodatna aplikacija}few{dodatne aplikacije}other{dodatnih aplikacija}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Računar"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> i <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>. stavka od <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-ca/strings.xml b/quickstep/res/values-ca/strings.xml
index 6397b14..07a7349 100644
--- a/quickstep/res/values-ca/strings.xml
+++ b/quickstep/res/values-ca/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Mou a la part superior o a l\'esquerra"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Mou a la part inferior o a la dreta"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Obre l\'aplicació com a bombolla"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Aplicacions recents"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Llista d\'aplicacions recents"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{aplicació més}other{aplicacions més}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Escriptori"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> i <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, element <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> de <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-cs/strings.xml b/quickstep/res/values-cs/strings.xml
index 3b000ef..98ed934 100644
--- a/quickstep/res/values-cs/strings.xml
+++ b/quickstep/res/values-cs/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Přesunout doleva nahoru"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Přesunout doprava dolů"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Otevřít aplikaci jako bublinu"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Poslední aplikace"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Seznam posledních aplikací"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{další aplikace}few{další aplikace}many{další aplikace}other{dalších aplikací}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Počítač"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> a <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, položka <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> z <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-da/strings.xml b/quickstep/res/values-da/strings.xml
index cf45967..d4ec1e6 100644
--- a/quickstep/res/values-da/strings.xml
+++ b/quickstep/res/values-da/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Flyt til toppen eller venstre side"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Flyt til bunden eller højre side"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Åbn appen som en boble"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Seneste apps"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Liste over seneste apps"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{yderligere app}one{yderligere app}other{yderligere apps}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Computertilstand"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> og <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, element <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> af <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-de/strings.xml b/quickstep/res/values-de/strings.xml
index f15838e..e3ab11c 100644
--- a/quickstep/res/values-de/strings.xml
+++ b/quickstep/res/values-de/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Nach oben / Nach links verschieben"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Nach unten / Nach rechts verschieben"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"App als Bubble öffnen"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Zuletzt aktive Apps"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Liste der zuletzt aktiven Apps"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{weitere App}other{weitere Apps}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Desktopmodus"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> und <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, Element <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> von <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-el/strings.xml b/quickstep/res/values-el/strings.xml
index a94a2f2..eae51d1 100644
--- a/quickstep/res/values-el/strings.xml
+++ b/quickstep/res/values-el/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Μετακίνηση επάνω/αριστερά"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Μετακίνηση κάτω/δεξιά"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Άνοιγμα εφαρμογής σε συννεφάκι"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Πρόσφατες εφαρμογές"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Λίστα πρόσφατων εφαρμογών"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{ακόμη εφαρμογή}other{ακόμη εφαρμογές}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Υπολογιστής"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> και <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, στοιχείο <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> από <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-en-rAU/strings.xml b/quickstep/res/values-en-rAU/strings.xml
index 9082df4..6397fa5 100644
--- a/quickstep/res/values-en-rAU/strings.xml
+++ b/quickstep/res/values-en-rAU/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Move to top/left"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Move to bottom/right"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Open app as a bubble"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Recent apps"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Recent app list"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{more app}other{more apps}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Desktop"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> and <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, item <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> of <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-en-rCA/strings.xml b/quickstep/res/values-en-rCA/strings.xml
index 0d9e572..fcd7c66 100644
--- a/quickstep/res/values-en-rCA/strings.xml
+++ b/quickstep/res/values-en-rCA/strings.xml
@@ -146,10 +146,8 @@
<string name="quick_switch_desktop" msgid="8393802056024499749">"Desktop"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> and <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, item <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> of <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
- <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
- <skip />
- <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
- <skip />
+ <string name="quick_switch_scroll_arrow_left" msgid="6527033155534184309">"Scroll left"</string>
+ <string name="quick_switch_scroll_arrow_right" msgid="7319779291086916348">"Scroll right"</string>
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Bubble"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Overflow"</string>
<string name="bubble_bar_bubble_description" msgid="1882466152448446446">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> from <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
diff --git a/quickstep/res/values-en-rGB/strings.xml b/quickstep/res/values-en-rGB/strings.xml
index 9082df4..6397fa5 100644
--- a/quickstep/res/values-en-rGB/strings.xml
+++ b/quickstep/res/values-en-rGB/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Move to top/left"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Move to bottom/right"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Open app as a bubble"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Recent apps"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Recent app list"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{more app}other{more apps}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Desktop"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> and <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, item <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> of <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-en-rIN/strings.xml b/quickstep/res/values-en-rIN/strings.xml
index 9082df4..6397fa5 100644
--- a/quickstep/res/values-en-rIN/strings.xml
+++ b/quickstep/res/values-en-rIN/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Move to top/left"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Move to bottom/right"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Open app as a bubble"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Recent apps"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Recent app list"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{more app}other{more apps}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Desktop"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> and <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, item <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> of <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-es-rUS/strings.xml b/quickstep/res/values-es-rUS/strings.xml
index 78bb88a..703c434 100644
--- a/quickstep/res/values-es-rUS/strings.xml
+++ b/quickstep/res/values-es-rUS/strings.xml
@@ -96,7 +96,7 @@
<string name="action_share" msgid="2648470652637092375">"Compartir"</string>
<string name="action_screenshot" msgid="8171125848358142917">"Captura de pantalla"</string>
<string name="action_split" msgid="2098009717623550676">"Pantalla dividida"</string>
- <string name="action_save_app_pair" msgid="5974823919237645229">"Guardar vinculación"</string>
+ <string name="action_save_app_pair" msgid="5974823919237645229">"Guardar grupo de apps"</string>
<string name="toast_split_select_app" msgid="8464310533320556058">"Presiona otra app para usar la pantalla dividida"</string>
<string name="toast_contextual_split_select_app" msgid="433510957123687090">"Elige otra app para usar la pantalla dividida"</string>
<string name="toast_split_select_app_cancel" msgid="1939025102486630426">"Cancelar"</string>
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Mover a la parte superior o izquierda"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Mover a la parte inferior o derecha"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Abrir app como burbuja"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Apps recientes"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Lista de apps recientes"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{app más}other{apps más}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Escritorio"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> y <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, elemento <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> de <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-es/strings.xml b/quickstep/res/values-es/strings.xml
index 542e8aa..56489da 100644
--- a/quickstep/res/values-es/strings.xml
+++ b/quickstep/res/values-es/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Mover arriba/a la izquierda"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Mover abajo/a la derecha"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Abrir aplicación como burbuja"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Aplicaciones recientes"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Lista de aplicaciones recientes"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{app más}other{apps más}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Ordenador"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> y <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, elemento <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> de <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-et/strings.xml b/quickstep/res/values-et/strings.xml
index 66d0b9f..c372682 100644
--- a/quickstep/res/values-et/strings.xml
+++ b/quickstep/res/values-et/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Teisalda üles/vasakule"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Teisalda alla/paremale"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Rakenduse avamine mullina"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Hiljutised rakendused"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Hiljutiste rakenduste loend"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{rakendus veel}other{rakendust veel}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Lauaarvuti"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> ja <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, üksus <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>/<xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-eu/strings.xml b/quickstep/res/values-eu/strings.xml
index 618992c..77b6b6d 100644
--- a/quickstep/res/values-eu/strings.xml
+++ b/quickstep/res/values-eu/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Eraman gora, ezkerretara"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Eraman behera, eskuinetara"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Ireki aplikazioa burbuila gisa"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Azkenaldiko aplikazioak"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Azkenaldiko aplikazioen zerrenda"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{aplikazio gehiago}other{aplikazio gehiago}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Ordenagailua"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> eta <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="TOTAL_TASKS">%3$d</xliff:g> elementutatik <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>garrena"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-fa/strings.xml b/quickstep/res/values-fa/strings.xml
index 9745b58..7b9b719 100644
--- a/quickstep/res/values-fa/strings.xml
+++ b/quickstep/res/values-fa/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"انتقال به بالا/ چپ"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"انتقال به پایین/ راست"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"باز کردن برنامه بهصورت حبابک"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"برنامههای اخیر"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"فهرست برنامههای اخیر"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{برنامه دیگر}one{برنامه دیگر}other{برنامه دیگر}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"رایانه"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> و <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>، مورد <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> از <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-fi/strings.xml b/quickstep/res/values-fi/strings.xml
index af132e7..0373604 100644
--- a/quickstep/res/values-fi/strings.xml
+++ b/quickstep/res/values-fi/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Siirrä ylös tai vasemmalle"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Siirrä alas tai oikealle"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Avaa sovellus kuplana"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Viimeaikaiset sovellukset"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Viimeaikaisten sovellusten lista"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{muu sovellus}other{muuta sovellusta}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Tietokone"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> ja <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, kohde <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>/<xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-fr-rCA/strings.xml b/quickstep/res/values-fr-rCA/strings.xml
index 6c4fcc4..fcf03be 100644
--- a/quickstep/res/values-fr-rCA/strings.xml
+++ b/quickstep/res/values-fr-rCA/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Déplacer vers le coin supérieur gauche de l\'écran"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Déplacer vers le coin inférieur droit de l\'écran"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Ouvrir l\'appli sous forme de bulle"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Applis récentes"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Liste des applis récentes"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{autre appli}one{autre appli}other{autres applis}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Bureau"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> et <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, élément <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> de <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-fr/strings.xml b/quickstep/res/values-fr/strings.xml
index 09079d8..9a14df8 100644
--- a/quickstep/res/values-fr/strings.xml
+++ b/quickstep/res/values-fr/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Déplacer en haut ou à gauche"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Déplacer en bas ou à droite"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Ouvrir l\'appli sous forme de bulle"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Applis récentes"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Liste des applis récentes"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{autre application}one{autre application}other{autres applications}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Mode ordinateur"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> et <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"Élément <xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g> sur <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> : <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-gl/strings.xml b/quickstep/res/values-gl/strings.xml
index 3840b5e..9a3cfa0 100644
--- a/quickstep/res/values-gl/strings.xml
+++ b/quickstep/res/values-gl/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Mover á parte superior ou á esquerda"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Mover á parte inferior ou á dereita"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Abrir aplicación como unha burbulla"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Aplicacións recentes"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Lista de aplicacións recentes"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{aplicación máis}other{aplicacións máis}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Escritorio"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> e <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, artigo <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> de <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-gu/strings.xml b/quickstep/res/values-gu/strings.xml
index c39fe20..736ce92 100644
--- a/quickstep/res/values-gu/strings.xml
+++ b/quickstep/res/values-gu/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"સૌથી ઉપર ડાબી બાજુએ ખસેડો"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"સૌથી નીચે જમણી બાજુએ ખસેડો"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"બબલ તરીકે ઍપ ખોલો"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"તાજેતરની ઍપ"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"તાજેતરની ઍપની સૂચિ"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{વધુ ઍપ}one{વધુ ઍપ}other{વધુ ઍપ}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"ડેસ્કટૉપ"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> અને <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>માંથી આઇટમ <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-hi/strings.xml b/quickstep/res/values-hi/strings.xml
index af24811..8c8d7ae 100644
--- a/quickstep/res/values-hi/strings.xml
+++ b/quickstep/res/values-hi/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"ऊपर/बाईं तरफ़ ले जाएं"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"नीचे/दाईं तरफ़ ले जाएं"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"ऐप्लिकेशन को बबल के तौर पर खोलें"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"हाल ही में इस्तेमाल किए गए ऐप्लिकेशन"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"हाल ही में इस्तेमाल किए गए ऐप्लिकेशन की सूची"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{ज़्यादा ऐप्लिकेशन}one{ज़्यादा ऐप्लिकेशन}other{ज़्यादा ऐप्लिकेशन}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"डेस्कटॉप"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> और <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="TOTAL_TASKS">%3$d</xliff:g> में से <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> आइटम"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-hr/strings.xml b/quickstep/res/values-hr/strings.xml
index fca73aa..2fb6679 100644
--- a/quickstep/res/values-hr/strings.xml
+++ b/quickstep/res/values-hr/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Premjesti gore/lijevo"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Premjesti dolje/desno"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Otvori aplikaciju kao oblačić"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Nedavne aplikacije"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Popis nedavnih aplikacija"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{dodatna aplikacija}one{dodatna aplikacija}few{dodatne aplikacije}other{dodatnih aplikacija}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Računalo"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> i <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, stavka <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> od <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-hy/strings.xml b/quickstep/res/values-hy/strings.xml
index 184e281..e418e8e 100644
--- a/quickstep/res/values-hy/strings.xml
+++ b/quickstep/res/values-hy/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Տեղափոխել վերևի ձախ անկյուն"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Տեղափոխել ներքևի աջ անկյուն"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Բացել հավելվածը պղպջակի ձևով"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Վերջերս բացված հավելվածներ"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Վերջերս բացված հավելվածների ցանկ"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{լրացուցիչ հավելված}one{լրացուցիչ հավելված}other{լրացուցիչ հավելված}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Համակարգիչ"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> և <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, տարր <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>՝ <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>-ից"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-in/strings.xml b/quickstep/res/values-in/strings.xml
index 19ce0ad..0fda663 100644
--- a/quickstep/res/values-in/strings.xml
+++ b/quickstep/res/values-in/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Pindahkan ke atas/kiri"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Pindahkan ke bawah/kanan"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Buka aplikasi sebagai balon"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Aplikasi yang baru dibuka"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Daftar aplikasi yang baru dibuka"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{aplikasi lainnya}other{aplikasi lainnya}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Desktop"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> dan <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, item <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> dari <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-is/strings.xml b/quickstep/res/values-is/strings.xml
index 77e2fd0..abfc7cf 100644
--- a/quickstep/res/values-is/strings.xml
+++ b/quickstep/res/values-is/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Færa efst/til vinstri"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Færa neðst/til hægri"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Opna forrit sem blöðru"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Nýleg forrit"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Listi yfir nýleg forrit"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{forrit til viðbótar}one{forrit til viðbótar}other{forrit til viðbótar}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Skjáborð"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> og <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, atriði <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> af <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-it/strings.xml b/quickstep/res/values-it/strings.xml
index 2069ece..00529b7 100644
--- a/quickstep/res/values-it/strings.xml
+++ b/quickstep/res/values-it/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Sposta in alto/a sinistra"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Sposta in basso/a destra"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Apri l\'app come fumetto"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"App recenti"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Elenco app recenti"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{altra app}other{altre app}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Desktop"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> e <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, elemento <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> di <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-iw/strings.xml b/quickstep/res/values-iw/strings.xml
index 2b2302b..3278362 100644
--- a/quickstep/res/values-iw/strings.xml
+++ b/quickstep/res/values-iw/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"העברה לפינה השמאלית/העליונה"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"העברה לפינה הימנית/התחתונה"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"פתיחת האפליקציה בבועה"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"אפליקציות אחרונות"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"רשימת האפליקציות האחרונות"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{אפליקציה נוספת}one{אפליקציות נוספות}two{אפליקציות נוספות}other{אפליקציות נוספות}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"מחשב"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> ו-<xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, פריט <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> מתוך <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-ka/strings.xml b/quickstep/res/values-ka/strings.xml
index c590ade..ac46836 100644
--- a/quickstep/res/values-ka/strings.xml
+++ b/quickstep/res/values-ka/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"ზემოთ/მარცხნივ გადატანა"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"ქვემოთ/მარჯვნივ გადატანა"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"აპის გახსნა ბუშტის სახით"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"ბოლოდროინდელი აპები"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"ბოლოდროინდელი აპების სია"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{სხვა აპი}other{სხვა აპი}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"დესკტოპი"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> და <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>-ე ერთეული <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>-დან"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-kk/strings.xml b/quickstep/res/values-kk/strings.xml
index b9785a4..c2861d6 100644
--- a/quickstep/res/values-kk/strings.xml
+++ b/quickstep/res/values-kk/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Жоғары/солға жылжыту"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Төмен/оңға жылжыту"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Қолданбаны қалқыма терезе түрінде ашу"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Соңғы қолданбалар"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Соңғы қолданбалар тізімі"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{қосымша қолданба}other{қосымша қолданба}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Компьютер"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> және <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>/<xliff:g id="TOTAL_TASKS">%3$d</xliff:g> элемент"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-km/strings.xml b/quickstep/res/values-km/strings.xml
index a139ca3..799bcda 100644
--- a/quickstep/res/values-km/strings.xml
+++ b/quickstep/res/values-km/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"ផ្លាស់ទីទៅខាងលើ/ឆ្វេង"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"ផ្លាស់ទីទៅខាងក្រោម/ស្ដាំ"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"បើកកម្មវិធីជាផ្ទាំងសារ"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"កម្មវិធីថ្មីៗ"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"បញ្ជីកម្មវិធីថ្មីៗ"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{កម្មវិធីច្រើនទៀត}other{កម្មវិធីច្រើនទៀត}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"អេក្រង់ដើម"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> និង <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g> ធាតុទី <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> នៃ <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-kn/strings.xml b/quickstep/res/values-kn/strings.xml
index a1907d5..c88aed2 100644
--- a/quickstep/res/values-kn/strings.xml
+++ b/quickstep/res/values-kn/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"ಮೇಲಿನ/ಎಡಭಾಗಕ್ಕೆ ಸರಿಸಿ"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"ಕೆಳಗಿನ/ಬಲಭಾಗಕ್ಕೆ ಸರಿಸಿ"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"ಆ್ಯಪ್ ಅನ್ನು ಬಬಲ್ ಆಗಿ ತೆರೆಯಿರಿ"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"ಇತ್ತೀಚಿನ ಆ್ಯಪ್ಗಳು"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"ಇತ್ತೀಚಿನ ಆ್ಯಪ್ ಪಟ್ಟಿ"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{ಹೆಚ್ಚಿನ ಆ್ಯಪ್}one{ಹೆಚ್ಚಿನ ಆ್ಯಪ್ಗಳು}other{ಹೆಚ್ಚಿನ ಆ್ಯಪ್ಗಳು}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"ಡೆಸ್ಕ್ಟಾಪ್"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> ಮತ್ತು <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="TOTAL_TASKS">%3$d</xliff:g> ರಲ್ಲಿ <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> ಐಟಂ"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-ko/strings.xml b/quickstep/res/values-ko/strings.xml
index 1e7e850..5df9fdd 100644
--- a/quickstep/res/values-ko/strings.xml
+++ b/quickstep/res/values-ko/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"상단/왼쪽으로 이동"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"하단/오른쪽으로 이동"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"앱을 대화창으로 열기"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"최근 앱"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"최근 앱 목록"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{추가 앱}other{추가 앱}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"데스크톱"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> 및 <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>개 중 <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>번째 항목"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-ky/strings.xml b/quickstep/res/values-ky/strings.xml
index 3190dee..049da10 100644
--- a/quickstep/res/values-ky/strings.xml
+++ b/quickstep/res/values-ky/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Жогорку/сол бурчка жылдыруу"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Төмөнкү/оң бурчка жылдыруу"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Колдонмону көбүкчө катары ачуу"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Акыркы колдонмолор"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Акыркы колдонмолордун тизмеси"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{колдонмо бар}other{колдонмо бар}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Компьютер"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> жана <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="TOTAL_TASKS">%3$d</xliff:g> ичинен <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> нерсе"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-lo/strings.xml b/quickstep/res/values-lo/strings.xml
index 42b487e..9eb169a 100644
--- a/quickstep/res/values-lo/strings.xml
+++ b/quickstep/res/values-lo/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"ຍ້າຍໄປຊ້າຍ/ເທິງ"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"ຍ້າຍໄປຂວາ/ລຸ່ມ"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"ເປີດແອັບເປັນຟອງ"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"ແອັບຫຼ້າສຸດ"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"ລາຍຊື່ແອັບຫຼ້າສຸດ"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{ແອັບເພີ່ມເຕີມ}other{ແອັບເພີ່ມເຕີມ}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"ເດັສທັອບ"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> ແລະ <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, ລາຍການທີ <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> ຈາກທັງໝົດ <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-lt/strings.xml b/quickstep/res/values-lt/strings.xml
index 20fcc80..2cbdc8e 100644
--- a/quickstep/res/values-lt/strings.xml
+++ b/quickstep/res/values-lt/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Perkelti aukštyn, kairėn"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Perkelti žemyn, dešinėn"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Atidaryti programą kaip burbulą"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Naujausios programos"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Naujausių programų sąrašas"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{papildoma programa}one{papildoma programa}few{papildomos programos}many{papildomos programos}other{papildomų programų}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Stalinis kompiuteris"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"„<xliff:g id="APP_NAME_1">%1$s</xliff:g>“ ir „<xliff:g id="APP_NAME_2">%2$s</xliff:g>“"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> element. iš <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-lv/strings.xml b/quickstep/res/values-lv/strings.xml
index 7b256a7..f8cda4a 100644
--- a/quickstep/res/values-lv/strings.xml
+++ b/quickstep/res/values-lv/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Pārvietot uz augšējo/kreiso stūri"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Pārvietot uz apakšējo/labo stūri"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Atvērt lietotni kā burbuli"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Pēdējās izmantotās lietotnes"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Pēdējo izmantoto lietotņu saraksts"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{papildu lietotne}zero{papildu lietotņu}one{papildu lietotne}other{papildu lietotnes}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Darbvirsma"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"“<xliff:g id="APP_NAME_1">%1$s</xliff:g>” un “<xliff:g id="APP_NAME_2">%2$s</xliff:g>”"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>; <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>. vienums no <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-mk/strings.xml b/quickstep/res/values-mk/strings.xml
index 08dc459..d5fe673 100644
--- a/quickstep/res/values-mk/strings.xml
+++ b/quickstep/res/values-mk/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Премести горе лево"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Премести долу десно"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Отвори апликација како балонче"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Неодамнешни апликации"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Список со неодамнешни апликации"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{дополнителна апликација}one{дополнителна апликација}other{дополнителни апликации}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Режим за компјутер"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> и <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, ставка <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> од <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-ml/strings.xml b/quickstep/res/values-ml/strings.xml
index 9b87841..099e000 100644
--- a/quickstep/res/values-ml/strings.xml
+++ b/quickstep/res/values-ml/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"മുകളിലേക്കോ ഇടത്തേക്കോ നീക്കുക"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"താഴേക്കോ വലത്തേക്കോ നീക്കുക"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"ആപ്പ് ഒരു ബബിളായി തുറക്കുക"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"അടുത്തിടെ തുറന്ന ആപ്പുകൾ"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"അടുത്തിടെ തുറന്ന ആപ്പ് ലിസ്റ്റ്"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{കൂടുതൽ ആപ്പ്}other{കൂടുതൽ ആപ്പുകൾ}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"ഡെസ്ക്ടോപ്പ്"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g>, <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>-ൽ <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>-ാമത്തെ ഇനം"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-mn/strings.xml b/quickstep/res/values-mn/strings.xml
index f390e21..d41faaf 100644
--- a/quickstep/res/values-mn/strings.xml
+++ b/quickstep/res/values-mn/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Зүүн дээд хэсэг рүү зөөх"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Баруун доод хэсэг рүү зөөх"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Аппыг бөмбөлөг байдлаар нээх"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Саяхны апп"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Саяхны аппын жагсаалт"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{бусад апп}other{бусад апп}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Дэлгэц"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> болон <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>-н <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>-р зүйл"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-mr/strings.xml b/quickstep/res/values-mr/strings.xml
index 4e6d309..5aa9dfc 100644
--- a/quickstep/res/values-mr/strings.xml
+++ b/quickstep/res/values-mr/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"सर्वात वरती/डावीकडे हलवा"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"तळाशी/उजवीकडे हलवा"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"बबल म्हणून अॅप उघडा"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"अलीकडील ॲप्स"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"अलीकडील ॲपची सूची"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{आणखी अॅप}other{आणखी अॅप्स}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"डेस्कटॉप"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> आणि <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="TOTAL_TASKS">%3$d</xliff:g> पैकी <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> आयटम"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-my/strings.xml b/quickstep/res/values-my/strings.xml
index 8f90b8b..499269c 100644
--- a/quickstep/res/values-my/strings.xml
+++ b/quickstep/res/values-my/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"အပေါ်/ဘယ်ဘက်သို့ ရွှေ့ရန်"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"အောက်ခြေ/ညာဘက်သို့ ရွှေ့ရန်"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"အက်ပ်ကို ပူဖောင်းကွက်အဖြစ် ဖွင့်ရန်"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"မကြာသေးမီက အက်ပ်များ"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"မကြာသေးမီက အက်ပ်စာရင်း"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{နောက်ထပ်အက်ပ်}other{နောက်ထပ်အက်ပ်များ}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"ဒက်စ်တော့"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> နှင့် <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>၊ <xliff:g id="TOTAL_TASKS">%3$d</xliff:g> ခုအနက် <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-nb/strings.xml b/quickstep/res/values-nb/strings.xml
index a5799c5..7ec515c 100644
--- a/quickstep/res/values-nb/strings.xml
+++ b/quickstep/res/values-nb/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Flytt til øverst/venstre"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Flytt til nederst/høyre"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Åpne appen som en boble"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Nylige apper"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Liste over nylige apper"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{app til}other{apper til}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Skrivebord"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> og <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, element <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> av <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-ne/strings.xml b/quickstep/res/values-ne/strings.xml
index b1b03e4..91c6bba 100644
--- a/quickstep/res/values-ne/strings.xml
+++ b/quickstep/res/values-ne/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"सिरान/बायाँतिर सार्नुहोस्"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"फेद/दायाँतिर सार्नुहोस्"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"एपलाई बबलका रूपमा खोल्नुहोस्"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"हालसालै चलाइएका एपहरू"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"हालसालै चलाइएको एपको सूची"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{थप एप}other{थप एपहरू}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"डेस्कटप"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> र <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="TOTAL_TASKS">%3$d</xliff:g> मध्ये <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> औँ वस्तु"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-nl/strings.xml b/quickstep/res/values-nl/strings.xml
index bd4dfc5..9e49f13 100644
--- a/quickstep/res/values-nl/strings.xml
+++ b/quickstep/res/values-nl/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Naar boven/links verplaatsen"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Naar beneden/rechts verplaatsen"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"App openen als ballon"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Recente apps"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Lijst met recente apps"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{extra app}other{extra apps}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Desktop"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> en <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, item <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> van <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-or/strings.xml b/quickstep/res/values-or/strings.xml
index 7efa026..4721e74 100644
--- a/quickstep/res/values-or/strings.xml
+++ b/quickstep/res/values-or/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"ଶୀର୍ଷ/ବାମକୁ ମୁଭ କରନ୍ତୁ"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"ନିମ୍ନ/ଡାହାଣକୁ ମୁଭ କରନ୍ତୁ"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"ଏକ ବବଲ ଭାବେ ଆପ ଖୋଲନ୍ତୁ"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"ବର୍ତ୍ତମାନର ଆପ"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"ବର୍ତ୍ତମାନର ଆପ ତାଲିକା"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{ଅଧିକ ଆପ}other{ଅଧିକ ଆପ୍ସ}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"ଡେସ୍କଟପ"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> ଏବଂ <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>ର <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> ଆଇଟମ"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-pa/strings.xml b/quickstep/res/values-pa/strings.xml
index 798619b..f081b67 100644
--- a/quickstep/res/values-pa/strings.xml
+++ b/quickstep/res/values-pa/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"ਸਿਖਰਲੇ/ਖੱਬੇ ਪਾਸੇ ਲੈ ਕੇ ਜਾਓ"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"ਹੇਠਾਂ/ਸੱਜੇ ਪਾਸੇ ਲੈ ਕੇ ਜਾਓ"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"ਐਪ ਨੂੰ ਬਬਲ ਵਜੋਂ ਖੋਲ੍ਹੋ"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"ਹਾਲੀਆ ਐਪਾਂ"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"ਹਾਲੀਆ ਐਪ ਸੂਚੀ"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{ਹੋਰ ਐਪ}one{ਹੋਰ ਐਪ}other{ਹੋਰ ਐਪਾਂ}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"ਡੈਸਕਟਾਪ"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> ਅਤੇ <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="TOTAL_TASKS">%3$d</xliff:g> ਵਿੱਚੋਂ <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> ਆਈਟਮ"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-pl/strings.xml b/quickstep/res/values-pl/strings.xml
index 6f6b08b..9970dee 100644
--- a/quickstep/res/values-pl/strings.xml
+++ b/quickstep/res/values-pl/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Przesuń w górny lewy róg"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Przesuń w dolny prawy róg"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Otwórz aplikację jako dymek"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Ostatnie aplikacje"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Lista ostatnich aplikacji"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{inna aplikacja}few{inne aplikacje}many{innych aplikacji}other{innej aplikacji}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Pulpit"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> i <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, element <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> z <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-pt/strings.xml b/quickstep/res/values-pt/strings.xml
index 892881b..92fed63 100644
--- a/quickstep/res/values-pt/strings.xml
+++ b/quickstep/res/values-pt/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Mover para cima/para a esquerda"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Mover para baixo/para a direita"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Abrir o app como um balão"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Apps recentes"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Lista de apps recentes"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{outro app}one{outro app}other{outros apps}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Computador"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> e <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, item <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> de <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-ro/strings.xml b/quickstep/res/values-ro/strings.xml
index 3be5fcc..4b1ee4d 100644
--- a/quickstep/res/values-ro/strings.xml
+++ b/quickstep/res/values-ro/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Mută în stânga sus"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Mută în dreapta jos"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Deschide aplicația ca balon"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Aplicații recente"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Lista de aplicații recente"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{aplicație suplimentară}few{mai multe aplicații}other{mai multe aplicații}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Computer"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> și <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, articolul <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> din <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-ru/strings.xml b/quickstep/res/values-ru/strings.xml
index 8129585..f46de34 100644
--- a/quickstep/res/values-ru/strings.xml
+++ b/quickstep/res/values-ru/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Переместить вверх или влево"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Переместить вниз или вправо"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Открыть приложение во всплывающем окне"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Недавние приложения"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Список недавних приложений"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{дополнительное приложение}one{дополнительное приложение}few{дополнительных приложения}many{дополнительных приложений}other{дополнительного приложения}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Режим компьютера"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> и <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, элемент <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> из <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-si/strings.xml b/quickstep/res/values-si/strings.xml
index 2d6a3b9..d413b0d 100644
--- a/quickstep/res/values-si/strings.xml
+++ b/quickstep/res/values-si/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"ඉහළ/වම වෙත ගෙන යන්න"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"පහළ/දකුණ වෙත ගෙන යන්න"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"යෙදුම බුබුලක් ලෙස විවෘත කරන්න"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"මෑත යෙදුම්"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"මෑත යෙදුම් ලැයිස්තුව"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{තව යෙදුම}one{තවත් යෙදුම්}other{තවත් යෙදුම්}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"ඩෙස්ක්ටොපය"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> සහ <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, අයිතම <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>න් <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-sk/strings.xml b/quickstep/res/values-sk/strings.xml
index e3a86cb..8b87d38 100644
--- a/quickstep/res/values-sk/strings.xml
+++ b/quickstep/res/values-sk/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Presunúť hore alebo doľava"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Presunúť dole alebo doprava"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Otvoriť aplikáciu ako bublinu"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Nedávne aplikácie"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Zoznam nedávnych aplikácií"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{ďalšia aplikácia}few{ďalšie aplikácie}many{ďalšie aplikácie}other{ďalšie aplikácie}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Počítač"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> a <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>. položka z <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-sq/strings.xml b/quickstep/res/values-sq/strings.xml
index 0bea11d..5ab85fa 100644
--- a/quickstep/res/values-sq/strings.xml
+++ b/quickstep/res/values-sq/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Lëviz në krye/majtas"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Lëviz në fund/djathtas"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Hap aplikacionin si një flluskë"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Aplikacionet e fundit"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Lista e aplikacioneve të fundit"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{aplikacion tjetër}other{aplikacione të tjera}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Desktop"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> dhe <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, artikulli <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> nga <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-sr/strings.xml b/quickstep/res/values-sr/strings.xml
index 06ca295..4e32155 100644
--- a/quickstep/res/values-sr/strings.xml
+++ b/quickstep/res/values-sr/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Премести горе лево"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Премести доле десно"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Отвори апликацију као облачић"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Недавне апликације"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Листа недавних апликација"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{додатна апликација}one{додатна апликација}few{додатне апликације}other{додатних апликација}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Рачунар"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> и <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, ставка <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> од <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-sv/strings.xml b/quickstep/res/values-sv/strings.xml
index 8f57cad..0ac4d46 100644
--- a/quickstep/res/values-sv/strings.xml
+++ b/quickstep/res/values-sv/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Flytta högst upp/till vänster"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Flytta längst ned/till höger"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Öppna appen som en bubbla"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Senaste apparna"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Lista över senaste appar"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{app till}other{appar till}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Skrivbordsläge"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> och <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, objekt <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> av <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-sw/strings.xml b/quickstep/res/values-sw/strings.xml
index 7aaf14e..b3afda5 100644
--- a/quickstep/res/values-sw/strings.xml
+++ b/quickstep/res/values-sw/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Sogeza juu/kushoto"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Sogeza chini/kulia"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Fungua programu kama kiputo"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Programu ulizofungua hivi majuzi"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Orodha ya programu ulizofungua hivi majuzi"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{programu nyingine}other{programu zingine}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Kompyuta ya Mezani"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> na <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, kipengee cha <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> kati ya <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-ta/strings.xml b/quickstep/res/values-ta/strings.xml
index b0b771e..f6e1021 100644
--- a/quickstep/res/values-ta/strings.xml
+++ b/quickstep/res/values-ta/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"மேலே/இடதுபுறம் நகர்த்தும்"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"கீழே/வலதுபுறம் நகர்த்தும்"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"ஆப்ஸைக் குமிழாகத் திற"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"சமீபத்திய ஆப்ஸ்"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"சமீபத்திய ஆப்ஸ் பட்டியல்"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{கூடுதல் ஆப்ஸ்}other{கூடுதல் ஆப்ஸ்}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"டெஸ்க்டாப்"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> மற்றும் <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="TOTAL_TASKS">%3$d</xliff:g> இல் <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> கட்டம்"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-te/strings.xml b/quickstep/res/values-te/strings.xml
index 5f0e7a4..5ab198e 100644
--- a/quickstep/res/values-te/strings.xml
+++ b/quickstep/res/values-te/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"ఎగువ/ఎడమ వైపునకు తరలించండి"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"దిగువ/కుడి వైపునకు తరలించండి"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"యాప్ను బబుల్లాగా తెరవండి"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"ఇటీవలి యాప్లు"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"ఇటీవలి యాప్ లిస్ట్"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{మరో యాప్}other{మరిన్ని యాప్లు}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"డెస్క్టాప్"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g>, <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>లో <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>వ ఐటెమ్"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-th/strings.xml b/quickstep/res/values-th/strings.xml
index 9a88f92..9838003 100644
--- a/quickstep/res/values-th/strings.xml
+++ b/quickstep/res/values-th/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"ย้ายไปที่ด้านบนหรือด้านซ้าย"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"ย้ายไปที่ด้านล่างหรือด้านขวา"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"เปิดแอปเป็นบับเบิล"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"แอปล่าสุด"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"รายการแอปล่าสุด"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{แอปเพิ่มเติม}other{แอปเพิ่มเติม}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"เดสก์ท็อป"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> และ <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, รายการที่ <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> จาก <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-tl/strings.xml b/quickstep/res/values-tl/strings.xml
index f85cce4..52619b9 100644
--- a/quickstep/res/values-tl/strings.xml
+++ b/quickstep/res/values-tl/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Ilipat sa itaas/kaliwa"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Ilipat sa ibaba/kanan"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Buksan ang app bilang bubble"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Mga kamakailang app"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Kamakailang listahan ng app"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{pang app}one{pang app}other{pang app}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Desktop"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> at <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, item <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> ng <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-tr/strings.xml b/quickstep/res/values-tr/strings.xml
index c39a65f..f30205a 100644
--- a/quickstep/res/values-tr/strings.xml
+++ b/quickstep/res/values-tr/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Sol üste taşı"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Sağ alta taşı"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Uygulamayı balon olarak aç"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Son uygulamalar"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Son uygulama listesi"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{uygulama daha}other{uygulama daha}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Masaüstü"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> ve <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>/<xliff:g id="TOTAL_TASKS">%3$d</xliff:g> öğe"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-uk/strings.xml b/quickstep/res/values-uk/strings.xml
index 433e020..4cda8cf 100644
--- a/quickstep/res/values-uk/strings.xml
+++ b/quickstep/res/values-uk/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Перемістити вгору або вліво"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Перемістити вниз або вправо"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Відкрити додаток у спливаючому вікні"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Нещодавні додатки"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Список нещодавніх додатків"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{інший додаток}one{інший додаток}few{інші додатки}many{інших додатків}other{іншого додатка}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Комп’ютер"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> та <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, об’єкт <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> з <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-ur/strings.xml b/quickstep/res/values-ur/strings.xml
index 603760c..a5508d4 100644
--- a/quickstep/res/values-ur/strings.xml
+++ b/quickstep/res/values-ur/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"اوپر/بائیں طرف منتقل کریں"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"نیچے/دائیں طرف منتقل کریں"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"ایپ کو بطور ببل کھولیں"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"حالیہ ایپس"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"حالیہ ایپ کی فہرست"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{مزید ایپ}other{مزید ایپس}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"ڈیسک ٹاپ"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> اور <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>، آئٹم <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> از <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-uz/strings.xml b/quickstep/res/values-uz/strings.xml
index f289573..e091d69 100644
--- a/quickstep/res/values-uz/strings.xml
+++ b/quickstep/res/values-uz/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Yuqoriga yoki chapga oʻtkazish"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Pastga yoki oʻngga oʻtkazish"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Ilovani qalqib chiquvchi oynada ochish"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Oxirgi ilovalar"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Oxirgi ilovalar roʻyxati"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{boshqa ilova}other{boshqa ilovalar}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Kompyuter"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> va <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>-element, jami: <xliff:g id="TOTAL_TASKS">%3$d</xliff:g> ta"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-vi/strings.xml b/quickstep/res/values-vi/strings.xml
index d0f5252..44cfb44 100644
--- a/quickstep/res/values-vi/strings.xml
+++ b/quickstep/res/values-vi/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Chuyển lên trên cùng/sang bên trái"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Chuyển xuống dưới cùng/sang bên phải"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Mở ứng dụng dưới dạng bong bóng"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Các ứng dụng gần đây"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Danh sách ứng dụng gần đây"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{ứng dụng khác}other{ứng dụng khác}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Máy tính"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> và <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, mục <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> trong số <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-zh-rCN/strings.xml b/quickstep/res/values-zh-rCN/strings.xml
index 6548148..0494f54 100644
--- a/quickstep/res/values-zh-rCN/strings.xml
+++ b/quickstep/res/values-zh-rCN/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"移到顶部/左侧"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"移到底部/右侧"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"以气泡的形式打开应用"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"最近打开过的应用"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"“最近打开过的应用”列表"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{多个应用}other{多个应用}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"桌面模式"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g>和<xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>,第 <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> 项(共 <xliff:g id="TOTAL_TASKS">%3$d</xliff:g> 项)"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-zh-rHK/strings.xml b/quickstep/res/values-zh-rHK/strings.xml
index 0606463..d199ee1 100644
--- a/quickstep/res/values-zh-rHK/strings.xml
+++ b/quickstep/res/values-zh-rHK/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"移至上方/左側"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"移至底部/右側"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"在小視窗開啟應用程式"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"最近開啟的應用程式"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"「最近開啟的應用程式」清單"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{個其他應用程式}other{個其他應用程式}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"桌面"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"「<xliff:g id="APP_NAME_1">%1$s</xliff:g>」和「<xliff:g id="APP_NAME_2">%2$s</xliff:g>」"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>,第 <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> 個項目,總共有 <xliff:g id="TOTAL_TASKS">%3$d</xliff:g> 項"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-zh-rTW/strings.xml b/quickstep/res/values-zh-rTW/strings.xml
index 44c6fdf..7b9efb7 100644
--- a/quickstep/res/values-zh-rTW/strings.xml
+++ b/quickstep/res/values-zh-rTW/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"移到上方/左側"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"移到底部/右側"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"以泡泡形式開啟應用程式"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"最近開啟的應用程式"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"「最近開啟的應用程式」清單"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{個其他應用程式}other{個其他應用程式}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"電腦模式"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"「<xliff:g id="APP_NAME_1">%1$s</xliff:g>」和「<xliff:g id="APP_NAME_2">%2$s</xliff:g>」"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>,第 <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> 個項目,共 <xliff:g id="TOTAL_TASKS">%3$d</xliff:g> 項"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-zu/strings.xml b/quickstep/res/values-zu/strings.xml
index c666ee7..8d344e2 100644
--- a/quickstep/res/values-zu/strings.xml
+++ b/quickstep/res/values-zu/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Hamba phezulu/kwesokunxele"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Hamba phansi/kwesokudla"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Vula i-app njengebhamuza"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Ama-app wakamuva"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Uhlu lwe-app lwakamuva"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{i-app eyengeziwe}one{ama-app engeziwe}other{ama-app engeziwe}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Ideskithophu"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"I-<xliff:g id="APP_NAME_1">%1$s</xliff:g> ne-<xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"I-<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, into engu-<xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> kwezingu-<xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values/dimens.xml b/quickstep/res/values/dimens.xml
index cb3c446..86d44c9 100644
--- a/quickstep/res/values/dimens.xml
+++ b/quickstep/res/values/dimens.xml
@@ -82,9 +82,9 @@
<dimen name="task_thumbnail_icon_menu_drawable_touch_size">44dp</dimen>
<dimen name="task_thumbnail_icon_menu_elevation">4dp</dimen>
<!-- The size of the task thumbnail header -->
- <dimen name="task_thumbnail_header_padding_top_bottom">6dp</dimen>
- <dimen name="task_thumbnail_header_padding_start_end">12dp</dimen>
- <dimen name="task_thumbnail_header_margin_between_views">8dp</dimen>
+ <dimen name="task_thumbnail_header_height">30dp</dimen>
+ <dimen name="task_thumbnail_header_margin_edge">18dp</dimen>
+ <dimen name="task_thumbnail_header_margin_between_views">9dp</dimen>
<dimen name="task_thumbnail_header_icon_size">18dp</dimen>
<dimen name="task_thumbnail_header_round_corner_radius">16dp</dimen>
diff --git a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java
index 21af26e..548fbef 100644
--- a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java
+++ b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java
@@ -68,6 +68,7 @@
import static com.android.systemui.shared.Flags.returnAnimationFrameworkLibrary;
import static com.android.systemui.shared.system.QuickStepContract.getWindowCornerRadius;
import static com.android.systemui.shared.system.QuickStepContract.supportsRoundedCornersOnWindows;
+import static com.android.wm.shell.Flags.enableDynamicInsetsForAppLaunch;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
@@ -283,6 +284,8 @@
private final Interpolator mOpeningXInterpolator;
private final Interpolator mOpeningInterpolator;
+ private final SystemUiProxy mSystemUiProxy;
+
public QuickstepTransitionManager(Context context) {
mLauncher = Launcher.cast(Launcher.getLauncher(context));
mDragLayer = mLauncher.getDragLayer();
@@ -297,6 +300,7 @@
mMaxShadowRadius = res.getDimensionPixelSize(R.dimen.max_shadow_radius);
mLauncher.addOnDeviceProfileChangeListener(this);
+ mSystemUiProxy = SystemUiProxy.INSTANCE.get(mLauncher);
if (ENABLE_SHELL_STARTING_SURFACE) {
mTaskStartParams = new LinkedHashMap<>(MAX_NUM_TASKS) {
@@ -306,8 +310,7 @@
}
};
- SystemUiProxy.INSTANCE.get(mLauncher).setStartingWindowListener(
- mStartingWindowListener);
+ mSystemUiProxy.setStartingWindowListener(mStartingWindowListener);
}
mOpeningXInterpolator = AnimationUtils.loadInterpolator(context, R.interpolator.app_open_x);
@@ -522,12 +525,6 @@
4 - rotationChange);
}
}
- if (mDeviceProfile.isTaskbarPresentInApps
- && !target.willShowImeOnTarget
- && !isTransientTaskbar(mLauncher)) {
- // Animate to above the taskbar.
- bounds.bottom -= target.contentInsets.bottom;
- }
return bounds;
}
@@ -694,6 +691,13 @@
};
}
+ private boolean shouldCropToInset(RemoteAnimationTarget target) {
+ return enableDynamicInsetsForAppLaunch()
+ && mDeviceProfile.isTaskbarPresentInApps
+ && target != null && !target.willShowImeOnTarget
+ && !isTransientTaskbar(mLauncher);
+ }
+
/**
* @return Animator that controls the window of the opening targets from app icons.
*/
@@ -702,8 +706,19 @@
RemoteAnimationTarget[] wallpaperTargets,
RemoteAnimationTarget[] nonAppTargets,
boolean launcherClosing) {
+ RemoteAnimationTargets openingTargets = new RemoteAnimationTargets(appTargets,
+ wallpaperTargets, nonAppTargets, MODE_OPENING);
int rotationChange = getRotationChange(appTargets);
Rect windowTargetBounds = getWindowTargetBounds(appTargets, rotationChange);
+ final int[] bottomInsetPos = new int[]{
+ mSystemUiProxy.getHomeVisibilityState().getNavbarInsetPosition()};
+ final RemoteAnimationTarget target = openingTargets.getFirstAppTarget();
+ final boolean cropToInset = shouldCropToInset(target);
+ if (cropToInset) {
+ // Animate to above the taskbar.
+ windowTargetBounds.bottom = Math.min(bottomInsetPos[0],
+ windowTargetBounds.bottom);
+ }
boolean appTargetsAreTranslucent = areAllTargetsTranslucent(appTargets);
RectF launcherIconBounds = new RectF();
@@ -716,8 +731,6 @@
Rect crop = new Rect();
Matrix matrix = new Matrix();
- RemoteAnimationTargets openingTargets = new RemoteAnimationTargets(appTargets,
- wallpaperTargets, nonAppTargets, MODE_OPENING);
SurfaceTransactionApplier surfaceApplier =
new SurfaceTransactionApplier(floatingView);
openingTargets.addReleaseCheck(surfaceApplier);
@@ -823,6 +836,39 @@
@Override
public void onUpdate(float percent, boolean initOnly) {
+ if (cropToInset && bottomInsetPos[0] != mSystemUiProxy.getHomeVisibilityState()
+ .getNavbarInsetPosition()) {
+ final RemoteAnimationTarget target = openingTargets.getFirstAppTarget();
+ bottomInsetPos[0] = mSystemUiProxy.getHomeVisibilityState()
+ .getNavbarInsetPosition();
+ final Rect bounds = target != null
+ ? target.screenSpaceBounds : windowTargetBounds;
+ // Animate to above the taskbar.
+ int bottomLevel = Math.min(bottomInsetPos[0], bounds.bottom);
+ windowTargetBounds.bottom = bottomLevel;
+ final int endHeight = bottomLevel - bounds.top;
+
+ AnimOpenProperties prop = new AnimOpenProperties(mLauncher.getResources(),
+ mDeviceProfile, windowTargetBounds, launcherIconBounds, v,
+ dragLayerBounds[0], dragLayerBounds[1], hasSplashScreen,
+ floatingView.isDifferentFromAppIcon());
+ mCropRectCenterY = new FloatProp(prop.cropCenterYStart, prop.cropCenterYEnd,
+ mOpeningInterpolator);
+ mCropRectHeight = new FloatProp(prop.cropHeightStart, prop.cropHeightEnd,
+ mOpeningInterpolator);
+ mDy = new FloatProp(0, prop.dY, mOpeningInterpolator);
+ mIconScaleToFitScreen = new FloatProp(prop.initialAppIconScale,
+ prop.finalAppIconScale, mOpeningInterpolator);
+ float interpolatedPercent = mOpeningInterpolator.getInterpolation(percent);
+ mCropRectHeight.value = Utilities.mapRange(interpolatedPercent,
+ prop.cropHeightStart, prop.cropHeightEnd);
+ mCropRectCenterY.value = Utilities.mapRange(interpolatedPercent,
+ prop.cropCenterYStart, prop.cropCenterYEnd);
+ mDy.value = Utilities.mapRange(interpolatedPercent, 0, prop.dY);
+ mIconScaleToFitScreen.value = Utilities.mapRange(interpolatedPercent,
+ prop.initialAppIconScale, prop.finalAppIconScale);
+ }
+
// Calculate the size of the scaled icon.
float iconWidth = launcherIconBounds.width() * mIconScaleToFitScreen.value;
float iconHeight = launcherIconBounds.height() * mIconScaleToFitScreen.value;
diff --git a/quickstep/src/com/android/launcher3/statehandlers/DesktopVisibilityController.kt b/quickstep/src/com/android/launcher3/statehandlers/DesktopVisibilityController.kt
index 810fa6f..1ac2d7c 100644
--- a/quickstep/src/com/android/launcher3/statehandlers/DesktopVisibilityController.kt
+++ b/quickstep/src/com/android/launcher3/statehandlers/DesktopVisibilityController.kt
@@ -40,7 +40,8 @@
import com.android.quickstep.fallback.RecentsState
import com.android.wm.shell.desktopmode.DisplayDeskState
import com.android.wm.shell.desktopmode.IDesktopTaskListener.Stub
-import com.android.wm.shell.shared.desktopmode.DesktopModeStatus
+import com.android.wm.shell.shared.desktopmode.DesktopModeStatus.enableMultipleDesktops
+import com.android.wm.shell.shared.desktopmode.DesktopModeStatus.useRoundedCorners
import java.io.PrintWriter
import java.lang.ref.WeakReference
import javax.inject.Inject
@@ -89,8 +90,7 @@
private val taskbarDesktopModeListeners: MutableSet<TaskbarDesktopModeListener> = HashSet()
// This simply indicates that user is currently in desktop mode or not.
- var isInDesktopMode = false
- private set
+ @Deprecated("Does not work with multi-desks") private var isInDesktopModeDeprecated = false
// to track if any pending notification to be done.
var isNotifyingDesktopVisibilityPending = false
@@ -104,12 +104,16 @@
* Number of visible desktop windows in desktop mode. This can be > 0 when user goes to overview
* from desktop window mode.
*/
- var visibleDesktopTasksCount: Int = 0
+ @Deprecated("Does not work with multi-desks")
+ var visibleDesktopTasksCountDeprecated: Int = 0
/**
* Sets the number of desktop windows that are visible and updates launcher visibility based
* on it.
*/
set(visibleTasksCount) {
+ if (enableMultipleDesktops(context)) {
+ return
+ }
if (DEBUG) {
Log.d(
TAG,
@@ -121,11 +125,11 @@
}
if (visibleTasksCount != field) {
- if (visibleDesktopTasksCount == 0 && visibleTasksCount == 1) {
- isInDesktopMode = true
+ if (visibleDesktopTasksCountDeprecated == 0 && visibleTasksCount == 1) {
+ isInDesktopModeDeprecated = true
}
- if (visibleDesktopTasksCount == 1 && visibleTasksCount == 0) {
- isInDesktopMode = false
+ if (visibleDesktopTasksCountDeprecated == 1 && visibleTasksCount == 0) {
+ isInDesktopModeDeprecated = false
}
val wasVisible = field > 0
val isVisible = visibleTasksCount > 0
@@ -171,7 +175,7 @@
private var desktopTaskListener: DesktopTaskListenerImpl?
init {
- desktopTaskListener = DesktopTaskListenerImpl(this, context.displayId)
+ desktopTaskListener = DesktopTaskListenerImpl(this, context, context.displayId)
systemUiProxy.setDesktopTaskListener(desktopTaskListener)
lifecycleTracker.addCloseable {
@@ -185,7 +189,7 @@
* [INACTIVE_DESK_ID] if no desk is currently active or the multiple desks feature is disabled.
*/
fun getActiveDeskId(displayId: Int): Int {
- if (!DesktopModeStatus.enableMultipleDesktops(context)) {
+ if (!enableMultipleDesktops(context)) {
// When the multiple desks feature is disabled, callers should not rely on the concept
// of a desk ID.
return INACTIVE_DESK_ID
@@ -196,8 +200,8 @@
/** Returns whether a desk is currently active on the display with the given [displayId]. */
fun isInDesktopMode(displayId: Int): Boolean {
- if (!DesktopModeStatus.enableMultipleDesktops(context)) {
- return isInDesktopMode
+ if (!enableMultipleDesktops(context)) {
+ return isInDesktopModeDeprecated
}
val activeDeskId = getDisplayDeskConfig(displayId)?.activeDeskId ?: INACTIVE_DESK_ID
@@ -213,7 +217,7 @@
* Overview is not active.
*/
fun isInDesktopModeAndNotInOverview(displayId: Int): Boolean {
- if (!DesktopModeStatus.enableMultipleDesktops(context)) {
+ if (!enableMultipleDesktops(context)) {
return areDesktopTasksVisibleAndNotInOverview()
}
@@ -225,7 +229,7 @@
/** Whether desktop tasks are visible in desktop mode. */
private fun areDesktopTasksVisibleAndNotInOverview(): Boolean {
- val desktopTasksVisible: Boolean = visibleDesktopTasksCount > 0
+ val desktopTasksVisible: Boolean = visibleDesktopTasksCountDeprecated > 0
if (DEBUG) {
Log.d(
TAG,
@@ -309,7 +313,7 @@
inOverviewState = overviewStateEnabled
val areDesktopTasksVisibleNow = areDesktopTasksVisibleAndNotInOverview()
- if (!DesktopModeStatus.enableMultipleDesktops(context)) {
+ if (!enableMultipleDesktops(context)) {
if (wereDesktopTasksVisibleBefore != areDesktopTasksVisibleNow) {
notifyIsInDesktopModeChanged(DEFAULT_DISPLAY, areDesktopTasksVisibleNow)
}
@@ -504,7 +508,7 @@
displayDeskStates: Array<DisplayDeskState>,
canCreateDesks: Boolean,
) {
- if (!DesktopModeStatus.enableMultipleDesktops(context)) {
+ if (!enableMultipleDesktops(context)) {
return
}
@@ -527,7 +531,7 @@
?: null.also { Slog.e(TAG, "Expected non-null desk config for display: $displayId") }
private fun onCanCreateDesksChanged(canCreateDesks: Boolean) {
- if (!DesktopModeStatus.enableMultipleDesktops(context)) {
+ if (!enableMultipleDesktops(context)) {
return
}
@@ -535,7 +539,7 @@
}
private fun onDeskAdded(displayId: Int, deskId: Int) {
- if (!DesktopModeStatus.enableMultipleDesktops(context)) {
+ if (!enableMultipleDesktops(context)) {
return
}
@@ -549,7 +553,7 @@
}
private fun onDeskRemoved(displayId: Int, deskId: Int) {
- if (!DesktopModeStatus.enableMultipleDesktops(context)) {
+ if (!enableMultipleDesktops(context)) {
return
}
@@ -566,7 +570,7 @@
}
private fun onActiveDeskChanged(displayId: Int, newActiveDesk: Int, oldActiveDesk: Int) {
- if (!DesktopModeStatus.enableMultipleDesktops(context)) {
+ if (!enableMultipleDesktops(context)) {
return
}
@@ -626,7 +630,7 @@
pw.println(prefix + "DesktopVisibilityController:")
pw.println("$prefix\tdesktopVisibilityListeners=$desktopVisibilityListeners")
- pw.println("$prefix\tvisibleDesktopTasksCount=$visibleDesktopTasksCount")
+ pw.println("$prefix\tvisibleDesktopTasksCount=$visibleDesktopTasksCountDeprecated")
pw.println("$prefix\tinOverviewState=$inOverviewState")
pw.println("$prefix\tbackgroundStateEnabled=$backgroundStateEnabled")
pw.println("$prefix\tgestureInProgress=$gestureInProgress")
@@ -640,6 +644,7 @@
*/
private class DesktopTaskListenerImpl(
controller: DesktopVisibilityController,
+ @ApplicationContext private val context: Context,
private val displayId: Int,
) : Stub() {
private val controller = WeakReference(controller)
@@ -660,7 +665,7 @@
if (DEBUG) {
Log.d(TAG, "desktop visible tasks count changed=$visibleTasksCount")
}
- visibleDesktopTasksCount = visibleTasksCount
+ visibleDesktopTasksCountDeprecated = visibleTasksCount
}
}
}
@@ -670,7 +675,7 @@
}
override fun onTaskbarCornerRoundingUpdate(doesAnyTaskRequireTaskbarRounding: Boolean) {
- if (!DesktopModeStatus.useRoundedCorners()) return
+ if (!useRoundedCorners()) return
MAIN_EXECUTOR.execute {
controller.get()?.apply {
Log.d(
@@ -683,7 +688,10 @@
}
}
+ // TODO: b/402496827 - The multi-desks backend needs to be updated to call this API only
+ // once, not between desk switches.
override fun onEnterDesktopModeTransitionStarted(transitionDuration: Int) {
+ val controller = controller.get() ?: return
MAIN_EXECUTOR.execute {
Log.d(
TAG,
@@ -691,15 +699,19 @@
"duration= " +
transitionDuration),
)
- val controller = controller.get()
- if (controller != null && !controller.isInDesktopMode) {
- controller.isInDesktopMode = true
+ if (enableMultipleDesktops(context)) {
+ controller.notifyTaskbarDesktopModeListenersForEntry(transitionDuration)
+ } else if (!controller.isInDesktopModeDeprecated) {
+ controller.isInDesktopModeDeprecated = true
controller.notifyTaskbarDesktopModeListenersForEntry(transitionDuration)
}
}
}
+ // TODO: b/402496827 - The multi-desks backend needs to be updated to call this API only
+ // once, not between desk switches.
override fun onExitDesktopModeTransitionStarted(transitionDuration: Int) {
+ val controller = controller.get() ?: return
MAIN_EXECUTOR.execute {
Log.d(
TAG,
@@ -707,9 +719,10 @@
"duration= " +
transitionDuration),
)
- val controller = controller.get()
- if (controller != null && controller.isInDesktopMode) {
- controller.isInDesktopMode = false
+ if (enableMultipleDesktops(context)) {
+ controller.notifyTaskbarDesktopModeListenersForExit(transitionDuration)
+ } else if (controller.isInDesktopModeDeprecated) {
+ controller.isInDesktopModeDeprecated = false
controller.notifyTaskbarDesktopModeListenersForExit(transitionDuration)
}
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/BarsLocationAnimatorHelper.kt b/quickstep/src/com/android/launcher3/taskbar/BarsLocationAnimatorHelper.kt
index b8060e1..ad847b4 100644
--- a/quickstep/src/com/android/launcher3/taskbar/BarsLocationAnimatorHelper.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/BarsLocationAnimatorHelper.kt
@@ -20,6 +20,7 @@
import android.animation.AnimatorSet
import android.animation.ObjectAnimator
import android.animation.ValueAnimator
+import android.content.Context
import android.view.View
import androidx.dynamicanimation.animation.SpringForce
import com.android.app.animation.Interpolators
@@ -30,11 +31,10 @@
/** Animator helper that creates bars animators. */
object BarsLocationAnimatorHelper {
-
- private const val FADE_OUT_ANIM_ALPHA_DURATION_MS: Long = 50L
- private const val FADE_OUT_ANIM_ALPHA_DELAY_MS: Long = 50L
- private const val FADE_OUT_ANIM_POSITION_DURATION_MS: Long = 100L
- private const val FADE_IN_ANIM_ALPHA_DURATION_MS: Long = 100L
+ const val FADE_OUT_ANIM_ALPHA_DURATION_MS: Long = 50L
+ const val FADE_OUT_ANIM_ALPHA_DELAY_MS: Long = 50L
+ const val FADE_OUT_ANIM_POSITION_DURATION_MS: Long = 100L
+ const val FADE_IN_ANIM_ALPHA_DURATION_MS: Long = 100L
// Use STIFFNESS_MEDIUMLOW which is not defined in the API constants
private const val FADE_IN_ANIM_POSITION_SPRING_STIFFNESS: Float = 400f
@@ -45,13 +45,13 @@
// During fade in animation we shift the bubble bar 1/60th of the screen width
private const val FADE_IN_ANIM_POSITION_SHIFT: Float = 1 / 60f
- private val View.screenWidth: Int
+ private val Context.screenWidth: Int
get() = resources.displayMetrics.widthPixels
- private val View.outShift: Float
+ val Context.outShift: Float
get() = screenWidth * FADE_OUT_ANIM_POSITION_SHIFT
- private val View.inShiftX: Float
+ val Context.inShiftX: Float
get() = screenWidth * FADE_IN_ANIM_POSITION_SHIFT
/**
@@ -108,7 +108,7 @@
targetViewAlphaAnim: ObjectAnimator,
bubbleBarView: View,
): Animator {
- val shift: Float = bubbleBarView.outShift
+ val shift: Float = bubbleBarView.context.outShift
val onLeft = newLocation.isOnLeft(bubbleBarView.isLayoutRtl)
val startTx: Float
@@ -132,15 +132,19 @@
return createLocationInAnimator(startTx, finalTx, targetViewAlphaAnim, bubbleBarView)
}
- /** Creates an animator for the bubble bar view out part. */
+ /**
+ * Creates an animator for the bubble bar view out part.
+ *
+ * @param targetLocation the location bubble bar should animate to.
+ */
@JvmStatic
fun getBubbleBarLocationOutAnimator(
bubbleBarView: View,
- bubbleBarLocation: BubbleBarLocation,
+ targetLocation: BubbleBarLocation,
targetViewAlphaAnim: ObjectAnimator,
): Animator {
- val onLeft = bubbleBarLocation.isOnLeft(bubbleBarView.isLayoutRtl)
- val shift = bubbleBarView.outShift
+ val onLeft = targetLocation.isOnLeft(bubbleBarView.isLayoutRtl)
+ val shift = bubbleBarView.context.outShift
val finalTx = bubbleBarView.translationX + (if (onLeft) -shift else shift)
return this.createLocationOutAnimator(finalTx, targetViewAlphaAnim, bubbleBarView)
}
@@ -152,7 +156,7 @@
navButtonsView: View,
navBarTargetTranslationX: Float,
): Animator {
- val outShift: Float = navButtonsView.outShift
+ val outShift: Float = navButtonsView.context.outShift
val isNavBarOnRight: Boolean = location.isOnLeft(navButtonsView.isLayoutRtl)
val finalOutTx =
navButtonsView.translationX + (if (isNavBarOnRight) outShift else -outShift)
@@ -162,7 +166,7 @@
ObjectAnimator.ofFloat(navButtonsView, LauncherAnimUtils.VIEW_ALPHA, 0f),
navButtonsView,
)
- val inShift: Float = navButtonsView.inShiftX
+ val inShift: Float = navButtonsView.context.inShiftX
val inStartX = navBarTargetTranslationX + (if (isNavBarOnRight) -inShift else inShift)
val fadeIn: Animator =
createLocationInAnimator(
diff --git a/quickstep/src/com/android/launcher3/taskbar/BaseTaskbarContext.java b/quickstep/src/com/android/launcher3/taskbar/BaseTaskbarContext.java
index aa3feb7..b82e6ed 100644
--- a/quickstep/src/com/android/launcher3/taskbar/BaseTaskbarContext.java
+++ b/quickstep/src/com/android/launcher3/taskbar/BaseTaskbarContext.java
@@ -23,7 +23,7 @@
import com.android.launcher3.popup.SystemShortcut;
import com.android.launcher3.util.BaseContext;
-import com.android.launcher3.util.DisplayController;
+import com.android.launcher3.util.NavigationMode;
import com.android.launcher3.util.Themes;
import com.android.quickstep.SystemUiProxy;
@@ -33,21 +33,49 @@
implements SystemShortcut.BubbleActivityStarter {
protected final LayoutInflater mLayoutInflater;
- private final boolean mIsPrimaryDisplay;
public BaseTaskbarContext(Context windowContext, boolean isPrimaryDisplay) {
super(windowContext, Themes.getActivityThemeRes(windowContext));
mLayoutInflater = LayoutInflater.from(this).cloneInContext(this);
- mIsPrimaryDisplay = isPrimaryDisplay;
}
- public boolean isTransientTaskbar() {
- return DisplayController.isTransientTaskbar(this) && mIsPrimaryDisplay;
- }
+ /**
+ * Returns whether taskbar is transient or persistent. External displays will be persistent.
+ *
+ * @return {@code true} if transient, {@code false} if persistent.
+ */
+ public abstract boolean isTransientTaskbar();
- public boolean isPrimaryDisplay() {
- return mIsPrimaryDisplay;
- }
+ /**
+ * Returns whether the taskbar is pinned in gesture navigation mode.
+ */
+ public abstract boolean isPinnedTaskbar();
+
+ /**
+ * Returns the current navigation mode. External displays will be in THREE_BUTTONS mode.
+ */
+ public abstract NavigationMode getNavigationMode();
+
+ /**
+ * Returns whether the taskbar is in desktop mode.
+ */
+ public abstract boolean isInDesktopMode();
+
+ /**
+ * Returns whether the taskbar is forced to be pinned when home is visible.
+ */
+ public abstract boolean showLockedTaskbarOnHome();
+
+ /**
+ * Returns whether desktop taskbar (pinned taskbar that shows desktop tasks) is to be used on
+ * the display because the display is a freeform display.
+ */
+ public abstract boolean showDesktopTaskbarForFreeformDisplay();
+
+ /**
+ * Returns whether the taskbar is displayed on primary or external display.
+ */
+ public abstract boolean isPrimaryDisplay();
@Override
public final LayoutInflater getLayoutInflater() {
diff --git a/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java
index d6327bc..5b1e859 100644
--- a/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java
@@ -26,11 +26,15 @@
import com.android.launcher3.popup.SystemShortcut;
import com.android.launcher3.statemanager.StateManager;
import com.android.launcher3.statemanager.StatefulContainer;
+import com.android.quickstep.FallbackActivityInterface;
+import com.android.quickstep.GestureState;
+import com.android.quickstep.RecentsAnimationCallbacks;
import com.android.quickstep.TopTaskTracker;
import com.android.quickstep.fallback.RecentsState;
import com.android.quickstep.views.RecentsView;
import com.android.quickstep.views.RecentsViewContainer;
+import java.io.PrintWriter;
import java.util.stream.Stream;
/**
@@ -92,11 +96,19 @@
mRecentsContainer.getStateManager().removeStateListener(mStateListener);
}
+ @Nullable
+ @Override
+ public Animator getParallelAnimationToGestureEndTarget(GestureState.GestureEndTarget endTarget,
+ long duration, RecentsAnimationCallbacks callbacks) {
+ return createAnimToRecentsState(
+ FallbackActivityInterface.INSTANCE.stateFromGestureEndTarget(endTarget), duration);
+ }
+
/**
* Creates an animation to animate the taskbar for the given state (but does not start it).
* Currently this animation just force stashes the taskbar in Overview.
*/
- public Animator createAnimToRecentsState(RecentsState toState, long duration) {
+ private Animator createAnimToRecentsState(RecentsState toState, long duration) {
// Force stash taskbar (disallow unstashing) when:
// - in a 3P launcher or overview task.
// - not running in a test harness (unstash is needed for tests)
@@ -134,7 +146,8 @@
private boolean isIn3pHomeOrRecents() {
TopTaskTracker.CachedTaskInfo topTask = TopTaskTracker.INSTANCE
- .get(mControllers.taskbarActivityContext).getCachedTopTask(true);
+ .get(mControllers.taskbarActivityContext).getCachedTopTask(true,
+ mRecentsContainer.asContext().getDisplayId());
return topTask.isHomeTask() || topTask.isRecentsTask();
}
@@ -142,4 +155,12 @@
protected String getTaskbarUIControllerName() {
return "FallbackTaskbarUIController<" + mRecentsContainer.getClass().getSimpleName() + ">";
}
+
+ @Override
+ protected void dumpLogs(String prefix, PrintWriter pw) {
+ super.dumpLogs(prefix, pw);
+
+ pw.println(String.format("%s\tRecentsState=%s", prefix,
+ mRecentsContainer.getStateManager().getState()));
+ }
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java
index 6e210e3..3d5e214 100644
--- a/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java
@@ -48,11 +48,16 @@
import com.android.launcher3.util.DisplayController;
import com.android.launcher3.util.MultiPropertyFactory;
import com.android.launcher3.util.OnboardingPrefs;
+import com.android.quickstep.GestureState;
import com.android.quickstep.HomeVisibilityState;
+import com.android.quickstep.LauncherActivityInterface;
import com.android.quickstep.RecentsAnimationCallbacks;
import com.android.quickstep.SystemUiProxy;
+import com.android.quickstep.fallback.window.RecentsDisplayModel;
+import com.android.quickstep.fallback.window.RecentsWindowFlags;
import com.android.quickstep.util.SplitTask;
import com.android.quickstep.views.RecentsView;
+import com.android.quickstep.views.RecentsViewContainer;
import com.android.systemui.shared.system.QuickStepContract.SystemUiStateFlags;
import com.android.wm.shell.shared.bubbles.BubbleBarLocation;
import com.android.wm.shell.shared.desktopmode.DesktopModeStatus;
@@ -100,6 +105,8 @@
// Initialized in init.
private final TaskbarLauncherStateController
mTaskbarLauncherStateController = new TaskbarLauncherStateController();
+ // When overview-in-a-window is enabled, that window is the container, else it is mLauncher.
+ private RecentsViewContainer mRecentsViewContainer;
public LauncherTaskbarUIController(QuickstepLauncher launcher) {
mLauncher = launcher;
@@ -112,8 +119,19 @@
mTaskbarLauncherStateController.init(mControllers, mLauncher,
mControllers.getSharedState().sysuiStateFlags);
-
+ final TaskbarActivityContext taskbarContext = mControllers.taskbarActivityContext;
+ if (RecentsWindowFlags.getEnableOverviewInWindow()) {
+ mRecentsViewContainer = RecentsDisplayModel.getINSTANCE()
+ .get(taskbarContext).getRecentsWindowManager(taskbarContext.getDisplayId());
+ }
+ if (mRecentsViewContainer == null) {
+ mRecentsViewContainer = mLauncher;
+ }
mLauncher.setTaskbarUIController(this);
+ if (mRecentsViewContainer != mLauncher) {
+ mRecentsViewContainer.setTaskbarUIController(this);
+ }
+
mHomeState.addListener(mVisibilityChangeListener);
onLauncherVisibilityChanged(
Flags.useActivityOverlay()
@@ -142,6 +160,9 @@
mTaskbarLauncherStateController.onDestroy();
mLauncher.setTaskbarUIController(null);
+ if (mRecentsViewContainer != mLauncher) {
+ mRecentsViewContainer.setTaskbarUIController(null);
+ }
mHomeState.removeListener(mVisibilityChangeListener);
}
@@ -203,13 +224,18 @@
*/
@Override
public void onLauncherVisibilityChanged(boolean isVisible) {
- if (DesktopModeStatus.enterDesktopByDefaultOnFreeformDisplay(mLauncher)) {
+ if (DesktopModeStatus.enterDesktopByDefaultOnFreeformDisplay(mLauncher)
+ && mControllers.taskbarActivityContext.isPrimaryDisplay()) {
DisplayController.INSTANCE.get(mLauncher).notifyConfigChange();
}
+
onLauncherVisibilityChanged(isVisible, false /* fromInit */);
}
private void onLauncherVisibilityChanged(boolean isVisible, boolean fromInitOrDestroy) {
+ if (mControllers == null) {
+ return;
+ }
onLauncherVisibilityChanged(
isVisible,
fromInitOrDestroy,
@@ -223,11 +249,12 @@
if (!Flags.predictiveBackToHomePolish()) {
shouldOverrideToFastAnimation |= mLauncher.getPredictiveBackToHomeInProgress();
}
- boolean isPinnedTaskbar = DisplayController.isPinnedTaskbar(mLauncher);
- if (isVisible || isPinnedTaskbar) {
- return getTaskbarToHomeDuration(shouldOverrideToFastAnimation, isPinnedTaskbar);
+
+ boolean isPinned = mControllers.taskbarActivityContext.isPinnedTaskbar();
+ if (isVisible || isPinned) {
+ return getTaskbarToHomeDuration(shouldOverrideToFastAnimation, isPinned);
} else {
- return mControllers.taskbarActivityContext.isTransientTaskbar()
+ return (mControllers.taskbarActivityContext.isTransientTaskbar())
? TRANSIENT_TASKBAR_TRANSITION_DURATION : TASKBAR_TO_APP_DURATION;
}
}
@@ -238,7 +265,7 @@
// Launcher is resumed during the swipe-to-overview gesture under shell-transitions, so
// avoid updating taskbar state in that situation (when it's non-interactive -- or
// "background") to avoid premature animations.
- LauncherState state = mLauncher.getStateManager().getState();
+ LauncherState state = mTaskbarLauncherStateController.getLauncherState();
boolean nonInteractiveState = state.hasFlag(FLAG_NON_INTERACTIVE)
&& !state.isTaskbarAlignedWithHotseat(mLauncher);
if (isVisible && (nonInteractiveState || mSkipLauncherVisibilityChange)) {
@@ -294,13 +321,16 @@
/**
* Create Taskbar animation when going from an app to Launcher as part of recents transition.
- * @param toState If known, the state we will end up in when reaching Launcher.
- * @param callbacks callbacks to track the recents animation lifecycle. The state change is
- * automatically reset once the recents animation finishes
+ * {@inheritDoc}
*/
- public Animator createAnimToLauncher(@NonNull LauncherState toState,
- @NonNull RecentsAnimationCallbacks callbacks, long duration) {
- return mTaskbarLauncherStateController.createAnimToLauncher(toState, callbacks, duration);
+ @Override
+ public Animator getParallelAnimationToGestureEndTarget(
+ GestureState.GestureEndTarget gestureEndTarget, long duration,
+ RecentsAnimationCallbacks callbacks) {
+ return mTaskbarLauncherStateController.createAnimToLauncher(
+ LauncherActivityInterface.INSTANCE.stateFromGestureEndTarget(gestureEndTarget),
+ callbacks,
+ duration);
}
/**
@@ -507,7 +537,7 @@
@Override
public RecentsView getRecentsView() {
- return mLauncher.getOverviewPanel();
+ return mRecentsViewContainer.getOverviewPanel();
}
@Override
@@ -536,6 +566,7 @@
"WIDGETS_PAGE_PROGRESS_INDEX",
"SYSUI_SURFACE_PROGRESS_INDEX",
"LAUNCHER_PAUSE_PROGRESS_INDEX");
+ pw.println(String.format("%s\tmRecentsWindowContainer=%s", prefix, mRecentsViewContainer));
mTaskbarLauncherStateController.dumpLogs(prefix + "\t", pw);
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java
index 7d2dc71..cf3b952 100644
--- a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java
@@ -72,6 +72,7 @@
import android.graphics.drawable.PaintDrawable;
import android.graphics.drawable.RotateDrawable;
import android.inputmethodservice.InputMethodService;
+import android.os.Bundle;
import android.os.Handler;
import android.os.SystemProperties;
import android.util.Property;
@@ -84,6 +85,7 @@
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.WindowManager;
+import android.view.accessibility.AccessibilityNodeInfo;
import android.view.inputmethod.Flags;
import android.widget.FrameLayout;
import android.widget.ImageView;
@@ -682,12 +684,20 @@
/**
* Sets the AccessibilityDelegate for the back button.
+ *
+ * When setting a back button accessibility delegate, make sure to not dispatch any duplicate
+ * click events. Click events get injected in the internal accessibility delegate in
+ * {@link #setupBackButtonAccessibility(View, AccessibilityDelegate)}.
*/
public void setBackButtonAccessibilityDelegate(AccessibilityDelegate accessibilityDelegate) {
if (mBackButton == null) {
return;
}
- mBackButton.setAccessibilityDelegate(accessibilityDelegate);
+ if (predictiveBackThreeButtonNav()) {
+ setupBackButtonAccessibility(mBackButton, accessibilityDelegate);
+ } else {
+ mBackButton.setAccessibilityDelegate(accessibilityDelegate);
+ }
}
public void setWallpaperVisible(boolean isVisible) {
@@ -879,6 +889,7 @@
navButtonController.getButtonContentDescription(buttonType)));
if (predictiveBackThreeButtonNav() && buttonType == BUTTON_BACK) {
// set up special touch listener for back button to support predictive back
+ setupBackButtonAccessibility(buttonView, null);
setBackButtonTouchListener(buttonView, navButtonController);
// Set this View clickable, so that NearestTouchFrame.java forwards closeby touches to
// this View
@@ -892,6 +903,28 @@
return buttonView;
}
+ private void setupBackButtonAccessibility(View backButton,
+ AccessibilityDelegate accessibilityDelegate) {
+ View.AccessibilityDelegate backButtonAccessibilityDelegate =
+ new View.AccessibilityDelegate() {
+ @Override
+ public boolean performAccessibilityAction(View host, int action, Bundle args) {
+ if (accessibilityDelegate != null) {
+ accessibilityDelegate.performAccessibilityAction(host, action, args);
+ }
+ if (action == AccessibilityNodeInfo.ACTION_CLICK) {
+ mControllers.navButtonController.sendBackKeyEvent(KeyEvent.ACTION_DOWN,
+ /*cancelled*/ false);
+ mControllers.navButtonController.sendBackKeyEvent(KeyEvent.ACTION_UP,
+ /*cancelled*/ false);
+ return true;
+ }
+ return super.performAccessibilityAction(host, action, args);
+ }
+ };
+ backButton.setAccessibilityDelegate(backButtonAccessibilityDelegate);
+ }
+
private void setBackButtonTouchListener(View buttonView,
TaskbarNavButtonController navButtonController) {
final RectF rect = new RectF();
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
index 018903e..fc93d4a 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
@@ -417,9 +417,41 @@
dispatchDeviceProfileChanged();
}
- /** Returns whether current taskbar is transient. */
+ @Override
public boolean isTransientTaskbar() {
- return super.isTransientTaskbar() && !isPhoneMode();
+ return DisplayController.isTransientTaskbar(this) && mIsPrimaryDisplay && !isPhoneMode();
+ }
+
+ @Override
+ public boolean isPinnedTaskbar() {
+ return DisplayController.isPinnedTaskbar(this);
+ }
+
+ @Override
+ public NavigationMode getNavigationMode() {
+ return isPrimaryDisplay() ? DisplayController.getNavigationMode(this)
+ : NavigationMode.THREE_BUTTONS;
+ }
+
+ @Override
+ public boolean isInDesktopMode() {
+ return mControllers != null
+ && mControllers.taskbarDesktopModeController.isInDesktopMode(getDisplayId());
+ }
+
+ @Override
+ public boolean showLockedTaskbarOnHome() {
+ return DisplayController.showLockedTaskbarOnHome(this);
+ }
+
+ @Override
+ public boolean showDesktopTaskbarForFreeformDisplay() {
+ return DisplayController.showDesktopTaskbarForFreeformDisplay(this);
+ }
+
+ @Override
+ public boolean isPrimaryDisplay() {
+ return mIsPrimaryDisplay;
}
/**
@@ -455,9 +487,7 @@
.setIsTransientTaskbar(true)
.build();
}
- mNavMode = (DesktopExperienceFlags.ENABLE_TASKBAR_CONNECTED_DISPLAYS.isTrue()
- && !mIsPrimaryDisplay) ? NavigationMode.THREE_BUTTONS
- : DisplayController.getNavigationMode(this);
+ mNavMode = getNavigationMode();
}
/** Called when the visibility of the bubble bar changed. */
@@ -666,8 +696,7 @@
*/
public WindowManager.LayoutParams createDefaultWindowLayoutParams(int type, String title) {
int windowFlags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
- | WindowManager.LayoutParams.FLAG_SLIPPERY
- | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH;
+ | WindowManager.LayoutParams.FLAG_SLIPPERY;
boolean watchOutside = isTransientTaskbar() || isThreeButtonNav();
if (watchOutside && !isRunningInTestHarness()) {
windowFlags |= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
@@ -1426,11 +1455,6 @@
mControllers.uiController.startSplitSelection(splitSelectSource);
}
- boolean isInDesktopMode() {
- return mControllers != null
- && mControllers.taskbarDesktopModeController.isInDesktopMode(getDisplayId());
- }
-
protected void onTaskbarIconClicked(View view) {
TaskbarUIController taskbarUIController = mControllers.uiController;
RecentsView recents = taskbarUIController.getRecentsView();
@@ -1569,8 +1593,7 @@
} else if (tag instanceof AppInfo) {
// Tapping an item in AllApps
AppInfo info = (AppInfo) tag;
- if (recents != null
- && taskbarUIController.getRecentsView().isSplitSelectionActive()) {
+ if (recents != null && recents.isSplitSelectionActive()) {
// If we are selecting a second app for split, launch the split tasks
taskbarUIController.triggerSecondAppForSplit(info, info.intent, view);
} else {
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarDesktopModeController.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarDesktopModeController.kt
index ca8e4ca..e96e67d 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarDesktopModeController.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarDesktopModeController.kt
@@ -20,7 +20,6 @@
import com.android.launcher3.statehandlers.DesktopVisibilityController
import com.android.launcher3.statehandlers.DesktopVisibilityController.TaskbarDesktopModeListener
import com.android.launcher3.taskbar.TaskbarBackgroundRenderer.Companion.MAX_ROUNDNESS
-import com.android.launcher3.util.DisplayController
/** Handles Taskbar in Desktop Windowing mode. */
class TaskbarDesktopModeController(
@@ -30,9 +29,6 @@
private lateinit var taskbarControllers: TaskbarControllers
private lateinit var taskbarSharedState: TaskbarSharedState
- val isInDesktopMode: Boolean
- get() = desktopVisibilityController.isInDesktopMode
-
fun init(controllers: TaskbarControllers, sharedState: TaskbarSharedState) {
taskbarControllers = controllers
taskbarSharedState = sharedState
@@ -52,9 +48,10 @@
}
fun shouldShowDesktopTasksInTaskbar(): Boolean {
+ val activityContext = taskbarControllers.taskbarActivityContext
return isInDesktopMode(context.displayId) ||
- DisplayController.showDesktopTaskbarForFreeformDisplay(context) ||
- (DisplayController.showLockedTaskbarOnHome(context) &&
+ activityContext.showDesktopTaskbarForFreeformDisplay() ||
+ (activityContext.showLockedTaskbarOnHome() &&
taskbarControllers.taskbarStashController.isOnHome)
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java
index 142f458..4b977e0 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java
@@ -510,6 +510,8 @@
} else {
// This will take care of calling maybeOnDragEnd() after the animation
animateGlobalDragViewToOriginalPosition(btv, dragEvent);
+ //TODO(b/399678274): hide drop target in shell
+ notifyBubbleBarItemDragCanceled();
}
mActivity.getDragLayer().setOnDragListener(null);
@@ -536,10 +538,10 @@
mControllers.taskbarAutohideSuspendController.updateFlag(
TaskbarAutohideSuspendController.FLAG_AUTOHIDE_SUSPEND_DRAGGING, false);
mActivity.onDragEnd();
+ // If an item is dropped on the bubble bar, the bubble bar handles the drop,
+ // so it should not collapse along with the taskbar.
+ boolean droppedOnBubbleBar = notifyBubbleBarItemDropped();
if (mReturnAnimator == null) {
- // If an item is dropped on the bubble bar, the bubble bar handles the drop,
- // so it should not collapse along with the taskbar.
- boolean droppedOnBubbleBar = notifyBubbleBarItemDropped();
// Upon successful drag, immediately stash taskbar.
// Note, this must be done last to ensure no AutohideSuspendFlags are active, as
// that will prevent us from stashing until the timeout.
@@ -563,12 +565,17 @@
BubbleBarViewController bubbleBarViewController = bc.bubbleBarViewController;
boolean showingDropTarget = bubbleBarViewController.isShowingDropTarget();
if (showingDropTarget) {
- bubbleBarViewController.onItemDroppedInBubbleBarDragZone();
+ bubbleBarViewController.onItemDragCompleted();
}
return showingDropTarget;
}).orElse(false);
}
+ private void notifyBubbleBarItemDragCanceled() {
+ mControllers.bubbleControllers.ifPresent(bc ->
+ bc.bubbleBarViewController.onItemDraggedOutsideBubbleBarDropZone());
+ }
+
@Override
protected void endDrag() {
if (mDisallowGlobalDrag && !mIsDropHandledByDropTarget) {
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarEduTooltipController.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarEduTooltipController.kt
index 7a23006..038e374 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarEduTooltipController.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarEduTooltipController.kt
@@ -44,7 +44,6 @@
import com.android.launcher3.config.FeatureFlags.enableTaskbarPinning
import com.android.launcher3.taskbar.TaskbarAutohideSuspendController.FLAG_AUTOHIDE_SUSPEND_EDU_OPEN
import com.android.launcher3.taskbar.TaskbarControllers.LoggableTaskbarController
-import com.android.launcher3.util.DisplayController
import com.android.launcher3.util.OnboardingPrefs.TASKBAR_EDU_TOOLTIP_STEP
import com.android.launcher3.util.OnboardingPrefs.TASKBAR_SEARCH_EDU_SEEN
import com.android.launcher3.util.ResourceBasedOverride
@@ -319,7 +318,7 @@
fun maybeShowSearchEdu() {
if (
!enableTaskbarPinning() ||
- !DisplayController.isPinnedTaskbar(activityContext) ||
+ !activityContext.isPinnedTaskbar ||
!isTooltipEnabled ||
!shouldShowSearchEdu ||
userHasSeenSearchEdu ||
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarHoverToolTipController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarHoverToolTipController.java
index b7000db..76489e0 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarHoverToolTipController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarHoverToolTipController.java
@@ -19,6 +19,7 @@
import static android.view.MotionEvent.ACTION_HOVER_EXIT;
import static android.view.View.ALPHA;
+import static com.android.launcher3.AbstractFloatingView.TYPE_ACTION_POPUP;
import static com.android.launcher3.AbstractFloatingView.TYPE_FOLDER;
import static com.android.launcher3.taskbar.TaskbarAutohideSuspendController.FLAG_AUTOHIDE_SUSPEND_HOVERING_ICONS;
@@ -98,20 +99,18 @@
@Override
public boolean onHover(View v, MotionEvent event) {
- boolean isFolderOpen = AbstractFloatingView.hasOpenView(mActivity, TYPE_FOLDER);
// If hover leaves a taskbar icon animate the tooltip closed.
if (event.getAction() == ACTION_HOVER_EXIT) {
mHoverToolTipView.close(/* animate= */ false);
mActivity.setAutohideSuspendFlag(FLAG_AUTOHIDE_SUSPEND_HOVERING_ICONS, false);
- } else if (!isFolderOpen && event.getAction() == ACTION_HOVER_ENTER) {
- // Do not reveal if any floating views such as folders or edu pop-ups are open.
- revealHoverToolTip();
+ } else if (event.getAction() == ACTION_HOVER_ENTER) {
+ maybeRevealHoverToolTip();
mActivity.setAutohideSuspendFlag(FLAG_AUTOHIDE_SUSPEND_HOVERING_ICONS, true);
}
return false;
}
- private void revealHoverToolTip() {
+ private void maybeRevealHoverToolTip() {
if (mHoverView == null || mToolTipText == null) {
return;
}
@@ -122,6 +121,12 @@
if (mHoverView instanceof FolderIcon && !((FolderIcon) mHoverView).getIconVisible()) {
return;
}
+ // Do not reveal if floating views such as folders or app pop-ups are open,
+ // as these views will overlap and not look great.
+ if (AbstractFloatingView.hasOpenView(mActivity, TYPE_FOLDER | TYPE_ACTION_POPUP)) {
+ return;
+ }
+
Rect iconViewBounds = Utilities.getViewBounds(mHoverView);
mHoverToolTipView.showAtLocation(mToolTipText, iconViewBounds.centerX(),
mTaskbarView.getTop() - mYOffset, /* shouldAutoClose= */ false);
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt
index 3af2ab6..cc6cc64 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt
@@ -51,7 +51,6 @@
import com.android.launcher3.config.FeatureFlags.enableTaskbarNoRecreate
import com.android.launcher3.taskbar.TaskbarControllers.LoggableTaskbarController
import com.android.launcher3.testing.shared.ResourceUtils
-import com.android.launcher3.util.DisplayController
import com.android.launcher3.util.Executors
import java.io.PrintWriter
import kotlin.jvm.optionals.getOrNull
@@ -150,7 +149,7 @@
if (
taskbarStashController.isInApp ||
controllers.uiController.isInOverviewUi ||
- DisplayController.showLockedTaskbarOnHome(context)
+ context.showLockedTaskbarOnHome()
) {
// only add the taskbar touch region if not on home
val bottom = windowLayoutParams.height
@@ -349,13 +348,17 @@
controllers.bubbleControllers.isPresent &&
controllers.bubbleControllers.get().bubbleBarViewController.isBubbleBarVisible()
var insetsIsTouchableRegion = true
+ // Prevents the taskbar from taking touches and conflicting with setup wizard
if (
context.isPhoneButtonNavMode &&
+ context.isUserSetupComplete &&
(!controllers.navbarButtonsViewController.isImeVisible ||
!controllers.navbarButtonsViewController.isImeRenderingNavButtons)
) {
insetsInfo.setTouchableInsets(TOUCHABLE_INSETS_FRAME)
insetsIsTouchableRegion = false
+ debugTouchableRegion.lastSetTouchableReason =
+ "Phone button nav mode: Fullscreen touchable, IME not affecting nav buttons"
} else if (context.dragLayer.alpha < AlphaUpdateListener.ALPHA_CUTOFF_THRESHOLD) {
// Let touches pass through us.
insetsInfo.setTouchableInsets(TOUCHABLE_INSETS_REGION)
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java
index b510e7e..77c3e0a 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java
@@ -33,6 +33,7 @@
import static com.android.launcher3.taskbar.bubbles.BubbleBarView.FADE_OUT_ANIM_POSITION_DURATION_MS;
import static com.android.launcher3.util.FlagDebugUtils.appendFlag;
import static com.android.launcher3.util.FlagDebugUtils.formatFlagChange;
+import static com.android.quickstep.fallback.RecentsStateUtilsKt.toLauncherState;
import static com.android.quickstep.util.SystemUiFlagUtils.isTaskbarHidden;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_AWAKE;
@@ -40,7 +41,6 @@
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
-import android.content.Context;
import android.os.SystemClock;
import android.util.Log;
import android.view.animation.Interpolator;
@@ -61,10 +61,13 @@
import com.android.launcher3.statemanager.StateManager;
import com.android.launcher3.taskbar.bubbles.stashing.BubbleStashController.BubbleLauncherState;
import com.android.launcher3.uioverrides.QuickstepLauncher;
-import com.android.launcher3.util.DisplayController;
import com.android.launcher3.util.MultiPropertyFactory.MultiProperty;
import com.android.quickstep.RecentsAnimationCallbacks;
import com.android.quickstep.RecentsAnimationController;
+import com.android.quickstep.fallback.RecentsState;
+import com.android.quickstep.fallback.window.RecentsDisplayModel;
+import com.android.quickstep.fallback.window.RecentsWindowFlags;
+import com.android.quickstep.fallback.window.RecentsWindowManager;
import com.android.quickstep.util.ScalingWorkspaceRevealAnim;
import com.android.quickstep.util.SystemUiFlagUtils;
import com.android.quickstep.views.RecentsView;
@@ -76,6 +79,7 @@
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.StringJoiner;
+import java.util.function.Consumer;
/**
* Track LauncherState, RecentsAnimation, resumed state for task bar in one place here and animate
@@ -211,7 +215,7 @@
};
private final StateManager.StateListener<LauncherState> mStateListener =
- new StateManager.StateListener<LauncherState>() {
+ new StateManager.StateListener<>() {
@Override
public void onStateTransitionStart(LauncherState toState) {
@@ -225,11 +229,9 @@
updateStateForFlag(FLAG_LAUNCHER_IN_STATE_TRANSITION, true);
if (!mShouldDelayLauncherStateAnim) {
if (toState == LauncherState.NORMAL) {
+ TaskbarActivityContext activity = mControllers.taskbarActivityContext;
boolean isPinnedTaskbarAndNotInDesktopMode =
- DisplayController.isPinnedTaskbar(
- mControllers.taskbarActivityContext)
- && !DisplayController.isInDesktopMode(
- mControllers.taskbarActivityContext);
+ !activity.isInDesktopMode() && activity.isPinnedTaskbar();
applyState(QuickstepTransitionManager.getTaskbarToHomeDuration(
isPinnedTaskbarAndNotInDesktopMode));
} else {
@@ -247,6 +249,20 @@
}
};
+ private final StateManager.StateListener<RecentsState> mRecentsStateListener =
+ new StateManager.StateListener<>() {
+
+ @Override
+ public void onStateTransitionStart(RecentsState toState) {
+ mStateListener.onStateTransitionStart(toLauncherState(toState));
+ }
+
+ @Override
+ public void onStateTransitionComplete(RecentsState finalState) {
+ mStateListener.onStateTransitionComplete(toLauncherState(finalState));
+ }
+ };
+
/**
* Callback for when launcher state transition completes after user swipes to home.
* @param finalState The final state of the transition.
@@ -282,6 +298,8 @@
if (!mControllers.taskbarActivityContext.isPhoneMode()) {
mLauncher.getStateManager().addStateListener(mStateListener);
+ runForRecentsWindowManager(recentsWindowManager ->
+ recentsWindowManager.getStateManager().addStateListener(mRecentsStateListener));
}
mLauncherState = launcher.getStateManager().getState();
updateStateForSysuiFlags(sysuiStateFlags, /*applyState*/ false);
@@ -306,6 +324,8 @@
mLauncher.getHotseat().setIconsAlpha(1f, ALPHA_CHANNEL_TASKBAR_ALIGNMENT);
mLauncher.getStateManager().removeStateListener(mStateListener);
+ runForRecentsWindowManager(recentsWindowManager ->
+ recentsWindowManager.getStateManager().removeStateListener(mRecentsStateListener));
mCanSyncViews = !mControllers.taskbarActivityContext.isPhoneMode();
mLauncher.removeOnDeviceProfileChangeListener(mOnDeviceProfileChangeListener);
@@ -344,12 +364,15 @@
}
mTaskBarRecentsAnimationListener = new TaskBarRecentsAnimationListener(callbacks);
callbacks.addListener(mTaskBarRecentsAnimationListener);
- ((RecentsView) mLauncher.getOverviewPanel()).setTaskLaunchListener(() ->
- mTaskBarRecentsAnimationListener.endGestureStateOverride(true, false /*canceled*/));
+ RecentsView recentsView = mControllers.uiController.getRecentsView();
+ if (recentsView != null) {
+ recentsView.setTaskLaunchListener(() -> mTaskBarRecentsAnimationListener
+ .endGestureStateOverride(true, false /*canceled*/));
+ recentsView.setTaskLaunchCancelledRunnable(() -> {
+ updateStateForUserFinishedToApp(false /* finishedToApp */);
+ });
+ }
- ((RecentsView) mLauncher.getOverviewPanel()).setTaskLaunchCancelledRunnable(() -> {
- updateStateForUserFinishedToApp(false /* finishedToApp */);
- });
return animatorSet;
}
@@ -475,8 +498,8 @@
final boolean isIconAlignedWithHotseat = isIconAlignedWithHotseat();
final float toAlignment = isIconAlignedWithHotseat ? 1 : 0;
boolean handleOpenFloatingViews = false;
- boolean isPinnedTaskbar = DisplayController.isPinnedTaskbar(
- mControllers.taskbarActivityContext);
+ boolean isPinnedTaskbar =
+ mControllers.taskbarActivityContext.isPinnedTaskbar();
if (DEBUG) {
Log.d(TAG, "onStateChangeApplied - isInLauncher: " + isInLauncher
+ ", mLauncherState: " + mLauncherState
@@ -590,7 +613,8 @@
float backgroundAlpha = isInLauncher && isTaskbarAlignedWithHotseat() ? 0 : 1;
AnimatedFloat taskbarBgOffset =
mControllers.taskbarDragLayerController.getTaskbarBackgroundOffset();
- boolean showTaskbar = shouldShowTaskbar(mLauncher, isInLauncher, isInOverview);
+ boolean showTaskbar = shouldShowTaskbar(mControllers.taskbarActivityContext, isInLauncher,
+ isInOverview);
float taskbarBgOffsetEnd = showTaskbar ? 0f : 1f;
float taskbarBgOffsetStart = showTaskbar ? 1f : 0f;
@@ -727,13 +751,13 @@
return animatorSet;
}
- private static boolean shouldShowTaskbar(Context context, boolean isInLauncher,
- boolean isInOverview) {
- if (DisplayController.showDesktopTaskbarForFreeformDisplay(context)) {
+ private static boolean shouldShowTaskbar(TaskbarActivityContext activityContext,
+ boolean isInLauncher, boolean isInOverview) {
+ if (activityContext.showDesktopTaskbarForFreeformDisplay()) {
return true;
}
- if (DisplayController.showLockedTaskbarOnHome(context) && isInLauncher) {
+ if (activityContext.showLockedTaskbarOnHome() && isInLauncher) {
return true;
}
return !isInLauncher || isInOverview;
@@ -788,11 +812,11 @@
* This refers to the intended state - a transition to this state might be in progress.
*/
public boolean isTaskbarAlignedWithHotseat() {
- if (DisplayController.showDesktopTaskbarForFreeformDisplay(mLauncher)) {
+ if (mControllers.taskbarActivityContext.showDesktopTaskbarForFreeformDisplay()) {
return false;
}
- if (DisplayController.showLockedTaskbarOnHome(mLauncher) && isInLauncher()) {
+ if (mControllers.taskbarActivityContext.showLockedTaskbarOnHome() && isInLauncher()) {
return false;
}
@@ -826,6 +850,15 @@
return mLauncherState.isRecentsViewVisible;
}
+ /**
+ * Returns the current mLauncherState. Note that this could represent RecentsState as well, as
+ * we convert those to equivalent LauncherStates even if Launcher Activity is not actually in
+ * those states (for the case where the state is represented in a separate Window instead).
+ */
+ public LauncherState getLauncherState() {
+ return mLauncherState;
+ }
+
private void playStateTransitionAnim(AnimatorSet animatorSet, long duration,
boolean committed) {
boolean isInStashedState = mLauncherState.isTaskbarStashed(mLauncher);
@@ -1063,7 +1096,10 @@
boolean canceled) {
mCallbacks.removeListener(this);
mTaskBarRecentsAnimationListener = null;
- ((RecentsView) mLauncher.getOverviewPanel()).setTaskLaunchListener(null);
+ RecentsView recentsView = mControllers.uiController.getRecentsView();
+ if (recentsView != null) {
+ recentsView.setTaskLaunchListener(null);
+ }
if (mSkipNextRecentsAnimEnd && !canceled) {
mSkipNextRecentsAnimEnd = false;
@@ -1102,6 +1138,20 @@
controller.applyState();
}
+ /**
+ * Helper function to run a callback on the RecentsWindowManager (if it exists).
+ */
+ private void runForRecentsWindowManager(Consumer<RecentsWindowManager> callback) {
+ if (RecentsWindowFlags.getEnableOverviewInWindow()) {
+ final TaskbarActivityContext taskbarContext = mControllers.taskbarActivityContext;
+ RecentsWindowManager recentsWindowManager = RecentsDisplayModel.getINSTANCE()
+ .get(taskbarContext).getRecentsWindowManager(taskbarContext.getDisplayId());
+ if (recentsWindowManager != null) {
+ callback.accept(recentsWindowManager);
+ }
+ }
+ }
+
private static String getStateString(int flags) {
StringJoiner result = new StringJoiner("|");
appendFlag(result, flags, FLAG_VISIBLE, "flag_visible");
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
index b5e271d..f3cbdb5 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
@@ -17,8 +17,8 @@
import static android.content.Context.RECEIVER_EXPORTED;
import static android.content.Context.RECEIVER_NOT_EXPORTED;
-import static android.content.pm.PackageManager.FEATURE_PC;
import static android.content.pm.PackageManager.FEATURE_FREEFORM_WINDOW_MANAGEMENT;
+import static android.content.pm.PackageManager.FEATURE_PC;
import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR;
import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL;
@@ -82,6 +82,8 @@
import com.android.launcher3.util.SimpleBroadcastReceiver;
import com.android.quickstep.AllAppsActionManager;
import com.android.quickstep.RecentsActivity;
+import com.android.quickstep.SystemDecorationChangeObserver;
+import com.android.quickstep.SystemDecorationChangeObserver.DisplayDecorationListener;
import com.android.quickstep.SystemUiProxy;
import com.android.quickstep.fallback.window.RecentsDisplayModel;
import com.android.quickstep.fallback.window.RecentsWindowFlags;
@@ -107,7 +109,7 @@
/**
* Class to manage taskbar lifecycle
*/
-public class TaskbarManager {
+public class TaskbarManager implements DisplayDecorationListener {
private static final String TAG = "TaskbarManager";
private static final boolean DEBUG = false;
private static final int TASKBAR_DESTROY_DURATION = 100;
@@ -138,6 +140,7 @@
Settings.Secure.NAV_BAR_KIDS_MODE);
private final Context mBaseContext;
+ private final int mPrimaryDisplayId;
private final TaskbarNavButtonCallbacks mNavCallbacks;
// TODO: Remove this during the connected displays lifecycle refactor.
private final Context mPrimaryWindowContext;
@@ -227,7 +230,7 @@
}
// Only Handles Special Exit Cases for Desktop Mode Taskbar Recreation.
if (taskbarActivityContext != null
- && !DisplayController.showLockedTaskbarOnHome(context)) {
+ && !taskbarActivityContext.showLockedTaskbarOnHome()) {
recreateTaskbars();
}
} else {
@@ -434,26 +437,28 @@
TaskbarNavButtonCallbacks navCallbacks,
RecentsDisplayModel recentsDisplayModel) {
mBaseContext = context;
+ mPrimaryDisplayId = mBaseContext.getDisplayId();
mAllAppsActionManager = allAppsActionManager;
mNavCallbacks = navCallbacks;
mRecentsDisplayModel = recentsDisplayModel;
// Set up primary display.
- int primaryDisplayId = getDefaultDisplayId();
debugPrimaryTaskbar("TaskbarManager constructor");
- mPrimaryWindowContext = createWindowContext(primaryDisplayId);
+ mPrimaryWindowContext = createWindowContext(getDefaultDisplayId());
mPrimaryWindowManager = mPrimaryWindowContext.getSystemService(WindowManager.class);
DesktopVisibilityController.INSTANCE.get(
mPrimaryWindowContext).registerTaskbarDesktopModeListener(
mTaskbarDesktopModeListener);
- createTaskbarRootLayout(primaryDisplayId);
- createNavButtonController(primaryDisplayId);
- createAndRegisterComponentCallbacks(primaryDisplayId);
+ createTaskbarRootLayout(getDefaultDisplayId());
+ createNavButtonController(getDefaultDisplayId());
+ createAndRegisterComponentCallbacks(getDefaultDisplayId());
SettingsCache.INSTANCE.get(mPrimaryWindowContext)
.register(USER_SETUP_COMPLETE_URI, mOnSettingsChangeListener);
SettingsCache.INSTANCE.get(mPrimaryWindowContext)
.register(NAV_BAR_KIDS_MODE, mOnSettingsChangeListener);
+ SystemDecorationChangeObserver.getINSTANCE().get(mPrimaryWindowContext)
+ .registerDisplayDecorationListener(this);
mShutdownReceiver =
new SimpleBroadcastReceiver(
mPrimaryWindowContext, UI_HELPER_EXECUTOR, i -> destroyAllTaskbars());
@@ -697,7 +702,9 @@
private TaskbarUIController createTaskbarUIControllerForRecentsViewContainer(
RecentsViewContainer container) {
debugPrimaryTaskbar("createTaskbarUIControllerForRecentsViewContainer");
- if (container instanceof QuickstepLauncher quickstepLauncher) {
+ if (mActivity instanceof QuickstepLauncher quickstepLauncher) {
+ // If 1P Launcher is default, always use LauncherTaskbarUIController, regardless of
+ // whether the recents container is NexusLauncherActivity or RecentsWindowManager.
return new LauncherTaskbarUIController(quickstepLauncher);
}
// If a 3P Launcher is default, always use FallbackTaskbarUIController regardless of
@@ -955,6 +962,7 @@
* Signal from SysUI indicating that a non-mirroring display was just connected to the
* primary device or a previously mirroring display is switched to extended mode.
*/
+ @Override
public void onDisplayAddSystemDecorations(int displayId) {
debugTaskbarManager("onDisplayAddSystemDecorations: ", displayId);
Display display = getDisplay(displayId);
@@ -1018,6 +1026,7 @@
* Signal from SysUI indicating that a previously connected non-mirroring display was just
* removed from the primary device.
*/
+ @Override
public void onDisplayRemoved(int displayId) {
debugTaskbarManager("onDisplayRemoved: ", displayId);
if (!DesktopExperienceFlags.ENABLE_TASKBAR_CONNECTED_DISPLAYS.isTrue() || isDefaultDisplay(
@@ -1057,6 +1066,7 @@
/**
* Signal from SysUI indicating that system decorations should be removed from the display.
*/
+ @Override
public void onDisplayRemoveSystemDecorations(int displayId) {
// The display mirroring starts. The handling logic is the same as when removing a
// display.
@@ -1100,6 +1110,8 @@
.unregister(USER_SETUP_COMPLETE_URI, mOnSettingsChangeListener);
SettingsCache.INSTANCE.get(mPrimaryWindowContext)
.unregister(NAV_BAR_KIDS_MODE, mOnSettingsChangeListener);
+ SystemDecorationChangeObserver.getINSTANCE().get(mPrimaryWindowContext)
+ .unregisterDisplayDecorationListener(this);
debugPrimaryTaskbar("destroy: unregistering component callbacks");
removeAndUnregisterComponentCallbacks(getDefaultDisplayId());
mShutdownReceiver.unregisterReceiverSafely();
@@ -1667,7 +1679,7 @@
}
private int getDefaultDisplayId() {
- return mBaseContext.getDisplayId();
+ return mPrimaryDisplayId;
}
/**
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java
index 1a6cd60..7f240bd 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java
@@ -83,7 +83,7 @@
// Initialized in init.
private TaskbarControllers mControllers;
private boolean mAllowInitialSplitSelection;
- private AppInfo[] mAppInfosList;
+ private AppInfo[] mAppInfosList = AppInfo.EMPTY_ARRAY;
// Saves the ItemInfos in the hotseat without the predicted items.
private SparseArray<ItemInfo> mHotseatInfosList;
private ManageWindowsTaskbarShortcut<BaseTaskbarContext> mManageWindowsTaskbarShortcut;
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java
index eaf00b6..e597148 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java
@@ -66,7 +66,6 @@
import com.android.launcher3.anim.AnimatedFloat;
import com.android.launcher3.anim.AnimationSuccessListener;
import com.android.launcher3.anim.AnimatorListeners;
-import com.android.launcher3.util.DisplayController;
import com.android.launcher3.util.MultiPropertyFactory.MultiProperty;
import com.android.quickstep.SystemUiProxy;
import com.android.quickstep.util.SystemUiFlagUtils;
@@ -307,8 +306,8 @@
// TODO(b/390665752): Feature to "lock" pinned taskbar to home screen will be superseded by
// pinning, in other launcher states, at which point this variable can be removed.
mInAppStateAffectsDesktopTasksVisibilityInTaskbar =
- !DisplayController.showDesktopTaskbarForFreeformDisplay(mActivity)
- && DisplayController.showLockedTaskbarOnHome(mActivity);
+ !mActivity.showDesktopTaskbarForFreeformDisplay()
+ && mActivity.showLockedTaskbarOnHome();
mTaskbarBackgroundDuration = activity.getResources().getInteger(
R.integer.taskbar_background_duration);
@@ -413,7 +412,7 @@
* Returns how long the stash/unstash animation should play.
*/
public long getStashDuration() {
- if (DisplayController.isPinnedTaskbar(mActivity)) {
+ if (mActivity.isPinnedTaskbar()) {
return PINNED_TASKBAR_TRANSITION_DURATION;
}
return mActivity.isTransientTaskbar() ? TRANSIENT_TASKBAR_STASH_DURATION
@@ -1186,7 +1185,7 @@
}
// Do not stash if pinned taskbar, hardware keyboard is attached and no IME is docked
- if (mActivity.isHardwareKeyboard() && DisplayController.isPinnedTaskbar(mActivity)
+ if (mActivity.isHardwareKeyboard() && mActivity.isPinnedTaskbar()
&& !mActivity.isImeDocked()) {
return false;
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java
index 061a5a1..b567871 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java
@@ -21,6 +21,7 @@
import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_HOTSEAT_PREDICTION;
import static com.android.launcher3.taskbar.TaskbarStashController.FLAG_IN_APP;
+import android.animation.Animator;
import android.content.Intent;
import android.graphics.drawable.BitmapDrawable;
import android.view.MotionEvent;
@@ -38,6 +39,8 @@
import com.android.launcher3.popup.SystemShortcut;
import com.android.launcher3.taskbar.bubbles.BubbleBarController;
import com.android.launcher3.util.SplitConfigurationOptions;
+import com.android.quickstep.GestureState;
+import com.android.quickstep.RecentsAnimationCallbacks;
import com.android.quickstep.util.SplitTask;
import com.android.quickstep.views.RecentsView;
import com.android.quickstep.views.TaskContainer;
@@ -455,4 +458,18 @@
*/
public void onSwipeToUnstashTaskbar() {
}
+
+ /**
+ * Called at the end of a gesture (see {@link GestureState.GestureEndTarget}).
+ * @param endTarget Where the gesture animation is going to.
+ * @param callbacks callbacks to track the recents animation lifecycle. The state change is
+ * automatically reset once the recents animation finishes
+ * @return An optional Animator to play in parallel with the default gesture end animation.
+ */
+ public @Nullable Animator getParallelAnimationToGestureEndTarget(
+ GestureState.GestureEndTarget endTarget,
+ long duration,
+ RecentsAnimationCallbacks callbacks) {
+ return null;
+ }
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacks.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacks.java
index dcb9fbf..d0886e0 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacks.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacks.java
@@ -36,7 +36,6 @@
import com.android.internal.jank.Cuj;
import com.android.launcher3.taskbar.bubbles.BubbleBarViewController;
-import com.android.launcher3.util.DisplayController;
import com.android.systemui.shared.system.InteractionJankMonitorWrapper;
import com.android.wm.shell.shared.bubbles.BubbleBarLocation;
@@ -67,8 +66,8 @@
InteractionJankMonitorWrapper.begin(v, Cuj.CUJ_LAUNCHER_OPEN_ALL_APPS,
/* tag= */ "TASKBAR_BUTTON");
mActivity.getStatsLogManager().logger().log(LAUNCHER_TASKBAR_ALLAPPS_BUTTON_TAP);
- if (DisplayController.showLockedTaskbarOnHome(mActivity)
- || DisplayController.showDesktopTaskbarForFreeformDisplay(mActivity)) {
+ if (mActivity.showLockedTaskbarOnHome()
+ || mActivity.showDesktopTaskbarForFreeformDisplay()) {
// If the taskbar can be shown on the home screen, use mAllAppsToggler to toggle all
// apps, which will toggle the launcher activity all apps when on home screen.
// TODO(b/395913143): Reconsider this if a gap in taskbar all apps functionality that
@@ -248,8 +247,7 @@
/** Returns true if the taskbar pinning popup view was shown for {@code event}. */
private boolean maybeShowPinningView(@NonNull MotionEvent event) {
- if (!DisplayController.isPinnedTaskbar(mActivity) || mTaskbarView.isEventOverAnyItem(
- event)) {
+ if (!mActivity.isPinnedTaskbar() || mTaskbarView.isEventOverAnyItem(event)) {
return false;
}
mControllers.taskbarPinningController.showPinningView(mTaskbarView, event.getRawX());
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacksFactory.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacksFactory.kt
index 17da533..6e94889 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacksFactory.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacksFactory.kt
@@ -42,7 +42,8 @@
if (contextualSearchInvoked) {
val runningPackage =
TopTaskTracker.INSTANCE[activity].getCachedTopTask(
- /* filterOnlyVisibleRecents */ true
+ /* filterOnlyVisibleRecents */ true,
+ activity.display.displayId,
)
.getPackageName()
activity.statsLogManager
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java
index 6786aed..f15ef8c 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java
@@ -19,6 +19,7 @@
import static android.animation.LayoutTransition.CHANGE_APPEARING;
import static android.animation.LayoutTransition.CHANGE_DISAPPEARING;
import static android.animation.LayoutTransition.DISAPPEARING;
+import static android.view.Display.DEFAULT_DISPLAY;
import static android.window.DesktopModeFlags.ENABLE_TASKBAR_RECENTS_LAYOUT_TRANSITION;
import static com.android.app.animation.Interpolators.EMPHASIZED;
@@ -86,7 +87,6 @@
import com.android.launcher3.taskbar.bubbles.BubbleControllers;
import com.android.launcher3.taskbar.customization.TaskbarAllAppsButtonContainer;
import com.android.launcher3.taskbar.customization.TaskbarDividerContainer;
-import com.android.launcher3.util.DisplayController;
import com.android.launcher3.util.ItemInfoMatcher;
import com.android.launcher3.util.LauncherBindableItemsContainer;
import com.android.launcher3.util.MultiPropertyFactory;
@@ -495,7 +495,8 @@
View[] iconViews = mTaskbarView.getIconViews();
float finalScale;
- if (mControllers.getSharedState().startTaskbarVariantIsTransient) {
+ TaskbarSharedState sharedState = mControllers.getSharedState();
+ if (sharedState != null || mControllers.getSharedState().startTaskbarVariantIsTransient) {
finalScale = mapRange(scale, 1f, ((float) mPersistentIconSize / mTransientIconSize));
} else {
finalScale = mapRange(scale, ((float) mTransientIconSize / mPersistentIconSize), 1f);
@@ -747,7 +748,8 @@
}
private boolean shouldUpdateIconContentDescription(BubbleTextView btv) {
- boolean isInDesktopMode = mControllers.taskbarDesktopModeController.isInDesktopMode();
+ boolean isInDesktopMode = mControllers.taskbarDesktopModeController.isInDesktopMode(
+ DEFAULT_DISPLAY);
boolean isAllAppsButton = btv instanceof TaskbarAllAppsButtonContainer;
boolean isDividerButton = btv instanceof TaskbarDividerContainer;
return isInDesktopMode && !isAllAppsButton && !isDividerButton;
@@ -930,7 +932,9 @@
private AnimatorPlaybackController createIconAlignmentController(DeviceProfile launcherDp) {
PendingAnimation setter = new PendingAnimation(100);
// icon alignment not needed for pinned taskbar.
- if (DisplayController.isPinnedTaskbar(mActivity)) return setter.createPlaybackController();
+ if (mActivity.isPinnedTaskbar()) {
+ return setter.createPlaybackController();
+ }
mOnControllerPreCreateCallback.run();
DeviceProfile taskbarDp = mActivity.getDeviceProfile();
Rect hotseatPadding = launcherDp.getHotseatLayoutPadding(mActivity);
@@ -948,7 +952,7 @@
// or fade in while already in in-app state.
Interpolator interpolator = mIsHotseatIconOnTopWhenAligned ? LINEAR : FINAL_FRAME;
- int offsetY = launcherDp.getTaskbarOffsetY();
+ int offsetY = taskbarDp.getTaskbarOffsetY();
setter.setFloat(mTaskbarIconTranslationYForHome, VALUE, -offsetY, interpolator);
setter.setFloat(mTaskbarNavButtonTranslationY, VALUE, -offsetY, interpolator);
setter.setFloat(mTaskbarNavButtonTranslationYForInAppDisplay, VALUE, offsetY, interpolator);
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarView.java b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarView.java
index 1abef8a..6380c23 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarView.java
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarView.java
@@ -18,6 +18,7 @@
import static com.android.launcher3.LauncherAnimUtils.VIEW_ALPHA;
import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.annotation.NonNull;
@@ -560,30 +561,52 @@
// First animator hides the bar.
// After it completes, bubble positions in the bar and arrow position is updated.
// Second animator is started to show the bar.
- ObjectAnimator alphaOutAnim = ObjectAnimator.ofFloat(
- this, getLocationAnimAlphaProperty(), 0f);
- mBubbleBarLocationAnimator = BarsLocationAnimatorHelper.getBubbleBarLocationOutAnimator(
- this,
- bubbleBarLocation,
- alphaOutAnim);
+ mBubbleBarLocationAnimator = animateToBubbleBarLocationOut(bubbleBarLocation);
mBubbleBarLocationAnimator.addListener(AnimatorListeners.forEndCallback(() -> {
- updateBubblesLayoutProperties(bubbleBarLocation);
- mBubbleBarBackground.setAnchorLeft(bubbleBarLocation.isOnLeft(isLayoutRtl()));
- ObjectAnimator alphaInAnim = ObjectAnimator.ofFloat(BubbleBarView.this,
- getLocationAnimAlphaProperty(), 1f);
-
// Animate it in
- mBubbleBarLocationAnimator = BarsLocationAnimatorHelper.getBubbleBarLocationInAnimator(
- bubbleBarLocation,
- mBubbleBarLocation,
- getDistanceFromOtherSide(),
- alphaInAnim,
- BubbleBarView.this);
+ mBubbleBarLocationAnimator = animateToBubbleBarLocationIn(mBubbleBarLocation,
+ bubbleBarLocation);
mBubbleBarLocationAnimator.start();
}));
mBubbleBarLocationAnimator.start();
}
+ /** Creates animator for animating bubble bar in. */
+ public Animator animateToBubbleBarLocationIn(BubbleBarLocation fromLocation,
+ BubbleBarLocation toLocation) {
+ updateBubblesLayoutProperties(toLocation);
+ mBubbleBarBackground.setAnchorLeft(toLocation.isOnLeft(isLayoutRtl()));
+ ObjectAnimator alphaInAnim = ObjectAnimator.ofFloat(BubbleBarView.this,
+ getLocationAnimAlphaProperty(), 1f);
+ return BarsLocationAnimatorHelper.getBubbleBarLocationInAnimator(toLocation, fromLocation,
+ getDistanceFromOtherSide(), alphaInAnim, this);
+ }
+
+ /**
+ * Creates animator for animating bubble bar out.
+ *
+ * @param targetLocation the location bubble br should animate to.
+ */
+ public Animator animateToBubbleBarLocationOut(BubbleBarLocation targetLocation) {
+ ObjectAnimator alphaOutAnim = ObjectAnimator.ofFloat(
+ this, getLocationAnimAlphaProperty(), 0f);
+ Animator outAnimation = BarsLocationAnimatorHelper.getBubbleBarLocationOutAnimator(
+ this,
+ targetLocation,
+ alphaOutAnim);
+ outAnimation.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(@NonNull Animator animation, boolean isReverse) {
+ // need to restore the original bar view state in case icon is dropped to the bubble
+ // bar original location
+ updateBubblesLayoutProperties(targetLocation);
+ mBubbleBarBackground.setAnchorLeft(targetLocation.isOnLeft(isLayoutRtl()));
+ setTranslationX(0f);
+ }
+ });
+ return outAnimation;
+ }
+
/**
* Get property that can be used to animate the alpha value for the bar.
* When a bubble is being dragged, uses {@link #BUBBLE_DRAG_ALPHA}.
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java
index 9fb283c..ce4a14f 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java
@@ -194,9 +194,11 @@
private boolean mHiddenForStashed;
private boolean mShouldShowEducation;
public boolean mOverflowAdded;
- private boolean mIsLocationUpdatedForDropTarget = false;
private boolean mWasStashedBeforeEnteringBubbleDragZone = false;
+ /** This field is used solely to track the bubble bar location prior to the start of the drag */
+ private @Nullable BubbleBarLocation mBubbleBarDragLocation;
+
private BubbleBarViewAnimator mBubbleBarViewAnimator;
private final FrameLayout mBubbleBarContainer;
private BubbleBarFlyoutController mBubbleBarFlyoutController;
@@ -364,7 +366,7 @@
@Override
public boolean isOnLeft() {
boolean shouldRevertLocation =
- mBarView.isShowingDropTarget() && mIsLocationUpdatedForDropTarget;
+ mBarView.isShowingDropTarget() && isLocationUpdatedForDropTarget();
boolean isOnLeft = mBarView.getBubbleBarLocation().isOnLeft(mBarView.isLayoutRtl());
return shouldRevertLocation != isOnLeft;
}
@@ -616,6 +618,17 @@
mBarView.animateToBubbleBarLocation(bubbleBarLocation);
}
+ /** Return animator for animating bubble bar in. */
+ public Animator animateBubbleBarLocationIn(BubbleBarLocation fromLocation,
+ BubbleBarLocation toLocation) {
+ return mBarView.animateToBubbleBarLocationIn(fromLocation, toLocation);
+ }
+
+ /** Return animator for animating bubble bar out. */
+ public Animator animateBubbleBarLocationOut(BubbleBarLocation toLocation) {
+ return mBarView.animateToBubbleBarLocationOut(toLocation);
+ }
+
/** Returns whether the Bubble Bar is currently displaying a drop target. */
public boolean isShowingDropTarget() {
return mBarView.isShowingDropTarget();
@@ -628,25 +641,18 @@
* updated.
*/
public void onDragItemOverBubbleBarDragZone(@NonNull BubbleBarLocation bubbleBarLocation) {
- Log.w("BBAnimation", "onDragItemOverBubbleBarDragZone()");
+ mBubbleBarDragLocation = bubbleBarLocation;
mBarView.showDropTarget(/* isDropTarget = */ true);
- boolean isRtl = mBarView.isLayoutRtl();
- mIsLocationUpdatedForDropTarget = getBubbleBarLocation().isOnLeft(isRtl)
- != bubbleBarLocation.isOnLeft(isRtl);
mWasStashedBeforeEnteringBubbleDragZone = hasBubbles()
&& mBubbleStashController.isStashed();
if (mWasStashedBeforeEnteringBubbleDragZone) {
- if (mIsLocationUpdatedForDropTarget) {
- // bubble bar is stashed an location updated
- //TODO(b/399678274) add animation
- mBubbleStashController.showBubbleBarImmediate();
- animateBubbleBarLocation(bubbleBarLocation);
- } else {
- // bubble bar is stashed and location the same - just un-stash
- mBubbleStashController.showBubbleBar(/* expandBubbles = */ false);
- }
+ // bubble bar is stashed - un-stash at drag location
+ mBubbleStashController.showBubbleBarAtLocation(
+ /* fromLocation = */ getBubbleBarLocation(),
+ /* toLocation = */ mBubbleBarDragLocation
+ );
} else if (hasBubbles()) {
- if (mIsLocationUpdatedForDropTarget) {
+ if (isLocationUpdatedForDropTarget()) {
// bubble bar has bubbles and location is changed - animate bar to the opposite side
animateBubbleBarLocation(bubbleBarLocation);
}
@@ -661,7 +667,12 @@
* {@link #onDragItemOverBubbleBarDragZone}}.
*/
public boolean isLocationUpdatedForDropTarget() {
- return mIsLocationUpdatedForDropTarget;
+ if (mBubbleBarDragLocation == null) {
+ return false;
+ }
+ boolean isRtl = mBarView.isLayoutRtl();
+ return getBubbleBarLocation().isOnLeft(isRtl)
+ != mBubbleBarDragLocation.isOnLeft(isRtl);
}
/**
@@ -671,39 +682,34 @@
* mode and reset the value returned from {@link #isLocationUpdatedForDropTarget()} to false.
*/
public void onItemDraggedOutsideBubbleBarDropZone() {
- Log.w("BBAnimation", "onItemDraggedOutsideBubbleBarDropZone()");
- mBarView.showDropTarget(/* isDropTarget = */ false);
- if (mWasStashedBeforeEnteringBubbleDragZone) {
- if (mIsLocationUpdatedForDropTarget) {
- // bubble bar was stashed and location updated
- //TODO(b/399678274) add animation
- animateBubbleBarLocation(getBubbleBarLocation());
- mBubbleStashController.stashBubbleBarImmediate();
- } else {
- // bubble bar was stashed and location the same - just stash it back
- mBubbleStashController.stashBubbleBar();
- }
+ if (!isShowingDropTarget()) {
+ return;
+ }
+ if (mWasStashedBeforeEnteringBubbleDragZone && mBubbleBarDragLocation != null) {
+ // bubble bar was stashed - stash at original location
+ mBubbleStashController.stashBubbleBarToLocation(
+ /* fromLocation = */ mBubbleBarDragLocation,
+ /* toLocation = */ getBubbleBarLocation()
+ );
} else if (hasBubbles()) {
- if (mIsLocationUpdatedForDropTarget) {
- // bubble bar has bubbles and location was changed - return to the original location
+ if (isLocationUpdatedForDropTarget()) {
+ // bubble bar has bubbles and location was changed - return to the original
+ // location
animateBubbleBarLocation(getBubbleBarLocation());
}
}
- mBubbleBarPinController.hideDropTarget();
- mIsLocationUpdatedForDropTarget = false;
- mWasStashedBeforeEnteringBubbleDragZone = false;
+ onItemDragCompleted();
}
/**
* Notifies the controller that the drag has completed over the Bubble Bar drop zone.
* The controller will hide the drop target if there are no bubbles and exit drop target mode.
*/
- public void onItemDroppedInBubbleBarDragZone() {
- Log.w("BBAnimation", "onItemDroppedInBubbleBarDragZone()");
+ public void onItemDragCompleted() {
mBarView.showDropTarget(/* isDropTarget = */ false);
mBubbleBarPinController.hideDropTarget();
- mIsLocationUpdatedForDropTarget = false;
mWasStashedBeforeEnteringBubbleDragZone = false;
+ mBubbleBarDragLocation = null;
}
/**
@@ -842,6 +848,7 @@
boolean hiddenForStashedAndNotAnimating =
mHiddenForStashed && !mBubbleBarViewAnimator.isAnimating();
if (mHiddenForSysui || mHiddenForNoBubbles || hiddenForStashedAndNotAnimating) {
+ //TODO(b/404870188) this visibility change cause search view drag misbehavior
mBarView.setVisibility(INVISIBLE);
} else {
mBarView.setVisibility(VISIBLE);
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleStashedHandleViewController.java b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleStashedHandleViewController.java
index 3640c3b..ec540e0 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleStashedHandleViewController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleStashedHandleViewController.java
@@ -272,6 +272,11 @@
updateTranslationY();
}
+ /** Sets translation X for stash handle. */
+ public void setTranslationX(float translationX) {
+ mStashedHandleView.setTranslationX(translationX);
+ }
+
private void updateTranslationY() {
mStashedHandleView.setTranslationY(mTranslationForSwipeY + mTranslationForStashY);
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/stashing/BubbleStashController.kt b/quickstep/src/com/android/launcher3/taskbar/bubbles/stashing/BubbleStashController.kt
index fec1eaf..ec272ac 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/stashing/BubbleStashController.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/stashing/BubbleStashController.kt
@@ -131,6 +131,12 @@
*/
fun stashBubbleBar()
+ /**
+ * Animates the bubble bar to the handle at provided location. Does not update bubble bar
+ * location.
+ */
+ fun stashBubbleBarToLocation(fromLocation: BubbleBarLocation, toLocation: BubbleBarLocation) {}
+
/** Shows the bubble bar, and expands bubbles depending on [expandBubbles]. */
fun showBubbleBar(expandBubbles: Boolean) {
showBubbleBar(expandBubbles = expandBubbles, bubbleBarGesture = false)
@@ -144,6 +150,9 @@
*/
fun showBubbleBar(expandBubbles: Boolean, bubbleBarGesture: Boolean)
+ /** Animates the bubble bar at the provided location. Does not update bubble bar location. */
+ fun showBubbleBarAtLocation(fromLocation: BubbleBarLocation, toLocation: BubbleBarLocation) {}
+
// TODO(b/354218264): Move to BubbleBarViewAnimator
/**
* The difference on the Y axis between the center of the handle and the center of the bubble
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/stashing/TransientBubbleStashController.kt b/quickstep/src/com/android/launcher3/taskbar/bubbles/stashing/TransientBubbleStashController.kt
index 9c148e2..82bb071 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/stashing/TransientBubbleStashController.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/stashing/TransientBubbleStashController.kt
@@ -18,6 +18,7 @@
import android.animation.Animator
import android.animation.AnimatorSet
+import android.animation.ValueAnimator
import android.content.Context
import android.graphics.Rect
import android.view.MotionEvent
@@ -31,6 +32,12 @@
import com.android.launcher3.R
import com.android.launcher3.anim.AnimatedFloat
import com.android.launcher3.anim.SpringAnimationBuilder
+import com.android.launcher3.taskbar.BarsLocationAnimatorHelper.FADE_IN_ANIM_ALPHA_DURATION_MS
+import com.android.launcher3.taskbar.BarsLocationAnimatorHelper.FADE_OUT_ANIM_ALPHA_DELAY_MS
+import com.android.launcher3.taskbar.BarsLocationAnimatorHelper.FADE_OUT_ANIM_ALPHA_DURATION_MS
+import com.android.launcher3.taskbar.BarsLocationAnimatorHelper.FADE_OUT_ANIM_POSITION_DURATION_MS
+import com.android.launcher3.taskbar.BarsLocationAnimatorHelper.inShiftX
+import com.android.launcher3.taskbar.BarsLocationAnimatorHelper.outShift
import com.android.launcher3.taskbar.TaskbarInsetsController
import com.android.launcher3.taskbar.TaskbarStashController.TASKBAR_STASH_ALPHA_START_DELAY
import com.android.launcher3.taskbar.TaskbarStashController.TRANSIENT_TASKBAR_STASH_ALPHA_DURATION
@@ -44,6 +51,7 @@
import com.android.launcher3.util.MultiPropertyFactory
import com.android.wm.shell.shared.animation.PhysicsAnimator
import com.android.wm.shell.shared.bubbles.BubbleBarLocation
+import com.android.wm.shell.shared.bubbles.ContextUtils.isRtl
import kotlin.math.max
class TransientBubbleStashController(
@@ -187,6 +195,11 @@
}
override fun showBubbleBarImmediate(bubbleBarTranslationY: Float) {
+ showBubbleBarImmediateVisually(bubbleBarTranslationY)
+ onIsStashedChanged()
+ }
+
+ private fun showBubbleBarImmediateVisually(bubbleBarTranslationY: Float) {
bubbleStashedHandleViewController?.setTranslationYForSwipe(0f)
stashHandleViewAlpha?.value = 0f
this.bubbleBarTranslationYAnimator.updateValue(bubbleBarTranslationY)
@@ -197,10 +210,14 @@
bubbleBarBackgroundScaleY.updateValue(1f)
isStashed = false
bubbleBarViewController.setHiddenForStashed(false)
- onIsStashedChanged()
}
override fun stashBubbleBarImmediate() {
+ stashBubbleBarImmediateVisually()
+ onIsStashedChanged()
+ }
+
+ private fun stashBubbleBarImmediateVisually() {
bubbleStashedHandleViewController?.setTranslationYForSwipe(0f)
stashHandleViewAlpha?.value = 1f
this.bubbleBarTranslationYAnimator.updateValue(getStashTranslation())
@@ -212,7 +229,6 @@
bubbleBarBackgroundScaleY.updateValue(getStashScaleY())
isStashed = true
bubbleBarViewController.setHiddenForStashed(true)
- onIsStashedChanged()
}
override fun getTouchableHeight(): Int =
@@ -247,6 +263,29 @@
updateStashedAndExpandedState(stash = true, expand = false)
}
+ override fun stashBubbleBarToLocation(
+ fromLocation: BubbleBarLocation,
+ toLocation: BubbleBarLocation,
+ ) {
+ if (fromLocation.isSameSideWith(toLocation)) {
+ updateStashedAndExpandedState(
+ stash = true,
+ expand = false,
+ updateTouchRegionOnEnd = false,
+ )
+ return
+ }
+ cancelAnimation()
+ animator =
+ AnimatorSet().apply {
+ playSequentially(
+ bubbleBarViewController.animateBubbleBarLocationOut(toLocation),
+ createHandleInAnimator(location = toLocation),
+ )
+ start()
+ }
+ }
+
override fun showBubbleBar(expandBubbles: Boolean, bubbleBarGesture: Boolean) {
updateStashedAndExpandedState(
stash = false,
@@ -255,6 +294,33 @@
)
}
+ override fun showBubbleBarAtLocation(
+ fromLocation: BubbleBarLocation,
+ toLocation: BubbleBarLocation,
+ ) {
+ if (fromLocation.isSameSideWith(toLocation)) {
+ updateStashedAndExpandedState(
+ stash = false,
+ expand = false,
+ updateTouchRegionOnEnd = false,
+ )
+ return
+ }
+ cancelAnimation()
+ val bubbleBarInAnimation =
+ bubbleBarViewController.animateBubbleBarLocationIn(fromLocation, toLocation).apply {
+ doOnStart { showBubbleBarImmediateVisually(bubbleBarTranslationY) }
+ }
+ animator =
+ AnimatorSet().apply {
+ playSequentially(
+ createHandleOutAnimator(location = toLocation),
+ bubbleBarInAnimation,
+ )
+ start()
+ }
+ }
+
override fun getDiffBetweenHandleAndBarCenters(): Float {
// the difference between the centers of the handle and the bubble bar is the difference
// between their distance from the bottom of the screen.
@@ -392,7 +458,7 @@
bubbleBarAlpha.value = 1f
}
animatorSet.doOnEnd {
- animator = null
+ cancelAnimation()
controllersAfterInitAction.runAfterInit {
if (isStashed) {
bubbleBarAlpha.value = 0f
@@ -486,6 +552,7 @@
stash: Boolean,
expand: Boolean,
bubbleBarGesture: Boolean = false,
+ updateTouchRegionOnEnd: Boolean = true,
) {
if (bubbleBarViewController.isHiddenForNoBubbles) {
// If there are no bubbles the bar and handle are invisible, nothing to do here.
@@ -498,11 +565,13 @@
// notify the view controller that the stash state is about to change so that it can
// cancel an ongoing animation if there is one.
bubbleBarViewController.onStashStateChanging()
- animator?.cancel()
+ cancelAnimation()
animator =
createStashAnimator(isStashed, BAR_STASH_DURATION).apply {
updateBarVisibility(isStashed)
- updateTouchRegionOnAnimationEnd()
+ if (updateTouchRegionOnEnd) {
+ updateTouchRegionOnAnimationEnd()
+ }
start()
}
}
@@ -512,6 +581,11 @@
}
}
+ private fun cancelAnimation() {
+ animator?.cancel()
+ animator = null
+ }
+
override fun getHandleViewAlpha(): MultiPropertyFactory<View>.MultiProperty? =
// only return handle alpha if the bubble bar is stashed and has bubbles
if (isStashed && bubbleBarViewController.hasBubbles()) {
@@ -534,6 +608,49 @@
return this
}
+ // TODO(b/399678274) add tests
+ private fun createHandleInAnimator(location: BubbleBarLocation): Animator? {
+ val stashHandleViewController = bubbleStashedHandleViewController ?: return null
+ val handleAlpha = stashHandleViewController.stashedHandleAlpha.get(0)
+ val shift = context.inShiftX
+ val startX = if (location.isOnLeft(context.isRtl)) shift else -shift
+ val handleTranslationX =
+ ValueAnimator.ofFloat(startX, 0f).apply {
+ addUpdateListener { v ->
+ stashHandleViewController.setTranslationX(v.animatedValue as Float)
+ }
+ duration = FADE_IN_ANIM_ALPHA_DURATION_MS
+ }
+ val handleAlphaAnimation =
+ handleAlpha.animateToValue(1f).apply { duration = FADE_IN_ANIM_ALPHA_DURATION_MS }
+ return AnimatorSet().apply {
+ playTogether(handleTranslationX, handleAlphaAnimation)
+ doOnStart { stashBubbleBarImmediateVisually() }
+ }
+ }
+
+ private fun createHandleOutAnimator(location: BubbleBarLocation): Animator? {
+ val stashHandleViewController = bubbleStashedHandleViewController ?: return null
+ val handleAlpha = stashHandleViewController.stashedHandleAlpha.get(0)
+ val shift = context.outShift
+ val endX = if (location.isOnLeft(context.isRtl)) -shift else shift
+ val handleTranslationX =
+ ValueAnimator.ofFloat(0f, endX).apply {
+ addUpdateListener { v ->
+ stashHandleViewController.setTranslationX(v.animatedValue as Float)
+ }
+ duration = FADE_OUT_ANIM_POSITION_DURATION_MS
+ // in case item dropped to the opposite side - need to clear translation
+ doOnEnd { stashHandleViewController.setTranslationX(0f) }
+ }
+ val handleAlphaAnimation =
+ handleAlpha.animateToValue(0f).apply {
+ duration = FADE_OUT_ANIM_ALPHA_DURATION_MS
+ startDelay = FADE_OUT_ANIM_ALPHA_DELAY_MS
+ }
+ return AnimatorSet().apply { playTogether(handleTranslationX, handleAlphaAnimation) }
+ }
+
private fun Animator.setBubbleBarPivotDuringAnim(pivotX: Float, pivotY: Float): Animator {
var initialPivotX = Float.NaN
var initialPivotY = Float.NaN
@@ -549,4 +666,9 @@
}
return this
}
+
+ private fun BubbleBarLocation.isSameSideWith(anotherLocation: BubbleBarLocation): Boolean {
+ val isRtl = context.isRtl
+ return this.isOnLeft(isRtl) == anotherLocation.isOnLeft(isRtl)
+ }
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/growth/ActionPerformers.kt b/quickstep/src/com/android/launcher3/taskbar/growth/ActionPerformers.kt
new file mode 100644
index 0000000..17c9509
--- /dev/null
+++ b/quickstep/src/com/android/launcher3/taskbar/growth/ActionPerformers.kt
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2025 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.growth
+
+import android.content.Context
+import android.content.Intent
+import android.net.Uri
+
+object ActionPerformers {
+ fun interface DismissCallback {
+ fun invoke()
+ }
+
+ fun performActions(actions: List<Action>, context: Context, dismissCallback: DismissCallback) {
+ for (action in actions) {
+ performAction(action, context, dismissCallback)
+ }
+ }
+
+ private fun performAction(action: Action, context: Context, dismissCallback: DismissCallback) {
+ when (action) {
+ is Action.Dismiss -> {
+ // TODO: b/396239267 - Handle marking the campaign dismissed with dismissal
+ // retention.
+ dismissCallback.invoke()
+ }
+ is Action.OpenUrl -> openUrl(action.url, context)
+ // Handle other actions
+ }
+ }
+
+ fun openUrl(url: String, context: Context) {
+ val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ context.startActivity(intent)
+ }
+}
diff --git a/quickstep/src/com/android/launcher3/taskbar/navbutton/AbstractNavButtonLayoutter.kt b/quickstep/src/com/android/launcher3/taskbar/navbutton/AbstractNavButtonLayoutter.kt
index e487f9f..3712a76 100644
--- a/quickstep/src/com/android/launcher3/taskbar/navbutton/AbstractNavButtonLayoutter.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/navbutton/AbstractNavButtonLayoutter.kt
@@ -27,7 +27,6 @@
import com.android.launcher3.DeviceProfile
import com.android.launcher3.R
import com.android.launcher3.Utilities
-import com.android.launcher3.taskbar.TaskbarActivityContext
import com.android.launcher3.taskbar.navbutton.NavButtonLayoutFactory.NavButtonLayoutter
/**
@@ -48,7 +47,7 @@
protected val startContextualContainer: ViewGroup,
protected val imeSwitcher: ImageView?,
protected val a11yButton: ImageView?,
- protected val space: Space?
+ protected val space: Space?,
) : NavButtonLayoutter {
protected val homeButton: ImageView? = navButtonContainer.findViewById(R.id.home)
protected val recentsButton: ImageView? = navButtonContainer.findViewById(R.id.recent_apps)
@@ -69,26 +68,34 @@
val params =
FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
- ViewGroup.LayoutParams.MATCH_PARENT
+ ViewGroup.LayoutParams.MATCH_PARENT,
)
params.gravity = Gravity.CENTER
return params
}
+ /**
+ * Adjusts the layout parameters of the nav bar container for setup in phone mode.
+ *
+ * @param nearestTouchFrameLayoutParams The layout parameters of the navButtonsView, which is
+ * the ViewGroup that contains start, end, nav button ViewGroups
+ * @param deviceProfile The device profile containing information about the device's
+ * configuration.
+ */
fun adjustForSetupInPhoneMode(
- navButtonsLayoutParams: FrameLayout.LayoutParams,
- navButtonsViewLayoutParams: FrameLayout.LayoutParams,
- deviceProfile: DeviceProfile
+ nearestTouchFrameLayoutParams: FrameLayout.LayoutParams,
+ deviceProfile: DeviceProfile,
) {
val phoneOrPortraitSetupMargin =
resources.getDimensionPixelSize(R.dimen.taskbar_contextual_button_suw_margin)
- navButtonsLayoutParams.marginStart = phoneOrPortraitSetupMargin
- navButtonsLayoutParams.bottomMargin =
+ nearestTouchFrameLayoutParams.marginStart = phoneOrPortraitSetupMargin
+ nearestTouchFrameLayoutParams.bottomMargin =
if (!deviceProfile.isLandscape) 0
else
phoneOrPortraitSetupMargin -
- resources.getDimensionPixelSize(R.dimen.taskbar_nav_buttons_size) / 2
- navButtonsViewLayoutParams.height =
+ resources.getDimensionPixelSize(R.dimen.taskbar_nav_buttons_size) / 2
+
+ nearestTouchFrameLayoutParams.height =
resources.getDimensionPixelSize(R.dimen.taskbar_contextual_button_suw_height)
}
@@ -97,7 +104,7 @@
buttonSize: Int,
barAxisMarginStart: Int,
barAxisMarginEnd: Int,
- gravity: Int
+ gravity: Int,
) {
val contextualContainerParams =
FrameLayout.LayoutParams(buttonSize, ViewGroup.LayoutParams.MATCH_PARENT)
diff --git a/quickstep/src/com/android/launcher3/taskbar/navbutton/NavButtonLayoutFactory.kt b/quickstep/src/com/android/launcher3/taskbar/navbutton/NavButtonLayoutFactory.kt
index 2497fbb..a199dba 100644
--- a/quickstep/src/com/android/launcher3/taskbar/navbutton/NavButtonLayoutFactory.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/navbutton/NavButtonLayoutFactory.kt
@@ -66,7 +66,7 @@
isInSetup: Boolean,
isThreeButtonNav: Boolean,
phoneMode: Boolean,
- @Rotation surfaceRotation: Int
+ @Rotation surfaceRotation: Int,
): NavButtonLayoutter {
val navButtonContainer =
navButtonsView.requireViewById<LinearLayout>(ID_END_NAV_BUTTONS)
@@ -77,6 +77,18 @@
val isPhoneNavMode = phoneMode && isThreeButtonNav
val isPhoneGestureMode = phoneMode && !isThreeButtonNav
return when {
+ isInSetup -> {
+ SetupNavLayoutter(
+ resources,
+ navButtonsView,
+ navButtonContainer,
+ endContextualContainer,
+ startContextualContainer,
+ imeSwitcher,
+ a11yButton,
+ space,
+ )
+ }
isPhoneNavMode -> {
if (!deviceProfile.isLandscape) {
navButtonsView.setIsVertical(false)
@@ -87,7 +99,7 @@
startContextualContainer,
imeSwitcher,
a11yButton,
- space
+ space,
)
} else if (surfaceRotation == ROTATION_90) {
navButtonsView.setIsVertical(true)
@@ -98,7 +110,7 @@
startContextualContainer,
imeSwitcher,
a11yButton,
- space
+ space,
)
} else {
navButtonsView.setIsVertical(true)
@@ -109,36 +121,23 @@
startContextualContainer,
imeSwitcher,
a11yButton,
- space
+ space,
)
}
}
isPhoneGestureMode -> {
PhoneGestureLayoutter(
resources,
- navButtonsView,
navButtonContainer,
endContextualContainer,
startContextualContainer,
imeSwitcher,
a11yButton,
- space
+ space,
)
}
deviceProfile.isTaskbarPresent -> {
return when {
- isInSetup -> {
- SetupNavLayoutter(
- resources,
- navButtonsView,
- navButtonContainer,
- endContextualContainer,
- startContextualContainer,
- imeSwitcher,
- a11yButton,
- space
- )
- }
isKidsMode -> {
KidsNavLayoutter(
resources,
@@ -147,7 +146,7 @@
startContextualContainer,
imeSwitcher,
a11yButton,
- space
+ space,
)
}
else ->
@@ -158,7 +157,7 @@
startContextualContainer,
imeSwitcher,
a11yButton,
- space
+ space,
)
}
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/navbutton/PhoneGestureLayoutter.kt b/quickstep/src/com/android/launcher3/taskbar/navbutton/PhoneGestureLayoutter.kt
index 390ec34..e0f2a22 100644
--- a/quickstep/src/com/android/launcher3/taskbar/navbutton/PhoneGestureLayoutter.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/navbutton/PhoneGestureLayoutter.kt
@@ -17,25 +17,21 @@
package com.android.launcher3.taskbar.navbutton
import android.content.res.Resources
-import android.view.Gravity
import android.view.ViewGroup
-import android.widget.FrameLayout
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.Space
-import com.android.launcher3.DeviceProfile
import com.android.launcher3.taskbar.TaskbarActivityContext
/** Layoutter for showing gesture navigation on phone screen. No buttons here, no-op container */
class PhoneGestureLayoutter(
resources: Resources,
- navButtonsView: NearestTouchFrame,
navBarContainer: LinearLayout,
endContextualContainer: ViewGroup,
startContextualContainer: ViewGroup,
imeSwitcher: ImageView?,
a11yButton: ImageView?,
- space: Space?
+ space: Space?,
) :
AbstractNavButtonLayoutter(
resources,
@@ -44,33 +40,10 @@
startContextualContainer,
imeSwitcher,
a11yButton,
- space
+ space,
) {
- private val mNavButtonsView = navButtonsView
override fun layoutButtons(context: TaskbarActivityContext, isA11yButtonPersistent: Boolean) {
- // TODO: look into if we should use SetupNavLayoutter instead.
- if (!context.isUserSetupComplete) {
- // Since setup wizard only has back button enabled, it looks strange to be
- // end-aligned, so start-align instead.
- val navButtonsLayoutParams = navButtonContainer.layoutParams as FrameLayout.LayoutParams
- val navButtonsViewLayoutParams =
- mNavButtonsView.layoutParams as FrameLayout.LayoutParams
- val deviceProfile: DeviceProfile = context.deviceProfile
-
- navButtonsLayoutParams.marginEnd = 0
- navButtonsLayoutParams.gravity = Gravity.START
- context.setTaskbarWindowSize(context.setupWindowSize)
-
- adjustForSetupInPhoneMode(
- navButtonsLayoutParams,
- navButtonsViewLayoutParams,
- deviceProfile
- )
- mNavButtonsView.layoutParams = navButtonsViewLayoutParams
- navButtonContainer.layoutParams = navButtonsLayoutParams
- }
-
endContextualContainer.removeAllViews()
startContextualContainer.removeAllViews()
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/navbutton/SetupNavLayoutter.kt b/quickstep/src/com/android/launcher3/taskbar/navbutton/SetupNavLayoutter.kt
index e032430..eb3fdeb 100644
--- a/quickstep/src/com/android/launcher3/taskbar/navbutton/SetupNavLayoutter.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/navbutton/SetupNavLayoutter.kt
@@ -29,12 +29,15 @@
import com.android.launcher3.R
import com.android.launcher3.taskbar.TaskbarActivityContext
+const val SUW_THEME_SYSTEM_PROPERTY = "setupwizard.theme"
+const val GLIF_EXPRESSIVE_THEME = "glif_expressive"
+const val GLIF_EXPRESSIVE_LIGHT_THEME = "glif_expressive_light"
const val SQUARE_ASPECT_RATIO_BOTTOM_BOUND = 0.95
const val SQUARE_ASPECT_RATIO_UPPER_BOUND = 1.05
class SetupNavLayoutter(
resources: Resources,
- navButtonsView: NearestTouchFrame,
+ nearestTouchFrame: NearestTouchFrame,
navButtonContainer: LinearLayout,
endContextualContainer: ViewGroup,
startContextualContainer: ViewGroup,
@@ -51,17 +54,19 @@
a11yButton,
space,
) {
- private val mNavButtonsView = navButtonsView
+ // mNearestTouchFrame is a ViewGroup that contains start, end, nav button ViewGroups
+ private val mNearestTouchFrame = nearestTouchFrame
override fun layoutButtons(context: TaskbarActivityContext, isA11yButtonPersistent: Boolean) {
- val SUWTheme = SystemProperties.get("setupwizard.theme", "")
- if (SUWTheme == "glif_expressive" || SUWTheme == "glif_expressive_light") {
+ val SUWTheme = SystemProperties.get(SUW_THEME_SYSTEM_PROPERTY, "")
+ if (SUWTheme == GLIF_EXPRESSIVE_THEME || SUWTheme == GLIF_EXPRESSIVE_LIGHT_THEME) {
return
}
// Since setup wizard only has back button enabled, it looks strange to be
// end-aligned, so start-align instead.
val navButtonsLayoutParams = navButtonContainer.layoutParams as FrameLayout.LayoutParams
- val navButtonsViewLayoutParams = mNavButtonsView.layoutParams as FrameLayout.LayoutParams
+ val navButtonsOverallViewGroupLayoutParams =
+ mNearestTouchFrame.layoutParams as FrameLayout.LayoutParams
val deviceProfile: DeviceProfile = context.deviceProfile
navButtonsLayoutParams.marginEnd = 0
@@ -77,18 +82,14 @@
) {
navButtonsLayoutParams.marginStart =
resources.getDimensionPixelSize(R.dimen.taskbar_back_button_suw_start_margin)
- navButtonsViewLayoutParams.bottomMargin =
+ navButtonsOverallViewGroupLayoutParams.bottomMargin =
resources.getDimensionPixelSize(R.dimen.taskbar_back_button_suw_bottom_margin)
navButtonsLayoutParams.height =
resources.getDimensionPixelSize(R.dimen.taskbar_back_button_suw_height)
} else {
- adjustForSetupInPhoneMode(
- navButtonsLayoutParams,
- navButtonsViewLayoutParams,
- deviceProfile,
- )
+ adjustForSetupInPhoneMode(navButtonsOverallViewGroupLayoutParams, deviceProfile)
}
- mNavButtonsView.layoutParams = navButtonsViewLayoutParams
+ mNearestTouchFrame.layoutParams = navButtonsOverallViewGroupLayoutParams
navButtonContainer.layoutParams = navButtonsLayoutParams
endContextualContainer.removeAllViews()
diff --git a/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayContext.java b/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayContext.java
index dd91d17..8574b89 100644
--- a/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayContext.java
+++ b/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayContext.java
@@ -31,6 +31,7 @@
import com.android.launcher3.taskbar.TaskbarUIController;
import com.android.launcher3.taskbar.allapps.TaskbarAllAppsContainerView;
import com.android.launcher3.taskbar.allapps.TaskbarSearchSessionController;
+import com.android.launcher3.util.NavigationMode;
import com.android.launcher3.util.SplitConfigurationOptions.SplitSelectSource;
/**
@@ -142,6 +143,41 @@
}
@Override
+ public boolean isTransientTaskbar() {
+ return mTaskbarContext.isTransientTaskbar();
+ }
+
+ @Override
+ public boolean isPinnedTaskbar() {
+ return mTaskbarContext.isPinnedTaskbar();
+ }
+
+ @Override
+ public NavigationMode getNavigationMode() {
+ return mTaskbarContext.getNavigationMode();
+ }
+
+ @Override
+ public boolean isInDesktopMode() {
+ return mTaskbarContext.isInDesktopMode();
+ }
+
+ @Override
+ public boolean showLockedTaskbarOnHome() {
+ return mTaskbarContext.showLockedTaskbarOnHome();
+ }
+
+ @Override
+ public boolean showDesktopTaskbarForFreeformDisplay() {
+ return mTaskbarContext.showDesktopTaskbarForFreeformDisplay();
+ }
+
+ @Override
+ public boolean isPrimaryDisplay() {
+ return mTaskbarContext.isPrimaryDisplay();
+ }
+
+ @Override
public void onDragStart() {}
@Override
diff --git a/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayController.java b/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayController.java
index 675d55b..de20f77 100644
--- a/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayController.java
@@ -200,7 +200,7 @@
private LayoutParams createLayoutParams() {
LayoutParams layoutParams = new LayoutParams(
TYPE_APPLICATION_OVERLAY,
- LayoutParams.FLAG_SPLIT_TOUCH,
+ /* flags = */ 0,
PixelFormat.TRANSLUCENT);
layoutParams.setTitle(WINDOW_TITLE);
layoutParams.gravity = Gravity.BOTTOM;
diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepWidgetHolder.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepWidgetHolder.java
index 9970a7d..c7eedb0 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepWidgetHolder.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepWidgetHolder.java
@@ -30,7 +30,6 @@
import androidx.annotation.AnyThread;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import androidx.annotation.UiThread;
import com.android.launcher3.util.IntSet;
import com.android.launcher3.util.SafeCloseable;
@@ -167,7 +166,7 @@
};
QuickstepWidgetHolderListener holderListener = getHolderListener(appWidgetId);
holderListener.addHolder(handler);
- return () -> holderListener.mListeningHolders.remove(handler);
+ return () -> holderListener.removeHolder(handler);
}
/**
@@ -211,7 +210,7 @@
public void clearViews() {
mViews.clear();
for (int i = sListeners.size() - 1; i >= 0; i--) {
- sListeners.valueAt(i).mListeningHolders.remove(mUpdateHandler);
+ sListeners.valueAt(i).removeHolder(mUpdateHandler);
}
}
@@ -238,13 +237,15 @@
mWidgetId = widgetId;
}
- @UiThread
- @Nullable
public RemoteViews addHolder(@NonNull UpdateHandler holder) {
- mListeningHolders.add(holder);
+ MAIN_EXECUTOR.execute(() -> mListeningHolders.add(holder));
return mRemoteViews;
}
+ public void removeHolder(@NonNull UpdateHandler holder) {
+ MAIN_EXECUTOR.execute(() -> mListeningHolders.remove(holder));
+ }
+
@Override
@AnyThread
public void onUpdateProviderInfo(@Nullable AppWidgetProviderInfo info) {
diff --git a/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.kt b/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.kt
index 23dc81d..c9f791c 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.kt
+++ b/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.kt
@@ -21,6 +21,7 @@
import com.android.app.animation.Interpolators.INSTANT
import com.android.app.animation.Interpolators.LINEAR
import com.android.launcher3.Flags.enableDesktopExplodedView
+import com.android.launcher3.Flags.enableGridOnlyOverview
import com.android.launcher3.Flags.enableLargeDesktopWindowingTile
import com.android.launcher3.LauncherState
import com.android.launcher3.anim.AnimatedFloat
@@ -143,7 +144,11 @@
recentsView,
TASK_MODALNESS,
toState.overviewModalness,
- config.getInterpolator(ANIM_OVERVIEW_MODAL, LINEAR),
+ config.getInterpolator(
+ ANIM_OVERVIEW_MODAL,
+ if (enableGridOnlyOverview() && !toState.isRecentsViewVisible) FINAL_FRAME
+ else LINEAR,
+ ),
)
val fromState = launcher.stateManager.state
diff --git a/quickstep/src/com/android/launcher3/uioverrides/states/OverviewModalTaskState.java b/quickstep/src/com/android/launcher3/uioverrides/states/OverviewModalTaskState.java
index 0c0b4fd..ae82f82 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/states/OverviewModalTaskState.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/states/OverviewModalTaskState.java
@@ -15,11 +15,11 @@
*/
package com.android.launcher3.uioverrides.states;
+import static com.android.launcher3.Flags.enableGridOnlyOverview;
import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_OVERVIEW;
import android.graphics.Rect;
-import com.android.launcher3.Flags;
import com.android.launcher3.Launcher;
import com.android.launcher3.LauncherState;
import com.android.launcher3.views.ActivityContext;
@@ -50,6 +50,9 @@
@Override
public float[] getOverviewScaleAndOffset(Launcher launcher) {
+ if (enableGridOnlyOverview()) {
+ return super.getOverviewScaleAndOffset(launcher);
+ }
return getOverviewScaleAndOffsetForModalState(launcher.getOverviewPanel());
}
@@ -65,7 +68,7 @@
@Override
public boolean isTaskbarStashed(Launcher launcher) {
- if (Flags.enableGridOnlyOverview()) {
+ if (enableGridOnlyOverview()) {
return true;
}
return super.isTaskbarStashed(launcher);
diff --git a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewDismissTouchController.kt b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewDismissTouchController.kt
index 454a307..eac5235 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewDismissTouchController.kt
+++ b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewDismissTouchController.kt
@@ -63,6 +63,7 @@
private var hasDismissThresholdHapticRun = false
private var initialDisplacement: Float = 0f
private var recentsScaleAnimation: SpringAnimation? = null
+ private var isBlockedDuringDismissal = false
private fun canInterceptTouch(ev: MotionEvent): Boolean =
when {
@@ -137,6 +138,7 @@
}
override fun onDragStart(start: Boolean, startDisplacement: Float) {
+ if (isBlockedDuringDismissal) return
val taskBeingDragged = taskBeingDragged ?: return
initialDisplacement =
@@ -149,6 +151,7 @@
}
override fun onDrag(displacement: Float): Boolean {
+ if (isBlockedDuringDismissal) return true
val taskBeingDragged = taskBeingDragged ?: return false
val currentDisplacement = displacement + initialDisplacement
val boundedDisplacement =
@@ -204,14 +207,11 @@
}
override fun onDragEnd(velocity: Float) {
+ if (isBlockedDuringDismissal) return
val taskBeingDragged = taskBeingDragged ?: return
val currentDisplacement =
taskBeingDragged.secondaryDismissTranslationProperty.get(taskBeingDragged)
- if (currentDisplacement == 0f) {
- clearState()
- return
- }
val isBeyondDismissThreshold =
abs(currentDisplacement) > abs(DISMISS_THRESHOLD_FRACTION * dismissLength)
val velocityIsGoingUp = recentsView.pagedOrientationHandler.isGoingUp(velocity, isRtl)
@@ -225,7 +225,6 @@
taskBeingDragged,
velocity,
isDismissing,
- detector,
dismissLength,
this::clearState,
)
@@ -234,6 +233,7 @@
if (isDismissing) (dismissLength * verticalFactor).toFloat() else 0f
)
}
+ isBlockedDuringDismissal = true
recentsScaleAnimation =
recentsView.animateRecentsScale(RECENTS_SCALE_DEFAULT).addEndListener { _, _, _, _ ->
recentsScaleAnimation = null
@@ -246,6 +246,7 @@
taskBeingDragged?.translationZ = 0f
taskBeingDragged = null
springAnimation = null
+ isBlockedDuringDismissal = false
}
private fun getRecentsScale(dismissFraction: Float): Float {
diff --git a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
index 168b856..47aa1de 100644
--- a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
+++ b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
@@ -1614,7 +1614,7 @@
TaskStackChangeListeners.getInstance().registerTaskStackListener(
mActivityRestartListener);
- mParallelRunningAnim = mContainerInterface.getParallelAnimationToLauncher(
+ mParallelRunningAnim = mContainerInterface.getParallelAnimationToGestureEndTarget(
mGestureState.getEndTarget(), duration,
mTaskAnimationManager.getCurrentCallbacks());
if (mParallelRunningAnim != null) {
diff --git a/quickstep/src/com/android/quickstep/BaseContainerInterface.java b/quickstep/src/com/android/quickstep/BaseContainerInterface.java
index c64067a..244dfc3 100644
--- a/quickstep/src/com/android/quickstep/BaseContainerInterface.java
+++ b/quickstep/src/com/android/quickstep/BaseContainerInterface.java
@@ -182,7 +182,7 @@
* Called when the gesture ends and the animation starts towards the given target. Used to add
* an optional additional animation with the same duration.
*/
- public @Nullable Animator getParallelAnimationToLauncher(
+ public @Nullable Animator getParallelAnimationToGestureEndTarget(
GestureState.GestureEndTarget endTarget, long duration,
RecentsAnimationCallbacks callbacks) {
if (endTarget == RECENTS) {
diff --git a/quickstep/src/com/android/quickstep/DisplayModel.kt b/quickstep/src/com/android/quickstep/DisplayModel.kt
index 3de6fd0..0b8af40 100644
--- a/quickstep/src/com/android/quickstep/DisplayModel.kt
+++ b/quickstep/src/com/android/quickstep/DisplayModel.kt
@@ -23,10 +23,13 @@
import android.view.Display
import androidx.core.util.valueIterator
import com.android.quickstep.DisplayModel.DisplayResource
+import com.android.quickstep.SystemDecorationChangeObserver.Companion.INSTANCE
+import com.android.quickstep.SystemDecorationChangeObserver.DisplayDecorationListener
import java.io.PrintWriter
/** data model for managing resources with lifecycles that match that of the connected display */
-abstract class DisplayModel<RESOURCE_TYPE : DisplayResource>(val context: Context) {
+abstract class DisplayModel<RESOURCE_TYPE : DisplayResource>(val context: Context) :
+ DisplayDecorationListener {
companion object {
private const val TAG = "DisplayModel"
@@ -34,19 +37,20 @@
}
private val displayManager = context.getSystemService(Context.DISPLAY_SERVICE) as DisplayManager
+ private var systemDecorationChangeObserver: SystemDecorationChangeObserver? = null
protected val displayResourceArray = SparseArray<RESOURCE_TYPE>()
- fun onDisplayAddSystemDecorations(displayId: Int) {
+ override fun onDisplayAddSystemDecorations(displayId: Int) {
if (DEBUG) Log.d(TAG, "onDisplayAdded: displayId=$displayId")
storeDisplayResource(displayId)
}
- fun onDisplayRemoved(displayId: Int) {
+ override fun onDisplayRemoved(displayId: Int) {
if (DEBUG) Log.d(TAG, "onDisplayRemoved: displayId=$displayId")
deleteDisplayResource(displayId)
}
- fun onDisplayRemoveSystemDecorations(displayId: Int) {
+ override fun onDisplayRemoveSystemDecorations(displayId: Int) {
if (DEBUG) Log.d(TAG, "onDisplayRemoveSystemDecorations: displayId=$displayId")
deleteDisplayResource(displayId)
}
@@ -54,12 +58,16 @@
protected abstract fun createDisplayResource(display: Display): RESOURCE_TYPE
protected fun initializeDisplays() {
+ systemDecorationChangeObserver = INSTANCE[context]
+ systemDecorationChangeObserver?.registerDisplayDecorationListener(this)
displayManager.displays
.filter { getDisplayResource(it.displayId) == null }
.forEach { storeDisplayResource(it.displayId) }
}
fun destroy() {
+ systemDecorationChangeObserver?.unregisterDisplayDecorationListener(this)
+ systemDecorationChangeObserver = null
displayResourceArray.valueIterator().forEach { displayResource ->
displayResource.cleanup()
}
diff --git a/quickstep/src/com/android/quickstep/FallbackActivityInterface.java b/quickstep/src/com/android/quickstep/FallbackActivityInterface.java
index d8e0296..7654471 100644
--- a/quickstep/src/com/android/quickstep/FallbackActivityInterface.java
+++ b/quickstep/src/com/android/quickstep/FallbackActivityInterface.java
@@ -203,16 +203,16 @@
}
@Override
- public @Nullable Animator getParallelAnimationToLauncher(GestureEndTarget endTarget,
+ public @Nullable Animator getParallelAnimationToGestureEndTarget(GestureEndTarget endTarget,
long duration, RecentsAnimationCallbacks callbacks) {
FallbackTaskbarUIController uiController = getTaskbarController();
- Animator superAnimator = super.getParallelAnimationToLauncher(
+ Animator superAnimator = super.getParallelAnimationToGestureEndTarget(
endTarget, duration, callbacks);
if (uiController == null) {
return superAnimator;
}
- RecentsState toState = stateFromGestureEndTarget(endTarget);
- Animator taskbarAnimator = uiController.createAnimToRecentsState(toState, duration);
+ Animator taskbarAnimator = uiController.getParallelAnimationToGestureEndTarget(
+ endTarget, duration, callbacks);
if (taskbarAnimator == null) {
return superAnimator;
}
diff --git a/quickstep/src/com/android/quickstep/FallbackWindowInterface.java b/quickstep/src/com/android/quickstep/FallbackWindowInterface.java
index 35630ef..503f047 100644
--- a/quickstep/src/com/android/quickstep/FallbackWindowInterface.java
+++ b/quickstep/src/com/android/quickstep/FallbackWindowInterface.java
@@ -31,7 +31,7 @@
import com.android.launcher3.DeviceProfile;
import com.android.launcher3.statemanager.StateManager;
-import com.android.launcher3.taskbar.FallbackTaskbarUIController;
+import com.android.launcher3.taskbar.TaskbarUIController;
import com.android.launcher3.util.DisplayController;
import com.android.quickstep.GestureState.GestureEndTarget;
import com.android.quickstep.fallback.RecentsState;
@@ -104,14 +104,9 @@
}
@Override
- public FallbackTaskbarUIController getTaskbarController() {
+ public TaskbarUIController getTaskbarController() {
RecentsWindowManager manager = getCreatedContainer();
- if (manager == null) {
- return null;
- }
- return null;
- // todo b/365775636: pass a taskbar implementation
- // return manager.getTaskbarUIController();
+ return manager == null ? null : manager.getTaskbarUIController();
}
@Override
@@ -213,16 +208,16 @@
}
@Override
- public @Nullable Animator getParallelAnimationToLauncher(GestureEndTarget endTarget,
+ public @Nullable Animator getParallelAnimationToGestureEndTarget(GestureEndTarget endTarget,
long duration, RecentsAnimationCallbacks callbacks) {
- FallbackTaskbarUIController uiController = getTaskbarController();
- Animator superAnimator = super.getParallelAnimationToLauncher(
+ TaskbarUIController uiController = getTaskbarController();
+ Animator superAnimator = super.getParallelAnimationToGestureEndTarget(
endTarget, duration, callbacks);
if (uiController == null) {
return superAnimator;
}
- RecentsState toState = stateFromGestureEndTarget(endTarget);
- Animator taskbarAnimator = uiController.createAnimToRecentsState(toState, duration);
+ Animator taskbarAnimator = uiController.getParallelAnimationToGestureEndTarget(
+ endTarget, duration, callbacks);
if (taskbarAnimator == null) {
return superAnimator;
}
diff --git a/quickstep/src/com/android/quickstep/HomeVisibilityState.kt b/quickstep/src/com/android/quickstep/HomeVisibilityState.kt
index 1345e0b..020b9e2 100644
--- a/quickstep/src/com/android/quickstep/HomeVisibilityState.kt
+++ b/quickstep/src/com/android/quickstep/HomeVisibilityState.kt
@@ -18,6 +18,9 @@
import android.os.RemoteException
import android.util.Log
+import android.view.InsetsState
+import android.view.WindowInsets
+
import com.android.launcher3.Utilities
import com.android.launcher3.config.FeatureFlags
import com.android.launcher3.util.Executors
@@ -30,6 +33,8 @@
var isHomeVisible = true
private set
+ @Volatile var navbarInsetPosition = 0
+
private var listeners = mutableSetOf<VisibilityChangeListener>()
fun addListener(l: VisibilityChangeListener) = listeners.add(l)
@@ -50,6 +55,11 @@
},
)
}
+ override fun onDisplayInsetsChanged(insetsState: InsetsState) {
+ val bottomInset = insetsState.calculateInsets(insetsState.displayFrame,
+ WindowInsets.Type.navigationBars(), false).bottom
+ navbarInsetPosition = insetsState.displayFrame.bottom - bottomInset
+ }
}
)
} catch (e: RemoteException) {
diff --git a/quickstep/src/com/android/quickstep/InputConsumerUtils.kt b/quickstep/src/com/android/quickstep/InputConsumerUtils.kt
index c8ca534..89b5b29 100644
--- a/quickstep/src/com/android/quickstep/InputConsumerUtils.kt
+++ b/quickstep/src/com/android/quickstep/InputConsumerUtils.kt
@@ -550,7 +550,7 @@
(com.android.launcher3.Flags.useActivityOverlay() &&
runningTask != null &&
runningTask.isHomeTask &&
- overviewComponentObserver.isHomeAndOverviewSame &&
+ overviewComponentObserver.isHomeAndOverviewSameActivity &&
!launcherResumedThroughShellTransition &&
!previousGestureState.isRecentsAnimationRunning)
diff --git a/quickstep/src/com/android/quickstep/LauncherActivityInterface.java b/quickstep/src/com/android/quickstep/LauncherActivityInterface.java
index ac0aa76..fa8e484 100644
--- a/quickstep/src/com/android/quickstep/LauncherActivityInterface.java
+++ b/quickstep/src/com/android/quickstep/LauncherActivityInterface.java
@@ -261,7 +261,8 @@
return launcher != null
&& launcher.getStateManager().getState() == OVERVIEW
&& launcher.isStarted()
- && TopTaskTracker.INSTANCE.get(launcher).getCachedTopTask(false).isHomeTask();
+ && TopTaskTracker.INSTANCE.get(launcher).getCachedTopTask(false,
+ launcher.getDisplayId()).isHomeTask();
}
private boolean isInMinusOne() {
@@ -270,7 +271,8 @@
return launcher != null
&& launcher.getStateManager().getState() == NORMAL
&& !launcher.isStarted()
- && TopTaskTracker.INSTANCE.get(launcher).getCachedTopTask(false).isHomeTask();
+ && TopTaskTracker.INSTANCE.get(launcher).getCachedTopTask(false,
+ launcher.getDisplayId()).isHomeTask();
}
@Override
@@ -298,16 +300,16 @@
}
@Override
- public @Nullable Animator getParallelAnimationToLauncher(GestureEndTarget endTarget,
+ public @Nullable Animator getParallelAnimationToGestureEndTarget(GestureEndTarget endTarget,
long duration, RecentsAnimationCallbacks callbacks) {
LauncherTaskbarUIController uiController = getTaskbarController();
- Animator superAnimator = super.getParallelAnimationToLauncher(
+ Animator superAnimator = super.getParallelAnimationToGestureEndTarget(
endTarget, duration, callbacks);
if (uiController == null || callbacks == null) {
return superAnimator;
}
- LauncherState toState = stateFromGestureEndTarget(endTarget);
- Animator taskbarAnimator = uiController.createAnimToLauncher(toState, callbacks, duration);
+ Animator taskbarAnimator = uiController.getParallelAnimationToGestureEndTarget(endTarget,
+ duration, callbacks);
if (superAnimator == null) {
return taskbarAnimator;
} else {
diff --git a/quickstep/src/com/android/quickstep/OverviewCommandHelper.kt b/quickstep/src/com/android/quickstep/OverviewCommandHelper.kt
index 6a9c3dd..8b9a3da 100644
--- a/quickstep/src/com/android/quickstep/OverviewCommandHelper.kt
+++ b/quickstep/src/com/android/quickstep/OverviewCommandHelper.kt
@@ -450,10 +450,10 @@
)
gestureState.isHandlingAtomicEvent = true
val interactionHandler =
- touchInteractionService.swipeUpHandlerFactory.newHandler(
- gestureState,
- command.createTime,
- )
+ touchInteractionService
+ // TODO(b/404757863): use command.displayId instead of focusedDisplayId.
+ .getSwipeUpHandlerFactory(focusedDisplayId)
+ .newHandler(gestureState, command.createTime)
interactionHandler.setGestureEndCallback {
onTransitionComplete(command, interactionHandler, onCallbackResult)
}
@@ -570,12 +570,7 @@
private fun updateRecentsViewFocus(command: CommandInfo) {
val recentsView: RecentsView<*, *> = getVisibleRecentsView(command.displayId) ?: return
- if (
- command.type != KEYBOARD_INPUT &&
- command.type != HIDE &&
- command.type != SHOW &&
- command.type != TOGGLE
- ) {
+ if (command.type != KEYBOARD_INPUT && command.type != HIDE && command.type != SHOW) {
return
}
diff --git a/quickstep/src/com/android/quickstep/OverviewComponentObserver.java b/quickstep/src/com/android/quickstep/OverviewComponentObserver.java
index 7d3a1da..e7386dc 100644
--- a/quickstep/src/com/android/quickstep/OverviewComponentObserver.java
+++ b/quickstep/src/com/android/quickstep/OverviewComponentObserver.java
@@ -24,6 +24,7 @@
import static com.android.launcher3.Flags.enableOverviewOnConnectedDisplays;
import static com.android.launcher3.config.FeatureFlags.SEPARATE_RECENTS_ACTIVITY;
import static com.android.launcher3.util.Executors.MAIN_EXECUTOR;
+import static com.android.quickstep.fallback.window.RecentsWindowFlags.enableFallbackOverviewInWindow;
import static com.android.quickstep.fallback.window.RecentsWindowFlags.enableLauncherOverviewInWindow;
import static com.android.systemui.shared.system.PackageManagerWrapper.ACTION_PREFERRED_ACTIVITY_CHANGED;
@@ -50,7 +51,6 @@
import com.android.launcher3.util.DaggerSingletonTracker;
import com.android.launcher3.util.SimpleBroadcastReceiver;
import com.android.quickstep.fallback.window.RecentsDisplayModel;
-import com.android.quickstep.fallback.window.RecentsWindowFlags;
import com.android.quickstep.util.ActiveGestureProtoLogProxy;
import com.android.systemui.shared.system.PackageManagerWrapper;
@@ -181,7 +181,7 @@
mDefaultDisplayContainerInterface.onAssistantVisibilityChanged(0.f);
}
- if (SEPARATE_RECENTS_ACTIVITY.get() || enableLauncherOverviewInWindow.isTrue()) {
+ if (SEPARATE_RECENTS_ACTIVITY.get()) {
mIsDefaultHome = false;
if (defaultHome == null) {
defaultHome = mMyHomeIntent.getComponent();
@@ -194,8 +194,13 @@
+ ", mIsDefaultHome=" + mIsDefaultHome);
if (!mIsHomeDisabled && (defaultHome == null || mIsDefaultHome)) {
- // User default home is same as out home app. Use Overview integrated in Launcher.
- mDefaultDisplayContainerInterface = LauncherActivityInterface.INSTANCE;
+ // User default home is same as our home app. Use Overview integrated in Launcher.
+ if (enableLauncherOverviewInWindow.isTrue()) {
+ mDefaultDisplayContainerInterface =
+ mRecentsDisplayModel.getFallbackWindowInterface(DEFAULT_DISPLAY);
+ } else {
+ mDefaultDisplayContainerInterface = LauncherActivityInterface.INSTANCE;
+ }
mIsHomeAndOverviewSame = true;
mOverviewIntent = mMyHomeIntent;
mCurrentHomeIntent.setComponent(mMyHomeIntent.getComponent());
@@ -204,7 +209,7 @@
unregisterOtherHomeAppUpdateReceiver();
} else {
// The default home app is a different launcher. Use the fallback Overview instead.
- if (RecentsWindowFlags.Companion.getEnableOverviewInWindow()) {
+ if (enableFallbackOverviewInWindow.isTrue()) {
mDefaultDisplayContainerInterface =
mRecentsDisplayModel.getFallbackWindowInterface(DEFAULT_DISPLAY);
} else {
@@ -290,12 +295,16 @@
}
/**
- * Returns true if home and overview are same activity.
+ * Returns true if home and overview are same process.
*/
public boolean isHomeAndOverviewSame() {
return mIsHomeAndOverviewSame;
}
+ public boolean isHomeAndOverviewSameActivity() {
+ return isHomeAndOverviewSame() && !enableLauncherOverviewInWindow.isTrue();
+ }
+
/**
* Get the current control helper for managing interactions to the overview container for
* the given displayId.
diff --git a/quickstep/src/com/android/quickstep/RecentTasksList.java b/quickstep/src/com/android/quickstep/RecentTasksList.java
index dab78c5..a772415 100644
--- a/quickstep/src/com/android/quickstep/RecentTasksList.java
+++ b/quickstep/src/com/android/quickstep/RecentTasksList.java
@@ -504,7 +504,7 @@
for (TaskInfo taskInfo : recentTaskInfo.getTaskInfoList()) {
Task task = createTask(taskInfo, minimizedTaskIds);
List<Task> tasks = perDisplayTasks.computeIfAbsent(
- ExternalDisplaysKt.getDisplayId(task),
+ ExternalDisplaysKt.getSafeDisplayId(task),
k -> new ArrayList<>());
tasks.add(task);
}
diff --git a/quickstep/src/com/android/quickstep/RemoteTargetGluer.java b/quickstep/src/com/android/quickstep/RemoteTargetGluer.java
index f96bbcb..943f543 100644
--- a/quickstep/src/com/android/quickstep/RemoteTargetGluer.java
+++ b/quickstep/src/com/android/quickstep/RemoteTargetGluer.java
@@ -68,8 +68,10 @@
* running tasks
*/
public RemoteTargetGluer(Context context, BaseContainerInterface sizingStrategy) {
+ // TODO: b/403344864 Make sure init with correct number of RemoteTargetHandle with
+ // multi-desks feature enabled as well.
int visibleTasksCount = DesktopVisibilityController.INSTANCE.get(context)
- .getVisibleDesktopTasksCount();
+ .getVisibleDesktopTasksCountDeprecated();
if (visibleTasksCount > 0) {
// Allocate +1 to account for a new task added to the desktop mode
int numHandles = visibleTasksCount + 1;
diff --git a/quickstep/src/com/android/quickstep/SystemDecorationChangeObserver.kt b/quickstep/src/com/android/quickstep/SystemDecorationChangeObserver.kt
new file mode 100644
index 0000000..4559478
--- /dev/null
+++ b/quickstep/src/com/android/quickstep/SystemDecorationChangeObserver.kt
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.quickstep
+
+import android.content.Context
+import android.util.Log
+import com.android.launcher3.dagger.ApplicationContext
+import com.android.launcher3.dagger.LauncherAppSingleton
+import com.android.launcher3.util.DaggerSingletonObject
+import com.android.launcher3.util.Executors.MAIN_EXECUTOR
+import com.android.quickstep.dagger.QuickstepBaseAppComponent
+import javax.inject.Inject
+
+@LauncherAppSingleton
+class SystemDecorationChangeObserver @Inject constructor(@ApplicationContext context: Context) {
+ companion object {
+ private const val TAG = "SystemDecorationChangeObserver"
+ private const val DEBUG = false
+
+ @JvmStatic
+ val INSTANCE: DaggerSingletonObject<SystemDecorationChangeObserver> =
+ DaggerSingletonObject<SystemDecorationChangeObserver>(
+ QuickstepBaseAppComponent::getSystemDecorationChangeObserver
+ )
+ }
+
+ interface DisplayDecorationListener {
+ fun onDisplayAddSystemDecorations(displayId: Int)
+
+ fun onDisplayRemoved(displayId: Int)
+
+ fun onDisplayRemoveSystemDecorations(displayId: Int)
+ }
+
+ fun notifyAddSystemDecorations(displayId: Int) {
+ if (DEBUG) Log.d(TAG, "SystemDecorationAdded: $displayId")
+ for (listener in mDisplayDecorationListeners) {
+ MAIN_EXECUTOR.execute { listener.onDisplayAddSystemDecorations(displayId) }
+ }
+ }
+
+ fun notifyOnDisplayRemoved(displayId: Int) {
+ if (DEBUG) Log.d(TAG, "displayRemoved: $displayId")
+ for (listener in mDisplayDecorationListeners) {
+ MAIN_EXECUTOR.execute { listener.onDisplayRemoved(displayId) }
+ }
+ }
+
+ fun notifyDisplayRemoveSystemDecorations(displayId: Int) {
+ if (DEBUG) Log.d(TAG, "SystemDecorationRemoved: $displayId")
+ for (listener in mDisplayDecorationListeners) {
+ MAIN_EXECUTOR.execute { listener.onDisplayRemoveSystemDecorations(displayId) }
+ }
+ }
+
+ private val mDisplayDecorationListeners = ArrayList<DisplayDecorationListener>()
+
+ fun registerDisplayDecorationListener(listener: DisplayDecorationListener) {
+ if (DEBUG) Log.d(TAG, "registerDisplayDecorationListener")
+ mDisplayDecorationListeners.add(listener)
+ }
+
+ fun unregisterDisplayDecorationListener(listener: DisplayDecorationListener) {
+ if (DEBUG) Log.d(TAG, "unregisterDisplayDecorationListener")
+ mDisplayDecorationListeners.remove(listener)
+ }
+}
diff --git a/quickstep/src/com/android/quickstep/TaskAnimationManager.java b/quickstep/src/com/android/quickstep/TaskAnimationManager.java
index 4f00381..cf0a3d5 100644
--- a/quickstep/src/com/android/quickstep/TaskAnimationManager.java
+++ b/quickstep/src/com/android/quickstep/TaskAnimationManager.java
@@ -59,6 +59,7 @@
import java.io.PrintWriter;
import java.util.HashMap;
+import java.util.Locale;
public class TaskAnimationManager implements RecentsAnimationCallbacks.RecentsAnimationListener {
public static final boolean SHELL_TRANSITIONS_ROTATION =
@@ -132,6 +133,17 @@
public RecentsAnimationCallbacks startRecentsAnimation(@NonNull GestureState gestureState,
Intent intent, RecentsAnimationCallbacks.RecentsAnimationListener listener) {
ActiveGestureProtoLogProxy.logStartRecentsAnimation();
+ // Check displayId
+ if (mDisplayId != gestureState.getDisplayId()) {
+ String msg = String.format(Locale.ENGLISH,
+ "Constructor displayId %d does not equal gestureState display id %d",
+ mDisplayId, gestureState.getDisplayId());
+ if (FeatureFlags.IS_STUDIO_BUILD) {
+ throw new IllegalArgumentException(msg);
+ } else {
+ Log.e("TaskAnimationManager", msg, new Exception());
+ }
+ }
// Notify if recents animation is still running
if (mController != null) {
String msg = "New recents animation started before old animation completed";
@@ -239,11 +251,11 @@
RemoteAnimationTarget appearedTaskTarget = appearedTaskTargets[0];
BaseContainerInterface containerInterface =
mLastGestureState.getContainerInterface();
-
for (RemoteAnimationTarget compat : appearedTaskTargets) {
if (compat.windowConfiguration.getActivityType() == ACTIVITY_TYPE_HOME
&& containerInterface.getCreatedContainer() instanceof RecentsActivity
- && DisplayController.getNavigationMode(mCtx) != NO_BUTTON) {
+ && DisplayController.INSTANCE.get(mCtx).getInfoForDisplay(
+ mDisplayId).getNavigationMode() != NO_BUTTON) {
// The only time we get onTasksAppeared() in button navigation with a
// 3p launcher is if the user goes to overview first, and in this case we
// can immediately finish the transition
diff --git a/quickstep/src/com/android/quickstep/TaskOverlayFactory.java b/quickstep/src/com/android/quickstep/TaskOverlayFactory.java
index df66a5e..ae6bfbc 100644
--- a/quickstep/src/com/android/quickstep/TaskOverlayFactory.java
+++ b/quickstep/src/com/android/quickstep/TaskOverlayFactory.java
@@ -202,10 +202,14 @@
*/
public void initOverlay(Task task, @Nullable Bitmap thumbnail, Matrix matrix,
boolean rotated) {
- getActionsView().updateDisabledFlags(DISABLED_NO_THUMBNAIL, thumbnail == null);
+ if (!enableRefactorTaskThumbnail()) {
+ getActionsView().updateDisabledFlags(DISABLED_NO_THUMBNAIL, thumbnail == null);
+ }
if (thumbnail != null) {
- getActionsView().updateDisabledFlags(DISABLED_ROTATED, rotated);
+ if (!enableRefactorTaskThumbnail()) {
+ getActionsView().updateDisabledFlags(DISABLED_ROTATED, rotated);
+ }
getActionsView().setCallbacks(new OverlayUICallbacksImpl(isRealSnapshot(), task));
}
}
diff --git a/quickstep/src/com/android/quickstep/TopTaskTracker.java b/quickstep/src/com/android/quickstep/TopTaskTracker.java
index 8116a88..7e773e3 100644
--- a/quickstep/src/com/android/quickstep/TopTaskTracker.java
+++ b/quickstep/src/com/android/quickstep/TopTaskTracker.java
@@ -22,8 +22,10 @@
import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
import static android.view.Display.DEFAULT_DISPLAY;
+import static com.android.launcher3.Flags.enableOverviewOnConnectedDisplays;
import static com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_TOP_OR_LEFT;
import static com.android.launcher3.util.SplitConfigurationOptions.STAGE_TYPE_A;
+import static com.android.quickstep.fallback.window.RecentsWindowFlags.enableOverviewOnConnectedDisplays;
import static com.android.wm.shell.Flags.enableShellTopTaskTracking;
import static com.android.wm.shell.Flags.enableFlexibleSplit;
import static com.android.wm.shell.shared.GroupedTaskInfo.TYPE_SPLIT;
@@ -47,6 +49,7 @@
import com.android.launcher3.util.TraceHelper;
import com.android.quickstep.dagger.QuickstepBaseAppComponent;
import com.android.quickstep.util.DesksUtils;
+import com.android.quickstep.util.ExternalDisplaysKt;
import com.android.systemui.shared.recents.model.Task;
import com.android.systemui.shared.recents.model.Task.TaskKey;
import com.android.systemui.shared.system.ActivityManagerWrapper;
@@ -316,21 +319,26 @@
*/
@NonNull
@UiThread
- public CachedTaskInfo getCachedTopTask(boolean filterOnlyVisibleRecents) {
+ public CachedTaskInfo getCachedTopTask(boolean filterOnlyVisibleRecents, int displayId) {
if (enableShellTopTaskTracking()) {
// TODO(346588978): Currently ignore filterOnlyVisibleRecents, but perhaps make this an
// explicit filter For things to ignore (ie. PIP/Bubbles/Assistant/etc/so that this is
// explicit)
- // TODO(346588978): This assumes default display as gesture nav is only supported there
- return new CachedTaskInfo(mVisibleTasks.get(DEFAULT_DISPLAY));
+ return new CachedTaskInfo(mVisibleTasks.get(displayId));
} else {
if (filterOnlyVisibleRecents) {
// Since we only know about the top most task, any filtering may not be applied on
// the cache. The second to top task may change while the top task is still the
// same.
- RunningTaskInfo[] tasks = TraceHelper.allowIpcs("getCachedTopTask.true", () ->
+ TaskInfo[] tasks = TraceHelper.allowIpcs("getCachedTopTask.true", () ->
ActivityManagerWrapper.getInstance().getRunningTasks(true));
- return new CachedTaskInfo(Arrays.asList(tasks));
+ if (enableOverviewOnConnectedDisplays()) {
+ return new CachedTaskInfo(Arrays.stream(tasks).filter(
+ info -> ExternalDisplaysKt.getSafeDisplayId(info)
+ == displayId).toList());
+ } else {
+ return new CachedTaskInfo(Arrays.asList(tasks));
+ }
}
if (mOrderedTaskList.isEmpty()) {
@@ -344,7 +352,12 @@
// Strip the pinned task and recents task
tasks.removeIf(t -> t.taskId == mPinnedTaskId || isRecentsTask(t)
|| DesksUtils.isDesktopWallpaperTask(t));
- return new CachedTaskInfo(tasks);
+ if (enableOverviewOnConnectedDisplays()) {
+ return new CachedTaskInfo(tasks.stream().filter(
+ info -> ExternalDisplaysKt.getSafeDisplayId(info) == displayId).toList());
+ } else {
+ return new CachedTaskInfo(tasks);
+ }
}
}
diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java
index 7878e68..30936ad 100644
--- a/quickstep/src/com/android/quickstep/TouchInteractionService.java
+++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java
@@ -95,7 +95,6 @@
import com.android.quickstep.OverviewComponentObserver.OverviewChangeListener;
import com.android.quickstep.fallback.window.RecentsDisplayModel;
import com.android.quickstep.fallback.window.RecentsDisplayModel.RecentsDisplayResource;
-import com.android.quickstep.fallback.window.RecentsWindowFlags;
import com.android.quickstep.fallback.window.RecentsWindowSwipeHandler;
import com.android.quickstep.inputconsumers.BubbleBarInputConsumer;
import com.android.quickstep.inputconsumers.OneHandedModeInputConsumer;
@@ -315,32 +314,25 @@
@BinderThread
@Override
public void onDisplayAddSystemDecorations(int displayId) {
- executeForTaskbarManager(taskbarManager ->
- taskbarManager.onDisplayAddSystemDecorations(displayId));
-
- executeForRecentsDisplayModel(displayModel ->
- displayModel.onDisplayAddSystemDecorations(displayId));
+ executeForTouchInteractionService(tis ->
+ tis.mSystemDecorationChangeObserver.notifyAddSystemDecorations(displayId));
}
@BinderThread
@Override
public void onDisplayRemoved(int displayId) {
- executeForTaskbarManager(taskbarManager ->
- taskbarManager.onDisplayRemoved(displayId));
executeForTouchInteractionService(tis -> {
+ tis.mSystemDecorationChangeObserver.notifyOnDisplayRemoved(displayId);
tis.mDeviceState.clearSysUIStateFlagsForDisplay(displayId);
});
- executeForRecentsDisplayModel(displayModel ->
- displayModel.onDisplayRemoved(displayId));
}
@BinderThread
@Override
public void onDisplayRemoveSystemDecorations(int displayId) {
- executeForTaskbarManager(taskbarManager ->
- taskbarManager.onDisplayRemoveSystemDecorations(displayId));
- executeForRecentsDisplayModel(displayModel ->
- displayModel.onDisplayRemoveSystemDecorations(displayId));
+ executeForTouchInteractionService(tis -> {
+ tis.mSystemDecorationChangeObserver.notifyDisplayRemoveSystemDecorations(displayId);
+ });
}
@BinderThread
@@ -452,15 +444,6 @@
}));
}
- private void executeForRecentsDisplayModel(
- @NonNull Consumer<RecentsDisplayModel> recentsDisplayModelConsumer) {
- MAIN_EXECUTOR.execute(() -> executeForTouchInteractionService(tis -> {
- RecentsDisplayModel recentsDisplayModel = tis.mRecentsDisplayModel;
- if (recentsDisplayModel == null) return;
- recentsDisplayModelConsumer.accept(recentsDisplayModel);
- }));
- }
-
/**
* Returns the {@link TaskbarManager}.
* <p>
@@ -597,6 +580,8 @@
private RecentsDisplayModel mRecentsDisplayModel;
+ private SystemDecorationChangeObserver mSystemDecorationChangeObserver;
+
@Override
public void onCreate() {
super.onCreate();
@@ -608,6 +593,7 @@
mDeviceState = RecentsAnimationDeviceState.INSTANCE.get(this);
mRotationTouchHelper = RotationTouchHelper.INSTANCE.get(this);
mRecentsDisplayModel = RecentsDisplayModel.getINSTANCE().get(this);
+ mSystemDecorationChangeObserver = SystemDecorationChangeObserver.getINSTANCE().get(this);
mAllAppsActionManager = new AllAppsActionManager(
this, UI_HELPER_EXECUTOR, this::createAllAppsPendingIntent);
mTrackpadsConnected = new ActiveTrackpadList(this, () -> {
@@ -965,7 +951,7 @@
mGestureState,
taskAnimationManager,
inputMonitorCompat,
- getSwipeUpHandlerFactory(),
+ getSwipeUpHandlerFactory(displayId),
this::onConsumerInactive,
inputEventReceiver,
mTaskbarManager,
@@ -1062,7 +1048,8 @@
private boolean isHoverActionWithoutConsumer(MotionEvent event) {
// Only process these events when taskbar is present.
- TaskbarActivityContext tac = mTaskbarManager.getCurrentActivityContext();
+ int displayId = event.getDisplayId();
+ TaskbarActivityContext tac = mTaskbarManager.getTaskbarForDisplay(displayId);
boolean isTaskbarPresent = tac != null && tac.getDeviceProfile().isTaskbarPresent
&& !tac.isPhoneMode();
return event.isHoverEvent() && (mUncheckedConsumer.getType() & TYPE_CURSOR_HOVER) == 0
@@ -1089,7 +1076,7 @@
// previousTaskInfo can be null iff previousGestureState == GestureState.DEFAULT_STATE
taskInfo = previousTaskInfo != null
? previousTaskInfo
- : TopTaskTracker.INSTANCE.get(this).getCachedTopTask(false);
+ : TopTaskTracker.INSTANCE.get(this).getCachedTopTask(false, displayId);
gestureState.updateRunningTask(taskInfo);
gestureState.updateLastStartedTaskIds(previousGestureState.getLastStartedTaskIds());
gestureState.updatePreviouslyAppearedTaskIds(
@@ -1099,7 +1086,7 @@
mOverviewComponentObserver,
displayId,
ActiveGestureLog.INSTANCE.incrementLogId());
- taskInfo = TopTaskTracker.INSTANCE.get(this).getCachedTopTask(false);
+ taskInfo = TopTaskTracker.INSTANCE.get(this).getCachedTopTask(false, displayId);
gestureState.updateRunningTask(taskInfo);
}
gestureState.setTrackpadGestureType(trackpadGestureType);
@@ -1110,11 +1097,20 @@
return gestureState;
}
- public AbsSwipeUpHandler.Factory getSwipeUpHandlerFactory() {
- return mOverviewComponentObserver.isHomeAndOverviewSame()
- ? mLauncherSwipeHandlerFactory
- : (RecentsWindowFlags.Companion.getEnableOverviewInWindow()
- ? mRecentsWindowSwipeHandlerFactory : mFallbackSwipeHandlerFactory);
+ /**
+ * Returns a AbsSwipeUpHandler.Factory, used to instantiate AbsSwipeUpHandler later.
+ * @param displayId The displayId of the display this handler will be used on.
+ */
+ public AbsSwipeUpHandler.Factory getSwipeUpHandlerFactory(int displayId) {
+ BaseContainerInterface<?, ?> containerInterface =
+ mOverviewComponentObserver.getContainerInterface(displayId);
+ if (containerInterface instanceof FallbackWindowInterface) {
+ return mRecentsWindowSwipeHandlerFactory;
+ } else if (containerInterface instanceof LauncherActivityInterface) {
+ return mLauncherSwipeHandlerFactory;
+ } else {
+ return mFallbackSwipeHandlerFactory;
+ }
}
/**
diff --git a/quickstep/src/com/android/quickstep/dagger/QuickstepBaseAppComponent.java b/quickstep/src/com/android/quickstep/dagger/QuickstepBaseAppComponent.java
index d79a8ea..23b8a82 100644
--- a/quickstep/src/com/android/quickstep/dagger/QuickstepBaseAppComponent.java
+++ b/quickstep/src/com/android/quickstep/dagger/QuickstepBaseAppComponent.java
@@ -25,6 +25,7 @@
import com.android.quickstep.RecentsModel;
import com.android.quickstep.RotationTouchHelper;
import com.android.quickstep.SimpleOrientationTouchTransformer;
+import com.android.quickstep.SystemDecorationChangeObserver;
import com.android.quickstep.SystemUiProxy;
import com.android.quickstep.TopTaskTracker;
import com.android.quickstep.fallback.window.RecentsDisplayModel;
@@ -71,4 +72,5 @@
SimpleOrientationTouchTransformer getSimpleOrientationTouchTransformer();
+ SystemDecorationChangeObserver getSystemDecorationChangeObserver();
}
diff --git a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsStateController.java b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsStateController.java
index 554cea2..7db1813 100644
--- a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsStateController.java
+++ b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsStateController.java
@@ -19,6 +19,7 @@
import static com.android.app.animation.Interpolators.INSTANT;
import static com.android.app.animation.Interpolators.LINEAR;
import static com.android.launcher3.Flags.enableDesktopExplodedView;
+import static com.android.launcher3.Flags.enableGridOnlyOverview;
import static com.android.launcher3.Flags.enableLargeDesktopWindowingTile;
import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_MODAL;
import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_SCALE;
@@ -118,7 +119,9 @@
config.getInterpolator(ANIM_OVERVIEW_TRANSLATE_Y, LINEAR));
setter.setFloat(mRecentsView, TASK_MODALNESS, state.getOverviewModalness(),
- config.getInterpolator(ANIM_OVERVIEW_MODAL, LINEAR));
+ config.getInterpolator(ANIM_OVERVIEW_MODAL,
+ enableGridOnlyOverview() && !state.isRecentsViewVisible() ? FINAL_FRAME
+ : LINEAR));
setter.setFloat(mRecentsView, FULLSCREEN_PROGRESS, state.isFullScreen() ? 1 : 0, LINEAR);
boolean showAsGrid =
state.displayOverviewTasksAsGrid(mRecentsViewContainer.getDeviceProfile());
diff --git a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java
index 29b6626..695c77c 100644
--- a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java
+++ b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java
@@ -17,6 +17,7 @@
import static android.app.ActivityTaskManager.INVALID_TASK_ID;
+import static com.android.launcher3.Flags.enableGridOnlyOverview;
import static com.android.quickstep.GestureState.GestureEndTarget.RECENTS;
import static com.android.quickstep.fallback.RecentsState.DEFAULT;
import static com.android.quickstep.fallback.RecentsState.MODAL_TASK;
@@ -252,7 +253,14 @@
@Override
public void onStateTransitionStart(RecentsState toState) {
setOverviewStateEnabled(true);
- setOverviewGridEnabled(toState.displayOverviewTasksAsGrid(mContainer.getDeviceProfile()));
+ if (enableGridOnlyOverview()) {
+ if (toState.displayOverviewTasksAsGrid(mContainer.getDeviceProfile())) {
+ setOverviewGridEnabled(true);
+ }
+ } else {
+ setOverviewGridEnabled(
+ toState.displayOverviewTasksAsGrid(mContainer.getDeviceProfile()));
+ }
setOverviewFullscreenEnabled(toState.isFullScreen());
if (toState == MODAL_TASK) {
setOverviewSelectEnabled(true);
@@ -271,6 +279,11 @@
@Override
public void onStateTransitionComplete(RecentsState finalState) {
DesktopVisibilityController.INSTANCE.get(mContainer).onLauncherStateChanged(finalState);
+ if (enableGridOnlyOverview()) {
+ if (!finalState.displayOverviewTasksAsGrid(mContainer.getDeviceProfile())) {
+ setOverviewGridEnabled(false);
+ }
+ }
if (!finalState.isRecentsViewVisible()) {
// Clean-up logic that occurs when recents is no longer in use/visible.
reset();
diff --git a/quickstep/src/com/android/quickstep/fallback/RecentsState.java b/quickstep/src/com/android/quickstep/fallback/RecentsState.java
index 2c1a4eb..77aac41 100644
--- a/quickstep/src/com/android/quickstep/fallback/RecentsState.java
+++ b/quickstep/src/com/android/quickstep/fallback/RecentsState.java
@@ -17,6 +17,7 @@
import static com.android.launcher3.Flags.enableDesktopExplodedView;
import static com.android.launcher3.Flags.enableDesktopWindowingCarouselDetach;
+import static com.android.launcher3.Flags.enableGridOnlyOverview;
import static com.android.launcher3.LauncherState.FLAG_CLOSE_POPUPS;
import static com.android.launcher3.uioverrides.states.BackgroundAppState.getOverviewScaleAndOffsetForBackgroundState;
import static com.android.launcher3.uioverrides.states.OverviewModalTaskState.getOverviewScaleAndOffsetForModalState;
@@ -49,23 +50,31 @@
private static final int FLAG_ADD_DESK_BUTTON = BaseState.getFlag(10);
private static final int FLAG_SHOW_EXPLODED_DESKTOP_VIEW = BaseState.getFlag(11);
+ public static final int DEFAULT_STATE_ORDINAL = 0;
+ public static final int MODAL_TASK_ORDINAL = 1;
+ public static final int BACKGROUND_APP_ORDINAL = 2;
+ public static final int HOME_STATE_ORDINAL = 3;
+ public static final int BG_LAUNCHER_ORDINAL = 4;
+ public static final int OVERVIEW_SPLIT_SELECT_ORDINAL = 5;
+
private static final RecentsState[] sAllStates = new RecentsState[6];
- public static final RecentsState DEFAULT = new RecentsState(0,
+ public static final RecentsState DEFAULT = new RecentsState(DEFAULT_STATE_ORDINAL,
FLAG_DISABLE_RESTORE | FLAG_CLEAR_ALL_BUTTON | FLAG_OVERVIEW_ACTIONS | FLAG_SHOW_AS_GRID
| FLAG_SCRIM | FLAG_LIVE_TILE | FLAG_RECENTS_VIEW_VISIBLE
| FLAG_ADD_DESK_BUTTON | FLAG_SHOW_EXPLODED_DESKTOP_VIEW);
- public static final RecentsState MODAL_TASK = new ModalState(1,
+ public static final RecentsState MODAL_TASK = new ModalState(MODAL_TASK_ORDINAL,
FLAG_DISABLE_RESTORE | FLAG_OVERVIEW_ACTIONS | FLAG_MODAL
| FLAG_SHOW_AS_GRID | FLAG_SCRIM | FLAG_LIVE_TILE | FLAG_RECENTS_VIEW_VISIBLE
| FLAG_SHOW_EXPLODED_DESKTOP_VIEW);
- public static final RecentsState BACKGROUND_APP = new BackgroundAppState(2,
+ public static final RecentsState BACKGROUND_APP = new BackgroundAppState(BACKGROUND_APP_ORDINAL,
FLAG_DISABLE_RESTORE | FLAG_NON_INTERACTIVE | FLAG_FULL_SCREEN
| FLAG_RECENTS_VIEW_VISIBLE | FLAG_TASK_THUMBNAIL_SPLASH
| FLAG_DETACH_DESKTOP_CAROUSEL);
- public static final RecentsState HOME = new RecentsState(3, 0);
- public static final RecentsState BG_LAUNCHER = new LauncherState(4, 0);
- public static final RecentsState OVERVIEW_SPLIT_SELECT = new RecentsState(5,
+ public static final RecentsState HOME = new RecentsState(HOME_STATE_ORDINAL, 0);
+ public static final RecentsState BG_LAUNCHER = new LauncherState(BG_LAUNCHER_ORDINAL, 0);
+ public static final RecentsState OVERVIEW_SPLIT_SELECT = new RecentsState(
+ OVERVIEW_SPLIT_SELECT_ORDINAL,
FLAG_SHOW_AS_GRID | FLAG_SCRIM | FLAG_RECENTS_VIEW_VISIBLE | FLAG_CLOSE_POPUPS
| FLAG_DISABLE_RESTORE | FLAG_SHOW_EXPLODED_DESKTOP_VIEW);
@@ -89,7 +98,15 @@
@Override
public String toString() {
- return "Ordinal-" + ordinal;
+ return switch (ordinal) {
+ case DEFAULT_STATE_ORDINAL -> "DEFAULT";
+ case MODAL_TASK_ORDINAL -> "MODAL_TASK";
+ case BACKGROUND_APP_ORDINAL -> "BACKGROUND_APP";
+ case HOME_STATE_ORDINAL -> "HOME";
+ case BG_LAUNCHER_ORDINAL -> "BG_LAUNCHER";
+ case OVERVIEW_SPLIT_SELECT_ORDINAL -> "SPLIT_SELECT";
+ default -> "Unknown Ordinal-" + ordinal;
+ };
}
@Override
@@ -197,6 +214,9 @@
@Override
public float[] getOverviewScaleAndOffset(RecentsViewContainer container) {
+ if (enableGridOnlyOverview()) {
+ return super.getOverviewScaleAndOffset(container);
+ }
return getOverviewScaleAndOffsetForModalState(container.getOverviewPanel());
}
}
diff --git a/quickstep/src/com/android/quickstep/fallback/RecentsStateUtils.kt b/quickstep/src/com/android/quickstep/fallback/RecentsStateUtils.kt
new file mode 100644
index 0000000..fec8a80
--- /dev/null
+++ b/quickstep/src/com/android/quickstep/fallback/RecentsStateUtils.kt
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.quickstep.fallback
+
+import com.android.launcher3.LauncherState
+
+fun RecentsState.toLauncherState(): LauncherState {
+ return when (ordinal) {
+ RecentsState.DEFAULT_STATE_ORDINAL -> LauncherState.OVERVIEW
+ RecentsState.MODAL_TASK_ORDINAL -> LauncherState.OVERVIEW_MODAL_TASK
+ RecentsState.BACKGROUND_APP_ORDINAL -> LauncherState.BACKGROUND_APP
+ RecentsState.HOME_STATE_ORDINAL -> LauncherState.NORMAL
+ RecentsState.BG_LAUNCHER_ORDINAL -> LauncherState.NORMAL
+ RecentsState.OVERVIEW_SPLIT_SELECT_ORDINAL -> LauncherState.OVERVIEW_SPLIT_SELECT
+ else -> LauncherState.NORMAL
+ }
+}
+
+fun RecentsState.toLauncherStateOrdinal(): Int = toLauncherState().ordinal
diff --git a/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowManager.kt b/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowManager.kt
index 1a3a2e3..bc08af2 100644
--- a/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowManager.kt
+++ b/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowManager.kt
@@ -44,9 +44,6 @@
import com.android.launcher3.statemanager.StatefulContainer
import com.android.launcher3.taskbar.TaskbarUIController
import com.android.launcher3.testing.TestLogging
-import com.android.launcher3.testing.shared.TestProtocol.NORMAL_STATE_ORDINAL
-import com.android.launcher3.testing.shared.TestProtocol.OVERVIEW_SPLIT_SELECT_ORDINAL
-import com.android.launcher3.testing.shared.TestProtocol.OVERVIEW_STATE_ORDINAL
import com.android.launcher3.testing.shared.TestProtocol.SEQUENCE_MAIN
import com.android.launcher3.util.ContextTracker
import com.android.launcher3.util.DisplayController
@@ -70,8 +67,7 @@
import com.android.quickstep.fallback.RecentsState.BG_LAUNCHER
import com.android.quickstep.fallback.RecentsState.DEFAULT
import com.android.quickstep.fallback.RecentsState.HOME
-import com.android.quickstep.fallback.RecentsState.MODAL_TASK
-import com.android.quickstep.fallback.RecentsState.OVERVIEW_SPLIT_SELECT
+import com.android.quickstep.fallback.toLauncherStateOrdinal
import com.android.quickstep.util.RecentsAtomicAnimationFactory
import com.android.quickstep.util.RecentsWindowProtoLogProxy
import com.android.quickstep.util.SplitSelectStateController
@@ -355,40 +351,16 @@
override fun onStateSetStart(state: RecentsState) {
super.onStateSetStart(state)
- RecentsWindowProtoLogProxy.logOnStateSetStart(getStateName(state))
+ RecentsWindowProtoLogProxy.logOnStateSetStart(state.toString())
}
override fun onStateSetEnd(state: RecentsState) {
super.onStateSetEnd(state)
- RecentsWindowProtoLogProxy.logOnStateSetEnd(getStateName(state))
+ RecentsWindowProtoLogProxy.logOnStateSetEnd(state.toString())
if (state == HOME || state == BG_LAUNCHER) {
cleanupRecentsWindow()
}
- when (state) {
- HOME,
- BG_LAUNCHER ->
- AccessibilityManagerCompat.sendStateEventToTest(baseContext, NORMAL_STATE_ORDINAL)
- DEFAULT ->
- AccessibilityManagerCompat.sendStateEventToTest(baseContext, OVERVIEW_STATE_ORDINAL)
- OVERVIEW_SPLIT_SELECT ->
- AccessibilityManagerCompat.sendStateEventToTest(
- baseContext,
- OVERVIEW_SPLIT_SELECT_ORDINAL,
- )
- }
- }
-
- private fun getStateName(state: RecentsState?): String {
- return when (state) {
- null -> "NULL"
- DEFAULT -> "DEFAULT"
- MODAL_TASK -> "MODAL_TASK"
- BACKGROUND_APP -> "BACKGROUND_APP"
- HOME -> "HOME"
- BG_LAUNCHER -> "BG_LAUNCHER"
- OVERVIEW_SPLIT_SELECT -> "OVERVIEW_SPLIT_SELECT"
- else -> "ordinal=" + state.ordinal
- }
+ AccessibilityManagerCompat.sendStateEventToTest(baseContext, state.toLauncherStateOrdinal())
}
override fun getSystemUiController(): SystemUiController? {
diff --git a/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowSwipeHandler.java b/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowSwipeHandler.java
index 1d85feb..b365ddf 100644
--- a/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowSwipeHandler.java
+++ b/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowSwipeHandler.java
@@ -222,6 +222,7 @@
@Override
protected void finishRecentsControllerToHome(Runnable callback) {
final Runnable recentsCallback;
+ // TODO(b/404866791): check if this is actually necessary for this recents-in-window class
if (mAppCanEnterPip) {
// Make sure Launcher is resumed after auto-enter-pip transition to actually trigger
// the PiP task appearing.
@@ -238,7 +239,7 @@
}
mRecentsView.cleanupRemoteTargets();
mRecentsAnimationController.finish(
- mAppCanEnterPip /* toRecents */, recentsCallback, true /* sendUserLeaveHint */);
+ true /* toRecents */, recentsCallback, true /* sendUserLeaveHint */);
}
@Override
diff --git a/quickstep/src/com/android/quickstep/inputconsumers/NavHandleLongPressHandler.java b/quickstep/src/com/android/quickstep/inputconsumers/NavHandleLongPressHandler.java
index 107babd..571a546 100644
--- a/quickstep/src/com/android/quickstep/inputconsumers/NavHandleLongPressHandler.java
+++ b/quickstep/src/com/android/quickstep/inputconsumers/NavHandleLongPressHandler.java
@@ -88,7 +88,7 @@
*/
@Nullable
@VisibleForTesting
- final Runnable getLongPressRunnable(NavHandle navHandle) {
+ final Runnable getLongPressRunnable(NavHandle navHandle, int displayId) {
if (!isContextualSearchEntrypointEnabled(navHandle)) {
Log.i(TAG, "Contextual Search invocation failed: entry point disabled");
mVibratorWrapper.cancelVibrate();
@@ -116,7 +116,7 @@
Log.i(TAG, "Contextual Search invocation successful");
String runningPackage = TopTaskTracker.INSTANCE.get(mContext).getCachedTopTask(
- /* filterOnlyVisibleRecents */ true).getPackageName();
+ /* filterOnlyVisibleRecents */ true, displayId).getPackageName();
mStatsLogManager.logger().withPackageName(runningPackage)
.log(LAUNCHER_LAUNCH_ASSISTANT_SUCCESSFUL_NAV_HANDLE);
} else {
diff --git a/quickstep/src/com/android/quickstep/inputconsumers/NavHandleLongPressInputConsumer.java b/quickstep/src/com/android/quickstep/inputconsumers/NavHandleLongPressInputConsumer.java
index baabde8..af7c975 100644
--- a/quickstep/src/com/android/quickstep/inputconsumers/NavHandleLongPressInputConsumer.java
+++ b/quickstep/src/com/android/quickstep/inputconsumers/NavHandleLongPressInputConsumer.java
@@ -214,7 +214,7 @@
&& !mDeepPressLogged) {
// Log deep press even if feature is disabled.
String runningPackage = mTopTaskTracker.getCachedTopTask(
- /* filterOnlyVisibleRecents */ true).getPackageName();
+ /* filterOnlyVisibleRecents */ true, getDisplayId()).getPackageName();
mStatsLogManager.logger().withPackageName(runningPackage).log(
mNavHandle.isNavHandleStashedTaskbar() ? LAUNCHER_DEEP_PRESS_STASHED_TASKBAR
: LAUNCHER_DEEP_PRESS_NAVBAR);
@@ -233,12 +233,13 @@
Log.d(TAG, "triggerLongPress");
}
String runningPackage = mTopTaskTracker.getCachedTopTask(
- /* filterOnlyVisibleRecents */ true).getPackageName();
+ /* filterOnlyVisibleRecents */ true, getDisplayId()).getPackageName();
mStatsLogManager.logger().withPackageName(runningPackage).log(
mNavHandle.isNavHandleStashedTaskbar() ? LAUNCHER_LONG_PRESS_STASHED_TASKBAR
: LAUNCHER_LONG_PRESS_NAVBAR);
- Runnable longPressRunnable = mNavHandleLongPressHandler.getLongPressRunnable(mNavHandle);
+ Runnable longPressRunnable = mNavHandleLongPressHandler.getLongPressRunnable(mNavHandle,
+ getDisplayId());
if (longPressRunnable == null) {
return;
}
diff --git a/quickstep/src/com/android/quickstep/inputconsumers/OtherActivityInputConsumer.java b/quickstep/src/com/android/quickstep/inputconsumers/OtherActivityInputConsumer.java
index 2db7573..54cc391 100644
--- a/quickstep/src/com/android/quickstep/inputconsumers/OtherActivityInputConsumer.java
+++ b/quickstep/src/com/android/quickstep/inputconsumers/OtherActivityInputConsumer.java
@@ -58,6 +58,7 @@
import com.android.quickstep.RecentsAnimationTargets;
import com.android.quickstep.RotationTouchHelper;
import com.android.quickstep.TaskAnimationManager;
+import com.android.quickstep.util.ActiveGestureProtoLogProxy;
import com.android.quickstep.util.CachedEventDispatcher;
import com.android.quickstep.util.MotionPauseDetector;
import com.android.quickstep.util.NavBarPosition;
@@ -424,6 +425,8 @@
mMotionPauseDetector.setIsTrackpadGesture(mGestureState.isTrackpadGesture());
mInteractionHandler.initWhenReady(
"OtherActivityInputConsumer.startTouchTrackingForWindowAnimation");
+ ActiveGestureProtoLogProxy.logGestureStartSwipeHandler(
+ mInteractionHandler.getClass().getSimpleName());
if (DEBUG) {
Log.d(TAG, "startTouchTrackingForWindowAnimation: isRecentsAnimationRunning="
diff --git a/quickstep/src/com/android/quickstep/interaction/TutorialController.java b/quickstep/src/com/android/quickstep/interaction/TutorialController.java
index 5995ca2..c7e2ade6 100644
--- a/quickstep/src/com/android/quickstep/interaction/TutorialController.java
+++ b/quickstep/src/com/android/quickstep/interaction/TutorialController.java
@@ -30,8 +30,11 @@
import android.graphics.Matrix;
import android.graphics.Outline;
import android.graphics.Rect;
+import android.graphics.Typeface;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.RippleDrawable;
+import android.os.SystemProperties;
+import android.provider.Settings;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
@@ -56,11 +59,12 @@
import com.android.launcher3.R;
import com.android.launcher3.Utilities;
import com.android.launcher3.anim.AnimatorListeners;
+import com.android.launcher3.util.SettingsCache;
import com.android.launcher3.views.ClipIconView;
import com.android.quickstep.interaction.EdgeBackGestureHandler.BackGestureAttemptCallback;
import com.android.quickstep.interaction.NavBarGestureHandler.NavBarGestureAttemptCallback;
import com.android.systemui.shared.system.QuickStepContract;
-import com.android.wm.shell.shared.TypefaceUtils;
+import com.android.wm.shell.Flags;
import com.android.wm.shell.shared.TypefaceUtils.FontFamily;
import com.airbnb.lottie.LottieAnimationView;
@@ -80,6 +84,10 @@
private static final String PIXEL_TIPS_APP_PACKAGE_NAME = "com.google.android.apps.tips";
private static final CharSequence DEFAULT_PIXEL_TIPS_APP_NAME = "Pixel Tips";
+ private static final String SUW_THEME_SYSTEM_PROPERTY = "setupwizard.theme";
+ private static final String GLIF_EXPRESSIVE_THEME = "glif_expressive";
+ private static final String GLIF_EXPRESSIVE_LIGHT_THEME = "glif_expressive_light";
+
private static final int FEEDBACK_ANIMATION_MS = 133;
private static final int SUBTITLE_ANNOUNCE_DELAY_MS = 3000;
private static final int DONE_BUTTON_ANNOUNCE_DELAY_MS = 4000;
@@ -115,6 +123,7 @@
protected View mExitingAppView;
protected int mExitingAppRadius;
private final AlertDialog mSkipTutorialDialog;
+ private final boolean mIsExpressiveThemeEnabledInSUW;
private boolean mGestureCompleted = false;
protected LottieAnimationView mAnimatedGestureDemonstration;
@@ -172,7 +181,11 @@
mFeedbackTitleView.setText(getIntroductionTitle());
mFeedbackSubtitleView.setText(getIntroductionSubtitle());
- setTitleTypefaces();
+
+ String SUWTheme = SystemProperties.get(SUW_THEME_SYSTEM_PROPERTY, "");
+ mIsExpressiveThemeEnabledInSUW = SUWTheme.equals(GLIF_EXPRESSIVE_THEME) || SUWTheme.equals(
+ GLIF_EXPRESSIVE_LIGHT_THEME);
+ maybeSetTitleTypefaces();
mExitingAppView.setClipToOutline(true);
mExitingAppView.setOutlineProvider(new ViewOutlineProvider() {
@@ -406,12 +419,21 @@
mFeedbackTitleView.setText(titleResId);
mFeedbackSubtitleView.setText(subtitleResId);
+
+ boolean isUserSetupComplete = SettingsCache.INSTANCE.get(mContext).getValue(
+ Settings.Secure.getUriFor(Settings.Secure.USER_SETUP_COMPLETE), 0);
+ boolean userSetupNotCompleteAndExpressiveThemeEnabled =
+ !isUserSetupComplete && mIsExpressiveThemeEnabledInSUW;
+ boolean userSetupCompleteAndNewFontsEnabled = isUserSetupComplete && Flags.enableGsf();
+
if (isGestureSuccessful) {
if (mTutorialFragment.isAtFinalStep()) {
- TypefaceUtils.setTypeface(
- mDoneButton,
- FontFamily.GSF_LABEL_LARGE
- );
+ if (userSetupCompleteAndNewFontsEnabled
+ || userSetupNotCompleteAndExpressiveThemeEnabled) {
+ mDoneButton.setTypeface(
+ Typeface.create(FontFamily.GSF_LABEL_LARGE.getValue(),
+ Typeface.NORMAL));
+ }
showActionButton();
}
@@ -437,7 +459,7 @@
mCheckmarkAnimation.setVisibility(View.VISIBLE);
mCheckmarkAnimation.playAnimation();
mFeedbackTitleView.setTextAppearance(getSuccessTitleTextAppearance());
- setTitleTypefaces();
+ maybeSetTitleTypefaces();
}
public boolean isGestureCompleted() {
@@ -492,7 +514,7 @@
mFeedbackTitleView.setTextAppearance(getTitleTextAppearance());
mDoneButton.setTextAppearance(getDoneButtonTextAppearance());
- setTitleTypefaces();
+ maybeSetTitleTypefaces();
mDoneButton.getBackground().setTint(getDoneButtonColor());
mCheckmarkAnimation.setAnimation(mTutorialFragment.isAtFinalStep()
? R.raw.checkmark_animation_end
@@ -514,16 +536,15 @@
/**
* Apply expressive typefaces to the feedback title and subtitle views.
*/
- private void setTitleTypefaces() {
- TypefaceUtils.setTypeface(
- mFeedbackTitleView,
- mTutorialFragment.isLargeScreen()
- ? FontFamily.GSF_DISPLAY_MEDIUM_EMPHASIZED
- : FontFamily.GSF_DISPLAY_SMALL_EMPHASIZED);
- TypefaceUtils.setTypeface(
- mFeedbackSubtitleView,
- FontFamily.GSF_BODY_LARGE
- );
+ private void maybeSetTitleTypefaces() {
+ if (mIsExpressiveThemeEnabledInSUW || Flags.enableGsf()) {
+ mFeedbackTitleView.setTypeface(Typeface.create(mTutorialFragment.isLargeScreen()
+ ? FontFamily.GSF_DISPLAY_MEDIUM_EMPHASIZED.getValue()
+ : FontFamily.GSF_DISPLAY_SMALL_EMPHASIZED.getValue(),
+ Typeface.NORMAL));
+ mFeedbackSubtitleView.setTypeface(
+ Typeface.create(FontFamily.GSF_BODY_LARGE.getValue(), Typeface.NORMAL));
+ }
}
protected void resetViewsForBackGesture() {
diff --git a/quickstep/src/com/android/quickstep/orientation/LandscapePagedViewHandler.kt b/quickstep/src/com/android/quickstep/orientation/LandscapePagedViewHandler.kt
index b8f43a4..4b9eb9e 100644
--- a/quickstep/src/com/android/quickstep/orientation/LandscapePagedViewHandler.kt
+++ b/quickstep/src/com/android/quickstep/orientation/LandscapePagedViewHandler.kt
@@ -275,7 +275,7 @@
desiredTaskId: Int,
banner: View,
): Pair<Float, Float> {
- val snapshotParams = thumbnailViews[0].layoutParams as LinearLayout.LayoutParams
+ val snapshotParams = thumbnailViews[0].layoutParams as FrameLayout.LayoutParams
val translationX = banner.height.toFloat()
val translationY: Float
if (splitBounds == null) {
diff --git a/quickstep/src/com/android/quickstep/orientation/PortraitPagedViewHandler.kt b/quickstep/src/com/android/quickstep/orientation/PortraitPagedViewHandler.kt
index 15eb69e..74ae688 100644
--- a/quickstep/src/com/android/quickstep/orientation/PortraitPagedViewHandler.kt
+++ b/quickstep/src/com/android/quickstep/orientation/PortraitPagedViewHandler.kt
@@ -255,7 +255,7 @@
}
} else {
if (desiredTaskId == splitBounds.leftTopTaskId) {
- val snapshotParams = thumbnailViews[0].layoutParams as LinearLayout.LayoutParams
+ val snapshotParams = thumbnailViews[0].layoutParams as FrameLayout.LayoutParams
val bottomRightTaskPlusDividerPercent =
(splitBounds.rightBottomTaskPercent + splitBounds.dividerPercent)
translationY =
diff --git a/quickstep/src/com/android/quickstep/orientation/SeascapePagedViewHandler.kt b/quickstep/src/com/android/quickstep/orientation/SeascapePagedViewHandler.kt
index 80b50cb..456115f 100644
--- a/quickstep/src/com/android/quickstep/orientation/SeascapePagedViewHandler.kt
+++ b/quickstep/src/com/android/quickstep/orientation/SeascapePagedViewHandler.kt
@@ -26,7 +26,6 @@
import android.view.View
import android.view.View.MeasureSpec
import android.widget.FrameLayout
-import android.widget.LinearLayout
import androidx.core.util.component1
import androidx.core.util.component2
import androidx.core.view.updateLayoutParams
@@ -152,7 +151,7 @@
desiredTaskId: Int,
banner: View,
): Pair<Float, Float> {
- val snapshotParams = thumbnailViews[0].layoutParams as LinearLayout.LayoutParams
+ val snapshotParams = thumbnailViews[0].layoutParams as FrameLayout.LayoutParams
val translationX: Float = (taskViewWidth - banner.height).toFloat()
val translationY: Float
if (splitBounds == null) {
diff --git a/quickstep/src/com/android/quickstep/recents/ui/mapper/TaskUiStateMapper.kt b/quickstep/src/com/android/quickstep/recents/ui/mapper/TaskUiStateMapper.kt
index 679daf8..619075f 100644
--- a/quickstep/src/com/android/quickstep/recents/ui/mapper/TaskUiStateMapper.kt
+++ b/quickstep/src/com/android/quickstep/recents/ui/mapper/TaskUiStateMapper.kt
@@ -17,51 +17,18 @@
package com.android.quickstep.recents.ui.mapper
import android.view.View.OnClickListener
-import com.android.launcher3.Flags.enableDesktopExplodedView
import com.android.quickstep.recents.ui.viewmodel.TaskData
-import com.android.quickstep.task.thumbnail.TaskHeaderUiState
import com.android.quickstep.task.thumbnail.TaskThumbnailUiState
import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.BackgroundOnly
import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.LiveTile
import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.Snapshot
import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.SnapshotSplash
+import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.ThumbnailHeader
import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.Uninitialized
object TaskUiStateMapper {
/**
- * Converts a [TaskData] object into a [TaskHeaderUiState] for display in the UI.
- *
- * This function handles different types of [TaskData] and determines the appropriate UI state
- * based on the data and provided flags.
- *
- * @param taskData The [TaskData] to convert. Can be null or a specific subclass.
- * @param hasHeader A flag indicating whether the UI should display a header.
- * @param clickCloseListener A callback when the close button in the UI is clicked.
- * @return A [TaskHeaderUiState] representing the UI state for the given task data.
- */
- fun toTaskHeaderState(
- taskData: TaskData?,
- hasHeader: Boolean,
- clickCloseListener: OnClickListener?,
- ): TaskHeaderUiState =
- when {
- taskData !is TaskData.Data -> TaskHeaderUiState.HideHeader
- canHeaderBeCreated(taskData, hasHeader, clickCloseListener) -> {
- TaskHeaderUiState.ShowHeader(
- TaskHeaderUiState.ThumbnailHeader(
- // TODO(http://b/353965691): figure out what to do when `icon` or
- // `titleDescription` is null.
- taskData.icon!!,
- taskData.titleDescription!!,
- clickCloseListener!!,
- )
- )
- }
- else -> TaskHeaderUiState.HideHeader
- }
-
- /**
* Converts a [TaskData] object into a [TaskThumbnailUiState] for display in the UI.
*
* This function handles different types of [TaskData] and determines the appropriate UI state
@@ -69,26 +36,48 @@
*
* @param taskData The [TaskData] to convert. Can be null or a specific subclass.
* @param isLiveTile A flag indicating whether the task data represents live tile.
+ * @param hasHeader A flag indicating whether the UI should display a header.
+ * @param clickCloseListener A callback when the close button in the UI is clicked.
* @return A [TaskThumbnailUiState] representing the UI state for the given task data.
*/
- fun toTaskThumbnailUiState(taskData: TaskData?, isLiveTile: Boolean): TaskThumbnailUiState =
+ fun toTaskThumbnailUiState(
+ taskData: TaskData?,
+ isLiveTile: Boolean,
+ hasHeader: Boolean,
+ clickCloseListener: OnClickListener?,
+ ): TaskThumbnailUiState =
when {
taskData !is TaskData.Data -> Uninitialized
- isLiveTile -> LiveTile
+ isLiveTile -> createLiveTileState(taskData, hasHeader, clickCloseListener)
isBackgroundOnly(taskData) -> BackgroundOnly(taskData.backgroundColor)
isSnapshotSplash(taskData) ->
SnapshotSplash(
- Snapshot(
- taskData.thumbnailData?.thumbnail!!,
- taskData.thumbnailData.rotation,
- taskData.backgroundColor,
- ),
+ createSnapshotState(taskData, hasHeader, clickCloseListener),
taskData.icon,
)
-
else -> Uninitialized
}
+ private fun createSnapshotState(
+ taskData: TaskData.Data,
+ hasHeader: Boolean,
+ clickCloseListener: OnClickListener?,
+ ): Snapshot =
+ if (canHeaderBeCreated(taskData, hasHeader, clickCloseListener)) {
+ Snapshot.WithHeader(
+ taskData.thumbnailData?.thumbnail!!,
+ taskData.thumbnailData.rotation,
+ taskData.backgroundColor,
+ ThumbnailHeader(taskData.icon!!, taskData.titleDescription!!, clickCloseListener!!),
+ )
+ } else {
+ Snapshot.WithoutHeader(
+ taskData.thumbnailData?.thumbnail!!,
+ taskData.thumbnailData.rotation,
+ taskData.backgroundColor,
+ )
+ }
+
private fun isBackgroundOnly(taskData: TaskData.Data) =
taskData.isLocked || taskData.thumbnailData == null
@@ -100,9 +89,21 @@
hasHeader: Boolean,
clickCloseListener: OnClickListener?,
) =
- enableDesktopExplodedView() &&
- hasHeader &&
+ hasHeader &&
taskData.icon != null &&
taskData.titleDescription != null &&
clickCloseListener != null
+
+ private fun createLiveTileState(
+ taskData: TaskData.Data,
+ hasHeader: Boolean,
+ clickCloseListener: OnClickListener?,
+ ) =
+ if (canHeaderBeCreated(taskData, hasHeader, clickCloseListener)) {
+ // TODO(http://b/353965691): figure out what to do when `icon` or `titleDescription` is
+ // null.
+ LiveTile.WithHeader(
+ ThumbnailHeader(taskData.icon!!, taskData.titleDescription!!, clickCloseListener!!)
+ )
+ } else LiveTile.WithoutHeader
}
diff --git a/quickstep/src/com/android/quickstep/recents/ui/viewmodel/TaskTileUiState.kt b/quickstep/src/com/android/quickstep/recents/ui/viewmodel/TaskTileUiState.kt
index 8a6a805..863d30b 100644
--- a/quickstep/src/com/android/quickstep/recents/ui/viewmodel/TaskTileUiState.kt
+++ b/quickstep/src/com/android/quickstep/recents/ui/viewmodel/TaskTileUiState.kt
@@ -37,6 +37,7 @@
val hasHeader: Boolean,
val sysUiStatusNavFlags: Int,
val taskOverlayEnabled: Boolean,
+ val isCentralTask: Boolean,
)
sealed class TaskData {
diff --git a/quickstep/src/com/android/quickstep/recents/ui/viewmodel/TaskViewModel.kt b/quickstep/src/com/android/quickstep/recents/ui/viewmodel/TaskViewModel.kt
index 09e2071..fac0c0a 100644
--- a/quickstep/src/com/android/quickstep/recents/ui/viewmodel/TaskViewModel.kt
+++ b/quickstep/src/com/android/quickstep/recents/ui/viewmodel/TaskViewModel.kt
@@ -29,7 +29,6 @@
import com.android.quickstep.recents.domain.usecase.ThumbnailPosition
import com.android.quickstep.recents.viewmodel.RecentsViewData
import com.android.quickstep.views.TaskViewType
-import com.android.quickstep.views.TaskViewType.SINGLE
import com.android.systemui.shared.recents.model.ThumbnailData
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.Flow
@@ -66,6 +65,12 @@
}
.distinctUntilChanged()
+ private val isCentralTask =
+ combine(taskIds, recentsViewData.centralTaskIds) { taskIds, centralTaskIds ->
+ taskIds == centralTaskIds
+ }
+ .distinctUntilChanged()
+
private val taskData =
taskIds.flatMapLatest { ids ->
// Combine Tasks requests
@@ -79,14 +84,12 @@
combine(recentsViewData.overlayEnabled, recentsViewData.settledFullyVisibleTaskIds) {
isOverlayEnabled,
settledFullyVisibleTaskIds ->
- taskViewType == SINGLE &&
- isOverlayEnabled &&
- settledFullyVisibleTaskIds.any { it in taskIds.value }
+ isOverlayEnabled && settledFullyVisibleTaskIds.any { it in taskIds.value }
}
.distinctUntilChanged()
val state: Flow<TaskTileUiState> =
- combine(taskData, isLiveTile, overlayEnabled, ::mapToTaskTile)
+ combine(taskData, isLiveTile, overlayEnabled, isCentralTask, ::mapToTaskTile)
.distinctUntilChanged()
.flowOn(dispatcherProvider.background)
@@ -114,6 +117,7 @@
tasks: List<TaskData>,
isLiveTile: Boolean,
overlayEnabled: Boolean,
+ isCentralTask: Boolean,
): TaskTileUiState {
val firstThumbnailData = (tasks.firstOrNull() as? TaskData.Data)?.thumbnailData
return TaskTileUiState(
@@ -122,6 +126,7 @@
hasHeader = taskViewType == TaskViewType.DESKTOP,
sysUiStatusNavFlags = getSysUiStatusNavFlagsUseCase(firstThumbnailData),
taskOverlayEnabled = overlayEnabled,
+ isCentralTask = isCentralTask,
)
}
diff --git a/quickstep/src/com/android/quickstep/recents/viewmodel/RecentsViewData.kt b/quickstep/src/com/android/quickstep/recents/viewmodel/RecentsViewData.kt
index 2465a46..803fb35 100644
--- a/quickstep/src/com/android/quickstep/recents/viewmodel/RecentsViewData.kt
+++ b/quickstep/src/com/android/quickstep/recents/viewmodel/RecentsViewData.kt
@@ -27,6 +27,9 @@
// The settled set of visible taskIds that is updated after RecentsView scroll settles.
val settledFullyVisibleTaskIds = MutableStateFlow(emptySet<Int>())
+ // The id for the task ids in the TaskView that controls the Actions View
+ val centralTaskIds = MutableStateFlow(emptySet<Int>())
+
// A list of taskIds that are associated with a RecentsAnimationController. */
val runningTaskIds = MutableStateFlow(emptySet<Int>())
diff --git a/quickstep/src/com/android/quickstep/recents/viewmodel/RecentsViewModel.kt b/quickstep/src/com/android/quickstep/recents/viewmodel/RecentsViewModel.kt
index 5ff8aaa..4d168c7 100644
--- a/quickstep/src/com/android/quickstep/recents/viewmodel/RecentsViewModel.kt
+++ b/quickstep/src/com/android/quickstep/recents/viewmodel/RecentsViewModel.kt
@@ -38,6 +38,10 @@
recentsViewData.settledFullyVisibleTaskIds.value = taskIds
}
+ fun updateCentralTaskIds(taskIds: Set<Int>) {
+ recentsViewData.centralTaskIds.value = taskIds
+ }
+
fun setOverlayEnabled(isOverlayEnabled: Boolean) {
recentsViewData.overlayEnabled.value = isOverlayEnabled
}
diff --git a/quickstep/src/com/android/quickstep/task/thumbnail/TaskContentView.kt b/quickstep/src/com/android/quickstep/task/thumbnail/TaskContentView.kt
deleted file mode 100644
index a40929c..0000000
--- a/quickstep/src/com/android/quickstep/task/thumbnail/TaskContentView.kt
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Copyright (C) 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.quickstep.task.thumbnail
-
-import android.content.Context
-import android.graphics.Outline
-import android.graphics.Path
-import android.graphics.Rect
-import android.util.AttributeSet
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewOutlineProvider
-import android.widget.LinearLayout
-import androidx.core.view.isInvisible
-import com.android.launcher3.Flags.enableRefactorTaskThumbnail
-import com.android.launcher3.R
-import com.android.launcher3.util.ViewPool
-import com.android.quickstep.views.TaskHeaderView
-import com.android.quickstep.views.TaskThumbnailViewDeprecated
-
-/**
- * TaskContentView is a wrapper around the TaskHeaderView and TaskThumbnailView. It is a sibling to
- * DWB, AiAi (TaskOverlay).
- */
-class TaskContentView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) :
- LinearLayout(context, attrs), ViewPool.Reusable {
-
- private var taskHeaderView: TaskHeaderView? = null
- private var taskThumbnailView: TaskThumbnailView? = null
- private var taskThumbnailViewDeprecated: TaskThumbnailViewDeprecated? = null
- private var onSizeChanged: ((width: Int, height: Int) -> Unit)? = null
- private val outlinePath = Path()
-
- /**
- * Sets the outline bounds of the view. Default to use view's bound as outline when set to null.
- */
- var outlineBounds: Rect? = null
- set(value) {
- field = value
- invalidateOutline()
- }
-
- private val bounds = Rect()
-
- var cornerRadius: Float = 0f
- set(value) {
- field = value
- invalidateOutline()
- }
-
- override fun onFinishInflate() {
- super.onFinishInflate()
- createTaskThumbnailView()
- }
-
- override fun setScaleX(scaleX: Float) {
- super.setScaleX(scaleX)
- taskThumbnailView?.parentScaleXUpdated(scaleX)
- }
-
- override fun setScaleY(scaleY: Float) {
- super.setScaleY(scaleY)
- taskThumbnailView?.parentScaleYUpdated(scaleY)
- }
-
- override fun onAttachedToWindow() {
- super.onAttachedToWindow()
- clipToOutline = true
- outlineProvider =
- object : ViewOutlineProvider() {
- override fun getOutline(view: View, outline: Outline) {
- val outlineRect = outlineBounds ?: bounds
- outlinePath.apply {
- rewind()
- addRoundRect(
- outlineRect.left.toFloat(),
- outlineRect.top.toFloat(),
- outlineRect.right.toFloat(),
- outlineRect.bottom.toFloat(),
- cornerRadius / scaleX,
- cornerRadius / scaleY,
- Path.Direction.CW,
- )
- }
- outline.setPath(outlinePath)
- }
- }
- }
-
- override fun onRecycle() {
- taskHeaderView?.isInvisible = true
- onSizeChanged = null
- outlineBounds = null
- taskThumbnailView?.onRecycle()
- taskThumbnailViewDeprecated?.onRecycle()
- }
-
- fun doOnSizeChange(action: (width: Int, height: Int) -> Unit) {
- onSizeChanged = action
- }
-
- override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
- super.onSizeChanged(w, h, oldw, oldh)
- onSizeChanged?.invoke(width, height)
- bounds.set(0, 0, w, h)
- invalidateOutline()
- }
-
- private fun createHeaderView(taskHeaderState: TaskHeaderUiState) {
- if (taskHeaderView == null && taskHeaderState is TaskHeaderUiState.ShowHeader) {
- taskHeaderView =
- LayoutInflater.from(context).inflate(R.layout.task_header_view, this, false)
- as TaskHeaderView
- addView(taskHeaderView, 0)
- }
- }
-
- private fun createTaskThumbnailView() {
- if (taskThumbnailView == null) {
- if (enableRefactorTaskThumbnail()) {
- taskThumbnailView =
- LayoutInflater.from(context).inflate(R.layout.task_thumbnail, this, false)
- as TaskThumbnailView
- addView(taskThumbnailView)
- } else {
- taskThumbnailViewDeprecated =
- LayoutInflater.from(context)
- .inflate(R.layout.task_thumbnail_deprecated, this, false)
- as TaskThumbnailViewDeprecated
- addView(taskThumbnailViewDeprecated)
- }
- }
- }
-
- fun setState(
- taskHeaderState: TaskHeaderUiState,
- taskThumbnailUiState: TaskThumbnailUiState,
- taskId: Int?,
- ) {
- createHeaderView(taskHeaderState)
- taskHeaderView?.setState(taskHeaderState)
- taskThumbnailView?.setState(taskThumbnailUiState, taskId)
- }
-}
diff --git a/quickstep/src/com/android/quickstep/task/thumbnail/TaskHeaderUiState.kt b/quickstep/src/com/android/quickstep/task/thumbnail/TaskHeaderUiState.kt
deleted file mode 100644
index 09fb540..0000000
--- a/quickstep/src/com/android/quickstep/task/thumbnail/TaskHeaderUiState.kt
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.quickstep.task.thumbnail
-
-import android.graphics.drawable.Drawable
-import android.view.View
-
-sealed class TaskHeaderUiState {
- data class ShowHeader(val header: ThumbnailHeader) : TaskHeaderUiState()
-
- data object HideHeader : TaskHeaderUiState()
-
- data class ThumbnailHeader(
- val icon: Drawable,
- val title: String,
- val clickCloseListener: View.OnClickListener,
- )
-}
diff --git a/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailUiState.kt b/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailUiState.kt
index a5c9ac0..db593d3 100644
--- a/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailUiState.kt
+++ b/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailUiState.kt
@@ -19,6 +19,7 @@
import android.graphics.Bitmap
import android.graphics.drawable.Drawable
import android.view.Surface
+import android.view.View.OnClickListener
import androidx.annotation.ColorInt
sealed class TaskThumbnailUiState {
@@ -26,14 +27,37 @@
data class BackgroundOnly(@ColorInt val backgroundColor: Int) : TaskThumbnailUiState()
- data object LiveTile : TaskThumbnailUiState()
-
data class SnapshotSplash(val snapshot: Snapshot, val splash: Drawable?) :
TaskThumbnailUiState()
- data class Snapshot(
- val bitmap: Bitmap,
- @Surface.Rotation val thumbnailRotation: Int,
- @ColorInt val backgroundColor: Int,
+ sealed class LiveTile : TaskThumbnailUiState() {
+ data class WithHeader(val header: ThumbnailHeader) : LiveTile()
+
+ data object WithoutHeader : LiveTile()
+ }
+
+ sealed class Snapshot {
+ abstract val bitmap: Bitmap
+ abstract val thumbnailRotation: Int
+ abstract val backgroundColor: Int
+
+ data class WithHeader(
+ override val bitmap: Bitmap,
+ @Surface.Rotation override val thumbnailRotation: Int,
+ @ColorInt override val backgroundColor: Int,
+ val header: ThumbnailHeader,
+ ) : Snapshot()
+
+ data class WithoutHeader(
+ override val bitmap: Bitmap,
+ @Surface.Rotation override val thumbnailRotation: Int,
+ @ColorInt override val backgroundColor: Int,
+ ) : Snapshot()
+ }
+
+ data class ThumbnailHeader(
+ val icon: Drawable,
+ val title: String,
+ val clickCloseListener: OnClickListener,
)
}
diff --git a/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailView.kt b/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailView.kt
index 78a16f1..0edbacc 100644
--- a/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailView.kt
+++ b/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailView.kt
@@ -19,24 +19,32 @@
import android.content.Context
import android.graphics.Color
import android.graphics.Matrix
+import android.graphics.Outline
+import android.graphics.Path
+import android.graphics.Rect
import android.graphics.drawable.ShapeDrawable
import android.util.AttributeSet
import android.util.Log
+import android.view.LayoutInflater
import android.view.View
+import android.view.ViewOutlineProvider
import android.widget.FrameLayout
import androidx.annotation.ColorInt
import androidx.core.view.isInvisible
+import com.android.launcher3.Flags.enableDesktopExplodedView
import com.android.launcher3.LauncherAnimUtils.VIEW_ALPHA
import com.android.launcher3.R
import com.android.launcher3.util.MultiPropertyFactory
+import com.android.launcher3.util.ViewPool
import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.BackgroundOnly
import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.LiveTile
import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.Snapshot
import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.SnapshotSplash
import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.Uninitialized
import com.android.quickstep.views.FixedSizeImageView
+import com.android.quickstep.views.TaskThumbnailViewHeader
-class TaskThumbnailView : FrameLayout {
+class TaskThumbnailView : FrameLayout, ViewPool.Reusable {
private val scrimView: View by lazy { findViewById(R.id.task_thumbnail_scrim) }
private val liveTileView: LiveTileView by lazy { findViewById(R.id.task_thumbnail_live_tile) }
private val thumbnailView: FixedSizeImageView by lazy { findViewById(R.id.task_thumbnail) }
@@ -45,9 +53,30 @@
private val dimAlpha: MultiPropertyFactory<View> by lazy {
MultiPropertyFactory(scrimView, VIEW_ALPHA, ScrimViewAlpha.entries.size, ::maxOf)
}
+ private val outlinePath = Path()
+ private var onSizeChanged: ((width: Int, height: Int) -> Unit)? = null
+
+ private var taskThumbnailViewHeader: TaskThumbnailViewHeader? = null
private var uiState: TaskThumbnailUiState = Uninitialized
+ /**
+ * Sets the outline bounds of the view. Default to use view's bound as outline when set to null.
+ */
+ var outlineBounds: Rect? = null
+ set(value) {
+ field = value
+ invalidateOutline()
+ }
+
+ private val bounds = Rect()
+
+ var cornerRadius: Float = 0f
+ set(value) {
+ field = value
+ invalidateOutline()
+ }
+
constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
@@ -58,8 +87,39 @@
defStyleAttr: Int,
) : super(context, attrs, defStyleAttr)
- fun onRecycle() {
+ override fun onFinishInflate() {
+ super.onFinishInflate()
+ maybeCreateHeader()
+ }
+
+ override fun onAttachedToWindow() {
+ super.onAttachedToWindow()
+ clipToOutline = true
+ outlineProvider =
+ object : ViewOutlineProvider() {
+ override fun getOutline(view: View, outline: Outline) {
+ val outlineRect = outlineBounds ?: bounds
+ outlinePath.apply {
+ rewind()
+ addRoundRect(
+ outlineRect.left.toFloat(),
+ outlineRect.top.toFloat(),
+ outlineRect.right.toFloat(),
+ outlineRect.bottom.toFloat(),
+ cornerRadius / scaleX,
+ cornerRadius / scaleY,
+ Path.Direction.CW,
+ )
+ }
+ outline.setPath(outlinePath)
+ }
+ }
+ }
+
+ override fun onRecycle() {
uiState = Uninitialized
+ onSizeChanged = null
+ outlineBounds = null
resetViews()
}
@@ -70,7 +130,7 @@
resetViews()
when (state) {
is Uninitialized -> {}
- is LiveTile -> drawLiveWindow()
+ is LiveTile -> drawLiveWindow(state)
is SnapshotSplash -> drawSnapshotSplash(state)
is BackgroundOnly -> drawBackground(state.backgroundColor)
}
@@ -95,12 +155,25 @@
splashIcon.alpha = value
}
- fun parentScaleXUpdated(scaleX: Float) {
+ fun doOnSizeChange(action: (width: Int, height: Int) -> Unit) {
+ onSizeChanged = action
+ }
+
+ override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
+ super.onSizeChanged(w, h, oldw, oldh)
+ onSizeChanged?.invoke(width, height)
+ bounds.set(0, 0, w, h)
+ invalidateOutline()
+ }
+
+ override fun setScaleX(scaleX: Float) {
+ super.setScaleX(scaleX)
// Splash icon should ignore scale on TTV
splashIcon.scaleX = 1 / scaleX
}
- fun parentScaleYUpdated(scaleY: Float) {
+ override fun setScaleY(scaleY: Float) {
+ super.setScaleY(scaleY)
// Splash icon should ignore scale on TTV
splashIcon.scaleY = 1 / scaleY
}
@@ -114,14 +187,20 @@
splashIcon.setImageDrawable(null)
scrimView.alpha = 0f
setBackgroundColor(Color.BLACK)
+ taskThumbnailViewHeader?.isInvisible = true
}
private fun drawBackground(@ColorInt background: Int) {
setBackgroundColor(background)
}
- private fun drawLiveWindow() {
+ private fun drawLiveWindow(liveTile: LiveTile) {
liveTileView.isInvisible = false
+
+ if (liveTile is LiveTile.WithHeader) {
+ taskThumbnailViewHeader?.isInvisible = false
+ taskThumbnailViewHeader?.setHeader(liveTile.header)
+ }
}
private fun drawSnapshotSplash(snapshotSplash: SnapshotSplash) {
@@ -133,6 +212,11 @@
}
private fun drawSnapshot(snapshot: Snapshot) {
+ if (snapshot is Snapshot.WithHeader) {
+ taskThumbnailViewHeader?.isInvisible = false
+ taskThumbnailViewHeader?.setHeader(snapshot.header)
+ }
+
drawBackground(snapshot.backgroundColor)
thumbnailView.setImageBitmap(snapshot.bitmap)
thumbnailView.isInvisible = false
@@ -148,6 +232,16 @@
Log.d(TAG, "[TaskThumbnailView@${Integer.toHexString(hashCode())}] $message")
}
+ private fun maybeCreateHeader() {
+ if (enableDesktopExplodedView() && taskThumbnailViewHeader == null) {
+ taskThumbnailViewHeader =
+ LayoutInflater.from(context)
+ .inflate(R.layout.task_thumbnail_view_header, this, false)
+ as TaskThumbnailViewHeader
+ addView(taskThumbnailViewHeader)
+ }
+ }
+
private companion object {
const val TAG = "TaskThumbnailView"
private const val MAX_SCRIM_ALPHA = 0.4f
diff --git a/quickstep/src/com/android/quickstep/util/AppPairsController.java b/quickstep/src/com/android/quickstep/util/AppPairsController.java
index 8385485..24c01ae 100644
--- a/quickstep/src/com/android/quickstep/util/AppPairsController.java
+++ b/quickstep/src/com/android/quickstep/util/AppPairsController.java
@@ -32,7 +32,6 @@
import static com.android.wm.shell.shared.split.SplitScreenConstants.getIndex;
import static com.android.wm.shell.shared.split.SplitScreenConstants.isPersistentSnapPosition;
-import android.content.Context;
import android.content.Intent;
import android.content.pm.LauncherApps;
import android.util.Log;
@@ -93,10 +92,10 @@
private static final int BITMASK_SIZE = 16;
private static final int BITMASK_FOR_SNAP_POSITION = (1 << BITMASK_SIZE) - 1;
- private Context mContext;
+ private ActivityContext mContext;
private final SplitSelectStateController mSplitSelectStateController;
private final StatsLogManager mStatsLogManager;
- public AppPairsController(Context context,
+ public AppPairsController(ActivityContext context,
SplitSelectStateController splitSelectStateController,
StatsLogManager statsLogManager) {
mContext = context;
@@ -208,7 +207,7 @@
}
AppPairInfo newAppPair = new AppPairInfo(apps);
- IconCache iconCache = LauncherAppState.getInstance(mContext).getIconCache();
+ IconCache iconCache = LauncherAppState.getInstance(mContext.asContext()).getIconCache();
MODEL_EXECUTOR.execute(() -> {
newAppPair.getAppContents().forEach(member -> {
member.title = "";
@@ -216,8 +215,8 @@
iconCache.getTitleAndIcon(member, member.getMatchingLookupFlag());
});
MAIN_EXECUTOR.execute(() -> {
- LauncherAccessibilityDelegate delegate =
- QuickstepLauncher.getLauncher(mContext).getAccessibilityDelegate();
+ LauncherAccessibilityDelegate delegate = QuickstepLauncher.getLauncher(
+ mContext.asContext()).getAccessibilityDelegate();
if (delegate != null) {
delegate.addToWorkspace(newAppPair, true, (success) -> {
if (success) {
@@ -300,7 +299,7 @@
*/
@Nullable
private AppInfo resolveAppInfoByComponent(@NonNull ComponentKey key) {
- AllAppsStore appsStore = ActivityContext.lookupContext(mContext)
+ AllAppsStore appsStore = ActivityContext.lookupContext(mContext.asContext())
.getAppsView().getAppsStore();
// First look up the app info in order of:
@@ -326,7 +325,7 @@
if (appInfo == null) {
return null;
}
- return appInfo.makeWorkspaceItem(mContext);
+ return appInfo.makeWorkspaceItem(mContext.asContext());
}
/**
@@ -418,7 +417,7 @@
} else {
// Tapped an app pair while in a single app
final TopTaskTracker.CachedTaskInfo runningTask = topTaskTracker
- .getCachedTopTask(false /* filterOnlyVisibleRecents */);
+ .getCachedTopTask(false /* filterOnlyVisibleRecents */, context.getDisplayId());
mSplitSelectStateController.findLastActiveTasksAndRunCallback(
componentKeys,
@@ -548,6 +547,6 @@
*/
@VisibleForTesting
public TopTaskTracker getTopTaskTracker() {
- return TopTaskTracker.INSTANCE.get(mContext);
+ return TopTaskTracker.INSTANCE.get(mContext.asContext());
}
}
diff --git a/quickstep/src/com/android/quickstep/util/ContextualSearchInvoker.kt b/quickstep/src/com/android/quickstep/util/ContextualSearchInvoker.kt
index 3bc9adc..e574cc7 100644
--- a/quickstep/src/com/android/quickstep/util/ContextualSearchInvoker.kt
+++ b/quickstep/src/com/android/quickstep/util/ContextualSearchInvoker.kt
@@ -87,7 +87,8 @@
if (success) {
val runningPackage =
TopTaskTracker.INSTANCE[context].getCachedTopTask(
- /* filterOnlyVisibleRecents */ true
+ /* filterOnlyVisibleRecents */ true,
+ DEFAULT_DISPLAY,
)
.getPackageName()
statsLogManager
diff --git a/quickstep/src/com/android/quickstep/util/ContextualSearchStateManager.java b/quickstep/src/com/android/quickstep/util/ContextualSearchStateManager.java
index a8d3c6d..136c496 100644
--- a/quickstep/src/com/android/quickstep/util/ContextualSearchStateManager.java
+++ b/quickstep/src/com/android/quickstep/util/ContextualSearchStateManager.java
@@ -18,6 +18,7 @@
import static android.app.contextualsearch.ContextualSearchManager.ACTION_LAUNCH_CONTEXTUAL_SEARCH;
import static android.app.contextualsearch.ContextualSearchManager.ENTRYPOINT_SYSTEM_ACTION;
import static android.app.contextualsearch.ContextualSearchManager.FEATURE_CONTEXTUAL_SEARCH;
+import static android.view.Display.DEFAULT_DISPLAY;
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_LAUNCH_OMNI_SUCCESSFUL_SYSTEM_ACTION;
import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR;
@@ -244,7 +245,8 @@
ENTRYPOINT_SYSTEM_ACTION);
if (contextualSearchInvoked) {
String runningPackage = mTopTaskTracker.getCachedTopTask(
- /* filterOnlyVisibleRecents */ true).getPackageName();
+ /* filterOnlyVisibleRecents */ true,
+ DEFAULT_DISPLAY).getPackageName();
StatsLogManager.newInstance(mContext).logger()
.withPackageName(runningPackage)
.log(LAUNCHER_LAUNCH_OMNI_SUCCESSFUL_SYSTEM_ACTION);
diff --git a/quickstep/src/com/android/quickstep/util/ExternalDisplays.kt b/quickstep/src/com/android/quickstep/util/ExternalDisplays.kt
index 455b312..0aaca31 100644
--- a/quickstep/src/com/android/quickstep/util/ExternalDisplays.kt
+++ b/quickstep/src/com/android/quickstep/util/ExternalDisplays.kt
@@ -16,6 +16,7 @@
package com.android.quickstep.util
+import android.app.TaskInfo
import android.view.Display.DEFAULT_DISPLAY
import android.view.Display.INVALID_DISPLAY
import com.android.systemui.shared.recents.model.Task
@@ -24,10 +25,9 @@
val Int.isExternalDisplay
get() = this != DEFAULT_DISPLAY
-/** Returns displayId of this [Task], default to [DEFAULT_DISPLAY] */
-val Task?.displayId
+val Int?.safeDisplayId
get() =
- this?.key?.displayId.let { displayId ->
+ this.let { displayId ->
when (displayId) {
null -> DEFAULT_DISPLAY
INVALID_DISPLAY -> DEFAULT_DISPLAY
@@ -35,6 +35,14 @@
}
}
+/** Returns displayId of this [Task], default to [DEFAULT_DISPLAY] */
+val Task?.safeDisplayId
+ get() = this?.key?.displayId.safeDisplayId
+
/** Returns if this task belongs tto [DEFAULT_DISPLAY] */
val Task?.isExternalDisplay
- get() = displayId.isExternalDisplay
+ get() = safeDisplayId.isExternalDisplay
+
+/** Returns displayId of this [TaskInfo], default to [DEFAULT_DISPLAY] */
+val TaskInfo?.safeDisplayId
+ get() = this?.displayId.safeDisplayId
diff --git a/quickstep/src/com/android/quickstep/util/SplitAnimationController.kt b/quickstep/src/com/android/quickstep/util/SplitAnimationController.kt
index d6e553d..96a5733 100644
--- a/quickstep/src/com/android/quickstep/util/SplitAnimationController.kt
+++ b/quickstep/src/com/android/quickstep/util/SplitAnimationController.kt
@@ -192,7 +192,7 @@
taskViewHeight: Int,
isPrimaryTaskSplitting: Boolean,
) {
- val taskContentView = taskContainer.taskContentView
+ val snapshot = taskContainer.snapshotView
val iconView: View = taskContainer.iconView.asView()
if (enableRefactorTaskThumbnail()) {
builder.add(
@@ -241,11 +241,7 @@
val centerThumbnailTranslationX: Float = (taskViewWidth - snapshotViewSize.x) / 2f
val finalScaleX: Float = taskViewWidth.toFloat() / snapshotViewSize.x
builder.add(
- ObjectAnimator.ofFloat(
- taskContentView,
- View.TRANSLATION_X,
- centerThumbnailTranslationX,
- )
+ ObjectAnimator.ofFloat(snapshot, View.TRANSLATION_X, centerThumbnailTranslationX)
)
if (!enableOverviewIconMenu()) {
// icons are anchored from Gravity.END, so need to use negative translation
@@ -254,17 +250,15 @@
ObjectAnimator.ofFloat(iconView, View.TRANSLATION_X, -centerIconTranslationX)
)
}
- builder.add(ObjectAnimator.ofFloat(taskContentView, View.SCALE_X, finalScaleX))
+ builder.add(ObjectAnimator.ofFloat(snapshot, View.SCALE_X, finalScaleX))
// Reset other dimensions
// TODO(b/271468547), can't set Y translate to 0, need to account for top space
- taskContentView.scaleY = 1f
+ snapshot.scaleY = 1f
val translateYResetVal: Float =
if (!isPrimaryTaskSplitting) 0f
else deviceProfile.overviewTaskThumbnailTopMarginPx.toFloat()
- builder.add(
- ObjectAnimator.ofFloat(taskContentView, View.TRANSLATION_Y, translateYResetVal)
- )
+ builder.add(ObjectAnimator.ofFloat(snapshot, View.TRANSLATION_Y, translateYResetVal))
} else {
val thumbnailSize = taskViewHeight - deviceProfile.overviewTaskThumbnailTopMarginPx
// Center view first so scaling happens uniformly, alternatively we can move pivotY to 0
@@ -287,22 +281,18 @@
}
val finalScaleY: Float = thumbnailSize.toFloat() / snapshotViewSize.y
builder.add(
- ObjectAnimator.ofFloat(
- taskContentView,
- View.TRANSLATION_Y,
- centerThumbnailTranslationY,
- )
+ ObjectAnimator.ofFloat(snapshot, View.TRANSLATION_Y, centerThumbnailTranslationY)
)
if (!enableOverviewIconMenu()) {
// icons are anchored from Gravity.END, so need to use negative translation
builder.add(ObjectAnimator.ofFloat(iconView, View.TRANSLATION_X, 0f))
}
- builder.add(ObjectAnimator.ofFloat(taskContentView, View.SCALE_Y, finalScaleY))
+ builder.add(ObjectAnimator.ofFloat(snapshot, View.SCALE_Y, finalScaleY))
// Reset other dimensions
- taskContentView.scaleX = 1f
- builder.add(ObjectAnimator.ofFloat(taskContentView, View.TRANSLATION_X, 0f))
+ snapshot.scaleX = 1f
+ builder.add(ObjectAnimator.ofFloat(snapshot, View.TRANSLATION_X, 0f))
}
}
diff --git a/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java b/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java
index fd8b356..08f2552 100644
--- a/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java
+++ b/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java
@@ -195,7 +195,7 @@
mRecentTasksModel = recentsModel;
mActivityBackCallback = activityBackCallback;
mSplitAnimationController = new SplitAnimationController(this);
- mAppPairsController = new AppPairsController(mContainer.asContext(), this, statsLogManager);
+ mAppPairsController = new AppPairsController(mContainer, this, statsLogManager);
mSplitSelectDataHolder = new SplitSelectDataHolder(mContainer.asContext());
}
diff --git a/quickstep/src/com/android/quickstep/views/DesktopTaskView.kt b/quickstep/src/com/android/quickstep/views/DesktopTaskView.kt
index 8876633..8b12455 100644
--- a/quickstep/src/com/android/quickstep/views/DesktopTaskView.kt
+++ b/quickstep/src/com/android/quickstep/views/DesktopTaskView.kt
@@ -56,7 +56,6 @@
import com.android.quickstep.recents.domain.model.DesktopTaskBoundsData
import com.android.quickstep.recents.ui.viewmodel.DesktopTaskViewModel
import com.android.quickstep.recents.ui.viewmodel.TaskData
-import com.android.quickstep.task.thumbnail.TaskContentView
import com.android.quickstep.task.thumbnail.TaskThumbnailView
import com.android.quickstep.util.DesktopTask
import com.android.quickstep.util.RecentsOrientedState
@@ -78,14 +77,27 @@
private val contentViewFullscreenParams = FullscreenDrawParams(context)
- private val taskContentViewPool =
- ViewPool<TaskContentView>(
- context,
- this,
- R.layout.task_content_view,
- VIEW_POOL_MAX_SIZE,
- VIEW_POOL_INITIAL_SIZE,
- )
+ private val taskThumbnailViewDeprecatedPool =
+ if (!enableRefactorTaskThumbnail()) {
+ ViewPool<TaskThumbnailViewDeprecated>(
+ context,
+ this,
+ R.layout.task_thumbnail_deprecated,
+ VIEW_POOL_MAX_SIZE,
+ VIEW_POOL_INITIAL_SIZE,
+ )
+ } else null
+
+ private val taskThumbnailViewPool =
+ if (enableRefactorTaskThumbnail()) {
+ ViewPool<TaskThumbnailView>(
+ context,
+ this,
+ R.layout.task_thumbnail,
+ VIEW_POOL_MAX_SIZE,
+ VIEW_POOL_INITIAL_SIZE,
+ )
+ } else null
private val tempPointF = PointF()
private val lastComputedTaskSize = Rect()
@@ -243,7 +255,7 @@
// for all cases where the progress is non-zero.
if (explodeProgress == 0.0f || explodeProgress == 1.0f) {
// Reset scaling and translation that may have been applied during animation.
- it.taskContentView.apply {
+ it.snapshotView.apply {
scaleX = 1.0f
scaleY = 1.0f
translationX = 0.0f
@@ -251,7 +263,7 @@
}
// Position the task to the same position as it would be on the desktop
- it.taskContentView?.updateLayoutParams<LayoutParams> {
+ it.snapshotView.updateLayoutParams<LayoutParams> {
gravity = Gravity.LEFT or Gravity.TOP
width = taskWidth.toInt()
height = taskHeight.toInt()
@@ -262,7 +274,7 @@
if (
enableDesktopRecentsTransitionsCornersBugfix() && enableRefactorTaskThumbnail()
) {
- it.taskContentView?.outlineBounds =
+ it.thumbnailView.outlineBounds =
if (intersects(overviewTaskPosition, screenRect))
Rect(overviewTaskPosition).apply {
intersectUnchecked(screenRect)
@@ -279,7 +291,7 @@
} else {
// During the animation, apply translation and scale such that the view is
// transformed to where we want, without triggering layout.
- it.taskContentView.apply {
+ it.snapshotView.apply {
pivotX = 0.0f
pivotY = 0.0f
translationX = taskLeft - left
@@ -313,19 +325,17 @@
val backgroundViewIndex = contentView.indexOfChild(backgroundView)
taskContainers =
tasks.map { task ->
- val taskContentView = taskContentViewPool.view
- contentView.addView(taskContentView, backgroundViewIndex + 1)
val snapshotView =
if (enableRefactorTaskThumbnail()) {
- taskContentView.findViewById<TaskThumbnailView>(R.id.snapshot)
+ taskThumbnailViewPool!!.view
} else {
- taskContentView.findViewById<TaskThumbnailViewDeprecated>(R.id.snapshot)
+ taskThumbnailViewDeprecatedPool!!.view
}
+ contentView.addView(snapshotView, backgroundViewIndex + 1)
TaskContainer(
this,
task,
- taskContentView,
snapshotView,
iconView,
TransformingTouchDelegate(iconView.asView()),
@@ -478,8 +488,12 @@
}
private fun removeAndRecycleThumbnailView(taskContainer: TaskContainer) {
- contentView.removeView(taskContainer.taskContentView)
- taskContentViewPool.recycle(taskContainer.taskContentView)
+ contentView.removeView(taskContainer.snapshotView)
+ if (enableRefactorTaskThumbnail()) {
+ taskThumbnailViewPool!!.recycle(taskContainer.thumbnailView)
+ } else {
+ taskThumbnailViewDeprecatedPool!!.recycle(taskContainer.thumbnailViewDeprecated)
+ }
}
private fun updateTaskPositions() {
diff --git a/quickstep/src/com/android/quickstep/views/GroupedTaskView.kt b/quickstep/src/com/android/quickstep/views/GroupedTaskView.kt
index 10a2e90..faa9e28 100644
--- a/quickstep/src/com/android/quickstep/views/GroupedTaskView.kt
+++ b/quickstep/src/com/android/quickstep/views/GroupedTaskView.kt
@@ -24,6 +24,7 @@
import android.view.ViewStub
import com.android.internal.jank.Cuj
import com.android.launcher3.Flags.enableOverviewIconMenu
+import com.android.launcher3.Flags.enableRefactorTaskThumbnail
import com.android.launcher3.R
import com.android.launcher3.Utilities
import com.android.launcher3.util.RunnableList
@@ -77,8 +78,8 @@
val splitBoundsConfig = splitBoundsConfig ?: return
val inSplitSelection = getThisTaskCurrentlyInSplitSelection() != INVALID_TASK_ID
pagedOrientationHandler.measureGroupedTaskViewThumbnailBounds(
- leftTopTaskContainer.taskContentView,
- rightBottomTaskContainer.taskContentView,
+ leftTopTaskContainer.snapshotView,
+ rightBottomTaskContainer.snapshotView,
widthSize,
heightSize,
splitBoundsConfig,
@@ -94,8 +95,12 @@
override fun inflateViewStubs() {
super.inflateViewStubs()
- findViewById<ViewStub>(R.id.bottomright_task_content_view)
- ?.apply { layoutResource = R.layout.task_content_view }
+ findViewById<ViewStub>(R.id.bottomright_snapshot)
+ ?.apply {
+ layoutResource =
+ if (enableRefactorTaskThumbnail()) R.layout.task_thumbnail
+ else R.layout.task_thumbnail_deprecated
+ }
?.inflate()
findViewById<ViewStub>(R.id.bottomRight_icon)
?.apply {
@@ -123,7 +128,6 @@
listOf(
createTaskContainer(
primaryTask,
- R.id.task_content_view,
R.id.snapshot,
R.id.icon,
R.id.show_windows,
@@ -133,8 +137,7 @@
),
createTaskContainer(
secondaryTask,
- R.id.bottomright_task_content_view,
- R.id.snapshot,
+ R.id.bottomright_snapshot,
R.id.bottomRight_icon,
R.id.show_windows_right,
R.id.bottomRight_digital_wellbeing_toast,
@@ -237,8 +240,8 @@
leftTopTaskContainer.iconView.asView(),
rightBottomTaskContainer.iconView.asView(),
taskIconHeight,
- leftTopTaskContainer.taskContentView.measuredWidth,
- leftTopTaskContainer.taskContentView.measuredHeight,
+ leftTopTaskContainer.snapshotView.measuredWidth,
+ leftTopTaskContainer.snapshotView.measuredHeight,
measuredHeight,
measuredWidth,
isLayoutRtl,
diff --git a/quickstep/src/com/android/quickstep/views/IconAppChipView.kt b/quickstep/src/com/android/quickstep/views/IconAppChipView.kt
index 7683a15..f4fd127 100644
--- a/quickstep/src/com/android/quickstep/views/IconAppChipView.kt
+++ b/quickstep/src/com/android/quickstep/views/IconAppChipView.kt
@@ -122,7 +122,7 @@
field = max(value, minMaxWidth)
}
- var isExpanded: Boolean = false
+ var status: AppChipStatus = AppChipStatus.Collapsed
private set
override fun onFinishInflate() {
@@ -358,8 +358,8 @@
ObjectAnimator.ofFloat(iconArrowView, TRANSLATION_X, arrowTranslationWithRtl),
ObjectAnimator.ofFloat(iconArrowView, SCALE_Y, -1f),
)
- animator!!.setDuration(MENU_BACKGROUND_REVEAL_DURATION.toLong())
- isExpanded = true
+ animator!!.duration = MENU_BACKGROUND_REVEAL_DURATION.toLong()
+ status = AppChipStatus.Expanded
} else {
// Clip expanded text with reveal animation so it doesn't go beyond the edge of the menu
val expandedTextClipAnim =
@@ -393,8 +393,8 @@
ObjectAnimator.ofFloat(iconArrowView, TRANSLATION_X, 0f),
ObjectAnimator.ofFloat(iconArrowView, SCALE_Y, 1f),
)
- animator!!.setDuration(MENU_BACKGROUND_HIDE_DURATION.toLong())
- isExpanded = false
+ animator!!.duration = MENU_BACKGROUND_HIDE_DURATION.toLong()
+ status = AppChipStatus.Collapsed
}
if (!animated) animator!!.duration = 0
@@ -432,8 +432,18 @@
}
}
+ fun reset() {
+ setText(null)
+ setDrawable(null)
+ }
+
override fun asView(): View = this
+ enum class AppChipStatus {
+ Expanded,
+ Collapsed,
+ }
+
private companion object {
private val SUM_AGGREGATOR = FloatBiFunction { a: Float, b: Float -> a + b }
diff --git a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java
index 74de2ac..c1282b9 100644
--- a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java
+++ b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java
@@ -18,6 +18,7 @@
import static android.app.ActivityTaskManager.INVALID_TASK_ID;
import static android.window.DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY;
+import static com.android.launcher3.Flags.enableGridOnlyOverview;
import static com.android.launcher3.LauncherState.CLEAR_ALL_BUTTON;
import static com.android.launcher3.LauncherState.ADD_DESK_BUTTON;
import static com.android.launcher3.LauncherState.NORMAL;
@@ -151,7 +152,14 @@
public void onStateTransitionStart(LauncherState toState) {
setOverviewStateEnabled(toState.isRecentsViewVisible);
- setOverviewGridEnabled(toState.displayOverviewTasksAsGrid(mContainer.getDeviceProfile()));
+ if (enableGridOnlyOverview()) {
+ if (toState.displayOverviewTasksAsGrid(mContainer.getDeviceProfile())) {
+ setOverviewGridEnabled(true);
+ }
+ } else {
+ setOverviewGridEnabled(
+ toState.displayOverviewTasksAsGrid(mContainer.getDeviceProfile()));
+ }
setOverviewFullscreenEnabled(toState.getOverviewFullscreenProgress() == 1);
if (toState == OVERVIEW_MODAL_TASK) {
setOverviewSelectEnabled(true);
@@ -170,6 +178,11 @@
@Override
public void onStateTransitionComplete(LauncherState finalState) {
DesktopVisibilityController.INSTANCE.get(mContainer).onLauncherStateChanged(finalState);
+ if (enableGridOnlyOverview()) {
+ if (!finalState.displayOverviewTasksAsGrid(mContainer.getDeviceProfile())) {
+ setOverviewGridEnabled(false);
+ }
+ }
if (!finalState.isRecentsViewVisible) {
// Clean-up logic that occurs when recents is no longer in use/visible.
diff --git a/quickstep/src/com/android/quickstep/views/RecentsDismissUtils.kt b/quickstep/src/com/android/quickstep/views/RecentsDismissUtils.kt
index d39b528..6acaeae 100644
--- a/quickstep/src/com/android/quickstep/views/RecentsDismissUtils.kt
+++ b/quickstep/src/com/android/quickstep/views/RecentsDismissUtils.kt
@@ -24,7 +24,6 @@
import com.android.launcher3.Flags.enableGridOnlyOverview
import com.android.launcher3.R
import com.android.launcher3.Utilities.boundToRange
-import com.android.launcher3.touch.SingleAxisSwipeDetector
import com.android.launcher3.util.DynamicResource
import com.android.launcher3.util.MSDLPlayerWrapper
import com.android.quickstep.util.TaskGridNavHelper
@@ -33,6 +32,7 @@
import com.google.android.msdl.domain.InteractionProperties
import kotlin.math.abs
import kotlin.math.roundToInt
+import kotlin.math.sign
/**
* Helper class for [RecentsView]. This util class contains refactored and extracted functions from
@@ -51,7 +51,6 @@
draggedTaskView: TaskView?,
velocity: Float,
isDismissing: Boolean,
- detector: SingleAxisSwipeDetector,
dismissLength: Int,
onEndRunnable: () -> Unit,
): SpringAnimation? {
@@ -60,11 +59,14 @@
FloatPropertyCompat.createFloatPropertyCompat(
draggedTaskView.secondaryDismissTranslationProperty
)
+ val minVelocity =
+ recentsView.pagedOrientationHandler.getSecondaryDimension(draggedTaskView).toFloat()
+ val startVelocity = abs(velocity).coerceAtLeast(minVelocity) * velocity.sign
// Animate dragged task towards dismissal or rest state.
val draggedTaskViewSpringAnimation =
SpringAnimation(draggedTaskView, taskDismissFloatProperty)
.setSpring(createExpressiveDismissSpringForce())
- .setStartVelocity(if (detector.isFling(velocity)) velocity else 0f)
+ .setStartVelocity(startVelocity)
.addUpdateListener { animation, value, _ ->
if (isDismissing && abs(value) >= abs(dismissLength)) {
animation.cancel()
@@ -82,6 +84,7 @@
runTaskGridReflowSpringAnimation(
draggedTaskView,
getDismissedTaskGapForReflow(draggedTaskView),
+ onEndRunnable,
)
} else {
recentsView.dismissTaskView(
@@ -89,11 +92,12 @@
/* animateTaskView = */ false,
/* removeTask = */ true,
)
+ onEndRunnable()
}
} else {
recentsView.onDismissAnimationEnds()
+ onEndRunnable()
}
- onEndRunnable()
}
if (!isDismissing) {
addNeighborSettlingSpringAnimations(
@@ -101,6 +105,7 @@
draggedTaskViewSpringAnimation,
driverProgressThreshold = 0f,
isSpringDirectionVertical = true,
+ minVelocity = startVelocity,
)
}
return draggedTaskViewSpringAnimation
@@ -112,15 +117,11 @@
tasksToExclude: List<TaskView> = emptyList(),
driverProgressThreshold: Float,
isSpringDirectionVertical: Boolean,
+ minVelocity: Float,
) {
// Empty spring animation exists for conditional start, and to drive neighboring springs.
val neighborsToSettle =
SpringAnimation(FloatValueHolder()).setSpring(createExpressiveDismissSpringForce())
- addThresholdSpringAnimationTrigger(
- springAnimationDriver,
- progressThreshold = driverProgressThreshold,
- neighborsToSettle,
- )
// Add tasks before dragged index, fanning out from the dragged task.
// The order they are added matters, as each spring drives the next.
@@ -150,6 +151,19 @@
isSpringDirectionVertical,
)
}
+
+ val isCurrentDisplacementAboveOrigin =
+ recentsView.pagedOrientationHandler.isGoingUp(
+ draggedTaskView.secondaryDismissTranslationProperty.get(draggedTaskView),
+ recentsView.isRtl,
+ )
+ addThresholdSpringAnimationTrigger(
+ springAnimationDriver,
+ progressThreshold = driverProgressThreshold,
+ neighborsToSettle,
+ isCurrentDisplacementAboveOrigin,
+ minVelocity,
+ )
}
/** As spring passes threshold for the first time, run conditional spring with velocity. */
@@ -157,25 +171,35 @@
springAnimationDriver: SpringAnimation,
progressThreshold: Float,
conditionalSpring: SpringAnimation,
+ isCurrentDisplacementAboveOrigin: Boolean,
+ minVelocity: Float,
) {
- var lastPosition = 0f
- var startSettling = false
- springAnimationDriver.addUpdateListener { _, value, velocity ->
- // We do not compare to the threshold directly, as the update listener
- // does not necessarily hit every value. Do not check again once it has started
- // settling, as a spring can bounce past the end value multiple times.
- if (startSettling) return@addUpdateListener
- if (
- lastPosition < progressThreshold && value >= progressThreshold ||
- lastPosition > progressThreshold && value <= progressThreshold
- ) {
- startSettling = true
+ val runSettlingAtVelocity = { velocity: Float ->
+ conditionalSpring.setStartVelocity(velocity).animateToFinalPosition(0f)
+ playDismissSettlingHaptic(velocity)
+ }
+ if (isCurrentDisplacementAboveOrigin) {
+ var lastPosition = 0f
+ var startSettling = false
+ springAnimationDriver.addUpdateListener { _, value, velocity ->
+ // We do not compare to the threshold directly, as the update listener
+ // does not necessarily hit every value. Do not check again once it has started
+ // settling, as a spring can bounce past the end value multiple times.
+ if (startSettling) return@addUpdateListener
+ if (
+ lastPosition < progressThreshold && value >= progressThreshold ||
+ lastPosition > progressThreshold && value <= progressThreshold
+ ) {
+ startSettling = true
+ }
+ lastPosition = value
+ if (startSettling) {
+ runSettlingAtVelocity(velocity)
+ }
}
- lastPosition = value
- if (startSettling) {
- conditionalSpring.setStartVelocity(velocity).animateToFinalPosition(0f)
- playDismissSettlingHaptic(velocity)
- }
+ } else {
+ // Run settling animations immediately when displacement is already below settled state.
+ runSettlingAtVelocity(minVelocity)
}
}
@@ -295,7 +319,7 @@
val maxDismissSettlingVelocity =
recentsView.pagedOrientationHandler.getSecondaryDimension(recentsView)
MSDLPlayerWrapper.INSTANCE.get(recentsView.context)
- .playToken(
+ ?.playToken(
MSDLToken.CANCEL,
InteractionProperties.DynamicVibrationScale(
boundToRange(abs(velocity) / maxDismissSettlingVelocity, 0f, 1f),
@@ -339,6 +363,7 @@
private fun runTaskGridReflowSpringAnimation(
dismissedTaskView: TaskView,
dismissedTaskGap: Float,
+ onEndRunnable: () -> Unit,
) {
// Empty spring animation exists for conditional start, and to drive neighboring springs.
val springAnimationDriver =
@@ -426,13 +451,19 @@
tasksToExclude = tasksToReflow,
driverProgressThreshold = dismissedTaskGap,
isSpringDirectionVertical = false,
+ minVelocity = 0f,
)
+ } else {
+ springAnimationDriver.addEndListener { _, _, _, _ ->
+ // Play the same haptic as when neighbors spring into place.
+ MSDLPlayerWrapper.INSTANCE.get(recentsView.context)?.playToken(MSDLToken.CANCEL)
+ }
}
// Start animations and remove the dismissed task at the end, dismiss immediately if no
// neighboring tasks exist.
val runGridEndAnimationAndRelayout = {
- recentsView.expressiveDismissTaskView(dismissedTaskView)
+ recentsView.expressiveDismissTaskView(dismissedTaskView, onEndRunnable)
}
springAnimationDriver?.apply {
addEndListener { _, _, _, _ -> runGridEndAnimationAndRelayout() }
diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java
index 8c7fe26..8f7dc80 100644
--- a/quickstep/src/com/android/quickstep/views/RecentsView.java
+++ b/quickstep/src/com/android/quickstep/views/RecentsView.java
@@ -169,7 +169,6 @@
import com.android.launcher3.testing.TestLogging;
import com.android.launcher3.testing.shared.TestProtocol;
import com.android.launcher3.touch.OverScroll;
-import com.android.launcher3.touch.SingleAxisSwipeDetector;
import com.android.launcher3.util.CancellableTask;
import com.android.launcher3.util.DynamicResource;
import com.android.launcher3.util.IntArray;
@@ -275,7 +274,7 @@
HighResLoadingState.HighResLoadingStateChangedCallback,
TaskVisualsChangeListener, DesktopVisibilityListener {
- private static final String TAG = "RecentsView";
+ protected static final String TAG = "RecentsView";
private static final boolean DEBUG = false;
public static final FloatProperty<RecentsView<?, ?>> CONTENT_ALPHA =
@@ -534,7 +533,6 @@
protected final Rect mLastComputedTaskSize = new Rect();
protected final Rect mLastComputedGridSize = new Rect();
protected final Rect mLastComputedGridTaskSize = new Rect();
- private TaskView mSelectedTask = null;
// How much a task that is directly offscreen will be pushed out due to RecentsView scale/pivot.
@Nullable
protected Float mLastComputedTaskStartPushOutDistance = null;
@@ -860,7 +858,7 @@
*/
private boolean mAnyTaskHasBeenDismissed;
- private final RecentsViewModel mRecentsViewModel;
+ protected final RecentsViewModel mRecentsViewModel;
private final RecentsViewModelHelper mHelper;
protected final RecentsViewUtils mUtils = new RecentsViewUtils(this);
protected final RecentsDismissUtils mDismissUtils = new RecentsDismissUtils(this);
@@ -1596,7 +1594,7 @@
/**
* Returns true if the given TaskView is in expected scroll position.
*/
- public boolean isTaskInExpectedScrollPosition(TaskView taskView) {
+ public boolean isTaskInExpectedScrollPosition(@NonNull TaskView taskView) {
return getScrollForPage(indexOfChild(taskView))
== getPagedOrientationHandler().getPrimaryScroll(this);
}
@@ -2418,21 +2416,28 @@
}
/**
- * Sets the last TaskView selected.
+ * Returns the currently selected TaskView in Select mode.
+ */
+ @Nullable
+ public TaskView getSelectedTaskView() {
+ return mUtils.getSelectedTaskView();
+ }
+
+ /**
+ * Sets the selected TaskView in Select mode.
*/
public void setSelectedTask(int lastSelectedTaskId) {
- mSelectedTask = getTaskViewByTaskId(lastSelectedTaskId);
+ mUtils.setSelectedTaskView(getTaskViewByTaskId(lastSelectedTaskId));
}
/**
* Returns the bounds of the task selected to enter modal state.
*/
public Rect getSelectedTaskBounds() {
- if (mSelectedTask == null) {
- return enableGridOnlyOverview() && mContainer.getDeviceProfile().isTablet
- ? mLastComputedGridTaskSize : mLastComputedTaskSize;
+ if (getSelectedTaskView() == null) {
+ return mLastComputedTaskSize;
}
- return getTaskBounds(mSelectedTask);
+ return getTaskBounds(getSelectedTaskView());
}
/**
@@ -2448,7 +2453,7 @@
return deviceProfile.overviewTaskThumbnailTopMarginPx / 2.0f;
}
- private Rect getTaskBounds(TaskView taskView) {
+ protected Rect getTaskBounds(TaskView taskView) {
int selectedPage = indexOfChild(taskView);
int primaryScroll = getPagedOrientationHandler().getPrimaryScroll(this);
int selectedPageScroll = getScrollForPage(selectedPage);
@@ -3361,8 +3366,8 @@
int snappedPage = isKeyboardTaskFocusPending() ? mKeyboardTaskFocusIndex : getNextPage();
TaskView snappedTaskView = getTaskViewAt(snappedPage);
TaskView homeTaskView = getHomeTaskView();
- TaskView expectedCurrentTaskView = mUtils.getExpectedCurrentTask(getFocusedTaskView(),
- getRunningTaskView());
+ TaskView expectedCurrentTaskView = mUtils.getExpectedCurrentTask(getRunningTaskView(),
+ getFocusedTaskView());
TaskView nextFocusedTaskView = null;
// Don't clear the top row, if the user has dismissed a task, to maintain the task order.
@@ -3937,8 +3942,10 @@
newClearAllShortTotalWidthTranslation = expectedFirstTaskStart - firstTaskStart;
}
}
- if (lastGridTaskView != null && (lastGridTaskView.isVisibleToUser() || (
- isExpressiveDismiss && lastGridTaskView == dismissedTaskView))) {
+ if (lastGridTaskView != null && (
+ (!isExpressiveDismiss && lastGridTaskView.isVisibleToUser()) || (isExpressiveDismiss
+ && (isTaskViewVisible(lastGridTaskView)
+ || lastGridTaskView == dismissedTaskView)))) {
// After dismissal, animate translation of the remaining tasks to fill any gap left
// between the end of the grid and the clear all button. Only animate if the clear
// all button is visible or would become visible after dismissal.
@@ -4734,11 +4741,12 @@
runDismissAnimation(pa);
}
- protected void expressiveDismissTaskView(TaskView taskView) {
+ protected void expressiveDismissTaskView(TaskView taskView, Function0<Unit> onEndRunnable) {
PendingAnimation pa = new PendingAnimation(DISMISS_TASK_DURATION);
createTaskDismissAnimation(pa, taskView, false /* animateTaskView */, true /* removeTask */,
DISMISS_TASK_DURATION, false /* dismissingForSplitSelection*/,
true /* isExpressiveDismiss */);
+ pa.addEndListener((success) -> onEndRunnable.invoke());
runDismissAnimation(pa);
}
@@ -5011,15 +5019,8 @@
}
private void updatePivots() {
- if (mOverviewSelectEnabled) {
- if (enableGridOnlyOverview()) {
- getModalTaskSize(mTempRect);
- Rect selectedTaskPosition = getSelectedTaskBounds();
- Utilities.getPivotsForScalingRectToRect(mTempRect, selectedTaskPosition,
- mTempPointF);
- } else {
- mTempPointF.set(mLastComputedTaskSize.centerX(), mLastComputedTaskSize.bottom);
- }
+ if (mOverviewSelectEnabled && !enableGridOnlyOverview()) {
+ mTempPointF.set(mLastComputedTaskSize.centerX(), mLastComputedTaskSize.bottom);
} else {
mTempRect.set(mLastComputedTaskSize);
getPagedViewOrientedState().getFullScreenScaleAndPivot(mTempRect,
@@ -5065,7 +5066,7 @@
&& (enableGridOnlyOverview() || enableLargeDesktopWindowingTile())
&& mTaskModalness > 0;
if (shouldCalculateOffsetForAllTasks) {
- modalMidpoint = indexOfChild(mSelectedTask);
+ modalMidpoint = indexOfChild(getSelectedTaskView());
}
float midpointOffsetSize = 0;
@@ -5273,7 +5274,7 @@
*/
private float getVerticalOffsetSize(TaskView taskView, float offsetProgress) {
if (offsetProgress == 0 || !(showAsGrid() && enableGridOnlyOverview())
- || mSelectedTask == null) {
+ || getSelectedTaskView() == null) {
// Don't bother calculating everything below if we won't offset vertically.
return 0;
}
@@ -5281,7 +5282,7 @@
// First, get the position of the task relative to the top row.
Rect taskPosition = getTaskBounds(taskView);
- boolean isSelectedTaskTopRow = mTopRowIdSet.contains(mSelectedTask.getTaskViewId());
+ boolean isSelectedTaskTopRow = mTopRowIdSet.contains(getSelectedTaskView().getTaskViewId());
boolean isChildTopRow = mTopRowIdSet.contains(taskView.getTaskViewId());
// Whether the task should be shifted to the top.
boolean isTopShift = !isSelectedTaskTopRow && isChildTopRow;
@@ -5335,8 +5336,8 @@
* Resets the visuals when exit modal state.
*/
public void resetModalVisuals() {
- if (mSelectedTask != null) {
- mSelectedTask.taskContainers.forEach(
+ if (getSelectedTaskView() != null) {
+ getSelectedTaskView().taskContainers.forEach(
taskContainer -> taskContainer.getOverlay().resetModalVisuals());
}
}
@@ -5993,6 +5994,9 @@
updateCurrentTaskActionsVisibility();
loadVisibleTaskData(TaskView.FLAG_UPDATE_ALL);
updateEnabledOverlays();
+ if (enableRefactorTaskThumbnail()) {
+ mUtils.updateCentralTask();
+ }
}
@Override
@@ -6717,8 +6721,14 @@
private void setTaskModalness(float modalness) {
mTaskModalness = modalness;
updatePageOffsets();
- if (mSelectedTask != null) {
- mSelectedTask.setModalness(modalness);
+ if (getSelectedTaskView() != null) {
+ if (enableGridOnlyOverview()) {
+ for (TaskView taskView : getTaskViews()) {
+ taskView.setModalness(modalness);
+ }
+ } else {
+ getSelectedTaskView().setModalness(modalness);
+ }
} else if (getCurrentPageTaskView() != null) {
getCurrentPageTaskView().setModalness(modalness);
}
@@ -7180,10 +7190,10 @@
* spring in response to the perceived impact of the settling task.
*/
public SpringAnimation createTaskDismissSettlingSpringAnimation(TaskView draggedTaskView,
- float velocity, boolean isDismissing, SingleAxisSwipeDetector detector,
- int dismissLength, Function0<Unit> onEndRunnable) {
+ float velocity, boolean isDismissing, int dismissLength,
+ Function0<Unit> onEndRunnable) {
return mDismissUtils.createTaskDismissSettlingSpringAnimation(draggedTaskView, velocity,
- isDismissing, detector, dismissLength, onEndRunnable);
+ isDismissing, dismissLength, onEndRunnable);
}
/**
diff --git a/quickstep/src/com/android/quickstep/views/RecentsViewUtils.kt b/quickstep/src/com/android/quickstep/views/RecentsViewUtils.kt
index 9c35913..50941fe 100644
--- a/quickstep/src/com/android/quickstep/views/RecentsViewUtils.kt
+++ b/quickstep/src/com/android/quickstep/views/RecentsViewUtils.kt
@@ -16,6 +16,7 @@
package com.android.quickstep.views
+import android.graphics.PointF
import android.graphics.Rect
import android.util.FloatProperty
import android.view.KeyEvent
@@ -25,9 +26,11 @@
import androidx.core.view.children
import com.android.launcher3.AbstractFloatingView.TYPE_TASK_MENU
import com.android.launcher3.AbstractFloatingView.getTopOpenViewWithType
+import com.android.launcher3.Flags.enableGridOnlyOverview
import com.android.launcher3.Flags.enableLargeDesktopWindowingTile
import com.android.launcher3.Flags.enableOverviewIconMenu
import com.android.launcher3.Flags.enableSeparateExternalDisplayTasks
+import com.android.launcher3.Utilities.getPivotsForScalingRectToRect
import com.android.launcher3.statehandlers.DesktopVisibilityController
import com.android.launcher3.statehandlers.DesktopVisibilityController.Companion.INACTIVE_DESK_ID
import com.android.launcher3.util.IntArray
@@ -38,6 +41,7 @@
import com.android.quickstep.views.RecentsView.RUNNING_TASK_ATTACH_ALPHA
import com.android.systemui.shared.recents.model.ThumbnailData
import java.util.function.BiConsumer
+import kotlin.math.min
import kotlin.reflect.KMutableProperty1
/**
@@ -387,12 +391,74 @@
}
}
+ fun updateCentralTask() {
+ val isTablet: Boolean = getDeviceProfile().isTablet
+ val actionsViewCanRelateToTaskView = !(isTablet && enableGridOnlyOverview())
+ val focusedTaskView = recentsView.focusedTaskView
+ val currentPageTaskView = recentsView.currentPageTaskView
+
+ fun isInExpectedScrollPosition(taskView: TaskView?) =
+ taskView?.let { recentsView.isTaskInExpectedScrollPosition(it) } ?: false
+
+ val centralTaskIds: Set<Int> =
+ when {
+ !actionsViewCanRelateToTaskView -> emptySet()
+ isTablet && isInExpectedScrollPosition(focusedTaskView) ->
+ focusedTaskView!!.taskIdSet
+ isInExpectedScrollPosition(currentPageTaskView) -> currentPageTaskView!!.taskIdSet
+ else -> emptySet()
+ }
+
+ recentsView.mRecentsViewModel.updateCentralTaskIds(centralTaskIds)
+ }
+
var deskExplodeProgress: Float = 0f
set(value) {
field = value
taskViews.filterIsInstance<DesktopTaskView>().forEach { it.explodeProgress = field }
}
+ var selectedTaskView: TaskView? = null
+ set(newValue) {
+ val oldValue = field
+ field = newValue
+ if (oldValue != newValue) {
+ onSelectedTaskViewUpdated(oldValue, newValue)
+ }
+ }
+
+ private fun onSelectedTaskViewUpdated(
+ oldSelectedTaskView: TaskView?,
+ newSelectedTaskView: TaskView?,
+ ) {
+ if (!enableGridOnlyOverview()) return
+ with(recentsView) {
+ oldSelectedTaskView?.modalScale = 1f
+ oldSelectedTaskView?.modalPivot = null
+
+ if (newSelectedTaskView == null) return
+
+ val modalTaskBounds = mTempRect
+ getModalTaskSize(modalTaskBounds)
+ val selectedTaskBounds = getTaskBounds(newSelectedTaskView)
+
+ // Map bounds to selectedTaskView's coordinate system.
+ modalTaskBounds.offset(-selectedTaskBounds.left, -selectedTaskBounds.top)
+ selectedTaskBounds.offset(-selectedTaskBounds.left, -selectedTaskBounds.top)
+
+ val modalScale =
+ min(
+ (modalTaskBounds.height().toFloat() / selectedTaskBounds.height()),
+ (modalTaskBounds.width().toFloat() / selectedTaskBounds.width()),
+ )
+ val modalPivot = PointF()
+ getPivotsForScalingRectToRect(modalTaskBounds, selectedTaskBounds, modalPivot)
+
+ newSelectedTaskView.modalScale = modalScale
+ newSelectedTaskView.modalPivot = modalPivot
+ }
+ }
+
companion object {
class RecentsViewFloatProperty(
private val utilsProperty: KMutableProperty1<RecentsViewUtils, Float>
diff --git a/quickstep/src/com/android/quickstep/views/TaskContainer.kt b/quickstep/src/com/android/quickstep/views/TaskContainer.kt
index afe7e92..0e769d0 100644
--- a/quickstep/src/com/android/quickstep/views/TaskContainer.kt
+++ b/quickstep/src/com/android/quickstep/views/TaskContainer.kt
@@ -22,6 +22,7 @@
import android.view.View
import android.view.View.OnClickListener
import com.android.app.tracing.traceSection
+import com.android.launcher3.Flags.enableOverviewIconMenu
import com.android.launcher3.Flags.enableRefactorTaskThumbnail
import com.android.launcher3.model.data.TaskViewItemInfo
import com.android.launcher3.util.SplitConfigurationOptions
@@ -31,7 +32,6 @@
import com.android.quickstep.recents.domain.usecase.ThumbnailPosition
import com.android.quickstep.recents.ui.mapper.TaskUiStateMapper
import com.android.quickstep.recents.ui.viewmodel.TaskData
-import com.android.quickstep.task.thumbnail.TaskContentView
import com.android.quickstep.task.thumbnail.TaskThumbnailView
import com.android.systemui.shared.recents.model.Task
import com.android.systemui.shared.recents.model.ThumbnailData
@@ -40,7 +40,6 @@
class TaskContainer(
val taskView: TaskView,
val task: Task,
- val taskContentView: TaskContentView,
val snapshotView: View,
val iconView: TaskViewIcon,
/**
@@ -112,8 +111,8 @@
fun destroy() =
traceSection("TaskContainer.destroy") {
digitalWellBeingToast?.destroy()
- taskContentView.scaleX = 1f
- taskContentView.scaleY = 1f
+ snapshotView.scaleX = 1f
+ snapshotView.scaleY = 1f
overlay.reset()
if (enableRefactorTaskThumbnail()) {
isThumbnailValid = false
@@ -122,6 +121,10 @@
} else {
thumbnailViewDeprecated.setShowSplashForSplitSelection(false)
}
+
+ if (enableOverviewIconMenu()) {
+ (iconView as IconAppChipView).reset()
+ }
}
fun setOverlayEnabled(enabled: Boolean) {
@@ -174,9 +177,13 @@
clickCloseListener: OnClickListener?,
) =
traceSection("TaskContainer.setState") {
- taskContentView.setState(
- TaskUiStateMapper.toTaskHeaderState(state, hasHeader, clickCloseListener),
- TaskUiStateMapper.toTaskThumbnailUiState(state, liveTile),
+ thumbnailView.setState(
+ TaskUiStateMapper.toTaskThumbnailUiState(
+ state,
+ liveTile,
+ hasHeader,
+ clickCloseListener,
+ ),
state?.taskId,
)
thumbnailData = if (state is TaskData.Data) state.thumbnailData else null
diff --git a/quickstep/src/com/android/quickstep/views/TaskMenuView.kt b/quickstep/src/com/android/quickstep/views/TaskMenuView.kt
index 696f934..f7cb7be 100644
--- a/quickstep/src/com/android/quickstep/views/TaskMenuView.kt
+++ b/quickstep/src/com/android/quickstep/views/TaskMenuView.kt
@@ -251,6 +251,7 @@
rotation = orientationHandler.degreesRotated
if (enableOverviewIconMenu()) {
+ elevation = resources.getDimension(R.dimen.task_thumbnail_icon_menu_elevation)
translationX = thumbnailAlignedX
translationY = thumbnailAlignedY
} else {
@@ -428,9 +429,7 @@
var additionalTranslationX = 0f
if (
- recentsViewContainer.deviceProfile.isLandscape &&
- taskContainer.stagePosition ==
- SplitConfigurationOptions.STAGE_POSITION_BOTTOM_OR_RIGHT
+ taskContainer.stagePosition == SplitConfigurationOptions.STAGE_POSITION_BOTTOM_OR_RIGHT
) {
// Animate menu and icon when split task would display off the side of the screen.
additionalTranslationX =
@@ -474,8 +473,8 @@
val isLastMenuOptionFocused =
optionLayout.indexOfChild(optionLayout.focusedChild) == optionLayout.childCount - 1
if (
- (isLastMenuOptionFocused && event.keyCode == KeyEvent.KEYCODE_DPAD_DOWN)
- || (isFirstMenuOptionFocused && event.keyCode == KeyEvent.KEYCODE_DPAD_UP)
+ (isLastMenuOptionFocused && event.keyCode == KeyEvent.KEYCODE_DPAD_DOWN) ||
+ (isFirstMenuOptionFocused && event.keyCode == KeyEvent.KEYCODE_DPAD_UP)
) {
iconView.requestFocus()
return true
diff --git a/quickstep/src/com/android/quickstep/views/TaskHeaderView.kt b/quickstep/src/com/android/quickstep/views/TaskThumbnailViewHeader.kt
similarity index 63%
rename from quickstep/src/com/android/quickstep/views/TaskHeaderView.kt
rename to quickstep/src/com/android/quickstep/views/TaskThumbnailViewHeader.kt
index 1fda5a3..9a8805b 100644
--- a/quickstep/src/com/android/quickstep/views/TaskHeaderView.kt
+++ b/quickstep/src/com/android/quickstep/views/TaskThumbnailViewHeader.kt
@@ -18,33 +18,23 @@
import android.content.Context
import android.util.AttributeSet
+import android.widget.FrameLayout
import android.widget.ImageButton
import android.widget.ImageView
import android.widget.TextView
-import androidx.constraintlayout.widget.ConstraintLayout
-import androidx.core.view.isGone
import com.android.launcher3.R
-import com.android.quickstep.task.thumbnail.TaskHeaderUiState
+import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.ThumbnailHeader
-class TaskHeaderView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) :
- ConstraintLayout(context, attrs) {
+class TaskThumbnailViewHeader
+@JvmOverloads
+constructor(context: Context, attrs: AttributeSet? = null) : FrameLayout(context, attrs) {
private val headerTitleView: TextView by lazy { findViewById(R.id.header_app_title) }
private val headerIconView: ImageView by lazy { findViewById(R.id.header_app_icon) }
private val headerCloseButton: ImageButton by lazy { findViewById(R.id.header_close_button) }
- fun setState(taskHeaderState: TaskHeaderUiState) {
- when (taskHeaderState) {
- is TaskHeaderUiState.ShowHeader -> {
- setHeader(taskHeaderState.header)
- isGone = false
- }
- TaskHeaderUiState.HideHeader -> isGone = true
- }
- }
-
- private fun setHeader(header: TaskHeaderUiState.ThumbnailHeader) {
- headerTitleView.text = header.title
+ fun setHeader(header: ThumbnailHeader) {
+ headerTitleView.setText(header.title)
headerIconView.setImageDrawable(header.icon)
headerCloseButton.setOnClickListener(header.clickCloseListener)
}
diff --git a/quickstep/src/com/android/quickstep/views/TaskView.kt b/quickstep/src/com/android/quickstep/views/TaskView.kt
index 3d1643c..fa3fd91 100644
--- a/quickstep/src/com/android/quickstep/views/TaskView.kt
+++ b/quickstep/src/com/android/quickstep/views/TaskView.kt
@@ -33,6 +33,7 @@
import android.view.Display
import android.view.MotionEvent
import android.view.View
+import android.view.View.OnClickListener
import android.view.ViewGroup
import android.view.ViewStub
import android.view.accessibility.AccessibilityNodeInfo
@@ -88,7 +89,6 @@
import com.android.quickstep.recents.ui.viewmodel.TaskData
import com.android.quickstep.recents.ui.viewmodel.TaskTileUiState
import com.android.quickstep.recents.ui.viewmodel.TaskViewModel
-import com.android.quickstep.task.thumbnail.TaskContentView
import com.android.quickstep.util.ActiveGestureErrorDetector
import com.android.quickstep.util.ActiveGestureLog
import com.android.quickstep.util.BorderAnimator
@@ -96,8 +96,11 @@
import com.android.quickstep.util.RecentsOrientedState
import com.android.quickstep.util.TaskCornerRadius
import com.android.quickstep.util.TaskRemovedDuringLaunchListener
-import com.android.quickstep.util.displayId
import com.android.quickstep.util.isExternalDisplay
+import com.android.quickstep.util.safeDisplayId
+import com.android.quickstep.views.IconAppChipView.AppChipStatus
+import com.android.quickstep.views.OverviewActionsView.DISABLED_NO_THUMBNAIL
+import com.android.quickstep.views.OverviewActionsView.DISABLED_ROTATED
import com.android.quickstep.views.RecentsView.UNBOUND_TASK_VIEW_ID
import com.android.systemui.shared.recents.model.Task
import com.android.systemui.shared.recents.model.ThumbnailData
@@ -147,8 +150,11 @@
val isRunningTask: Boolean
get() = this === recentsView?.runningTaskView
+ private val isSelectedTask: Boolean
+ get() = this === recentsView?.selectedTaskView
+
open val displayId: Int
- get() = taskContainers.firstOrNull()?.task.displayId
+ get() = taskContainers.firstOrNull()?.task.safeDisplayId
val isExternalDisplay: Boolean
get() = displayId.isExternalDisplay
@@ -337,6 +343,12 @@
onModalnessUpdated(field)
}
+ var modalPivot: PointF? = null
+ set(value) {
+ field = value
+ updatePivots()
+ }
+
var splitSplashAlpha = 0f
set(value) {
field = value
@@ -361,6 +373,12 @@
applyScale()
}
+ var modalScale = 1f
+ set(value) {
+ field = value
+ applyScale()
+ }
+
private var dismissTranslationX = 0f
set(value) {
field = value
@@ -446,9 +464,10 @@
}
private val taskViewAlpha = MultiValueAlpha(this, Alpha.entries.size)
- protected var stableAlpha by MultiPropertyDelegate(taskViewAlpha, Alpha.STABLE)
- var attachAlpha by MultiPropertyDelegate(taskViewAlpha, Alpha.ATTACH)
- var splitAlpha by MultiPropertyDelegate(taskViewAlpha, Alpha.SPLIT)
+ protected var stableAlpha by MultiPropertyDelegate(taskViewAlpha, Alpha.Stable)
+ var attachAlpha by MultiPropertyDelegate(taskViewAlpha, Alpha.Attach)
+ var splitAlpha by MultiPropertyDelegate(taskViewAlpha, Alpha.Split)
+ private var modalAlpha by MultiPropertyDelegate(taskViewAlpha, Alpha.Modal)
protected var shouldShowScreenshot = false
get() = !isRunningTask || field
@@ -628,14 +647,7 @@
override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
super.onLayout(changed, left, top, right, bottom)
- val thumbnailTopMargin = container.deviceProfile.overviewTaskThumbnailTopMarginPx
- if (container.deviceProfile.isTablet) {
- pivotX = (if (layoutDirection == LAYOUT_DIRECTION_RTL) 0 else right - left).toFloat()
- pivotY = thumbnailTopMargin.toFloat()
- } else {
- pivotX = (right - left) * 0.5f
- pivotY = thumbnailTopMargin + (height - thumbnailTopMargin) * 0.5f
- }
+ updatePivots()
systemGestureExclusionRects =
SYSTEM_GESTURE_EXCLUSION_RECT.onEach {
it.right = width
@@ -646,6 +658,24 @@
}
}
+ private fun updatePivots() {
+ val modalPivot = modalPivot
+ if (modalPivot != null) {
+ pivotX = modalPivot.x
+ pivotY = modalPivot.y
+ } else {
+ val thumbnailTopMargin = container.deviceProfile.overviewTaskThumbnailTopMarginPx
+ if (container.deviceProfile.isTablet) {
+ pivotX =
+ (if (layoutDirection == LAYOUT_DIRECTION_RTL) 0 else right - left).toFloat()
+ pivotY = thumbnailTopMargin.toFloat()
+ } else {
+ pivotX = (right - left) * 0.5f
+ pivotY = thumbnailTopMargin + (height - thumbnailTopMargin) * 0.5f
+ }
+ }
+ }
+
override fun onRecycle() {
resetPersistentViewTransforms()
@@ -653,6 +683,9 @@
attachAlpha = 1f
splitAlpha = 1f
splitSplashAlpha = 0f
+ modalAlpha = 1f
+ modalScale = 1f
+ modalPivot = null
taskThumbnailSplashAlpha = 0f
// Clear any references to the thumbnail (it will be re-read either from the cache or the
// system on next bind)
@@ -733,10 +766,13 @@
}
protected open fun inflateViewStubs() {
- findViewById<ViewStub>(R.id.task_content_view)
- ?.apply { layoutResource = R.layout.task_content_view }
+ findViewById<ViewStub>(R.id.snapshot)
+ ?.apply {
+ layoutResource =
+ if (enableRefactorTaskThumbnail()) R.layout.task_thumbnail
+ else R.layout.task_thumbnail_deprecated
+ }
?.inflate()
-
findViewById<ViewStub>(R.id.icon)
?.apply {
layoutResource =
@@ -797,6 +833,20 @@
height = container.thumbnailView.height,
)
container.setOverlayEnabled(state.taskOverlayEnabled, thumbnailPosition)
+ if (state.isCentralTask) {
+ this.container.actionsView.let {
+ it.updateDisabledFlags(
+ DISABLED_ROTATED,
+ thumbnailPosition?.isRotated ?: false,
+ )
+ it.updateDisabledFlags(
+ DISABLED_NO_THUMBNAIL,
+ state.tasks.any { taskData ->
+ (taskData as? TaskData.Data)?.thumbnailData?.thumbnail == null
+ },
+ )
+ }
+ }
if (enableOverviewIconMenu()) {
setIconState(container, containerState)
@@ -869,7 +919,6 @@
listOf(
createTaskContainer(
task,
- R.id.task_content_view,
R.id.snapshot,
R.id.icon,
R.id.show_windows,
@@ -904,9 +953,9 @@
taskContainers.forEach { container ->
container.bind()
if (enableRefactorTaskThumbnail()) {
- container.taskContentView.cornerRadius =
+ container.thumbnailView.cornerRadius =
thumbnailFullscreenParams.currentCornerRadius
- container.taskContentView.doOnSizeChange { width, height ->
+ container.thumbnailView.doOnSizeChange { width, height ->
updateThumbnailValidity(container)
val thumbnailPosition = updateThumbnailMatrix(container, width, height)
container.refreshOverlay(thumbnailPosition)
@@ -933,7 +982,6 @@
protected fun createTaskContainer(
task: Task,
- @IdRes taskContentViewId: Int,
@IdRes thumbnailViewId: Int,
@IdRes iconViewId: Int,
@IdRes showWindowViewId: Int,
@@ -943,12 +991,10 @@
): TaskContainer =
traceSection("TaskView.createTaskContainer") {
val iconView = findViewById<View>(iconViewId) as TaskViewIcon
- val taskContentView = findViewById<TaskContentView>(taskContentViewId)
return TaskContainer(
this,
task,
- taskContentView,
- taskContentView.findViewById(thumbnailViewId),
+ findViewById(thumbnailViewId),
iconView,
TransformingTouchDelegate(iconView.asView()),
stagePosition,
@@ -1037,7 +1083,7 @@
protected open fun updateThumbnailSize() {
// TODO(b/271468547), we should default to setting translations only on the snapshot instead
// of a hybrid of both margins and translations
- firstTaskContainer?.taskContentView?.updateLayoutParams<LayoutParams> {
+ firstTaskContainer?.snapshotView?.updateLayoutParams<LayoutParams> {
topMargin = container.deviceProfile.overviewTaskThumbnailTopMarginPx
}
taskContainers.forEach { it.digitalWellBeingToast?.setupLayout() }
@@ -1051,11 +1097,11 @@
val thumbnailBounds = Rect()
if (relativeToDragLayer) {
container.dragLayer.getDescendantRectRelativeToSelf(
- it.taskContentView,
+ it.snapshotView,
thumbnailBounds,
)
} else {
- thumbnailBounds.set(it.taskContentView)
+ thumbnailBounds.set(it.snapshotView)
}
bounds.union(thumbnailBounds)
}
@@ -1286,7 +1332,7 @@
targets.apps,
targets.wallpapers,
targets.nonApps,
- true /* launcherClosing */,
+ true, /* launcherClosing */
recentsView.stateManager,
recentsView,
recentsView.depthController,
@@ -1520,7 +1566,7 @@
recentsView.setTaskBorderEnabled(false)
}
return if (enableOverviewIconMenu() && menuContainer.iconView is IconAppChipView) {
- if (menuContainer.iconView.isExpanded) {
+ if (menuContainer.iconView.status == AppChipStatus.Expanded) {
closeTaskMenu()
} else {
menuContainer.iconView.revealAnim(/* isRevealing= */ true)
@@ -1722,7 +1768,7 @@
fun getSizeAdjustment(fullscreenEnabled: Boolean) = if (fullscreenEnabled) nonGridScale else 1f
private fun applyScale() {
- val scale = persistentScale * dismissScale
+ val scale = persistentScale * dismissScale * Utilities.mapRange(modalness, 1f, modalScale)
scaleX = scale
scaleY = scale
updateFullscreenParams()
@@ -1769,7 +1815,7 @@
updateFullscreenParams(thumbnailFullscreenParams)
taskContainers.forEach {
if (enableRefactorTaskThumbnail()) {
- it.taskContentView.cornerRadius = thumbnailFullscreenParams.currentCornerRadius
+ it.thumbnailView.cornerRadius = thumbnailFullscreenParams.currentCornerRadius
} else {
it.thumbnailViewDeprecated.setFullscreenParams(thumbnailFullscreenParams)
}
@@ -1784,9 +1830,13 @@
private fun onModalnessUpdated(modalness: Float) {
isClickable = modalness == 0f
taskContainers.forEach {
- it.iconView.setModalAlpha(1 - modalness)
+ it.iconView.setModalAlpha(1f - modalness)
it.digitalWellBeingToast?.bannerOffsetPercentage = modalness
}
+ if (enableGridOnlyOverview()) {
+ modalAlpha = if (isSelectedTask) 1f else (1f - modalness)
+ applyScale()
+ }
}
fun resetPersistentViewTransforms() {
@@ -1842,9 +1892,10 @@
private const val TAG = "TaskView"
private enum class Alpha {
- STABLE,
- ATTACH,
- SPLIT,
+ Stable,
+ Attach,
+ Split,
+ Modal,
}
private enum class SettledProgress {
diff --git a/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureProtoLogProxy.java b/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureProtoLogProxy.java
index 773a039..2532fcf 100644
--- a/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureProtoLogProxy.java
+++ b/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureProtoLogProxy.java
@@ -544,7 +544,7 @@
@NonNull Point displaySize, @NonNull RectF swipeRegion, @NonNull RectF ohmRegion,
int gesturalHeight, int largerGesturalHeight, @NonNull String reason) {
if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return;
- ProtoLog.d(ACTIVE_GESTURE_LOG,
+ ProtoLog.d(ACTIVE_GESTURE_LOG,
"OrientationTouchTransformer.createRegionForDisplay: "
+ "dispRot=%d, dispSize=%s, swipeRegion=%s, ohmRegion=%s, "
+ "gesturalHeight=%d, largerGesturalHeight=%d, reason=%s",
@@ -560,4 +560,14 @@
ProtoLog.d(ACTIVE_GESTURE_LOG, "TaskAnimationManager not available for displayId=%d",
displayId);
}
+
+ public static void logGestureStartSwipeHandler(@NonNull String interactionHandler) {
+ ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString(
+ "OtherActivityInputConsumer.startTouchTrackingForWindowAnimation: "
+ + "interactionHandler=%s", interactionHandler));
+ if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return;
+ ProtoLog.d(ACTIVE_GESTURE_LOG,
+ "OtherActivityInputConsumer.startTouchTrackingForWindowAnimation: "
+ + "interactionHandler=%s", interactionHandler);
+ }
}
diff --git a/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/SplashHelper.kt b/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/SplashHelper.kt
deleted file mode 100644
index 8cc09d4..0000000
--- a/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/SplashHelper.kt
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.quickstep.task.thumbnail
-
-import android.graphics.Bitmap
-import android.graphics.Canvas
-import android.graphics.Color
-import android.graphics.Paint
-
-object SplashHelper {
- private val BITMAP_RECT_COLORS = listOf(Color.GREEN, Color.RED, Color.BLUE, Color.CYAN)
-
- fun createSplash(): Bitmap = createBitmap(width = 20, height = 20, rectColorRotation = 1)
-
- fun createBitmap(width: Int, height: Int, rectColorRotation: Int = 0): Bitmap =
- Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888).apply {
- Canvas(this).apply {
- val paint = Paint()
- paint.color = BITMAP_RECT_COLORS[rectColorRotation % 4]
- drawRect(0f, 0f, width / 2f, height / 2f, paint)
- paint.color = BITMAP_RECT_COLORS[(1 + rectColorRotation) % 4]
- drawRect(width / 2f, 0f, width.toFloat(), height / 2f, paint)
- paint.color = BITMAP_RECT_COLORS[(2 + rectColorRotation) % 4]
- drawRect(0f, height / 2f, width / 2f, height.toFloat(), paint)
- paint.color = BITMAP_RECT_COLORS[(3 + rectColorRotation) % 4]
- drawRect(width / 2f, height / 2f, width.toFloat(), height.toFloat(), paint)
- }
- }
-}
diff --git a/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/TaskContentViewScreenshotTest.kt b/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/TaskContentViewScreenshotTest.kt
deleted file mode 100644
index 7b1e445..0000000
--- a/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/TaskContentViewScreenshotTest.kt
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright (C) 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.quickstep.task.thumbnail
-
-import android.content.Context
-import android.graphics.Color
-import android.graphics.drawable.BitmapDrawable
-import android.platform.test.flag.junit.SetFlagsRule
-import android.view.LayoutInflater
-import com.android.launcher3.Flags
-import com.android.launcher3.R
-import com.android.launcher3.util.rule.setFlags
-import com.android.quickstep.task.thumbnail.SplashHelper.createSplash
-import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.BackgroundOnly
-import com.google.android.apps.nexuslauncher.imagecomparison.goldenpathmanager.ViewScreenshotGoldenPathManager
-import org.junit.Before
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-import platform.test.runner.parameterized.ParameterizedAndroidJunit4
-import platform.test.runner.parameterized.Parameters
-import platform.test.screenshot.DeviceEmulationSpec
-import platform.test.screenshot.Displays
-import platform.test.screenshot.ViewScreenshotTestRule
-import platform.test.screenshot.getEmulatedDevicePathConfig
-
-/** Screenshot tests for [TaskContentView]. */
-@RunWith(ParameterizedAndroidJunit4::class)
-class TaskContentViewScreenshotTest(emulationSpec: DeviceEmulationSpec) {
-
- @get:Rule(order = 0) val setFlagsRule = SetFlagsRule()
-
- @get:Rule(order = 1)
- val screenshotRule =
- ViewScreenshotTestRule(
- emulationSpec,
- ViewScreenshotGoldenPathManager(getEmulatedDevicePathConfig(emulationSpec)),
- )
-
- @Before
- fun setUp() {
- setFlagsRule.setFlags(true, Flags.FLAG_ENABLE_REFACTOR_TASK_THUMBNAIL)
- }
-
- @Test
- fun taskContentView_recyclesToUninitialized() {
- screenshotRule.screenshotTest("taskContentView_uninitialized") { activity ->
- activity.actionBar?.hide()
- val taskContentView = createTaskContentView(activity)
- taskContentView.setState(
- TaskHeaderUiState.HideHeader,
- BackgroundOnly(Color.YELLOW),
- null,
- )
- taskContentView.onRecycle()
- taskContentView
- }
- }
-
- @Test
- fun taskContentView_shows_thumbnail_and_header() {
- screenshotRule.screenshotTest("taskContentView_shows_thumbnail_and_header") { activity ->
- activity.actionBar?.hide()
- createTaskContentView(activity).apply {
- setState(
- TaskHeaderUiState.ShowHeader(
- TaskHeaderUiState.ThumbnailHeader(
- BitmapDrawable(activity.resources, createSplash()),
- "test",
- ) {}
- ),
- BackgroundOnly(Color.YELLOW),
- null,
- )
- }
- }
- }
-
- @Test
- fun taskContentView_scaled_roundRoundedCorners() {
- screenshotRule.screenshotTest("taskContentView_scaledRoundedCorners") { activity ->
- activity.actionBar?.hide()
- createTaskContentView(activity).apply {
- scaleX = 0.75f
- scaleY = 0.3f
- setState(TaskHeaderUiState.HideHeader, BackgroundOnly(Color.YELLOW), null)
- }
- }
- }
-
- private fun createTaskContentView(context: Context): TaskContentView {
- val taskContentView =
- LayoutInflater.from(context).inflate(R.layout.task_content_view, null, false)
- as TaskContentView
- taskContentView.cornerRadius = CORNER_RADIUS
- return taskContentView
- }
-
- companion object {
- @Parameters(name = "{0}")
- @JvmStatic
- fun getTestSpecs() =
- DeviceEmulationSpec.forDisplays(
- Displays.Phone,
- isDarkTheme = false,
- isLandscape = false,
- )
-
- const val CORNER_RADIUS = 56f
- }
-}
diff --git a/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/TaskHeaderViewScreenshotTest.kt b/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/TaskHeaderViewScreenshotTest.kt
deleted file mode 100644
index e30554e..0000000
--- a/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/TaskHeaderViewScreenshotTest.kt
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (C) 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.quickstep.task.thumbnail
-
-import android.content.Context
-import android.graphics.drawable.BitmapDrawable
-import android.view.LayoutInflater
-import com.android.launcher3.R
-import com.android.quickstep.task.thumbnail.SplashHelper.createSplash
-import com.android.quickstep.views.TaskHeaderView
-import com.google.android.apps.nexuslauncher.imagecomparison.goldenpathmanager.ViewScreenshotGoldenPathManager
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-import platform.test.runner.parameterized.ParameterizedAndroidJunit4
-import platform.test.runner.parameterized.Parameters
-import platform.test.screenshot.DeviceEmulationSpec
-import platform.test.screenshot.Displays
-import platform.test.screenshot.ViewScreenshotTestRule
-import platform.test.screenshot.getEmulatedDevicePathConfig
-
-/** Screenshot tests for [TaskHeaderView]. */
-@RunWith(ParameterizedAndroidJunit4::class)
-class TaskHeaderViewScreenshotTest(emulationSpec: DeviceEmulationSpec) {
- @get:Rule
- val screenshotRule =
- ViewScreenshotTestRule(
- emulationSpec,
- ViewScreenshotGoldenPathManager(getEmulatedDevicePathConfig(emulationSpec)),
- )
-
- @Test
- fun taskHeaderView_showHeader() {
- screenshotRule.screenshotTest("taskHeaderView_showHeader") { activity ->
- activity.actionBar?.hide()
- createTaskHeaderView(activity).apply {
- setState(
- TaskHeaderUiState.ShowHeader(
- TaskHeaderUiState.ThumbnailHeader(
- BitmapDrawable(activity.resources, createSplash()),
- "Example",
- ) {}
- )
- )
- }
- }
- }
-
- private fun createTaskHeaderView(context: Context): TaskHeaderView {
- val taskHeaderView =
- LayoutInflater.from(context).inflate(R.layout.task_header_view, null, false)
- as TaskHeaderView
- return taskHeaderView
- }
-
- companion object {
- @Parameters(name = "{0}")
- @JvmStatic
- fun getTestSpecs() =
- DeviceEmulationSpec.forDisplays(
- Displays.Tablet,
- isDarkTheme = false,
- isLandscape = true,
- )
- }
-}
diff --git a/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/TaskThumbnailViewScreenshotTest.kt b/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/TaskThumbnailViewScreenshotTest.kt
index 45df735..80b2c16 100644
--- a/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/TaskThumbnailViewScreenshotTest.kt
+++ b/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/TaskThumbnailViewScreenshotTest.kt
@@ -16,14 +16,16 @@
package com.android.quickstep.task.thumbnail
import android.content.Context
+import android.graphics.Bitmap
+import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Matrix
+import android.graphics.Paint
import android.graphics.drawable.BitmapDrawable
import android.view.LayoutInflater
import android.view.Surface.ROTATION_0
+import androidx.core.graphics.set
import com.android.launcher3.R
-import com.android.quickstep.task.thumbnail.SplashHelper.createBitmap
-import com.android.quickstep.task.thumbnail.SplashHelper.createSplash
import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.BackgroundOnly
import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.Snapshot
import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.SnapshotSplash
@@ -88,25 +90,23 @@
}
@Test
- fun taskThumbnailView_liveTile() {
+ fun taskThumbnailView_liveTile_withoutHeader() {
screenshotRule.screenshotTest("taskThumbnailView_liveTile") { activity ->
activity.actionBar?.hide()
- createTaskThumbnailView(activity).apply { setState(TaskThumbnailUiState.LiveTile) }
+ createTaskThumbnailView(activity).apply {
+ setState(TaskThumbnailUiState.LiveTile.WithoutHeader)
+ }
}
}
@Test
- fun taskThumbnailView_image() {
+ fun taskThumbnailView_image_withoutHeader() {
screenshotRule.screenshotTest("taskThumbnailView_image") { activity ->
activity.actionBar?.hide()
createTaskThumbnailView(activity).apply {
setState(
SnapshotSplash(
- Snapshot(
- createBitmap(VIEW_ENV_WIDTH, VIEW_ENV_HEIGHT),
- ROTATION_0,
- Color.DKGRAY,
- ),
+ Snapshot.WithoutHeader(createBitmap(), ROTATION_0, Color.DKGRAY),
null,
)
)
@@ -115,14 +115,14 @@
}
@Test
- fun taskThumbnailView_image_withImageMatrix() {
+ fun taskThumbnailView_image_withoutHeader_withImageMatrix() {
screenshotRule.screenshotTest("taskThumbnailView_image_withMatrix") { activity ->
activity.actionBar?.hide()
createTaskThumbnailView(activity).apply {
val lessThanHeightMatchingAspectRatio = (VIEW_ENV_HEIGHT / 2) - 200
setState(
SnapshotSplash(
- Snapshot(
+ Snapshot.WithoutHeader(
createBitmap(
width = VIEW_ENV_WIDTH / 2,
height = lessThanHeightMatchingAspectRatio,
@@ -139,17 +139,13 @@
}
@Test
- fun taskThumbnailView_splash() {
+ fun taskThumbnailView_splash_withoutHeader() {
screenshotRule.screenshotTest("taskThumbnailView_partial_splash") { activity ->
activity.actionBar?.hide()
createTaskThumbnailView(activity).apply {
setState(
SnapshotSplash(
- Snapshot(
- createBitmap(VIEW_ENV_WIDTH, VIEW_ENV_HEIGHT),
- ROTATION_0,
- Color.DKGRAY,
- ),
+ Snapshot.WithoutHeader(createBitmap(), ROTATION_0, Color.DKGRAY),
BitmapDrawable(activity.resources, createSplash()),
)
)
@@ -159,14 +155,14 @@
}
@Test
- fun taskThumbnailView_splash_withImageMatrix() {
+ fun taskThumbnailView_splash_withoutHeader_withImageMatrix() {
screenshotRule.screenshotTest("taskThumbnailView_partial_splash_withMatrix") { activity ->
activity.actionBar?.hide()
createTaskThumbnailView(activity).apply {
val lessThanHeightMatchingAspectRatio = (VIEW_ENV_HEIGHT / 2) - 200
setState(
SnapshotSplash(
- Snapshot(
+ Snapshot.WithoutHeader(
createBitmap(
width = VIEW_ENV_WIDTH / 2,
height = lessThanHeightMatchingAspectRatio,
@@ -233,9 +229,31 @@
val taskThumbnailView =
LayoutInflater.from(context).inflate(R.layout.task_thumbnail, null, false)
as TaskThumbnailView
+ taskThumbnailView.cornerRadius = CORNER_RADIUS
return taskThumbnailView
}
+ private fun createSplash() = createBitmap(width = 20, height = 20, rectColorRotation = 1)
+
+ private fun createBitmap(
+ width: Int = VIEW_ENV_WIDTH,
+ height: Int = VIEW_ENV_HEIGHT,
+ rectColorRotation: Int = 0,
+ ) =
+ Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888).apply {
+ Canvas(this).apply {
+ val paint = Paint()
+ paint.color = BITMAP_RECT_COLORS[rectColorRotation % 4]
+ drawRect(0f, 0f, width / 2f, height / 2f, paint)
+ paint.color = BITMAP_RECT_COLORS[(1 + rectColorRotation) % 4]
+ drawRect(width / 2f, 0f, width.toFloat(), height / 2f, paint)
+ paint.color = BITMAP_RECT_COLORS[(2 + rectColorRotation) % 4]
+ drawRect(0f, height / 2f, width / 2f, height.toFloat(), paint)
+ paint.color = BITMAP_RECT_COLORS[(3 + rectColorRotation) % 4]
+ drawRect(width / 2f, height / 2f, width.toFloat(), height.toFloat(), paint)
+ }
+ }
+
companion object {
@Parameters(name = "{0}")
@JvmStatic
@@ -246,6 +264,8 @@
isLandscape = false,
)
+ const val CORNER_RADIUS = 56f
+ val BITMAP_RECT_COLORS = listOf(Color.GREEN, Color.RED, Color.BLUE, Color.CYAN)
const val VIEW_ENV_WIDTH = 1440
const val VIEW_ENV_HEIGHT = 3120
}
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/model/data/TaskViewItemInfoTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/model/data/TaskViewItemInfoTest.kt
index d2abed8..42adfec 100644
--- a/quickstep/tests/multivalentTests/src/com/android/launcher3/model/data/TaskViewItemInfoTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/model/data/TaskViewItemInfoTest.kt
@@ -35,7 +35,6 @@
import com.android.quickstep.TaskOverlayFactory
import com.android.quickstep.TaskOverlayFactory.TaskOverlay
import com.android.quickstep.recents.di.RecentsDependencies
-import com.android.quickstep.task.thumbnail.TaskContentView
import com.android.quickstep.task.thumbnail.TaskThumbnailView
import com.android.quickstep.views.RecentsView
import com.android.quickstep.views.TaskContainer
@@ -199,7 +198,6 @@
return TaskContainer(
taskView,
task,
- mock<TaskContentView>(),
if (enableRefactorTaskThumbnail()) mock<TaskThumbnailView>()
else mock<TaskThumbnailViewDeprecated>(),
mock<TaskViewIcon>(),
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarHoverToolTipControllerTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarHoverToolTipControllerTest.kt
new file mode 100644
index 0000000..d2b9fcf
--- /dev/null
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarHoverToolTipControllerTest.kt
@@ -0,0 +1,154 @@
+/*
+ * Copyright (C) 2025 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.view.MotionEvent
+import android.view.MotionEvent.ACTION_HOVER_ENTER
+import android.view.MotionEvent.ACTION_HOVER_EXIT
+import com.android.launcher3.AbstractFloatingView
+import com.android.launcher3.BubbleTextView
+import com.android.launcher3.R
+import com.android.launcher3.apppairs.AppPairIcon
+import com.android.launcher3.folder.FolderIcon
+import com.android.launcher3.model.data.WorkspaceItemInfo
+import com.android.launcher3.taskbar.TaskbarControllerTestUtil.runOnMainSync
+import com.android.launcher3.taskbar.TaskbarViewTestUtil.createHotseatAppPairsItem
+import com.android.launcher3.taskbar.TaskbarViewTestUtil.createHotseatFolderItem
+import com.android.launcher3.taskbar.TaskbarViewTestUtil.createHotseatWorkspaceItem
+import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule
+import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule.InjectController
+import com.android.launcher3.taskbar.rules.TaskbarWindowSandboxContext
+import com.android.launcher3.util.LauncherMultivalentJUnit
+import com.android.launcher3.util.LauncherMultivalentJUnit.EmulatedDevices
+import com.google.common.truth.Truth.assertThat
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(LauncherMultivalentJUnit::class)
+@EmulatedDevices(["pixelFoldable2023", "pixelTablet2023"])
+class TaskbarHoverToolTipControllerTest {
+
+ @get:Rule(order = 0) val context = TaskbarWindowSandboxContext.create()
+ @get:Rule(order = 1) val taskbarUnitTestRule = TaskbarUnitTestRule(this, context)
+
+ @InjectController lateinit var autohideSuspendController: TaskbarAutohideSuspendController
+ @InjectController lateinit var popupController: TaskbarPopupController
+
+ private val taskbarContext: TaskbarActivityContext by taskbarUnitTestRule::activityContext
+
+ private lateinit var taskbarView: TaskbarView
+ private lateinit var iconView: BubbleTextView
+ private lateinit var appPairIcon: AppPairIcon
+ private lateinit var folderIcon: FolderIcon
+
+ private val isHoverToolTipOpen: Boolean
+ get() {
+ // TaskbarHoverToolTip uses ArrowTipView which is type TYPE_ON_BOARD_POPUP.
+ return AbstractFloatingView.hasOpenView(
+ taskbarContext,
+ AbstractFloatingView.TYPE_ON_BOARD_POPUP,
+ )
+ }
+
+ @Before
+ fun setup() {
+ runOnMainSync { taskbarView = taskbarContext.dragLayer.findViewById(R.id.taskbar_view) }
+
+ val hotseatItems =
+ arrayOf(
+ createHotseatWorkspaceItem(),
+ createHotseatAppPairsItem(),
+ createHotseatFolderItem(),
+ )
+ runOnMainSync {
+ taskbarView.updateItems(hotseatItems, emptyList())
+ iconView =
+ taskbarView.iconViews.filterIsInstance<BubbleTextView>().first {
+ it.tag is WorkspaceItemInfo
+ }
+ appPairIcon = taskbarView.iconViews.filterIsInstance<AppPairIcon>().first()
+ folderIcon = taskbarView.iconViews.filterIsInstance<FolderIcon>().first()
+ }
+ }
+
+ @Test
+ fun onHover_hoverEnterIcon_revealToolTip_hoverExitIcon_closeToolTip() {
+ runOnMainSync { iconView.dispatchGenericMotionEvent(HOVER_ENTER) }
+ assertThat(isHoverToolTipOpen).isTrue()
+ assertThat(autohideSuspendController.isTransientTaskbarStashingSuspended).isTrue()
+ runOnMainSync { iconView.dispatchGenericMotionEvent(HOVER_EXIT) }
+ assertThat(isHoverToolTipOpen).isFalse()
+ assertThat(autohideSuspendController.isTransientTaskbarStashingSuspended).isFalse()
+ }
+
+ @Test
+ fun onHover_hoverEnterFolderIcon_revealToolTip_hoverExitFolderIcon_closeToolTip() {
+ runOnMainSync { folderIcon.dispatchGenericMotionEvent(HOVER_ENTER) }
+ assertThat(isHoverToolTipOpen).isTrue()
+ assertThat(autohideSuspendController.isTransientTaskbarStashingSuspended).isTrue()
+ runOnMainSync { folderIcon.dispatchGenericMotionEvent(HOVER_EXIT) }
+ assertThat(isHoverToolTipOpen).isFalse()
+ assertThat(autohideSuspendController.isTransientTaskbarStashingSuspended).isFalse()
+ }
+
+ @Test
+ fun onHover_hoverEnterAppPair_revealToolTip_hoverExitAppPair_closeToolTip() {
+ runOnMainSync { appPairIcon.dispatchGenericMotionEvent(HOVER_ENTER) }
+ assertThat(isHoverToolTipOpen).isTrue()
+ assertThat(autohideSuspendController.isTransientTaskbarStashingSuspended).isTrue()
+ runOnMainSync { appPairIcon.dispatchGenericMotionEvent(HOVER_EXIT) }
+ assertThat(isHoverToolTipOpen).isFalse()
+ assertThat(autohideSuspendController.isTransientTaskbarStashingSuspended).isFalse()
+ }
+
+ @Test
+ fun onHover_hoverEnterIconAlignedWithHotseat_noToolTip() {
+ taskbarContext.setUIController(
+ object : TaskbarUIController() {
+ override fun isIconAlignedWithHotseat(): Boolean = true
+ }
+ )
+
+ runOnMainSync { iconView.dispatchGenericMotionEvent(HOVER_ENTER) }
+ assertThat(isHoverToolTipOpen).isFalse()
+ }
+
+ @Test
+ fun onHover_hoverEnterFolderOpen_noToolTip() {
+ runOnMainSync {
+ folderIcon.folder.animateOpen()
+ iconView.dispatchGenericMotionEvent(HOVER_ENTER)
+ }
+ assertThat(isHoverToolTipOpen).isFalse()
+ }
+
+ @Test
+ fun onHover_hoverEnterPopupOpen_noToolTip() {
+ runOnMainSync {
+ popupController.showForIcon(iconView)
+ iconView.dispatchGenericMotionEvent(HOVER_ENTER)
+ }
+ assertThat(isHoverToolTipOpen).isFalse()
+ }
+
+ companion object {
+ private val HOVER_EXIT = MotionEvent.obtain(0, 0, ACTION_HOVER_EXIT, 0f, 0f, 0)
+ private val HOVER_ENTER = MotionEvent.obtain(0, 0, ACTION_HOVER_ENTER, 0f, 0f, 0)
+ }
+}
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarRecentAppsControllerTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarRecentAppsControllerTest.kt
index 8758d7c..334d8ab 100644
--- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarRecentAppsControllerTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarRecentAppsControllerTest.kt
@@ -960,7 +960,7 @@
private fun setInDesktopMode(inDesktopMode: Boolean) {
whenever(taskbarControllers.taskbarDesktopModeController.shouldShowDesktopTasksInTaskbar())
.thenReturn(inDesktopMode)
- whenever(taskbarControllers.taskbarDesktopModeController.isInDesktopMode)
+ whenever(taskbarControllers.taskbarDesktopModeController.isInDesktopMode(DEFAULT_DISPLAY))
.thenReturn(inDesktopMode)
}
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewTestUtil.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewTestUtil.kt
index e52aacf..92abbba 100644
--- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewTestUtil.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewTestUtil.kt
@@ -18,8 +18,13 @@
import android.content.ComponentName
import android.content.Intent
+import android.graphics.Bitmap
+import android.graphics.Bitmap.createBitmap
import android.os.Process
+import com.android.launcher3.icons.BitmapInfo
import com.android.launcher3.model.data.AppInfo
+import com.android.launcher3.model.data.AppPairInfo
+import com.android.launcher3.model.data.FolderInfo
import com.android.launcher3.model.data.ItemInfo
import com.android.launcher3.model.data.WorkspaceItemInfo
import com.android.launcher3.taskbar.TaskbarIconType.ALL_APPS
@@ -53,7 +58,27 @@
return WorkspaceItemInfo(
AppInfo(TEST_COMPONENT, "Test App $id", Process.myUserHandle(), Intent())
)
- .apply { this.id = id }
+ .apply {
+ this.id = id
+ // Create a placeholder icon so that the test doesn't try to load a high-res icon.
+ this.bitmap = BitmapInfo.fromBitmap(createBitmap(1, 1, Bitmap.Config.ALPHA_8))
+ }
+ }
+
+ fun createHotseatAppPairsItem(): AppPairInfo {
+ return AppPairInfo().apply {
+ add(createHotseatWorkspaceItem(1))
+ add(createHotseatWorkspaceItem(2))
+ }
+ }
+
+ fun createHotseatFolderItem(): FolderInfo {
+ return FolderInfo().apply {
+ title = "Test Folder"
+ add(createHotseatWorkspaceItem(1))
+ add(createHotseatWorkspaceItem(2))
+ add(createHotseatWorkspaceItem(3))
+ }
}
/** Creates a list of fake recent tasks. */
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarUnitTestRule.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarUnitTestRule.kt
index 2dacf69..19c8824 100644
--- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarUnitTestRule.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarUnitTestRule.kt
@@ -28,6 +28,7 @@
import com.android.launcher3.taskbar.TaskbarControllers
import com.android.launcher3.taskbar.TaskbarManager
import com.android.launcher3.taskbar.TaskbarNavButtonController.TaskbarNavButtonCallbacks
+import com.android.launcher3.taskbar.TaskbarUIController
import com.android.launcher3.taskbar.bubbles.BubbleControllers
import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule.InjectController
import com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR
@@ -117,6 +118,8 @@
super.recreateTaskbars()
if (currentActivityContext != null) {
injectControllers()
+ // TODO(b/346394875): we should test a non-default uiController.
+ activityContext.setUIController(TaskbarUIController.DEFAULT)
controllerInjectionCallback.invoke()
}
}
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/AbsSwipeUpHandlerTestCase.java b/quickstep/tests/multivalentTests/src/com/android/quickstep/AbsSwipeUpHandlerTestCase.java
index 7824000..2f5f160 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/AbsSwipeUpHandlerTestCase.java
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/AbsSwipeUpHandlerTestCase.java
@@ -292,7 +292,7 @@
public void testHomeGesture_invalidatesHandlerAfterParallelAnim() {
ValueAnimator parallelAnim = new ValueAnimator();
parallelAnim.setRepeatCount(ValueAnimator.INFINITE);
- when(mActivityInterface.getParallelAnimationToLauncher(any(), anyLong(), any()))
+ when(mActivityInterface.getParallelAnimationToGestureEndTarget(any(), anyLong(), any()))
.thenReturn(parallelAnim);
SWIPE_HANDLER handler = createSwipeUpHandlerForGesture(GestureState.GestureEndTarget.HOME);
runOnMainSync(() -> {
@@ -306,7 +306,7 @@
@Test
public void testHomeGesture_invalidatesHandlerIfNoParallelAnim() {
- when(mActivityInterface.getParallelAnimationToLauncher(any(), anyLong(), any()))
+ when(mActivityInterface.getParallelAnimationToGestureEndTarget(any(), anyLong(), any()))
.thenReturn(null);
SWIPE_HANDLER handler = createSwipeUpHandlerForGesture(GestureState.GestureEndTarget.HOME);
runOnMainSync(() -> {
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/fallback/RecentsStateUtilsTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/fallback/RecentsStateUtilsTest.kt
new file mode 100644
index 0000000..4e9dae8
--- /dev/null
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/fallback/RecentsStateUtilsTest.kt
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.quickstep.fallback
+
+import com.android.launcher3.testing.shared.TestProtocol.BACKGROUND_APP_STATE_ORDINAL
+import com.android.launcher3.testing.shared.TestProtocol.NORMAL_STATE_ORDINAL
+import com.android.launcher3.testing.shared.TestProtocol.OVERVIEW_MODAL_TASK_STATE_ORDINAL
+import com.android.launcher3.testing.shared.TestProtocol.OVERVIEW_SPLIT_SELECT_ORDINAL
+import com.android.launcher3.testing.shared.TestProtocol.OVERVIEW_STATE_ORDINAL
+import com.android.launcher3.util.LauncherMultivalentJUnit
+import com.android.launcher3.util.LauncherMultivalentJUnit.EmulatedDevices
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(LauncherMultivalentJUnit::class)
+@EmulatedDevices(["pixelTablet2023"])
+class RecentsStateUtilsTest {
+
+ @Test
+ fun testRecentsStateDefault_toLauncherStateOrdinal_isOverviewStateOrdinal() {
+ assertThat(RecentsState.DEFAULT.toLauncherStateOrdinal()).isEqualTo(OVERVIEW_STATE_ORDINAL)
+ }
+
+ @Test
+ fun testRecentsStateModal_toLauncherStateOrdinal_isModalTaskStateOrdinal() {
+ assertThat(RecentsState.MODAL_TASK.toLauncherStateOrdinal())
+ .isEqualTo(OVERVIEW_MODAL_TASK_STATE_ORDINAL)
+ }
+
+ @Test
+ fun testRecentsStateBackgroundApp_toLauncherStateOrdinal_isBackgroundAppStateOrdinal() {
+ assertThat(RecentsState.BACKGROUND_APP.toLauncherStateOrdinal())
+ .isEqualTo(BACKGROUND_APP_STATE_ORDINAL)
+ }
+
+ @Test
+ fun testRecentsStateHome_toLauncherStateOrdinal_isNormalStateOrdinal() {
+ assertThat(RecentsState.HOME.toLauncherStateOrdinal()).isEqualTo(NORMAL_STATE_ORDINAL)
+ }
+
+ @Test
+ fun testRecentsStateBgLauncher_toLauncherStateOrdinal_isNormalStateOrdinal() {
+ assertThat(RecentsState.BG_LAUNCHER.toLauncherStateOrdinal())
+ .isEqualTo(NORMAL_STATE_ORDINAL)
+ }
+
+ @Test
+ fun testRecentsStateOverviewSplitSelect_toLauncherStateOrdinal_isOverviewSplitSelectStateOrdinal() {
+ assertThat(RecentsState.OVERVIEW_SPLIT_SELECT.toLauncherStateOrdinal())
+ .isEqualTo(OVERVIEW_SPLIT_SELECT_ORDINAL)
+ }
+}
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/inputconsumers/NavHandleLongPressInputConsumerTest.java b/quickstep/tests/multivalentTests/src/com/android/quickstep/inputconsumers/NavHandleLongPressInputConsumerTest.java
index cfeade8..ee9505c 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/inputconsumers/NavHandleLongPressInputConsumerTest.java
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/inputconsumers/NavHandleLongPressInputConsumerTest.java
@@ -36,6 +36,7 @@
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
@@ -105,11 +106,12 @@
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
- when(mTopTaskTracker.getCachedTopTask(anyBoolean())).thenReturn(mTaskInfo);
+ when(mTopTaskTracker.getCachedTopTask(anyBoolean(), anyInt())).thenReturn(mTaskInfo);
when(mDeviceState.getSquaredTouchSlop()).thenReturn(SQUARED_TOUCH_SLOP);
when(mDelegate.allowInterceptByParent()).thenReturn(true);
mLongPressTriggered.set(false);
- when(mNavHandleLongPressHandler.getLongPressRunnable(any())).thenReturn(mLongPressRunnable);
+ when(mNavHandleLongPressHandler.getLongPressRunnable(any(), anyInt())).thenReturn(
+ mLongPressRunnable);
when(mStatsLogger.withPackageName(any())).thenReturn(mStatsLogger);
when(mStatsLatencyLogger.withInstanceId(any())).thenReturn(mStatsLatencyLogger);
when(mStatsLatencyLogger.withLatency(anyLong())).thenReturn(mStatsLatencyLogger);
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/ui/mapper/TaskUiStateMapperTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/ui/mapper/TaskUiStateMapperTest.kt
index 6c0d0ed..7ca194a 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/ui/mapper/TaskUiStateMapperTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/ui/mapper/TaskUiStateMapperTest.kt
@@ -19,120 +19,33 @@
import android.graphics.Bitmap
import android.graphics.Color
import android.graphics.drawable.ShapeDrawable
-import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
-import android.platform.test.flag.junit.SetFlagsRule
import android.view.Surface
import android.view.View
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.android.launcher3.Flags
import com.android.quickstep.recents.ui.viewmodel.TaskData
-import com.android.quickstep.task.thumbnail.TaskHeaderUiState
import com.android.quickstep.task.thumbnail.TaskThumbnailUiState
import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.LiveTile
import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.Snapshot
+import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.ThumbnailHeader
import com.android.systemui.shared.recents.model.ThumbnailData
import com.google.common.truth.Truth.assertThat
-import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
class TaskUiStateMapperTest {
- @get:Rule val mSetFlagsRule = SetFlagsRule()
-
- /** TaskHeaderUiState */
@Test
- fun taskData_isNull_returns_HideHeader() {
+ fun taskData_isNull_returns_Uninitialized() {
val result =
- TaskUiStateMapper.toTaskHeaderState(
+ TaskUiStateMapper.toTaskThumbnailUiState(
taskData = null,
+ isLiveTile = false,
hasHeader = false,
clickCloseListener = null,
)
- assertThat(result).isEqualTo(TaskHeaderUiState.HideHeader)
- }
-
- @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_EXPLODED_VIEW)
- @Test
- fun explodedFlagDisabled_returnsHideHeader() {
- val inputs =
- listOf(
- TASK_DATA,
- TASK_DATA.copy(thumbnailData = null),
- TASK_DATA.copy(isLocked = true),
- TASK_DATA.copy(title = null),
- )
- val closeCallback = View.OnClickListener {}
- val expected = TaskHeaderUiState.HideHeader
- inputs.forEach { taskData ->
- val result =
- TaskUiStateMapper.toTaskHeaderState(
- taskData = taskData,
- hasHeader = true,
- clickCloseListener = closeCallback,
- )
- assertThat(result).isEqualTo(expected)
- }
- }
-
- @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_EXPLODED_VIEW)
- @Test
- fun taskData_hasHeader_and_taskData_returnsShowHeader() {
- val inputs =
- listOf(
- TASK_DATA,
- TASK_DATA.copy(thumbnailData = null),
- TASK_DATA.copy(isLocked = true),
- TASK_DATA.copy(title = null),
- )
- val closeCallback = View.OnClickListener {}
- val expected =
- TaskHeaderUiState.ShowHeader(
- header =
- TaskHeaderUiState.ThumbnailHeader(
- TASK_ICON,
- TASK_TITLE_DESCRIPTION,
- closeCallback,
- )
- )
- inputs.forEach { taskData ->
- val result =
- TaskUiStateMapper.toTaskHeaderState(
- taskData = taskData,
- hasHeader = true,
- clickCloseListener = closeCallback,
- )
- assertThat(result).isEqualTo(expected)
- }
- }
-
- @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_EXPLODED_VIEW)
- @Test
- fun taskData_hasHeader_emptyTaskData_returns_HideHeader() {
- val inputs =
- listOf(
- TASK_DATA.copy(icon = null),
- TASK_DATA.copy(titleDescription = null),
- TASK_DATA.copy(icon = null, titleDescription = null),
- )
-
- inputs.forEach { taskData ->
- val result =
- TaskUiStateMapper.toTaskHeaderState(
- taskData = taskData,
- hasHeader = true,
- clickCloseListener = {},
- )
- assertThat(result).isEqualTo(TaskHeaderUiState.HideHeader)
- }
- }
-
- /** TaskThumbnailUiState */
- @Test
- fun taskData_isNull_returns_Uninitialized() {
- val result = TaskUiStateMapper.toTaskThumbnailUiState(taskData = null, isLiveTile = false)
assertThat(result).isEqualTo(TaskThumbnailUiState.Uninitialized)
}
@@ -142,20 +55,79 @@
listOf(TASK_DATA, TASK_DATA.copy(thumbnailData = null), TASK_DATA.copy(isLocked = true))
inputs.forEach { input ->
val result =
- TaskUiStateMapper.toTaskThumbnailUiState(taskData = input, isLiveTile = true)
- assertThat(result).isEqualTo(LiveTile)
+ TaskUiStateMapper.toTaskThumbnailUiState(
+ taskData = input,
+ isLiveTile = true,
+ hasHeader = false,
+ clickCloseListener = null,
+ )
+ assertThat(result).isEqualTo(LiveTile.WithoutHeader)
+ }
+ }
+
+ @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_EXPLODED_VIEW)
+ @Test
+ fun taskData_isLiveTileWithHeader_returns_LiveTileWithHeader() {
+ val inputs =
+ listOf(
+ TASK_DATA,
+ TASK_DATA.copy(thumbnailData = null),
+ TASK_DATA.copy(isLocked = true),
+ TASK_DATA.copy(title = null),
+ )
+ val closeCallback = View.OnClickListener {}
+ val expected =
+ LiveTile.WithHeader(
+ header = ThumbnailHeader(TASK_ICON, TASK_TITLE_DESCRIPTION, closeCallback)
+ )
+ inputs.forEach { taskData ->
+ val result =
+ TaskUiStateMapper.toTaskThumbnailUiState(
+ taskData = taskData,
+ isLiveTile = true,
+ hasHeader = true,
+ clickCloseListener = closeCallback,
+ )
+ assertThat(result).isEqualTo(expected)
+ }
+ }
+
+ @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_EXPLODED_VIEW)
+ @Test
+ fun taskData_isLiveTileWithHeader_missingHeaderData_returns_LiveTileWithoutHeader() {
+ val inputs =
+ listOf(
+ TASK_DATA.copy(icon = null),
+ TASK_DATA.copy(titleDescription = null),
+ TASK_DATA.copy(icon = null, titleDescription = null),
+ )
+
+ inputs.forEach { taskData ->
+ val result =
+ TaskUiStateMapper.toTaskThumbnailUiState(
+ taskData = taskData,
+ isLiveTile = true,
+ hasHeader = true,
+ clickCloseListener = {},
+ )
+ assertThat(result).isEqualTo(LiveTile.WithoutHeader)
}
}
@Test
fun taskData_isStaticTile_returns_SnapshotSplash() {
val result =
- TaskUiStateMapper.toTaskThumbnailUiState(taskData = TASK_DATA, isLiveTile = false)
+ TaskUiStateMapper.toTaskThumbnailUiState(
+ taskData = TASK_DATA,
+ isLiveTile = false,
+ hasHeader = false,
+ clickCloseListener = null,
+ )
val expected =
TaskThumbnailUiState.SnapshotSplash(
snapshot =
- Snapshot(
+ Snapshot.WithoutHeader(
backgroundColor = TASK_BACKGROUND_COLOR,
bitmap = TASK_THUMBNAIL,
thumbnailRotation = Surface.ROTATION_0,
@@ -166,12 +138,72 @@
assertThat(result).isEqualTo(expected)
}
+ @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_EXPLODED_VIEW)
+ @Test
+ fun taskData_isStaticTile_withHeader_returns_SnapshotSplashWithHeader() {
+ val inputs = listOf(TASK_DATA, TASK_DATA.copy(title = null))
+ val closeCallback = View.OnClickListener {}
+ val expected =
+ TaskThumbnailUiState.SnapshotSplash(
+ snapshot =
+ Snapshot.WithHeader(
+ backgroundColor = TASK_BACKGROUND_COLOR,
+ bitmap = TASK_THUMBNAIL,
+ thumbnailRotation = Surface.ROTATION_0,
+ header = ThumbnailHeader(TASK_ICON, TASK_TITLE_DESCRIPTION, closeCallback),
+ ),
+ splash = TASK_ICON,
+ )
+ inputs.forEach { taskData ->
+ val result =
+ TaskUiStateMapper.toTaskThumbnailUiState(
+ taskData = taskData,
+ isLiveTile = false,
+ hasHeader = true,
+ clickCloseListener = closeCallback,
+ )
+ assertThat(result).isEqualTo(expected)
+ }
+ }
+
+ @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_EXPLODED_VIEW)
+ @Test
+ fun taskData_isStaticTile_missingHeaderData_returns_SnapshotSplashWithoutHeader() {
+ val inputs =
+ listOf(
+ TASK_DATA.copy(titleDescription = null, icon = null),
+ TASK_DATA.copy(titleDescription = null),
+ TASK_DATA.copy(icon = null),
+ )
+ val expected =
+ Snapshot.WithoutHeader(
+ backgroundColor = TASK_BACKGROUND_COLOR,
+ thumbnailRotation = Surface.ROTATION_0,
+ bitmap = TASK_THUMBNAIL,
+ )
+ inputs.forEach { taskData ->
+ val result =
+ TaskUiStateMapper.toTaskThumbnailUiState(
+ taskData = taskData,
+ isLiveTile = false,
+ hasHeader = true,
+ clickCloseListener = {},
+ )
+
+ assertThat(result).isInstanceOf(TaskThumbnailUiState.SnapshotSplash::class.java)
+ result as TaskThumbnailUiState.SnapshotSplash
+ assertThat(result.snapshot).isEqualTo(expected)
+ }
+ }
+
@Test
fun taskData_thumbnailIsNull_returns_BackgroundOnly() {
val result =
TaskUiStateMapper.toTaskThumbnailUiState(
taskData = TASK_DATA.copy(thumbnailData = null),
isLiveTile = false,
+ hasHeader = false,
+ clickCloseListener = null,
)
val expected = TaskThumbnailUiState.BackgroundOnly(TASK_BACKGROUND_COLOR)
@@ -184,6 +216,8 @@
TaskUiStateMapper.toTaskThumbnailUiState(
taskData = TASK_DATA.copy(isLocked = true),
isLiveTile = false,
+ hasHeader = false,
+ clickCloseListener = null,
)
val expected = TaskThumbnailUiState.BackgroundOnly(TASK_BACKGROUND_COLOR)
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/ui/viewmodel/TaskViewModelTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/ui/viewmodel/TaskViewModelTest.kt
index 18b9fe9..333c285 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/ui/viewmodel/TaskViewModelTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/ui/viewmodel/TaskViewModelTest.kt
@@ -85,6 +85,7 @@
hasHeader = false,
sysUiStatusNavFlags = FLAGS_APPEARANCE_LIGHT_THEME,
taskOverlayEnabled = false,
+ isCentralTask = false,
)
assertThat(sut.state.first()).isEqualTo(expectedResult)
}
@@ -132,6 +133,7 @@
hasHeader = false,
sysUiStatusNavFlags = FLAGS_APPEARANCE_LIGHT_THEME,
taskOverlayEnabled = false,
+ isCentralTask = false,
)
assertThat(sut.state.first()).isEqualTo(expectedResult)
}
@@ -155,6 +157,7 @@
hasHeader = false,
sysUiStatusNavFlags = FLAGS_APPEARANCE_LIGHT_THEME,
taskOverlayEnabled = false,
+ isCentralTask = false,
)
assertThat(sut.state.first()).isEqualTo(expectedResult)
}
@@ -178,6 +181,7 @@
hasHeader = false,
sysUiStatusNavFlags = FLAGS_APPEARANCE_LIGHT_THEME,
taskOverlayEnabled = false,
+ isCentralTask = false,
)
assertThat(sut.state.first()).isEqualTo(expectedResult)
}
@@ -200,6 +204,7 @@
hasHeader = false,
sysUiStatusNavFlags = FLAGS_APPEARANCE_LIGHT_THEME,
taskOverlayEnabled = false,
+ isCentralTask = false,
)
assertThat(sut.state.first()).isEqualTo(expectedResult)
}
@@ -218,6 +223,7 @@
hasHeader = false,
sysUiStatusNavFlags = FLAGS_APPEARANCE_LIGHT_THEME,
taskOverlayEnabled = false,
+ isCentralTask = false,
)
assertThat(sut.state.first()).isEqualTo(expectedResult)
}
@@ -233,6 +239,7 @@
hasHeader = false,
sysUiStatusNavFlags = FLAGS_APPEARANCE_DEFAULT,
taskOverlayEnabled = false,
+ isCentralTask = false,
)
assertThat(sut.state.first()).isEqualTo(expectedResult)
}
@@ -248,28 +255,6 @@
}
@Test
- fun taskOverlayDisabled_when_usingGroupedTask() =
- testScope.runTest {
- sut = createTaskViewModel(TaskViewType.GROUPED)
- sut.bind(TASK_MODEL_1.id)
- recentsViewData.overlayEnabled.value = true
- recentsViewData.settledFullyVisibleTaskIds.value = setOf(1)
-
- assertThat(sut.state.first().taskOverlayEnabled).isFalse()
- }
-
- @Test
- fun taskOverlayDisabled_when_usingDesktopTask() =
- testScope.runTest {
- sut = createTaskViewModel(TaskViewType.DESKTOP)
- sut.bind(TASK_MODEL_1.id)
- recentsViewData.overlayEnabled.value = true
- recentsViewData.settledFullyVisibleTaskIds.value = setOf(1)
-
- assertThat(sut.state.first().taskOverlayEnabled).isFalse()
- }
-
- @Test
fun taskOverlayDisabled_when_OverlayIsEnabledForInvisibleTask() =
testScope.runTest {
sut.bind(TASK_MODEL_1.id)
@@ -290,6 +275,24 @@
}
@Test
+ fun isCentralTask_when_CentralTaskIdsMatchTaskIds() =
+ testScope.runTest {
+ sut.bind(TASK_MODEL_1.id, TASK_MODEL_2.id)
+ recentsViewData.centralTaskIds.value = setOf(TASK_MODEL_1.id, TASK_MODEL_2.id)
+
+ assertThat(sut.state.first().isCentralTask).isTrue()
+ }
+
+ @Test
+ fun isNotCentralTask_when_CentralTaskIdsDoMatchTaskIds() =
+ testScope.runTest {
+ sut.bind(TASK_MODEL_1.id, TASK_MODEL_2.id)
+ recentsViewData.centralTaskIds.value = setOf(TASK_MODEL_3.id)
+
+ assertThat(sut.state.first().isCentralTask).isFalse()
+ }
+
+ @Test
fun shouldShowSplash_calls_useCase() {
sut.isThumbnailValid(null, 0, 0)
verify(isThumbnailValidUseCase).invoke(anyOrNull(), anyInt(), anyInt())
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/util/AppPairsControllerTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/util/AppPairsControllerTest.kt
index 76d36d3..c325af4 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/util/AppPairsControllerTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/util/AppPairsControllerTest.kt
@@ -17,8 +17,9 @@
package com.android.quickstep.util
import android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM
-import android.content.Context
import android.content.res.Resources
+import android.view.Display
+import android.view.Display.DEFAULT_DISPLAY
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.android.launcher3.apppairs.AppPairIcon
import com.android.launcher3.logging.StatsLogManager
@@ -26,6 +27,7 @@
import com.android.launcher3.taskbar.TaskbarActivityContext
import com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_BOTTOM_OR_RIGHT
import com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_TOP_OR_LEFT
+import com.android.launcher3.views.ActivityContext
import com.android.quickstep.TopTaskTracker
import com.android.quickstep.TopTaskTracker.CachedTaskInfo
import com.android.systemui.shared.recents.model.Task
@@ -56,7 +58,7 @@
@RunWith(AndroidJUnit4::class)
class AppPairsControllerTest {
- @Mock lateinit var context: Context
+ @Mock lateinit var context: ActivityContext
@Mock lateinit var resources: Resources
@Mock lateinit var splitSelectStateController: SplitSelectStateController
@Mock lateinit var statsLogManager: StatsLogManager
@@ -83,6 +85,7 @@
}
@Mock lateinit var mockAppPairIcon: AppPairIcon
+ @Mock lateinit var mockDisplay: Display
@Mock lateinit var mockTaskbarActivityContext: TaskbarActivityContext
@Mock lateinit var mockTopTaskTracker: TopTaskTracker
@Mock lateinit var mockCachedTaskInfo: CachedTaskInfo
@@ -105,8 +108,10 @@
// Stub methods on appPairsController so that they return mocks
spyAppPairsController = spy(appPairsController)
whenever(mockAppPairIcon.context).thenReturn(mockTaskbarActivityContext)
+ whenever(mockAppPairIcon.display).thenReturn(mockDisplay)
+ whenever(mockDisplay.displayId).thenReturn(DEFAULT_DISPLAY)
doReturn(mockTopTaskTracker).whenever(spyAppPairsController).topTaskTracker
- whenever(mockTopTaskTracker.getCachedTopTask(any())).thenReturn(mockCachedTaskInfo)
+ whenever(mockTopTaskTracker.getCachedTopTask(any(), any())).thenReturn(mockCachedTaskInfo)
whenever(mockTask1.getKey()).thenReturn(mockTaskKey1)
whenever(mockTask2.getKey()).thenReturn(mockTaskKey2)
doNothing().whenever(spyAppPairsController).launchAppPair(any(), any())
diff --git a/quickstep/tests/src/com/android/launcher3/taskbar/TaskbarHoverToolTipControllerTest.java b/quickstep/tests/src/com/android/launcher3/taskbar/TaskbarHoverToolTipControllerTest.java
deleted file mode 100644
index 3f7c85c..0000000
--- a/quickstep/tests/src/com/android/launcher3/taskbar/TaskbarHoverToolTipControllerTest.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/*
- * 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.test.core.app.ApplicationProvider.getApplicationContext;
-
-import static com.android.launcher3.taskbar.TaskbarAutohideSuspendController.FLAG_AUTOHIDE_SUSPEND_HOVERING_ICONS;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.testing.AndroidTestingRunner;
-import android.testing.TestableLooper;
-import android.view.Display;
-import android.view.MotionEvent;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.launcher3.BubbleTextView;
-import com.android.launcher3.apppairs.AppPairIcon;
-import com.android.launcher3.folder.Folder;
-import com.android.launcher3.folder.FolderIcon;
-import com.android.launcher3.model.data.FolderInfo;
-import com.android.launcher3.util.ActivityContextWrapper;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.mockito.stubbing.Answer;
-
-/**
- * Tests for TaskbarHoverToolTipController.
- */
-@SmallTest
-@RunWith(AndroidTestingRunner.class)
-@TestableLooper.RunWithLooper(setAsMainLooper = true)
-public class TaskbarHoverToolTipControllerTest extends TaskbarBaseTestCase {
-
- private TaskbarHoverToolTipController mTaskbarHoverToolTipController;
- private TestableLooper mTestableLooper;
-
- @Mock private TaskbarView mTaskbarView;
- @Mock private MotionEvent mMotionEvent;
- @Mock private BubbleTextView mHoverBubbleTextView;
- @Mock private FolderIcon mHoverFolderIcon;
- @Mock private AppPairIcon mAppPairIcon;
- @Mock private Display mDisplay;
- @Mock private TaskbarDragLayer mTaskbarDragLayer;
- private Folder mSpyFolderView;
-
- @Before
- public void setup() {
- MockitoAnnotations.initMocks(this);
-
- Context context = getApplicationContext();
-
- doAnswer((Answer<Object>) invocation -> context.getSystemService(
- (String) invocation.getArgument(0)))
- .when(taskbarActivityContext).getSystemService(anyString());
- when(taskbarActivityContext.getResources()).thenReturn(context.getResources());
- when(taskbarActivityContext.getApplicationInfo()).thenReturn(
- context.getApplicationInfo());
- when(taskbarActivityContext.getDragLayer()).thenReturn(mTaskbarDragLayer);
- when(taskbarActivityContext.getMainLooper()).thenReturn(context.getMainLooper());
- when(taskbarActivityContext.getDisplay()).thenReturn(mDisplay);
- when(taskbarActivityContext.isIconAlignedWithHotseat()).thenReturn(false);
-
- when(mTaskbarDragLayer.getChildCount()).thenReturn(1);
- mSpyFolderView = spy(new Folder(new ActivityContextWrapper(context), null));
- when(mTaskbarDragLayer.getChildAt(anyInt())).thenReturn(mSpyFolderView);
- doReturn(false).when(mSpyFolderView).isOpen();
-
- when(mHoverBubbleTextView.getText()).thenReturn("tooltip");
- doAnswer((Answer<Void>) invocation -> {
- Object[] args = invocation.getArguments();
- ((int[]) args[0])[0] = 0;
- ((int[]) args[0])[1] = 0;
- return null;
- }).when(mHoverBubbleTextView).getLocationOnScreen(any(int[].class));
- when(mHoverBubbleTextView.getWidth()).thenReturn(100);
- when(mHoverBubbleTextView.getHeight()).thenReturn(100);
-
- mHoverFolderIcon.mInfo = new FolderInfo();
- mHoverFolderIcon.mInfo.title = "tooltip";
- doAnswer((Answer<Void>) invocation -> {
- Object[] args = invocation.getArguments();
- ((int[]) args[0])[0] = 0;
- ((int[]) args[0])[1] = 0;
- return null;
- }).when(mHoverFolderIcon).getLocationOnScreen(any(int[].class));
- when(mHoverFolderIcon.getWidth()).thenReturn(100);
- when(mHoverFolderIcon.getHeight()).thenReturn(100);
-
- when(mTaskbarView.getTop()).thenReturn(200);
-
- mTaskbarHoverToolTipController = new TaskbarHoverToolTipController(
- taskbarActivityContext, mTaskbarView, mHoverBubbleTextView);
- mTestableLooper = TestableLooper.get(this);
- }
-
- @Test
- public void onHover_hoverEnterIcon_revealToolTip() {
- when(mMotionEvent.getAction()).thenReturn(MotionEvent.ACTION_HOVER_ENTER);
- when(mMotionEvent.getActionMasked()).thenReturn(MotionEvent.ACTION_HOVER_ENTER);
-
- boolean hoverConsumed =
- mTaskbarHoverToolTipController.onHover(mHoverBubbleTextView, mMotionEvent);
- waitForIdleSync();
-
- assertThat(hoverConsumed).isFalse();
- verify(taskbarActivityContext).setAutohideSuspendFlag(FLAG_AUTOHIDE_SUSPEND_HOVERING_ICONS,
- true);
- }
-
- @Test
- public void onHover_hoverExitIcon_closeToolTip() {
- when(mMotionEvent.getAction()).thenReturn(MotionEvent.ACTION_HOVER_EXIT);
- when(mMotionEvent.getActionMasked()).thenReturn(MotionEvent.ACTION_HOVER_EXIT);
-
- boolean hoverConsumed =
- mTaskbarHoverToolTipController.onHover(mHoverBubbleTextView, mMotionEvent);
- waitForIdleSync();
-
- assertThat(hoverConsumed).isFalse();
- verify(taskbarActivityContext).setAutohideSuspendFlag(FLAG_AUTOHIDE_SUSPEND_HOVERING_ICONS,
- false);
- }
-
- @Test
- public void onHover_hoverEnterFolderIcon_revealToolTip() {
- when(mMotionEvent.getAction()).thenReturn(MotionEvent.ACTION_HOVER_ENTER);
- when(mMotionEvent.getActionMasked()).thenReturn(MotionEvent.ACTION_HOVER_ENTER);
-
- boolean hoverConsumed =
- mTaskbarHoverToolTipController.onHover(mHoverFolderIcon, mMotionEvent);
- waitForIdleSync();
-
- assertThat(hoverConsumed).isFalse();
- verify(taskbarActivityContext).setAutohideSuspendFlag(FLAG_AUTOHIDE_SUSPEND_HOVERING_ICONS,
- true);
- }
-
- @Test
- public void onHover_hoverExitFolderIcon_closeToolTip() {
- when(mMotionEvent.getAction()).thenReturn(MotionEvent.ACTION_HOVER_EXIT);
- when(mMotionEvent.getActionMasked()).thenReturn(MotionEvent.ACTION_HOVER_EXIT);
-
- boolean hoverConsumed =
- mTaskbarHoverToolTipController.onHover(mHoverFolderIcon, mMotionEvent);
- waitForIdleSync();
-
- assertThat(hoverConsumed).isFalse();
- verify(taskbarActivityContext).setAutohideSuspendFlag(FLAG_AUTOHIDE_SUSPEND_HOVERING_ICONS,
- false);
- }
-
- @Test
- public void onHover_hoverExitFolderOpen_closeToolTip() {
- when(mMotionEvent.getAction()).thenReturn(MotionEvent.ACTION_HOVER_EXIT);
- when(mMotionEvent.getActionMasked()).thenReturn(MotionEvent.ACTION_HOVER_EXIT);
- doReturn(true).when(mSpyFolderView).isOpen();
-
- boolean hoverConsumed =
- mTaskbarHoverToolTipController.onHover(mHoverFolderIcon, mMotionEvent);
- waitForIdleSync();
-
- assertThat(hoverConsumed).isFalse();
- verify(taskbarActivityContext).setAutohideSuspendFlag(FLAG_AUTOHIDE_SUSPEND_HOVERING_ICONS,
- false);
- }
-
- @Test
- public void onHover_hoverEnterFolderOpen_noToolTip() {
- when(mMotionEvent.getAction()).thenReturn(MotionEvent.ACTION_HOVER_ENTER);
- when(mMotionEvent.getActionMasked()).thenReturn(MotionEvent.ACTION_HOVER_ENTER);
- doReturn(true).when(mSpyFolderView).isOpen();
-
- boolean hoverConsumed =
- mTaskbarHoverToolTipController.onHover(mHoverFolderIcon, mMotionEvent);
-
- assertThat(hoverConsumed).isFalse();
- }
-
- @Test
- public void onHover_hoverMove_noUpdate() {
- when(mMotionEvent.getAction()).thenReturn(MotionEvent.ACTION_HOVER_MOVE);
- when(mMotionEvent.getActionMasked()).thenReturn(MotionEvent.ACTION_HOVER_MOVE);
-
- boolean hoverConsumed =
- mTaskbarHoverToolTipController.onHover(mHoverFolderIcon, mMotionEvent);
-
- assertThat(hoverConsumed).isFalse();
- }
-
- @Test
- public void onHover_hoverEnterAppPair_revealToolTip() {
- when(mMotionEvent.getAction()).thenReturn(MotionEvent.ACTION_HOVER_ENTER);
- when(mMotionEvent.getActionMasked()).thenReturn(MotionEvent.ACTION_HOVER_ENTER);
-
- boolean hoverConsumed =
- mTaskbarHoverToolTipController.onHover(mAppPairIcon, mMotionEvent);
- waitForIdleSync();
-
- assertThat(hoverConsumed).isFalse();
- verify(taskbarActivityContext).setAutohideSuspendFlag(FLAG_AUTOHIDE_SUSPEND_HOVERING_ICONS,
- true);
- }
-
- @Test
- public void onHover_hoverExitAppPair_closeToolTip() {
- when(mMotionEvent.getAction()).thenReturn(MotionEvent.ACTION_HOVER_EXIT);
- when(mMotionEvent.getActionMasked()).thenReturn(MotionEvent.ACTION_HOVER_EXIT);
-
- boolean hoverConsumed =
- mTaskbarHoverToolTipController.onHover(mAppPairIcon, mMotionEvent);
- waitForIdleSync();
-
- assertThat(hoverConsumed).isFalse();
- verify(taskbarActivityContext).setAutohideSuspendFlag(FLAG_AUTOHIDE_SUSPEND_HOVERING_ICONS,
- false);
- }
-
- @Test
- public void onHover_hoverEnterIconAlignedWithHotseat_noReveal() {
- when(mMotionEvent.getAction()).thenReturn(MotionEvent.ACTION_HOVER_ENTER);
- when(mMotionEvent.getActionMasked()).thenReturn(MotionEvent.ACTION_HOVER_ENTER);
- when(taskbarActivityContext.isIconAlignedWithHotseat()).thenReturn(true);
-
- boolean hoverConsumed =
- mTaskbarHoverToolTipController.onHover(mHoverBubbleTextView, mMotionEvent);
- waitForIdleSync();
-
- assertThat(hoverConsumed).isFalse();
- verify(taskbarActivityContext).setAutohideSuspendFlag(FLAG_AUTOHIDE_SUSPEND_HOVERING_ICONS,
- true);
- }
-
- private void waitForIdleSync() {
- mTestableLooper.processAllMessages();
- }
-}
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimatorTest.kt b/quickstep/tests/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimatorTest.kt
similarity index 97%
rename from quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimatorTest.kt
rename to quickstep/tests/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimatorTest.kt
index 61a6975..8f26795 100644
--- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimatorTest.kt
+++ b/quickstep/tests/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimatorTest.kt
@@ -316,43 +316,6 @@
}
@Test
- fun animateBubbleInForStashed_showAnimationCanceled() {
- setUpBubbleBar()
-
- val handle = View(context)
- val handleAnimator = PhysicsAnimator.getInstance(handle)
- bubbleStashController.handleAnimator = handleAnimator
-
- val animator =
- BubbleBarViewAnimator(
- bubbleBarView,
- bubbleStashController,
- flyoutController,
- bubbleBarParentViewController,
- onExpanded = emptyRunnable,
- onBubbleBarVisible = emptyRunnable,
- animatorScheduler,
- )
-
- InstrumentationRegistry.getInstrumentation().runOnMainSync {
- animator.animateBubbleInForStashed(bubble, isExpanding = false)
- }
-
- // wait for the animation to start
- InstrumentationRegistry.getInstrumentation().runOnMainSync {}
- PhysicsAnimatorTestUtils.blockUntilFirstAnimationFrameWhereTrue(handleAnimator) { true }
-
- handleAnimator.assertIsRunning()
- assertThat(animator.isAnimating).isTrue()
- assertThat(animatorScheduler.delayedBlock).isNotNull()
-
- handleAnimator.cancel()
- handleAnimator.assertIsNotRunning()
- assertThat(animator.isAnimating).isFalse()
- assertThat(animatorScheduler.delayedBlock).isNull()
- }
-
- @Test
fun animateBubbleInForStashed_autoExpanding() {
setUpBubbleBar()
diff --git a/quickstep/tests/src/com/android/quickstep/DesktopSystemShortcutTest.kt b/quickstep/tests/src/com/android/quickstep/DesktopSystemShortcutTest.kt
index 746f8bb..5f61ba2 100644
--- a/quickstep/tests/src/com/android/quickstep/DesktopSystemShortcutTest.kt
+++ b/quickstep/tests/src/com/android/quickstep/DesktopSystemShortcutTest.kt
@@ -37,7 +37,6 @@
import com.android.launcher3.util.SplitConfigurationOptions
import com.android.launcher3.util.TransformingTouchDelegate
import com.android.quickstep.TaskOverlayFactory.TaskOverlay
-import com.android.quickstep.task.thumbnail.TaskContentView
import com.android.quickstep.task.thumbnail.TaskThumbnailView
import com.android.quickstep.views.LauncherRecentsView
import com.android.quickstep.views.RecentsViewContainer
@@ -254,7 +253,6 @@
TaskContainer(
taskView,
task,
- mock<TaskContentView>(),
if (enableRefactorTaskThumbnail()) mock<TaskThumbnailView>()
else mock<TaskThumbnailViewDeprecated>(),
mock<TaskViewIcon>(),
diff --git a/quickstep/tests/src/com/android/quickstep/ExternalDisplaySystemShortcutTest.kt b/quickstep/tests/src/com/android/quickstep/ExternalDisplaySystemShortcutTest.kt
index 5aaed7d..2db94f6 100644
--- a/quickstep/tests/src/com/android/quickstep/ExternalDisplaySystemShortcutTest.kt
+++ b/quickstep/tests/src/com/android/quickstep/ExternalDisplaySystemShortcutTest.kt
@@ -37,7 +37,6 @@
import com.android.launcher3.util.SplitConfigurationOptions
import com.android.launcher3.util.TransformingTouchDelegate
import com.android.quickstep.TaskOverlayFactory.TaskOverlay
-import com.android.quickstep.task.thumbnail.TaskContentView
import com.android.quickstep.task.thumbnail.TaskThumbnailView
import com.android.quickstep.views.LauncherRecentsView
import com.android.quickstep.views.RecentsViewContainer
@@ -247,7 +246,6 @@
TaskContainer(
taskView,
task,
- mock<TaskContentView>(),
if (enableRefactorTaskThumbnail()) mock<TaskThumbnailView>()
else mock<TaskThumbnailViewDeprecated>(),
mock<TaskViewIcon>(),
diff --git a/quickstep/tests/src/com/android/quickstep/InputConsumerUtilsTest.java b/quickstep/tests/src/com/android/quickstep/InputConsumerUtilsTest.java
index 93b979c..1464ca8 100644
--- a/quickstep/tests/src/com/android/quickstep/InputConsumerUtilsTest.java
+++ b/quickstep/tests/src/com/android/quickstep/InputConsumerUtilsTest.java
@@ -293,7 +293,7 @@
@Test
public void testNewBaseConsumer_launcherChildActivityResumed_returnsDefaultInputConsumer() {
when(mRunningTask.isHomeTask()).thenReturn(true);
- when(mOverviewComponentObserver.isHomeAndOverviewSame()).thenReturn(true);
+ when(mOverviewComponentObserver.isHomeAndOverviewSameActivity()).thenReturn(true);
assertEqualsDefaultInputConsumer(this::createBaseInputConsumer);
}
diff --git a/res/drawable/ic_split_horizontal.xml b/res/drawable/ic_split_horizontal.xml
index 2efd2b9..26efedc 100644
--- a/res/drawable/ic_split_horizontal.xml
+++ b/res/drawable/ic_split_horizontal.xml
@@ -1,9 +1,25 @@
+<!--
+ ~ Copyright (C) 2025 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24"
- android:viewportHeight="24">
- <path
- android:pathData="M4,6L9,6L9,18L4,18L4,6ZM2,6L2,18C2,19.1 2.9,20 4,20L9,20C10.1,20 11,19.1 11,18L11,6C11,4.9 10.1,4 9,4L4,4C2.9,4 2,4.9 2,6ZM15,6L20,6L20,18L15,18L15,6ZM13,6L13,18C13,19.1 13.9,20 15,20L20,20C21.1,20 22,19.1 22,18L22,6C22,4.9 21.1,4 20,4L15,4C13.9,4 13,4.9 13,6Z"
- android:fillColor="#000000"/>
+ android:width="20dp"
+ android:height="20dp"
+ android:tint="?attr/colorControlNormal"
+ android:viewportHeight="960"
+ android:viewportWidth="960">
+ <path
+ android:fillColor="@android:color/white"
+ android:pathData="M552,624L684,624Q699.3,624 709.65,613.66Q720,603.32 720,588.04L720,372.28Q720,357 709.65,346.5Q699.3,336 684,336L552,336Q536.7,336 526.35,346.34Q516,356.68 516,371.96L516,587.72Q516,603 526.35,613.5Q536.7,624 552,624ZM276,624L408,624Q423.3,624 433.65,613.66Q444,603.32 444,588.04L444,372.28Q444,357 433.65,346.5Q423.3,336 408,336L276,336Q260.7,336 250.35,346.34Q240,356.68 240,371.96L240,587.72Q240,603 250.35,613.5Q260.7,624 276,624ZM168,768Q138.3,768 117.15,746.84Q96,725.68 96,695.96L96,263.72Q96,234 117.15,213Q138.3,192 168,192L792,192Q821.7,192 842.85,213.16Q864,234.32 864,264.04L864,696.28Q864,726 842.85,747Q821.7,768 792,768L168,768ZM792,264L168,264Q168,264 168,264Q168,264 168,264L168,696Q168,696 168,696Q168,696 168,696L792,696Q792,696 792,696Q792,696 792,696L792,264Q792,264 792,264Q792,264 792,264ZM168,264Q168,264 168,264Q168,264 168,264L168,696Q168,696 168,696Q168,696 168,696L168,696Q168,696 168,696Q168,696 168,696L168,264Q168,264 168,264Q168,264 168,264Z" />
</vector>
diff --git a/res/drawable/ic_split_vertical.xml b/res/drawable/ic_split_vertical.xml
index 9bc9785..787953a 100644
--- a/res/drawable/ic_split_vertical.xml
+++ b/res/drawable/ic_split_vertical.xml
@@ -1,9 +1,25 @@
+<!--
+ ~ Copyright (C) 2025 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24"
- android:viewportHeight="24">
- <path
- android:pathData="M18,4V9H6V4H18ZM18,2H6C4.9,2 4,2.9 4,4V9C4,10.1 4.9,11 6,11H18C19.1,11 20,10.1 20,9V4C20,2.9 19.1,2 18,2ZM18,15V20H6V15H18ZM18,13H6C4.9,13 4,13.9 4,15V20C4,21.1 4.9,22 6,22H18C19.1,22 20,21.1 20,20V15C20,13.9 19.1,13 18,13Z"
- android:fillColor="#000000"/>
+ android:width="20dp"
+ android:height="20dp"
+ android:tint="?attr/colorControlNormal"
+ android:viewportHeight="960"
+ android:viewportWidth="960">
+ <path
+ android:fillColor="@android:color/white"
+ android:pathData="M371.96,720L587.72,720Q603,720 613.5,709.65Q624,699.3 624,684L624,552Q624,536.7 613.66,526.35Q603.32,516 588.04,516L372.28,516Q357,516 346.5,526.35Q336,536.7 336,552L336,684Q336,699.3 346.34,709.65Q356.68,720 371.96,720ZM371.96,444L587.72,444Q603,444 613.5,433.65Q624,423.3 624,408L624,276Q624,260.7 613.66,250.35Q603.32,240 588.04,240L372.28,240Q357,240 346.5,250.35Q336,260.7 336,276L336,408Q336,423.3 346.34,433.65Q356.68,444 371.96,444ZM768,792Q768,821.7 746.84,842.85Q725.68,864 695.96,864L263.72,864Q234,864 213,842.85Q192,821.7 192,792L192,168Q192,138.3 213.16,117.15Q234.32,96 264.04,96L696.28,96Q726,96 747,117.15Q768,138.3 768,168L768,792ZM696,792L696,168Q696,168 696,168Q696,168 696,168L264,168Q264,168 264,168Q264,168 264,168L264,792Q264,792 264,792Q264,792 264,792L696,792Q696,792 696,792Q696,792 696,792ZM696,168Q696,168 696,168Q696,168 696,168L264,168Q264,168 264,168Q264,168 264,168L264,168Q264,168 264,168Q264,168 264,168L696,168Q696,168 696,168Q696,168 696,168Z" />
</vector>
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 4133419..962a018 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Muurpapier en styl"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Wysig tuisskerm"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Tuis-instellings"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Apps"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Gedeaktiveer deur jou administrateur"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Laat toe dat tuisskerm gedraai word"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Wanneer foon gedraai word"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Verminder hoogte"</string>
<string name="widget_resized" msgid="9130327887929620">"Legstukgrootte is verander na breedte <xliff:g id="NUMBER_0">%1$s</xliff:g> hoogte <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Kortpadkieslys"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Verander grootte van legstukraam vir <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Maak toe"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Maak toe"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Maak toe"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Persoonlik"</string>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index 4cb4e1a..1fbff54 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"ልጣፍ እና ቅጥ"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"መነሻ ማያ ገጽን አርትዕ"</string>
<string name="settings_button_text" msgid="8873672322605444408">"የመነሻ ቅንብሮች"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"መተግበሪያዎች"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"በእርስዎ አስተዳዳሪ የተሰናከለ"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"የመነሻ ማያ ገፅ ማሽከርከርን ይፍቀዱ"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"ስልኩ ሲዞር"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"ቁመት ይቀንሱ"</string>
<string name="widget_resized" msgid="9130327887929620">"የመግብር መጠን ወደ ስፋት <xliff:g id="NUMBER_0">%1$s</xliff:g> ቁመት <xliff:g id="NUMBER_1">%2$s</xliff:g> ተለውጧል"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"የአቋራጭ ምናሌ"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"ለ<xliff:g id="STRING">%1$s</xliff:g> የሚሆን የምግብር መጠን መቀይር ክፍለ ገጸ ድር"</string>
+ <string name="action_close" msgid="1077760267194136901">"ዝጋ"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"አሰናብት"</string>
<string name="accessibility_close" msgid="2277148124685870734">"ዝጋ"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"የግል"</string>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 3961d11..bd49e08 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"الخلفية والأسلوب"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"تعديل الشاشة الرئيسية"</string>
<string name="settings_button_text" msgid="8873672322605444408">"إعدادات الشاشة الرئيسية"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"التطبيقات"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"أوقف المشرف هذه الميزة"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"السماح بتدوير الشاشة الرئيسية"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"عند تدوير الهاتف"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"تقليل الارتفاع"</string>
<string name="widget_resized" msgid="9130327887929620">"تم تغيير حجم التطبيق المصغَّر إلى العرض <xliff:g id="NUMBER_0">%1$s</xliff:g> والارتفاع <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"قائمة الاختصارات"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"تغيير حجم إطار تطبيق \"<xliff:g id="STRING">%1$s</xliff:g>\" المصغّر"</string>
+ <string name="action_close" msgid="1077760267194136901">"إغلاق"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"تجاهل"</string>
<string name="accessibility_close" msgid="2277148124685870734">"إغلاق"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"شخصية"</string>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"النقل إلى المساحة الخاصة"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"تثبيت"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"تثبيت التطبيقات في المساحة الخاصّة"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"إضافة ملفات والمزيد إلى \"المساحة الخاصّة\""</string>
</resources>
diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml
index b1b4113..87301ff 100644
--- a/res/values-as/strings.xml
+++ b/res/values-as/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"ৱালপেপাৰ আৰু শৈলী"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"গৃহ স্ক্ৰীন সম্পাদনা কৰক"</string>
<string name="settings_button_text" msgid="8873672322605444408">"গৃহ ছেটিং"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"এপ্"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"আপোনাৰ প্ৰশাসকে অক্ষম কৰি ৰাখিছে"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"গৃহ স্ক্ৰীন ঘূৰোৱাৰ অনুমতি দিয়ক"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"ফ\'নটো যেতিয়া ঘূৰোৱা হয়"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"উচ্চতা হ্ৰাস কৰক"</string>
<string name="widget_resized" msgid="9130327887929620">"ৱিজেটৰ আকাৰ সলনি কৰি প্ৰস্থ <xliff:g id="NUMBER_0">%1$s</xliff:g> আৰু উচ্চতা <xliff:g id="NUMBER_1">%2$s</xliff:g> কৰা হ’ল"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"শ্বৰ্টকাটৰ মেনু"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g>ৰ বাবে ৱিজেটৰ আকাৰ সলনি কৰা ফ্রে’ম"</string>
+ <string name="action_close" msgid="1077760267194136901">"বন্ধ কৰক"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"অগ্ৰাহ্য কৰক"</string>
<string name="accessibility_close" msgid="2277148124685870734">"বন্ধ কৰক"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"ব্যক্তিগত"</string>
diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml
index 061b621..b378302 100644
--- a/res/values-az/strings.xml
+++ b/res/values-az/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Divar kağızı və üslub"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Əsas ekranı redaktə edin"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Home ayarları"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Tətbiqlər"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Admininiz tərəfindən deaktiv edilib"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Əsas ekran çevrilsin"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Telefon çevrilən zaman"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Hündürlüyü azaldın"</string>
<string name="widget_resized" msgid="9130327887929620">"Vidcetin eni <xliff:g id="NUMBER_0">%1$s</xliff:g> hündürlüyü <xliff:g id="NUMBER_1">%2$s</xliff:g> kimi ölçüləndirildi"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Qısayol menyusu"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g> üçün vidcet ölçüsünü dəyişdirmə çərçivəsi"</string>
+ <string name="action_close" msgid="1077760267194136901">"Bağlayın"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Rədd edin"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Bağlayın"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Şəxsi"</string>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Şəxsi məkana keçid"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Quraşdırın"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Tətbiqləri şəxsi sahədə quraşdırın"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Private Space-ə fayllar və s. əlavə edin"</string>
</resources>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index b53224a..de03de5 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Pozadina i stil"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Izmeni početni ekran"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Podešavanja početnog ekrana"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Aplikacije"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Administrator je onemogućio"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Dozvoli rotaciju početnog ekrana"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Kada se telefon rotira"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Smanji visinu"</string>
<string name="widget_resized" msgid="9130327887929620">"Veličina vidžeta je promenjena na širinu <xliff:g id="NUMBER_0">%1$s</xliff:g> i visinu <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Meni sa prečicama"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Promena veličine okvira vidžeta za: <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Zatvorite"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Odbaci"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Zatvori"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Lično"</string>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Prenos privatnog prostora"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Instalirajte"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Instaliraj aplikacije u privatan prostor"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Dodajte fajlove i drugo u privatan prostor"</string>
</resources>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index b12eb23..a0ff53c 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Шпалеры і стыль"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Змяніць Галоўны экран"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Налады галоўнага экрана"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Праграмы"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Адключаная адміністратарам"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Дазволіць паварот галоўнага экрана"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Пры павароце тэлефона"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Паменшыць вышыню"</string>
<string name="widget_resized" msgid="9130327887929620">"Памеры віджэта зменены на: шырыня <xliff:g id="NUMBER_0">%1$s</xliff:g>, вышыня <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Меню спалучэнняў клавіш"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Рамка змянення памеру для віджэта \"<xliff:g id="STRING">%1$s</xliff:g>\""</string>
+ <string name="action_close" msgid="1077760267194136901">"Закрыць"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Адхіліць"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Закрыць"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Асабістыя"</string>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Пераход у прыватную вобласць"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Усталяваць"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Усталяваць праграмы ў прыватнай прасторы"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Дадавайце файлы і іншае змесціва ў прыватную прастору"</string>
</resources>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index ee4dabc..60624a2 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Тапет и стил"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Редактиране на началния екран"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Настройки за началния екран"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Приложения"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Деактивирано от администратора ви"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Разрешаване на завъртането на началния екран"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"При завъртане на телефона"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Намаляване на височината"</string>
<string name="widget_resized" msgid="9130327887929620">"Приспособлението е преоразмерено към ширина <xliff:g id="NUMBER_0">%1$s</xliff:g> и височина <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Меню за клавишните комбинации"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Рамка за преоразмеряване на приспособлението за <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Затваряне"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Отхвърляне"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Затваряне"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Лични"</string>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Преминаване към частното пространство"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Инсталиране"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Инсталиране на приложения в частно пространство"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Добавяне на файлове и др. в частно пространство"</string>
</resources>
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
index a889a94..f7c68d5 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"ওয়ালপেপার এবং স্টাইল"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"হোম স্ক্রিন এডিট করুন"</string>
<string name="settings_button_text" msgid="8873672322605444408">"হোম সেটিংস"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"অ্যাপ"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"আপনার প্রশাসক দ্বারা অক্ষম করা হয়েছে"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"হোম স্ক্রিন রোটেট করার অনুমতি দিন"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"যখন ফোনটি ঘোরানো হয়"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"উচ্চতা কমান"</string>
<string name="widget_resized" msgid="9130327887929620">"উইজেটের আকার প্রস্থ <xliff:g id="NUMBER_0">%1$s</xliff:g> উচ্চতা <xliff:g id="NUMBER_1">%2$s</xliff:g> তে পরিবর্তন করা হয়েছে"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"শর্টকাট মেনু"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g>-এর জন্য উইজেট ছোট বড় করার ফ্রেম"</string>
+ <string name="action_close" msgid="1077760267194136901">"বন্ধ করুন"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"খারিজ করুন"</string>
<string name="accessibility_close" msgid="2277148124685870734">"বন্ধ করুন"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"ব্যক্তিগত"</string>
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
index 4308879..96d567c 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Pozadinska slika i stil"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Uredi Početni ekran"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Postavke početnog ekrana"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Aplikacije"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Onemogućio vaš administrator"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Dozvoli rotiranje početnog ekrana"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Kada se telefon zarotira"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Smanji visinu"</string>
<string name="widget_resized" msgid="9130327887929620">"Veličina vidžeta je promijenjena na širinu <xliff:g id="NUMBER_0">%1$s</xliff:g> visinu <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Meni prečica"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Promjena veličine okvira vidžeta za aplikaciju <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Zatvaranje"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Odbaci"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Zatvaranje"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Lično"</string>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 434117b..839c681 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Estil i fons de pantalla"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Edita la pantalla d\'inici"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Configuració de la pantalla d\'inici"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Aplicacions"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Desactivada per l\'administrador"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Permet la rotació de la pantalla d\'inici"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"En girar el telèfon"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Redueix l\'alçada"</string>
<string name="widget_resized" msgid="9130327887929620">"S\'ha canviat la mida del widget a l\'amplada <xliff:g id="NUMBER_0">%1$s</xliff:g> i l\'alçada <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Menú de dreceres"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Marc de canvi de mida del widget per a <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Tanca"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Ignora"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Tanca"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personal"</string>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index bc73d08..e297418 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Tapety a styl"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Upravit plochu"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Nastavení plochy"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Aplikace"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Zakázáno administrátorem"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Povolit otáčení plochy"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Při otočení telefonu"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Snížit výšku"</string>
<string name="widget_resized" msgid="9130327887929620">"Velikost widgetu upravena: šířka <xliff:g id="NUMBER_0">%1$s</xliff:g>, výška <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Nabídka zkratek"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Rámec widgetu pro změnu velikosti pro <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Zavřít"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Zavřít"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Zavřít"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Osobní"</string>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 0a2f74f..9691fb0 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Baggrund og stil"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Rediger startskærm"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Indst. for startskærm"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Apps"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Deaktiveret af din administrator"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Tillad rotation af startskærmen"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Når telefonen roteres"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Reducer højden"</string>
<string name="widget_resized" msgid="9130327887929620">"Størrelsen for widgetten er ændret til bredde <xliff:g id="NUMBER_0">%1$s</xliff:g> og højde <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Genvejsmenu"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Widget til at tilpasse størrelsen på rammen for <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Luk"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Afvis"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Luk"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personlig"</string>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 69e1d90..fc390f6 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Hintergrund & Stil"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Startbildschirm bearbeiten"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Einstellungen"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Apps"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Von deinem Administrator deaktiviert"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Drehen des Startbildschirms zulassen"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Beim Drehen des Smartphones"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Höhe verringern"</string>
<string name="widget_resized" msgid="9130327887929620">"Größe des Widgets zu Breite <xliff:g id="NUMBER_0">%1$s</xliff:g> und Höhe <xliff:g id="NUMBER_1">%2$s</xliff:g> geändert"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Menü für Tastenkombinationen"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Frame „Widget-Größe anpassen“ für <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Schließen"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Schließen"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Schließen"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Privat"</string>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index aaa575c..eff7d24 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Ταπετσαρία και στιλ"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Επεξεργασία αρχικής οθόνης"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Ρυθμ. Αρχικής οθόνης"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Εφαρμογές"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Απενεργοποιήθηκε από τον διαχειριστή σας"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Να επιτρέπεται η περιστροφή της αρχικής οθόνης"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Όταν το τηλέφωνο περιστρέφεται"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Μείωση του ύψους"</string>
<string name="widget_resized" msgid="9130327887929620">"Έγινε προσαρμογή του μεγέθους του γραφικού στοιχείου σε <xliff:g id="NUMBER_0">%1$s</xliff:g> πλάτος και <xliff:g id="NUMBER_1">%2$s</xliff:g> ύψος"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Μενού συντομεύσεων"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Πλαίσιο αλλαγής μεγέθους γραφικού στοιχείου για <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Κλείσιμο"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Παράβλεψη"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Κλείσιμο"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Προσωπικές"</string>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Μετάβαση στον Ιδιωτικό χώρο"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Εγκατάσταση"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Εγκατάσταση εφαρμογών στον ιδιωτικό χώρο"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Προσθέστε αρχεία και άλλα στοιχεία στον Ιδιωτικό χώρο"</string>
</resources>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index db602e7..46a9a35 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Wallpaper and style"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Edit home screen"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Home settings"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Apps"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Disabled by your admin"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Allow home screen rotation"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"When phone is rotated"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Decrease height"</string>
<string name="widget_resized" msgid="9130327887929620">"Widget re-sized to width <xliff:g id="NUMBER_0">%1$s</xliff:g> height <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Shortcut menu"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Widget resize frame for <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Close"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Dismiss"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Close"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personal"</string>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index db602e7..46a9a35 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Wallpaper and style"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Edit home screen"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Home settings"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Apps"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Disabled by your admin"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Allow home screen rotation"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"When phone is rotated"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Decrease height"</string>
<string name="widget_resized" msgid="9130327887929620">"Widget re-sized to width <xliff:g id="NUMBER_0">%1$s</xliff:g> height <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Shortcut menu"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Widget resize frame for <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Close"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Dismiss"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Close"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personal"</string>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index db602e7..46a9a35 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Wallpaper and style"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Edit home screen"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Home settings"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Apps"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Disabled by your admin"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Allow home screen rotation"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"When phone is rotated"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Decrease height"</string>
<string name="widget_resized" msgid="9130327887929620">"Widget re-sized to width <xliff:g id="NUMBER_0">%1$s</xliff:g> height <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Shortcut menu"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Widget resize frame for <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Close"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Dismiss"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Close"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personal"</string>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 6dd87e1..d5476ca 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -33,7 +33,7 @@
<string name="split_app_usage_settings" msgid="7214375263347964093">"Configuración del uso de %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Ventana nueva"</string>
<string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Administrar ventanas"</string>
- <string name="save_app_pair" msgid="5647523853662686243">"Guardar vinculación"</string>
+ <string name="save_app_pair" msgid="5647523853662686243">"Guardar grupo de apps"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"No se admite esta vinculación de apps en este dispositivo"</string>
<string name="app_pair_needs_unfold" msgid="4588897528143807002">"Abre el dispositivo para usar esta vinculación de apps"</string>
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Fondo de pantalla y estilo"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Editar pantalla principal"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Configuración de pantalla principal"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Apps"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"El administrador inhabilitó esta función"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Permitir la rotación de la pantalla principal"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Al girar el teléfono"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Reducir la altura"</string>
<string name="widget_resized" msgid="9130327887929620">"Se cambió la dimensión del widget a <xliff:g id="NUMBER_0">%1$s</xliff:g> de ancho y <xliff:g id="NUMBER_1">%2$s</xliff:g> de alto."</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Menú de accesos directos"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Marco de cambio de tamaño del widget para <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Cerrar"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Descartar"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Cerrar"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personal"</string>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index c604da7..7e8ff04 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Fondo de pantalla y estilo"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Editar pantalla de inicio"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Ajustes de la pantalla de inicio"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Aplicaciones"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Inhabilitado por el administrador"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Permitir rotación de la pantalla de inicio"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Al girar el teléfono"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Reducir altura"</string>
<string name="widget_resized" msgid="9130327887929620">"Se ha modificado el tamaño del widget a <xliff:g id="NUMBER_0">%1$s</xliff:g> de ancho y <xliff:g id="NUMBER_1">%2$s</xliff:g> de alto"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Menú de combinaciones de teclas"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Marco de cambio de tamaño del widget de <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Cerrar"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Cerrar"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Cerrar"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personal"</string>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index 3d270c9..3a4b3e2 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Taustapilt ja stiil"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Muuda avaekraani"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Avakuva seaded"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Rakendused"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Keelas administraator"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Luba avakuva pööramine"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Kui telefoni pööratakse"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Vähenda kõrgust"</string>
<string name="widget_resized" msgid="9130327887929620">"Vidina suurust muudeti. Laius: <xliff:g id="NUMBER_0">%1$s</xliff:g>. Kõrgus: <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Kiirmenüü"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Vidina <xliff:g id="STRING">%1$s</xliff:g> suuruse muutmise raam"</string>
+ <string name="action_close" msgid="1077760267194136901">"Sule"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Loobu"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Sule"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Isiklik"</string>
diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml
index 07a75a1..8a84353 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Horma-papera eta estiloa"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Editatu orri nagusia"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Orri nagusiaren ezarpenak"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Aplikazioak"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Administratzaileak desgaitu du"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Eman orri nagusia biratzeko baimena"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Telefonoa biratzean"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Txikitu altuera"</string>
<string name="widget_resized" msgid="9130327887929620">"Aldatu da widgetaren tamaina. Zabalera: <xliff:g id="NUMBER_0">%1$s</xliff:g>. Altuera: <xliff:g id="NUMBER_1">%2$s</xliff:g>."</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Lasterbideen menua"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g> aplikazioaren widgetaren tamaina aldatzeko markoa"</string>
+ <string name="action_close" msgid="1077760267194136901">"Itxi"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Baztertu"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Itxi"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Pertsonalak"</string>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 4afde8a..6e6a1c0 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"کاغذدیواری و سبک"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"ویرایش «صفحه اصلی»"</string>
<string name="settings_button_text" msgid="8873672322605444408">"تنظیمات صفحه اصلی"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"برنامهها"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"توسط سرپرست سیستم غیرفعال شده است"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"مجاز کردن چرخش صفحه اصلی"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"وقتی تلفن چرخانده میشود"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"کاهش ارتفاع"</string>
<string name="widget_resized" msgid="9130327887929620">"اندازه ابزاره به عرض <xliff:g id="NUMBER_0">%1$s</xliff:g> ارتفاع <xliff:g id="NUMBER_1">%2$s</xliff:g> تغییر کرد"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"منو میانبر"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"قاب تغییر اندازه ابزاره برای <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"بستن"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"رد کردن"</string>
<string name="accessibility_close" msgid="2277148124685870734">"بستن"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"شخصی"</string>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"انتقال «فضای خصوصی»"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"نصب"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"نصب برنامهها در «فضای خصوصی»"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"افزودن فایلها و موارد دیگر به «فضای خصوصی»"</string>
</resources>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 8a0de4c..ff27a1b 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Taustakuva ja tyyli"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Muokkaa aloitusnäyttöä"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Aloitusnäyttö"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Sovellukset"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Järjestelmänvalvoja on poistanut toiminnon käytöstä."</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Salli aloitusnäytön kiertäminen"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Kun puhelinta kierretään"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Vähennä korkeutta"</string>
<string name="widget_resized" msgid="9130327887929620">"Widgetin kokoa muutettiin. Sen leveys on nyt <xliff:g id="NUMBER_0">%1$s</xliff:g> ja korkeus <xliff:g id="NUMBER_1">%2$s</xliff:g>."</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Pikanäppäinvalikko"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Widgetin koon muuttaminen (<xliff:g id="STRING">%1$s</xliff:g>)"</string>
+ <string name="action_close" msgid="1077760267194136901">"Sulje"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Hylkää"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Sulje"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Henkilökohtaiset"</string>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 159d980..f9b851c 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Fond d\'écran et style"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Modifier l\'écran d\'accueil"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Paramètres d\'accueil"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Applis"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Cette fonction est désactivée par votre administrateur"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Autoriser la rotation de l\'écran d\'accueil"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Lorsque vous faites pivoter le téléphone"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Diminuer la hauteur"</string>
<string name="widget_resized" msgid="9130327887929620">"Le widget a été redimensionné (largeur : <xliff:g id="NUMBER_0">%1$s</xliff:g>, hauteur : <xliff:g id="NUMBER_1">%2$s</xliff:g>)"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Menu des raccourcis"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Cadre de redimensionnement du widget pour <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Fermer"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Ignorer"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Fermer"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personnel"</string>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Transition vers l\'Espace privé"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Installer"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Installer des applis dans l\'Espace privé"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Ajouter des fichiers et plus à l\'espace privé"</string>
</resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 837425b..0c62a9d 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Fond d\'écran et style"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Modifier l\'écran d\'accueil"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Paramètres de l\'accueil"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Applis"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Désactivé par votre administrateur"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Autoriser la rotation de l\'écran d\'accueil"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Lorsque vous faites pivoter le téléphone"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Diminuer la hauteur"</string>
<string name="widget_resized" msgid="9130327887929620">"Le widget a bien été redimensionné (largeur : <xliff:g id="NUMBER_0">%1$s</xliff:g>, hauteur : <xliff:g id="NUMBER_1">%2$s</xliff:g>)."</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Menu de raccourci"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Cadre de redimensionnement du widget pour <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Fermer"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Ignorer"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Fermer"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personnel"</string>
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index 5c9b179..21e16cc 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Estilo e fondo de pantalla"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Editar pantalla de inicio"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Configuración da pantalla de inicio"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Aplicacións"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Función desactivada polo administrador"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Permitir xirar a pantalla de inicio"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Ao xirar o teléfono"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Reducir altura"</string>
<string name="widget_resized" msgid="9130327887929620">"Cambiouse o tamaño do widget polo ancho <xliff:g id="NUMBER_0">%1$s</xliff:g> e a altura <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Menú do atallo"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Marco do cambio de tamaño do widget para <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Pechar"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Pechar"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Pechar"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Persoal"</string>
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
index 5f9407b..a619bcb 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"વૉલપેપર અને સ્ટાઇલ"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"હોમ સ્ક્રીનમાં ફેરફાર કરો"</string>
<string name="settings_button_text" msgid="8873672322605444408">"હોમ સેટિંગ"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"ઍપ"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"તમારા વ્યવસ્થાપક દ્વારા અક્ષમ કરેલ"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"હોમ સ્ક્રીનને ફેરવવાની મંજૂરી આપો"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"જ્યારે ફોન ફેરવવામાં આવે ત્યારે"</string>
@@ -186,18 +185,14 @@
<string name="action_decrease_height" msgid="282377193880900022">"ઊંચાઈ ઘટાડો"</string>
<string name="widget_resized" msgid="9130327887929620">"વિજેટનો આકાર બદલીને <xliff:g id="NUMBER_0">%1$s</xliff:g> પહોળાઈ <xliff:g id="NUMBER_1">%2$s</xliff:g> ઊંચાઈ કર્યો"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"શૉર્ટકટ મેનૂ"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g> માટે વિજેટનું કદ બદલવાની ફ્રેમ"</string>
+ <string name="action_close" msgid="1077760267194136901">"બંધ કરો"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"છોડી દો"</string>
<string name="accessibility_close" msgid="2277148124685870734">"બંધ કરો"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"વ્યક્તિગત ઍપ"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"ઑફિસની ઍપ"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"વ્યક્તિગત ઍપનું ટૅબ"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"ઑફિસ માટેની ઍપનું ટૅબ"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"ઑફિસની પ્રોફાઇલ"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"ઑફિસની ઍપને બૅજ આપેલા હોય છે અને તમારા IT ઍડમિન તેમને જોઈ શકે છે"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"સમજાઈ ગયું"</string>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 5bd0c6f..3aad85f 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"वॉलपेपर और स्टाइल"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"होम स्क्रीन में बदलाव करें"</string>
<string name="settings_button_text" msgid="8873672322605444408">"होम स्क्रीन की सेटिंग"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"ऐप्लिकेशन"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"आपके एडमिन ने बंद किया हुआ है"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"होम स्क्रीन घुमाने की अनुमति दें"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"फ़ोन घुुमाए जाने पर"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"ऊंचाई घटाएं"</string>
<string name="widget_resized" msgid="9130327887929620">"विजेट का आकार बदलकर उसकी चौड़ाई <xliff:g id="NUMBER_0">%1$s</xliff:g> और ऊंचाई <xliff:g id="NUMBER_1">%2$s</xliff:g> कर दी गई"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"शॉर्टकट मेन्यू"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g> के लिए, विजेट का साइज़ बदलने वाला फ़्रेम"</string>
+ <string name="action_close" msgid="1077760267194136901">"बंद करें"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"खारिज करें"</string>
<string name="accessibility_close" msgid="2277148124685870734">"बंद करें"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"निजी ऐप्लिकेशन"</string>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 6ff7441..bdb088b 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Pozadina i stil"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Uredi početni zaslon"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Postavke početnog zaslona"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Aplikacije"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Onemogućio administrator"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Dopusti zakretanje početnog zaslona"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Kada se telefon zakrene"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Smanjenje visine"</string>
<string name="widget_resized" msgid="9130327887929620">"Širina widgeta promijenjena je na <xliff:g id="NUMBER_0">%1$s</xliff:g>, a visina na <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Izbornik prečaca"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Okvir za promjenu veličine widgeta za <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Zatvori"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Odbaci"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Zatvori"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Osobno"</string>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 5920dff..8abfaac 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Háttérkép és stílus"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Kezdőképernyő szerkesztése"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Kezdőképernyő beállításai"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Alkalmazások"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"A rendszergazda letiltotta"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"A kezdőképernyő elforgatásának engedélyezése"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"A telefon elforgatásakor"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Magasság csökkentése"</string>
<string name="widget_resized" msgid="9130327887929620">"Modul átméretezve <xliff:g id="NUMBER_0">%1$s</xliff:g> szélességre és <xliff:g id="NUMBER_1">%2$s</xliff:g> magasságra"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Gyorsparancsok menüje"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g> modul átméretezési kerete"</string>
+ <string name="action_close" msgid="1077760267194136901">"Bezárás"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Elvetés"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Bezárás"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Személyes"</string>
diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml
index 38e0bf1..9c6fc18 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Պաստառ և ոճ"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Փոփոխել հիմնական էկրանը"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Գլխավոր էկրանի կարգավորումներ"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Հավելվածներ"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Անջատվել է ձեր ադմինիստրատորի կողմից"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Թույլ տալ հիմնական էկրանի պտտումը"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Հեռախոսը պտտելու դեպքում"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Նվազեցնել բարձրությունը"</string>
<string name="widget_resized" msgid="9130327887929620">"Վիջեթի լայնությունը փոխվել է <xliff:g id="NUMBER_0">%1$s</xliff:g>-ի, իսկ բարձրությունը՝ <xliff:g id="NUMBER_1">%2$s</xliff:g>-ի"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Դյուրանցման ընտրացանկ"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"«<xliff:g id="STRING">%1$s</xliff:g>» վիջեթի չափսի փոփոխման շրջանակ"</string>
+ <string name="action_close" msgid="1077760267194136901">"Փակել"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Անտեսել"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Փակել"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Անձնական"</string>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index a850e9c..986f36c 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Wallpaper & gaya"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Edit Layar Utama"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Setelan layar utama"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Aplikasi"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Dinonaktifkan oleh admin"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Izinkan layar utama diputar"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Saat ponsel diputar"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Kurangi tinggi"</string>
<string name="widget_resized" msgid="9130327887929620">"Widget diubah ukurannya menjadi lebar <xliff:g id="NUMBER_0">%1$s</xliff:g> tinggi <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Menu Pintasan"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Bingkai Ubah Ukuran Widget untuk <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Tutup"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Tutup"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Tutup"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Pribadi"</string>
diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml
index 0dbcda2..1c24006 100644
--- a/res/values-is/strings.xml
+++ b/res/values-is/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Veggfóður og stíll"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Breyta heimaskjá"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Heimastillingar"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Forrit"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Gert óvirkt af kerfisstjóra"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Leyfa snúning á heimaskjá"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Þegar símanum er snúið"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Minnka hæð"</string>
<string name="widget_resized" msgid="9130327887929620">"Stærð græju breytt í <xliff:g id="NUMBER_0">%1$s</xliff:g> á breidd og <xliff:g id="NUMBER_1">%2$s</xliff:g> á hæð"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Flýtileiðavalmynd"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Rammi til að breyta stærð græjunnar „<xliff:g id="STRING">%1$s</xliff:g>“"</string>
+ <string name="action_close" msgid="1077760267194136901">"Loka"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Hunsa"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Loka"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Persónulegt"</string>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 29e28e1..3b23790 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Sfondo e stile"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Modifica schermata Home"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Impostazioni schermata Home"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"App"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Disattivata dall\'amministratore"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Consenti rotazione della schermata Home"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Con il telefono ruotato"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Riduci altezza"</string>
<string name="widget_resized" msgid="9130327887929620">"Widget ridimensionato a larghezza <xliff:g id="NUMBER_0">%1$s</xliff:g>, altezza <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Menu scorciatoie"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Frame ridimensionamento widget per <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Chiudi"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Ignora"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Esci"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personali"</string>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Transizione dello Spazio privato in corso…"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Installa"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Installa le app su spazi privati"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Aggiungi file e altro allo spazio privato"</string>
</resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 9cc6a83..08a2889 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"壁紙とスタイル"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"ホーム画面を編集"</string>
<string name="settings_button_text" msgid="8873672322605444408">"ホームの設定"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"アプリ"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"管理者により無効にされています"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"ホーム画面の回転を許可"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"スマートフォンの向きに合わせます"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"高さを低くする"</string>
<string name="widget_resized" msgid="9130327887929620">"ウィジェットのサイズを幅<xliff:g id="NUMBER_0">%1$s</xliff:g>、高さ<xliff:g id="NUMBER_1">%2$s</xliff:g>に変更しました"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"ショートカット メニュー"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g> のウィジェットのサイズ変更フレーム"</string>
+ <string name="action_close" msgid="1077760267194136901">"閉じる"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"表示しない"</string>
<string name="accessibility_close" msgid="2277148124685870734">"閉じる"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"個人用"</string>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"プライベート スペース移行中"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"インストール"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"プライベート スペースにアプリをインストールします"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"プライベート スペースにファイルなどを追加する"</string>
</resources>
diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml
index 108176b..38547f5 100644
--- a/res/values-ka/strings.xml
+++ b/res/values-ka/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"ფონი და სტილი"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"მთავარი ეკრანის რედაქტირება"</string>
<string name="settings_button_text" msgid="8873672322605444408">"მთავარი გვერდის პარამეტრები"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"აპები"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"გათიშულია თქვენი ადმინისტრატორის მიერ"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"მთავარი ეკრანის შეტრიალების დაშვება"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"ტელეფონის შეტრიალებისას"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"სიმაღლის შემცირება"</string>
<string name="widget_resized" msgid="9130327887929620">"ვიჯეტის ზომები შეიცვალა: სიგანე <xliff:g id="NUMBER_0">%1$s</xliff:g> სიმაღლე <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"მალსახმობის მენიუ"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"ვიჯეტის ზომის შეცვლის ფრეიმი <xliff:g id="STRING">%1$s</xliff:g>-ისთვის"</string>
+ <string name="action_close" msgid="1077760267194136901">"დახურვა"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"დახურვა"</string>
<string name="accessibility_close" msgid="2277148124685870734">"დახურვა"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"პირადი"</string>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"პირად სივრცეზე გადასვლა"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"ინსტალაცია"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"კერძო სივრცეში აპების ინსტალაცია"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"კერძო სივრცეში დაამატეთ ფაილები და სხვა"</string>
</resources>
diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml
index 1c12f04..f096671 100644
--- a/res/values-km/strings.xml
+++ b/res/values-km/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"ផ្ទាំងរូបភាព និងរចនាបថ"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"កែអេក្រង់ដើម"</string>
<string name="settings_button_text" msgid="8873672322605444408">"ការកំណត់ទំព័រដើម"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"កម្មវិធី"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"បានបិទដំណើរការដោយអ្នកគ្រប់គ្រងរបស់អ្នក"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"អនុញ្ញាតការបងិ្វលអេក្រង់ដើម"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"នៅពេលដែលបង្វិលទូរសព្ទ"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"បន្ថយកម្ពស់"</string>
<string name="widget_resized" msgid="9130327887929620">"ធាតុក្រាហ្វិកដែលបានប្តូរទំហំទៅទទឹងប្រវែង <xliff:g id="NUMBER_0">%1$s</xliff:g> កម្ពស់ប្រវែង <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"ម៉ឺនុយផ្លូវកាត់"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"ហ្វ្រេមប្ដូរទំហំធាតុក្រាហ្វិកសម្រាប់ <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"បិទ"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"ច្រានចោល"</string>
<string name="accessibility_close" msgid="2277148124685870734">"បិទ"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"ផ្ទាល់ខ្លួន"</string>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"ការផ្លាស់ប្ដូរ Private Space"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"ដំឡើង"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"ដំឡើងកម្មវិធីទៅលំហឯកជន"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"បញ្ចូលឯកសារ និងអ្វីៗជាច្រើនទៀតទៅលំហឯកជន"</string>
</resources>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
index e30b80b..c27bbde 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"ವಾಲ್ಪೇಪರ್ ಮತ್ತು ಶೈಲಿ"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"ಹೋಮ್ ಸ್ಕ್ರೀನ್ ಅನ್ನು ಎಡಿಟ್ ಮಾಡಿ"</string>
<string name="settings_button_text" msgid="8873672322605444408">"ಹೋಮ್ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"ಆ್ಯಪ್ಗಳು"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ್ದಾರೆ"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"ಹೋಮ್ ಸ್ಕ್ರೀನ್ ತಿರುಗುವಿಕೆಯನ್ನು ಅನುಮತಿಸಿ"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"ಫೋನ್ ತಿರುಗಿಸಿದಾಗ"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"ಎತ್ತರವನ್ನು ಕಡಿಮೆ ಮಾಡಿ"</string>
<string name="widget_resized" msgid="9130327887929620">"ವಿಜೆಟ್ ಅನ್ನು <xliff:g id="NUMBER_0">%1$s</xliff:g> ಅಗಲ <xliff:g id="NUMBER_1">%2$s</xliff:g> ಎತ್ತರಕ್ಕೆ ಮರುಗಾತ್ರಗೊಳಿಸಲಾಗಿದೆ"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"ಶಾರ್ಟ್ಕಟ್ ಮೆನು"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g> ಗಾಗಿ ವಿಜೆಟ್ ಮರುಗಾತ್ರಗೊಳಿಸುವಿಕೆ ಫ್ರೇಮ್"</string>
+ <string name="action_close" msgid="1077760267194136901">"ಮುಚ್ಚಿರಿ"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"ವಜಾಗೊಳಿಸಿ"</string>
<string name="accessibility_close" msgid="2277148124685870734">"ಮುಚ್ಚಿರಿ"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"ವೈಯಕ್ತಿಕ"</string>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"ಖಾಸಗಿ ಸ್ಪೇಸ್ ಪರಿವರ್ತನೆಯಾಗುತ್ತಿದೆ"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"ಇನ್ಸ್ಟಾಲ್"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"ಆ್ಯಪ್ಗಳನ್ನು ಪ್ರೈವೇಟ್ ಸ್ಪೇಸ್ನಲ್ಲಿ ಇನ್ಸ್ಟಾಲ್ ಮಾಡಿ"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"ಪ್ರೈವೆಟ್ ಸ್ಪೇಸ್ಗೆ ಫೈಲ್ಗಳು ಮತ್ತು ಹೆಚ್ಚಿನದನ್ನು ಸೇರಿಸಿ"</string>
</resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 1d60d88..ec54bd6 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"배경화면 및 스타일"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"홈 화면 수정"</string>
<string name="settings_button_text" msgid="8873672322605444408">"홈 설정"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"앱"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"관리자가 사용 중지함"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"홈 화면 회전 허용"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"휴대전화 회전 시"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"높이 줄이기"</string>
<string name="widget_resized" msgid="9130327887929620">"폭 <xliff:g id="NUMBER_0">%1$s</xliff:g>, 높이 <xliff:g id="NUMBER_1">%2$s</xliff:g>로 위젯 크기 조정됨"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"바로가기 메뉴"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g>의 위젯 크기 조절 프레임"</string>
+ <string name="action_close" msgid="1077760267194136901">"닫기"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"닫기"</string>
<string name="accessibility_close" msgid="2277148124685870734">"닫기"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"개인"</string>
diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml
index 638e107..079328f 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Тушкагаз жана стиль"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Башкы экранды түзөтүү"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Башкы бет параметрлери"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Колдонмолор"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Администраторуңуз өчүрүп койгон"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Башкы экранды бурууга уруксат берүү"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Телефон бурулганда"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Жапыздатуу"</string>
<string name="widget_resized" msgid="9130327887929620">"Виджеттин кеңдиги <xliff:g id="NUMBER_0">%1$s</xliff:g> бийиктиги <xliff:g id="NUMBER_1">%2$s</xliff:g> болду"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Ыкчам баскычтын менюсу"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g> үчүн виджеттин өлчөмүн өзгөртүү"</string>
+ <string name="action_close" msgid="1077760267194136901">"Жабуу"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Этибарга албоо"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Жабуу"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Жеке колдонмолор"</string>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Жеке чөйрөгө өтүү"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Орнотуу"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Колдонмолорду Жеке мейкиндикке орнотуe"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Жеке мейкиндикке файлдарды жана башкаларды кошуу"</string>
</resources>
diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml
index d459fd9..e3a85d6 100644
--- a/res/values-lo/strings.xml
+++ b/res/values-lo/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"ຮູບພື້ນຫຼັງ ແລະ ຮູບແບບ"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"ແກ້ໄຂໂຮມສະກຣີນ"</string>
<string name="settings_button_text" msgid="8873672322605444408">"ການຕັ້ງຄ່າໜ້າຫຼັກ"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"ແອັບ"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"ຖືກປິດການນຳໃຊ້ໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"ອະນຸຍາດໃຫ້ໝຸນໜ້າຈໍຢູ່ໂຮມສະກຣີນໄດ້"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"ເມື່ອໝຸນໂທລະສັບ"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"ຫຼຸດລວງສູງລົງ"</string>
<string name="widget_resized" msgid="9130327887929620">"ປ່ຽນຂະໜາດວິດເຈັດເປັນລວງກ້ວາງ <xliff:g id="NUMBER_0">%1$s</xliff:g> ລວງສູງ <xliff:g id="NUMBER_1">%2$s</xliff:g> ແລ້ວ"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"ເມນູທາງລັດ"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"ປັບຂະໜາດກອບວິດເຈັດສຳລັບ <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"ປິດ"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"ປິດໄວ້"</string>
<string name="accessibility_close" msgid="2277148124685870734">"ປິດ"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"ສ່ວນຕົວ"</string>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"ການປ່ຽນແປງພື້ນທີ່ສ່ວນຕົວ"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"ຕິດຕັ້ງ"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"ຕິດຕັ້ງແອັບໄປໃສ່ພື້ນທີ່ສ່ວນບຸກຄົນ"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"ເພີ່ມໄຟລ໌ ແລະ ອື່ນໆໃສ່ພື້ນທີ່ສ່ວນບຸກຄົນ"</string>
</resources>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 2421ddd..d1cbf9a 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Ekrano fonas ir stilius"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Redaguoti pagrindinį ekraną"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Pagrindinio ekrano nustatymai"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Programos"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Išjungė administratorius"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Leisti pasukti pagrindinį ekraną"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Kai telefonas pasukamas"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Sumažinti aukštį"</string>
<string name="widget_resized" msgid="9130327887929620">"Valdiklio dydis pakeistas: plotis – <xliff:g id="NUMBER_0">%1$s</xliff:g>, aukštis – <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Sparčiųjų klavišų meniu"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"„<xliff:g id="STRING">%1$s</xliff:g>“ valdiklio dydžio keitimo rėmelis"</string>
+ <string name="action_close" msgid="1077760267194136901">"Uždaryti"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Atsisakyti"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Uždaryti"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Asmeninės"</string>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
index aebd1f1..ed01b0e 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Тапет и стил"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Изменете го почетниот екран"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Поставки за почетен екран"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Апликации"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Оневозможено од администраторот"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Дозволи ротирање на почетниот екран"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Кога телефонот се ротира"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Намали висина"</string>
<string name="widget_resized" msgid="9130327887929620">"Големината на виџетот е променета на ширина <xliff:g id="NUMBER_0">%1$s</xliff:g> висина <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Мени за кратенки"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Рамка за промена на големината на виџетот за <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Затвори"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Отфрли"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Затвори"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Лично"</string>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Префрлање на „Приватен простор“"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Инсталирајте"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Инсталирање апликации во „Приватен простор“"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Додавање датотеки и друго во „Приватен простор“"</string>
</resources>
diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml
index 68d484b..0c5f3cd 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"വാൾപേപ്പറും സ്റ്റൈലും"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"ഹോം സ്ക്രീൻ എഡിറ്റ് ചെയ്യുക"</string>
<string name="settings_button_text" msgid="8873672322605444408">"ഹോം ക്രമീകരണം"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"ആപ്പുകൾ"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"അഡ്മിൻ പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"ഹോം സ്ക്രീൻ റൊട്ടേഷൻ അനുവദിക്കുക"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"ഫോൺ തിരിച്ച നിലയിലായിരിക്കുമ്പോൾ"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"ഉയരം കുറയ്ക്കുക"</string>
<string name="widget_resized" msgid="9130327887929620">"വീതി <xliff:g id="NUMBER_0">%1$s</xliff:g> ഉയരം <xliff:g id="NUMBER_1">%2$s</xliff:g>-ലേക്ക് വിഡ്ജെറ്റിന്റെ വലുപ്പം മാറ്റി"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"കുറുക്കുവഴി മെനു"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g> എന്നതിനുള്ള വിജറ്റിന്റെ വലുപ്പം മാറ്റുന്നതിനുള്ള ഫ്രെയിം"</string>
+ <string name="action_close" msgid="1077760267194136901">"അടയ്ക്കുക"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"നിരസിക്കുക"</string>
<string name="accessibility_close" msgid="2277148124685870734">"അടയ്ക്കൂ"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"വ്യക്തിപരം"</string>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"പ്രൈവറ്റ് സ്പേസ് ട്രാൻസിഷനിംഗ്"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"ഇൻസ്റ്റാൾ ചെയ്യുക"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"സ്വകാര്യ സ്പേസിലേക്ക് ആപ്പുകൾ ഇൻസ്റ്റാൾ ചെയ്യുക"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"സ്വകാര്യ സ്പേസിലേക്ക് ഫയലുകളും മറ്റും ചേർക്കുക"</string>
</resources>
diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml
index 1eeea10..631e310 100644
--- a/res/values-mn/strings.xml
+++ b/res/values-mn/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Дэлгэцийн зураг, загвар"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Үндсэн нүүрийг засах"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Нүүр хуудасны тохиргоо"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Апп"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Таны админ идэвхгүй болгосон"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Үндсэн нүүрийг эргүүлэхийг зөвшөөрөх"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Утсыг эргүүлсэн үед"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Намсгах"</string>
<string name="widget_resized" msgid="9130327887929620">"Виджэтийн өргөн <xliff:g id="NUMBER_0">%1$s</xliff:g>, өндөр <xliff:g id="NUMBER_1">%2$s</xliff:g> болсон"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Товчлолын цэс"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g>-н виджетийн хэмжээг өөрчлөх фрейм"</string>
+ <string name="action_close" msgid="1077760267194136901">"Хаах"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Хаах"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Хаах"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Хувийн"</string>
diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml
index 5c19b74..78b1cde 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"वॉलपेपर आणि शैली"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"होम स्क्रीन संपादित करा"</string>
<string name="settings_button_text" msgid="8873672322605444408">"होम सेटिंग्ज"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"ॲप्स"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"आपल्या प्रशासकाने अक्षम केले"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"होम स्क्रीन फिरवण्याची अनुमती द्या"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"फोन फिरवला जातो तेव्हा"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"उंची कमी करा"</string>
<string name="widget_resized" msgid="9130327887929620">"विजेटचा आकार रुंदी <xliff:g id="NUMBER_0">%1$s</xliff:g> उंची <xliff:g id="NUMBER_1">%2$s</xliff:g> मध्ये बदलला"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"शॉर्टकट मेनू"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g> साठी विजेटचा आकार बदलण्याची फ्रेम"</string>
+ <string name="action_close" msgid="1077760267194136901">"बंद करा"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"डिसमिस करा"</string>
<string name="accessibility_close" msgid="2277148124685870734">"बंद करा"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"वैयक्तिक"</string>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"खाजगी स्पेस वर स्विच करणे"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"इंस्टॉल करा"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"अॅप्स खाजगी स्पेस मध्ये इंस्टॉल करा"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"खाजगी स्पेस मध्ये फाइल आणि आणखी बऱ्याच गोष्टी जोडा"</string>
</resources>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index 4982d02..afcee62 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Hiasan latar & gaya"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Edit Skrin Utama"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Tetapan skrin utama"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Apl"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Dilumpuhkan oleh pentadbir anda"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Benarkan putaran skrin utama"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Apabila telefon diputar"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Kurangkan ketinggian"</string>
<string name="widget_resized" msgid="9130327887929620">"Saiz widget diubah menjadi <xliff:g id="NUMBER_0">%1$s</xliff:g> lebar <xliff:g id="NUMBER_1">%2$s</xliff:g> tinggi"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Menu Pintasan"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Bingkai Ubah Saiz Widget untuk <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Tutup"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Ketepikan"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Tutup"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Peribadi"</string>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Peralihan Ruang Peribadi"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Pasang"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Pasang apl pada Ruang Peribadi"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Tambahkan fail dan banyak lagi pada Ruang Persendirian"</string>
</resources>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index 9ef1758..c467055 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"နောက်ခံနှင့် ပုံစံ"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"ပင်မစာမျက်နှာ တည်းဖြတ်ရန်"</string>
<string name="settings_button_text" msgid="8873672322605444408">"ပင်မဆက်တင်များ"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"အက်ပ်များ"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"သင့်စီမံခန့်ခွဲသူက ပိတ်လိုက်ပါသည်"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"ပင်မစာမျက်နှာလှည့်ခြင်းကို ခွင့်ပြုခြင်း"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"ဖုန်းကိုလှည့်ထားစဉ်"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"အမြင့်အား လျှော့ပါ"</string>
<string name="widget_resized" msgid="9130327887929620">"Widget အား အကျယ် <xliff:g id="NUMBER_0">%1$s</xliff:g> အမြင့် <xliff:g id="NUMBER_1">%2$s</xliff:g> အရွယ်အစားပြန်လည်ချိန်ညှိပြီး၏"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"ဖြတ်လမ်းလင့်ခ် မီနူး"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g> အတွက် ဝိဂျက်အရွယ်ပြင်ဖရိမ်"</string>
+ <string name="action_close" msgid="1077760267194136901">"ပိတ်ရန်"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"ပယ်ရန်"</string>
<string name="accessibility_close" msgid="2277148124685870734">"ပိတ်ရန်"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"ကိုယ်ပိုင်"</string>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 4fb3642..f4e10fc 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Bakgrunn og stil"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Endre startsiden"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Startsideinnstillinger"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Apper"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Administratoren har slått av funksjonen"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Tillat at startskjermen roterer"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Når telefonen roteres"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Reduser høyden"</string>
<string name="widget_resized" msgid="9130327887929620">"Størrelsen på modulen er endret til bredde <xliff:g id="NUMBER_0">%1$s</xliff:g> og høyde <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Hurtigtastmeny"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Modul – endre størrelse på rammen for <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Lukk"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Avvis"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Lukk"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personlig"</string>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
index 38167de..00cbba0 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"वालपेपर तथा शैली"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"होम स्क्रिन बदल्नुहोस्"</string>
<string name="settings_button_text" msgid="8873672322605444408">"होम पेजका सेटिङहरू"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"एपहरू"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"तपाईँको प्रशासकद्वारा असक्षम गरिएको"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"होम स्क्रिन रोटेट हुन दिइयोस्"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"फोन घुमाउँदा"</string>
@@ -186,18 +185,14 @@
<string name="action_decrease_height" msgid="282377193880900022">"उँचाइ घटाउनुहोस्"</string>
<string name="widget_resized" msgid="9130327887929620">"विजेट चौडाइ <xliff:g id="NUMBER_0">%1$s</xliff:g> उचाइ <xliff:g id="NUMBER_1">%2$s</xliff:g> मा पुनः आकार मिलाइयो"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"सर्टकटसम्बन्धी मेनु"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g> एपको विजेटको आकार बदल्ने फ्रेम"</string>
+ <string name="action_close" msgid="1077760267194136901">"बन्द गर्नुहोस्"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"खारेज गर्नुहोस्"</string>
<string name="accessibility_close" msgid="2277148124685870734">"बन्द गर्नुहोस्"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"व्यक्तिगत"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"कामसम्बन्धी"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"\"व्यक्तिगत एपहरू\" ट्याब"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"\"कामसम्बन्धी एपहरू\" ट्याब"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"कार्य प्रोफाइल"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"कामसम्बन्धी एपहरूमा ब्याज अङ्कित हुन्छ र तपाईंका IT एड्मिन ती एप हेर्न सक्छन्"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"बुझेँ"</string>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 2b99b69..5fa50c6 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Achtergrond en stijl"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Startscherm bewerken"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Instellingen Start"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Apps"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Uitgezet door je beheerder"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Draaien van startscherm toestaan"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Als de telefoon gedraaid is"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Hoogte verkleinen"</string>
<string name="widget_resized" msgid="9130327887929620">"Formaat van widget gewijzigd in breedte <xliff:g id="NUMBER_0">%1$s</xliff:g> en hoogte <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Snelmenu"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Frame voor widgetformaat aanpassen voor <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Sluiten"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Sluiten"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Sluiten"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Privé"</string>
diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml
index 2b924de..d2b1906 100644
--- a/res/values-or/strings.xml
+++ b/res/values-or/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"ୱାଲପେପର ଏବଂ ଷ୍ଟାଇଲ"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"ହୋମ ସ୍କ୍ରିନକୁ ଏଡିଟ କରନ୍ତୁ"</string>
<string name="settings_button_text" msgid="8873672322605444408">"ହୋମ ସେଟିଂସ"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"ଆପ୍ସ"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"ଆପଣଙ୍କ ଆଡମିନଙ୍କ ଦ୍ୱାରା ଅକ୍ଷମ କରାଯାଇଛି"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"ହୋମ ସ୍କ୍ରିନ ରୋଟେସନକୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"ଯେତେବେଳେ ଫୋନକୁ ରୋଟେଟ କରାଯାଇଥାଏ"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"ଉଚ୍ଚତା କମ୍ କରନ୍ତୁ"</string>
<string name="widget_resized" msgid="9130327887929620">"ୱିଜେଟକୁ <xliff:g id="NUMBER_0">%1$s</xliff:g> ଓସାର ଓ <xliff:g id="NUMBER_1">%2$s</xliff:g> ଉଚ୍ଚରେ ପୁନଃଆକାର ଦିଆଗଲା"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"ସର୍ଟକଟ ମେନୁ"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g> ପାଇଁ ୱିଜେଟ ରିସାଇଜ ଫ୍ରେମ"</string>
+ <string name="action_close" msgid="1077760267194136901">"ବନ୍ଦ କରନ୍ତୁ"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"ଖାରଜ କରନ୍ତୁ"</string>
<string name="accessibility_close" msgid="2277148124685870734">"ବନ୍ଦ କରନ୍ତୁ"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"ବ୍ୟକ୍ତିଗତ"</string>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index 934266d..0424469 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"ਵਾਲਪੇਪਰ ਅਤੇ ਸਟਾਈਲ"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"ਹੋਮ ਸਕ੍ਰੀਨ ਦਾ ਸੰਪਾਦਨ ਕਰੋ"</string>
<string name="settings_button_text" msgid="8873672322605444408">"ਹੋਮ ਸੈਟਿੰਗਾਂ"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"ਐਪਾਂ"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਦੁਆਰਾ ਅਯੋਗ ਬਣਾਈ ਗਈ"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"ਹੋਮ ਸਕ੍ਰੀਨ ਨੂੰ ਘੁਮਾਉਣ ਦੀ ਆਗਿਆ ਦਿਓ"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"ਜਦੋਂ ਫ਼ੋਨ ਘੁਮਾਇਆ ਜਾਂਦਾ ਹੈ"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"ਉਂਚਾਈ ਘਟਾਓ"</string>
<string name="widget_resized" msgid="9130327887929620">"ਵਿਜੈਟ ਨੂੰ ਚੌੜਾਈ <xliff:g id="NUMBER_0">%1$s</xliff:g> ਉਂਚਾਈ <xliff:g id="NUMBER_1">%2$s</xliff:g> ਨੂੰ ਮੁੜ ਆਕਾਰ ਦਿੱਤਾ"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"ਸ਼ਾਰਟਕੱਟ ਮੀਨੂ"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g> ਲਈ, ਵਿਜੇਟ ਦਾ ਆਕਾਰ ਬਦਲਣ ਵਾਲਾ ਫ੍ਰੇਮ"</string>
+ <string name="action_close" msgid="1077760267194136901">"ਬੰਦ ਕਰੋ"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"ਖਾਰਜ ਕਰੋ"</string>
<string name="accessibility_close" msgid="2277148124685870734">"ਬੰਦ ਕਰੋ"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"ਨਿੱਜੀ"</string>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"ਪ੍ਰਾਈਵੇਟ ਸਪੇਸ ਨੂੰ ਤਬਦੀਲ ਕਰਨਾ"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"ਸਥਾਪਤ ਕਰੋ"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"ਪ੍ਰਾਈਵੇਟ ਸਪੇਸ ਵਿੱਚ ਐਪਾਂ ਸਥਾਪਤ ਕਰੋ"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"ਪ੍ਰਾਈਵੇਟ ਸਪੇਸ ਵਿੱਚ ਫ਼ਾਈਲਾਂ ਅਤੇ ਹੋਰ ਚੀਜ਼ਾਂ ਨੂੰ ਸ਼ਾਮਲ ਕਰੋ"</string>
</resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 36fa4e8..327c5ea 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Tapeta i styl"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Edytuj ekran główny"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Ustawienia ekranu głównego"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Aplikacje"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Funkcja wyłączona przez administratora"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Zezwalaj na obrót ekranu głównego"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Po obróceniu telefonu"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Zmniejsz wysokość"</string>
<string name="widget_resized" msgid="9130327887929620">"Szerokość i wysokość widżetu zmieniła się na <xliff:g id="NUMBER_0">%1$s</xliff:g> x <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Menu skrótów"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Ramka zmiany rozmiaru widżetu dla: <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Zamknij"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Zamknij"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Zamknij"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Osobiste"</string>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 50252d5..54fcb9a 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Imagem fundo/estilo"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Editar ecrã principal"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Definições de início"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Apps"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Desativada pelo gestor"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Permitir rotação do ecrã principal"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Quando o telemóvel é rodado"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Diminuir altura"</string>
<string name="widget_resized" msgid="9130327887929620">"Widget redimensionado para a largura <xliff:g id="NUMBER_0">%1$s</xliff:g>, altura <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Menu de atalho"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Frame de redimensionamento do widget para <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Fechar"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Ignorar"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Fechar"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Pessoal"</string>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Transição do espaço privado"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Instalar"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Instale apps no espaço privado"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Adicione ficheiros e muito mais ao espaço privado"</string>
</resources>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 458f46e..9a61bb4 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Imagine de fundal și stil"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Editează ecranul de pornire"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Setări ecran de pornire"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Aplicații"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Dezactivată de administrator"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Permite rotirea ecranului de pornire"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Când telefonul este rotit"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Redu înălțimea"</string>
<string name="widget_resized" msgid="9130327887929620">"Widgetul a fost redimensionat la lățimea <xliff:g id="NUMBER_0">%1$s</xliff:g> și înălțimea <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Meniu de comenzi rapide"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Cadru de redimensionare a widgetului pentru <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Închide"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Închide"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Închide"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personale"</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 5299596..5cae2fd 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Обои и стиль"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Изменить главный экран"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Главный экран"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Приложения"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Функция отключена администратором"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Разрешить поворачивать главный экран"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"При повороте телефона"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Уменьшить высоту"</string>
<string name="widget_resized" msgid="9130327887929620">"Изменен размер виджета: до <xliff:g id="NUMBER_0">%1$s</xliff:g> в ширину и <xliff:g id="NUMBER_1">%2$s</xliff:g> в высоту"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Быстрое меню"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Рамка изменения размеров виджета \"<xliff:g id="STRING">%1$s</xliff:g>\""</string>
+ <string name="action_close" msgid="1077760267194136901">"Закрыть"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Закрыть"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Закрыть"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Личные"</string>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Переход к личному пространству"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Установить"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Установить приложения в личном пространстве"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Добавляйте в частное пространство файлы и многое другое"</string>
</resources>
diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml
index 766dafd..ea02797 100644
--- a/res/values-si/strings.xml
+++ b/res/values-si/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"වෝල්පේපරය සහ මෝස්තරය"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"මුල් තිරය සංස්කරණය කරන්න"</string>
<string name="settings_button_text" msgid="8873672322605444408">"නිවසේ සැකසීම්"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"යෙදුම්"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"ඔබගේ පරිපාලක විසින් අබල කරන ලදී"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"මුල් තිරය කරකැවීමට ඉඩ දෙන්න"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"දුරකථනය කරකවන විට"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"උස අඩු කරන්න"</string>
<string name="widget_resized" msgid="9130327887929620">"විජට් පළල <xliff:g id="NUMBER_0">%1$s</xliff:g> උස <xliff:g id="NUMBER_1">%2$s</xliff:g> වෙත ප්රමාණකරණය කරන ලදි"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"කෙටිමං මෙනුව"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g> සඳහා විජට් ප්රමාණය වෙනස් කිරීමේ රාමුව"</string>
+ <string name="action_close" msgid="1077760267194136901">"වසන්න"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"ඉවතලන්න"</string>
<string name="accessibility_close" msgid="2277148124685870734">"වසන්න"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"පුද්ගලික"</string>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"පෞද්ගලික අවකාශ සංක්රමණය"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"ස්ථාපන කරන්න"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"පෞද්ගලික අවකාශයට යෙදුම් ස්ථාපනය කරන්න"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"රහසිගත අවකාශයට ගොනු සහ තවත් දේ එක් කරන්න"</string>
</resources>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index 465ed09..504ca56 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Tapeta a štýl"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Upraviť plochu"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Nastavenia plochy"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Aplikácie"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Zakázané vaším správcom"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Povoliť otáčanie plochy"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Pri otočení telefónu"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Znížiť výšku"</string>
<string name="widget_resized" msgid="9130327887929620">"Veľkosť miniaplikácie bola zmenená na <xliff:g id="NUMBER_0">%1$s</xliff:g> x <xliff:g id="NUMBER_1">%2$s</xliff:g> (šírka x výška)"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Ponuka skratiek"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Rám na zmenu veľkosti miniaplikácie pre <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Zavrieť"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Zavrieť"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Zavrieť"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Osobné"</string>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index a32a0a9..4235d03 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Zaslonsko ozadje in slog"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Urejanje začetnega zaslona"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Začetni zaslon"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Aplikacije"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Onemogočil skrbnik."</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Dovoli sukanje začetnega zaslona"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Ko se telefon zasuka"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Zmanjšanje višine"</string>
<string name="widget_resized" msgid="9130327887929620">"Velikost pripomočka je bila spremenjena na <xliff:g id="NUMBER_0">%1$s</xliff:g> širine in <xliff:g id="NUMBER_1">%2$s</xliff:g> višine"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Meni z bližnjicami"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Okvir za spreminjanje velikosti pripomočka za aplikacijo <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Zapri"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Opusti"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Zapri"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Osebno"</string>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Preklapljanje zasebnega prostora"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Namestitev"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Nameščanje aplikacij v zasebni prostor"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Dodajte datoteke in drugo v zasebni prostor"</string>
</resources>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index d1b955c..2906849 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Imazhi i sfondit dhe stili"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Modifiko ekranin bazë"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Cilësimet e ekranit bazë"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Aplikacionet"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Çaktivizuar nga administratori"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Lejo rrotullimin e ekranit bazë"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Kur telefoni rrotullohet"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Zvogëlo lartësinë"</string>
<string name="widget_resized" msgid="9130327887929620">"Madhësia e miniaplikacionit u ndryshua me gjerësinë <xliff:g id="NUMBER_0">%1$s</xliff:g> dhe lartësinë <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Menyja e shkurtoreve"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Kuadri i ndryshimit të përmasave të miniaplikacionit për <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Mbyll"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Hiqe"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Mbyll"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personale"</string>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index ca04201..b661b99 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Позадина и стил"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Измени почетни екран"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Подешавања почетног екрана"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Апликације"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Администратор је онемогућио"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Дозволи ротацију почетног екрана"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Када се телефон ротира"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Смањи висину"</string>
<string name="widget_resized" msgid="9130327887929620">"Величина виџета је промењена на ширину <xliff:g id="NUMBER_0">%1$s</xliff:g> и висину <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Мени са пречицама"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Промена величине оквира виџета за: <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Затворите"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Одбаци"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Затвори"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Лично"</string>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Пренос приватног простора"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Инсталирајте"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Инсталирај апликације у приватан простор"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Додајте фајлове и друго у приватан простор"</string>
</resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index dd91e4b..898873a 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Bakgrund och utseende"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Redigera startskärm"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Startinställningar"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Appar"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Inaktiverat av administratören"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Tillåt rotering av startskärmen"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"När telefonen vrids"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Minska höjden"</string>
<string name="widget_resized" msgid="9130327887929620">"Widgetens storlek har ändrats till: bredd <xliff:g id="NUMBER_0">%1$s</xliff:g>, höjd <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Snabbmeny"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Widget för att ändra ramstorlek för <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Stäng"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Ignorera"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Stäng"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Privat"</string>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index bd6e135..c6ee27b 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Mandhari na mtindo"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Badilisha Skrini ya Kwanza"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Mipangilio ya mwanzo"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Programu"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Imezimwa na msimamizi wako"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Ruhusu kipengele cha kuzungusha skrini ya kwanza"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Simu inapozungushwa"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Punguza urefu"</string>
<string name="widget_resized" msgid="9130327887929620">"Wijeti imepunguzwa hadi upana <xliff:g id="NUMBER_0">%1$s</xliff:g> urefu <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Menyu ya Njia za Mkato"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Fremu ya Kubadilisha Ukubwa wa Wijeti ya <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Funga"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Ondoa"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Funga"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Binafsi"</string>
diff --git a/res/values-sw600dp/styles.xml b/res/values-sw600dp/styles.xml
index 63bd46b..db49a3e 100644
--- a/res/values-sw600dp/styles.xml
+++ b/res/values-sw600dp/styles.xml
@@ -14,8 +14,11 @@
~ limitations under the License.
-->
-<resources>
+<resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="CellStyleDefault">
<item name="iconDrawablePadding">7dp</item>
</style>
+ <style name="DropTargetButton" parent="DropTargetButtonBase">
+ <item name="android:fontFamily" android:featureFlag="com.android.launcher3.gsf_res">variable-title-large</item>
+ </style>
</resources>
\ No newline at end of file
diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml
index 743df88..73782da 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"வால்பேப்பர் & ஸ்டைல்"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"முகப்புத் திரையில் மாற்று"</string>
<string name="settings_button_text" msgid="8873672322605444408">"முகப்பு அமைப்புகள்"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"ஆப்ஸ்"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"உங்கள் நிர்வாகி முடக்கியுள்ளார்"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"முகப்புத் திரை சுழற்சியை அனுமதித்தல்"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"மொபைலைச் சுழற்றும் போது"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"உயரத்தைக் குறை"</string>
<string name="widget_resized" msgid="9130327887929620">"அகலம் <xliff:g id="NUMBER_0">%1$s</xliff:g> மற்றும் உயரம் <xliff:g id="NUMBER_1">%2$s</xliff:g>க்கு விட்ஜெட் அளவு மாற்றப்பட்டது"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"ஷார்ட்கட் மெனு"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g>க்கான விட்ஜெட்டின் அளவை மாற்றும் சட்டம்"</string>
+ <string name="action_close" msgid="1077760267194136901">"மூடும்"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"நிராகரி"</string>
<string name="accessibility_close" msgid="2277148124685870734">"மூடும் பட்டன்"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"தனிப்பட்டவை"</string>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index 4df936c..6f9ba1e 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"వాల్పేపర్ & స్టయిల్"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"మొదటి స్క్రీన్ను ఎడిట్ చేయండి"</string>
<string name="settings_button_text" msgid="8873672322605444408">"మొదటి స్క్రీన్ సెట్టింగ్లు"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"యాప్లు"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"మీ నిర్వాహకులు నిలిపివేసారు"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"మొదటి స్క్రీన్ రొటేషన్ను అనుమతించండి"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"ఫోన్ను తిప్పినప్పుడు"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"ఎత్తును తగ్గించు"</string>
<string name="widget_resized" msgid="9130327887929620">"విడ్జెట్ సైజ్ వెడల్పు <xliff:g id="NUMBER_0">%1$s</xliff:g>కి, ఎత్తు <xliff:g id="NUMBER_1">%2$s</xliff:g>కి మార్చబడింది"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"షార్ట్కట్ మెనూ"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g> విడ్జెట్ సైజ్ను మార్చే ఫ్రేమ్"</string>
+ <string name="action_close" msgid="1077760267194136901">"మూసివేయండి"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"తీసివేయండి"</string>
<string name="accessibility_close" msgid="2277148124685870734">"మూసివేస్తుంది"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"వ్యక్తిగతం"</string>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"ప్రైవేట్ స్పేస్ కేటాయించడం జరుగుతుంది"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"ఇన్స్టాల్ చేయండి"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"ప్రైవేట్ స్పేస్కు యాప్లను ఇన్స్టాల్ చేయండి"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"ప్రైవేట్ స్పేస్కు ఫైళ్లను, మరిన్నింటిని జోడించండి"</string>
</resources>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 9107582..af96acd 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"วอลเปเปอร์และสไตล์"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"แก้ไขหน้าจอหลัก"</string>
<string name="settings_button_text" msgid="8873672322605444408">"การตั้งค่าหน้าจอหลัก"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"แอป"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"ปิดใช้โดยผู้ดูแลระบบ"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"อนุญาตให้หมุนหน้าจอหลัก"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"เมื่อหมุนโทรศัพท์"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"ลดความสูง"</string>
<string name="widget_resized" msgid="9130327887929620">"ปรับขนาดของวิดเจ็ตเป็นกว้าง <xliff:g id="NUMBER_0">%1$s</xliff:g> สูง <xliff:g id="NUMBER_1">%2$s</xliff:g> แล้ว"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"เมนูแป้นพิมพ์ลัด"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"เฟรมปรับขนาดวิดเจ็ตสำหรับ <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"ปิด"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"ปิด"</string>
<string name="accessibility_close" msgid="2277148124685870734">"ปิด"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"ส่วนตัว"</string>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"การเปลี่ยนไปใช้พื้นที่ส่วนตัว"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"ติดตั้ง"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"ติดตั้งแอปไปยังพื้นที่ส่วนตัว"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"เพิ่มไฟล์และอื่นๆ ไปยังพื้นที่ส่วนตัว"</string>
</resources>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 59661c0..8125328 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Wallpaper & istilo"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"I-edit ang Home Screen"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Mga setting ng Home"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Mga App"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Na-disable ng iyong admin"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Payagan ang pag-rotate ng home screen"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Kailan maro-rotate ang telepono"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Bawasan ang taas"</string>
<string name="widget_resized" msgid="9130327887929620">"Na-resize ang widget sa lapad <xliff:g id="NUMBER_0">%1$s</xliff:g> taas <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Menu ng Shortcut"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Frame sa Pag-resize ng Widget para sa <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Isara"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"I-dismiss"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Isara"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personal"</string>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Pag-transition ng Pribadong Space"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"I-install"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Mag-install ng mga app sa Pribadong Space"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Magdagdag ng mga file at higit pa sa Pribadong Space"</string>
</resources>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index c834f6c..c5504fe 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Duvar kağıdı ve stil"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Ana ekranı düzenleyin"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Ana ekran ayarları"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Uygulamalar"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Yöneticiniz tarafından devre dışı bırakıldı"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Ana ekranı döndürmeye izin ver"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Telefon döndürüldüğünde"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Yüksekliği azalt"</string>
<string name="widget_resized" msgid="9130327887929620">"Widget, <xliff:g id="NUMBER_0">%1$s</xliff:g> genişlik ve <xliff:g id="NUMBER_1">%2$s</xliff:g> yükseklik değerine yeniden boyutlandırıldı"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Kısayol Menüsü"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g> Widget\'ını Yeniden Boyutlandırma Çerçevesi"</string>
+ <string name="action_close" msgid="1077760267194136901">"Kapat"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Kapat"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Kapat"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Kişisel"</string>
diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml
index efe5297..36000c0 100644
--- a/res/values-ur/strings.xml
+++ b/res/values-ur/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"وال پیپر اور طرز"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"ہوم اسکرین میں ترمیم کریں"</string>
<string name="settings_button_text" msgid="8873672322605444408">"ہوم ترتیبات"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"ایپس"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"آپ کے منتظم کی طرف سے غیر فعال کر دیا گیا"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"ہوم اسکرین گھمانے کی اجازت دیں"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"جب فون گھمایا جاتا ہے"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"اونچائی کم کریں"</string>
<string name="widget_resized" msgid="9130327887929620">"ویجیٹ کے سائز کو چوڑائی <xliff:g id="NUMBER_0">%1$s</xliff:g> اونچائی <xliff:g id="NUMBER_1">%2$s</xliff:g> میں تبدیل کر دیا گیا"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"شارٹ کٹ مینیو"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g> کے لیے ویجیٹ کا سائز تبدیل کرنے کا فریم"</string>
+ <string name="action_close" msgid="1077760267194136901">"بند کریں"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"برخاست کریں"</string>
<string name="accessibility_close" msgid="2277148124685870734">"بند کریں"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"ذاتی"</string>
diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml
index 8d65f8c..72201f5 100644
--- a/res/values-uz/strings.xml
+++ b/res/values-uz/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Fon rasmi va uslubi"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Bosh ekranni tahrirlash"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Bosh ekran sozlamalari"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Ilovalar"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Administrator tomonidan o‘chirilgan"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Bosh ekranni burishga ruxsat"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Telefon burilganda"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Bo‘yini kichraytirish"</string>
<string name="widget_resized" msgid="9130327887929620">"Vidjetning eni <xliff:g id="NUMBER_0">%1$s</xliff:g>, bo‘yi <xliff:g id="NUMBER_1">%2$s</xliff:g> qilib o‘zgartirildi"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Tezkor tugma menyusi"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g> vidjeti oʻlchamini oʻzgartirish freymi"</string>
+ <string name="action_close" msgid="1077760267194136901">"Yopish"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Yopish"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Yopish"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Shaxsiy"</string>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Maxfiy joyga almashtirish"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Oʻrnatish"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Ilovalarni Maxfiy makonga oʻrnatish"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Maxfiy makonga fayllar va boshqalarni qoʻshish"</string>
</resources>
diff --git a/res/values-v31/styles.xml b/res/values-v31/styles.xml
index 932ce38..6ed7dd6 100644
--- a/res/values-v31/styles.xml
+++ b/res/values-v31/styles.xml
@@ -17,7 +17,7 @@
*/
-->
-<resources>
+<resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="HomeSettings.Theme" parent="@android:style/Theme.DeviceDefault.Settings">
<item name="android:listPreferredItemPaddingEnd">16dp</item>
@@ -29,6 +29,7 @@
<item name="android:windowActionBar">false</item>
<item name="android:windowNoTitle">true</item>
<item name="preferenceTheme">@style/HomeSettings.PreferenceTheme</item>
+ <item name="android:fontFamily" android:featureFlag="com.android.launcher3.gsf_res">google-sans-flex</item>
</style>
<style name="HomeSettings.PreferenceTheme" parent="@style/PreferenceThemeOverlay">
@@ -80,11 +81,13 @@
<style name="HomeSettings.CollapsedToolbarTitle"
parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title">
- <item name="android:fontFamily">google-sans</item>
+ <item name="android:fontFamily" android:featureFlag="!com.android.launcher3.gsf_res">google-sans</item>
+ <item name="android:fontFamily" android:featureFlag="com.android.launcher3.gsf_res">variable-title-large</item>
<item name="android:textSize">20sp</item>
</style>
<style name="HomeSettings.ExpandedToolbarTitle" parent="HomeSettings.CollapsedToolbarTitle">
+ <item name="android:fontFamily" android:featureFlag="com.android.launcher3.gsf_res">variable-display-small</item>
<item name="android:textSize">36sp</item>
</style>
</resources>
\ No newline at end of file
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 78cf3e3..a3ecb4e 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Hình nền và phong cách"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Chỉnh sửa Màn hình chính"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Cài đặt màn hình chính"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Ứng dụng"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Bị tắt bởi quản trị viên của bạn"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Cho phép xoay màn hình chính"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Khi xoay điện thoại"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Giảm chiều cao"</string>
<string name="widget_resized" msgid="9130327887929620">"Đã đổi kích thước tiện ích thành chiều rộng <xliff:g id="NUMBER_0">%1$s</xliff:g> chiều cao <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Trình đơn lối tắt"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Khung đổi kích thước tiện ích của <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Đóng"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Loại bỏ"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Đóng"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Cá nhân"</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 6e69045..0b610dc 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"壁纸与风格"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"修改主屏幕"</string>
<string name="settings_button_text" msgid="8873672322605444408">"主屏幕设置"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"应用"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"已被您的管理员停用"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"允许旋转主屏幕"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"手机旋转时"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"减小高度"</string>
<string name="widget_resized" msgid="9130327887929620">"微件尺寸已调整为:宽度 <xliff:g id="NUMBER_0">%1$s</xliff:g>,高度 <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"快捷键菜单"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g>的微件调整大小框架"</string>
+ <string name="action_close" msgid="1077760267194136901">"关闭"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"关闭"</string>
<string name="accessibility_close" msgid="2277148124685870734">"关闭"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"个人"</string>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index 2e0e929..6262df5 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"桌布和樣式"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"編輯主畫面"</string>
<string name="settings_button_text" msgid="8873672322605444408">"主畫面設定"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"應用程式"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"已由你的管理員停用"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"允許旋轉主畫面"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"隨手機旋轉"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"減少高度"</string>
<string name="widget_resized" msgid="9130327887929620">"已調整小工具的大小至闊 <xliff:g id="NUMBER_0">%1$s</xliff:g> 高 <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"快速鍵選單"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"「<xliff:g id="STRING">%1$s</xliff:g>」嘅小工具調整大小框架"</string>
+ <string name="action_close" msgid="1077760267194136901">"閂"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"關閉"</string>
<string name="accessibility_close" msgid="2277148124685870734">"關閉"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"個人"</string>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 2b4a8b3..9bb1056 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"桌布和樣式"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"編輯主畫面"</string>
<string name="settings_button_text" msgid="8873672322605444408">"主畫面設定"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"應用程式"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"已由你的管理員停用"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"允許旋轉主畫面"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"當手機旋轉時"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"減少高度"</string>
<string name="widget_resized" msgid="9130327887929620">"已將小工具的寬度和高度分別調整為 <xliff:g id="NUMBER_0">%1$s</xliff:g> 和 <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"快速鍵選單"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"「<xliff:g id="STRING">%1$s</xliff:g>」的小工具調整大小框架"</string>
+ <string name="action_close" msgid="1077760267194136901">"關閉"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"關閉"</string>
<string name="accessibility_close" msgid="2277148124685870734">"關閉"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"個人"</string>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index dc40b80..82fafc6 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Isithombe sangemuva nesitayela"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Hlela Isikrini Sasekhaya"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Amasethingi asekhaya"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Ama-app"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Kukhutshazwe umlawuli wakho"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Vumela ukuzungezisa kwesikrini sasekhaya"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Uma ifoni iphendukiswa"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Nciphisa ubude"</string>
<string name="widget_resized" msgid="9130327887929620">"Iwijethi inikezwe usayizi omusha ngobubanzi obungu-<xliff:g id="NUMBER_0">%1$s</xliff:g> ubude obungu-<xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Imenyu Yezinqamuleli"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Uhlaka Lokushintsha Usayizi Wewijethi we-<xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Vala"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Cashisa"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Vala"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Okomuntu siqu"</string>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index a15c130..4d0379d 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -315,7 +315,7 @@
<dimen name="page_indicator_gap_width">4dp</dimen>
<dimen name="page_indicator_size">10dp</dimen>
-
+ <dimen name="folder_title_min_width">100dp</dimen>
<dimen name="folder_cell_x_padding">9dp</dimen>
<dimen name="folder_cell_y_padding">6dp</dimen>
<!-- label text size = workspace text size multiplied by this scale -->
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 39206d3..cf6c560 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -373,7 +373,9 @@
<item name="android:background">@drawable/drop_target_background</item>
</style>
- <style name="DropTargetButton" parent="DropTargetButtonBase" />
+ <style name="DropTargetButton" parent="DropTargetButtonBase">
+ <item name="android:fontFamily" android:featureFlag="com.android.launcher3.gsf_res">variable-title-medium</item>
+ </style>
<style name="TextHeadline" parent="@android:style/TextAppearance.DeviceDefault.DialogWindowTitle" />
diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java
index 090208a..e17f5b2 100644
--- a/src/com/android/launcher3/DeviceProfile.java
+++ b/src/com/android/launcher3/DeviceProfile.java
@@ -1950,13 +1950,18 @@
int remainingSpaceOnSide = (availableWidthPxForHotseat - hotseatPlusQSBWidth) / 2;
hotseatBarPadding.set(
- (remainingSpaceOnSide + qsbWidth) + mInsets.left + workspacePadding.left
+ remainingSpaceOnSide + mInsets.left + workspacePadding.left
+ cellLayoutPaddingPx.left,
hotseatBarSizePx - hotseatBarBottomPadding - hotseatCellHeightPx,
remainingSpaceOnSide + mInsets.right + workspacePadding.right
+ cellLayoutPaddingPx.right,
hotseatBarBottomPadding
);
+ if (Utilities.isRtl(context.getResources())) {
+ hotseatBarPadding.right += qsbWidth;
+ } else {
+ hotseatBarPadding.left += qsbWidth;
+ }
} else if (isTaskbarPresent) {
// Center the QSB vertically with hotseat
int hotseatBarBottomPadding = getHotseatBarBottomPadding();
@@ -2077,7 +2082,7 @@
* Returns the number of pixels the hotseat is translated from the bottom of the screen.
*/
private int getHotseatBarBottomPadding() {
- if (isTaskbarPresent) { // QSB on top or inline
+ if (isTaskbarPresent || isQsbInline) { // QSB on top or inline
return hotseatBarBottomSpacePx - (Math.abs(hotseatCellHeightPx - iconSizePx) / 2);
} else {
return hotseatBarSizePx - hotseatCellHeightPx;
diff --git a/src/com/android/launcher3/GridType.kt b/src/com/android/launcher3/GridType.kt
new file mode 100644
index 0000000..d006b8f
--- /dev/null
+++ b/src/com/android/launcher3/GridType.kt
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.launcher3
+
+import androidx.annotation.IntDef
+
+/** The type of grid. */
+@IntDef(GridType.GRID_TYPE_ONE_GRID, GridType.GRID_TYPE_NON_ONE_GRID, GridType.GRID_TYPE_ANY)
+@Retention(AnnotationRetention.SOURCE)
+annotation class GridType {
+ companion object {
+ /** These are grids that use one grid spec. */
+ const val GRID_TYPE_ONE_GRID = 1
+ /** These are grids that don't use one grid spec. */
+ const val GRID_TYPE_NON_ONE_GRID = 2
+ /** Any grid type. */
+ const val GRID_TYPE_ANY = GRID_TYPE_NON_ONE_GRID or GRID_TYPE_ONE_GRID
+ }
+}
diff --git a/src/com/android/launcher3/InvariantDeviceProfile.java b/src/com/android/launcher3/InvariantDeviceProfile.java
index f189549..15a4fc4 100644
--- a/src/com/android/launcher3/InvariantDeviceProfile.java
+++ b/src/com/android/launcher3/InvariantDeviceProfile.java
@@ -16,6 +16,9 @@
package com.android.launcher3;
+import static com.android.launcher3.GridType.GRID_TYPE_ANY;
+import static com.android.launcher3.GridType.GRID_TYPE_NON_ONE_GRID;
+import static com.android.launcher3.GridType.GRID_TYPE_ONE_GRID;
import static com.android.launcher3.LauncherPrefs.DB_FILE;
import static com.android.launcher3.LauncherPrefs.ENABLE_TWOLINE_ALLAPPS_TOGGLE;
import static com.android.launcher3.LauncherPrefs.FIXED_LANDSCAPE_MODE;
@@ -241,6 +244,8 @@
*/
public boolean isFixedLandscape = false;
+ @GridType
+ public int gridType;
public String dbFile;
public int defaultLayoutId;
public int demoModeLayoutId;
@@ -369,6 +374,7 @@
numColumns = closestProfile.numColumns;
numSearchContainerColumns = closestProfile.numSearchContainerColumns;
dbFile = closestProfile.dbFile;
+ gridType = closestProfile.gridType;
defaultLayoutId = closestProfile.defaultLayoutId;
demoModeLayoutId = closestProfile.demoModeLayoutId;
@@ -936,10 +942,7 @@
private static final int DEVICE_CATEGORY_PHONE = 1 << 0;
private static final int DEVICE_CATEGORY_TABLET = 1 << 1;
private static final int DEVICE_CATEGORY_MULTI_DISPLAY = 1 << 2;
- private static final int GRID_TYPE_ONE_GRID = 1 << 0;
- private static final int GRID_TYPE_NON_ONE_GRID = 1 << 1;
- private static final int GRID_TYPE_ALL = 1 << 2;
- private static final int DEVICE_CATEGORY_ALL =
+ private static final int DEVICE_CATEGORY_ANY =
DEVICE_CATEGORY_PHONE | DEVICE_CATEGORY_TABLET | DEVICE_CATEGORY_MULTI_DISPLAY;
private static final int INLINE_QSB_FOR_PORTRAIT = 1 << 0;
@@ -955,6 +958,7 @@
public final int numColumns;
public final int numSearchContainerColumns;
public final int deviceCategory;
+ @GridType
public final int gridType;
private final int[] numFolderRows = new int[COUNT_SIZES];
@@ -1003,7 +1007,7 @@
gridIconId = a.getResourceId(
R.styleable.GridDisplayOption_gridIconId, INVALID_RESOURCE_HANDLE);
deviceCategory = a.getInt(R.styleable.GridDisplayOption_deviceCategory,
- DEVICE_CATEGORY_ALL);
+ DEVICE_CATEGORY_ANY);
mGridSizeSpecsId = a.getResourceId(
R.styleable.GridDisplayOption_gridSizeSpecsId, INVALID_RESOURCE_HANDLE);
mIsDualGrid = a.getBoolean(R.styleable.GridDisplayOption_isDualGrid, false);
@@ -1141,7 +1145,7 @@
}
mIsFixedLandscape = a.getBoolean(R.styleable.GridDisplayOption_isFixedLandscape, false);
- gridType = a.getInt(R.styleable.GridDisplayOption_gridType, GRID_TYPE_ALL);
+ gridType = a.getInt(R.styleable.GridDisplayOption_gridType, GRID_TYPE_ANY);
int inlineForRotation = a.getInt(R.styleable.GridDisplayOption_inlineQsb,
DONT_INLINE_QSB);
diff --git a/src/com/android/launcher3/LauncherPrefs.kt b/src/com/android/launcher3/LauncherPrefs.kt
index 7a04b0f..30c4529 100644
--- a/src/com/android/launcher3/LauncherPrefs.kt
+++ b/src/com/android/launcher3/LauncherPrefs.kt
@@ -20,6 +20,7 @@
import android.content.SharedPreferences
import androidx.annotation.VisibleForTesting
import com.android.launcher3.BuildConfig.WIDGET_ON_FIRST_SCREEN
+import com.android.launcher3.GridType.Companion.GRID_TYPE_ANY
import com.android.launcher3.InvariantDeviceProfile.GRID_NAME_PREFS_KEY
import com.android.launcher3.InvariantDeviceProfile.NON_FIXED_LANDSCAPE_GRID_NAME_PREFS_KEY
import com.android.launcher3.LauncherFiles.DEVICE_PREFERENCES_KEY
@@ -266,6 +267,9 @@
@JvmField
val DB_FILE = backedUpItem(DeviceGridState.KEY_DB_FILE, "", EncryptionType.ENCRYPTED)
@JvmField
+ val GRID_TYPE =
+ backedUpItem(DeviceGridState.KEY_GRID_TYPE, GRID_TYPE_ANY, EncryptionType.ENCRYPTED)
+ @JvmField
val SHOULD_SHOW_SMARTSPACE =
backedUpItem(
SHOULD_SHOW_SMARTSPACE_KEY,
diff --git a/src/com/android/launcher3/ModelCallbacks.kt b/src/com/android/launcher3/ModelCallbacks.kt
index 32b47d0..f38dc41 100644
--- a/src/com/android/launcher3/ModelCallbacks.kt
+++ b/src/com/android/launcher3/ModelCallbacks.kt
@@ -95,7 +95,7 @@
synchronouslyBoundPages = boundPages
pagesToBindSynchronously = LIntSet()
clearPendingBinds()
- if (!launcher.isInState(LauncherState.ALL_APPS)) {
+ if (!launcher.isInState(LauncherState.ALL_APPS) && !Flags.enableWorkspaceInflation()) {
launcher.appsView.appsStore.enableDeferUpdates(AllAppsStore.DEFER_UPDATES_NEXT_DRAW)
pendingTasks.add {
launcher.appsView.appsStore.disableDeferUpdates(
diff --git a/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java b/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java
index f60896e..3d8ebbc 100644
--- a/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java
+++ b/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java
@@ -575,6 +575,7 @@
}
protected void rebindAdapters(boolean force) {
+ Log.d(TAG, "rebindAdapters: force: " + force);
if (mSearchTransitionController.isRunning()) {
mRebindAdaptersAfterSearchAnimation = true;
return;
@@ -583,6 +584,7 @@
boolean showTabs = shouldShowTabs();
if (showTabs == mUsingTabs && !force) {
+ Log.d(TAG, "rebindAdapters: Not needed.");
return;
}
@@ -678,6 +680,7 @@
}
private void replaceAppsRVContainer(boolean showTabs) {
+ Log.d(TAG, "replaceAppsRVContainer: showTabs: " + showTabs);
for (int i = AdapterHolder.MAIN; i <= AdapterHolder.WORK; i++) {
AdapterHolder adapterHolder = mAH.get(i);
if (adapterHolder.mRecyclerView != null) {
@@ -711,7 +714,6 @@
mWorkManager.reset();
post(() -> mAH.get(AdapterHolder.WORK).applyPadding());
-
} else {
mWorkManager.detachWorkUtilityViews();
mViewPager = null;
@@ -1017,6 +1019,7 @@
@VisibleForTesting
public void onAppsUpdated() {
+ Log.d(TAG, "onAppsUpdated; number of apps: " + mAllAppsStore.getApps().length);
mHasWorkApps = Stream.of(mAllAppsStore.getApps())
.anyMatch(mWorkManager.getItemInfoMatcher());
mHasPrivateApps = Stream.of(mAllAppsStore.getApps())
diff --git a/src/com/android/launcher3/allapps/AllAppsStore.java b/src/com/android/launcher3/allapps/AllAppsStore.java
index d5a4022..821027e 100644
--- a/src/com/android/launcher3/allapps/AllAppsStore.java
+++ b/src/com/android/launcher3/allapps/AllAppsStore.java
@@ -20,6 +20,7 @@
import android.content.Context;
import android.os.UserHandle;
+import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
@@ -53,6 +54,7 @@
*/
public class AllAppsStore<T extends Context & ActivityContext> {
+ private static final String TAG = "AllAppsStore";
// Defer updates flag used to defer all apps updates to the next draw.
public static final int DEFER_UPDATES_NEXT_DRAW = 1 << 0;
// Defer updates flag used to defer all apps updates by a test's request.
@@ -102,6 +104,7 @@
public void setApps(@Nullable AppInfo[] apps, int flags, Map<PackageUserKey, Integer> map,
boolean shouldPreinflate) {
mApps = apps == null ? EMPTY_ARRAY : apps;
+ Log.d(TAG, "setApps: apps.length=" + mApps.length);
mModelFlags = flags;
notifyUpdate();
mPackageUserKeytoUidMap = map;
@@ -159,10 +162,12 @@
public void enableDeferUpdates(int flag) {
mDeferUpdatesFlags |= flag;
+ Log.d(TAG, "enableDeferUpdates: " + flag + " mDeferUpdatesFlags=" + mDeferUpdatesFlags);
}
public void disableDeferUpdates(int flag) {
mDeferUpdatesFlags &= ~flag;
+ Log.d(TAG, "disableDeferUpdates: " + flag + " mDeferUpdatesFlags=" + mDeferUpdatesFlags);
if (mDeferUpdatesFlags == 0 && mUpdatePending) {
notifyUpdate();
mUpdatePending = false;
@@ -171,6 +176,9 @@
public void disableDeferUpdatesSilently(int flag) {
mDeferUpdatesFlags &= ~flag;
+ Log.d(TAG, "disableDeferUpdatesSilently: " + flag
+ + " mDeferUpdatesFlags=" + mDeferUpdatesFlags);
+
}
public int getDeferUpdatesFlags() {
@@ -179,9 +187,11 @@
private void notifyUpdate() {
if (mDeferUpdatesFlags != 0) {
+ Log.d(TAG, "notifyUpdate: deferring update");
mUpdatePending = true;
return;
}
+ Log.d(TAG, "notifyUpdate: notifying listeners");
for (OnUpdateListener listener : mUpdateListeners) {
listener.onAppsUpdated();
}
diff --git a/src/com/android/launcher3/dragndrop/FolderAdaptiveIcon.java b/src/com/android/launcher3/dragndrop/FolderAdaptiveIcon.java
index 929e52e..813ed3e 100644
--- a/src/com/android/launcher3/dragndrop/FolderAdaptiveIcon.java
+++ b/src/com/android/launcher3/dragndrop/FolderAdaptiveIcon.java
@@ -38,7 +38,6 @@
import androidx.annotation.UiThread;
import com.android.launcher3.folder.FolderIcon;
-import com.android.launcher3.folder.PreviewBackground;
import com.android.launcher3.icons.BitmapRenderer;
import com.android.launcher3.util.Preconditions;
import com.android.launcher3.views.ActivityContext;
@@ -143,7 +142,6 @@
icon.getPreviewBounds(sTmpRect);
final int previewSize = sTmpRect.width();
- PreviewBackground bg = icon.getFolderBackground();
final int margin = (size - previewSize) / 2;
final float previewShiftX = -sTmpRect.left + margin;
final float previewShiftY = -sTmpRect.top + margin;
@@ -162,11 +160,10 @@
foregroundCanvas.restore();
// Draw background
- Paint backgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
- backgroundPaint.setColor(bg.getBgColor());
- bg.drawShadow(backgroundCanvas);
- backgroundCanvas.drawPaint(backgroundPaint);
- bg.drawBackgroundStroke(backgroundCanvas);
+ backgroundCanvas.save();
+ backgroundCanvas.translate(previewShiftX, previewShiftY);
+ icon.getFolderBackground().drawBackground(backgroundCanvas);
+ backgroundCanvas.restore();
}
@Override
diff --git a/src/com/android/launcher3/folder/Folder.java b/src/com/android/launcher3/folder/Folder.java
index 967af05..996c5e7 100644
--- a/src/com/android/launcher3/folder/Folder.java
+++ b/src/com/android/launcher3/folder/Folder.java
@@ -18,6 +18,7 @@
import static android.text.TextUtils.isEmpty;
+import static com.android.launcher3.Flags.enableLauncherVisualRefresh;
import static com.android.launcher3.LauncherAnimUtils.SPRING_LOADED_EXIT_DELAY;
import static com.android.launcher3.LauncherState.EDIT_MODE;
import static com.android.launcher3.LauncherState.NORMAL;
@@ -299,6 +300,13 @@
mContent.setFolder(this);
mPageIndicator = findViewById(R.id.folder_page_indicator);
+ if (enableLauncherVisualRefresh()) {
+ MarginLayoutParams params = ((MarginLayoutParams) mPageIndicator.getLayoutParams());
+ int horizontalMargin = getContext().getResources()
+ .getDimensionPixelSize(R.dimen.folder_footer_horiz_padding);
+ params.setMarginStart(horizontalMargin);
+ params.setMarginEnd(horizontalMargin);
+ }
mFooter = findViewById(R.id.folder_footer);
mFooterHeight = dp.folderFooterHeightPx;
mFolderName = findViewById(R.id.folder_name);
@@ -312,7 +320,6 @@
| InputType.TYPE_TEXT_FLAG_CAP_WORDS);
mFolderName.forceDisableSuggestions(true);
-
mKeyboardInsetAnimationCallback = new KeyboardInsetAnimationCallback(this);
setWindowInsetsAnimationCallback(mKeyboardInsetAnimationCallback);
}
@@ -1270,6 +1277,23 @@
}
/**
+ * If the Folder Title has less than 100dp of available width, we hide it. The reason we do this
+ * calculation in onSizeChange is because this callback is called 1x when the folder is opened.
+ * <p>
+ * The PageIndicator and the Folder Title share the same horizontal linear layout, but both
+ * are dynamically sized. Therefore, we are setting visibility of the folder title AFTER the
+ * layout is measured.
+ */
+ @Override
+ protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+ super.onSizeChanged(w, h, oldw, oldh);
+ int minTitleWidth = getResources().getDimensionPixelSize(R.dimen.folder_title_min_width);
+ if (enableLauncherVisualRefresh() && mFolderName.getMeasuredWidth() < minTitleWidth) {
+ mFolderName.setVisibility(View.GONE);
+ }
+ }
+
+ /**
* Rearranges the children based on their rank.
*/
public void rearrangeChildren() {
diff --git a/src/com/android/launcher3/icons/IconCache.java b/src/com/android/launcher3/icons/IconCache.java
index 119a6b1..1e80d03 100644
--- a/src/com/android/launcher3/icons/IconCache.java
+++ b/src/com/android/launcher3/icons/IconCache.java
@@ -159,9 +159,15 @@
*/
public synchronized void updateIconsForPkg(@NonNull final String packageName,
@NonNull final UserHandle user) {
+ List<LauncherActivityInfo> apps = mLauncherApps.getActivityList(packageName, user);
+ if (Flags.restoreArchivedAppIconsFromDb()
+ && apps.stream().anyMatch(app -> app.getApplicationInfo().isArchived)) {
+ // When archiving app icon, don't delete old icon so it can be re-used.
+ return;
+ }
removeIconsForPkg(packageName, user);
long userSerial = mUserManager.getSerialNumberForUser(user);
- for (LauncherActivityInfo app : mLauncherApps.getActivityList(packageName, user)) {
+ for (LauncherActivityInfo app : apps) {
addIconToDBAndMemCache(app, LauncherActivityCachingLogic.INSTANCE, userSerial);
}
}
diff --git a/src/com/android/launcher3/logging/StatsLogManager.java b/src/com/android/launcher3/logging/StatsLogManager.java
index 44d2e26..40b597f 100644
--- a/src/com/android/launcher3/logging/StatsLogManager.java
+++ b/src/com/android/launcher3/logging/StatsLogManager.java
@@ -890,6 +890,12 @@
@UiEvent(doc = "Row shift grid migration occurred")
LAUNCHER_ROW_SHIFT_GRID_MIGRATION(2201),
+ @UiEvent(doc = "Do standard migration when upgrading to one grid")
+ LAUNCHER_STANDARD_ONE_GRID_MIGRATION(2205),
+
+ @UiEvent(doc = "Do row shift migration when upgrading to one grid")
+ LAUNCHER_ROW_SHIFT_ONE_GRID_MIGRATION(2206),
+
// ADD MORE
;
diff --git a/src/com/android/launcher3/model/BaseLauncherBinder.java b/src/com/android/launcher3/model/BaseLauncherBinder.java
index c4bbae4..1d19a17 100644
--- a/src/com/android/launcher3/model/BaseLauncherBinder.java
+++ b/src/com/android/launcher3/model/BaseLauncherBinder.java
@@ -323,8 +323,10 @@
Executor pendingExecutor = pendingTasks::add;
RunnableList onCompleteSignal = new RunnableList();
+ onCompleteSignal.add(() -> Log.d(TAG, "Calling onCompleteSignal"));
if (enableWorkspaceInflation() && inflater != null) {
+ Log.d(TAG, "Starting async inflation");
MODEL_EXECUTOR.execute(() -> {
inflateAsyncAndBind(otherWorkspaceItems, inflater, pendingExecutor);
inflateAsyncAndBind(otherAppWidgets, inflater, pendingExecutor);
@@ -335,6 +337,7 @@
MAIN_EXECUTOR.execute(onCompleteSignal::executeAllAndDestroy);
});
} else {
+ Log.d(TAG, "Starting sync inflation");
bindItemsInChunks(otherWorkspaceItems, ITEMS_CHUNK, pendingExecutor);
bindItemsInChunks(otherAppWidgets, 1, pendingExecutor);
setupPendingBind(currentScreenIds, pendingExecutor);
diff --git a/src/com/android/launcher3/model/DeviceGridState.java b/src/com/android/launcher3/model/DeviceGridState.java
index 96ce4c8..32ea4b5 100644
--- a/src/com/android/launcher3/model/DeviceGridState.java
+++ b/src/com/android/launcher3/model/DeviceGridState.java
@@ -19,6 +19,7 @@
import static com.android.launcher3.InvariantDeviceProfile.DeviceType;
import static com.android.launcher3.LauncherPrefs.DB_FILE;
import static com.android.launcher3.LauncherPrefs.DEVICE_TYPE;
+import static com.android.launcher3.LauncherPrefs.GRID_TYPE;
import static com.android.launcher3.LauncherPrefs.HOTSEAT_COUNT;
import static com.android.launcher3.LauncherPrefs.WORKSPACE_SIZE;
@@ -41,17 +42,21 @@
public static final String KEY_HOTSEAT_COUNT = "migration_src_hotseat_count";
public static final String KEY_DEVICE_TYPE = "migration_src_device_type";
public static final String KEY_DB_FILE = "migration_src_db_file";
+ public static final String KEY_GRID_TYPE = "migration_src_grid_type";
private final String mGridSizeString;
private final int mNumHotseat;
private final @DeviceType int mDeviceType;
private final String mDbFile;
+ private final int mGridType;
- public DeviceGridState(int columns, int row, int numHotseat, int deviceType, String dbFile) {
+ public DeviceGridState(int columns, int row, int numHotseat, int deviceType, String dbFile,
+ int gridType) {
mGridSizeString = String.format(Locale.ENGLISH, "%d,%d", columns, row);
mNumHotseat = numHotseat;
mDeviceType = deviceType;
mDbFile = dbFile;
+ mGridType = gridType;
}
public DeviceGridState(InvariantDeviceProfile idp) {
@@ -59,6 +64,7 @@
mNumHotseat = idp.numDatabaseHotseatIcons;
mDeviceType = idp.deviceType;
mDbFile = idp.dbFile;
+ mGridType = idp.gridType;
}
public DeviceGridState(Context context) {
@@ -70,6 +76,7 @@
mNumHotseat = lp.get(HOTSEAT_COUNT);
mDeviceType = lp.get(DEVICE_TYPE);
mDbFile = lp.get(DB_FILE);
+ mGridType = lp.get(GRID_TYPE);
}
/**
@@ -94,6 +101,13 @@
}
/**
+ * Returns the grid type.
+ */
+ public int getGridType() {
+ return mGridType;
+ }
+
+ /**
* Stores the device state to shared preferences
*/
public void writeToPrefs(Context context) {
@@ -101,7 +115,9 @@
WORKSPACE_SIZE.to(mGridSizeString),
HOTSEAT_COUNT.to(mNumHotseat),
DEVICE_TYPE.to(mDeviceType),
- DB_FILE.to(mDbFile));
+ DB_FILE.to(mDbFile),
+ GRID_TYPE.to(mGridType));
+
}
/**
diff --git a/src/com/android/launcher3/model/GridSizeMigrationDBController.java b/src/com/android/launcher3/model/GridSizeMigrationDBController.java
index 3e43943..12ba07d 100644
--- a/src/com/android/launcher3/model/GridSizeMigrationDBController.java
+++ b/src/com/android/launcher3/model/GridSizeMigrationDBController.java
@@ -17,11 +17,16 @@
package com.android.launcher3.model;
import static com.android.launcher3.Flags.enableSmartspaceRemovalToggle;
+import static com.android.launcher3.GridType.GRID_TYPE_NON_ONE_GRID;
+import static com.android.launcher3.GridType.GRID_TYPE_ONE_GRID;
+import static com.android.launcher3.InvariantDeviceProfile.TYPE_TABLET;
import static com.android.launcher3.LauncherSettings.Favorites.TABLE_NAME;
import static com.android.launcher3.LauncherSettings.Favorites.TMP_TABLE;
import static com.android.launcher3.Utilities.SHOULD_SHOW_FIRST_PAGE_WIDGET;
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_ROW_SHIFT_GRID_MIGRATION;
+import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_ROW_SHIFT_ONE_GRID_MIGRATION;
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_STANDARD_GRID_MIGRATION;
+import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_STANDARD_ONE_GRID_MIGRATION;
import static com.android.launcher3.model.LoaderTask.SMARTSPACE_ON_HOME_SCREEN;
import static com.android.launcher3.provider.LauncherDbUtils.copyTable;
import static com.android.launcher3.provider.LauncherDbUtils.dropTable;
@@ -157,6 +162,9 @@
// Save current configuration, so that the migration does not run again.
destDeviceState.writeToPrefs(context);
t.commit();
+ if (isOneGridMigration(srcDeviceState, destDeviceState)) {
+ statsLogManager.logger().log(LAUNCHER_ROW_SHIFT_ONE_GRID_MIGRATION);
+ }
statsLogManager.logger().log(LAUNCHER_ROW_SHIFT_GRID_MIGRATION);
return true;
}
@@ -169,6 +177,9 @@
destDeviceState.getNumHotseat(), targetSize, srcDeviceState, destDeviceState);
dropTable(t.getDb(), TMP_TABLE);
t.commit();
+ if (isOneGridMigration(srcDeviceState, destDeviceState)) {
+ statsLogManager.logger().log(LAUNCHER_STANDARD_ONE_GRID_MIGRATION);
+ }
statsLogManager.logger().log(LAUNCHER_STANDARD_GRID_MIGRATION);
return true;
} catch (Exception e) {
@@ -291,6 +302,12 @@
return true;
}
+ protected static boolean isOneGridMigration(DeviceGridState srcDeviceState,
+ DeviceGridState destDeviceState) {
+ return srcDeviceState.getDeviceType() != TYPE_TABLET
+ && srcDeviceState.getGridType() == GRID_TYPE_NON_ONE_GRID
+ && destDeviceState.getGridType() == GRID_TYPE_ONE_GRID;
+ }
/**
* Calculate the differences between {@code src} (denoted by A) and {@code dest}
* (denoted by B).
diff --git a/src/com/android/launcher3/model/GridSizeMigrationLogic.kt b/src/com/android/launcher3/model/GridSizeMigrationLogic.kt
index 2957e3c..d88f6cc 100644
--- a/src/com/android/launcher3/model/GridSizeMigrationLogic.kt
+++ b/src/com/android/launcher3/model/GridSizeMigrationLogic.kt
@@ -32,8 +32,11 @@
import com.android.launcher3.logging.FileLog
import com.android.launcher3.logging.StatsLogManager
import com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_ROW_SHIFT_GRID_MIGRATION
+import com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_ROW_SHIFT_ONE_GRID_MIGRATION
import com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_STANDARD_GRID_MIGRATION
+import com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_STANDARD_ONE_GRID_MIGRATION
import com.android.launcher3.model.GridSizeMigrationDBController.DbReader
+import com.android.launcher3.model.GridSizeMigrationDBController.isOneGridMigration
import com.android.launcher3.provider.LauncherDbUtils.SQLiteTransaction
import com.android.launcher3.provider.LauncherDbUtils.copyTable
import com.android.launcher3.provider.LauncherDbUtils.dropTable
@@ -95,7 +98,12 @@
// Save current configuration, so that the migration does not run again.
destDeviceState.writeToPrefs(context)
t.commit()
+
+ if (isOneGridMigration(srcDeviceState, destDeviceState)) {
+ statsLogManager.logger().log(LAUNCHER_ROW_SHIFT_ONE_GRID_MIGRATION)
+ }
statsLogManager.logger().log(LAUNCHER_ROW_SHIFT_GRID_MIGRATION)
+
return
}
@@ -125,6 +133,10 @@
dropTable(t.db, TMP_TABLE)
t.commit()
+
+ if (isOneGridMigration(srcDeviceState, destDeviceState)) {
+ statsLogManager.logger().log(LAUNCHER_STANDARD_ONE_GRID_MIGRATION)
+ }
statsLogManager.logger().log(LAUNCHER_STANDARD_GRID_MIGRATION)
}
} catch (e: Exception) {
diff --git a/src/com/android/launcher3/model/LoaderCursor.java b/src/com/android/launcher3/model/LoaderCursor.java
index efe6157..8f116bb 100644
--- a/src/com/android/launcher3/model/LoaderCursor.java
+++ b/src/com/android/launcher3/model/LoaderCursor.java
@@ -326,6 +326,7 @@
// the fallback icon
if (!loadIconFromDb(info)) {
+ FileLog.d(TAG, "loadIconFromDb failed, getting from cache - intent=" + intent);
mIconCache.getTitleAndIcon(info, DEFAULT_LOOKUP_FLAG);
}
diff --git a/src/com/android/launcher3/model/LoaderTask.java b/src/com/android/launcher3/model/LoaderTask.java
index 78e5d89..6dc20de 100644
--- a/src/com/android/launcher3/model/LoaderTask.java
+++ b/src/com/android/launcher3/model/LoaderTask.java
@@ -762,7 +762,7 @@
}
IconRequestInfo<AppInfo> iconRequestInfo = getAppInfoIconRequestInfo(
- appInfo, app, mWorkspaceIconRequestInfos);
+ appInfo, app, mWorkspaceIconRequestInfos, mIsRestoreFromBackup);
allAppsItemRequestInfos.add(iconRequestInfo);
mBgAllAppsList.add(appInfo, app, false);
}
@@ -831,9 +831,10 @@
IconRequestInfo<AppInfo> getAppInfoIconRequestInfo(
AppInfo appInfo,
LauncherActivityInfo activityInfo,
- List<IconRequestInfo<WorkspaceItemInfo>> workspaceRequestInfos
+ List<IconRequestInfo<WorkspaceItemInfo>> workspaceRequestInfos,
+ boolean isRestoreFromBackup
) {
- if (Flags.restoreArchivedAppIconsFromDb()) {
+ if (Flags.restoreArchivedAppIconsFromDb() && isRestoreFromBackup) {
Optional<IconRequestInfo<WorkspaceItemInfo>> workspaceIconRequest =
workspaceRequestInfos.stream()
.filter(request -> appInfo.getTargetComponent().equals(
diff --git a/src/com/android/launcher3/model/WorkspaceItemProcessor.kt b/src/com/android/launcher3/model/WorkspaceItemProcessor.kt
index 7b8f218..bf71099 100644
--- a/src/com/android/launcher3/model/WorkspaceItemProcessor.kt
+++ b/src/com/android/launcher3/model/WorkspaceItemProcessor.kt
@@ -524,15 +524,14 @@
WidgetInflater.TYPE_PENDING -> {
tempPackageKey.update(component.packageName, c.user)
val si = installingPkgs[tempPackageKey]
-
+ val isArchived =
+ ApplicationInfoWrapper(context, component.packageName, c.user).isArchived()
if (
!c.hasRestoreFlag(LauncherAppWidgetInfo.FLAG_RESTORE_STARTED) &&
!isSafeMode &&
(si == null) &&
(lapi == null) &&
- !(Flags.enableSupportForArchiving() &&
- ApplicationInfoWrapper(context, component.packageName, c.user)
- .isArchived())
+ !isArchived
) {
// Restore never started
c.markDeleted(
@@ -559,7 +558,13 @@
appWidgetInfo.providerName,
appWidgetInfo.user,
)
- iconCache.getTitleAndIconForApp(appWidgetInfo.pendingItemInfo, DEFAULT_LOOKUP_FLAG)
+ val iconLookupFlag =
+ if (isArchived && Flags.restoreArchivedAppIconsFromDb()) {
+ DEFAULT_LOOKUP_FLAG.withSkipAddToMemCache()
+ } else {
+ DEFAULT_LOOKUP_FLAG
+ }
+ iconCache.getTitleAndIconForApp(appWidgetInfo.pendingItemInfo, iconLookupFlag)
}
WidgetInflater.TYPE_REAL ->
WidgetSizes.updateWidgetSizeRangesAsync(
diff --git a/src/com/android/launcher3/pageindicators/PageIndicatorDots.java b/src/com/android/launcher3/pageindicators/PageIndicatorDots.java
index 384f876..8f80515 100644
--- a/src/com/android/launcher3/pageindicators/PageIndicatorDots.java
+++ b/src/com/android/launcher3/pageindicators/PageIndicatorDots.java
@@ -600,6 +600,13 @@
}
if (Math.round(mCurrentPosition) == i) {
sLastActiveRect.set(sTempRect);
+ if (mCurrentPosition == 0) {
+ // The outline is calculated before onDraw is called. If the user has
+ // paginated, closed the folder, and opened the folder again, the
+ // first drawn outline will use stale bounds.
+ // Invalidation is cheap, and is only needed when scroll is 0.
+ invalidateOutline();
+ }
}
canvas.drawRoundRect(sTempRect, mDotRadius, mDotRadius, mPaginationPaint);
diff --git a/src/com/android/launcher3/popup/PopupContainerWithArrow.java b/src/com/android/launcher3/popup/PopupContainerWithArrow.java
index 39f68bf..9a226df 100644
--- a/src/com/android/launcher3/popup/PopupContainerWithArrow.java
+++ b/src/com/android/launcher3/popup/PopupContainerWithArrow.java
@@ -24,7 +24,9 @@
import static com.android.launcher3.allapps.AlphabeticalAppsList.PRIVATE_SPACE_PACKAGE;
import static com.android.launcher3.model.data.ItemInfoWithIcon.FLAG_NOT_PINNABLE;
import static com.android.launcher3.popup.PopupPopulator.MAX_SHORTCUTS;
+import static com.android.launcher3.shortcuts.DeepShortcutTextView.GOOGLE_SANS_FLEX_LABEL_LARGE;
import static com.android.launcher3.util.Executors.MODEL_EXECUTOR;
+import static com.android.wm.shell.Flags.enableGsf;
import android.animation.AnimatorSet;
import android.animation.LayoutTransition;
@@ -32,6 +34,7 @@
import android.graphics.Point;
import android.graphics.PointF;
import android.graphics.Rect;
+import android.graphics.Typeface;
import android.os.Handler;
import android.os.Looper;
import android.util.AttributeSet;
@@ -479,6 +482,10 @@
if (view instanceof DeepShortcutView) {
// System shortcut takes entire row with icon and text
final DeepShortcutView shortcutView = (DeepShortcutView) view;
+ if (enableGsf()) {
+ shortcutView.getBubbleText().setTypeface(
+ Typeface.create(GOOGLE_SANS_FLEX_LABEL_LARGE, Typeface.NORMAL));
+ }
info.setIconAndLabelFor(shortcutView.getIconView(), shortcutView.getBubbleText());
} else if (view instanceof ImageView) {
// System shortcut is just an icon
diff --git a/src/com/android/launcher3/shortcuts/DeepShortcutTextView.java b/src/com/android/launcher3/shortcuts/DeepShortcutTextView.java
index ded2cee..b1d095b 100644
--- a/src/com/android/launcher3/shortcuts/DeepShortcutTextView.java
+++ b/src/com/android/launcher3/shortcuts/DeepShortcutTextView.java
@@ -16,9 +16,12 @@
package com.android.launcher3.shortcuts;
+import static com.android.wm.shell.Flags.enableGsf;
+
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Rect;
+import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.text.TextUtils;
import android.util.AttributeSet;
@@ -31,6 +34,7 @@
* A {@link BubbleTextView} that has the shortcut icon on the left and drag handle on the right.
*/
public class DeepShortcutTextView extends BubbleTextView {
+ public static final String GOOGLE_SANS_FLEX_LABEL_LARGE = "variable-label-large";
private boolean mShowLoadingState;
private Drawable mLoadingStatePlaceholder;
@@ -47,6 +51,9 @@
public DeepShortcutTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
showLoadingState(true);
+ if (enableGsf()) {
+ setTypeface(Typeface.create(GOOGLE_SANS_FLEX_LABEL_LARGE, Typeface.NORMAL));
+ }
}
@Override
diff --git a/src/com/android/launcher3/util/ViewOnDrawExecutor.java b/src/com/android/launcher3/util/ViewOnDrawExecutor.java
index 26bfd36..dad7629 100644
--- a/src/com/android/launcher3/util/ViewOnDrawExecutor.java
+++ b/src/com/android/launcher3/util/ViewOnDrawExecutor.java
@@ -16,6 +16,7 @@
package com.android.launcher3.util;
+import android.util.Log;
import android.view.View;
import android.view.View.OnAttachStateChangeListener;
import android.view.ViewTreeObserver.OnDrawListener;
@@ -32,6 +33,7 @@
public class ViewOnDrawExecutor implements OnDrawListener, Runnable,
OnAttachStateChangeListener {
+ private static final String TAG = "ViewOnDrawExecutor";
private final RunnableList mTasks;
private final Consumer<ViewOnDrawExecutor> mOnClearCallback;
private View mAttachedView;
@@ -88,7 +90,10 @@
* Executes all tasks immediately
*/
public void markCompleted() {
- if (!mCancelled) {
+ if (mCancelled) {
+ Log.d(TAG, "markCompleted ignored: cancelled");
+ } else {
+ Log.d(TAG, "markCompleted: executing tasks");
mTasks.executeAllAndDestroy();
}
mCompleted = true;
@@ -101,6 +106,7 @@
}
public void cancel() {
+ Log.d(TAG, "Cancelling tasks");
mCancelled = true;
markCompleted();
}
diff --git a/tests/multivalentTests/src/com/android/launcher3/AbstractDeviceProfileTest.kt b/tests/multivalentTests/src/com/android/launcher3/AbstractDeviceProfileTest.kt
index a30261e..dc49ba0 100644
--- a/tests/multivalentTests/src/com/android/launcher3/AbstractDeviceProfileTest.kt
+++ b/tests/multivalentTests/src/com/android/launcher3/AbstractDeviceProfileTest.kt
@@ -39,7 +39,6 @@
import com.android.launcher3.util.SandboxContext
import com.android.launcher3.util.WindowBounds
import com.android.launcher3.util.rule.TestStabilityRule
-import com.android.launcher3.util.rule.ZipFilesRule
import com.android.launcher3.util.rule.setFlags
import com.android.launcher3.util.window.CachedDisplayInfo
import com.android.launcher3.util.window.WindowManagerProxy
@@ -52,7 +51,6 @@
import java.io.StringWriter
import kotlin.math.max
import kotlin.math.min
-import org.junit.ClassRule
import org.junit.Rule
import org.mockito.kotlin.any
import org.mockito.kotlin.doReturn
@@ -82,13 +80,6 @@
@Rule @JvmField val limitDevicesRule = LimitDevicesRule()
- companion object {
- @ClassRule
- @JvmField
- val resultZipRule =
- ZipFilesRule(InstrumentationRegistry.getInstrumentation().targetContext, "DumpTest")
- }
-
class DeviceSpec(
val naturalSize: Pair<Int, Int>,
var densityDpi: Int,
@@ -375,7 +366,6 @@
private fun writeToDevice(context: Context, fileName: String, content: String) {
val file = File(context.getDir("dumpTests", Context.MODE_PRIVATE), fileName)
file.writeText(content)
- resultZipRule.write(file)
}
protected fun Float.dpToPx(): Float {
diff --git a/tests/multivalentTests/src/com/android/launcher3/model/gridmigration/ValidGridMigrationUnitTest.kt b/tests/multivalentTests/src/com/android/launcher3/model/gridmigration/ValidGridMigrationUnitTest.kt
index 1d1e7eb..dd26ed2 100644
--- a/tests/multivalentTests/src/com/android/launcher3/model/gridmigration/ValidGridMigrationUnitTest.kt
+++ b/tests/multivalentTests/src/com/android/launcher3/model/gridmigration/ValidGridMigrationUnitTest.kt
@@ -27,6 +27,7 @@
import androidx.test.filters.SmallTest
import androidx.test.platform.app.InstrumentationRegistry
import com.android.launcher3.Flags
+import com.android.launcher3.GridType.Companion.GRID_TYPE_ANY
import com.android.launcher3.InvariantDeviceProfile
import com.android.launcher3.LauncherSettings.Favorites
import com.android.launcher3.celllayout.testgenerator.ValidGridMigrationTestCaseGenerator
@@ -46,7 +47,14 @@
private data class Grid(val tableName: String, val size: Point, val items: List<WorkspaceItem>) {
fun toGridState(): DeviceGridState =
- DeviceGridState(size.x, size.y, size.x, InvariantDeviceProfile.TYPE_PHONE, tableName)
+ DeviceGridState(
+ size.x,
+ size.y,
+ size.x,
+ InvariantDeviceProfile.TYPE_PHONE,
+ tableName,
+ GRID_TYPE_ANY,
+ )
}
@SmallTest
diff --git a/tests/src/com/android/launcher3/model/GridMigrationTest.kt b/tests/src/com/android/launcher3/model/GridMigrationTest.kt
index 380c208..eed373f 100644
--- a/tests/src/com/android/launcher3/model/GridMigrationTest.kt
+++ b/tests/src/com/android/launcher3/model/GridMigrationTest.kt
@@ -22,6 +22,7 @@
import androidx.test.filters.SmallTest
import androidx.test.platform.app.InstrumentationRegistry
import com.android.launcher3.Flags
+import com.android.launcher3.GridType.Companion.GRID_TYPE_ANY
import com.android.launcher3.InvariantDeviceProfile.TYPE_PHONE
import com.android.launcher3.LauncherSettings.Favorites.TABLE_NAME
import com.android.launcher3.celllayout.board.CellLayoutBoard
@@ -192,15 +193,22 @@
@Test
fun `5x5 to 3x3`() =
runTest(
- src = GridMigrationData(DB_FILE, DeviceGridState(5, 5, 5, TYPE_PHONE, DB_FILE)),
+ src =
+ GridMigrationData(
+ DB_FILE,
+ DeviceGridState(5, 5, 5, TYPE_PHONE, DB_FILE, GRID_TYPE_ANY),
+ ),
dst =
GridMigrationData(
null, // in memory db, to download a new db change null for
// the filename of the db name to store it. Do not use existing names.
- DeviceGridState(3, 3, 3, TYPE_PHONE, ""),
+ DeviceGridState(3, 3, 3, TYPE_PHONE, "", GRID_TYPE_ANY),
),
target =
- GridMigrationData("result5x5to3x3.db", DeviceGridState(3, 3, 3, TYPE_PHONE, "")),
+ GridMigrationData(
+ "result5x5to3x3.db",
+ DeviceGridState(3, 3, 3, TYPE_PHONE, "", GRID_TYPE_ANY),
+ ),
)
@JvmField
@@ -215,15 +223,22 @@
@Test
fun `5x5 to 4x7`() =
runTest(
- src = GridMigrationData(DB_FILE, DeviceGridState(5, 5, 5, TYPE_PHONE, DB_FILE)),
+ src =
+ GridMigrationData(
+ DB_FILE,
+ DeviceGridState(5, 5, 5, TYPE_PHONE, DB_FILE, GRID_TYPE_ANY),
+ ),
dst =
GridMigrationData(
null, // in memory db, to download a new db change null for
// the filename of the db name to store it. Do not use existing names.
- DeviceGridState(4, 7, 4, TYPE_PHONE, ""),
+ DeviceGridState(4, 7, 4, TYPE_PHONE, "", GRID_TYPE_ANY),
),
target =
- GridMigrationData("result5x5to4x7.db", DeviceGridState(4, 7, 4, TYPE_PHONE, "")),
+ GridMigrationData(
+ "result5x5to4x7.db",
+ DeviceGridState(4, 7, 4, TYPE_PHONE, "", GRID_TYPE_ANY),
+ ),
)
@JvmField
@@ -238,16 +253,23 @@
@Test
fun `5x5 to 5x8`() =
runTest(
- src = GridMigrationData(DB_FILE, DeviceGridState(5, 5, 5, TYPE_PHONE, DB_FILE)),
+ src =
+ GridMigrationData(
+ DB_FILE,
+ DeviceGridState(5, 5, 5, TYPE_PHONE, DB_FILE, GRID_TYPE_ANY),
+ ),
dst =
GridMigrationData(
null, // in memory db, to download a new db change null
// for
// the filename of the db name to store it. Do not use existing names.
- DeviceGridState(5, 8, 5, TYPE_PHONE, ""),
+ DeviceGridState(5, 8, 5, TYPE_PHONE, "", GRID_TYPE_ANY),
),
target =
- GridMigrationData("result5x5to5x8.db", DeviceGridState(5, 8, 5, TYPE_PHONE, "")),
+ GridMigrationData(
+ "result5x5to5x8.db",
+ DeviceGridState(5, 8, 5, TYPE_PHONE, "", GRID_TYPE_ANY),
+ ),
)
companion object {
diff --git a/tests/src/com/android/launcher3/model/LoaderTaskTest.kt b/tests/src/com/android/launcher3/model/LoaderTaskTest.kt
index 560d306..f9c4a17 100644
--- a/tests/src/com/android/launcher3/model/LoaderTaskTest.kt
+++ b/tests/src/com/android/launcher3/model/LoaderTaskTest.kt
@@ -466,8 +466,7 @@
@Test
@EnableFlags(Flags.FLAG_RESTORE_ARCHIVED_APP_ICONS_FROM_DB)
- fun `When flag on then archived AllApps icons found on Workspace loaded from db`() {
- // Given
+ fun `When flag on and restore then archived AllApps icons on Workspace load from db`() {
// Given
val activityInfo: LauncherActivityInfo = mock()
val applicationInfo: ApplicationInfo = mock<ApplicationInfo>().apply { isArchived = true }
@@ -490,7 +489,12 @@
val loader =
testComponent.getLoaderTaskFactory().newLoaderTask(launcherBinder, userManagerState)
val actualIconRequest =
- loader.getAppInfoIconRequestInfo(expectedAppInfo, activityInfo, workspaceIconRequests)
+ loader.getAppInfoIconRequestInfo(
+ expectedAppInfo,
+ activityInfo,
+ workspaceIconRequests,
+ /* isRestoreFromBackup */ true,
+ )
// Then
assertThat(actualIconRequest.iconBlob).isEqualTo(expectedIconBlob)
assertThat(actualIconRequest.itemInfo).isEqualTo(expectedAppInfo)
@@ -498,7 +502,43 @@
@Test
@EnableFlags(Flags.FLAG_RESTORE_ARCHIVED_APP_ICONS_FROM_DB)
- fun `When flag on then unarchived AllApps icons not loaded from db`() {
+ fun `When flag on and not restore then archived AllApps icons do not load from db`() {
+ // Given
+ val activityInfo: LauncherActivityInfo = mock()
+ val applicationInfo: ApplicationInfo = mock<ApplicationInfo>().apply { isArchived = true }
+ whenever(activityInfo.applicationInfo).thenReturn(applicationInfo)
+ val expectedIconBlob = byteArrayOf(0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08)
+ val expectedComponent = ComponentName("package", "class")
+ val workspaceIconRequests =
+ listOf(
+ IconRequestInfo<WorkspaceItemInfo>(
+ WorkspaceItemInfo().apply {
+ intent = Intent().apply { component = expectedComponent }
+ },
+ activityInfo,
+ expectedIconBlob,
+ false, /* useLowResIcon */
+ )
+ )
+ val expectedAppInfo = AppInfo().apply { componentName = expectedComponent }
+ // When
+ val loader =
+ testComponent.getLoaderTaskFactory().newLoaderTask(launcherBinder, userManagerState)
+ val actualIconRequest =
+ loader.getAppInfoIconRequestInfo(
+ expectedAppInfo,
+ activityInfo,
+ workspaceIconRequests,
+ /* isRestoreFromBackup */ false,
+ )
+ // Then
+ assertThat(actualIconRequest.iconBlob).isNull()
+ assertThat(actualIconRequest.itemInfo).isEqualTo(expectedAppInfo)
+ }
+
+ @Test
+ @EnableFlags(Flags.FLAG_RESTORE_ARCHIVED_APP_ICONS_FROM_DB)
+ fun `When flag on and restore then unarchived AllApps icons not loaded from db`() {
// Given
val activityInfo: LauncherActivityInfo = mock()
val applicationInfo: ApplicationInfo = mock<ApplicationInfo>().apply { isArchived = false }
@@ -521,7 +561,12 @@
val loader =
testComponent.getLoaderTaskFactory().newLoaderTask(launcherBinder, userManagerState)
val actualIconRequest =
- loader.getAppInfoIconRequestInfo(expectedAppInfo, activityInfo, workspaceIconRequests)
+ loader.getAppInfoIconRequestInfo(
+ expectedAppInfo,
+ activityInfo,
+ workspaceIconRequests,
+ /* isRestoreFromBackup */ true,
+ )
// Then
assertThat(actualIconRequest.iconBlob).isNull()
assertThat(actualIconRequest.itemInfo).isEqualTo(expectedAppInfo)
@@ -529,7 +574,7 @@
@Test
@EnableFlags(Flags.FLAG_RESTORE_ARCHIVED_APP_ICONS_FROM_DB)
- fun `When flag on then archived AllApps icon not found on Workspace not loaded from db`() {
+ fun `When flag on and restore then all apps icon not on workspace is not loaded from db`() {
// Given
val activityInfo: LauncherActivityInfo = mock()
val applicationInfo: ApplicationInfo = mock<ApplicationInfo>().apply { isArchived = true }
@@ -553,7 +598,12 @@
val loader =
testComponent.getLoaderTaskFactory().newLoaderTask(launcherBinder, userManagerState)
val actualIconRequest =
- loader.getAppInfoIconRequestInfo(expectedAppInfo, activityInfo, workspaceIconRequests)
+ loader.getAppInfoIconRequestInfo(
+ expectedAppInfo,
+ activityInfo,
+ workspaceIconRequests,
+ /* isRestoreFromBackup */ true,
+ )
// Then
assertThat(actualIconRequest.iconBlob).isNull()
assertThat(actualIconRequest.itemInfo).isEqualTo(expectedAppInfo)
@@ -561,7 +611,7 @@
@Test
@DisableFlags(Flags.FLAG_RESTORE_ARCHIVED_APP_ICONS_FROM_DB)
- fun `When flag off then archived AllApps icons not loaded from db`() {
+ fun `When flag off and restore then archived AllApps icons not loaded from db`() {
// Given
val activityInfo: LauncherActivityInfo = mock()
val applicationInfo: ApplicationInfo = mock<ApplicationInfo>().apply { isArchived = true }
@@ -581,7 +631,12 @@
val loader =
testComponent.getLoaderTaskFactory().newLoaderTask(launcherBinder, userManagerState)
val actualIconRequest =
- loader.getAppInfoIconRequestInfo(expectedAppInfo, activityInfo, workspaceIconRequests)
+ loader.getAppInfoIconRequestInfo(
+ expectedAppInfo,
+ activityInfo,
+ workspaceIconRequests,
+ /* isRestoreFromBackup */ true,
+ )
// Then
assertThat(actualIconRequest.iconBlob).isNull()
assertThat(actualIconRequest.itemInfo).isEqualTo(expectedAppInfo)
diff --git a/tests/tapl/com/android/launcher3/tapl/OverviewTask.java b/tests/tapl/com/android/launcher3/tapl/OverviewTask.java
index 02c6630..8fbb5e3 100644
--- a/tests/tapl/com/android/launcher3/tapl/OverviewTask.java
+++ b/tests/tapl/com/android/launcher3/tapl/OverviewTask.java
@@ -73,18 +73,16 @@
return getCombinedSplitTaskHeight();
}
- if (isDesktop()) {
- return getTaskSnapshot(DESKTOP).getVisibleBounds().height();
- }
- return getTaskSnapshot(DEFAULT).getVisibleBounds().height();
+ UiObject2 taskSnapshot1 = findObjectInTask((isDesktop() ? DESKTOP : DEFAULT).snapshotRes);
+ return taskSnapshot1.getVisibleBounds().height();
}
/**
* Calculates the visible height for split tasks, containing 2 snapshot tiles and a divider.
*/
private int getCombinedSplitTaskHeight() {
- UiObject2 taskSnapshot1 = getTaskSnapshot(SPLIT_TOP_OR_LEFT);
- UiObject2 taskSnapshot2 = getTaskSnapshot(SPLIT_BOTTOM_OR_RIGHT);
+ UiObject2 taskSnapshot1 = findObjectInTask(SPLIT_TOP_OR_LEFT.snapshotRes);
+ UiObject2 taskSnapshot2 = findObjectInTask(SPLIT_BOTTOM_OR_RIGHT.snapshotRes);
// If the split task is partly off screen, taskSnapshot1 can be invisible.
if (taskSnapshot1 == null) {
@@ -99,6 +97,34 @@
return bottom - top;
}
+ /**
+ * Returns the width of the visible task, or the combined width of two tasks in split with a
+ * divider between.
+ */
+ int getVisibleWidth() {
+ if (isGrouped()) {
+ return getCombinedSplitTaskWidth();
+ }
+
+ UiObject2 taskSnapshot1 = findObjectInTask(DEFAULT.snapshotRes);
+ return taskSnapshot1.getVisibleBounds().width();
+ }
+
+ /**
+ * Calculates the visible width for split tasks, containing 2 snapshot tiles and a divider.
+ */
+ private int getCombinedSplitTaskWidth() {
+ UiObject2 taskSnapshot1 = findObjectInTask(SPLIT_TOP_OR_LEFT.snapshotRes);
+ UiObject2 taskSnapshot2 = findObjectInTask(SPLIT_BOTTOM_OR_RIGHT.snapshotRes);
+
+ int left = Math.min(
+ taskSnapshot1.getVisibleBounds().left, taskSnapshot2.getVisibleBounds().left);
+ int right = Math.max(
+ taskSnapshot1.getVisibleBounds().right, taskSnapshot2.getVisibleBounds().right);
+
+ return right - left;
+ }
+
public int getTaskCenterX() {
return mTask.getVisibleCenter().x;
}
@@ -116,22 +142,6 @@
}
/**
- * Returns the task snapshot (thumbnail) for the given `OverviewTaskContainer`.
- *
- * For some reason `BySelector` does not work with `hasChild` or `hasParent` so instead we
- * grab all the views matching the id: "snapshot" and filter for the correct parent.
- */
- private UiObject2 getTaskSnapshot(OverviewTaskContainer overviewTaskContainer) {
- BySelector snapshotSelector = mLauncher.getOverviewObjectSelector("snapshot");
- List<UiObject2> snapshots = mTask.findObjects(snapshotSelector);
- return snapshots.stream()
- .filter(snapshot -> snapshot.getParent().getResourceName()
- .contains(overviewTaskContainer.taskContentViewRes))
- .findFirst()
- .orElse(snapshots.getFirst());
- }
-
- /**
* Dismisses the task by swiping up.
*/
public void dismiss() {
@@ -294,13 +304,17 @@
}
}
+ private UiObject2 findObjectInTask(String resName) {
+ return mTask.findObject(mLauncher.getOverviewObjectSelector(resName));
+ }
+
/**
* Returns whether the given String is contained in this Task's contentDescription. Also returns
* true if both Strings are null.
*/
public boolean containsContentDescription(String expected,
OverviewTaskContainer overviewTaskContainer) {
- String actual = getTaskSnapshot(overviewTaskContainer).getContentDescription();
+ String actual = findObjectInTask(overviewTaskContainer.snapshotRes).getContentDescription();
if (actual == null && expected == null) {
return true;
}
@@ -346,19 +360,19 @@
*/
public enum OverviewTaskContainer {
// The main task when the task is not split.
- DEFAULT("task_content_view", "icon"),
+ DEFAULT("snapshot", "icon"),
// The first task in split task.
- SPLIT_TOP_OR_LEFT("task_content_view", "icon"),
+ SPLIT_TOP_OR_LEFT("snapshot", "icon"),
// The second task in split task.
- SPLIT_BOTTOM_OR_RIGHT("bottomright_task_content_view", "bottomRight_icon"),
+ SPLIT_BOTTOM_OR_RIGHT("bottomright_snapshot", "bottomRight_icon"),
// The desktop task.
DESKTOP("background", "icon");
- public final String taskContentViewRes;
+ public final String snapshotRes;
public final String iconAppRes;
- OverviewTaskContainer(String taskContentViewRes, String iconAppRes) {
- this.taskContentViewRes = taskContentViewRes;
+ OverviewTaskContainer(String snapshotRes, String iconAppRes) {
+ this.snapshotRes = snapshotRes;
this.iconAppRes = iconAppRes;
}
}