Merge "Check before casting to TaskMenuView on rotation" into main
diff --git a/Android.bp b/Android.bp
index a4a058f..85632b2 100644
--- a/Android.bp
+++ b/Android.bp
@@ -25,6 +25,7 @@
name: "launcher-non-platform-apis-defaults",
static_libs: [
"android.os.flags-aconfig-java",
+ "android.multiuser.flags-aconfig-java",
"android.appwidget.flags-aconfig-java",
"com.android.window.flags.window-aconfig-java",
],
diff --git a/aconfig/launcher.aconfig b/aconfig/launcher.aconfig
index e99dae3..c5774bb 100644
--- a/aconfig/launcher.aconfig
+++ b/aconfig/launcher.aconfig
@@ -235,7 +235,7 @@
flag {
name: "enable_fallback_overview_in_window"
- namespace: "launcher"
+ namespace: "lse_desktop_experience"
description: "Enables fallback recents opening inside of a window instead of an activity."
bug: "292269949"
}
@@ -450,14 +450,14 @@
flag {
name: "enable_recents_window_proto_log"
- namespace: "launcher"
+ namespace: "lse_desktop_experience"
description: "Enables tracking recents window logs in ProtoLog"
bug: "292269949"
}
flag {
name: "enable_state_manager_proto_log"
- namespace: "launcher"
+ namespace: "lse_desktop_experience"
description: "Enables tracking state manager logs in ProtoLog"
bug: "292269949"
}
@@ -488,7 +488,7 @@
flag {
name: "enable_launcher_overview_in_window"
- namespace: "launcher"
+ namespace: "lse_desktop_experience"
description: "Enables launcher recents opening inside of a window instead of being hosted in launcher activity."
bug: "292269949"
}
diff --git a/aconfig/launcher_overview.aconfig b/aconfig/launcher_overview.aconfig
index 5749c51..d27a214 100644
--- a/aconfig/launcher_overview.aconfig
+++ b/aconfig/launcher_overview.aconfig
@@ -5,14 +5,14 @@
name: "enable_grid_only_overview"
namespace: "launcher_overview"
description: "Enable a grid-only overview without a focused task."
- bug: "257950105"
+ bug: "360204325"
}
flag {
name: "enable_overview_icon_menu"
namespace: "launcher_overview"
description: "Enable updated overview icon and menu within task."
- bug: "257950105"
+ bug: "360205084"
}
flag {
@@ -110,3 +110,13 @@
description: "Enable wallpaper background for desktop tasks in overview."
bug: "363257721"
}
+
+flag {
+ name: "enable_show_enabled_shortcuts_in_accessibility_menu"
+ namespace: "launcher_overview"
+ description: "Enables showing the same shortcuts in the Task menu as well as the accessibility actions menu"
+ bug: "383662632"
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
+}
diff --git a/quickstep/res/drawable/app_chip_menu_bg.xml b/quickstep/res/drawable/app_chip_menu_bg.xml
new file mode 100644
index 0000000..499056e
--- /dev/null
+++ b/quickstep/res/drawable/app_chip_menu_bg.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+ <solid android:color="@color/materialColorSurfaceBright"/>
+ <corners android:radius="@dimen/task_menu_corner_radius"/>
+</shape>
diff --git a/quickstep/res/layout/redesigned_gesture_tutorial_fragment.xml b/quickstep/res/layout/redesigned_gesture_tutorial_fragment.xml
index 863319f..55fe2b8 100644
--- a/quickstep/res/layout/redesigned_gesture_tutorial_fragment.xml
+++ b/quickstep/res/layout/redesigned_gesture_tutorial_fragment.xml
@@ -215,7 +215,6 @@
android:layout_alignParentBottom="true"
android:layout_alignParentEnd="true"
android:clickable="true"
- android:focusableInTouchMode="true"
android:accessibilityTraversalAfter="@id/gesture_tutorial_fragment_feedback_subtitle"
android:contentDescription="@string/gesture_tutorial_action_button_label"
android:background="@drawable/gesture_tutorial_action_button_background"
diff --git a/quickstep/res/layout/task.xml b/quickstep/res/layout/task.xml
index 3aac1b6..4abfbbe 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/snapshot"
- android:inflatedId="@id/snapshot"
+ android:id="@+id/task_content_view"
+ android:inflatedId="@id/task_content_view"
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
new file mode 100644
index 0000000..9055ccd
--- /dev/null
+++ b/quickstep/res/layout/task_content_view.xml
@@ -0,0 +1,20 @@
+<?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 3e6f5ed..a7c4856 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/snapshot"
- android:inflatedId="@id/snapshot"
+ android:id="@+id/task_content_view"
+ android:inflatedId="@id/task_content_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<ViewStub
- android:id="@+id/bottomright_snapshot"
- android:inflatedId="@id/bottomright_snapshot"
+ android:id="@+id/bottomright_task_content_view"
+ android:inflatedId="@id/bottomright_task_content_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
diff --git a/quickstep/res/layout/task_thumbnail_view_header.xml b/quickstep/res/layout/task_header_view.xml
similarity index 78%
rename from quickstep/res/layout/task_thumbnail_view_header.xml
rename to quickstep/res/layout/task_header_view.xml
index 70e4a42..ea5c24e 100644
--- a/quickstep/res/layout/task_thumbnail_view_header.xml
+++ b/quickstep/res/layout/task_header_view.xml
@@ -13,12 +13,11 @@
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"
+<com.android.quickstep.views.TaskHeaderView 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:id="@+id/task_header_view"
android:background="@drawable/task_thumbnail_header_bg">
<androidx.constraintlayout.widget.ConstraintLayout
@@ -38,22 +37,17 @@
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" />
+ app:layout_constraintBottom_toBottomOf="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_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" />
+ app:layout_constraintStart_toEndOf="@id/header_app_icon"
+ app:layout_constraintTop_toTopOf="parent" />
<ImageButton
android:id="@+id/header_close_button"
android:contentDescription="@string/header_close_icon_description"
@@ -66,7 +60,7 @@
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" />
+ app:layout_constraintStart_toEndOf="@id/header_app_title"
+ app:layout_constraintHorizontal_bias="1" />
</androidx.constraintlayout.widget.ConstraintLayout>
-</com.android.quickstep.views.TaskThumbnailViewHeader>
+</com.android.quickstep.views.TaskHeaderView>
diff --git a/quickstep/res/layout/task_menu.xml b/quickstep/res/layout/task_menu.xml
index b6d8786..abc728a 100644
--- a/quickstep/res/layout/task_menu.xml
+++ b/quickstep/res/layout/task_menu.xml
@@ -43,8 +43,7 @@
android:id="@+id/menu_option_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:showDividers="middle" />
+ android:orientation="horizontal" />
</ScrollView>
diff --git a/quickstep/res/layout/task_thumbnail.xml b/quickstep/res/layout/task_thumbnail.xml
index 3b96615..8280e13 100644
--- a/quickstep/res/layout/task_thumbnail.xml
+++ b/quickstep/res/layout/task_thumbnail.xml
@@ -17,7 +17,8 @@
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/snapshot"
android:layout_width="match_parent"
- android:layout_height="match_parent" >
+ android:layout_height="0dp"
+ android:layout_weight="1" >
<com.android.quickstep.views.FixedSizeImageView
android:id="@+id/task_thumbnail"
diff --git a/quickstep/res/values-af/strings.xml b/quickstep/res/values-af/strings.xml
index 9f35890..7a6435b 100644
--- a/quickstep/res/values-af/strings.xml
+++ b/quickstep/res/values-af/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Appikoon"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Apptitel"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Maak Toe-knoppie"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-am/strings.xml b/quickstep/res/values-am/strings.xml
index abe37ce..7286f3f 100644
--- a/quickstep/res/values-am/strings.xml
+++ b/quickstep/res/values-am/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"የመተግበሪያ አዶ"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"የመተግበሪያ ርዕስ"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"የዝጋ አዝራር"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-ar/strings.xml b/quickstep/res/values-ar/strings.xml
index a7169e0..e673ac6 100644
--- a/quickstep/res/values-ar/strings.xml
+++ b/quickstep/res/values-ar/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"رمز التطبيق"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"عنوان التطبيق"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"زر الإغلاق"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-as/strings.xml b/quickstep/res/values-as/strings.xml
index 7bbba2e..4f3c22d 100644
--- a/quickstep/res/values-as/strings.xml
+++ b/quickstep/res/values-as/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"এপৰ আইকন"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"এপৰ শিৰোনাম"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"বন্ধ কৰা বুটাম"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-az/strings.xml b/quickstep/res/values-az/strings.xml
index 0812327..f7f22e2 100644
--- a/quickstep/res/values-az/strings.xml
+++ b/quickstep/res/values-az/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Tətbiq ikonası"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Tətbiq başlığı"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Qapatma düyməsi"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-b+sr+Latn/strings.xml b/quickstep/res/values-b+sr+Latn/strings.xml
index 823f7e4..67ecbcd 100644
--- a/quickstep/res/values-b+sr+Latn/strings.xml
+++ b/quickstep/res/values-b+sr+Latn/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Ikona aplikacije"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Naziv aplikacije"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Dugme Zatvori"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-be/strings.xml b/quickstep/res/values-be/strings.xml
index 8164c7c..436ed3f 100644
--- a/quickstep/res/values-be/strings.xml
+++ b/quickstep/res/values-be/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Значок праграмы"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Назва праграмы"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Кнопка \"Закрыць\""</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-bg/strings.xml b/quickstep/res/values-bg/strings.xml
index 56a0d94..922a473 100644
--- a/quickstep/res/values-bg/strings.xml
+++ b/quickstep/res/values-bg/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Икона на приложението"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Име на приложението"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Бутон за затваряне"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-bn/strings.xml b/quickstep/res/values-bn/strings.xml
index 0e3a06f..974994a 100644
--- a/quickstep/res/values-bn/strings.xml
+++ b/quickstep/res/values-bn/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"অ্যাপ আইকন"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"অ্যাপের শিরোনাম"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"বন্ধ করার বোতাম"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-bs/strings.xml b/quickstep/res/values-bs/strings.xml
index 20dd87a..c89f84a 100644
--- a/quickstep/res/values-bs/strings.xml
+++ b/quickstep/res/values-bs/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Ikona aplikacije"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Naslov aplikacije"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Dugme za zatvaranje"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-ca/strings.xml b/quickstep/res/values-ca/strings.xml
index d536de7..87591da 100644
--- a/quickstep/res/values-ca/strings.xml
+++ b/quickstep/res/values-ca/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Icona de l\'aplicació"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Títol de l\'aplicació"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Botó Tanca"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-cs/strings.xml b/quickstep/res/values-cs/strings.xml
index 2307f89..6d53ca8 100644
--- a/quickstep/res/values-cs/strings.xml
+++ b/quickstep/res/values-cs/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Ikona aplikace"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Název aplikace"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Tlačítko Zavřít"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-da/strings.xml b/quickstep/res/values-da/strings.xml
index f068c96..debea45 100644
--- a/quickstep/res/values-da/strings.xml
+++ b/quickstep/res/values-da/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Appikon"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Apptitel"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Knappen Luk"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-de/strings.xml b/quickstep/res/values-de/strings.xml
index bbff580..b4d5ac1 100644
--- a/quickstep/res/values-de/strings.xml
+++ b/quickstep/res/values-de/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"App-Symbol"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Titel der App"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Schaltfläche „Schließen“"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-el/strings.xml b/quickstep/res/values-el/strings.xml
index 43b56b6..5dde857 100644
--- a/quickstep/res/values-el/strings.xml
+++ b/quickstep/res/values-el/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Εικονίδιο εφαρμογής"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Τίτλος εφαρμογής"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Κουμπί κλεισίματος"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-en-rAU/strings.xml b/quickstep/res/values-en-rAU/strings.xml
index 4133512..eef812c 100644
--- a/quickstep/res/values-en-rAU/strings.xml
+++ b/quickstep/res/values-en-rAU/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"App icon"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"App title"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Close button"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-en-rCA/strings.xml b/quickstep/res/values-en-rCA/strings.xml
index 7e4799c..d1319ce 100644
--- a/quickstep/res/values-en-rCA/strings.xml
+++ b/quickstep/res/values-en-rCA/strings.xml
@@ -139,8 +139,7 @@
<string name="taskbar_overflow_a11y_title" msgid="7960342079198820179">"Taskbar Overflow"</string>
<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>
- <!-- no translation found for open_app_as_a_bubble (6642626287247807473) -->
- <skip />
+ <string name="open_app_as_a_bubble" msgid="6642626287247807473">"Open app as a bubble"</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>
@@ -157,4 +156,6 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"App icon"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"App title"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Close button"</string>
+ <string name="pin_to_taskbar" msgid="6607778046321626950">"Pin to taskbar"</string>
+ <string name="unpin_from_taskbar" msgid="2178811773165572676">"Unpin from taskbar"</string>
</resources>
diff --git a/quickstep/res/values-en-rGB/strings.xml b/quickstep/res/values-en-rGB/strings.xml
index 4133512..eef812c 100644
--- a/quickstep/res/values-en-rGB/strings.xml
+++ b/quickstep/res/values-en-rGB/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"App icon"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"App title"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Close button"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-en-rIN/strings.xml b/quickstep/res/values-en-rIN/strings.xml
index 4133512..eef812c 100644
--- a/quickstep/res/values-en-rIN/strings.xml
+++ b/quickstep/res/values-en-rIN/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"App icon"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"App title"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Close button"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-es-rUS/strings.xml b/quickstep/res/values-es-rUS/strings.xml
index eb33006..17e3a7d 100644
--- a/quickstep/res/values-es-rUS/strings.xml
+++ b/quickstep/res/values-es-rUS/strings.xml
@@ -139,8 +139,7 @@
<string name="taskbar_overflow_a11y_title" msgid="7960342079198820179">"Barra de tareas ampliada"</string>
<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>
- <!-- no translation found for open_app_as_a_bubble (6642626287247807473) -->
- <skip />
+ <string name="open_app_as_a_bubble" msgid="6642626287247807473">"Abrir app como burbuja"</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>
@@ -157,4 +156,6 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Ícono de la app"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Título de la app"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Botón de cerrar"</string>
+ <string name="pin_to_taskbar" msgid="6607778046321626950">"Fijar a la barra"</string>
+ <string name="unpin_from_taskbar" msgid="2178811773165572676">"No fijar a la barra"</string>
</resources>
diff --git a/quickstep/res/values-es/strings.xml b/quickstep/res/values-es/strings.xml
index 311e24e..69628cf 100644
--- a/quickstep/res/values-es/strings.xml
+++ b/quickstep/res/values-es/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Icono de la aplicación"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Título de la aplicación"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Botón de cerrar"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-et/strings.xml b/quickstep/res/values-et/strings.xml
index 5e89e7a..41cb357 100644
--- a/quickstep/res/values-et/strings.xml
+++ b/quickstep/res/values-et/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Rakenduse ikoon"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Rakenduse pealkiri"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Sulgemisnupp"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-eu/strings.xml b/quickstep/res/values-eu/strings.xml
index 654d863..15c4742 100644
--- a/quickstep/res/values-eu/strings.xml
+++ b/quickstep/res/values-eu/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Aplikazioaren ikonoa"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Aplikazioaren izena"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Ixteko botoia"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-fa/strings.xml b/quickstep/res/values-fa/strings.xml
index af5efa8..810632b 100644
--- a/quickstep/res/values-fa/strings.xml
+++ b/quickstep/res/values-fa/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"نماد برنامه"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"عنوان برنامه"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"دکمه بستن"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-fi/strings.xml b/quickstep/res/values-fi/strings.xml
index 04ced83..e23ae30 100644
--- a/quickstep/res/values-fi/strings.xml
+++ b/quickstep/res/values-fi/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Sovelluskuvake"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Sovelluksen nimi"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Sulje-painike"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-fr-rCA/strings.xml b/quickstep/res/values-fr-rCA/strings.xml
index 4b90597..448abf5 100644
--- a/quickstep/res/values-fr-rCA/strings.xml
+++ b/quickstep/res/values-fr-rCA/strings.xml
@@ -90,7 +90,7 @@
<string name="allset_title" msgid="5021126669778966707">"Tout est prêt!"</string>
<string name="allset_hint" msgid="459504134589971527">"Balayez l\'écran vers le haut pour accéder à l\'écran d\'accueil"</string>
<string name="allset_button_hint" msgid="2395219947744706291">"Toucher le bouton d\'accueil pour passer sur votre écran d\'accueil"</string>
- <string name="allset_description_generic" msgid="5385500062202019855">"Vous êtes maintenant prêt à utiliser votre <xliff:g id="DEVICE">%1$s</xliff:g>."</string>
+ <string name="allset_description_generic" msgid="5385500062202019855">"Vous êtes maintenant prêt à utiliser votre <xliff:g id="DEVICE">%1$s</xliff:g>"</string>
<string name="default_device_name" msgid="6660656727127422487">"appareil"</string>
<string name="allset_navigation_settings" msgid="4713404605961476027"><annotation id="link">"Paramètres de navigation du système"</annotation></string>
<string name="action_share" msgid="2648470652637092375">"Partager"</string>
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Icône de l\'appli"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Nom de l\'appli"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Bouton Fermer"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-fr/strings.xml b/quickstep/res/values-fr/strings.xml
index fb31ca5..59310e2 100644
--- a/quickstep/res/values-fr/strings.xml
+++ b/quickstep/res/values-fr/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Icône de l\'application"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Titre de l\'application"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Bouton \"Fermer\""</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-gl/strings.xml b/quickstep/res/values-gl/strings.xml
index f420374..994b5fd 100644
--- a/quickstep/res/values-gl/strings.xml
+++ b/quickstep/res/values-gl/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Icona da aplicación"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Título da aplicación"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Botón Pechar"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-gu/strings.xml b/quickstep/res/values-gu/strings.xml
index ed00d9d..03fbd63 100644
--- a/quickstep/res/values-gu/strings.xml
+++ b/quickstep/res/values-gu/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"ઍપનું આઇકન"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"ઍપનું શીર્ષક"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"\'બંધ કરો\' બટન"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-hi/strings.xml b/quickstep/res/values-hi/strings.xml
index 852a7dd..89648d4 100644
--- a/quickstep/res/values-hi/strings.xml
+++ b/quickstep/res/values-hi/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"ऐप्लिकेशन आइकॉन"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"ऐप्लिकेशन का नाम"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"\'बंद करें\' बटन"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-hr/strings.xml b/quickstep/res/values-hr/strings.xml
index fbdaa3f..e4a0f7c 100644
--- a/quickstep/res/values-hr/strings.xml
+++ b/quickstep/res/values-hr/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Ikona aplikacije"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Naziv aplikacije"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Gumb Zatvori"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-hu/strings.xml b/quickstep/res/values-hu/strings.xml
index d069a50..ac97372 100644
--- a/quickstep/res/values-hu/strings.xml
+++ b/quickstep/res/values-hu/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Alkalmazásikon"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Alkalmazás neve"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Bezárás gomb"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-hy/strings.xml b/quickstep/res/values-hy/strings.xml
index cf46705..27ac837 100644
--- a/quickstep/res/values-hy/strings.xml
+++ b/quickstep/res/values-hy/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Հավելվածի պատկերակ"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Հավելվածի անվանում"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"«Փակել» կոճակ"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-in/strings.xml b/quickstep/res/values-in/strings.xml
index 3322ef8..69a2a82 100644
--- a/quickstep/res/values-in/strings.xml
+++ b/quickstep/res/values-in/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Ikon aplikasi"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Judul aplikasi"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Tombol tutup"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-is/strings.xml b/quickstep/res/values-is/strings.xml
index 80d15ea..a8c2770 100644
--- a/quickstep/res/values-is/strings.xml
+++ b/quickstep/res/values-is/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Forritstákn"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Titil forrits"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Hnappur til að loka"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-it/strings.xml b/quickstep/res/values-it/strings.xml
index 1363fc1..7d0bcd8 100644
--- a/quickstep/res/values-it/strings.xml
+++ b/quickstep/res/values-it/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Icona dell\'app"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Titolo dell\'app"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Pulsante Chiudi"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-iw/strings.xml b/quickstep/res/values-iw/strings.xml
index 507d9e7..55295cf 100644
--- a/quickstep/res/values-iw/strings.xml
+++ b/quickstep/res/values-iw/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"סמל האפליקציה"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"שם האפליקציה"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"כפתור הסגירה"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-ja/strings.xml b/quickstep/res/values-ja/strings.xml
index af90466..b66126f 100644
--- a/quickstep/res/values-ja/strings.xml
+++ b/quickstep/res/values-ja/strings.xml
@@ -139,8 +139,7 @@
<string name="taskbar_overflow_a11y_title" msgid="7960342079198820179">"タスクバーのオーバフロー"</string>
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"上 / 左に移動"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"下 / 右に移動"</string>
- <!-- no translation found for open_app_as_a_bubble (6642626287247807473) -->
- <skip />
+ <string name="open_app_as_a_bubble" msgid="6642626287247807473">"アプリをバブルとして開く"</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>
@@ -157,4 +156,6 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"アプリのアイコン"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"アプリのタイトル"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"閉じるボタン"</string>
+ <string name="pin_to_taskbar" msgid="6607778046321626950">"タスクバーに固定"</string>
+ <string name="unpin_from_taskbar" msgid="2178811773165572676">"タスクバーの固定解除"</string>
</resources>
diff --git a/quickstep/res/values-ka/strings.xml b/quickstep/res/values-ka/strings.xml
index f4ecdb9..0608631 100644
--- a/quickstep/res/values-ka/strings.xml
+++ b/quickstep/res/values-ka/strings.xml
@@ -139,8 +139,7 @@
<string name="taskbar_overflow_a11y_title" msgid="7960342079198820179">"ამოცანათა ზოლის გადავსება"</string>
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"ზემოთ/მარცხნივ გადატანა"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"ქვემოთ/მარჯვნივ გადატანა"</string>
- <!-- no translation found for open_app_as_a_bubble (6642626287247807473) -->
- <skip />
+ <string name="open_app_as_a_bubble" msgid="6642626287247807473">"აპის გახსნა ბუშტის სახით"</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>
@@ -157,4 +156,6 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"აპის ხატულა"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"აპის სათაური"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"დახურვის ღილაკი"</string>
+ <string name="pin_to_taskbar" msgid="6607778046321626950">"ამოც. ზოლში ჩანიშვნა"</string>
+ <string name="unpin_from_taskbar" msgid="2178811773165572676">"ამოც. ზოლიდან მოხსნა"</string>
</resources>
diff --git a/quickstep/res/values-kk/strings.xml b/quickstep/res/values-kk/strings.xml
index 3ce771b..8e18fab 100644
--- a/quickstep/res/values-kk/strings.xml
+++ b/quickstep/res/values-kk/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Қолданба белгішесі"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Қолданба атауы"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"\"Жабу\" түймесі"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-km/strings.xml b/quickstep/res/values-km/strings.xml
index 1cab383..44f7fe4 100644
--- a/quickstep/res/values-km/strings.xml
+++ b/quickstep/res/values-km/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"រូបកម្មវិធី"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"ចំណងជើងកម្មវិធី"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"ប៊ូតុងបិទ"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-kn/strings.xml b/quickstep/res/values-kn/strings.xml
index a5bffee..2187634 100644
--- a/quickstep/res/values-kn/strings.xml
+++ b/quickstep/res/values-kn/strings.xml
@@ -139,8 +139,7 @@
<string name="taskbar_overflow_a11y_title" msgid="7960342079198820179">"ಟಾಸ್ಕ್ ಬಾರ್ ಓವರ್ಫ್ಲೋ"</string>
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"ಮೇಲಿನ/ಎಡಭಾಗಕ್ಕೆ ಸರಿಸಿ"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"ಕೆಳಗಿನ/ಬಲಭಾಗಕ್ಕೆ ಸರಿಸಿ"</string>
- <!-- no translation found for open_app_as_a_bubble (6642626287247807473) -->
- <skip />
+ <string name="open_app_as_a_bubble" msgid="6642626287247807473">"ಆ್ಯಪ್ ಅನ್ನು ಬಬಲ್ ಆಗಿ ತೆರೆಯಿರಿ"</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>
@@ -157,4 +156,6 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"ಆ್ಯಪ್ ಐಕಾನ್"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"ಆ್ಯಪ್ ಶೀರ್ಷಿಕೆ"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"ಮುಚ್ಚುವ ಬಟನ್"</string>
+ <string name="pin_to_taskbar" msgid="6607778046321626950">"ಟಾಸ್ಕ್ಬಾರ್ಗೆ ಪಿನ್ ಮಾಡಿ"</string>
+ <string name="unpin_from_taskbar" msgid="2178811773165572676">"ಟಾಸ್ಕ್ಬಾರ್ನಿಂದ ಅನ್ಪಿನ್"</string>
</resources>
diff --git a/quickstep/res/values-ko/strings.xml b/quickstep/res/values-ko/strings.xml
index 2dd6d91..e5e5359 100644
--- a/quickstep/res/values-ko/strings.xml
+++ b/quickstep/res/values-ko/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"앱 아이콘"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"앱 제목"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"닫기 버튼"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-ky/strings.xml b/quickstep/res/values-ky/strings.xml
index 51e0d0d..d23ee7e 100644
--- a/quickstep/res/values-ky/strings.xml
+++ b/quickstep/res/values-ky/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Колдонмонун сүрөтчөсү"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Колдонмонун аталышы"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Жабуу баскычы"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-lo/strings.xml b/quickstep/res/values-lo/strings.xml
index 3c906b5..8407311 100644
--- a/quickstep/res/values-lo/strings.xml
+++ b/quickstep/res/values-lo/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"ໄອຄອນແອັບ"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"ຊື່ແອັບ"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"ປຸ່ມປິດ"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-lt/strings.xml b/quickstep/res/values-lt/strings.xml
index f94f785..268eeb7 100644
--- a/quickstep/res/values-lt/strings.xml
+++ b/quickstep/res/values-lt/strings.xml
@@ -139,8 +139,7 @@
<string name="taskbar_overflow_a11y_title" msgid="7960342079198820179">"Užduočių juostos perpildymas"</string>
<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>
- <!-- no translation found for open_app_as_a_bubble (6642626287247807473) -->
- <skip />
+ <string name="open_app_as_a_bubble" msgid="6642626287247807473">"Atidaryti programą kaip burbulą"</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>
@@ -157,4 +156,6 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Programos piktograma"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Programos pavadinimas"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Mygtukas „Uždaryti“"</string>
+ <string name="pin_to_taskbar" msgid="6607778046321626950">"Priseg. prie užd. j."</string>
+ <string name="unpin_from_taskbar" msgid="2178811773165572676">"Atsegti nuo užd. j."</string>
</resources>
diff --git a/quickstep/res/values-lv/strings.xml b/quickstep/res/values-lv/strings.xml
index 67adacd..ad83c24 100644
--- a/quickstep/res/values-lv/strings.xml
+++ b/quickstep/res/values-lv/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Lietotnes ikona"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Lietotnes nosaukums"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Poga Aizvērt"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-mk/strings.xml b/quickstep/res/values-mk/strings.xml
index 02c1fcf..96edee6 100644
--- a/quickstep/res/values-mk/strings.xml
+++ b/quickstep/res/values-mk/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Икона за апликацијата"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Наслов на апликацијата"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Копче за затворање"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-ml/strings.xml b/quickstep/res/values-ml/strings.xml
index b0bc7c0b..628acd1 100644
--- a/quickstep/res/values-ml/strings.xml
+++ b/quickstep/res/values-ml/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"ആപ്പ് ഐക്കൺ"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"ആപ്പിന്റെ പേര്"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"അടയ്ക്കുക ബട്ടൺ"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-mn/strings.xml b/quickstep/res/values-mn/strings.xml
index de5d281..ac3c40e 100644
--- a/quickstep/res/values-mn/strings.xml
+++ b/quickstep/res/values-mn/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Aппын дүрс тэмдэг"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Аппын нэр"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Хаах товч"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-mr/strings.xml b/quickstep/res/values-mr/strings.xml
index 7b91551..6f82343 100644
--- a/quickstep/res/values-mr/strings.xml
+++ b/quickstep/res/values-mr/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"अॅपचा आयकन"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"अॅपचे शीर्षक"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"बंद करा बटण"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-ms/strings.xml b/quickstep/res/values-ms/strings.xml
index adba48b..b85b62c 100644
--- a/quickstep/res/values-ms/strings.xml
+++ b/quickstep/res/values-ms/strings.xml
@@ -88,7 +88,7 @@
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"Bagus!"</string>
<string name="gesture_tutorial_step" msgid="1279786122817620968">"Tutorial <xliff:g id="CURRENT">%1$d</xliff:g>/<xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="allset_title" msgid="5021126669778966707">"Siap!"</string>
- <string name="allset_hint" msgid="459504134589971527">"Leret ke atas untuk ke laman utama"</string>
+ <string name="allset_hint" msgid="459504134589971527">"Leret ke atas untuk ke skrin utama"</string>
<string name="allset_button_hint" msgid="2395219947744706291">"Ketik butang skrin utama untuk pergi ke skrin utama anda"</string>
<string name="allset_description_generic" msgid="5385500062202019855">"Anda sudah sedia untuk mula menggunakan <xliff:g id="DEVICE">%1$s</xliff:g> anda"</string>
<string name="default_device_name" msgid="6660656727127422487">"peranti"</string>
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Ikon apl"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Tajuk apl"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Butang tutup"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-my/strings.xml b/quickstep/res/values-my/strings.xml
index 00086c4..467ef26 100644
--- a/quickstep/res/values-my/strings.xml
+++ b/quickstep/res/values-my/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"အက်ပ်သင်္ကေတ"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"အက်ပ်ခေါင်းစဉ်"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"အပိတ် ခလုတ်"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-nb/strings.xml b/quickstep/res/values-nb/strings.xml
index e8e02cc..2690a61 100644
--- a/quickstep/res/values-nb/strings.xml
+++ b/quickstep/res/values-nb/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Appikon"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Apptittel"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Lukkeknapp"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-ne/strings.xml b/quickstep/res/values-ne/strings.xml
index 2c1b446..d03fcce 100644
--- a/quickstep/res/values-ne/strings.xml
+++ b/quickstep/res/values-ne/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"एप जनाउने आइकन"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"एपको शीर्षक"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"\"बन्द गर्नुहोस्\" बटन"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-nl/strings.xml b/quickstep/res/values-nl/strings.xml
index 429f7a6..d265f96 100644
--- a/quickstep/res/values-nl/strings.xml
+++ b/quickstep/res/values-nl/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Icoon van app"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Titel van app"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Knop Sluiten"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-or/strings.xml b/quickstep/res/values-or/strings.xml
index 161cbaa..e19fee5 100644
--- a/quickstep/res/values-or/strings.xml
+++ b/quickstep/res/values-or/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"ଆପ ଆଇକନ"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"ଆପ ଟାଇଟେଲ"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"\"ବନ୍ଦ କରନ୍ତୁ\" ବଟନ"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-pa/strings.xml b/quickstep/res/values-pa/strings.xml
index 484b2e8..4a015e4 100644
--- a/quickstep/res/values-pa/strings.xml
+++ b/quickstep/res/values-pa/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"ਐਪ ਪ੍ਰਤੀਕ"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"ਐਪ ਸਿਰਲੇਖ"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"\'ਬੰਦ ਕਰੋ\' ਬਟਨ"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-pl/strings.xml b/quickstep/res/values-pl/strings.xml
index b36f015..89297a2 100644
--- a/quickstep/res/values-pl/strings.xml
+++ b/quickstep/res/values-pl/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Ikona aplikacji"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Tytuł aplikacji"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Przycisk Zamknij"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-pt-rPT/strings.xml b/quickstep/res/values-pt-rPT/strings.xml
index a6de393..8c38182 100644
--- a/quickstep/res/values-pt-rPT/strings.xml
+++ b/quickstep/res/values-pt-rPT/strings.xml
@@ -139,8 +139,7 @@
<string name="taskbar_overflow_a11y_title" msgid="7960342079198820179">"Menu adicional da Barra de tarefas"</string>
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Mover para a parte superior esquerda"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Mover para a part superior direita"</string>
- <!-- no translation found for open_app_as_a_bubble (6642626287247807473) -->
- <skip />
+ <string name="open_app_as_a_bubble" msgid="6642626287247807473">"Abrir app como um balão"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{outra app}other{outras 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>
@@ -157,4 +156,6 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Ícone da app"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Título da app"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Botão Fechar"</string>
+ <string name="pin_to_taskbar" msgid="6607778046321626950">"Afixar na barra tar."</string>
+ <string name="unpin_from_taskbar" msgid="2178811773165572676">"Desaf. da barra tar."</string>
</resources>
diff --git a/quickstep/res/values-pt/strings.xml b/quickstep/res/values-pt/strings.xml
index 1c98b79..5ea0194 100644
--- a/quickstep/res/values-pt/strings.xml
+++ b/quickstep/res/values-pt/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Ícone do app"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Título do app"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Botão \"Fechar\""</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-ro/strings.xml b/quickstep/res/values-ro/strings.xml
index 2cc766e..08e4081 100644
--- a/quickstep/res/values-ro/strings.xml
+++ b/quickstep/res/values-ro/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Pictograma aplicației"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Titlul aplicației"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Buton de închidere"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-ru/strings.xml b/quickstep/res/values-ru/strings.xml
index e19dfa6..65af36f 100644
--- a/quickstep/res/values-ru/strings.xml
+++ b/quickstep/res/values-ru/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Значок приложения"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Название приложения"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Кнопка \"Закрыть\""</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-si/strings.xml b/quickstep/res/values-si/strings.xml
index 794b82a..7e00beb 100644
--- a/quickstep/res/values-si/strings.xml
+++ b/quickstep/res/values-si/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"යෙදුම් නිරූපකය"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"යෙදුම් මාතෘකාව"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"වැසීමේ බොත්තම"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-sk/strings.xml b/quickstep/res/values-sk/strings.xml
index 3f1d012..1170e71 100644
--- a/quickstep/res/values-sk/strings.xml
+++ b/quickstep/res/values-sk/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Ikona aplikácie"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Názov aplikácie"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Tlačidlo Zavrieť"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-sl/strings.xml b/quickstep/res/values-sl/strings.xml
index 74dc634..9ed661c 100644
--- a/quickstep/res/values-sl/strings.xml
+++ b/quickstep/res/values-sl/strings.xml
@@ -139,8 +139,7 @@
<string name="taskbar_overflow_a11y_title" msgid="7960342079198820179">"Oblaček opravilne vrstice z dodatnimi elementi"</string>
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Premakni na vrh/levo"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Premakni na dno/desno"</string>
- <!-- no translation found for open_app_as_a_bubble (6642626287247807473) -->
- <skip />
+ <string name="open_app_as_a_bubble" msgid="6642626287247807473">"Odpri aplikacijo kot oblaček"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{dodatna aplikacija}one{dodatna aplikacija}two{dodatni aplikaciji}few{dodatne aplikacije}other{dodatnih aplikacij}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Namizni računalnik"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> in <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
@@ -157,4 +156,6 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Ikona aplikacije"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Ime aplikacije"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Gumb za zapiranje"</string>
+ <string name="pin_to_taskbar" msgid="6607778046321626950">"Pripni v opravilno vrstico"</string>
+ <string name="unpin_from_taskbar" msgid="2178811773165572676">"Odpni iz opravilne vrstice"</string>
</resources>
diff --git a/quickstep/res/values-sq/strings.xml b/quickstep/res/values-sq/strings.xml
index 543978c..965699d 100644
--- a/quickstep/res/values-sq/strings.xml
+++ b/quickstep/res/values-sq/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Ikona e aplikacionit"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Titulli i aplikacionit"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Butoni i mbylljes"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-sr/strings.xml b/quickstep/res/values-sr/strings.xml
index 240f41f..c827cda 100644
--- a/quickstep/res/values-sr/strings.xml
+++ b/quickstep/res/values-sr/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Икона апликације"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Назив апликације"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Дугме Затвори"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-sv/strings.xml b/quickstep/res/values-sv/strings.xml
index 99c8f35..5713036 100644
--- a/quickstep/res/values-sv/strings.xml
+++ b/quickstep/res/values-sv/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Appikon"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Apptitel"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Knappen Stäng"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-sw/strings.xml b/quickstep/res/values-sw/strings.xml
index 6f3a7c9..f1dbcbc 100644
--- a/quickstep/res/values-sw/strings.xml
+++ b/quickstep/res/values-sw/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Aikoni ya programu"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Kichwa cha programu"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Kitufe cha kufunga"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-ta/strings.xml b/quickstep/res/values-ta/strings.xml
index 297aeeb..04dfc30 100644
--- a/quickstep/res/values-ta/strings.xml
+++ b/quickstep/res/values-ta/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"ஆப்ஸ் ஐகான்"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"ஆப்ஸ் தலைப்பு"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"மூடுவதற்கான பட்டன்"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-te/strings.xml b/quickstep/res/values-te/strings.xml
index ff24486..516c2f7 100644
--- a/quickstep/res/values-te/strings.xml
+++ b/quickstep/res/values-te/strings.xml
@@ -139,8 +139,7 @@
<string name="taskbar_overflow_a11y_title" msgid="7960342079198820179">"టాస్క్బార్ ఓవర్ఫ్లో"</string>
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"ఎగువ/ఎడమ వైపునకు తరలించండి"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"దిగువ/కుడి వైపునకు తరలించండి"</string>
- <!-- no translation found for open_app_as_a_bubble (6642626287247807473) -->
- <skip />
+ <string name="open_app_as_a_bubble" msgid="6642626287247807473">"యాప్ను బబుల్లాగా తెరవండి"</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>
@@ -157,4 +156,6 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"యాప్ చిహ్నం"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"యాప్ టైటిల్"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"\'మూసివేయండి\' బటన్"</string>
+ <string name="pin_to_taskbar" msgid="6607778046321626950">"టాస్క్బార్కు పిన్"</string>
+ <string name="unpin_from_taskbar" msgid="2178811773165572676">"టాస్క్బార్ అన్పిన్"</string>
</resources>
diff --git a/quickstep/res/values-th/strings.xml b/quickstep/res/values-th/strings.xml
index 3946069..04eac38 100644
--- a/quickstep/res/values-th/strings.xml
+++ b/quickstep/res/values-th/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"ไอคอนแอป"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"ชื่อแอป"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"ปุ่มปิด"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-tl/strings.xml b/quickstep/res/values-tl/strings.xml
index 787d89e..89ead25 100644
--- a/quickstep/res/values-tl/strings.xml
+++ b/quickstep/res/values-tl/strings.xml
@@ -139,8 +139,7 @@
<string name="taskbar_overflow_a11y_title" msgid="7960342079198820179">"Taskbar Overflow"</string>
<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>
- <!-- no translation found for open_app_as_a_bubble (6642626287247807473) -->
- <skip />
+ <string name="open_app_as_a_bubble" msgid="6642626287247807473">"Buksan ang app bilang bubble"</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>
@@ -157,4 +156,6 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Icon ng app"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Pamagat ng app"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Button na isara"</string>
+ <string name="pin_to_taskbar" msgid="6607778046321626950">"I-pin sa taskbar"</string>
+ <string name="unpin_from_taskbar" msgid="2178811773165572676">"I-unpin sa taskbar"</string>
</resources>
diff --git a/quickstep/res/values-tr/strings.xml b/quickstep/res/values-tr/strings.xml
index aca1f5a..f2c42d0 100644
--- a/quickstep/res/values-tr/strings.xml
+++ b/quickstep/res/values-tr/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Uygulama simgesi"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Uygulama başlığı"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Kapat düğmesi"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-uk/strings.xml b/quickstep/res/values-uk/strings.xml
index 87b9a27..82d8a60 100644
--- a/quickstep/res/values-uk/strings.xml
+++ b/quickstep/res/values-uk/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Значок додатка"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Назва додатка"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Кнопка \"Закрити\""</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-ur/strings.xml b/quickstep/res/values-ur/strings.xml
index ad64e32..65436ae 100644
--- a/quickstep/res/values-ur/strings.xml
+++ b/quickstep/res/values-ur/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"ایپ آئیکن"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"ایپ کا عنوان"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"\'بند کریں\' بٹن"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-uz/strings.xml b/quickstep/res/values-uz/strings.xml
index e458ea9..b761b5d 100644
--- a/quickstep/res/values-uz/strings.xml
+++ b/quickstep/res/values-uz/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Ilova belgisi"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Ilova nomi"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Yopish tugmasi"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-vi/strings.xml b/quickstep/res/values-vi/strings.xml
index e11fe56..383f915 100644
--- a/quickstep/res/values-vi/strings.xml
+++ b/quickstep/res/values-vi/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Biểu tượng ứng dụng"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Tên ứng dụng"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Nút đóng"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-zh-rCN/strings.xml b/quickstep/res/values-zh-rCN/strings.xml
index f421ad4..17d022e 100644
--- a/quickstep/res/values-zh-rCN/strings.xml
+++ b/quickstep/res/values-zh-rCN/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"应用图标"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"应用名称"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"“关闭”按钮"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-zh-rHK/strings.xml b/quickstep/res/values-zh-rHK/strings.xml
index 7306636..47bb6d4 100644
--- a/quickstep/res/values-zh-rHK/strings.xml
+++ b/quickstep/res/values-zh-rHK/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"應用程式圖示"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"應用程式名稱"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"關閉按鈕"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-zh-rTW/strings.xml b/quickstep/res/values-zh-rTW/strings.xml
index 35bc1e3..58c7bb5 100644
--- a/quickstep/res/values-zh-rTW/strings.xml
+++ b/quickstep/res/values-zh-rTW/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"應用程式圖示"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"應用程式標題"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"關閉按鈕"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values-zu/strings.xml b/quickstep/res/values-zu/strings.xml
index 2961d0c..8d0a6db 100644
--- a/quickstep/res/values-zu/strings.xml
+++ b/quickstep/res/values-zu/strings.xml
@@ -157,4 +157,8 @@
<string name="header_app_icon_description" msgid="2184625881433608027">"Isithonjana se-app"</string>
<string name="header_default_app_title" msgid="8308052350689531566">"Isihloko se-app"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Inkinobho yokuvala"</string>
+ <!-- no translation found for pin_to_taskbar (6607778046321626950) -->
+ <skip />
+ <!-- no translation found for unpin_from_taskbar (2178811773165572676) -->
+ <skip />
</resources>
diff --git a/quickstep/res/values/dimens.xml b/quickstep/res/values/dimens.xml
index 6196be4..36e6902 100644
--- a/quickstep/res/values/dimens.xml
+++ b/quickstep/res/values/dimens.xml
@@ -371,7 +371,6 @@
<dimen name="taskbar_running_app_indicator_height">2dp</dimen>
<dimen name="taskbar_running_app_indicator_width">12dp</dimen>
<dimen name="taskbar_running_app_indicator_top_margin">4dp</dimen>
- <dimen name="taskbar_minimized_app_indicator_width">6dp</dimen>
<!-- Transient taskbar -->
<dimen name="transient_taskbar_padding">12dp</dimen>
diff --git a/quickstep/src/com/android/launcher3/WidgetPickerActivity.java b/quickstep/src/com/android/launcher3/WidgetPickerActivity.java
index 7f3e615..4d3e3be 100644
--- a/quickstep/src/com/android/launcher3/WidgetPickerActivity.java
+++ b/quickstep/src/com/android/launcher3/WidgetPickerActivity.java
@@ -68,7 +68,8 @@
import java.util.regex.Pattern;
/** An Activity that can host Launcher's widget picker. */
-public class WidgetPickerActivity extends BaseActivity {
+public class WidgetPickerActivity extends BaseActivity implements
+ WidgetPredictionsRequester.WidgetPredictionsListener {
private static final String TAG = "WidgetPickerActivity";
/**
* Name of the extra that indicates that a widget being dragged.
@@ -322,7 +323,7 @@
if (mUiSurface != null) {
mWidgetPredictionsRequester = new WidgetPredictionsRequester(app.getContext(),
mUiSurface, mModel.getWidgetsByComponentKeyForPicker());
- mWidgetPredictionsRequester.request(mAddedWidgets, this::bindRecommendedWidgets);
+ mWidgetPredictionsRequester.request(mAddedWidgets, /*listener=*/ this);
}
});
}
@@ -355,7 +356,8 @@
});
}
- private void bindRecommendedWidgets(List<ItemInfo> recommendedWidgets) {
+ @Override
+ public void onPredictionsAvailable(List<ItemInfo> recommendedWidgets) {
// Bind recommendations once picker has finished open animation.
MAIN_EXECUTOR.getHandler().postDelayed(
() -> mWidgetPickerDataProvider.setWidgetRecommendations(recommendedWidgets),
diff --git a/quickstep/src/com/android/launcher3/desktop/DesktopAppLaunchAnimatorHelper.kt b/quickstep/src/com/android/launcher3/desktop/DesktopAppLaunchAnimatorHelper.kt
index 688018b..1438edf 100644
--- a/quickstep/src/com/android/launcher3/desktop/DesktopAppLaunchAnimatorHelper.kt
+++ b/quickstep/src/com/android/launcher3/desktop/DesktopAppLaunchAnimatorHelper.kt
@@ -64,18 +64,13 @@
fun createAnimators(info: TransitionInfo, finishCallback: (Animator) -> Unit): List<Animator> {
val launchChange = getLaunchChange(info)
- requireNotNull(launchChange) {
- val changesString =
+ if (launchChange == null) {
+ val tasksInfo =
info.changes.joinToString(", ") { change ->
- "Change: mode=${change.mode}, " +
- "taskId=${change.taskInfo?.id}, " +
- "isFreeform=${change.taskInfo?.isFreeform}"
+ "${change.taskInfo?.taskId}:${change.taskInfo?.isFreeform}"
}
- Log.e(
- TAG,
- "No launch change found: Transition type=${info.type}, changes=$changesString",
- )
- "expected an app launch Change"
+ Log.e(TAG, "No launch change found: Transition info=$info, tasks state=$tasksInfo")
+ return emptyList()
}
val transaction = transactionSupplier.get()
@@ -105,10 +100,14 @@
}
private fun getLaunchChange(info: TransitionInfo): Change? =
- info.changes.firstOrNull { change -> change.mode in LAUNCH_CHANGE_MODES }
+ info.changes.firstOrNull { change ->
+ change.mode in LAUNCH_CHANGE_MODES && change.taskInfo?.isFreeform == true
+ }
private fun getMinimizeChange(info: TransitionInfo): Change? =
- info.changes.firstOrNull { change -> change.mode == TRANSIT_TO_BACK }
+ info.changes.firstOrNull { change ->
+ change.mode == TRANSIT_TO_BACK && change.taskInfo?.isFreeform == true
+ }
private fun getTrampolineCloseChange(info: TransitionInfo): Change? {
if (
diff --git a/quickstep/src/com/android/launcher3/desktop/DesktopAppLaunchTransition.kt b/quickstep/src/com/android/launcher3/desktop/DesktopAppLaunchTransition.kt
index 79072a6..5a8934b 100644
--- a/quickstep/src/com/android/launcher3/desktop/DesktopAppLaunchTransition.kt
+++ b/quickstep/src/com/android/launcher3/desktop/DesktopAppLaunchTransition.kt
@@ -84,6 +84,10 @@
if (animators.isEmpty()) finishedCallback.run()
}
animators += animatorHelper.createAnimators(info, animatorFinishedCallback)
+ if (animators.isEmpty()) {
+ finishedCallback.run()
+ return
+ }
animators.forEach { it.start() }
}
diff --git a/quickstep/src/com/android/launcher3/model/WidgetPredictionsRequester.java b/quickstep/src/com/android/launcher3/model/WidgetPredictionsRequester.java
index d3ac975..f9cec82 100644
--- a/quickstep/src/com/android/launcher3/model/WidgetPredictionsRequester.java
+++ b/quickstep/src/com/android/launcher3/model/WidgetPredictionsRequester.java
@@ -48,7 +48,6 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
-import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.stream.Collectors;
@@ -56,7 +55,7 @@
* Works with app predictor to fetch and process widget predictions displayed in a standalone
* widget picker activity for a UI surface.
*/
-public class WidgetPredictionsRequester {
+public class WidgetPredictionsRequester implements AppPredictor.Callback {
private static final int NUM_OF_RECOMMENDED_WIDGETS_PREDICATION = 20;
private static final String BUNDLE_KEY_ADDED_APP_WIDGETS = "added_app_widgets";
// container/screenid/[positionx,positiony]/[spanx,spany]
@@ -71,6 +70,9 @@
@NonNull
private final String mUiSurface;
private boolean mPredictionsAvailable;
+ @Nullable
+ private WidgetPredictionsListener mPredictionsListener = null;
+ @Nullable Predicate<WidgetItem> mFilter = null;
@NonNull
private final Map<ComponentKey, WidgetItem> mAllWidgets;
@@ -81,36 +83,49 @@
mAllWidgets = Collections.unmodifiableMap(allWidgets);
}
+ // AppPredictor.Callback -> onTargetsAvailable
+ @Override
+ @WorkerThread
+ public void onTargetsAvailable(List<AppTarget> targets) {
+ List<WidgetItem> filteredPredictions = filterPredictions(targets, mAllWidgets, mFilter);
+ List<ItemInfo> mappedPredictions = mapWidgetItemsToItemInfo(filteredPredictions);
+
+ if (!mPredictionsAvailable && mPredictionsListener != null) {
+ mPredictionsAvailable = true;
+ MAIN_EXECUTOR.execute(
+ () -> mPredictionsListener.onPredictionsAvailable(mappedPredictions));
+ }
+ }
+
/**
* Requests one time predictions from the app predictions manager and invokes provided callback
- * once predictions are available.
+ * once predictions are available. Any previous requests may be cancelled.
*
* @param existingWidgets widgets that are currently added to the surface;
- * @param callback consumer of prediction results to be called when predictions are
- * available
+ * @param listener consumer of prediction results to be called when predictions are
+ * available; any previous listener will no longer receive updates.
*/
+ @WorkerThread // e.g. MODEL_EXECUTOR
public void request(List<AppWidgetProviderInfo> existingWidgets,
- Consumer<List<ItemInfo>> callback) {
+ WidgetPredictionsListener listener) {
+ clear();
+ mPredictionsListener = listener;
+ mFilter = notOnUiSurfaceFilter(existingWidgets);
+
+ AppPredictionManager apm = mContext.getSystemService(AppPredictionManager.class);
+ if (apm == null) {
+ return;
+ }
+
Bundle bundle = buildBundleForPredictionSession(existingWidgets);
- Predicate<WidgetItem> filter = notOnUiSurfaceFilter(existingWidgets);
-
- MODEL_EXECUTOR.execute(() -> {
- clear();
- AppPredictionManager apm = mContext.getSystemService(AppPredictionManager.class);
- if (apm == null) {
- return;
- }
-
- mAppPredictor = apm.createAppPredictionSession(
- new AppPredictionContext.Builder(mContext)
- .setUiSurface(mUiSurface)
- .setExtras(bundle)
- .setPredictedTargetCount(NUM_OF_RECOMMENDED_WIDGETS_PREDICATION)
- .build());
- mAppPredictor.registerPredictionUpdates(MODEL_EXECUTOR,
- targets -> bindPredictions(targets, filter, callback));
- mAppPredictor.requestPredictionUpdate();
- });
+ mAppPredictor = apm.createAppPredictionSession(
+ new AppPredictionContext.Builder(mContext)
+ .setUiSurface(mUiSurface)
+ .setExtras(bundle)
+ .setPredictedTargetCount(NUM_OF_RECOMMENDED_WIDGETS_PREDICATION)
+ .build());
+ mAppPredictor.registerPredictionUpdates(MODEL_EXECUTOR, /*callback=*/ this);
+ mAppPredictor.requestPredictionUpdate();
}
/**
@@ -158,27 +173,14 @@
return widgetItem -> !existingComponentKeys.contains(widgetItem);
}
- /** Provides the predictions returned by the predictor to the registered callback. */
- @WorkerThread
- private void bindPredictions(List<AppTarget> targets, Predicate<WidgetItem> filter,
- Consumer<List<ItemInfo>> callback) {
- if (!mPredictionsAvailable) {
- mPredictionsAvailable = true;
- List<WidgetItem> filteredPredictions = filterPredictions(targets, mAllWidgets, filter);
- List<ItemInfo> mappedPredictions = mapWidgetItemsToItemInfo(filteredPredictions);
-
- MAIN_EXECUTOR.execute(() -> callback.accept(mappedPredictions));
- MODEL_EXECUTOR.execute(this::clear);
- }
- }
-
/**
* Applies the provided filter (e.g. widgets not on workspace) on the predictions returned by
* the predictor.
*/
@VisibleForTesting
static List<WidgetItem> filterPredictions(List<AppTarget> predictions,
- Map<ComponentKey, WidgetItem> allWidgets, Predicate<WidgetItem> filter) {
+ @NonNull Map<ComponentKey, WidgetItem> allWidgets,
+ @Nullable Predicate<WidgetItem> filter) {
List<WidgetItem> servicePredictedItems = new ArrayList<>();
for (AppTarget prediction : predictions) {
@@ -187,7 +189,7 @@
WidgetItem widgetItem = allWidgets.get(
new ComponentKey(new ComponentName(prediction.getPackageName(), className),
prediction.getUser()));
- if (widgetItem != null && filter.test(widgetItem)) {
+ if (widgetItem != null && (filter == null || filter.test(widgetItem))) {
servicePredictedItems.add(widgetItem);
}
}
@@ -218,9 +220,23 @@
/** Cleans up any open prediction sessions. */
public void clear() {
if (mAppPredictor != null) {
+ mAppPredictor.unregisterPredictionUpdates(this);
mAppPredictor.destroy();
mAppPredictor = null;
}
+ mPredictionsListener = null;
mPredictionsAvailable = false;
+ mFilter = null;
+ }
+
+ /**
+ * Listener class to listen to updates from the {@link WidgetPredictionsRequester}
+ */
+ public interface WidgetPredictionsListener {
+ /**
+ * Callback method that is called when the predicted widgets are available.
+ * @param predictions list of predicted widgets {@link PendingAddWidgetInfo}
+ */
+ void onPredictionsAvailable(List<ItemInfo> predictions);
}
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/BaseTaskbarContext.java b/quickstep/src/com/android/launcher3/taskbar/BaseTaskbarContext.java
index b33fd38..09a8670 100644
--- a/quickstep/src/com/android/launcher3/taskbar/BaseTaskbarContext.java
+++ b/quickstep/src/com/android/launcher3/taskbar/BaseTaskbarContext.java
@@ -19,25 +19,19 @@
import android.content.Intent;
import android.content.pm.ShortcutInfo;
import android.os.UserHandle;
-import android.view.ContextThemeWrapper;
import android.view.LayoutInflater;
-import com.android.launcher3.DeviceProfile.OnDeviceProfileChangeListener;
import com.android.launcher3.popup.SystemShortcut;
+import com.android.launcher3.util.BaseContext;
import com.android.launcher3.util.Themes;
-import com.android.launcher3.views.ActivityContext;
import com.android.quickstep.SystemUiProxy;
-import java.util.ArrayList;
-import java.util.List;
-
// TODO(b/218912746): Share more behavior to avoid all apps context depending directly on taskbar.
/** Base for common behavior between taskbar window contexts. */
-public abstract class BaseTaskbarContext extends ContextThemeWrapper implements ActivityContext,
- SystemShortcut.BubbleActivityStarter {
+public abstract class BaseTaskbarContext extends BaseContext
+ implements SystemShortcut.BubbleActivityStarter {
protected final LayoutInflater mLayoutInflater;
- private final List<OnDeviceProfileChangeListener> mDPChangeListeners = new ArrayList<>();
public BaseTaskbarContext(Context windowContext) {
super(windowContext, Themes.getActivityThemeRes(windowContext));
@@ -50,11 +44,6 @@
}
@Override
- public final List<OnDeviceProfileChangeListener> getOnDeviceProfileChangeListeners() {
- return mDPChangeListeners;
- }
-
- @Override
public void showShortcutBubble(ShortcutInfo info) {
if (info == null) return;
SystemUiProxy.INSTANCE.get(this).showShortcutBubble(info);
diff --git a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchController.java b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchController.java
index 8555376..cc94824 100644
--- a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchController.java
@@ -165,7 +165,7 @@
processLoadedTasks(tasks, taskIdsToExclude);
mQuickSwitchViewController.updateQuickSwitchView(
mTasks,
- mNumHiddenTasks,
+ wasOpenedFromTaskbar ? 0 : mNumHiddenTasks,
currentFocusIndexOverride,
mHasDesktopTask,
mWasDesktopTaskFilteredOut);
@@ -205,7 +205,7 @@
// running. If not, focus that first task.
mQuickSwitchViewController.openQuickSwitchView(
mTasks,
- mNumHiddenTasks,
+ wasOpenedFromTaskbar ? 0 : mNumHiddenTasks,
/* updateTasks= */ false,
currentFocusedIndex == -1 && !mControllerCallbacks.isFirstTaskRunning()
? 0 : currentFocusedIndex,
@@ -223,7 +223,7 @@
// the correct index.
mQuickSwitchViewController.openQuickSwitchView(
mTasks,
- mNumHiddenTasks,
+ wasOpenedFromTaskbar ? 0 : mNumHiddenTasks,
/* updateTasks= */ true,
currentFocusedIndex == -1 && !mControllerCallbacks.isFirstTaskRunning()
? 0 : currentFocusedIndex,
diff --git a/quickstep/src/com/android/launcher3/taskbar/PinToTaskbarShortcut.kt b/quickstep/src/com/android/launcher3/taskbar/PinToTaskbarShortcut.kt
index b9a211d..da6932f 100644
--- a/quickstep/src/com/android/launcher3/taskbar/PinToTaskbarShortcut.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/PinToTaskbarShortcut.kt
@@ -17,9 +17,15 @@
package com.android.launcher3.taskbar
import android.content.Context
+import android.util.SparseArray
import android.view.View
+import com.android.launcher3.DeviceProfile
+import com.android.launcher3.LauncherAppState
+import com.android.launcher3.LauncherSettings.Favorites.CONTAINER_HOTSEAT
import com.android.launcher3.R
+import com.android.launcher3.model.BgDataModel
import com.android.launcher3.model.data.ItemInfo
+import com.android.launcher3.model.data.WorkspaceItemInfo
import com.android.launcher3.popup.SystemShortcut
import com.android.launcher3.views.ActivityContext
@@ -27,16 +33,59 @@
* A single menu item shortcut to allow users to pin an item to the taskbar and unpin an item from
* the taskbar.
*/
-class PinToTaskbarShortcut<T>(target: T, itemInfo: ItemInfo?, originalView: View, isPin: Boolean) :
+class PinToTaskbarShortcut<T>(
+ target: T,
+ itemInfo: ItemInfo?,
+ originalView: View,
+ private val mIsPin: Boolean,
+ private val mPinnedInfoList: SparseArray<ItemInfo?>,
+) :
SystemShortcut<T>(
- if (isPin) R.drawable.ic_pin else R.drawable.ic_unpin,
- if (isPin) R.string.pin_to_taskbar else R.string.unpin_from_taskbar,
+ if (mIsPin) R.drawable.ic_pin else R.drawable.ic_unpin,
+ if (mIsPin) R.string.pin_to_taskbar else R.string.unpin_from_taskbar,
target,
itemInfo,
originalView,
) where T : Context?, T : ActivityContext? {
override fun onClick(v: View?) {
- // TODO(b/375648361): Pin/Unpin the item here.
+ dismissTaskMenuView()
+ // Create a placeholder callbacks for the writer to notify other launcher model callbacks
+ // after update.
+ val callbacks: BgDataModel.Callbacks = object : BgDataModel.Callbacks {}
+
+ val writer =
+ LauncherAppState.getInstance(mOriginalView.context)
+ .model
+ .getWriter(true, mTarget!!.cellPosMapper, callbacks)
+
+ if (!mIsPin) {
+ writer.deleteItemFromDatabase(mItemInfo, "item unpinned through long-press menu")
+ return
+ }
+
+ val newInfo =
+ if (mItemInfo is com.android.launcher3.model.data.AppInfo) {
+ mItemInfo.makeWorkspaceItem(mOriginalView.context)
+ } else if (mItemInfo is WorkspaceItemInfo) {
+ mItemInfo.clone()
+ } else {
+ return
+ }
+
+ val dp: DeviceProfile = mTarget.deviceProfile
+ var targetIdx = -1
+
+ for (i in 0 until dp.numShownHotseatIcons) {
+ if (mPinnedInfoList[i] == null) {
+ targetIdx = i
+ break
+ }
+ }
+
+ val cellX = if (dp.isVerticalBarLayout()) 0 else targetIdx
+ val cellY = if (dp.isVerticalBarLayout()) (dp.numShownHotseatIcons - (targetIdx + 1)) else 0
+
+ writer.addItemToDatabase(newInfo, CONTAINER_HOTSEAT, mItemInfo.screenId, cellX, cellY)
}
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
index 4ac05ff..39f80c2 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
@@ -71,7 +71,6 @@
import android.os.Trace;
import android.provider.Settings;
import android.util.Log;
-import android.view.Display;
import android.view.Gravity;
import android.view.Surface;
import android.view.View;
@@ -159,7 +158,6 @@
import com.android.launcher3.util.SplitConfigurationOptions.SplitSelectSource;
import com.android.launcher3.util.TraceHelper;
import com.android.launcher3.util.VibratorWrapper;
-import com.android.launcher3.util.ViewCache;
import com.android.launcher3.views.ActivityContext;
import com.android.quickstep.NavHandle;
import com.android.quickstep.RecentsModel;
@@ -225,7 +223,6 @@
private NavigationMode mNavMode;
private boolean mImeDrawsImeNavBar;
- private final ViewCache mViewCache = new ViewCache();
private final boolean mIsSafeModeEnabled;
private final boolean mIsUserSetupComplete;
@@ -285,7 +282,6 @@
mIsNavBarForceVisible = mIsNavBarKidsMode;
// Get display and corners first, as views might use them in constructor.
- Display display = windowContext.getDisplay();
Context c = getApplicationContext();
mWindowManager = c.getSystemService(WindowManager.class);
@@ -387,6 +383,14 @@
DesktopVisibilityController.INSTANCE.get(this)));
mLauncherPrefs = LauncherPrefs.get(this);
+ onViewCreated();
+ }
+
+ /**
+ * Returns whether this is a primary display.
+ */
+ public boolean isPrimaryDisplay() {
+ return mIsPrimaryDisplay;
}
/** Updates {@link DeviceProfile} instances for any Taskbar windows. */
@@ -801,11 +805,6 @@
}
@Override
- public ViewCache getViewCache() {
- return mViewCache;
- }
-
- @Override
public View.OnClickListener getItemOnClickListener() {
return this::onTaskbarIconClicked;
}
@@ -994,6 +993,7 @@
* Called when this instance of taskbar is no longer needed
*/
public void onDestroy() {
+ onViewDestroyed();
mIsDestroyed = true;
mTaskbarFeatureEvaluator.onDestroy();
setUIController(TaskbarUIController.DEFAULT);
@@ -1574,6 +1574,7 @@
public boolean canUnminimizeDesktopTask(int taskId) {
BubbleTextView.RunningAppState runningAppState =
mControllers.taskbarRecentAppsController.getRunningAppState(taskId);
+ Log.d(TAG, "Task id=" + taskId + ", Running app state=" + runningAppState);
return runningAppState == RunningAppState.MINIMIZED
&& DesktopModeFlags.ENABLE_DESKTOP_APP_LAUNCH_ALTTAB_TRANSITIONS_BUGFIX.isTrue();
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java
index 6ca9385..58606de 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java
@@ -195,8 +195,11 @@
voiceInteractionWindowController
};
+ // TODO(b/401061748): get primary status from
+ // TaskbarDesktopModeController/DesktopVisibilityController.
if (taskbarDesktopModeController.isInDesktopModeAndNotInOverview(
- taskbarActivityContext.getDisplayId())) {
+ taskbarActivityContext.getDisplayId())
+ || !taskbarActivityContext.isPrimaryDisplay()) {
mCornerRoundness.value = taskbarDesktopModeController.getTaskbarCornerRoundness(
mSharedState.showCornerRadiusInDesktopMode);
} else {
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
index 3a478c2..cc340ce 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
@@ -178,6 +178,12 @@
*/
private final RecreationListener mRecreationListener = new RecreationListener();
+ // Currently, there is a duplicative call to recreate taskbars when user enter/exit Desktop
+ // Mode upon getting transition callback from shell side. So, we make sure that if taskbar is
+ // already in recreate process due to transition callback, don't recreate for
+ // DisplayInfoChangeListener.
+ private boolean mShouldIgnoreNextDesktopModeChangeFromDisplayController = false;
+
private class RecreationListener implements DisplayController.DisplayInfoChangeListener {
@Override
public void onDisplayInfoChanged(Context context, DisplayController.Info info, int flags) {
@@ -206,10 +212,12 @@
if ((flags & CHANGE_SHOW_LOCKED_TASKBAR) != 0) {
recreateTaskbars();
} else if ((flags & CHANGE_DESKTOP_MODE) != 0) {
+ if (mShouldIgnoreNextDesktopModeChangeFromDisplayController) {
+ mShouldIgnoreNextDesktopModeChangeFromDisplayController = false;
+ return;
+ }
// Only Handles Special Exit Cases for Desktop Mode Taskbar Recreation.
if (taskbarActivityContext != null
- && !DesktopVisibilityController.INSTANCE.get(taskbarActivityContext)
- .isInDesktopMode()
&& !DisplayController.showLockedTaskbarOnHome(context)) {
recreateTaskbars();
}
@@ -292,6 +300,7 @@
displayId);
if (taskbarActivityContext != null
&& !taskbarActivityContext.isInOverview()) {
+ mShouldIgnoreNextDesktopModeChangeFromDisplayController = true;
AnimatorSet animatorSet = taskbarActivityContext.onDestroyAnimation(
TASKBAR_DESTROY_DURATION);
animatorSet.addListener(AnimatorListeners.forEndCallback(
@@ -308,11 +317,15 @@
int displayId = mTaskbars.keyAt(taskbarIndex);
TaskbarActivityContext taskbarActivityContext = getTaskbarForDisplay(
displayId);
- AnimatorSet animatorSet = taskbarActivityContext.onDestroyAnimation(
- TASKBAR_DESTROY_DURATION);
- animatorSet.addListener(AnimatorListeners.forEndCallback(
- () -> recreateTaskbarForDisplay(getDefaultDisplayId(), duration)));
- animatorSet.start();
+ if (taskbarActivityContext != null) {
+ mShouldIgnoreNextDesktopModeChangeFromDisplayController = true;
+ AnimatorSet animatorSet = taskbarActivityContext.onDestroyAnimation(
+ TASKBAR_DESTROY_DURATION);
+ animatorSet.addListener(AnimatorListeners.forEndCallback(
+ () -> recreateTaskbarForDisplay(getDefaultDisplayId(),
+ duration)));
+ animatorSet.start();
+ }
}
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarOverflowView.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarOverflowView.java
index 017a12c..d909d19 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarOverflowView.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarOverflowView.java
@@ -165,7 +165,6 @@
private boolean mIsRtlLayout;
private final List<Task> mItems = new ArrayList<Task>();
private int mIconSize;
- private int mPadding;
private Paint mItemBackgroundPaint;
private final MultiTranslateDelegate mTranslateDelegate = new MultiTranslateDelegate(this);
private float mScaleForReorderBounce = 1f;
@@ -214,25 +213,25 @@
TaskbarOverflowView icon = (TaskbarOverflowView) inflater.inflate(resId, group, false);
icon.mIconSize = iconSize;
- icon.mPadding = padding;
final float taskbarIconRadius =
- iconSize * IconNormalizer.ICON_VISIBLE_AREA_FACTOR / 2f - padding;
+ (iconSize - padding * 2f) * IconNormalizer.ICON_VISIBLE_AREA_FACTOR / 2f;
icon.mLeaveBehindSizeDefault = taskbarIconRadius; // 1/2 of taskbar app icon size
icon.mLeaveBehindSizeScaledDown =
icon.mLeaveBehindSizeDefault * LEAVE_BEHIND_SIZE_SCALE_DOWN_MULTIPLIER;
icon.mLeaveBehindSize = icon.mLeaveBehindSizeScaledDown;
- icon.mItemIconStrokeWidthDefault = taskbarIconRadius / 5f; // 1/10 of taskbar app icon size
+ icon.mItemIconStrokeWidthDefault =
+ taskbarIconRadius / 10f; // 1/20 of taskbar app icon size
icon.mItemIconStrokeWidth = icon.mItemIconStrokeWidthDefault;
- icon.mItemIconSizeDefault = 2 * (taskbarIconRadius - icon.mItemIconStrokeWidthDefault)
- * TWO_ITEM_ICONS_BOX_ASPECT_RATIO;
+ icon.mItemIconSizeDefault = 2f * taskbarIconRadius * TWO_ITEM_ICONS_BOX_ASPECT_RATIO;
icon.mItemIconSizeScaledDown = icon.mLeaveBehindSizeScaledDown;
icon.mItemIconSize = icon.mItemIconSizeDefault;
- icon.mItemIconCenterOffsetDefault = taskbarIconRadius - icon.mItemIconSizeDefault / 2f
+ icon.mItemIconCenterOffsetDefault = taskbarIconRadius
+ - icon.mItemIconSizeDefault * IconNormalizer.ICON_VISIBLE_AREA_FACTOR / 2f
- icon.mItemIconStrokeWidthDefault;
icon.mItemIconCenterOffset = icon.mItemIconCenterOffsetDefault;
@@ -242,9 +241,8 @@
private void init() {
mIsRtlLayout = Utilities.isRtl(getResources());
mItemBackgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
- mItemBackgroundColor = getContext().getColor(Utilities.isDarkTheme(getContext())
- ? com.android.internal.R.color.materialColorSurface
- : com.android.internal.R.color.materialColorInverseOnSurface);
+ mItemBackgroundColor = getContext().getColor(
+ com.android.internal.R.color.materialColorInverseOnSurface);
mLeaveBehindColor = Themes.getAttrColor(getContext(), android.R.attr.textColorTertiary);
setWillNotDraw(false);
@@ -260,8 +258,9 @@
private void drawAppIcons(@NonNull Canvas canvas) {
mItemBackgroundPaint.setColor(mItemBackgroundColor);
- float radius = mIconSize / 2f - mPadding;
+ float canvasCenterXY = mIconSize / 2f;
int adjustedItemIconSize = Math.round(mItemIconSize);
+ float itemIconRadius = adjustedItemIconSize / 2f;
int itemsToShow = Math.min(mItems.size(), MAX_ITEMS_IN_PREVIEW);
for (int i = itemsToShow - 1; i >= 0; --i) {
@@ -280,12 +279,12 @@
BlendMode.SRC_ATOP));
canvas.save();
- float itemIconRadius = adjustedItemIconSize / 2f;
canvas.translate(
- mPadding + itemCenterX + radius - itemIconRadius,
- mPadding + itemCenterY + radius - itemIconRadius);
+ canvasCenterXY + itemCenterX - itemIconRadius,
+ canvasCenterXY + itemCenterY - itemIconRadius);
canvas.drawCircle(itemIconRadius, itemIconRadius,
- itemIconRadius + mItemIconStrokeWidth, mItemBackgroundPaint);
+ itemIconRadius * IconNormalizer.ICON_VISIBLE_AREA_FACTOR + mItemIconStrokeWidth,
+ mItemBackgroundPaint);
iconCopy.draw(canvas);
canvas.restore();
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java
index 6ab71e9..1a6cd60 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java
@@ -216,11 +216,13 @@
return null;
}
if (itemInfo.container == CONTAINER_HOTSEAT) {
- return new PinToTaskbarShortcut<>(target, itemInfo, originalView, false);
+ return new PinToTaskbarShortcut<>(target, itemInfo, originalView, false,
+ mHotseatInfosList);
}
if (mHotseatInfosList.size()
< mContext.getTaskbarSpecsEvaluator().getNumShownHotseatIcons()) {
- return new PinToTaskbarShortcut<>(target, itemInfo, originalView, true);
+ return new PinToTaskbarShortcut<>(target, itemInfo, originalView, true,
+ mHotseatInfosList);
}
return null;
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java
index 0fe0224..a80e2c4 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java
@@ -24,6 +24,7 @@
import static com.android.app.animation.Interpolators.EMPHASIZED;
import static com.android.app.animation.Interpolators.FINAL_FRAME;
import static com.android.app.animation.Interpolators.LINEAR;
+import static com.android.launcher3.BubbleTextView.LINE_INDICATOR_ANIM_DURATION;
import static com.android.launcher3.Flags.enableScalingRevealHomeAnimation;
import static com.android.launcher3.Flags.taskbarOverflow;
import static com.android.launcher3.LauncherAnimUtils.SCALE_PROPERTY;
@@ -138,6 +139,8 @@
private static final int TRANSITION_DEFAULT_DURATION = 500;
private static final int TRANSITION_FADE_IN_DURATION = 167;
private static final int TRANSITION_FADE_OUT_DURATION = 83;
+ private static final int APPEARING_LINE_INDICATOR_ANIM_DELAY =
+ TRANSITION_DEFAULT_DURATION - LINE_INDICATOR_ANIM_DURATION;
private final TaskbarActivityContext mActivity;
private @Nullable TaskbarDragLayerController mDragLayerController;
@@ -736,7 +739,7 @@
public void updateIconViewsRunningStates() {
for (View iconView : getIconViews()) {
if (iconView instanceof BubbleTextView btv) {
- btv.updateRunningState(getRunningAppState(btv));
+ updateRunningState(btv);
if (shouldUpdateIconContentDescription(btv)) {
btv.setContentDescription(
btv.getContentDescription() + " " + btv.getIconStateDescription());
@@ -770,6 +773,10 @@
return pinnedAppsWithTasks;
}
+ private void updateRunningState(BubbleTextView btv) {
+ btv.updateRunningState(getRunningAppState(btv), mTaskbarView.getLayoutTransition() != null);
+ }
+
private BubbleTextView.RunningAppState getRunningAppState(BubbleTextView btv) {
Object tag = btv.getTag();
if (tag instanceof TaskItemInfo itemInfo) {
@@ -1225,13 +1232,22 @@
view.setAlpha(0f);
view.setScaleX(0f);
view.setScaleY(0f);
+ if (view instanceof BubbleTextView btv) {
+ // Defer so that app is mostly scaled in before showing indicator.
+ btv.setLineIndicatorAnimStartDelay(APPEARING_LINE_INDICATOR_ANIM_DELAY);
+ }
+ } else if (type == DISAPPEARING && view instanceof BubbleTextView btv) {
+ // Running state updates happen after removing this view, so update it here.
+ updateRunningState(btv);
}
}
@Override
public void endTransition(
LayoutTransition transition, ViewGroup container, View view, int type) {
- // Do nothing.
+ if (type == APPEARING && view instanceof BubbleTextView btv) {
+ btv.setLineIndicatorAnimStartDelay(0);
+ }
}
});
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java
index 1f5c541..277dbbf 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java
@@ -126,7 +126,6 @@
});
private final BubbleBarDragListener mDragListener = new BubbleBarDragListener() {
- @NonNull
@Override
public void getBubbleBarLocationHitRect(@NonNull BubbleBarLocation bubbleBarLocation,
Rect outRect) {
@@ -145,32 +144,31 @@
@Override
public void onLauncherItemDroppedOverBubbleBarDragZone(@NonNull BubbleBarLocation location,
@NonNull ItemInfo itemInfo) {
- //TODO(b/397459664) : fix drag interruption when there are no bubbles
- //TODO(b/397459664) : update bubble bar location
- ShortcutInfo shortcutInfo = null;
if (itemInfo instanceof WorkspaceItemInfo) {
- shortcutInfo = ((WorkspaceItemInfo) itemInfo).getDeepShortcutInfo();
+ ShortcutInfo shortcutInfo = ((WorkspaceItemInfo) itemInfo).getDeepShortcutInfo();
+ if (shortcutInfo != null) {
+ mSystemUiProxy.showShortcutBubble(shortcutInfo, location);
+ return;
+ }
}
Intent itemIntent = itemInfo.getIntent();
- SystemUiProxy systemUiProxy = SystemUiProxy.INSTANCE.get(mActivity);
- if (shortcutInfo != null) {
- systemUiProxy.showShortcutBubble(shortcutInfo);
- } else if (itemIntent != null && itemIntent.getComponent() != null) {
- systemUiProxy.showAppBubble(itemIntent, itemInfo.user);
+ if (itemIntent != null && itemIntent.getComponent() != null) {
+ itemIntent.setPackage(itemIntent.getComponent().getPackageName());
+ mSystemUiProxy.showAppBubble(itemIntent, itemInfo.user, location);
}
}
@Override
public void onLauncherItemDraggedOutsideBubbleBarDropZone() {
- //TODO(b/397459664) : hide expanded view drop target
onItemDraggedOutsideBubbleBarDropZone();
+ mSystemUiProxy.showBubbleDropTarget(/* show = */ false);
}
@Override
public void onLauncherItemDraggedOverBubbleBarDragZone(
@NonNull BubbleBarLocation location) {
- //TODO(b/397459664) : show expanded view drop target
onDragItemOverBubbleBarDragZone(location);
+ mSystemUiProxy.showBubbleDropTarget(/* show = */ true, location);
}
@NonNull
@@ -1363,6 +1361,19 @@
}
/**
+ * Removes the bubble from the bubble bar and notifies sysui that the bubble should move to
+ * full screen.
+ */
+ public void moveBubbleToFullscreen(@NonNull BubbleView bubbleView) {
+ if (bubbleView.getBubble() == null) {
+ return;
+ }
+ String key = bubbleView.getBubble().getKey();
+ mSystemUiProxy.moveBubbleToFullscreen(key);
+ onBubbleDismissed(bubbleView);
+ }
+
+ /**
* Create an animator for showing or hiding bubbles when stashed state changes
*
* @param isStashed {@code true} when bubble bar should be stashed to the handle
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleDragController.java b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleDragController.java
index a76b572..f77b934 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleDragController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleDragController.java
@@ -204,10 +204,19 @@
protected void onDragRelease() {
if (BubbleAnythingFlagHelper.enableBubbleToFullscreen()) {
mDropTargetManager.onDragEnded();
+ if (!mBubbleDragZoneChangedListener.isDraggedToFullscreen()) {
+ // TODO b/393173014: check for desktop window and split once they're
+ // implemented. this notifies wm shell that the dragged bubble was
+ // released so that we can show the expanded view. we only want to show it
+ // after releasing in a Bubble zone. But Split and Desktop Window aren't
+ // implemented yet, so we only check for full screen for now.
+ mBubbleBarViewController.onBubbleDragRelease(
+ getBubbleBarLocationDuringDrag());
+ }
} else {
mBubblePinController.onDragEnd();
+ mBubbleBarViewController.onBubbleDragRelease(getBubbleBarLocationDuringDrag());
}
- mBubbleBarViewController.onBubbleDragRelease(getBubbleBarLocationDuringDrag());
}
@Override
@@ -225,12 +234,15 @@
void onDragEnd() {
mBubbleBarController.updateBubbleBarLocation(getBubbleBarLocationDuringDrag(),
BubbleBarLocation.UpdateSource.DRAG_BUBBLE);
- mBubbleBarViewController.onBubbleDragEnd();
if (BubbleAnythingFlagHelper.enableBubbleToFullscreen()) {
mDropTargetManager.onDragEnded();
+ if (mBubbleDragZoneChangedListener.isDraggedToFullscreen()) {
+ mBubbleBarViewController.moveBubbleToFullscreen(bubbleView);
+ }
} else {
mBubblePinController.setListener(null);
}
+ mBubbleBarViewController.onBubbleDragEnd();
}
@Override
@@ -254,6 +266,12 @@
private final LocationChangeListener mLocationChangeListener =
location -> mReleasedLocation = location;
+ private BubbleBarLocation getBubbleBarLocationDuringDrag() {
+ return BubbleAnythingFlagHelper.enableBubbleToFullscreen()
+ ? mBubbleDragZoneChangedListener.mBubbleBarLocation
+ : mReleasedLocation;
+ }
+
@Override
protected boolean onTouchDown(@NonNull View view, @NonNull MotionEvent event) {
if (bubbleBarView.isExpanded()) return false;
@@ -262,50 +280,74 @@
@Override
void onDragStart() {
- mBubbleBarPinController.setListener(mLocationChangeListener);
initialRelativePivot.set(bubbleBarView.getRelativePivotX(),
bubbleBarView.getRelativePivotY());
// By default the bubble bar view pivot is in bottom right corner, while dragging
// it should be centered in order to align it with the dismiss target view
bubbleBarView.setRelativePivot(/* x = */ 0.5f, /* y = */ 0.5f);
bubbleBarView.setIsDragging(true);
- mBubbleBarPinController.onDragStart(
- bubbleBarView.getBubbleBarLocation().isOnLeft(bubbleBarView.isLayoutRtl()));
+ if (BubbleAnythingFlagHelper.enableBubbleToFullscreen()) {
+ DraggedObject.BubbleBar draggedBubbleBar = new DraggedObject.BubbleBar(
+ mBubbleBarViewController.getBubbleBarLocation());
+ mDropTargetManager.onDragStarted(draggedBubbleBar,
+ mDragZoneFactory.createSortedDragZones(draggedBubbleBar));
+ } else {
+ mBubbleBarPinController.setListener(mLocationChangeListener);
+ mBubbleBarPinController.onDragStart(
+ bubbleBarView.getBubbleBarLocation().isOnLeft(
+ bubbleBarView.isLayoutRtl()));
+ }
}
@Override
protected void onDragUpdate(float x, float y, float newTx, float newTy) {
bubbleBarView.setTranslationX(newTx);
bubbleBarView.setTranslationY(newTy);
- mBubbleBarPinController.onDragUpdate(x, y);
+ if (BubbleAnythingFlagHelper.enableBubbleToFullscreen()) {
+ mDropTargetManager.onDragUpdated((int) x, (int) y);
+ } else {
+ mBubbleBarPinController.onDragUpdate(x, y);
+ }
}
@Override
protected void onDragRelease() {
- mBubbleBarPinController.onDragEnd();
+ if (BubbleAnythingFlagHelper.enableBubbleToFullscreen()) {
+ mDropTargetManager.onDragEnded();
+ } else {
+ mBubbleBarPinController.onDragEnd();
+ }
}
@Override
protected void onDragDismiss() {
- mBubbleBarPinController.onDragEnd();
+ if (BubbleAnythingFlagHelper.enableBubbleToFullscreen()) {
+ mDropTargetManager.onDragEnded();
+ } else {
+ mBubbleBarPinController.onDragEnd();
+ }
}
@Override
void onDragEnd() {
// Make sure to update location as the first thing. Pivot update causes a relayout
- mBubbleBarController.updateBubbleBarLocation(mReleasedLocation,
+ mBubbleBarController.updateBubbleBarLocation(getBubbleBarLocationDuringDrag(),
BubbleBarLocation.UpdateSource.DRAG_BAR);
bubbleBarView.setIsDragging(false);
// Restoring the initial pivot for the bubble bar view
bubbleBarView.setRelativePivot(initialRelativePivot.x, initialRelativePivot.y);
mBubbleBarViewController.onBubbleBarDragEnd();
- mBubbleBarPinController.setListener(null);
+ if (BubbleAnythingFlagHelper.enableBubbleToFullscreen()) {
+ mDropTargetManager.onDragEnded();
+ } else {
+ mBubbleBarPinController.setListener(null);
+ }
}
@Override
protected PointF getRestingPosition() {
return mBubbleBarViewController.getBubbleBarDragReleaseTranslation(
- getInitialPosition(), mReleasedLocation);
+ getInitialPosition(), getBubbleBarLocationDuringDrag());
}
});
}
@@ -545,8 +587,17 @@
mAnimator.animateDismiss(mViewInitialPosition, onComplete);
} else {
onDragRelease();
- mAnimator.animateToRestingState(getRestingPosition(), getCurrentVelocity(),
+ if (BubbleAnythingFlagHelper.enableBubbleToFullscreen()) {
+ if (mBubbleDragZoneChangedListener.isDraggedToFullscreen()) {
+ onComplete.run();
+ } else {
+ mAnimator.animateToRestingState(getRestingPosition(), getCurrentVelocity(),
+ onComplete);
+ }
+ } else {
+ mAnimator.animateToRestingState(getRestingPosition(), getCurrentVelocity(),
onComplete);
+ }
}
mBubbleDismissController.hideDismissView();
}
@@ -590,9 +641,15 @@
private class BubbleDragZoneChangedListener implements DragZoneChangedListener {
private BubbleBarLocation mBubbleBarLocation = BubbleBarLocation.DEFAULT;
+ private DragZone mDragZone;
+
+ boolean isDraggedToFullscreen() {
+ return mDragZone instanceof DragZone.FullScreen;
+ }
@Override
public void onInitialDragZoneSet(@NonNull DragZone dragZone) {
+ mDragZone = dragZone;
if (dragZone instanceof DragZone.Bubble.Left) {
mBubbleBarLocation = BubbleBarLocation.LEFT;
} else if (dragZone instanceof DragZone.Bubble.Right) {
@@ -601,14 +658,20 @@
}
@Override
- public void onDragZoneChanged(@NonNull DragZone from, @NonNull DragZone to) {
+ public void onDragZoneChanged(@NonNull DraggedObject draggedObject, @NonNull DragZone from,
+ @NonNull DragZone to) {
+ mDragZone = to;
if (to instanceof DragZone.Bubble.Left
&& mBubbleBarLocation != BubbleBarLocation.LEFT) {
- mBubbleBarController.animateBubbleBarLocation(BubbleBarLocation.LEFT);
+ if (draggedObject instanceof DraggedObject.Bubble) {
+ mBubbleBarController.animateBubbleBarLocation(BubbleBarLocation.LEFT);
+ }
mBubbleBarLocation = BubbleBarLocation.LEFT;
} else if (to instanceof DragZone.Bubble.Right
&& mBubbleBarLocation != BubbleBarLocation.RIGHT) {
- mBubbleBarController.animateBubbleBarLocation(BubbleBarLocation.RIGHT);
+ if (draggedObject instanceof DraggedObject.Bubble) {
+ mBubbleBarController.animateBubbleBarLocation(BubbleBarLocation.RIGHT);
+ }
mBubbleBarLocation = BubbleBarLocation.RIGHT;
}
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimator.kt b/quickstep/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimator.kt
index 30cfafe..0da8c1f 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimator.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimator.kt
@@ -215,6 +215,7 @@
animator.spring(DynamicAnimation.TRANSLATION_Y, totalTranslationY, initialVelocity ?: 0f)
animator.addUpdateListener { handle, values ->
val ty = values[DynamicAnimation.TRANSLATION_Y]?.value ?: return@addUpdateListener
+ if (animatingBubble == null) return@addUpdateListener
when {
ty >= stashedHandleTranslationYForAnimation -> {
// we're in the first leg of the animation. only animate the handle. the bubble
diff --git a/quickstep/src/com/android/launcher3/taskbar/growth/NudgePayload.kt b/quickstep/src/com/android/launcher3/taskbar/growth/NudgePayload.kt
new file mode 100644
index 0000000..7498cbc
--- /dev/null
+++ b/quickstep/src/com/android/launcher3/taskbar/growth/NudgePayload.kt
@@ -0,0 +1,43 @@
+/*
+ * 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
+
+sealed interface Action {
+ data class Dismiss(
+ val markAsDismissed: Boolean = true,
+ val dismissRetentionInDays: Int? = null,
+ ) : Action
+
+ data class OpenUrl(val url: String) : Action
+}
+
+sealed class Image {
+ data class ResourceId(val resId: Int) : Image()
+
+ data class Url(val url: String) : Image()
+}
+
+data class ButtonPayload(val label: String, val actions: List<Action>)
+
+data class NudgePayload(
+ val titleText: String,
+ val bodyText: String,
+ val image: Image?,
+ val primaryButton: ButtonPayload?,
+ val secondaryButton: ButtonPayload?,
+
+ // TODO: b/396223717 - add anchoring information.
+)
diff --git a/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayContext.java b/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayContext.java
index 636d89b..55bb0f9 100644
--- a/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayContext.java
+++ b/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayContext.java
@@ -64,6 +64,7 @@
mStashedTaskbarHeight = controllers.taskbarStashController.getStashedHeight();
mUiController = controllers.uiController;
+ onViewCreated();
}
public @Nullable TaskbarSearchSessionController getSearchSessionController() {
diff --git a/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.kt b/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.kt
index 79328df..23dc81d 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.kt
+++ b/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.kt
@@ -76,10 +76,7 @@
if (state.displayOverviewTasksAsGrid(launcher.deviceProfile)) 1f else 0f,
)
if (enableDesktopExplodedView()) {
- DESK_EXPLODE_PROGRESS.set(
- recentsView,
- if (state.displayOverviewTasksAsGrid(launcher.deviceProfile)) 1f else 0f,
- )
+ DESK_EXPLODE_PROGRESS.set(recentsView, if (state.showExplodedDesktopView()) 1f else 0f)
}
TASK_THUMBNAIL_SPLASH_ALPHA.set(
@@ -168,7 +165,7 @@
builder.setFloat(
recentsView,
DESK_EXPLODE_PROGRESS,
- if (toState.isRecentsViewVisible) 1f else 0f,
+ if (toState.showExplodedDesktopView()) 1f else 0f,
getOverviewInterpolator(fromState, toState),
)
}
diff --git a/quickstep/src/com/android/launcher3/uioverrides/states/BackgroundAppState.java b/quickstep/src/com/android/launcher3/uioverrides/states/BackgroundAppState.java
index b1196af..a5b1ee7 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/states/BackgroundAppState.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/states/BackgroundAppState.java
@@ -97,6 +97,11 @@
}
@Override
+ public boolean showExplodedDesktopView() {
+ return false;
+ }
+
+ @Override
protected float getDepthUnchecked(Context context) {
if (Launcher.getLauncher(context).areDesktopTasksVisible()) {
// Don't blur the background while desktop tasks are visible
diff --git a/quickstep/src/com/android/launcher3/uioverrides/states/OverviewState.java b/quickstep/src/com/android/launcher3/uioverrides/states/OverviewState.java
index 5fdedcc..963504f 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/states/OverviewState.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/states/OverviewState.java
@@ -16,6 +16,7 @@
package com.android.launcher3.uioverrides.states;
import static com.android.app.animation.Interpolators.DECELERATE_2;
+import static com.android.launcher3.Flags.enableDesktopExplodedView;
import static com.android.launcher3.Flags.enableScalingRevealHomeAnimation;
import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_OVERVIEW;
@@ -171,6 +172,11 @@
}
@Override
+ public boolean showExplodedDesktopView() {
+ return enableDesktopExplodedView();
+ }
+
+ @Override
public boolean disallowTaskbarGlobalDrag() {
// Disable global drag in overview
return true;
diff --git a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
index 0566f09..7574c7f 100644
--- a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
+++ b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
@@ -413,7 +413,7 @@
mMSDLPlayerWrapper = msdlPlayerWrapper;
initTransitionEndpoints(mRemoteTargetHandles[0].getTaskViewSimulator()
- .getOrientationState().getLauncherDeviceProfile());
+ .getOrientationState().getLauncherDeviceProfile(gestureState.getDisplayId()));
initStateCallbacks();
mIsTransientTaskbar = mDp.isTaskbarPresent
@@ -991,7 +991,8 @@
// both split and non-split
RecentsOrientedState orientationState = mRemoteTargetHandles[0].getTaskViewSimulator()
.getOrientationState();
- DeviceProfile dp = orientationState.getLauncherDeviceProfile();
+ DeviceProfile dp = orientationState.getLauncherDeviceProfile(
+ mGestureState.getDisplayId());
if (targets.minimizedHomeBounds != null && primaryTaskTarget != null) {
Rect overviewStackBounds = mContainerInterface
.getOverviewWindowBounds(targets.minimizedHomeBounds, primaryTaskTarget);
diff --git a/quickstep/src/com/android/quickstep/SystemUiProxy.kt b/quickstep/src/com/android/quickstep/SystemUiProxy.kt
index 0f6649b..d6f6540 100644
--- a/quickstep/src/com/android/quickstep/SystemUiProxy.kt
+++ b/quickstep/src/com/android/quickstep/SystemUiProxy.kt
@@ -683,6 +683,20 @@
fun showExpandedView() =
executeWithErrorLog({ "Failed call showExpandedView" }) { bubbles?.showExpandedView() }
+ /** Tells SysUI to show the bubble drop target. */
+ @JvmOverloads
+ fun showBubbleDropTarget(show: Boolean, bubbleBarLocation: BubbleBarLocation? = null) =
+ executeWithErrorLog({ "Failed call showDropTarget" }) {
+ bubbles?.showDropTarget(show, bubbleBarLocation)
+ }
+
+ /** Tells SysUI to move the bubble to full screen. */
+ fun moveBubbleToFullscreen(key: String) {
+ executeWithErrorLog({ "Failed to call moveBubbleToFullscreen"}) {
+ bubbles?.moveBubbleToFullscreen(key)
+ }
+ }
+
//
// Splitscreen
//
diff --git a/quickstep/src/com/android/quickstep/TaskOverlayFactory.java b/quickstep/src/com/android/quickstep/TaskOverlayFactory.java
index a594e49..df66a5e 100644
--- a/quickstep/src/com/android/quickstep/TaskOverlayFactory.java
+++ b/quickstep/src/com/android/quickstep/TaskOverlayFactory.java
@@ -42,7 +42,7 @@
import com.android.launcher3.util.ResourceBasedOverride;
import com.android.launcher3.views.ActivityContext;
import com.android.launcher3.views.Snackbar;
-import com.android.quickstep.task.util.TaskOverlayHelper;
+import com.android.quickstep.recents.domain.usecase.ThumbnailPosition;
import com.android.quickstep.util.RecentsOrientedState;
import com.android.quickstep.views.DesktopTaskView;
import com.android.quickstep.views.GroupedTaskView;
@@ -52,6 +52,7 @@
import com.android.quickstep.views.TaskContainer;
import com.android.quickstep.views.TaskView;
import com.android.systemui.shared.recents.model.Task;
+import com.android.systemui.shared.recents.model.ThumbnailData;
import java.util.ArrayList;
import java.util.List;
@@ -134,43 +135,50 @@
private T mActionsView;
protected ImageActionsApi mImageApi;
- protected TaskOverlayHelper mHelper;
+ private ThumbnailData mThumbnailData = null;
protected TaskOverlay(TaskContainer taskContainer) {
mApplicationContext = taskContainer.getTaskView().getContext().getApplicationContext();
mTaskContainer = taskContainer;
- if (enableRefactorTaskThumbnail()) {
- mHelper = new TaskOverlayHelper(mTaskContainer.getTask(), this);
- }
mImageApi = new ImageActionsApi(mApplicationContext, this::getThumbnail);
}
- /**
- * Initialize the overlay when a Task is bound to the TaskView.
- */
- public void init() {
- if (enableRefactorTaskThumbnail()) {
- mHelper.init();
- }
- }
-
- /**
- * Destroy the overlay when the TaskView is recycled.
- */
- public void destroy() {
- if (enableRefactorTaskThumbnail()) {
- mHelper.destroy();
- }
+ public void setThumbnailState(@Nullable ThumbnailData thumbnailData) {
+ mThumbnailData = thumbnailData;
}
protected @Nullable Bitmap getThumbnail() {
- return enableRefactorTaskThumbnail() ? mHelper.getEnabledState().getThumbnail()
- : mTaskContainer.getThumbnailViewDeprecated().getThumbnail();
+ if (enableRefactorTaskThumbnail()) {
+ return mThumbnailData == null ? null : mThumbnailData.getThumbnail();
+ } else {
+ return mTaskContainer.getThumbnailViewDeprecated().getThumbnail();
+ }
+ }
+ /**
+ * Returns whether the snapshot is real. If the device is locked for the user of the task,
+ * the snapshot used will be an app-theme generated snapshot instead of a real snapshot.
+ */
+ protected boolean isRealSnapshot() {
+ if (enableRefactorTaskThumbnail()) {
+ if (mThumbnailData == null) return false;
+
+ return mThumbnailData.isRealSnapshot && !mTaskContainer.getTask().isLocked;
+ } else {
+ return mTaskContainer.getThumbnailViewDeprecated().isRealSnapshot();
+ }
}
- protected boolean isRealSnapshot() {
- return enableRefactorTaskThumbnail() ? mHelper.getEnabledState().isRealSnapshot()
- : mTaskContainer.getThumbnailViewDeprecated().isRealSnapshot();
+ /**
+ * Returns whether the snapshot is rotated compared to the current task orientation.
+ */
+ public boolean isThumbnailRotationDifferentFromTask() {
+ if (enableRefactorTaskThumbnail()) {
+ ThumbnailPosition thumbnailPosition = mTaskContainer.getThumbnailPosition();
+ return thumbnailPosition != null && thumbnailPosition.isRotated();
+ }
+
+ return mTaskContainer.getThumbnailViewDeprecated()
+ .isThumbnailRotationDifferentFromTask();
}
protected T getActionsView() {
@@ -316,9 +324,16 @@
// inverse tells us where the view would be in the bitmaps coordinates. The insets are
// the difference between the bitmap bounds and the projected view bounds.
Matrix boundsToBitmapSpace = new Matrix();
- Matrix thumbnailMatrix = enableRefactorTaskThumbnail()
- ? mHelper.getThumbnailMatrix()
- : mTaskContainer.getThumbnailViewDeprecated().getThumbnailMatrix();
+ Matrix thumbnailMatrix;
+ if (enableRefactorTaskThumbnail()) {
+ if (mTaskContainer.getThumbnailPosition() != null) {
+ thumbnailMatrix = mTaskContainer.getThumbnailPosition().getMatrix();
+ } else {
+ thumbnailMatrix = Matrix.IDENTITY_MATRIX;
+ }
+ } else {
+ thumbnailMatrix = mTaskContainer.getThumbnailViewDeprecated().getThumbnailMatrix();
+ }
thumbnailMatrix.invert(boundsToBitmapSpace);
RectF boundsInBitmapSpace = new RectF();
boundsToBitmapSpace.mapRect(boundsInBitmapSpace, viewRect);
@@ -359,13 +374,10 @@
private class ScreenshotSystemShortcut extends SystemShortcut {
- private final RecentsViewContainer mContainer;
-
ScreenshotSystemShortcut(RecentsViewContainer container, ItemInfo itemInfo,
View originalView) {
super(R.drawable.ic_screenshot, R.string.action_screenshot, container, itemInfo,
originalView);
- mContainer = container;
}
@Override
diff --git a/quickstep/src/com/android/quickstep/TaskShortcutFactory.java b/quickstep/src/com/android/quickstep/TaskShortcutFactory.java
index f92581e..bc46ace 100644
--- a/quickstep/src/com/android/quickstep/TaskShortcutFactory.java
+++ b/quickstep/src/com/android/quickstep/TaskShortcutFactory.java
@@ -20,7 +20,9 @@
import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
import static android.view.Surface.ROTATION_0;
+import static com.android.launcher3.Flags.enableGridOnlyOverview;
import static com.android.launcher3.Flags.enableRefactorTaskThumbnail;
+import static com.android.launcher3.Flags.enableShowEnabledShortcutsInAccessibilityMenu;
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_SYSTEM_SHORTCUT_CLOSE_APP_TAP;
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_SYSTEM_SHORTCUT_FREE_FORM_TAP;
import static com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_BOTTOM_OR_RIGHT;
@@ -42,7 +44,6 @@
import androidx.annotation.Nullable;
import com.android.launcher3.DeviceProfile;
-import com.android.launcher3.Flags;
import com.android.launcher3.R;
import com.android.launcher3.logging.StatsLogManager.LauncherEvent;
import com.android.launcher3.model.WellbeingModel;
@@ -345,15 +346,20 @@
boolean isTaskSplitNotSupported = !task.isDockable ||
(intentFlags & FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS) != 0;
boolean hideForExistingMultiWindow = container.getDeviceProfile().isMultiWindowMode;
- boolean isLargeTile = deviceProfile.isTablet && taskView.isLargeTile();
- boolean isTaskInExpectedScrollPosition =
- recentsView.isTaskInExpectedScrollPosition(taskView);
- if (notEnoughTasksToSplit || isTaskSplitNotSupported || hideForExistingMultiWindow
- || (isLargeTile && isTaskInExpectedScrollPosition)) {
+ if (notEnoughTasksToSplit || isTaskSplitNotSupported || hideForExistingMultiWindow) {
return null;
}
+ if (!enableShowEnabledShortcutsInAccessibilityMenu()) {
+ boolean isLargeTile = deviceProfile.isTablet && taskView.isLargeTile();
+ boolean isTaskInExpectedScrollPosition =
+ recentsView.isTaskInExpectedScrollPosition(taskView);
+ if (isLargeTile && isTaskInExpectedScrollPosition) {
+ return null;
+ }
+ }
+
return orientationHandler.getSplitPositionOptions(deviceProfile)
.stream()
.map((Function<SplitPositionOption, SystemShortcut>) option ->
@@ -500,16 +506,23 @@
@Override
public List<SystemShortcut> getShortcuts(RecentsViewContainer container,
TaskContainer taskContainer) {
- boolean isTablet = container.getDeviceProfile().isTablet;
- boolean isGridOnlyOverview = isTablet && Flags.enableGridOnlyOverview();
- // Extra conditions if it's not grid-only overview
- if (!isGridOnlyOverview) {
- RecentsOrientedState orientedState = taskContainer.getTaskView().getOrientedState();
- boolean isFakeLandscape = !orientedState.isRecentsActivityRotationAllowed()
- && orientedState.getTouchRotation() != ROTATION_0;
- if (!isFakeLandscape) {
+ if (enableShowEnabledShortcutsInAccessibilityMenu()) {
+ if (!taskContainer.getOverlay().isRealSnapshot()) {
return null;
}
+ } else {
+ boolean isTablet = container.getDeviceProfile().isTablet;
+ boolean isGridOnlyOverview = isTablet && enableGridOnlyOverview();
+ // Extra conditions if it's not grid-only overview
+ if (!isGridOnlyOverview) {
+ RecentsOrientedState orientedState = taskContainer.getTaskView()
+ .getOrientedState();
+ boolean isFakeLandscape = !orientedState.isRecentsActivityRotationAllowed()
+ && orientedState.getTouchRotation() != ROTATION_0;
+ if (!isFakeLandscape) {
+ return null;
+ }
+ }
}
SystemShortcut screenshotShortcut = taskContainer.getOverlay().getScreenshotShortcut(
@@ -527,10 +540,39 @@
@Override
public List<SystemShortcut> getShortcuts(RecentsViewContainer container,
TaskContainer taskContainer) {
- boolean isTablet = container.getDeviceProfile().isTablet;
- boolean isGridOnlyOverview = isTablet && Flags.enableGridOnlyOverview();
- if (!isGridOnlyOverview) {
- return null;
+ if (enableShowEnabledShortcutsInAccessibilityMenu()) {
+ if (!taskContainer.getOverlay().isRealSnapshot()) {
+ return null;
+ }
+
+ // Modal only works with grid size tiles with enableGridOnlyOverview enabled on
+ // tablets / foldables. With enableGridOnlyOverview off, for large tiles it works,
+ // but the tile needs to be in the center of Recents / Overview.
+ boolean isTablet = container.getDeviceProfile().isTablet;
+ RecentsView recentsView = container.getOverviewPanel();
+ boolean isLargeTileInCenterOfOverview = taskContainer.getTaskView().isLargeTile()
+ && recentsView.isFocusedTaskInExpectedScrollPosition();
+ if (isTablet
+ && !isLargeTileInCenterOfOverview
+ && !enableGridOnlyOverview()) {
+ return null;
+ }
+
+ boolean isFakeLandscape = !taskContainer.getTaskView().getPagedOrientationHandler()
+ .isLayoutNaturalToLauncher();
+ if (isFakeLandscape) {
+ return null;
+ }
+
+ if (taskContainer.getOverlay().isThumbnailRotationDifferentFromTask()) {
+ return null;
+ }
+ } else {
+ boolean isTablet = container.getDeviceProfile().isTablet;
+ boolean isGridOnlyOverview = isTablet && enableGridOnlyOverview();
+ if (!isGridOnlyOverview) {
+ return null;
+ }
}
SystemShortcut modalStateSystemShortcut =
diff --git a/quickstep/src/com/android/quickstep/TaskViewUtils.java b/quickstep/src/com/android/quickstep/TaskViewUtils.java
index 37c2d1c..855ff98 100644
--- a/quickstep/src/com/android/quickstep/TaskViewUtils.java
+++ b/quickstep/src/com/android/quickstep/TaskViewUtils.java
@@ -22,6 +22,7 @@
import static com.android.app.animation.Interpolators.LINEAR;
import static com.android.app.animation.Interpolators.TOUCH_RESPONSE;
import static com.android.app.animation.Interpolators.clampToProgress;
+import static com.android.launcher3.Flags.enableDesktopExplodedView;
import static com.android.launcher3.Flags.enableGridOnlyOverview;
import static com.android.launcher3.LauncherAnimUtils.VIEW_ALPHA;
import static com.android.launcher3.LauncherAnimUtils.VIEW_TRANSLATE_X;
@@ -201,6 +202,9 @@
recentsView.getSizeStrategy(), targets, forDesktop);
if (forDesktop) {
remoteTargetHandles = gluer.assignTargetsForDesktop(targets, transitionInfo);
+ if (enableDesktopExplodedView()) {
+ ((DesktopTaskView) taskView).setRemoteTargetHandles(remoteTargetHandles);
+ }
} else if (taskView.containsMultipleTasks()) {
remoteTargetHandles = gluer.assignTargetsForSplitScreen(targets,
((GroupedTaskView) taskView).getSplitBoundsConfig());
diff --git a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsStateController.java b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsStateController.java
index 2631efe..554cea2 100644
--- a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsStateController.java
+++ b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsStateController.java
@@ -132,7 +132,8 @@
getOverviewInterpolator(state));
}
if (enableDesktopExplodedView()) {
- setter.setFloat(mRecentsView, DESK_EXPLODE_PROGRESS, showAsGrid ? 1f : 0f,
+ setter.setFloat(mRecentsView, DESK_EXPLODE_PROGRESS,
+ state.showExplodedDesktopView() ? 1f : 0f,
getOverviewInterpolator(state));
}
diff --git a/quickstep/src/com/android/quickstep/fallback/RecentsState.java b/quickstep/src/com/android/quickstep/fallback/RecentsState.java
index f722c5d..2c1a4eb 100644
--- a/quickstep/src/com/android/quickstep/fallback/RecentsState.java
+++ b/quickstep/src/com/android/quickstep/fallback/RecentsState.java
@@ -15,6 +15,7 @@
*/
package com.android.quickstep.fallback;
+import static com.android.launcher3.Flags.enableDesktopExplodedView;
import static com.android.launcher3.Flags.enableDesktopWindowingCarouselDetach;
import static com.android.launcher3.LauncherState.FLAG_CLOSE_POPUPS;
import static com.android.launcher3.uioverrides.states.BackgroundAppState.getOverviewScaleAndOffsetForBackgroundState;
@@ -46,16 +47,18 @@
private static final int FLAG_TASK_THUMBNAIL_SPLASH = BaseState.getFlag(8);
private static final int FLAG_DETACH_DESKTOP_CAROUSEL = BaseState.getFlag(9);
private static final int FLAG_ADD_DESK_BUTTON = BaseState.getFlag(10);
+ private static final int FLAG_SHOW_EXPLODED_DESKTOP_VIEW = BaseState.getFlag(11);
private static final RecentsState[] sAllStates = new RecentsState[6];
public static final RecentsState DEFAULT = new RecentsState(0,
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_ADD_DESK_BUTTON | FLAG_SHOW_EXPLODED_DESKTOP_VIEW);
public static final RecentsState MODAL_TASK = new ModalState(1,
FLAG_DISABLE_RESTORE | FLAG_OVERVIEW_ACTIONS | FLAG_MODAL
- | FLAG_SHOW_AS_GRID | FLAG_SCRIM | FLAG_LIVE_TILE | FLAG_RECENTS_VIEW_VISIBLE);
+ | 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,
FLAG_DISABLE_RESTORE | FLAG_NON_INTERACTIVE | FLAG_FULL_SCREEN
| FLAG_RECENTS_VIEW_VISIBLE | FLAG_TASK_THUMBNAIL_SPLASH
@@ -64,7 +67,7 @@
public static final RecentsState BG_LAUNCHER = new LauncherState(4, 0);
public static final RecentsState OVERVIEW_SPLIT_SELECT = new RecentsState(5,
FLAG_SHOW_AS_GRID | FLAG_SCRIM | FLAG_RECENTS_VIEW_VISIBLE | FLAG_CLOSE_POPUPS
- | FLAG_DISABLE_RESTORE);
+ | FLAG_DISABLE_RESTORE | FLAG_SHOW_EXPLODED_DESKTOP_VIEW);
/** Returns the corresponding RecentsState from ordinal provided */
public static RecentsState stateFromOrdinal(int ordinal) {
@@ -174,6 +177,11 @@
return hasFlag(FLAG_DETACH_DESKTOP_CAROUSEL) && enableDesktopWindowingCarouselDetach();
}
+ @Override
+ public boolean showExplodedDesktopView() {
+ return hasFlag(FLAG_SHOW_EXPLODED_DESKTOP_VIEW) && enableDesktopExplodedView();
+ }
+
/**
* True if the state has overview panel visible.
*/
diff --git a/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowContext.kt b/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowContext.kt
index 9a408ad..333571c 100644
--- a/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowContext.kt
+++ b/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowContext.kt
@@ -18,18 +18,15 @@
import android.content.Context
import android.graphics.PixelFormat
-import android.view.ContextThemeWrapper
-import android.view.Display
+import android.view.Display.DEFAULT_DISPLAY
import android.view.ViewGroup
import android.view.WindowManager
import android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
import android.view.WindowManager.LayoutParams.PRIVATE_FLAG_CONSUME_IME_INSETS
import com.android.launcher3.DeviceProfile
import com.android.launcher3.InvariantDeviceProfile
+import com.android.launcher3.util.BaseContext
import com.android.launcher3.util.Themes
-import com.android.launcher3.views.ActivityContext
-import com.android.launcher3.views.BaseDragLayer
-import com.android.quickstep.fallback.RecentsDragLayer
/**
* Window context for the Overview overlays.
@@ -37,18 +34,14 @@
* <p>
* Overlays have their own window and need a window context.
*/
-open class RecentsWindowContext(windowContext: Context, wallpaperColorHints: Int) :
- ContextThemeWrapper(
- windowContext,
- Themes.getActivityThemeRes(windowContext, wallpaperColorHints),
- ),
- ActivityContext {
+abstract class RecentsWindowContext(windowContext: Context, wallpaperColorHints: Int) :
+ BaseContext(
+ base = windowContext,
+ themeResId = Themes.getActivityThemeRes(windowContext, wallpaperColorHints),
+ destroyOnDetach = false,
+ ) {
private var deviceProfile: DeviceProfile? = null
- private var dragLayer: RecentsDragLayer<RecentsWindowManager> = RecentsDragLayer(this, null)
- private val deviceProfileChangeListeners:
- MutableList<DeviceProfile.OnDeviceProfileChangeListener> =
- ArrayList()
private val windowTitle: String = "RecentsWindow"
@@ -58,13 +51,9 @@
windowTitle,
)
- override fun getDragLayer(): BaseDragLayer<RecentsWindowManager> {
- return dragLayer
- }
-
fun initDeviceProfile() {
deviceProfile =
- if (displayId == Display.DEFAULT_DISPLAY)
+ if (displayId == DEFAULT_DISPLAY)
InvariantDeviceProfile.INSTANCE[this].getDeviceProfile(this)
else InvariantDeviceProfile.INSTANCE[this].createDeviceProfileForSecondaryDisplay(this)
}
@@ -76,11 +65,6 @@
return deviceProfile!!
}
- override fun getOnDeviceProfileChangeListeners():
- List<DeviceProfile.OnDeviceProfileChangeListener> {
- return deviceProfileChangeListeners
- }
-
/**
* Creates LayoutParams for adding a view directly to WindowManager as a new window.
*
diff --git a/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowManager.kt b/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowManager.kt
index 6a13927..1a3a2e3 100644
--- a/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowManager.kt
+++ b/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowManager.kt
@@ -50,6 +50,7 @@
import com.android.launcher3.testing.shared.TestProtocol.SEQUENCE_MAIN
import com.android.launcher3.util.ContextTracker
import com.android.launcher3.util.DisplayController
+import com.android.launcher3.util.Executors
import com.android.launcher3.util.RunnableList
import com.android.launcher3.util.SystemUiController
import com.android.launcher3.views.BaseDragLayer
@@ -213,6 +214,7 @@
override fun destroy() {
super.destroy()
+ Executors.MAIN_EXECUTOR.execute { onViewDestroyed() }
cleanupRecentsWindow()
TaskStackChangeListeners.getInstance().unregisterTaskStackListener(taskStackChangeListener)
callbacks?.removeListener(recentsAnimationListener)
@@ -264,6 +266,7 @@
this.callbacks = callbacks
callbacks?.addListener(recentsAnimationListener)
+ onViewCreated()
}
override fun startHome() {
diff --git a/quickstep/src/com/android/quickstep/orientation/LandscapePagedViewHandler.kt b/quickstep/src/com/android/quickstep/orientation/LandscapePagedViewHandler.kt
index e3c9b2b..c4e343e 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 FrameLayout.LayoutParams
+ val snapshotParams = thumbnailViews[0].layoutParams as LinearLayout.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 1883649..15eb69e 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 FrameLayout.LayoutParams
+ val snapshotParams = thumbnailViews[0].layoutParams as LinearLayout.LayoutParams
val bottomRightTaskPlusDividerPercent =
(splitBounds.rightBottomTaskPercent + splitBounds.dividerPercent)
translationY =
@@ -726,7 +726,11 @@
val secondarySnapshotWidth = groupedTaskViewWidth - primarySnapshotWidth
primaryAppChipView.setSplitTranslationX(-secondarySnapshotWidth.toFloat())
} else {
- secondaryAppChipView.setSplitTranslationX(primarySnapshotWidth.toFloat())
+ val dividerSize =
+ Math.round(groupedTaskViewWidth * splitConfig.dividerPercent)
+ secondaryAppChipView.setSplitTranslationX(
+ primarySnapshotWidth.toFloat() + dividerSize
+ )
}
} else {
primaryAppChipView.setSplitTranslationX(0f)
diff --git a/quickstep/src/com/android/quickstep/orientation/SeascapePagedViewHandler.kt b/quickstep/src/com/android/quickstep/orientation/SeascapePagedViewHandler.kt
index 1f9f752..67358bbb 100644
--- a/quickstep/src/com/android/quickstep/orientation/SeascapePagedViewHandler.kt
+++ b/quickstep/src/com/android/quickstep/orientation/SeascapePagedViewHandler.kt
@@ -26,6 +26,7 @@
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
@@ -151,7 +152,7 @@
desiredTaskId: Int,
banner: View,
): Pair<Float, Float> {
- val snapshotParams = thumbnailViews[0].layoutParams as FrameLayout.LayoutParams
+ val snapshotParams = thumbnailViews[0].layoutParams as LinearLayout.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 619075f..aa1c236 100644
--- a/quickstep/src/com/android/quickstep/recents/ui/mapper/TaskUiStateMapper.kt
+++ b/quickstep/src/com/android/quickstep/recents/ui/mapper/TaskUiStateMapper.kt
@@ -18,17 +18,49 @@
import android.view.View.OnClickListener
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
@@ -36,46 +68,24 @@
*
* @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,
- hasHeader: Boolean,
- clickCloseListener: OnClickListener?,
- ): TaskThumbnailUiState =
+ fun toTaskThumbnailUiState(taskData: TaskData?, isLiveTile: Boolean): TaskThumbnailUiState =
when {
taskData !is TaskData.Data -> Uninitialized
- isLiveTile -> createLiveTileState(taskData, hasHeader, clickCloseListener)
+ isLiveTile -> LiveTile
isBackgroundOnly(taskData) -> BackgroundOnly(taskData.backgroundColor)
isSnapshotSplash(taskData) ->
SnapshotSplash(
- createSnapshotState(taskData, hasHeader, clickCloseListener),
+ Snapshot(
+ taskData.thumbnailData?.thumbnail!!,
+ taskData.thumbnailData.rotation,
+ taskData.backgroundColor,
+ ),
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,
- )
+ else -> Uninitialized
}
private fun isBackgroundOnly(taskData: TaskData.Data) =
@@ -93,17 +103,4 @@
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 118a931..8a6a805 100644
--- a/quickstep/src/com/android/quickstep/recents/ui/viewmodel/TaskTileUiState.kt
+++ b/quickstep/src/com/android/quickstep/recents/ui/viewmodel/TaskTileUiState.kt
@@ -36,6 +36,7 @@
val isLiveTile: Boolean,
val hasHeader: Boolean,
val sysUiStatusNavFlags: Int,
+ val taskOverlayEnabled: 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 3c4a384..09e2071 100644
--- a/quickstep/src/com/android/quickstep/recents/ui/viewmodel/TaskViewModel.kt
+++ b/quickstep/src/com/android/quickstep/recents/ui/viewmodel/TaskViewModel.kt
@@ -29,6 +29,7 @@
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
@@ -74,8 +75,18 @@
)
}
+ private val overlayEnabled =
+ combine(recentsViewData.overlayEnabled, recentsViewData.settledFullyVisibleTaskIds) {
+ isOverlayEnabled,
+ settledFullyVisibleTaskIds ->
+ taskViewType == SINGLE &&
+ isOverlayEnabled &&
+ settledFullyVisibleTaskIds.any { it in taskIds.value }
+ }
+ .distinctUntilChanged()
+
val state: Flow<TaskTileUiState> =
- combine(taskData, isLiveTile) { tasks, isLiveTile -> mapToTaskTile(tasks, isLiveTile) }
+ combine(taskData, isLiveTile, overlayEnabled, ::mapToTaskTile)
.distinctUntilChanged()
.flowOn(dispatcherProvider.background)
@@ -99,13 +110,18 @@
isRtl = isRtl,
)
- private fun mapToTaskTile(tasks: List<TaskData>, isLiveTile: Boolean): TaskTileUiState {
+ private fun mapToTaskTile(
+ tasks: List<TaskData>,
+ isLiveTile: Boolean,
+ overlayEnabled: Boolean,
+ ): TaskTileUiState {
val firstThumbnailData = (tasks.firstOrNull() as? TaskData.Data)?.thumbnailData
return TaskTileUiState(
tasks = tasks,
isLiveTile = isLiveTile,
hasHeader = taskViewType == TaskViewType.DESKTOP,
sysUiStatusNavFlags = getSysUiStatusNavFlagsUseCase(firstThumbnailData),
+ taskOverlayEnabled = overlayEnabled,
)
}
diff --git a/quickstep/src/com/android/quickstep/task/thumbnail/TaskContentView.kt b/quickstep/src/com/android/quickstep/task/thumbnail/TaskContentView.kt
new file mode 100644
index 0000000..2dbd811
--- /dev/null
+++ b/quickstep/src/com/android/quickstep/task/thumbnail/TaskContentView.kt
@@ -0,0 +1,159 @@
+/*
+ * 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.enableDesktopExplodedView
+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()
+ maybeCreateHeader()
+ 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 maybeCreateHeader() {
+ if (enableDesktopExplodedView() && taskHeaderView == null) {
+ taskHeaderView =
+ LayoutInflater.from(context).inflate(R.layout.task_header_view, this, false)
+ as TaskHeaderView
+ addView(taskHeaderView)
+ }
+ }
+
+ 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?,
+ ) {
+ 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
new file mode 100644
index 0000000..09fb540
--- /dev/null
+++ b/quickstep/src/com/android/quickstep/task/thumbnail/TaskHeaderUiState.kt
@@ -0,0 +1,32 @@
+/*
+ * 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/TaskOverlayUiState.kt b/quickstep/src/com/android/quickstep/task/thumbnail/TaskOverlayUiState.kt
deleted file mode 100644
index 5fb5b90..0000000
--- a/quickstep/src/com/android/quickstep/task/thumbnail/TaskOverlayUiState.kt
+++ /dev/null
@@ -1,26 +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.graphics.Bitmap
-
-/** Ui state for [com.android.quickstep.TaskOverlayFactory.TaskOverlay] */
-sealed class TaskOverlayUiState {
- data object Disabled : TaskOverlayUiState()
-
- data class Enabled(val isRealSnapshot: Boolean, val thumbnail: Bitmap?) : TaskOverlayUiState()
-}
diff --git a/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailUiState.kt b/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailUiState.kt
index db593d3..a5c9ac0 100644
--- a/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailUiState.kt
+++ b/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailUiState.kt
@@ -19,7 +19,6 @@
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 {
@@ -27,37 +26,14 @@
data class BackgroundOnly(@ColorInt val backgroundColor: Int) : TaskThumbnailUiState()
+ data object LiveTile : TaskThumbnailUiState()
+
data class SnapshotSplash(val snapshot: Snapshot, val splash: Drawable?) :
TaskThumbnailUiState()
- 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,
+ data class Snapshot(
+ val bitmap: Bitmap,
+ @Surface.Rotation val thumbnailRotation: Int,
+ @ColorInt val backgroundColor: Int,
)
}
diff --git a/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailView.kt b/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailView.kt
index 0edbacc..78a16f1 100644
--- a/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailView.kt
+++ b/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailView.kt
@@ -19,32 +19,24 @@
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, ViewPool.Reusable {
+class TaskThumbnailView : FrameLayout {
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) }
@@ -53,30 +45,9 @@
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)
@@ -87,39 +58,8 @@
defStyleAttr: Int,
) : super(context, attrs, defStyleAttr)
- 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() {
+ fun onRecycle() {
uiState = Uninitialized
- onSizeChanged = null
- outlineBounds = null
resetViews()
}
@@ -130,7 +70,7 @@
resetViews()
when (state) {
is Uninitialized -> {}
- is LiveTile -> drawLiveWindow(state)
+ is LiveTile -> drawLiveWindow()
is SnapshotSplash -> drawSnapshotSplash(state)
is BackgroundOnly -> drawBackground(state.backgroundColor)
}
@@ -155,25 +95,12 @@
splashIcon.alpha = value
}
- 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)
+ fun parentScaleXUpdated(scaleX: Float) {
// Splash icon should ignore scale on TTV
splashIcon.scaleX = 1 / scaleX
}
- override fun setScaleY(scaleY: Float) {
- super.setScaleY(scaleY)
+ fun parentScaleYUpdated(scaleY: Float) {
// Splash icon should ignore scale on TTV
splashIcon.scaleY = 1 / scaleY
}
@@ -187,20 +114,14 @@
splashIcon.setImageDrawable(null)
scrimView.alpha = 0f
setBackgroundColor(Color.BLACK)
- taskThumbnailViewHeader?.isInvisible = true
}
private fun drawBackground(@ColorInt background: Int) {
setBackgroundColor(background)
}
- private fun drawLiveWindow(liveTile: LiveTile) {
+ private fun drawLiveWindow() {
liveTileView.isInvisible = false
-
- if (liveTile is LiveTile.WithHeader) {
- taskThumbnailViewHeader?.isInvisible = false
- taskThumbnailViewHeader?.setHeader(liveTile.header)
- }
}
private fun drawSnapshotSplash(snapshotSplash: SnapshotSplash) {
@@ -212,11 +133,6 @@
}
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
@@ -232,16 +148,6 @@
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/task/util/TaskOverlayHelper.kt b/quickstep/src/com/android/quickstep/task/util/TaskOverlayHelper.kt
deleted file mode 100644
index d4f567e..0000000
--- a/quickstep/src/com/android/quickstep/task/util/TaskOverlayHelper.kt
+++ /dev/null
@@ -1,128 +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.util
-
-import android.util.Log
-import android.view.View.OnLayoutChangeListener
-import com.android.launcher3.util.coroutines.DispatcherProvider
-import com.android.quickstep.TaskOverlayFactory
-import com.android.quickstep.recents.di.RecentsDependencies
-import com.android.quickstep.recents.di.get
-import com.android.quickstep.task.thumbnail.TaskOverlayUiState
-import com.android.quickstep.task.thumbnail.TaskOverlayUiState.Disabled
-import com.android.quickstep.task.thumbnail.TaskOverlayUiState.Enabled
-import com.android.quickstep.task.viewmodel.TaskOverlayViewModel
-import com.android.systemui.shared.recents.model.Task
-import kotlinx.coroutines.CoroutineName
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.SupervisorJob
-import kotlinx.coroutines.cancel
-import kotlinx.coroutines.flow.dropWhile
-import kotlinx.coroutines.flow.flowOn
-import kotlinx.coroutines.flow.launchIn
-import kotlinx.coroutines.flow.onEach
-import kotlinx.coroutines.launch
-
-/**
- * Helper for [TaskOverlayFactory.TaskOverlay] to interact with [TaskOverlayViewModel], this helper
- * should merge with [TaskOverlayFactory.TaskOverlay] when it's migrated to MVVM.
- */
-class TaskOverlayHelper(val task: Task, val overlay: TaskOverlayFactory.TaskOverlay<*>) {
- private val scope = overlay.taskView.context
- private val recentsCoroutineScope: CoroutineScope = RecentsDependencies.get(scope)
- private val dispatcherProvider: DispatcherProvider = RecentsDependencies.get(scope)
- private lateinit var overlayInitializedScope: CoroutineScope
- private var uiState: TaskOverlayUiState = Disabled
-
- private lateinit var viewModel: TaskOverlayViewModel
-
- // TODO(b/331753115): TaskOverlay should listen for state changes and react.
- val enabledState: Enabled
- get() = uiState as Enabled
-
- private val snapshotLayoutChangeListener = OnLayoutChangeListener { _, _, _, _, _, _, _, _, _ ->
- (uiState as? Enabled)?.let { initOverlay(it) }
- }
-
- fun getThumbnailMatrix() = getThumbnailPositionState().matrix
-
- private fun getThumbnailPositionState() =
- viewModel.getThumbnailPositionState(
- overlay.snapshotView.width,
- overlay.snapshotView.height,
- overlay.snapshotView.isLayoutRtl,
- )
-
- fun init() {
- overlayInitializedScope =
- CoroutineScope(
- SupervisorJob() + Dispatchers.Main.immediate + CoroutineName("TaskOverlayHelper")
- )
- viewModel =
- TaskOverlayViewModel(
- task = task,
- recentsViewData = RecentsDependencies.get(scope),
- getThumbnailPositionUseCase = RecentsDependencies.get(scope),
- recentTasksRepository = RecentsDependencies.get(scope),
- dispatcherProvider = RecentsDependencies.get(scope),
- )
- viewModel.overlayState
- .dropWhile { it == Disabled }
- .flowOn(dispatcherProvider.background)
- .onEach {
- uiState = it
- if (it is Enabled) {
- initOverlay(it)
- } else {
- reset()
- }
- }
- .launchIn(overlayInitializedScope)
- overlay.snapshotView.addOnLayoutChangeListener(snapshotLayoutChangeListener)
- }
-
- private fun initOverlay(enabledState: Enabled) {
- if (DEBUG) {
- Log.d(TAG, "initOverlay - taskId: ${task.key.id}, thumbnail: ${enabledState.thumbnail}")
- }
- with(getThumbnailPositionState()) {
- overlay.initOverlay(task, enabledState.thumbnail, matrix, isRotated)
- }
- }
-
- private fun reset() {
- if (DEBUG) {
- Log.d(TAG, "reset - taskId: ${task.key.id}")
- }
- overlay.reset()
- }
-
- fun destroy() {
- recentsCoroutineScope.launch(dispatcherProvider.background) {
- overlayInitializedScope.cancel("TaskOverlay being destroyed")
- }
- uiState = Disabled
- overlay.snapshotView.removeOnLayoutChangeListener(snapshotLayoutChangeListener)
- reset()
- }
-
- companion object {
- private const val TAG = "TaskOverlayHelper"
- private const val DEBUG = false
- }
-}
diff --git a/quickstep/src/com/android/quickstep/task/viewmodel/TaskOverlayViewModel.kt b/quickstep/src/com/android/quickstep/task/viewmodel/TaskOverlayViewModel.kt
deleted file mode 100644
index 9bff3ac..0000000
--- a/quickstep/src/com/android/quickstep/task/viewmodel/TaskOverlayViewModel.kt
+++ /dev/null
@@ -1,75 +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.viewmodel
-
-import android.graphics.Matrix
-import com.android.launcher3.util.coroutines.DispatcherProvider
-import com.android.quickstep.recents.data.RecentTasksRepository
-import com.android.quickstep.recents.domain.usecase.GetThumbnailPositionUseCase
-import com.android.quickstep.recents.viewmodel.RecentsViewData
-import com.android.quickstep.task.thumbnail.TaskOverlayUiState.Disabled
-import com.android.quickstep.task.thumbnail.TaskOverlayUiState.Enabled
-import com.android.systemui.shared.recents.model.Task
-import kotlinx.coroutines.flow.combine
-import kotlinx.coroutines.flow.distinctUntilChanged
-import kotlinx.coroutines.flow.flowOn
-import kotlinx.coroutines.flow.map
-
-/** View model for TaskOverlay */
-class TaskOverlayViewModel(
- private val task: Task,
- recentsViewData: RecentsViewData,
- private val getThumbnailPositionUseCase: GetThumbnailPositionUseCase,
- private val recentTasksRepository: RecentTasksRepository,
- dispatcherProvider: DispatcherProvider,
-) {
- val overlayState =
- combine(
- recentsViewData.overlayEnabled,
- recentsViewData.settledFullyVisibleTaskIds
- .map { it.contains(task.key.id) }
- .distinctUntilChanged(),
- recentTasksRepository.getThumbnailById(task.key.id),
- ) { isOverlayEnabled, isFullyVisible, thumbnailData ->
- if (isOverlayEnabled && isFullyVisible) {
- Enabled(
- isRealSnapshot = (thumbnailData?.isRealSnapshot ?: false) && !task.isLocked,
- thumbnailData?.thumbnail,
- )
- } else {
- Disabled
- }
- }
- .distinctUntilChanged()
- .flowOn(dispatcherProvider.background)
-
- fun getThumbnailPositionState(width: Int, height: Int, isRtl: Boolean): ThumbnailPositionState {
- val thumbnailPositionState =
- getThumbnailPositionUseCase(
- thumbnailData = recentTasksRepository.getCurrentThumbnailById(task.key.id),
- width = width,
- height = height,
- isRtl = isRtl,
- )
- return ThumbnailPositionState(
- thumbnailPositionState.matrix,
- thumbnailPositionState.isRotated,
- )
- }
-
- data class ThumbnailPositionState(val matrix: Matrix, val isRotated: Boolean)
-}
diff --git a/quickstep/src/com/android/quickstep/util/RecentsOrientedState.java b/quickstep/src/com/android/quickstep/util/RecentsOrientedState.java
index a5be89a..8954d80 100644
--- a/quickstep/src/com/android/quickstep/util/RecentsOrientedState.java
+++ b/quickstep/src/com/android/quickstep/util/RecentsOrientedState.java
@@ -22,6 +22,7 @@
import static android.view.Surface.ROTATION_270;
import static android.view.Surface.ROTATION_90;
+import static com.android.launcher3.Flags.enableOverviewOnConnectedDisplays;
import static com.android.launcher3.LauncherPrefs.ALLOW_ROTATION;
import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR;
import static com.android.launcher3.util.SettingsCache.ROTATION_SETTING_URI;
@@ -53,6 +54,7 @@
import com.android.quickstep.BaseContainerInterface;
import com.android.quickstep.SystemUiProxy;
import com.android.quickstep.TaskAnimationManager;
+import com.android.quickstep.fallback.window.RecentsDisplayModel;
import com.android.quickstep.orientation.RecentsPagedOrientationHandler;
import java.lang.annotation.Retention;
@@ -571,19 +573,25 @@
/**
* Returns the device profile based on expected launcher rotation
*/
- public DeviceProfile getLauncherDeviceProfile() {
- InvariantDeviceProfile idp = InvariantDeviceProfile.INSTANCE.get(mContext);
- Point currentSize = DisplayController.INSTANCE.get(mContext).getInfo().currentSize;
-
- int width, height;
- if ((mRecentsActivityRotation == ROTATION_90 || mRecentsActivityRotation == ROTATION_270)) {
- width = Math.max(currentSize.x, currentSize.y);
- height = Math.min(currentSize.x, currentSize.y);
+ public DeviceProfile getLauncherDeviceProfile(int displayId) {
+ if (enableOverviewOnConnectedDisplays()) {
+ return RecentsDisplayModel.getINSTANCE().get(mContext).getRecentsWindowManager(
+ displayId).getDeviceProfile();
} else {
- width = Math.min(currentSize.x, currentSize.y);
- height = Math.max(currentSize.x, currentSize.y);
+ InvariantDeviceProfile idp = InvariantDeviceProfile.INSTANCE.get(mContext);
+ Point currentSize = DisplayController.INSTANCE.get(mContext).getInfo().currentSize;
+
+ int width, height;
+ if ((mRecentsActivityRotation == ROTATION_90
+ || mRecentsActivityRotation == ROTATION_270)) {
+ width = Math.max(currentSize.x, currentSize.y);
+ height = Math.min(currentSize.x, currentSize.y);
+ } else {
+ width = Math.min(currentSize.x, currentSize.y);
+ height = Math.max(currentSize.x, currentSize.y);
+ }
+ return idp.getBestMatch(width, height, mRecentsActivityRotation);
}
- return idp.getBestMatch(width, height, mRecentsActivityRotation);
}
private static String nameAndAddress(Object obj) {
diff --git a/quickstep/src/com/android/quickstep/util/SplitAnimationController.kt b/quickstep/src/com/android/quickstep/util/SplitAnimationController.kt
index 96a5733..d6e553d 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 snapshot = taskContainer.snapshotView
+ val taskContentView = taskContainer.taskContentView
val iconView: View = taskContainer.iconView.asView()
if (enableRefactorTaskThumbnail()) {
builder.add(
@@ -241,7 +241,11 @@
val centerThumbnailTranslationX: Float = (taskViewWidth - snapshotViewSize.x) / 2f
val finalScaleX: Float = taskViewWidth.toFloat() / snapshotViewSize.x
builder.add(
- ObjectAnimator.ofFloat(snapshot, View.TRANSLATION_X, centerThumbnailTranslationX)
+ ObjectAnimator.ofFloat(
+ taskContentView,
+ View.TRANSLATION_X,
+ centerThumbnailTranslationX,
+ )
)
if (!enableOverviewIconMenu()) {
// icons are anchored from Gravity.END, so need to use negative translation
@@ -250,15 +254,17 @@
ObjectAnimator.ofFloat(iconView, View.TRANSLATION_X, -centerIconTranslationX)
)
}
- builder.add(ObjectAnimator.ofFloat(snapshot, View.SCALE_X, finalScaleX))
+ builder.add(ObjectAnimator.ofFloat(taskContentView, View.SCALE_X, finalScaleX))
// Reset other dimensions
// TODO(b/271468547), can't set Y translate to 0, need to account for top space
- snapshot.scaleY = 1f
+ taskContentView.scaleY = 1f
val translateYResetVal: Float =
if (!isPrimaryTaskSplitting) 0f
else deviceProfile.overviewTaskThumbnailTopMarginPx.toFloat()
- builder.add(ObjectAnimator.ofFloat(snapshot, View.TRANSLATION_Y, translateYResetVal))
+ builder.add(
+ ObjectAnimator.ofFloat(taskContentView, View.TRANSLATION_Y, translateYResetVal)
+ )
} else {
val thumbnailSize = taskViewHeight - deviceProfile.overviewTaskThumbnailTopMarginPx
// Center view first so scaling happens uniformly, alternatively we can move pivotY to 0
@@ -281,18 +287,22 @@
}
val finalScaleY: Float = thumbnailSize.toFloat() / snapshotViewSize.y
builder.add(
- ObjectAnimator.ofFloat(snapshot, View.TRANSLATION_Y, centerThumbnailTranslationY)
+ ObjectAnimator.ofFloat(
+ taskContentView,
+ 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(snapshot, View.SCALE_Y, finalScaleY))
+ builder.add(ObjectAnimator.ofFloat(taskContentView, View.SCALE_Y, finalScaleY))
// Reset other dimensions
- snapshot.scaleX = 1f
- builder.add(ObjectAnimator.ofFloat(snapshot, View.TRANSLATION_X, 0f))
+ taskContentView.scaleX = 1f
+ builder.add(ObjectAnimator.ofFloat(taskContentView, View.TRANSLATION_X, 0f))
}
}
diff --git a/quickstep/src/com/android/quickstep/views/DesktopTaskView.kt b/quickstep/src/com/android/quickstep/views/DesktopTaskView.kt
index e0ea518..1d035e9 100644
--- a/quickstep/src/com/android/quickstep/views/DesktopTaskView.kt
+++ b/quickstep/src/com/android/quickstep/views/DesktopTaskView.kt
@@ -54,6 +54,7 @@
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
@@ -69,27 +70,14 @@
) {
private val contentViewFullscreenParams = FullscreenDrawParams(context)
- 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 taskContentViewPool =
+ ViewPool<TaskContentView>(
+ context,
+ this,
+ R.layout.task_content_view,
+ VIEW_POOL_MAX_SIZE,
+ VIEW_POOL_INITIAL_SIZE,
+ )
private val tempPointF = PointF()
private val lastComputedTaskSize = Rect()
@@ -239,7 +227,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.snapshotView.apply {
+ it.taskContentView.apply {
scaleX = 1.0f
scaleY = 1.0f
translationX = 0.0f
@@ -247,7 +235,7 @@
}
// Position the task to the same position as it would be on the desktop
- it.snapshotView.updateLayoutParams<LayoutParams> {
+ it.taskContentView?.updateLayoutParams<LayoutParams> {
gravity = Gravity.LEFT or Gravity.TOP
width = taskWidth.toInt()
height = taskHeight.toInt()
@@ -258,7 +246,7 @@
if (
enableDesktopRecentsTransitionsCornersBugfix() && enableRefactorTaskThumbnail()
) {
- it.thumbnailView.outlineBounds =
+ it.taskContentView?.outlineBounds =
if (intersects(overviewTaskPosition, screenRect))
Rect(overviewTaskPosition).apply {
intersectUnchecked(screenRect)
@@ -275,7 +263,7 @@
} else {
// During the animation, apply translation and scale such that the view is
// transformed to where we want, without triggering layout.
- it.snapshotView.apply {
+ it.taskContentView.apply {
pivotX = 0.0f
pivotY = 0.0f
translationX = taskLeft - left
@@ -308,17 +296,19 @@
val backgroundViewIndex = contentView.indexOfChild(backgroundView)
taskContainers =
tasks.map { task ->
+ val taskContentView = taskContentViewPool.view
+ contentView.addView(taskContentView, backgroundViewIndex + 1)
val snapshotView =
if (enableRefactorTaskThumbnail()) {
- taskThumbnailViewPool!!.view
+ taskContentView.findViewById<TaskThumbnailView>(R.id.snapshot)
} else {
- taskThumbnailViewDeprecatedPool!!.view
+ taskContentView.findViewById<TaskThumbnailViewDeprecated>(R.id.snapshot)
}
- contentView.addView(snapshotView, backgroundViewIndex + 1)
TaskContainer(
this,
task,
+ taskContentView,
snapshotView,
iconView,
TransformingTouchDelegate(iconView.asView()),
@@ -465,12 +455,8 @@
}
private fun removeAndRecycleThumbnailView(taskContainer: TaskContainer) {
- contentView.removeView(taskContainer.snapshotView)
- if (enableRefactorTaskThumbnail()) {
- taskThumbnailViewPool!!.recycle(taskContainer.thumbnailView)
- } else {
- taskThumbnailViewDeprecatedPool!!.recycle(taskContainer.thumbnailViewDeprecated)
- }
+ contentView.removeView(taskContainer.taskContentView)
+ taskContentViewPool.recycle(taskContainer.taskContentView)
}
private fun updateTaskPositions() {
diff --git a/quickstep/src/com/android/quickstep/views/GroupedTaskView.kt b/quickstep/src/com/android/quickstep/views/GroupedTaskView.kt
index a8eee0a..71a4dde 100644
--- a/quickstep/src/com/android/quickstep/views/GroupedTaskView.kt
+++ b/quickstep/src/com/android/quickstep/views/GroupedTaskView.kt
@@ -24,7 +24,6 @@
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
@@ -78,8 +77,8 @@
val splitBoundsConfig = splitBoundsConfig ?: return
val inSplitSelection = getThisTaskCurrentlyInSplitSelection() != INVALID_TASK_ID
pagedOrientationHandler.measureGroupedTaskViewThumbnailBounds(
- leftTopTaskContainer.snapshotView,
- rightBottomTaskContainer.snapshotView,
+ leftTopTaskContainer.taskContentView,
+ rightBottomTaskContainer.taskContentView,
widthSize,
heightSize,
splitBoundsConfig,
@@ -95,12 +94,8 @@
override fun inflateViewStubs() {
super.inflateViewStubs()
- findViewById<ViewStub>(R.id.bottomright_snapshot)
- ?.apply {
- layoutResource =
- if (enableRefactorTaskThumbnail()) R.layout.task_thumbnail
- else R.layout.task_thumbnail_deprecated
- }
+ findViewById<ViewStub>(R.id.bottomright_task_content_view)
+ ?.apply { layoutResource = R.layout.task_content_view }
?.inflate()
findViewById<ViewStub>(R.id.bottomRight_icon)
?.apply {
@@ -128,6 +123,7 @@
listOf(
createTaskContainer(
primaryTask,
+ R.id.task_content_view,
R.id.snapshot,
R.id.icon,
R.id.show_windows,
@@ -137,7 +133,8 @@
),
createTaskContainer(
secondaryTask,
- R.id.bottomright_snapshot,
+ R.id.bottomright_task_content_view,
+ R.id.snapshot,
R.id.bottomRight_icon,
R.id.show_windows_right,
R.id.bottomRight_digital_wellbeing_toast,
@@ -240,8 +237,8 @@
leftTopTaskContainer.iconView.asView(),
rightBottomTaskContainer.iconView.asView(),
taskIconHeight,
- leftTopTaskContainer.snapshotView.measuredWidth,
- leftTopTaskContainer.snapshotView.measuredHeight,
+ leftTopTaskContainer.taskContentView.measuredWidth,
+ leftTopTaskContainer.taskContentView.measuredHeight,
measuredHeight,
measuredWidth,
isRtl,
diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java
index 4aea4f7..c282e77 100644
--- a/quickstep/src/com/android/quickstep/views/RecentsView.java
+++ b/quickstep/src/com/android/quickstep/views/RecentsView.java
@@ -1587,7 +1587,10 @@
== getPagedOrientationHandler().getPrimaryScroll(this);
}
- private boolean isFocusedTaskInExpectedScrollPosition() {
+ /**
+ * Returns true if the focused TaskView is in expected scroll position.
+ */
+ public boolean isFocusedTaskInExpectedScrollPosition() {
TaskView focusedTask = getFocusedTaskView();
return focusedTask != null && isTaskInExpectedScrollPosition(focusedTask);
}
@@ -2925,12 +2928,15 @@
updateGridProperties();
}
+ BaseState<?> endState = mSizeStrategy.stateFromGestureEndTarget(endTarget);
+ // Starting the desk exploded animation when the gesture from an app is released.
if (enableDesktopExplodedView()) {
if (animatorSet == null) {
- mUtils.setDeskExplodeProgress(1);
+ mUtils.setDeskExplodeProgress(endState.showExplodedDesktopView() ? 1f : 0f);
} else {
animatorSet.play(
- ObjectAnimator.ofFloat(this, DESK_EXPLODE_PROGRESS, 1));
+ ObjectAnimator.ofFloat(this, DESK_EXPLODE_PROGRESS,
+ endState.showExplodedDesktopView() ? 1f : 0f));
}
for (TaskView taskView : getTaskViews()) {
@@ -2940,7 +2946,6 @@
}
}
- BaseState<?> endState = mSizeStrategy.stateFromGestureEndTarget(endTarget);
if (endState.displayOverviewTasksAsGrid(mContainer.getDeviceProfile())) {
TaskView runningTaskView = getRunningTaskView();
float runningTaskGridTranslationX = 0;
@@ -3014,9 +3019,11 @@
animateActionsViewIn();
if (mEnableDrawingLiveTile) {
- for (TaskView taskView : getTaskViews()) {
- if (taskView instanceof DesktopTaskView desktopTaskView) {
- desktopTaskView.setRemoteTargetHandles(mRemoteTargetHandles);
+ if (enableDesktopExplodedView()) {
+ for (TaskView taskView : getTaskViews()) {
+ if (taskView instanceof DesktopTaskView desktopTaskView) {
+ desktopTaskView.setRemoteTargetHandles(mRemoteTargetHandles);
+ }
}
}
TaskView runningTaskView = getRunningTaskView();
@@ -4948,6 +4955,10 @@
}
setPivotX(mTempPointF.x);
setPivotY(mTempPointF.y);
+ if (enableGridOnlyOverview()) {
+ runActionOnRemoteHandles(remoteTargetHandle ->
+ remoteTargetHandle.getTaskViewSimulator().setPivotOverride(mTempPointF));
+ }
}
/**
@@ -5776,6 +5787,9 @@
if (taskView instanceof DesktopTaskView) {
anim.play(ObjectAnimator.ofArgb(mContainer.getScrimView(), VIEW_BACKGROUND_COLOR,
Color.TRANSPARENT));
+ if (enableDesktopExplodedView()) {
+ anim.play(ObjectAnimator.ofFloat(this, DESK_EXPLODE_PROGRESS, 1f, 0f));
+ }
}
DepthController depthController = getDepthController();
if (depthController != null) {
diff --git a/quickstep/src/com/android/quickstep/views/TaskContainer.kt b/quickstep/src/com/android/quickstep/views/TaskContainer.kt
index 2b9d036..ec6d1c4 100644
--- a/quickstep/src/com/android/quickstep/views/TaskContainer.kt
+++ b/quickstep/src/com/android/quickstep/views/TaskContainer.kt
@@ -18,6 +18,7 @@
import android.graphics.Bitmap
import android.graphics.Matrix
+import android.util.Log
import android.view.View
import android.view.View.OnClickListener
import com.android.launcher3.Flags.enableRefactorTaskThumbnail
@@ -26,8 +27,10 @@
import com.android.launcher3.util.TransformingTouchDelegate
import com.android.quickstep.TaskOverlayFactory
import com.android.quickstep.ViewUtils.addAccessibleChildToList
+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
@@ -36,6 +39,7 @@
class TaskContainer(
val taskView: TaskView,
val task: Task,
+ val taskContentView: TaskContentView,
val snapshotView: View,
val iconView: TaskViewIcon,
/**
@@ -52,6 +56,8 @@
taskOverlayFactory: TaskOverlayFactory,
) {
val overlay: TaskOverlayFactory.TaskOverlay<*> = taskOverlayFactory.createOverlay(this)
+ var thumbnailPosition: ThumbnailPosition? = null
+ private var overlayEnabledStatus = false
init {
if (enableRefactorTaskThumbnail()) {
@@ -99,14 +105,13 @@
if (!enableRefactorTaskThumbnail()) {
thumbnailViewDeprecated.bind(task, overlay, taskView)
}
- overlay.init()
}
fun destroy() {
digitalWellBeingToast?.destroy()
- snapshotView.scaleX = 1f
- snapshotView.scaleY = 1f
- overlay.destroy()
+ taskContentView.scaleX = 1f
+ taskContentView.scaleY = 1f
+ overlay.reset()
if (enableRefactorTaskThumbnail()) {
isThumbnailValid = false
thumbnailData = null
@@ -122,6 +127,34 @@
}
}
+ fun setOverlayEnabled(enabled: Boolean, thumbnailPosition: ThumbnailPosition?) {
+ if (enableRefactorTaskThumbnail()) {
+ if (overlayEnabledStatus != enabled || this.thumbnailPosition != thumbnailPosition) {
+ overlayEnabledStatus = enabled
+
+ refreshOverlay(thumbnailPosition)
+ }
+ }
+ }
+
+ fun refreshOverlay(thumbnailPosition: ThumbnailPosition?) {
+ this.thumbnailPosition = thumbnailPosition
+ when {
+ !overlayEnabledStatus -> overlay.reset()
+ thumbnailPosition == null -> {
+ Log.e(TAG, "Thumbnail position was null during overlay refresh", Exception())
+ overlay.reset()
+ }
+ else ->
+ overlay.initOverlay(
+ task,
+ thumbnailData?.thumbnail,
+ thumbnailPosition.matrix,
+ thumbnailPosition.isRotated,
+ )
+ }
+ }
+
fun addChildForAccessibility(outChildren: ArrayList<View>) {
addAccessibleChildToList(iconView.asView(), outChildren)
addAccessibleChildToList(snapshotView, outChildren)
@@ -136,16 +169,13 @@
hasHeader: Boolean,
clickCloseListener: OnClickListener?,
) {
- thumbnailView.setState(
- TaskUiStateMapper.toTaskThumbnailUiState(
- state,
- liveTile,
- hasHeader,
- clickCloseListener,
- ),
+ taskContentView.setState(
+ TaskUiStateMapper.toTaskHeaderState(state, hasHeader, clickCloseListener),
+ TaskUiStateMapper.toTaskThumbnailUiState(state, liveTile),
state?.taskId,
)
thumbnailData = if (state is TaskData.Data) state.thumbnailData else null
+ overlay.setThumbnailState(thumbnailData)
}
fun updateTintAmount(tintAmount: Float) {
@@ -186,4 +216,8 @@
fun updateThumbnailMatrix(matrix: Matrix) {
thumbnailView.setImageMatrix(matrix)
}
+
+ companion object {
+ const val TAG = "TaskContainer"
+ }
}
diff --git a/quickstep/src/com/android/quickstep/views/TaskThumbnailViewHeader.kt b/quickstep/src/com/android/quickstep/views/TaskHeaderView.kt
similarity index 66%
rename from quickstep/src/com/android/quickstep/views/TaskThumbnailViewHeader.kt
rename to quickstep/src/com/android/quickstep/views/TaskHeaderView.kt
index 9a8805b..0427402 100644
--- a/quickstep/src/com/android/quickstep/views/TaskThumbnailViewHeader.kt
+++ b/quickstep/src/com/android/quickstep/views/TaskHeaderView.kt
@@ -22,19 +22,29 @@
import android.widget.ImageButton
import android.widget.ImageView
import android.widget.TextView
+import androidx.core.view.isGone
import com.android.launcher3.R
-import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.ThumbnailHeader
+import com.android.quickstep.task.thumbnail.TaskHeaderUiState
-class TaskThumbnailViewHeader
-@JvmOverloads
-constructor(context: Context, attrs: AttributeSet? = null) : FrameLayout(context, attrs) {
+class TaskHeaderView @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 setHeader(header: ThumbnailHeader) {
- headerTitleView.setText(header.title)
+ 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
headerIconView.setImageDrawable(header.icon)
headerCloseButton.setOnClickListener(header.clickCloseListener)
}
diff --git a/quickstep/src/com/android/quickstep/views/TaskMenuView.kt b/quickstep/src/com/android/quickstep/views/TaskMenuView.kt
index 4777f4f..7c762f4 100644
--- a/quickstep/src/com/android/quickstep/views/TaskMenuView.kt
+++ b/quickstep/src/com/android/quickstep/views/TaskMenuView.kt
@@ -32,6 +32,7 @@
import android.view.ViewOutlineProvider
import android.widget.LinearLayout
import android.widget.TextView
+import androidx.core.content.res.ResourcesCompat
import com.android.app.animation.Interpolators
import com.android.launcher3.AbstractFloatingView
import com.android.launcher3.Flags.enableOverviewIconMenu
@@ -67,6 +68,17 @@
private var menuTranslationXBeforeOpen = 0f
private var menuTranslationYBeforeOpen = 0f
+ // Spaced claimed below Overview (taskbar and insets)
+ private val taskbarTop by lazy {
+ recentsViewContainer.deviceProfile.heightPx -
+ recentsViewContainer.deviceProfile.overviewActionsClaimedSpaceBelow
+ }
+ private val minMenuTop by lazy { taskContainer.iconView.height.toFloat() }
+ // TODO(b/401476868): Replace overviewRowSpacing with correct margin to the taskbarTop.
+ private val maxMenuBottom by lazy {
+ (taskbarTop - recentsViewContainer.deviceProfile.overviewRowSpacing).toFloat()
+ }
+
init {
clipToOutline = true
}
@@ -103,13 +115,9 @@
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
var heightMeasure = heightMeasureSpec
- if (!(enableOverviewIconMenu() && taskView.isOnGridBottomRow())) {
- // TODO(b/326952853): Cap menu height for grid bottom row in a way that doesn't break
- // additionalTranslationY.
- val maxMenuHeight = calculateMaxHeight()
- if (MeasureSpec.getSize(heightMeasure) > maxMenuHeight) {
- heightMeasure = MeasureSpec.makeMeasureSpec(maxMenuHeight, MeasureSpec.AT_MOST)
- }
+ val maxMenuHeight = calculateMaxHeight()
+ if (MeasureSpec.getSize(heightMeasure) > maxMenuHeight) {
+ heightMeasure = MeasureSpec.makeMeasureSpec(maxMenuHeight, MeasureSpec.AT_MOST)
}
super.onMeasure(widthMeasureSpec, heightMeasure)
}
@@ -196,7 +204,7 @@
taskContainer.stagePosition,
)
// Gravity set to Left instead of Start as sTempRect.left measures Left distance not Start
- params.gravity = Gravity.START
+ params.gravity = Gravity.LEFT
layoutParams = params
scaleX = taskView.scaleX
scaleY = taskView.scaleY
@@ -208,6 +216,13 @@
optionLayout.showDividers =
if (enableOverviewIconMenu()) SHOW_DIVIDER_NONE else SHOW_DIVIDER_MIDDLE
+ optionLayout.background =
+ if (enableOverviewIconMenu()) {
+ ResourcesCompat.getDrawable(resources, R.drawable.app_chip_menu_bg, context.theme)
+ } else {
+ null
+ }
+
orientationHandler.setTaskOptionsMenuLayoutOrientation(
deviceProfile,
optionLayout,
@@ -345,15 +360,20 @@
* view will scroll. The maximum menu size will sit inside the task with a margin on the top and
* bottom.
*/
- private fun calculateMaxHeight(): Int {
- val taskInsetMargin = resources.getDimension(R.dimen.task_card_margin)
- return taskView.pagedOrientationHandler.getTaskMenuHeight(
- taskInsetMargin,
- recentsViewContainer.deviceProfile,
- translationX,
- translationY,
+ private fun calculateMaxHeight(): Int =
+ taskView.pagedOrientationHandler.getTaskMenuHeight(
+ taskInsetMargin = resources.getDimension(R.dimen.task_card_margin), // taskInsetMargin
+ deviceProfile = recentsViewContainer.deviceProfile,
+ taskMenuX = translationX,
+ taskMenuY =
+ when {
+ !enableOverviewIconMenu() -> translationY
+ // Bottom menu can translate up to show more options. So we use the min
+ // translation allowed to calculate its max height.
+ taskView.isOnGridBottomRow() -> minMenuTop
+ else -> menuTranslationYBeforeOpen
+ },
)
- }
private fun setOnClosingStartCallback(onClosingStartCallback: Runnable?) {
this.onClosingStartCallback = onClosingStartCallback
@@ -362,18 +382,23 @@
private fun animateOpenOrCloseAppChip(closing: Boolean, animatorBuilder: AnimatorSet.Builder) {
val iconAppChip = taskContainer.iconView.asView() as IconAppChipView
+ // Animate menu up for enough room to display full menu when task on bottom row.
var additionalTranslationY = 0f
if (taskView.isOnGridBottomRow()) {
- // Animate menu up for enough room to display full menu when task on bottom row.
- val menuBottom = height + menuTranslationYBeforeOpen
- val taskBottom = taskView.height + taskView.persistentTranslationY
- val taskbarTop =
- (recentsViewContainer.deviceProfile.heightPx -
- recentsViewContainer.deviceProfile.overviewActionsClaimedSpaceBelow)
- .toFloat()
- val midpoint = (taskBottom + taskbarTop) / 2f
- additionalTranslationY = (-max((menuBottom - midpoint).toDouble(), 0.0)).toFloat()
+ val currentMenuBottom: Float = menuTranslationYBeforeOpen + height
+ additionalTranslationY =
+ if (currentMenuBottom < maxMenuBottom) 0f
+ // Translate menu up for enough room to display full menu when task on bottom row.
+ else maxMenuBottom - currentMenuBottom
+
+ val currentMenuTop = menuTranslationYBeforeOpen + additionalTranslationY
+ // If it translate above the min accepted, it translates to the top of the screen
+ if (currentMenuTop < minMenuTop) {
+ // It subtracts the menuTranslation to make it 0 (top of the screen) + chip size.
+ additionalTranslationY = -menuTranslationYBeforeOpen + minMenuTop
+ }
}
+
val translationYAnim =
ObjectAnimator.ofFloat(
this,
diff --git a/quickstep/src/com/android/quickstep/views/TaskThumbnailViewDeprecated.java b/quickstep/src/com/android/quickstep/views/TaskThumbnailViewDeprecated.java
index 5ee5e10..74d76e6 100644
--- a/quickstep/src/com/android/quickstep/views/TaskThumbnailViewDeprecated.java
+++ b/quickstep/src/com/android/quickstep/views/TaskThumbnailViewDeprecated.java
@@ -412,7 +412,12 @@
thumbnailDataAspect, MAX_PCT_BEFORE_ASPECT_RATIOS_CONSIDERED_DIFFERENT);
}
- private boolean isThumbnailRotationDifferentFromTask() {
+ /**
+ * Returns whether or not the current thumbnail is a different orientation to the task.
+ * <p>
+ * Used to disable modal state when screenshot doesn't match the device orientation.
+ */
+ public boolean isThumbnailRotationDifferentFromTask() {
RecentsView recents = mTaskView.getRecentsView();
if (recents == null || mThumbnailData == null) {
return false;
diff --git a/quickstep/src/com/android/quickstep/views/TaskView.kt b/quickstep/src/com/android/quickstep/views/TaskView.kt
index 86e1305..b7f1d1d 100644
--- a/quickstep/src/com/android/quickstep/views/TaskView.kt
+++ b/quickstep/src/com/android/quickstep/views/TaskView.kt
@@ -82,9 +82,11 @@
import com.android.quickstep.recents.di.RecentsDependencies
import com.android.quickstep.recents.di.get
import com.android.quickstep.recents.di.inject
+import com.android.quickstep.recents.domain.usecase.ThumbnailPosition
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
@@ -308,10 +310,9 @@
// progress: 0 = show icon and no insets; 1 = don't show icon and show full insets.
protected var fullscreenProgress = 0f
set(value) {
- if (value != field) {
- field = Utilities.boundToRange(value, 0f, 1f)
- onFullscreenProgressChanged(field)
- }
+ if (value == field && enableOverviewIconMenu()) return
+ field = Utilities.boundToRange(value, 0f, 1f)
+ onFullscreenProgressChanged(field)
}
// gridProgress 0 = carousel; 1 = 2 row grid.
@@ -491,10 +492,9 @@
// 1 = The TaskView is settled and no longer transitioning
private var settledProgress = 1f
set(value) {
- if (value != field) {
- field = value
- onSettledProgressUpdated(field)
- }
+ if (value == field && enableOverviewIconMenu()) return
+ field = value
+ onSettledProgressUpdated(field)
}
private val settledProgressPropertyFactory =
@@ -721,13 +721,10 @@
}
protected open fun inflateViewStubs() {
- findViewById<ViewStub>(R.id.snapshot)
- ?.apply {
- layoutResource =
- if (enableRefactorTaskThumbnail()) R.layout.task_thumbnail
- else R.layout.task_thumbnail_deprecated
- }
+ findViewById<ViewStub>(R.id.task_content_view)
+ ?.apply { layoutResource = R.layout.task_content_view }
?.inflate()
+
findViewById<ViewStub>(R.id.icon)
?.apply {
layoutResource =
@@ -779,11 +776,13 @@
},
)
updateThumbnailValidity(container)
- updateThumbnailMatrix(
- container = container,
- width = container.thumbnailView.width,
- height = container.thumbnailView.height,
- )
+ val thumbnailPosition =
+ updateThumbnailMatrix(
+ container = container,
+ width = container.thumbnailView.width,
+ height = container.thumbnailView.height,
+ )
+ container.setOverlayEnabled(state.taskOverlayEnabled, thumbnailPosition)
if (enableOverviewIconMenu()) {
setIconState(container, containerState)
@@ -812,11 +811,16 @@
* @param width The desired width of the thumbnail's container.
* @param height The desired height of the thumbnail's container.
*/
- private fun updateThumbnailMatrix(container: TaskContainer, width: Int, height: Int) {
+ private fun updateThumbnailMatrix(
+ container: TaskContainer,
+ width: Int,
+ height: Int,
+ ): ThumbnailPosition? {
val thumbnailPosition =
viewModel?.getThumbnailPosition(container.thumbnailData, width, height, isLayoutRtl)
- ?: return
+ ?: return null
container.updateThumbnailMatrix(thumbnailPosition.matrix)
+ return thumbnailPosition
}
override fun onDetachedFromWindow() {
@@ -845,6 +849,7 @@
listOf(
createTaskContainer(
task,
+ R.id.task_content_view,
R.id.snapshot,
R.id.icon,
R.id.show_windows,
@@ -876,10 +881,12 @@
taskContainers.forEach { container ->
container.bind()
if (enableRefactorTaskThumbnail()) {
- container.thumbnailView.cornerRadius = thumbnailFullscreenParams.currentCornerRadius
- container.thumbnailView.doOnSizeChange { width, height ->
+ container.taskContentView.cornerRadius =
+ thumbnailFullscreenParams.currentCornerRadius
+ container.taskContentView.doOnSizeChange { width, height ->
updateThumbnailValidity(container)
- updateThumbnailMatrix(container, width, height)
+ val thumbnailPosition = updateThumbnailMatrix(container, width, height)
+ container.refreshOverlay(thumbnailPosition)
}
}
}
@@ -903,6 +910,7 @@
protected fun createTaskContainer(
task: Task,
+ @IdRes taskContentViewId: Int,
@IdRes thumbnailViewId: Int,
@IdRes iconViewId: Int,
@IdRes showWindowViewId: Int,
@@ -911,10 +919,12 @@
taskOverlayFactory: TaskOverlayFactory,
): TaskContainer {
val iconView = findViewById<View>(iconViewId) as TaskViewIcon
+ val taskContentView = findViewById<TaskContentView>(taskContentViewId)
return TaskContainer(
this,
task,
- findViewById(thumbnailViewId),
+ taskContentView,
+ taskContentView.findViewById(thumbnailViewId),
iconView,
TransformingTouchDelegate(iconView.asView()),
stagePosition,
@@ -1002,7 +1012,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?.snapshotView?.updateLayoutParams<LayoutParams> {
+ firstTaskContainer?.taskContentView?.updateLayoutParams<LayoutParams> {
topMargin = container.deviceProfile.overviewTaskThumbnailTopMarginPx
}
taskContainers.forEach { it.digitalWellBeingToast?.setupLayout() }
@@ -1016,11 +1026,11 @@
val thumbnailBounds = Rect()
if (relativeToDragLayer) {
container.dragLayer.getDescendantRectRelativeToSelf(
- it.snapshotView,
+ it.taskContentView,
thumbnailBounds,
)
} else {
- thumbnailBounds.set(it.snapshotView)
+ thumbnailBounds.set(it.taskContentView)
}
bounds.union(thumbnailBounds)
}
@@ -1709,7 +1719,7 @@
updateFullscreenParams(thumbnailFullscreenParams)
taskContainers.forEach {
if (enableRefactorTaskThumbnail()) {
- it.thumbnailView.cornerRadius = thumbnailFullscreenParams.currentCornerRadius
+ it.taskContentView.cornerRadius = thumbnailFullscreenParams.currentCornerRadius
} else {
it.thumbnailViewDeprecated.setFullscreenParams(thumbnailFullscreenParams)
}
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
new file mode 100644
index 0000000..8cc09d4
--- /dev/null
+++ b/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/SplashHelper.kt
@@ -0,0 +1,43 @@
+/*
+ * 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
new file mode 100644
index 0000000..d36faa2
--- /dev/null
+++ b/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/TaskContentViewScreenshotTest.kt
@@ -0,0 +1,113 @@
+/*
+ * 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.view.LayoutInflater
+import com.android.launcher3.R
+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.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
+ val screenshotRule =
+ ViewScreenshotTestRule(
+ emulationSpec,
+ ViewScreenshotGoldenPathManager(getEmulatedDevicePathConfig(emulationSpec)),
+ )
+
+ @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
new file mode 100644
index 0000000..e30554e
--- /dev/null
+++ b/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/TaskHeaderViewScreenshotTest.kt
@@ -0,0 +1,80 @@
+/*
+ * 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 80b2c16..45df735 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,16 +16,14 @@
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
@@ -90,23 +88,25 @@
}
@Test
- fun taskThumbnailView_liveTile_withoutHeader() {
+ fun taskThumbnailView_liveTile() {
screenshotRule.screenshotTest("taskThumbnailView_liveTile") { activity ->
activity.actionBar?.hide()
- createTaskThumbnailView(activity).apply {
- setState(TaskThumbnailUiState.LiveTile.WithoutHeader)
- }
+ createTaskThumbnailView(activity).apply { setState(TaskThumbnailUiState.LiveTile) }
}
}
@Test
- fun taskThumbnailView_image_withoutHeader() {
+ fun taskThumbnailView_image() {
screenshotRule.screenshotTest("taskThumbnailView_image") { activity ->
activity.actionBar?.hide()
createTaskThumbnailView(activity).apply {
setState(
SnapshotSplash(
- Snapshot.WithoutHeader(createBitmap(), ROTATION_0, Color.DKGRAY),
+ Snapshot(
+ createBitmap(VIEW_ENV_WIDTH, VIEW_ENV_HEIGHT),
+ ROTATION_0,
+ Color.DKGRAY,
+ ),
null,
)
)
@@ -115,14 +115,14 @@
}
@Test
- fun taskThumbnailView_image_withoutHeader_withImageMatrix() {
+ fun taskThumbnailView_image_withImageMatrix() {
screenshotRule.screenshotTest("taskThumbnailView_image_withMatrix") { activity ->
activity.actionBar?.hide()
createTaskThumbnailView(activity).apply {
val lessThanHeightMatchingAspectRatio = (VIEW_ENV_HEIGHT / 2) - 200
setState(
SnapshotSplash(
- Snapshot.WithoutHeader(
+ Snapshot(
createBitmap(
width = VIEW_ENV_WIDTH / 2,
height = lessThanHeightMatchingAspectRatio,
@@ -139,13 +139,17 @@
}
@Test
- fun taskThumbnailView_splash_withoutHeader() {
+ fun taskThumbnailView_splash() {
screenshotRule.screenshotTest("taskThumbnailView_partial_splash") { activity ->
activity.actionBar?.hide()
createTaskThumbnailView(activity).apply {
setState(
SnapshotSplash(
- Snapshot.WithoutHeader(createBitmap(), ROTATION_0, Color.DKGRAY),
+ Snapshot(
+ createBitmap(VIEW_ENV_WIDTH, VIEW_ENV_HEIGHT),
+ ROTATION_0,
+ Color.DKGRAY,
+ ),
BitmapDrawable(activity.resources, createSplash()),
)
)
@@ -155,14 +159,14 @@
}
@Test
- fun taskThumbnailView_splash_withoutHeader_withImageMatrix() {
+ fun taskThumbnailView_splash_withImageMatrix() {
screenshotRule.screenshotTest("taskThumbnailView_partial_splash_withMatrix") { activity ->
activity.actionBar?.hide()
createTaskThumbnailView(activity).apply {
val lessThanHeightMatchingAspectRatio = (VIEW_ENV_HEIGHT / 2) - 200
setState(
SnapshotSplash(
- Snapshot.WithoutHeader(
+ Snapshot(
createBitmap(
width = VIEW_ENV_WIDTH / 2,
height = lessThanHeightMatchingAspectRatio,
@@ -229,31 +233,9 @@
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
@@ -264,8 +246,6 @@
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/WidgetsPredictionsRequesterTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/model/WidgetsPredictionsRequesterTest.kt
index 4ea74df..d445189 100644
--- a/quickstep/tests/multivalentTests/src/com/android/launcher3/model/WidgetsPredictionsRequesterTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/model/WidgetsPredictionsRequesterTest.kt
@@ -16,6 +16,8 @@
package com.android.launcher3.model
+import android.app.prediction.AppPredictionManager
+import android.app.prediction.AppPredictor
import android.app.prediction.AppTarget
import android.app.prediction.AppTargetEvent
import android.app.prediction.AppTargetId
@@ -36,9 +38,15 @@
import com.android.launcher3.model.WidgetPredictionsRequester.notOnUiSurfaceFilter
import com.android.launcher3.util.ActivityContextWrapper
import com.android.launcher3.util.ComponentKey
+import com.android.launcher3.util.Executors
+import com.android.launcher3.util.Executors.MODEL_EXECUTOR
+import com.android.launcher3.util.TestUtil
import com.android.launcher3.util.WidgetUtils.createAppWidgetProviderInfo
import com.android.launcher3.widget.LauncherAppWidgetProviderInfo
+import com.android.launcher3.widget.PendingAddWidgetInfo
import com.google.common.truth.Truth.assertThat
+import java.util.concurrent.CountDownLatch
+import java.util.concurrent.TimeUnit
import java.util.function.Predicate
import junit.framework.Assert.assertNotNull
import org.junit.Before
@@ -46,6 +54,9 @@
import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.MockitoAnnotations
+import org.mockito.kotlin.any
+import org.mockito.kotlin.doAnswer
+import org.mockito.kotlin.whenever
@RunWith(AndroidJUnit4::class)
class WidgetsPredictionsRequesterTest {
@@ -67,11 +78,26 @@
@Mock private lateinit var iconCache: IconCache
+ @Mock private lateinit var apmMock: AppPredictionManager
+
+ @Mock private lateinit var predictorMock: AppPredictor
+
@Before
fun setUp() {
MockitoAnnotations.initMocks(this)
mUserHandle = myUserHandle()
- context = ActivityContextWrapper(ApplicationProvider.getApplicationContext())
+
+ whenever(apmMock.createAppPredictionSession(any())).thenReturn(predictorMock)
+
+ context =
+ object : ActivityContextWrapper(ApplicationProvider.getApplicationContext()) {
+ override fun getSystemService(name: String): Any? {
+ if (name == "app_prediction") {
+ return apmMock
+ }
+ return super.getSystemService(name)
+ }
+ }
testInvariantProfile = LauncherAppState.getIDP(context)
deviceProfile = testInvariantProfile.getDeviceProfile(context).copy(context)
@@ -114,22 +140,68 @@
buildExpectedAppTargetEvent(
/*pkg=*/ APP_1_PACKAGE_NAME,
/*providerClassName=*/ APP_1_PROVIDER_A_CLASS_NAME,
- /*user=*/ mUserHandle
+ /*user=*/ mUserHandle,
),
buildExpectedAppTargetEvent(
/*pkg=*/ APP_1_PACKAGE_NAME,
/*providerClassName=*/ APP_1_PROVIDER_B_CLASS_NAME,
- /*user=*/ mUserHandle
+ /*user=*/ mUserHandle,
),
buildExpectedAppTargetEvent(
/*pkg=*/ APP_2_PACKAGE_NAME,
/*providerClassName=*/ APP_2_PROVIDER_1_CLASS_NAME,
- /*user=*/ mUserHandle
- )
+ /*user=*/ mUserHandle,
+ ),
)
}
@Test
+ fun request_invokesCallbackWithPredictedItems() {
+ TestUtil.runOnExecutorSync(MODEL_EXECUTOR) {
+ val underTest = WidgetPredictionsRequester(context, TEST_UI_SURFACE, allWidgets)
+ val existingWidgets = arrayListOf(widget1aInfo, widget1bInfo)
+ val predictions =
+ listOf(
+ // (existing) already on surface
+ AppTarget(
+ AppTargetId(APP_1_PACKAGE_NAME),
+ APP_1_PACKAGE_NAME,
+ APP_1_PROVIDER_B_CLASS_NAME,
+ mUserHandle,
+ ),
+ // eligible
+ AppTarget(
+ AppTargetId(APP_2_PACKAGE_NAME),
+ APP_2_PACKAGE_NAME,
+ APP_2_PROVIDER_1_CLASS_NAME,
+ mUserHandle,
+ ),
+ )
+ doAnswer {
+ underTest.onTargetsAvailable(predictions)
+ null
+ }
+ .whenever(predictorMock)
+ .requestPredictionUpdate()
+ val testCountDownLatch = CountDownLatch(1)
+ val listener =
+ WidgetPredictionsRequester.WidgetPredictionsListener { itemInfos ->
+ if (itemInfos.size == 1 && itemInfos[0] is PendingAddWidgetInfo) {
+ // only one item was eligible.
+ testCountDownLatch.countDown()
+ } else {
+ println("Unexpected prediction items found: ${itemInfos.size}")
+ }
+ }
+
+ underTest.request(existingWidgets, listener)
+ TestUtil.runOnExecutorSync(Executors.MAIN_EXECUTOR) {}
+
+ assertThat(testCountDownLatch.await(TEST_TIMEOUT, TimeUnit.SECONDS)).isTrue()
+ }
+ }
+
+ @Test
fun filterPredictions_notOnUiSurfaceFilter_returnsOnlyEligiblePredictions() {
val widgetsAlreadyOnSurface = arrayListOf(widget1bInfo)
val filter: Predicate<WidgetItem> = notOnUiSurfaceFilter(widgetsAlreadyOnSurface)
@@ -141,15 +213,15 @@
AppTargetId(APP_1_PACKAGE_NAME),
APP_1_PACKAGE_NAME,
APP_1_PROVIDER_B_CLASS_NAME,
- mUserHandle
+ mUserHandle,
),
// eligible
AppTarget(
AppTargetId(APP_2_PACKAGE_NAME),
APP_2_PACKAGE_NAME,
APP_2_PROVIDER_1_CLASS_NAME,
- mUserHandle
- )
+ mUserHandle,
+ ),
)
// only 2 was eligible
@@ -167,27 +239,27 @@
AppTargetId(APP_1_PACKAGE_NAME),
APP_1_PACKAGE_NAME,
"$APP_1_PACKAGE_NAME.SomeActivity",
- mUserHandle
+ mUserHandle,
),
AppTarget(
AppTargetId(APP_2_PACKAGE_NAME),
APP_2_PACKAGE_NAME,
"$APP_2_PACKAGE_NAME.SomeActivity2",
- mUserHandle
+ mUserHandle,
),
)
assertThat(filterPredictions(predictions, allWidgets, filter)).isEmpty()
}
- private fun createWidgetItem(
- providerInfo: AppWidgetProviderInfo,
- ): WidgetItem {
+ private fun createWidgetItem(providerInfo: AppWidgetProviderInfo): WidgetItem {
val widgetInfo = LauncherAppWidgetProviderInfo.fromProviderInfo(context, providerInfo)
return WidgetItem(widgetInfo, testInvariantProfile, iconCache, context)
}
companion object {
+ const val TEST_TIMEOUT = 3L
+
const val TEST_UI_SURFACE = "widgets_test"
const val BUNDLE_KEY_ADDED_APP_WIDGETS = "added_app_widgets"
@@ -203,13 +275,13 @@
private fun buildExpectedAppTargetEvent(
pkg: String,
providerClassName: String,
- userHandle: UserHandle
+ userHandle: UserHandle,
): AppTargetEvent {
val appTarget =
AppTarget.Builder(
/*id=*/ AppTargetId("widget:$pkg"),
/*packageName=*/ pkg,
- /*user=*/ userHandle
+ /*user=*/ userHandle,
)
.setClassName(providerClassName)
.build()
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 42adfec..d2abed8 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,6 +35,7 @@
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
@@ -198,6 +199,7 @@
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/TaskbarPopupControllerTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarPopupControllerTest.kt
new file mode 100644
index 0000000..6bb3205
--- /dev/null
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarPopupControllerTest.kt
@@ -0,0 +1,101 @@
+/*
+ * 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.platform.test.annotations.DisableFlags
+import android.platform.test.flag.junit.SetFlagsRule
+import com.android.launcher3.AbstractFloatingView
+import com.android.launcher3.BubbleTextView
+import com.android.launcher3.Flags.FLAG_ENABLE_MULTI_INSTANCE_MENU_TASKBAR
+import com.android.launcher3.Flags.FLAG_ENABLE_PINNING_APP_WITH_CONTEXT_MENU
+import com.android.launcher3.R
+import com.android.launcher3.model.data.WorkspaceItemInfo
+import com.android.launcher3.taskbar.TaskbarControllerTestUtil.runOnMainSync
+import com.android.launcher3.taskbar.TaskbarViewTestUtil.createHotseatWorkspaceItem
+import com.android.launcher3.taskbar.TaskbarViewTestUtil.createRecents
+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.android.quickstep.util.GroupTask
+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"])
+@DisableFlags(FLAG_ENABLE_MULTI_INSTANCE_MENU_TASKBAR, FLAG_ENABLE_PINNING_APP_WITH_CONTEXT_MENU)
+class TaskbarPopupControllerTest {
+ @get:Rule(order = 0) val setFlagsRule = SetFlagsRule()
+
+ @get:Rule(order = 1) val context = TaskbarWindowSandboxContext.create()
+
+ @get:Rule(order = 2) val taskbarUnitTestRule = TaskbarUnitTestRule(this, context)
+
+ @InjectController lateinit var popupController: TaskbarPopupController
+
+ private val taskbarContext: TaskbarActivityContext
+ get() = taskbarUnitTestRule.activityContext
+
+ private lateinit var taskbarView: TaskbarView
+ private lateinit var hotseatIcon: BubbleTextView
+ private lateinit var recentTaskIcon: BubbleTextView
+
+ @Before
+ fun setup() {
+ taskbarContext.controllers.uiController.init(taskbarContext.controllers)
+ runOnMainSync { taskbarView = taskbarContext.dragLayer.findViewById(R.id.taskbar_view) }
+
+ val hotseatItems = arrayOf(createHotseatWorkspaceItem())
+ val recentItems = createRecents(2)
+ runOnMainSync {
+ taskbarView.updateItems(hotseatItems, recentItems)
+ hotseatIcon =
+ taskbarView.iconViews.filterIsInstance<BubbleTextView>().first {
+ it.tag is WorkspaceItemInfo
+ }
+ recentTaskIcon =
+ taskbarView.iconViews.filterIsInstance<BubbleTextView>().first {
+ it.tag is GroupTask
+ }
+ }
+ }
+
+ @Test
+ fun showForIcon_hotseatItem() {
+ assertThat(hasPopupMenu()).isFalse()
+ runOnMainSync { popupController.showForIcon(hotseatIcon) }
+ assertThat(hasPopupMenu()).isTrue()
+ }
+
+ @Test
+ fun showForIcon_recentTask() {
+ assertThat(hasPopupMenu()).isFalse()
+ runOnMainSync { popupController.showForIcon(recentTaskIcon) }
+ assertThat(hasPopupMenu()).isTrue()
+ }
+
+ private fun hasPopupMenu(): Boolean {
+ return AbstractFloatingView.hasOpenView(
+ taskbarContext,
+ AbstractFloatingView.TYPE_ACTION_POPUP,
+ )
+ }
+}
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 df70b10..e52aacf 100644
--- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewTestUtil.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewTestUtil.kt
@@ -46,12 +46,14 @@
/** Creates an array of fake hotseat items. */
fun createHotseatItems(size: Int): Array<ItemInfo> {
- return Array(size) {
- WorkspaceItemInfo(
- AppInfo(TEST_COMPONENT, "Test App $it", Process.myUserHandle(), Intent())
- )
- .apply { id = it }
- }
+ return Array(size) { createHotseatWorkspaceItem(it) }
+ }
+
+ fun createHotseatWorkspaceItem(id: Int = 0): WorkspaceItemInfo {
+ return WorkspaceItemInfo(
+ AppInfo(TEST_COMPONENT, "Test App $id", Process.myUserHandle(), Intent())
+ )
+ .apply { this.id = id }
}
/** Creates a list of fake recent tasks. */
@@ -75,13 +77,13 @@
}
/** A `Truth` [Subject] with extensions for verifying [TaskbarView]. */
-class TaskbarViewSubject(failureMetadata: FailureMetadata, private val view: TaskbarView) :
+class TaskbarViewSubject(failureMetadata: FailureMetadata, private val view: TaskbarView?) :
Subject(failureMetadata, view) {
/** Verifies that the types of icons match [expectedTypes] in order. */
fun hasIconTypes(vararg expectedTypes: TaskbarIconType) {
val actualTypes =
- view.iconViews.map {
+ view?.iconViews?.map {
when (it) {
view.allAppsButtonContainer -> ALL_APPS
view.taskbarDividerViewContainer -> DIVIDER
@@ -100,7 +102,7 @@
/** Verifies that recents from [startIndex] have IDs that match [expectedIds] in order. */
fun hasRecentsOrder(startIndex: Int, expectedIds: List<Int>) {
val actualIds =
- view.iconViews.slice(startIndex..<startIndex + expectedIds.size).flatMap {
+ view?.iconViews?.slice(startIndex..<startIndex + expectedIds.size)?.flatMap {
assertThat(it.tag).isInstanceOf(GroupTask::class.java)
(it.tag as GroupTask).tasks.map { task -> task.key.id }
}
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimatorTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimatorTest.kt
index a456fb9..61a6975 100644
--- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimatorTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimatorTest.kt
@@ -20,8 +20,10 @@
import android.graphics.Color
import android.graphics.Path
import android.graphics.PointF
+import android.graphics.Rect
import android.graphics.drawable.ColorDrawable
import android.view.LayoutInflater
+import android.view.MotionEvent
import android.view.View
import android.view.View.INVISIBLE
import android.view.View.VISIBLE
@@ -35,10 +37,13 @@
import androidx.test.filters.SmallTest
import androidx.test.platform.app.InstrumentationRegistry
import com.android.launcher3.R
+import com.android.launcher3.taskbar.TaskbarInsetsController
import com.android.launcher3.taskbar.bubbles.BubbleBarBubble
import com.android.launcher3.taskbar.bubbles.BubbleBarOverflow
import com.android.launcher3.taskbar.bubbles.BubbleBarParentViewHeightUpdateNotifier
import com.android.launcher3.taskbar.bubbles.BubbleBarView
+import com.android.launcher3.taskbar.bubbles.BubbleBarViewController
+import com.android.launcher3.taskbar.bubbles.BubbleStashedHandleViewController
import com.android.launcher3.taskbar.bubbles.BubbleView
import com.android.launcher3.taskbar.bubbles.flyout.BubbleBarFlyoutController
import com.android.launcher3.taskbar.bubbles.flyout.BubbleBarFlyoutMessage
@@ -46,8 +51,10 @@
import com.android.launcher3.taskbar.bubbles.flyout.FlyoutCallbacks
import com.android.launcher3.taskbar.bubbles.flyout.FlyoutScheduler
import com.android.launcher3.taskbar.bubbles.stashing.BubbleStashController
+import com.android.launcher3.taskbar.bubbles.stashing.BubbleStashController.BubbleLauncherState
import com.android.wm.shell.shared.animation.PhysicsAnimator
import com.android.wm.shell.shared.animation.PhysicsAnimatorTestUtils
+import com.android.wm.shell.shared.bubbles.BubbleBarLocation
import com.android.wm.shell.shared.bubbles.BubbleInfo
import com.google.common.truth.Truth.assertThat
import java.util.concurrent.Semaphore
@@ -56,13 +63,6 @@
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
-import org.mockito.kotlin.any
-import org.mockito.kotlin.atLeastOnce
-import org.mockito.kotlin.eq
-import org.mockito.kotlin.mock
-import org.mockito.kotlin.never
-import org.mockito.kotlin.verify
-import org.mockito.kotlin.whenever
@SmallTest
@RunWith(AndroidJUnit4::class)
@@ -78,7 +78,7 @@
private lateinit var bubble: BubbleBarBubble
private lateinit var bubbleBarView: BubbleBarView
private lateinit var flyoutContainer: FrameLayout
- private lateinit var bubbleStashController: BubbleStashController
+ private lateinit var bubbleStashController: FakeBubbleStashController
private lateinit var flyoutController: BubbleBarFlyoutController
private val emptyRunnable = Runnable {}
@@ -89,6 +89,7 @@
fun setUp() {
animatorScheduler = TestBubbleBarViewAnimatorScheduler()
bubbleBarParentViewController = TestBubbleBarParentViewHeightUpdateNotifier()
+ bubbleStashController = FakeBubbleStashController()
PhysicsAnimatorTestUtils.prepareForTest()
setupFlyoutController()
}
@@ -96,11 +97,10 @@
@Test
fun animateBubbleInForStashed() {
setUpBubbleBar()
- setUpBubbleStashController()
val handle = View(context)
val handleAnimator = PhysicsAnimator.getInstance(handle)
- whenever(bubbleStashController.getStashedHandlePhysicsAnimator()).thenReturn(handleAnimator)
+ bubbleStashController.handleAnimator = handleAnimator
val animator =
BubbleBarViewAnimator(
@@ -147,17 +147,16 @@
assertThat(handle.translationY).isEqualTo(0)
assertThat(bubbleBarView.alpha).isEqualTo(0)
assertThat(animator.isAnimating).isFalse()
- verify(bubbleStashController).stashBubbleBarImmediate()
+ assertThat(bubbleStashController.isStashed).isTrue()
}
@Test
fun animateBubbleInForStashed_tapAnimatingBubble() {
setUpBubbleBar()
- setUpBubbleStashController()
val handle = View(context)
val handleAnimator = PhysicsAnimator.getInstance(handle)
- whenever(bubbleStashController.getStashedHandlePhysicsAnimator()).thenReturn(handleAnimator)
+ bubbleStashController.handleAnimator = handleAnimator
val animator =
BubbleBarViewAnimator(
@@ -187,7 +186,7 @@
assertThat(bubbleBarView.translationY).isEqualTo(BAR_TRANSLATION_Y_FOR_TASKBAR)
assertThat(animator.isAnimating).isTrue()
- verify(bubbleStashController, atLeastOnce()).updateTaskbarTouchRegion()
+ assertThat(bubbleStashController.taskbarTouchRegionUpdated).isTrue()
assertThat(bubbleBarParentViewController.timesInvoked).isEqualTo(1)
waitForFlyoutToShow()
@@ -211,11 +210,10 @@
@Test
fun animateBubbleInForStashed_touchTaskbarArea_whileShowing() {
setUpBubbleBar()
- setUpBubbleStashController()
val handle = View(context)
val handleAnimator = PhysicsAnimator.getInstance(handle)
- whenever(bubbleStashController.getStashedHandlePhysicsAnimator()).thenReturn(handleAnimator)
+ bubbleStashController.handleAnimator = handleAnimator
val animator =
BubbleBarViewAnimator(
@@ -241,7 +239,6 @@
// verify the hide bubble animation is pending
assertThat(animatorScheduler.delayedBlock).isNotNull()
- whenever(bubbleStashController.isStashed).thenReturn(true)
InstrumentationRegistry.getInstrumentation().runOnMainSync {
animator.onStashStateChangingWhileAnimating()
}
@@ -255,9 +252,10 @@
// verify that the hide animation was canceled
assertThat(animatorScheduler.delayedBlock).isNull()
assertThat(animator.isAnimating).isFalse()
+ assertThat(bubbleStashController.animationInterrupted).isTrue()
assertThat(bubbleBarView.scaleX).isEqualTo(1)
assertThat(bubbleBarView.scaleY).isEqualTo(1)
- verify(bubbleStashController).onNewBubbleAnimationInterrupted(eq(true), any())
+ assertThat(bubbleStashController.isStashed).isTrue()
// PhysicsAnimatorTestUtils posts the cancellation to the main thread so we need to wait
// again
@@ -268,11 +266,10 @@
@Test
fun animateBubbleInForStashed_touchTaskbarArea_whileHiding() {
setUpBubbleBar()
- setUpBubbleStashController()
val handle = View(context)
val handleAnimator = PhysicsAnimator.getInstance(handle)
- whenever(bubbleStashController.getStashedHandlePhysicsAnimator()).thenReturn(handleAnimator)
+ bubbleStashController.handleAnimator = handleAnimator
val animator =
BubbleBarViewAnimator(
@@ -310,7 +307,7 @@
}
assertThat(bubbleBarParentViewController.timesInvoked).isEqualTo(2)
assertThat(animator.isAnimating).isFalse()
- verify(bubbleStashController).onNewBubbleAnimationInterrupted(any(), any())
+ assertThat(bubbleStashController.animationInterrupted).isTrue()
// PhysicsAnimatorTestUtils posts the cancellation to the main thread so we need to wait
// again
@@ -321,11 +318,10 @@
@Test
fun animateBubbleInForStashed_showAnimationCanceled() {
setUpBubbleBar()
- setUpBubbleStashController()
val handle = View(context)
val handleAnimator = PhysicsAnimator.getInstance(handle)
- whenever(bubbleStashController.getStashedHandlePhysicsAnimator()).thenReturn(handleAnimator)
+ bubbleStashController.handleAnimator = handleAnimator
val animator =
BubbleBarViewAnimator(
@@ -359,11 +355,10 @@
@Test
fun animateBubbleInForStashed_autoExpanding() {
setUpBubbleBar()
- setUpBubbleStashController()
val handle = View(context)
val handleAnimator = PhysicsAnimator.getInstance(handle)
- whenever(bubbleStashController.getStashedHandlePhysicsAnimator()).thenReturn(handleAnimator)
+ bubbleStashController.handleAnimator = handleAnimator
var notifiedExpanded = false
val onExpanded = Runnable { notifiedExpanded = true }
@@ -399,18 +394,17 @@
// verify there is no hide animation
assertThat(animatorScheduler.delayedBlock).isNull()
- verify(bubbleStashController).showBubbleBarImmediate()
+ assertThat(bubbleStashController.isStashed).isFalse()
assertThat(notifiedExpanded).isTrue()
}
@Test
fun animateBubbleInForStashed_expandedWhileAnimatingIn() {
setUpBubbleBar()
- setUpBubbleStashController()
val handle = View(context)
val handleAnimator = PhysicsAnimator.getInstance(handle)
- whenever(bubbleStashController.getStashedHandlePhysicsAnimator()).thenReturn(handleAnimator)
+ bubbleStashController.handleAnimator = handleAnimator
var notifiedExpanded = false
val onExpanded = Runnable { notifiedExpanded = true }
@@ -459,11 +453,10 @@
@Test
fun animateBubbleInForStashed_expandedWhileFullyIn() {
setUpBubbleBar()
- setUpBubbleStashController()
val handle = View(context)
val handleAnimator = PhysicsAnimator.getInstance(handle)
- whenever(bubbleStashController.getStashedHandlePhysicsAnimator()).thenReturn(handleAnimator)
+ bubbleStashController.handleAnimator = handleAnimator
var notifiedExpanded = false
val onExpanded = Runnable { notifiedExpanded = true }
@@ -515,13 +508,11 @@
@Test
fun animateToInitialState_inApp() {
setUpBubbleBar()
- setUpBubbleStashController()
- whenever(bubbleStashController.bubbleBarTranslationY)
- .thenReturn(BAR_TRANSLATION_Y_FOR_TASKBAR)
+ bubbleStashController.launcherState = BubbleLauncherState.IN_APP
val handle = View(context)
val handleAnimator = PhysicsAnimator.getInstance(handle)
- whenever(bubbleStashController.getStashedHandlePhysicsAnimator()).thenReturn(handleAnimator)
+ bubbleStashController.handleAnimator = handleAnimator
val barAnimator = PhysicsAnimator.getInstance(bubbleBarView)
@@ -570,19 +561,17 @@
assertThat(bubbleBarView.visibility).isEqualTo(VISIBLE)
assertThat(notifiedBubbleBarVisible).isTrue()
- verify(bubbleStashController).stashBubbleBarImmediate()
+ assertThat(bubbleStashController.isStashed).isTrue()
}
@Test
fun animateToInitialState_whileDragging_inApp() {
setUpBubbleBar()
- setUpBubbleStashController()
- whenever(bubbleStashController.bubbleBarTranslationY)
- .thenReturn(BAR_TRANSLATION_Y_FOR_TASKBAR)
+ bubbleStashController.launcherState = BubbleLauncherState.IN_APP
val handle = View(context)
val handleAnimator = PhysicsAnimator.getInstance(handle)
- whenever(bubbleStashController.getStashedHandlePhysicsAnimator()).thenReturn(handleAnimator)
+ bubbleStashController.handleAnimator = handleAnimator
val barAnimator = PhysicsAnimator.getInstance(bubbleBarView)
@@ -634,20 +623,16 @@
assertThat(handle.translationY).isEqualTo(0)
assertThat(bubbleBarView.visibility).isEqualTo(VISIBLE)
assertThat(notifiedBubbleBarVisible).isTrue()
-
- verify(bubbleStashController, never()).stashBubbleBarImmediate()
}
@Test
fun animateToInitialState_inApp_autoExpanding() {
setUpBubbleBar()
- setUpBubbleStashController()
- whenever(bubbleStashController.bubbleBarTranslationY)
- .thenReturn(BAR_TRANSLATION_Y_FOR_TASKBAR)
+ bubbleStashController.launcherState = BubbleLauncherState.IN_APP
val handle = View(context)
val handleAnimator = PhysicsAnimator.getInstance(handle)
- whenever(bubbleStashController.getStashedHandlePhysicsAnimator()).thenReturn(handleAnimator)
+ bubbleStashController.handleAnimator = handleAnimator
val barAnimator = PhysicsAnimator.getInstance(bubbleBarView)
@@ -677,16 +662,14 @@
assertThat(bubbleBarView.translationY).isEqualTo(BAR_TRANSLATION_Y_FOR_TASKBAR)
assertThat(animatorScheduler.delayedBlock).isNull()
- verify(bubbleStashController).showBubbleBarImmediate()
+ assertThat(bubbleStashController.isStashed).isFalse()
assertThat(notifiedExpanded).isTrue()
}
@Test
fun animateToInitialState_inHome() {
setUpBubbleBar()
- setUpBubbleStashController()
- whenever(bubbleStashController.bubbleBarTranslationY)
- .thenReturn(BAR_TRANSLATION_Y_FOR_HOTSEAT)
+ bubbleStashController.launcherState = BubbleLauncherState.HOME
val barAnimator = PhysicsAnimator.getInstance(bubbleBarView)
@@ -725,15 +708,13 @@
assertThat(bubbleBarView.alpha).isEqualTo(1)
assertThat(bubbleBarView.translationY).isEqualTo(BAR_TRANSLATION_Y_FOR_HOTSEAT)
- verify(bubbleStashController).showBubbleBarImmediate()
+ assertThat(bubbleStashController.isStashed).isFalse()
}
@Test
fun animateToInitialState_expandedWhileAnimatingIn() {
setUpBubbleBar()
- setUpBubbleStashController()
- whenever(bubbleStashController.bubbleBarTranslationY)
- .thenReturn(BAR_TRANSLATION_Y_FOR_HOTSEAT)
+ bubbleStashController.launcherState = BubbleLauncherState.HOME
var notifiedExpanded = false
val onExpanded = Runnable { notifiedExpanded = true }
@@ -775,16 +756,14 @@
verifyBubbleBarIsExpandedWithTranslation(BAR_TRANSLATION_Y_FOR_HOTSEAT)
assertThat(animator.isAnimating).isFalse()
- verify(bubbleStashController).showBubbleBarImmediate()
+ assertThat(bubbleStashController.isStashed).isFalse()
assertThat(notifiedExpanded).isTrue()
}
@Test
fun animateToInitialState_expandedWhileFullyIn() {
setUpBubbleBar()
- setUpBubbleStashController()
- whenever(bubbleStashController.bubbleBarTranslationY)
- .thenReturn(BAR_TRANSLATION_Y_FOR_HOTSEAT)
+ bubbleStashController.launcherState = BubbleLauncherState.HOME
var notifiedExpanded = false
val onExpanded = Runnable { notifiedExpanded = true }
@@ -831,9 +810,7 @@
@Test
fun animateBubbleBarForCollapsed() {
setUpBubbleBar()
- setUpBubbleStashController()
- whenever(bubbleStashController.bubbleBarTranslationY)
- .thenReturn(BAR_TRANSLATION_Y_FOR_HOTSEAT)
+ bubbleStashController.launcherState = BubbleLauncherState.HOME
val barAnimator = PhysicsAnimator.getInstance(bubbleBarView)
@@ -877,16 +854,13 @@
assertThat(bubbleBarParentViewController.timesInvoked).isEqualTo(2)
// the bubble bar translation y should be back to its initial value
assertThat(bubbleBarView.translationY).isEqualTo(BAR_TRANSLATION_Y_FOR_HOTSEAT)
-
- verify(bubbleStashController).showBubbleBarImmediate()
+ assertThat(bubbleStashController.isStashed).isFalse()
}
@Test
fun animateBubbleBarForCollapsed_autoExpanding() {
setUpBubbleBar()
- setUpBubbleStashController()
- whenever(bubbleStashController.bubbleBarTranslationY)
- .thenReturn(BAR_TRANSLATION_Y_FOR_HOTSEAT)
+ bubbleStashController.launcherState = BubbleLauncherState.HOME
val semaphore = Semaphore(0)
var notifiedExpanded = false
@@ -933,16 +907,14 @@
assertThat(animator.isAnimating).isFalse()
assertThat(bubbleBarView.translationY).isEqualTo(BAR_TRANSLATION_Y_FOR_HOTSEAT)
- verify(bubbleStashController).showBubbleBarImmediate()
+ assertThat(bubbleStashController.isStashed).isFalse()
assertThat(notifiedExpanded).isTrue()
}
@Test
fun animateBubbleBarForCollapsed_expandingWhileAnimatingIn() {
setUpBubbleBar()
- setUpBubbleStashController()
- whenever(bubbleStashController.bubbleBarTranslationY)
- .thenReturn(BAR_TRANSLATION_Y_FOR_HOTSEAT)
+ bubbleStashController.launcherState = BubbleLauncherState.HOME
val semaphore = Semaphore(0)
var notifiedExpanded = false
@@ -1001,16 +973,14 @@
assertThat(animator.isAnimating).isFalse()
assertThat(bubbleBarView.translationY).isEqualTo(BAR_TRANSLATION_Y_FOR_HOTSEAT)
assertThat(bubbleBarView.isExpanded).isTrue()
- verify(bubbleStashController).showBubbleBarImmediate()
+ assertThat(bubbleStashController.isStashed).isFalse()
assertThat(notifiedExpanded).isTrue()
}
@Test
fun animateBubbleBarForCollapsed_expandingWhileFullyIn() {
setUpBubbleBar()
- setUpBubbleStashController()
- whenever(bubbleStashController.bubbleBarTranslationY)
- .thenReturn(BAR_TRANSLATION_Y_FOR_HOTSEAT)
+ bubbleStashController.launcherState = BubbleLauncherState.HOME
val barAnimator = PhysicsAnimator.getInstance(bubbleBarView)
@@ -1064,18 +1034,17 @@
assertThat(animator.isAnimating).isFalse()
assertThat(bubbleBarView.translationY).isEqualTo(BAR_TRANSLATION_Y_FOR_HOTSEAT)
assertThat(bubbleBarView.isExpanded).isTrue()
- verify(bubbleStashController).showBubbleBarImmediate()
+ assertThat(bubbleStashController.isStashed).isFalse()
assertThat(notifiedExpanded).isTrue()
}
@Test
fun interruptAnimation_whileAnimatingIn() {
setUpBubbleBar()
- setUpBubbleStashController()
val handle = View(context)
val handleAnimator = PhysicsAnimator.getInstance(handle)
- whenever(bubbleStashController.getStashedHandlePhysicsAnimator()).thenReturn(handleAnimator)
+ bubbleStashController.handleAnimator = handleAnimator
val animator =
BubbleBarViewAnimator(
@@ -1136,17 +1105,16 @@
assertThat(handle.translationY).isEqualTo(0)
assertThat(bubbleBarView.alpha).isEqualTo(0)
assertThat(animator.isAnimating).isFalse()
- verify(bubbleStashController).stashBubbleBarImmediate()
+ assertThat(bubbleStashController.isStashed).isTrue()
}
@Test
fun interruptAnimation_whileIn() {
setUpBubbleBar()
- setUpBubbleStashController()
val handle = View(context)
val handleAnimator = PhysicsAnimator.getInstance(handle)
- whenever(bubbleStashController.getStashedHandlePhysicsAnimator()).thenReturn(handleAnimator)
+ bubbleStashController.handleAnimator = handleAnimator
val animator =
BubbleBarViewAnimator(
@@ -1213,17 +1181,16 @@
assertThat(handle.translationY).isEqualTo(0)
assertThat(bubbleBarView.alpha).isEqualTo(0)
assertThat(animator.isAnimating).isFalse()
- verify(bubbleStashController).stashBubbleBarImmediate()
+ assertThat(bubbleStashController.isStashed).isTrue()
}
@Test
fun interruptAnimation_whileAnimatingOut_whileCollapsingFlyout() {
setUpBubbleBar()
- setUpBubbleStashController()
val handle = View(context)
val handleAnimator = PhysicsAnimator.getInstance(handle)
- whenever(bubbleStashController.getStashedHandlePhysicsAnimator()).thenReturn(handleAnimator)
+ bubbleStashController.handleAnimator = handleAnimator
val animator =
BubbleBarViewAnimator(
@@ -1301,17 +1268,16 @@
assertThat(handle.translationY).isEqualTo(0)
assertThat(bubbleBarView.alpha).isEqualTo(0)
assertThat(animator.isAnimating).isFalse()
- verify(bubbleStashController).stashBubbleBarImmediate()
+ assertThat(bubbleStashController.isStashed).isTrue()
}
@Test
fun interruptAnimation_whileAnimatingOut_barToHandle() {
setUpBubbleBar()
- setUpBubbleStashController()
val handle = View(context)
val handleAnimator = PhysicsAnimator.getInstance(handle)
- whenever(bubbleStashController.getStashedHandlePhysicsAnimator()).thenReturn(handleAnimator)
+ bubbleStashController.handleAnimator = handleAnimator
val animator =
BubbleBarViewAnimator(
@@ -1416,17 +1382,16 @@
assertThat(handle.translationY).isEqualTo(0)
assertThat(bubbleBarView.alpha).isEqualTo(0)
assertThat(animator.isAnimating).isFalse()
- verify(bubbleStashController).stashBubbleBarImmediate()
+ assertThat(bubbleStashController.isStashed).isTrue()
}
@Test
fun interruptForIme() {
setUpBubbleBar()
- setUpBubbleStashController()
val handle = View(context)
val handleAnimator = PhysicsAnimator.getInstance(handle)
- whenever(bubbleStashController.getStashedHandlePhysicsAnimator()).thenReturn(handleAnimator)
+ bubbleStashController.handleAnimator = handleAnimator
val animator =
BubbleBarViewAnimator(
@@ -1457,7 +1422,8 @@
// verify that the hide animation was canceled
assertThat(animatorScheduler.delayedBlock).isNull()
assertThat(animator.isAnimating).isFalse()
- verify(bubbleStashController).onNewBubbleAnimationInterrupted(eq(true), any())
+ assertThat(bubbleStashController.animationInterrupted).isTrue()
+ assertThat(bubbleStashController.isStashed).isTrue()
// PhysicsAnimatorTestUtils posts the cancellation to the main thread so we need to wait
// again
@@ -1510,17 +1476,6 @@
InstrumentationRegistry.getInstrumentation().waitForIdleSync()
}
- private fun setUpBubbleStashController() {
- bubbleStashController = mock<BubbleStashController>()
- whenever(bubbleStashController.isStashed).thenReturn(true)
- whenever(bubbleStashController.getDiffBetweenHandleAndBarCenters())
- .thenReturn(DIFF_BETWEEN_HANDLE_AND_BAR_CENTERS)
- whenever(bubbleStashController.getStashedHandleTranslationForNewBubbleAnimation())
- .thenReturn(HANDLE_TRANSLATION)
- whenever(bubbleStashController.bubbleBarTranslationYForTaskbar)
- .thenReturn(BAR_TRANSLATION_Y_FOR_TASKBAR)
- }
-
private fun setupFlyoutController() {
flyoutContainer = FrameLayout(context)
val flyoutPositioner =
@@ -1627,6 +1582,91 @@
timesInvoked++
}
}
+
+ private class FakeBubbleStashController : BubbleStashController {
+
+ var handleAnimator: PhysicsAnimator<View>? = null
+ var taskbarTouchRegionUpdated = false
+ private set
+
+ var animationInterrupted = false
+ private set
+
+ private var _isStashed = true
+
+ override var launcherState = BubbleLauncherState.HOME
+ override val isStashed: Boolean
+ get() = _isStashed
+
+ override var bubbleBarVerticalCenterForHome = 0
+ override var isSysuiLocked = false
+ override val isTransientTaskBar = true
+ override val hasHandleView = true
+ override val bubbleBarTranslationYForTaskbar = BAR_TRANSLATION_Y_FOR_TASKBAR
+ override val bubbleBarTranslationYForHotseat = BAR_TRANSLATION_Y_FOR_HOTSEAT
+ override var inAppDisplayOverrideProgress = 0f
+
+ override fun init(
+ taskbarInsetsController: TaskbarInsetsController,
+ bubbleBarViewController: BubbleBarViewController,
+ bubbleStashedHandleViewController: BubbleStashedHandleViewController?,
+ controllersAfterInitAction: BubbleStashController.ControllersAfterInitAction,
+ ) {}
+
+ override fun showBubbleBarImmediate() {
+ _isStashed = false
+ }
+
+ override fun showBubbleBarImmediate(bubbleBarTranslationY: Float) {
+ _isStashed = false
+ }
+
+ override fun stashBubbleBarImmediate() {
+ _isStashed = true
+ }
+
+ override fun getTouchableHeight() = 100
+
+ override fun isBubbleBarVisible() = true
+
+ override fun onNewBubbleAnimationInterrupted(
+ isStashed: Boolean,
+ bubbleBarTranslationY: Float,
+ ) {
+ _isStashed = isStashed
+ animationInterrupted = true
+ }
+
+ override fun isEventOverBubbleBarViews(ev: MotionEvent) = false
+
+ override fun setBubbleBarLocation(bubbleBarLocation: BubbleBarLocation) {}
+
+ override fun stashBubbleBar() {
+ _isStashed = true
+ }
+
+ override fun showBubbleBar(expandBubbles: Boolean, bubbleBarGesture: Boolean) {
+ _isStashed = false
+ }
+
+ override fun getDiffBetweenHandleAndBarCenters() = DIFF_BETWEEN_HANDLE_AND_BAR_CENTERS
+
+ override fun getStashedHandleTranslationForNewBubbleAnimation() = HANDLE_TRANSLATION
+
+ override fun getStashedHandlePhysicsAnimator(): PhysicsAnimator<View>? {
+ return handleAnimator
+ }
+
+ override fun updateTaskbarTouchRegion() {
+ taskbarTouchRegionUpdated = true
+ }
+
+ override fun setHandleTranslationY(translationY: Float) {}
+
+ override fun getHandleTranslationY() = 0f
+
+ override fun getHandleBounds(bounds: Rect) {}
+ }
}
private const val DIFF_BETWEEN_HANDLE_AND_BAR_CENTERS = -20f
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/RecentTasksListTest.java b/quickstep/tests/multivalentTests/src/com/android/quickstep/RecentTasksListTest.java
index ad9bbb9..70bf6b4 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/RecentTasksListTest.java
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/RecentTasksListTest.java
@@ -19,6 +19,7 @@
import static android.view.Display.DEFAULT_DISPLAY;
import static com.android.launcher3.Flags.FLAG_ENABLE_SEPARATE_EXTERNAL_DISPLAY_TASKS;
+import static com.android.window.flags.Flags.FLAG_ENABLE_MULTIPLE_DESKTOPS_BACKEND;
import static com.google.common.truth.Truth.assertThat;
@@ -201,6 +202,7 @@
@Test
@EnableFlags(FLAG_ENABLE_SEPARATE_EXTERNAL_DISPLAY_TASKS)
+ @DisableFlags(FLAG_ENABLE_MULTIPLE_DESKTOPS_BACKEND)
public void loadTasksInBackground_freeformTask_createsDesktopTaskPerDisplay() throws Exception {
List<TaskInfo> tasks = Arrays.asList(
createRecentTaskInfo(1 /* taskId */, DEFAULT_DISPLAY),
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 7ca194a..b49923f 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
@@ -25,10 +25,10 @@
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.Test
@@ -37,37 +37,21 @@
@RunWith(AndroidJUnit4::class)
class TaskUiStateMapperTest {
+ /** TaskHeaderUiState */
@Test
- fun taskData_isNull_returns_Uninitialized() {
+ fun taskData_isNull_returns_HideHeader() {
val result =
- TaskUiStateMapper.toTaskThumbnailUiState(
+ TaskUiStateMapper.toTaskHeaderState(
taskData = null,
- isLiveTile = false,
hasHeader = false,
clickCloseListener = null,
)
- assertThat(result).isEqualTo(TaskThumbnailUiState.Uninitialized)
- }
-
- @Test
- fun taskData_isLiveTile_returns_LiveTile() {
- val inputs =
- listOf(TASK_DATA, TASK_DATA.copy(thumbnailData = null), TASK_DATA.copy(isLocked = true))
- inputs.forEach { input ->
- val result =
- TaskUiStateMapper.toTaskThumbnailUiState(
- taskData = input,
- isLiveTile = true,
- hasHeader = false,
- clickCloseListener = null,
- )
- assertThat(result).isEqualTo(LiveTile.WithoutHeader)
- }
+ assertThat(result).isEqualTo(TaskHeaderUiState.HideHeader)
}
@EnableFlags(Flags.FLAG_ENABLE_DESKTOP_EXPLODED_VIEW)
@Test
- fun taskData_isLiveTileWithHeader_returns_LiveTileWithHeader() {
+ fun taskData_hasHeader_and_taskData_returnsShowHeader() {
val inputs =
listOf(
TASK_DATA,
@@ -77,14 +61,18 @@
)
val closeCallback = View.OnClickListener {}
val expected =
- LiveTile.WithHeader(
- header = ThumbnailHeader(TASK_ICON, TASK_TITLE_DESCRIPTION, closeCallback)
+ TaskHeaderUiState.ShowHeader(
+ header =
+ TaskHeaderUiState.ThumbnailHeader(
+ TASK_ICON,
+ TASK_TITLE_DESCRIPTION,
+ closeCallback,
+ )
)
inputs.forEach { taskData ->
val result =
- TaskUiStateMapper.toTaskThumbnailUiState(
+ TaskUiStateMapper.toTaskHeaderState(
taskData = taskData,
- isLiveTile = true,
hasHeader = true,
clickCloseListener = closeCallback,
)
@@ -94,7 +82,7 @@
@EnableFlags(Flags.FLAG_ENABLE_DESKTOP_EXPLODED_VIEW)
@Test
- fun taskData_isLiveTileWithHeader_missingHeaderData_returns_LiveTileWithoutHeader() {
+ fun taskData_hasHeader_emptyTaskData_returns_HideHeader() {
val inputs =
listOf(
TASK_DATA.copy(icon = null),
@@ -104,30 +92,42 @@
inputs.forEach { taskData ->
val result =
- TaskUiStateMapper.toTaskThumbnailUiState(
+ TaskUiStateMapper.toTaskHeaderState(
taskData = taskData,
- isLiveTile = true,
hasHeader = true,
clickCloseListener = {},
)
- assertThat(result).isEqualTo(LiveTile.WithoutHeader)
+ 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)
+ }
+
+ @Test
+ fun taskData_isLiveTile_returns_LiveTile() {
+ val inputs =
+ 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)
}
}
@Test
fun taskData_isStaticTile_returns_SnapshotSplash() {
val result =
- TaskUiStateMapper.toTaskThumbnailUiState(
- taskData = TASK_DATA,
- isLiveTile = false,
- hasHeader = false,
- clickCloseListener = null,
- )
+ TaskUiStateMapper.toTaskThumbnailUiState(taskData = TASK_DATA, isLiveTile = false)
val expected =
TaskThumbnailUiState.SnapshotSplash(
snapshot =
- Snapshot.WithoutHeader(
+ Snapshot(
backgroundColor = TASK_BACKGROUND_COLOR,
bitmap = TASK_THUMBNAIL,
thumbnailRotation = Surface.ROTATION_0,
@@ -138,72 +138,12 @@
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)
@@ -216,8 +156,6 @@
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 a97ef0c..18b9fe9 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
@@ -66,16 +66,7 @@
@Before
fun setUp() {
- sut =
- TaskViewModel(
- taskViewType = TaskViewType.SINGLE,
- recentsViewData = recentsViewData,
- getTaskUseCase = getTaskUseCase,
- getSysUiStatusNavFlagsUseCase = GetSysUiStatusNavFlagsUseCase(),
- isThumbnailValidUseCase = isThumbnailValidUseCase,
- getThumbnailPositionUseCase = getThumbnailPositionUseCase,
- dispatcherProvider = TestDispatcherProvider(unconfinedTestDispatcher),
- )
+ sut = createTaskViewModel(TaskViewType.SINGLE)
whenever(getTaskUseCase.invoke(TASK_MODEL_1.id)).thenReturn(flow { emit(TASK_MODEL_1) })
whenever(getTaskUseCase.invoke(TASK_MODEL_2.id)).thenReturn(flow { emit(TASK_MODEL_2) })
whenever(getTaskUseCase.invoke(TASK_MODEL_3.id)).thenReturn(flow { emit(TASK_MODEL_3) })
@@ -93,6 +84,7 @@
isLiveTile = false,
hasHeader = false,
sysUiStatusNavFlags = FLAGS_APPEARANCE_LIGHT_THEME,
+ taskOverlayEnabled = false,
)
assertThat(sut.state.first()).isEqualTo(expectedResult)
}
@@ -139,6 +131,7 @@
isLiveTile = false,
hasHeader = false,
sysUiStatusNavFlags = FLAGS_APPEARANCE_LIGHT_THEME,
+ taskOverlayEnabled = false,
)
assertThat(sut.state.first()).isEqualTo(expectedResult)
}
@@ -161,6 +154,7 @@
isLiveTile = true,
hasHeader = false,
sysUiStatusNavFlags = FLAGS_APPEARANCE_LIGHT_THEME,
+ taskOverlayEnabled = false,
)
assertThat(sut.state.first()).isEqualTo(expectedResult)
}
@@ -183,6 +177,7 @@
isLiveTile = false,
hasHeader = false,
sysUiStatusNavFlags = FLAGS_APPEARANCE_LIGHT_THEME,
+ taskOverlayEnabled = false,
)
assertThat(sut.state.first()).isEqualTo(expectedResult)
}
@@ -204,6 +199,7 @@
isLiveTile = false,
hasHeader = false,
sysUiStatusNavFlags = FLAGS_APPEARANCE_LIGHT_THEME,
+ taskOverlayEnabled = false,
)
assertThat(sut.state.first()).isEqualTo(expectedResult)
}
@@ -221,6 +217,7 @@
isLiveTile = false,
hasHeader = false,
sysUiStatusNavFlags = FLAGS_APPEARANCE_LIGHT_THEME,
+ taskOverlayEnabled = false,
)
assertThat(sut.state.first()).isEqualTo(expectedResult)
}
@@ -235,11 +232,64 @@
isLiveTile = false,
hasHeader = false,
sysUiStatusNavFlags = FLAGS_APPEARANCE_DEFAULT,
+ taskOverlayEnabled = false,
)
assertThat(sut.state.first()).isEqualTo(expectedResult)
}
@Test
+ fun taskOverlayEnabled_when_OverlayIsEnabledForVisibleSingleTask() =
+ testScope.runTest {
+ sut.bind(TASK_MODEL_1.id)
+ recentsViewData.overlayEnabled.value = true
+ recentsViewData.settledFullyVisibleTaskIds.value = setOf(1)
+
+ assertThat(sut.state.first().taskOverlayEnabled).isTrue()
+ }
+
+ @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)
+ recentsViewData.overlayEnabled.value = true
+ recentsViewData.settledFullyVisibleTaskIds.value = setOf(2)
+
+ assertThat(sut.state.first().taskOverlayEnabled).isFalse()
+ }
+
+ @Test
+ fun taskOverlayDisabled_when_OverlayIsDisabledForVisibleTask() =
+ testScope.runTest {
+ sut.bind(TASK_MODEL_1.id)
+ recentsViewData.overlayEnabled.value = false
+ recentsViewData.settledFullyVisibleTaskIds.value = setOf(1)
+
+ assertThat(sut.state.first().taskOverlayEnabled).isFalse()
+ }
+
+ @Test
fun shouldShowSplash_calls_useCase() {
sut.isThumbnailValid(null, 0, 0)
verify(isThumbnailValidUseCase).invoke(anyOrNull(), anyInt(), anyInt())
@@ -256,6 +306,17 @@
isLocked = isLocked,
)
+ private fun createTaskViewModel(taskViewType: TaskViewType) =
+ TaskViewModel(
+ taskViewType = taskViewType,
+ recentsViewData = recentsViewData,
+ getTaskUseCase = getTaskUseCase,
+ getSysUiStatusNavFlagsUseCase = GetSysUiStatusNavFlagsUseCase(),
+ isThumbnailValidUseCase = isThumbnailValidUseCase,
+ getThumbnailPositionUseCase = getThumbnailPositionUseCase,
+ dispatcherProvider = TestDispatcherProvider(unconfinedTestDispatcher),
+ )
+
private companion object {
const val INVALID_TASK_ID = -1
const val FLAGS_APPEARANCE_LIGHT_THEME = FLAG_LIGHT_STATUS or FLAG_LIGHT_NAV
diff --git a/quickstep/tests/src/com/android/quickstep/DesktopSystemShortcutTest.kt b/quickstep/tests/src/com/android/quickstep/DesktopSystemShortcutTest.kt
index a523e02..7b73be7 100644
--- a/quickstep/tests/src/com/android/quickstep/DesktopSystemShortcutTest.kt
+++ b/quickstep/tests/src/com/android/quickstep/DesktopSystemShortcutTest.kt
@@ -36,6 +36,7 @@
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
@@ -248,6 +249,7 @@
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 2db94f6..5aaed7d 100644
--- a/quickstep/tests/src/com/android/quickstep/ExternalDisplaySystemShortcutTest.kt
+++ b/quickstep/tests/src/com/android/quickstep/ExternalDisplaySystemShortcutTest.kt
@@ -37,6 +37,7 @@
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
@@ -246,6 +247,7 @@
TaskContainer(
taskView,
task,
+ mock<TaskContentView>(),
if (enableRefactorTaskThumbnail()) mock<TaskThumbnailView>()
else mock<TaskThumbnailViewDeprecated>(),
mock<TaskViewIcon>(),
diff --git a/quickstep/tests/src/com/android/quickstep/TaplTestsQuickstep.java b/quickstep/tests/src/com/android/quickstep/TaplTestsQuickstep.java
index 1af48a9..b207d4a 100644
--- a/quickstep/tests/src/com/android/quickstep/TaplTestsQuickstep.java
+++ b/quickstep/tests/src/com/android/quickstep/TaplTestsQuickstep.java
@@ -100,11 +100,9 @@
@After
public void tearDown() {
- runOnRecentsView(recentsView -> {
- if (recentsView != null) {
- recentsView.getPagedViewOrientedState().forceAllowRotationForTesting(false);
- }
- });
+ runOnRecentsView(recentsView ->
+ recentsView.getPagedViewOrientedState().forceAllowRotationForTesting(false),
+ /* forTearDown= */ true);
}
public static void startTestApps() throws Exception {
@@ -661,18 +659,31 @@
}
private <T> T getFromRecentsView(Function<RecentsView, T> f) {
+ return getFromRecentsView(f, false);
+ }
+
+ private <T> T getFromRecentsView(Function<RecentsView, T> f, boolean forTearDown) {
if (enableLauncherOverviewInWindow()) {
- return getFromRecentsWindow(
- recentsWindowManager -> f.apply(recentsWindowManager.getOverviewPanel()));
+ return getFromRecentsWindow(recentsWindowManager ->
+ (forTearDown && recentsWindowManager == null)
+ ? null : f.apply(recentsWindowManager.getOverviewPanel()));
} else {
- return getFromLauncher(launcher -> f.apply(launcher.getOverviewPanel()));
+ return getFromLauncher(launcher -> (forTearDown && launcher == null)
+ ? null : f.apply(launcher.getOverviewPanel()));
}
}
private void runOnRecentsView(Consumer<RecentsView> f) {
+ runOnRecentsView(f, false);
+ }
+
+ private void runOnRecentsView(Consumer<RecentsView> f, boolean forTearDown) {
getFromRecentsView(recentsView -> {
+ if (forTearDown && recentsView == null) {
+ return null;
+ }
f.accept(recentsView);
return null;
- });
+ }, forTearDown);
}
}
diff --git a/quickstep/tests/src/com/android/quickstep/TaplTestsTaskbar.java b/quickstep/tests/src/com/android/quickstep/TaplTestsTaskbar.java
index 08ce5e7..ec245ee 100644
--- a/quickstep/tests/src/com/android/quickstep/TaplTestsTaskbar.java
+++ b/quickstep/tests/src/com/android/quickstep/TaplTestsTaskbar.java
@@ -24,7 +24,6 @@
import androidx.test.filters.LargeTest;
import com.android.launcher3.ui.PortraitLandscapeRunner.PortraitLandscape;
-import com.android.launcher3.util.rule.ScreenRecordRule;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -124,7 +123,6 @@
}
@Test
- @ScreenRecordRule.ScreenRecord // b/373417111
public void testLaunchShortcut_fromTaskbarAllApps() {
getTaskbar().openAllApps()
.getAppIcon(TEST_APP_NAME)
diff --git a/quickstep/tests/src/com/android/quickstep/desktop/DesktopAppLaunchAnimatorHelperTest.kt b/quickstep/tests/src/com/android/quickstep/desktop/DesktopAppLaunchAnimatorHelperTest.kt
index b4d9f5b..47108e0 100644
--- a/quickstep/tests/src/com/android/quickstep/desktop/DesktopAppLaunchAnimatorHelperTest.kt
+++ b/quickstep/tests/src/com/android/quickstep/desktop/DesktopAppLaunchAnimatorHelperTest.kt
@@ -93,6 +93,21 @@
}
@Test
+ fun noLaunchTransition_returnsEmptyAnimatorsList() {
+ val pipChange =
+ TransitionInfo.Change(mock(), mock()).apply {
+ mode = WindowManager.TRANSIT_PIP
+ taskInfo = TASK_INFO_FREEFORM
+ }
+ val transitionInfo = TransitionInfo(WindowManager.TRANSIT_NONE, 0)
+ transitionInfo.addChange(pipChange)
+
+ val actual = helper.createAnimators(transitionInfo, finishCallback = {})
+
+ assertThat(actual).hasSize(0)
+ }
+
+ @Test
fun minimizeTransition_returnsLaunchAndMinimizeAnimator() {
val openChange =
TransitionInfo.Change(mock(), mock()).apply {
diff --git a/res/layout/all_apps_personal_work_tabs.xml b/res/layout/all_apps_personal_work_tabs.xml
index b6a8ed8..1435f82 100644
--- a/res/layout/all_apps_personal_work_tabs.xml
+++ b/res/layout/all_apps_personal_work_tabs.xml
@@ -34,6 +34,7 @@
android:layout_weight="1"
android:background="@drawable/all_apps_tabs_background"
android:text="@string/all_apps_personal_tab"
+ android:contentDescription="@string/all_apps_personal_tab_content_description"
android:textColor="@color/all_apps_tab_text"
android:textSize="14sp"
style="?android:attr/borderlessButtonStyle" />
@@ -46,6 +47,7 @@
android:layout_weight="1"
android:background="@drawable/all_apps_tabs_background"
android:text="@string/all_apps_work_tab"
+ android:contentDescription="@string/all_apps_work_tab_content_description"
android:textColor="@color/all_apps_tab_text"
android:textSize="14sp"
style="?android:attr/borderlessButtonStyle" />
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 0d54e2a..a2a1cf2 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Moenie voorstel nie"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Vasspeldvoorspelling"</string>
<string name="bubble" msgid="3072951361014076670">"Borrel"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Speld aan taakbalk vas"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"installeer kortpaaie"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Laat \'n app toe om kortpaaie by te voeg sonder gebruikerinmenging."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"lees tuis-instellings en -kortpaaie"</string>
@@ -191,6 +190,10 @@
<string name="accessibility_close" msgid="2277148124685870734">"Maak toe"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Persoonlik"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Werk"</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="work_profile_toggle_label" msgid="3081029915775481146">"Werkprofiel"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Werkprogramme het \'n kenteken en is sigbaar vir jou IT-administrateur"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Het dit"</string>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index 146700e..ac462ac 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"መተግበሪያውን አይጠቁሙ"</string>
<string name="pin_prediction" msgid="4196423321649756498">"የፒን ግምት"</string>
<string name="bubble" msgid="3072951361014076670">"አረፋ"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"ተግባር አሞሌ ላይ ፒን አድርግ"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"አቋራጮችን ይጭናል"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"መተግበሪያው ያለተጠቃሚ ጣልቃ ገብነት አቋራጭ እንዲያክል ያስችለዋል።"</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"የመነሻ ቅንብሮች እና አቋራጮችን ያነባል"</string>
@@ -191,6 +190,10 @@
<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="work_profile_toggle_label" msgid="3081029915775481146">"የሥራ መገለጫ"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"የሥራ መተግበሪያዎች ባጅ የተደረገባቸው እና ለእርስዎ የአይቲ አስተዳዳሪ የሚታዩ ናቸው"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"ገባኝ"</string>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index cbda006..83b07ec 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"عدم اقتراح التطبيق"</string>
<string name="pin_prediction" msgid="4196423321649756498">"تثبيت التطبيق المتوقّع"</string>
<string name="bubble" msgid="3072951361014076670">"فقاعة"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"التثبيت على \"شريط التطبيقات\""</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"تثبيت اختصارات"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"للسماح لتطبيق ما بإضافة اختصارات بدون تدخل المستخدم."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"الاطلاع على الإعدادات والاختصارات على الشاشة الرئيسية"</string>
@@ -118,10 +117,8 @@
<string name="default_scroll_format" msgid="7475544710230993317">"الصفحة %1$d من %2$d"</string>
<string name="workspace_scroll_format" msgid="8458889198184077399">"الشاشة الرئيسية %1$d من %2$d"</string>
<string name="workspace_new_page" msgid="257366611030256142">"صفحة الشاشة الرئيسية الجديدة"</string>
- <!-- no translation found for app_running_state_description (5645053189564740904) -->
- <skip />
- <!-- no translation found for app_minimized_state_description (710740620044902509) -->
- <skip />
+ <string name="app_running_state_description" msgid="5645053189564740904">"نشط"</string>
+ <string name="app_minimized_state_description" msgid="710740620044902509">"تم التصغير"</string>
<string name="folder_opened" msgid="94695026776264709">"تم فتح المجلد، بمقاس <xliff:g id="WIDTH">%1$d</xliff:g> في <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
<string name="folder_tap_to_close" msgid="4625795376335528256">"انقر لإغلاق المجلد"</string>
<string name="folder_tap_to_rename" msgid="4017685068016979677">"انقر لحفظ الاسم الجديد"</string>
@@ -191,6 +188,10 @@
<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="work_profile_toggle_label" msgid="3081029915775481146">"ملف العمل"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"تحمل تطبيقات العمل مميّزة بشارة ومرئية لمشرف تكنولوجيا المعلومات."</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"حسنًا"</string>
diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml
index 7d079eb..6db0ffb 100644
--- a/res/values-as/strings.xml
+++ b/res/values-as/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"পৰামৰ্শ নিদিব"</string>
<string name="pin_prediction" msgid="4196423321649756498">"পূৰ্বানুমান কৰা এপ্টো পিন কৰক"</string>
<string name="bubble" msgid="3072951361014076670">"বাবল"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"টাস্কবাৰত পিন কৰক"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"শ্বৰ্টকাট ইনষ্টল কৰিব পাৰে"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"ব্য়ৱহাৰকাৰীৰ হস্তক্ষেপ অবিহনেই কোনো এপক শ্বৰ্টকাটবোৰ যোগ কৰাৰ অনুমতি দিয়ে।"</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"গৃহ স্ক্ৰীনত ছেটিং আৰু শ্বৰ্টকাটসমূহ পঢ়া"</string>
@@ -191,6 +190,10 @@
<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="work_profile_toggle_label" msgid="3081029915775481146">"কৰ্মস্থানৰ প্ৰ\'ফাইল"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"কৰ্মস্থানৰ এপ্সমূহ প্ৰতীকেৰে চিহ্নিত কৰা হয় আৰু সেইবোৰ আপোনাৰ আইটি প্ৰশাসকৰ বাবে দৃশ্যমান হয়"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"বুজি পালোঁ"</string>
diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml
index 32e4a0c..28035df 100644
--- a/res/values-az/strings.xml
+++ b/res/values-az/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Tətbiq təklif olunmasın"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Proqnozlaşdırılan tətbiqi bərkidin"</string>
<string name="bubble" msgid="3072951361014076670">"Qabarcıq"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Tapşırıq panelinə bərkidin"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"qısayolları quraşdır"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Tətbiqə istifadəçi müdaxiləsi olmadan qısayolları əlavə etməyə icazə verir."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"Əsas səhifə ayarlarını və qısayollarını oxumaq"</string>
@@ -191,6 +190,10 @@
<string name="accessibility_close" msgid="2277148124685870734">"Bağlayın"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Şəxsi"</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="work_profile_toggle_label" msgid="3081029915775481146">"İş profili"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"İş tətbiqləri nişanlanıb və İT administratorunuza görünür"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Anladım"</string>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index 7078a3a..c8782e2 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Ne predlaži aplikaciju"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Zakači predviđanje"</string>
<string name="bubble" msgid="3072951361014076670">"Oblačić"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Zakači za traku zad."</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"instaliranje prečica"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Dozvoljava aplikaciji da dodaje prečice bez intervencije korisnika."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"čitanje podešavanja i prečica na početnom ekranu"</string>
@@ -118,10 +117,8 @@
<string name="default_scroll_format" msgid="7475544710230993317">"%1$d. stranica od %2$d"</string>
<string name="workspace_scroll_format" msgid="8458889198184077399">"%1$d. početni ekran od %2$d"</string>
<string name="workspace_new_page" msgid="257366611030256142">"Nova stranica početnog ekrana"</string>
- <!-- no translation found for app_running_state_description (5645053189564740904) -->
- <skip />
- <!-- no translation found for app_minimized_state_description (710740620044902509) -->
- <skip />
+ <string name="app_running_state_description" msgid="5645053189564740904">"Aktivno"</string>
+ <string name="app_minimized_state_description" msgid="710740620044902509">"Smanjeno"</string>
<string name="folder_opened" msgid="94695026776264709">"Folder je otvoren, <xliff:g id="WIDTH">%1$d</xliff:g> puta <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
<string name="folder_tap_to_close" msgid="4625795376335528256">"Dodirnite da biste zatvorili folder"</string>
<string name="folder_tap_to_rename" msgid="4017685068016979677">"Dodirnite da biste sačuvali preimenovanje"</string>
@@ -191,6 +188,10 @@
<string name="accessibility_close" msgid="2277148124685870734">"Zatvori"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Lično"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Posao"</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="work_profile_toggle_label" msgid="3081029915775481146">"Poslovni profil"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Poslovne aplikacije su označene značkom i IT administrator može da ih vidi"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Važi"</string>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index 7371bb5..ffb3d91 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Не прапаноўваць праграму"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Замацаваць прапанаваную праграму"</string>
<string name="bubble" msgid="3072951361014076670">"Бурбалка"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Замацаваць на панэлі"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"Стварэнне ярлыкоў"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Дазваляе праграмам дадаваць ярлыкі без умяшання карыстальніка."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"счытваць налады і ярлыкі на галоўным экране"</string>
@@ -191,6 +190,10 @@
<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="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-bg/strings.xml b/res/values-bg/strings.xml
index e99afd9..a4c3faf 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Без предлагане на приложение"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Фиксиране на предвиждането"</string>
<string name="bubble" msgid="3072951361014076670">"Балонче"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Фикс. в лентата на задач."</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"инсталиране на преки пътища"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Разрешава на приложението да добавя преки пътища без намеса на потребителя."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"четене на настройките и преките пътища на началния екран"</string>
@@ -118,10 +117,8 @@
<string name="default_scroll_format" msgid="7475544710230993317">"Страница %1$d от %2$d"</string>
<string name="workspace_scroll_format" msgid="8458889198184077399">"Начален екран %1$d от %2$d"</string>
<string name="workspace_new_page" msgid="257366611030256142">"Нова страница на началния екран"</string>
- <!-- no translation found for app_running_state_description (5645053189564740904) -->
- <skip />
- <!-- no translation found for app_minimized_state_description (710740620044902509) -->
- <skip />
+ <string name="app_running_state_description" msgid="5645053189564740904">"Активно"</string>
+ <string name="app_minimized_state_description" msgid="710740620044902509">"Намалено"</string>
<string name="folder_opened" msgid="94695026776264709">"Папката е отворена – <xliff:g id="WIDTH">%1$d</xliff:g> на <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
<string name="folder_tap_to_close" msgid="4625795376335528256">"Докоснете, за да затворите папката"</string>
<string name="folder_tap_to_rename" msgid="4017685068016979677">"Докоснете, за да запазите новото име"</string>
@@ -191,6 +188,10 @@
<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="work_profile_toggle_label" msgid="3081029915775481146">"Служебен потребителски профил"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Служебните приложения са означени със значка и са видими за системния администратор"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Разбрах"</string>
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
index 7ba23c5..6bc2483 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"অ্যাপ সাজেস্ট করবেন না"</string>
<string name="pin_prediction" msgid="4196423321649756498">"আপনার প্রয়োজন হতে পারে এমন অ্যাপ পিন করুন"</string>
<string name="bubble" msgid="3072951361014076670">"বাবল"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"টাস্কবারে পিন করুন"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"শর্টকাটগুলি ইনস্টল করে"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"একটি অ্যাপ্লিকেশানকে ব্যবহারকারীর হস্তক্ষেপ ছাড়াই শর্টকাটগুলি যোগ করার অনুমতি দেয়৷"</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"হোম স্ক্রিনে সেটিংস ও শর্টকাট পড়ুন"</string>
@@ -191,6 +190,10 @@
<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="work_profile_toggle_label" msgid="3081029915775481146">"অফিসের প্রোফাইল"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"অফিস অ্যাপে ব্যাজ যোগ করা হয়েছে এবং আপনার আইটি অ্যাডমিন সেগুলি দেখতে পাবেন"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"বুঝেছি"</string>
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
index 0a53b1a..394e30f 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Ne predlaži aplikaciju"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Zakači predviđanje"</string>
<string name="bubble" msgid="3072951361014076670">"Oblačić"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Zakači na traku zadataka"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"instaliraj prečice"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Dopušta aplikaciji dodavanje prečica bez posredovanja korisnika."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"čita postavke na početnom ekranu i prečice"</string>
@@ -191,6 +190,10 @@
<string name="accessibility_close" msgid="2277148124685870734">"Zatvaranje"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Lično"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Poslovno"</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="work_profile_toggle_label" msgid="3081029915775481146">"Radni profil"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Poslovne aplikacije su označene i vaš IT administrator ih može vidjeti"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Razumijem"</string>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 6be4337..07a21ab 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"No suggereixis l\'aplicació"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Fixa la predicció"</string>
<string name="bubble" msgid="3072951361014076670">"Bombolla"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Fixa a barra tasques"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"instal·la dreceres"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Permet que una aplicació afegeixi dreceres sense la intervenció de l\'usuari."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"llegir la configuració i les dreceres de la pantalla d\'inici"</string>
@@ -118,10 +117,8 @@
<string name="default_scroll_format" msgid="7475544710230993317">"Pàgina %1$d de %2$d"</string>
<string name="workspace_scroll_format" msgid="8458889198184077399">"Pantalla d\'inici %1$d de %2$d"</string>
<string name="workspace_new_page" msgid="257366611030256142">"Pàgina de la pantalla d\'inici nova"</string>
- <!-- no translation found for app_running_state_description (5645053189564740904) -->
- <skip />
- <!-- no translation found for app_minimized_state_description (710740620044902509) -->
- <skip />
+ <string name="app_running_state_description" msgid="5645053189564740904">"Actiu"</string>
+ <string name="app_minimized_state_description" msgid="710740620044902509">"Minimitzat"</string>
<string name="folder_opened" msgid="94695026776264709">"S\'ha obert la carpeta, <xliff:g id="WIDTH">%1$d</xliff:g> per <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
<string name="folder_tap_to_close" msgid="4625795376335528256">"Toca per tancar la carpeta"</string>
<string name="folder_tap_to_rename" msgid="4017685068016979677">"Toca per desar el nom nou"</string>
@@ -191,6 +188,10 @@
<string name="accessibility_close" msgid="2277148124685870734">"Tanca"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personal"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Treball"</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="work_profile_toggle_label" msgid="3081029915775481146">"Perfil de treball"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Les aplicacions de treball tenen una insígnia i el teu administrador de TI les pot veure"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Entesos"</string>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index ffb0330..82bbd12 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Nenavrhovat aplikaci"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Připnout předpověď"</string>
<string name="bubble" msgid="3072951361014076670">"Bublat"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Připnout na panel"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"instalace zástupce"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Umožňuje aplikaci přidat zástupce bez zásahu uživatele."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"čtení nastavení a zkratek plochy"</string>
@@ -191,6 +190,10 @@
<string name="accessibility_close" msgid="2277148124685870734">"Zavřít"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Osobní"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Pracovní"</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="work_profile_toggle_label" msgid="3081029915775481146">"Pracovní profil"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Pracovní aplikace jsou označené a váš administrátor IT je vidí"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Rozumím"</string>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index e482edf..1485f75 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Foreslå ikke en app"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Fastgør forslaget"</string>
<string name="bubble" msgid="3072951361014076670">"Boble"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Fastgør til proceslinje"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"installere genveje"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Tillader, at en app tilføjer genveje uden brugerens indgriben."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"læs indstillinger og genveje for startskærm"</string>
@@ -191,6 +190,10 @@
<string name="accessibility_close" msgid="2277148124685870734">"Luk"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personlig"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Arbejde"</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="work_profile_toggle_label" msgid="3081029915775481146">"Arbejdsprofil"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Arbejdsapps har badges og kan ses af din it-administrator"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"OK"</string>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 801c3e6..4a7fb7f 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"App nicht vorschlagen"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Vorgeschlagene App fixieren"</string>
<string name="bubble" msgid="3072951361014076670">"Bubble"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"An Taskleiste pinnen"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"Verknüpfungen installieren"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Ermöglicht einer App das Hinzufügen von Verknüpfungen ohne Eingreifen des Nutzers"</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"Einstellungen und Verknüpfungen auf dem Startbildschirm lesen"</string>
@@ -191,6 +190,10 @@
<string name="accessibility_close" msgid="2277148124685870734">"Schließen"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Privat"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Geschäftlich"</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="work_profile_toggle_label" msgid="3081029915775481146">"Arbeitsprofil"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Geschäftliche Apps sind gekennzeichnet und für deinen IT-Administrator sichtbar"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"OK"</string>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 5a8eb08..de2bdc7 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Να μην προτείνεται"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Καρφίτσωμα πρόβλεψης"</string>
<string name="bubble" msgid="3072951361014076670">"Συννεφάκι"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Καρφ. σε γρ. εργαλείων"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"εγκατάσταση συντομεύσεων"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Επιτρέπει σε μια εφαρμογή την προσθήκη συντομεύσεων χωρίς την παρέμβαση του χρήστη."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"ανάγνωση ρυθμίσεων και συντομεύσεων αρχικής οθόνης"</string>
@@ -191,6 +190,10 @@
<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="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-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index 8d93e5d..7ce9c0c 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Don\'t suggest app"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Pin prediction"</string>
<string name="bubble" msgid="3072951361014076670">"Bubble"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Pin to taskbar"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"install shortcuts"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Allows an app to add shortcuts without user intervention."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"read Home settings and shortcuts"</string>
@@ -118,10 +117,8 @@
<string name="default_scroll_format" msgid="7475544710230993317">"Page %1$d of %2$d"</string>
<string name="workspace_scroll_format" msgid="8458889198184077399">"Home screen %1$d of %2$d"</string>
<string name="workspace_new_page" msgid="257366611030256142">"New home screen page"</string>
- <!-- no translation found for app_running_state_description (5645053189564740904) -->
- <skip />
- <!-- no translation found for app_minimized_state_description (710740620044902509) -->
- <skip />
+ <string name="app_running_state_description" msgid="5645053189564740904">"Active"</string>
+ <string name="app_minimized_state_description" msgid="710740620044902509">"Minimised"</string>
<string name="folder_opened" msgid="94695026776264709">"Folder opened, <xliff:g id="WIDTH">%1$d</xliff:g> by <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
<string name="folder_tap_to_close" msgid="4625795376335528256">"Tap to close folder"</string>
<string name="folder_tap_to_rename" msgid="4017685068016979677">"Tap to save rename"</string>
@@ -191,6 +188,10 @@
<string name="accessibility_close" msgid="2277148124685870734">"Close"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personal"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Work"</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="work_profile_toggle_label" msgid="3081029915775481146">"Work profile"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Work apps are badged and visible to your IT admin"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"OK"</string>
diff --git a/res/values-en-rCA/strings.xml b/res/values-en-rCA/strings.xml
index b18e0fb..71fd15a 100644
--- a/res/values-en-rCA/strings.xml
+++ b/res/values-en-rCA/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Don\'t suggest app"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Pin Prediction"</string>
<string name="bubble" msgid="3072951361014076670">"Bubble"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Pin to taskbar"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"install shortcuts"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Allows an app to add shortcuts without user intervention."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"read home settings and shortcuts"</string>
@@ -189,6 +188,10 @@
<string name="accessibility_close" msgid="2277148124685870734">"Close"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personal"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Work"</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="work_profile_toggle_label" msgid="3081029915775481146">"Work profile"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Work apps are badged and visible to your IT admin"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Got it"</string>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index 8d93e5d..7ce9c0c 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Don\'t suggest app"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Pin prediction"</string>
<string name="bubble" msgid="3072951361014076670">"Bubble"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Pin to taskbar"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"install shortcuts"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Allows an app to add shortcuts without user intervention."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"read Home settings and shortcuts"</string>
@@ -118,10 +117,8 @@
<string name="default_scroll_format" msgid="7475544710230993317">"Page %1$d of %2$d"</string>
<string name="workspace_scroll_format" msgid="8458889198184077399">"Home screen %1$d of %2$d"</string>
<string name="workspace_new_page" msgid="257366611030256142">"New home screen page"</string>
- <!-- no translation found for app_running_state_description (5645053189564740904) -->
- <skip />
- <!-- no translation found for app_minimized_state_description (710740620044902509) -->
- <skip />
+ <string name="app_running_state_description" msgid="5645053189564740904">"Active"</string>
+ <string name="app_minimized_state_description" msgid="710740620044902509">"Minimised"</string>
<string name="folder_opened" msgid="94695026776264709">"Folder opened, <xliff:g id="WIDTH">%1$d</xliff:g> by <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
<string name="folder_tap_to_close" msgid="4625795376335528256">"Tap to close folder"</string>
<string name="folder_tap_to_rename" msgid="4017685068016979677">"Tap to save rename"</string>
@@ -191,6 +188,10 @@
<string name="accessibility_close" msgid="2277148124685870734">"Close"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personal"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Work"</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="work_profile_toggle_label" msgid="3081029915775481146">"Work profile"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Work apps are badged and visible to your IT admin"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"OK"</string>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index 8d93e5d..7ce9c0c 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Don\'t suggest app"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Pin prediction"</string>
<string name="bubble" msgid="3072951361014076670">"Bubble"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Pin to taskbar"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"install shortcuts"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Allows an app to add shortcuts without user intervention."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"read Home settings and shortcuts"</string>
@@ -118,10 +117,8 @@
<string name="default_scroll_format" msgid="7475544710230993317">"Page %1$d of %2$d"</string>
<string name="workspace_scroll_format" msgid="8458889198184077399">"Home screen %1$d of %2$d"</string>
<string name="workspace_new_page" msgid="257366611030256142">"New home screen page"</string>
- <!-- no translation found for app_running_state_description (5645053189564740904) -->
- <skip />
- <!-- no translation found for app_minimized_state_description (710740620044902509) -->
- <skip />
+ <string name="app_running_state_description" msgid="5645053189564740904">"Active"</string>
+ <string name="app_minimized_state_description" msgid="710740620044902509">"Minimised"</string>
<string name="folder_opened" msgid="94695026776264709">"Folder opened, <xliff:g id="WIDTH">%1$d</xliff:g> by <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
<string name="folder_tap_to_close" msgid="4625795376335528256">"Tap to close folder"</string>
<string name="folder_tap_to_rename" msgid="4017685068016979677">"Tap to save rename"</string>
@@ -191,6 +188,10 @@
<string name="accessibility_close" msgid="2277148124685870734">"Close"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personal"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Work"</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="work_profile_toggle_label" msgid="3081029915775481146">"Work profile"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Work apps are badged and visible to your IT admin"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"OK"</string>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index e715498..ef5d483 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"No sugerir app"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Fijar predicción"</string>
<string name="bubble" msgid="3072951361014076670">"Burbuja"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Fijar a barra"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"instalar accesos directos"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Permite que una aplicación agregue accesos directos sin que el usuario intervenga."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"leer parámetros de configuración y accesos directos de la página principal"</string>
@@ -118,10 +117,8 @@
<string name="default_scroll_format" msgid="7475544710230993317">"Página %1$d de %2$d"</string>
<string name="workspace_scroll_format" msgid="8458889198184077399">"Pantalla principal %1$d de %2$d"</string>
<string name="workspace_new_page" msgid="257366611030256142">"Nueva página en la pantalla principal"</string>
- <!-- no translation found for app_running_state_description (5645053189564740904) -->
- <skip />
- <!-- no translation found for app_minimized_state_description (710740620044902509) -->
- <skip />
+ <string name="app_running_state_description" msgid="5645053189564740904">"Activo"</string>
+ <string name="app_minimized_state_description" msgid="710740620044902509">"Minimizado"</string>
<string name="folder_opened" msgid="94695026776264709">"Carpeta abierta, <xliff:g id="WIDTH">%1$d</xliff:g> por <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
<string name="folder_tap_to_close" msgid="4625795376335528256">"Presiona para cerrar la carpeta"</string>
<string name="folder_tap_to_rename" msgid="4017685068016979677">"Presiona para guardar el cambio de nombre"</string>
@@ -191,6 +188,10 @@
<string name="accessibility_close" msgid="2277148124685870734">"Cerrar"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personal"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Trabajo"</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="work_profile_toggle_label" msgid="3081029915775481146">"Perfil de trabajo"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Las apps de trabajo tienen una insignia y el administrador de TI las puede ver"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Entendido"</string>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 8ec2408..a1ed2ed 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"No sugerir aplicación"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Fijar predicción"</string>
<string name="bubble" msgid="3072951361014076670">"Burbuja"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Fijar a barra de tareas"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"instalar accesos directos"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Permite que una aplicación añada accesos directos sin intervención del usuario."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"leer ajustes y accesos directos de la pantalla de inicio"</string>
@@ -191,6 +190,10 @@
<string name="accessibility_close" msgid="2277148124685870734">"Cerrar"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personal"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Trabajo"</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="work_profile_toggle_label" msgid="3081029915775481146">"Perfil de trabajo"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Las aplicaciones de trabajo tienen una insignia, y tu administrador de TI las puede ver"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Entendido"</string>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index 4c1c1f5..5300ec8 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Ära soovita rakendust"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Kinnita ennustus"</string>
<string name="bubble" msgid="3072951361014076670">"Mull"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Kinnita tegumiribale"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"installi otseteed"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Võimaldab rakendusel lisada otseteid kasutaja sekkumiseta."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"avakuva seadete ja otseteede lugemine"</string>
@@ -191,6 +190,10 @@
<string name="accessibility_close" msgid="2277148124685870734">"Sule"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Isiklik"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Töö"</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="work_profile_toggle_label" msgid="3081029915775481146">"Tööprofiil"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Töörakendustel on märk ja need on teie IT-administraatorile nähtavad"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Selge"</string>
diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml
index b9de435..013c88e 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Ez iradoki aplikazioa"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Ainguratu iragarpena"</string>
<string name="bubble" msgid="3072951361014076670">"Burbuila"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Ainguratu zereginen barran"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"Instalatu lasterbideak"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Erabiltzaileak ezer egin gabe lasterbideak gehitzeko baimena ematen die aplikazioei."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"irakurri hasierako pantailako ezarpenak eta lasterbideak"</string>
@@ -191,6 +190,10 @@
<string name="accessibility_close" msgid="2277148124685870734">"Itxi"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Pertsonalak"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Lanekoak"</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="work_profile_toggle_label" msgid="3081029915775481146">"Laneko profila"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Laneko aplikazioek bereizgarriak dituzte, eta IKT saileko administratzaileak ikus ditzake"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Ados"</string>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index c7ee3f1..578d35d 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"برنامه پیشنهاد داده نشود"</string>
<string name="pin_prediction" msgid="4196423321649756498">"سنجاق کردن پیشنهاد"</string>
<string name="bubble" msgid="3072951361014076670">"حبابک"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"سنجاق به نوار وظیفه"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"نصب میانبرها"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"به برنامه اجازه میدهد میانبرها را بدون دخالت کاربر اضافه کند."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"خواندن تنظیمات و میانبرهای صفحه اصلی"</string>
@@ -191,6 +190,10 @@
<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="work_profile_toggle_label" msgid="3081029915775481146">"نمایه کاری"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"برنامههای کاری نشاندار هستند و سرپرست فناوری اطلاعات میتواند آنها را ببیند"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"متوجهم"</string>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 9eac837..29d04b2 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Älä ehdota sovellusta"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Kiinnitä sovellus"</string>
<string name="bubble" msgid="3072951361014076670">"Kupla"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Kiinnitä t.palkkiin"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"asenna pikakuvakkeita"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Antaa sovelluksen lisätä pikakuvakkeita itsenäisesti ilman käyttäjän valintaa."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"lukea aloitusnäytön asetuksia ja pikakuvakkeita"</string>
@@ -191,6 +190,10 @@
<string name="accessibility_close" msgid="2277148124685870734">"Sulje"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Henkilökohtaiset"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Työsovellukset"</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="work_profile_toggle_label" msgid="3081029915775481146">"Työprofiili"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Työsovellukset on merkitty sellaisiksi ja näkyvät IT-järjestelmänvalvojille"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Selvä"</string>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 5e9bed8..eb9360f 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Ne pas suggérer d\'appli"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Épingler la prédiction"</string>
<string name="bubble" msgid="3072951361014076670">"Bulle"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Éping. (barre tâche)"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"installer des raccourcis"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Permet à une appli d\'ajouter des raccourcis sans l\'intervention de l\'utilisateur."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"lire les paramètres et les raccourcis de la page d\'accueil"</string>
@@ -191,6 +190,10 @@
<string name="accessibility_close" msgid="2277148124685870734">"Fermer"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personnel"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Travail"</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="work_profile_toggle_label" msgid="3081029915775481146">"Profil professionnel"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Les applis professionnelles sont indiquées par un badge et elles sont visibles pour votre administrateur informatique"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"OK"</string>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 93945b9..fea7ff1 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Ne pas suggérer d\'appli"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Épingler la prédiction"</string>
<string name="bubble" msgid="3072951361014076670">"Bulle"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Épingler à la barre"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"installer des raccourcis"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Permettre à une application d\'ajouter des raccourcis sans l\'intervention de l\'utilisateur"</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"Lire les paramètres et les raccourcis de la page d\'accueil"</string>
@@ -191,6 +190,10 @@
<string name="accessibility_close" msgid="2277148124685870734">"Fermer"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personnel"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Professionnel"</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="work_profile_toggle_label" msgid="3081029915775481146">"Profil professionnel"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Les applis professionnelles sont identifiées par un badge et votre administrateur informatique peut les voir"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"OK"</string>
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index 88bb0e8..513083a 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Non suxerir app"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Fixar predición"</string>
<string name="bubble" msgid="3072951361014076670">"Burbulla"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Fixar na barra"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"instalar atallos"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Permite a unha aplicación engadir atallos sen intervención do usuario."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"ler a configuración e os atallos da pantalla de inicio"</string>
@@ -191,6 +190,10 @@
<string name="accessibility_close" msgid="2277148124685870734">"Pechar"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Persoal"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Traballo"</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="work_profile_toggle_label" msgid="3081029915775481146">"Perfil de traballo"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"O administrador de TI pode ver as aplicacións do traballo e engadirlles indicadores"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Entendido"</string>
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
index 69040cc..d31f291 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"ઍપ સૂચવશો નહીં"</string>
<string name="pin_prediction" msgid="4196423321649756498">"પૂર્વાનુમાનને પિન કરો"</string>
<string name="bubble" msgid="3072951361014076670">"બબલ"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"ટાસ્કબારમાં પિન કરો"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"શૉર્ટકટ ઇન્સ્ટૉલ કરો"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"એપ્લિકેશનને વપરાશકર્તા હસ્તક્ષેપ વગર શોર્ટકટ્સ ઉમેરવાની મંજૂરી આપે છે."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"હોમ સેટિંગ અને શૉર્ટકટ વાંચો"</string>
@@ -191,6 +190,10 @@
<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="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 072637c..360ef33 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"ऐप्लिकेशन का सुझाव न दें"</string>
<string name="pin_prediction" msgid="4196423321649756498">"सुझाए गए ऐप पिन करें"</string>
<string name="bubble" msgid="3072951361014076670">"बबल"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"टास्कबार में पिन करें"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"शॉर्टकट इंस्टॉल करें"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"ऐप को उपयोगकर्ता के हस्तक्षेप के बिना शॉर्टकट जोड़ने देती है."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"होम स्क्रीन की सेटिंग और शॉर्टकट पढ़ने की अनुमति"</string>
@@ -191,6 +190,10 @@
<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="work_profile_toggle_label" msgid="3081029915775481146">"वर्क प्रोफ़ाइल"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"वर्क ऐप्लिकेशन बैज किए गए हैं. आईटी एडमिन इन्हें देख सकता है"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"ठीक है"</string>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 549701c..db82c46 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Ne predlaži aplikaciju"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Prikvači predviđenu apl."</string>
<string name="bubble" msgid="3072951361014076670">"Oblačić"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Prikvači na traku"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"instaliranje prečaca"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Aplikaciji omogućuje dodavanje prečaca bez intervencije korisnika."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"čitati postavke i prečace početnog zaslona"</string>
@@ -191,6 +190,10 @@
<string name="accessibility_close" msgid="2277148124685870734">"Zatvori"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Osobno"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Posao"</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="work_profile_toggle_label" msgid="3081029915775481146">"Poslovni profil"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Poslovne su aplikacije označene i vidljive vašem IT administratoru"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Shvaćam"</string>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 1a9fa24..04e43a7 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Ne javasoljon appot"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Várható kitűzése"</string>
<string name="bubble" msgid="3072951361014076670">"Buborék"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Rögzítés a tálcán"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"parancsikonok telepítése"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Lehetővé teszi egy alkalmazás számára, hogy felhasználói beavatkozás nélkül adjon hozzá parancsikonokat."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"kezdőképernyő beállításainak és parancsikonjainak olvasása"</string>
@@ -191,6 +190,10 @@
<string name="accessibility_close" msgid="2277148124685870734">"Bezárás"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Személyes"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Munkahelyi"</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="work_profile_toggle_label" msgid="3081029915775481146">"Munkaprofil"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"A munkahelyi alkalmazások jelvénnyel vannak megjelölve, és ezeket láthatja a rendszergazda"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Értem"</string>
diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml
index 5ce5235..7d805a6 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Չառաջարկել"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Ամրացնել առաջարկվող հավելվածը"</string>
<string name="bubble" msgid="3072951361014076670">"Ամպիկ"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Ամրացնել վահանակում"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"Դյուրանցումների տեղադրում"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Հավելվածին թույլ է տալիս ավելացնել դյուրանցումներ՝ առանց օգտագործողի միջամտության:"</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"կարդալ հիմնական էկրանի կարգավորումներն ու դյուրանցումները"</string>
@@ -118,10 +117,8 @@
<string name="default_scroll_format" msgid="7475544710230993317">"Էջ %1$d՝ %2$d-ից"</string>
<string name="workspace_scroll_format" msgid="8458889198184077399">"Հիմնական էկրան %1$d` %2$d-ից"</string>
<string name="workspace_new_page" msgid="257366611030256142">"Հիմնական էկրանի նոր էջ"</string>
- <!-- no translation found for app_running_state_description (5645053189564740904) -->
- <skip />
- <!-- no translation found for app_minimized_state_description (710740620044902509) -->
- <skip />
+ <string name="app_running_state_description" msgid="5645053189564740904">"Ակտիվ է"</string>
+ <string name="app_minimized_state_description" msgid="710740620044902509">"Նվազեցվել է"</string>
<string name="folder_opened" msgid="94695026776264709">"Պանակը բաց է, <xliff:g id="WIDTH">%1$d</xliff:g>-ից <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
<string name="folder_tap_to_close" msgid="4625795376335528256">"Հպեք՝ պանակը փակելու համար"</string>
<string name="folder_tap_to_rename" msgid="4017685068016979677">"Հպեք՝ նոր անվանումը պահելու համար"</string>
@@ -191,6 +188,10 @@
<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="work_profile_toggle_label" msgid="3081029915775481146">"Աշխատանքային պրոֆիլ"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Աշխատանքային հավելվածները հատուկ նշանակ ունեն և տեսանելի են ՏՏ ադմինիստրատորին"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Եղավ"</string>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 314eee9..28a01ac 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Jangan sarankan apl"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Pin Prediksi"</string>
<string name="bubble" msgid="3072951361014076670">"Balon"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Sematkan ke taskbar"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"memasang pintasan"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Mengizinkan aplikasi menambahkan pintasan tanpa campur tangan pengguna."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"membaca setelan dan pintasan layar utama"</string>
@@ -191,6 +190,10 @@
<string name="accessibility_close" msgid="2277148124685870734">"Tutup"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Pribadi"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Kerja"</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="work_profile_toggle_label" msgid="3081029915775481146">"Profil kerja"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Aplikasi kerja diberi badge dan terlihat oleh admin IT"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Oke"</string>
diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml
index 809f0e1..a87df93 100644
--- a/res/values-is/strings.xml
+++ b/res/values-is/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Ekki fá tillögu að forriti"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Festa tillögu"</string>
<string name="bubble" msgid="3072951361014076670">"Blaðra"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Festa á forritastiku"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"setja upp flýtileiðir"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Leyfir forriti að bæta við flýtileiðum án íhlutunar notanda."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"lesa stillingar og flýtileiðir heimaskjás"</string>
@@ -118,10 +117,8 @@
<string name="default_scroll_format" msgid="7475544710230993317">"Síða %1$d af %2$d"</string>
<string name="workspace_scroll_format" msgid="8458889198184077399">"Heimaskjár %1$d af %2$d"</string>
<string name="workspace_new_page" msgid="257366611030256142">"Ný síða á heimaskjá"</string>
- <!-- no translation found for app_running_state_description (5645053189564740904) -->
- <skip />
- <!-- no translation found for app_minimized_state_description (710740620044902509) -->
- <skip />
+ <string name="app_running_state_description" msgid="5645053189564740904">"Virkt"</string>
+ <string name="app_minimized_state_description" msgid="710740620044902509">"Minnkað"</string>
<string name="folder_opened" msgid="94695026776264709">"Mappa opnuð, <xliff:g id="WIDTH">%1$d</xliff:g> sinnum <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
<string name="folder_tap_to_close" msgid="4625795376335528256">"Ýttu til að loka möppunni"</string>
<string name="folder_tap_to_rename" msgid="4017685068016979677">"Ýttu til að vista breytt heiti"</string>
@@ -191,6 +188,10 @@
<string name="accessibility_close" msgid="2277148124685870734">"Loka"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Persónulegt"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Vinna"</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="work_profile_toggle_label" msgid="3081029915775481146">"Vinnusnið"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Vinnuforrit eru merkt og kerfisstjórinn getur séð þau"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Ég skil"</string>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 95073a0..ffe7436 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Non suggerire app"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Blocca previsione"</string>
<string name="bubble" msgid="3072951361014076670">"Fumetto"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Fissa alla barra app"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"Aggiunta di scorciatoie"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Consente a un\'app di aggiungere scorciatoie automaticamente."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"leggere le impostazioni e le scorciatoie nella schermata Home"</string>
@@ -118,10 +117,8 @@
<string name="default_scroll_format" msgid="7475544710230993317">"Pagina %1$d di %2$d"</string>
<string name="workspace_scroll_format" msgid="8458889198184077399">"Schermata Home %1$d di %2$d"</string>
<string name="workspace_new_page" msgid="257366611030256142">"Nuova pagina Schermata Home"</string>
- <!-- no translation found for app_running_state_description (5645053189564740904) -->
- <skip />
- <!-- no translation found for app_minimized_state_description (710740620044902509) -->
- <skip />
+ <string name="app_running_state_description" msgid="5645053189564740904">"Attiva"</string>
+ <string name="app_minimized_state_description" msgid="710740620044902509">"Ridotta a icona"</string>
<string name="folder_opened" msgid="94695026776264709">"Cartella aperta, <xliff:g id="WIDTH">%1$d</xliff:g> per <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
<string name="folder_tap_to_close" msgid="4625795376335528256">"Tocca per chiudere la cartella"</string>
<string name="folder_tap_to_rename" msgid="4017685068016979677">"Tocca per salvare il nuovo nome"</string>
@@ -191,6 +188,10 @@
<string name="accessibility_close" msgid="2277148124685870734">"Esci"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personali"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Lavoro"</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="work_profile_toggle_label" msgid="3081029915775481146">"Profilo di lavoro"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Le app di lavoro sono contrassegnate con un badge e visibili all\'amministratore IT"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"OK"</string>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 5959de3..dd496c8 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"בלי להציע את האפליקציה"</string>
<string name="pin_prediction" msgid="4196423321649756498">"הצמדת החיזוי"</string>
<string name="bubble" msgid="3072951361014076670">"בועה"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"הצמדה לשורת המשימות"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"התקנת קיצורי דרך"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"מאפשר לאפליקציה להוסיף קיצורי דרך ללא התערבות המשתמש."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"קריאת ההגדרות וקיצורי הדרך בדף הבית"</string>
@@ -191,6 +190,10 @@
<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="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-ja/strings.xml b/res/values-ja/strings.xml
index 37b8aef..9000081 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"アプリを表示しない"</string>
<string name="pin_prediction" msgid="4196423321649756498">"アプリの候補を固定"</string>
<string name="bubble" msgid="3072951361014076670">"ふきだし"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"タスクバーに固定"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"ショートカットのインストール"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"ユーザー操作なしでショートカットを追加することをアプリに許可します。"</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"ホームの設定とショートカットの読み取り"</string>
@@ -118,10 +117,8 @@
<string name="default_scroll_format" msgid="7475544710230993317">"%1$d/%2$dページ"</string>
<string name="workspace_scroll_format" msgid="8458889198184077399">"ホーム画面: %1$d/%2$d"</string>
<string name="workspace_new_page" msgid="257366611030256142">"新しいホーム画面ページ"</string>
- <!-- no translation found for app_running_state_description (5645053189564740904) -->
- <skip />
- <!-- no translation found for app_minimized_state_description (710740620044902509) -->
- <skip />
+ <string name="app_running_state_description" msgid="5645053189564740904">"有効"</string>
+ <string name="app_minimized_state_description" msgid="710740620044902509">"最小化"</string>
<string name="folder_opened" msgid="94695026776264709">"フォルダが開いています。<xliff:g id="WIDTH">%1$d</xliff:g>x<xliff:g id="HEIGHT">%2$d</xliff:g>の大きさです"</string>
<string name="folder_tap_to_close" msgid="4625795376335528256">"タップしてフォルダを閉じます"</string>
<string name="folder_tap_to_rename" msgid="4017685068016979677">"タップして変更後の名前を保存します"</string>
@@ -191,6 +188,10 @@
<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="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">"OK"</string>
diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml
index d4a75b0..2fd6b77 100644
--- a/res/values-ka/strings.xml
+++ b/res/values-ka/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"არ შემომთავაზო აპი"</string>
<string name="pin_prediction" msgid="4196423321649756498">"ჩამაგრების პროგნოზირება"</string>
<string name="bubble" msgid="3072951361014076670">"ბუშტი"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"ამოცანათა ზოლში ჩამაგრება"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"მალსახმობების დაყენება"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"აპისთვის მალსახმობების დამოუკიდებლად დამატების უფლების მიცემა."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"მთავარი ეკრანის პარამეტრებისა და მალსახმობების წაკითხვა"</string>
@@ -118,10 +117,8 @@
<string name="default_scroll_format" msgid="7475544710230993317">"გვერდი %1$d %2$d-დან"</string>
<string name="workspace_scroll_format" msgid="8458889198184077399">"მთავარი ეკრანი %1$d, %2$d-დან"</string>
<string name="workspace_new_page" msgid="257366611030256142">"მთავარი ეკრანის ახალი გვერდი"</string>
- <!-- no translation found for app_running_state_description (5645053189564740904) -->
- <skip />
- <!-- no translation found for app_minimized_state_description (710740620044902509) -->
- <skip />
+ <string name="app_running_state_description" msgid="5645053189564740904">"აქტიური"</string>
+ <string name="app_minimized_state_description" msgid="710740620044902509">"დაპატარავებული"</string>
<string name="folder_opened" msgid="94695026776264709">"საქაღალდე გახსნილია, <xliff:g id="WIDTH">%1$d</xliff:g> x <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
<string name="folder_tap_to_close" msgid="4625795376335528256">"შეეხეთ საქაღალდის დასახურად"</string>
<string name="folder_tap_to_rename" msgid="4017685068016979677">"შეეხეთ გადარქმეული სახელის შესანახად"</string>
@@ -191,6 +188,10 @@
<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="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-kk/strings.xml b/res/values-kk/strings.xml
index 7e90499..fee3a9a 100644
--- a/res/values-kk/strings.xml
+++ b/res/values-kk/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Қолданба ұсынбау"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Болжамды бекіту"</string>
<string name="bubble" msgid="3072951361014076670">"Қалқыма терезе"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Тапсырмалар жолағына бекіту"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"таңбаша орнату"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Қолданбаға пайдаланушының қатысуынсыз төте пернелерді қосу мүмкіндігін береді."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"негізгі экран параметрлері мен таңбашаларын оқу"</string>
@@ -191,6 +190,10 @@
<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="work_profile_toggle_label" msgid="3081029915775481146">"Жұмыс профилі"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Жұмыс қолданбаларының танымбелгілері бар және олар әкімшіңізге көрінеді."</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Түсінікті"</string>
diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml
index 960e87d..cc8539e 100644
--- a/res/values-km/strings.xml
+++ b/res/values-km/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"កុំណែនាំកម្មវិធី"</string>
<string name="pin_prediction" msgid="4196423321649756498">"ខ្ទាស់ការព្យាករ"</string>
<string name="bubble" msgid="3072951361014076670">"ពពុះ"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"ខ្ទាស់ទៅរបារកិច្ចការ"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"ដំឡើងផ្លូវកាត់"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"អនុញ្ញាតឲ្យកម្មវិធីបន្ថែមផ្លូវកាត់ ដោយមិនចាំបាច់អំពើពីអ្នកប្រើ។"</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"អានការកំណត់ និងផ្លូវកាត់របស់អេក្រង់ដើម"</string>
@@ -191,6 +190,10 @@
<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="work_profile_toggle_label" msgid="3081029915775481146">"កម្រងព័ត៌មានការងារ"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"កម្មវិធីការងារត្រូវបានដាក់គ្រឿងសម្គាល់ ហើយអ្នកគ្រប់គ្រងផ្នែកព័ត៌មានវិទ្យារបស់អ្នកអាចមើលឃើញ"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"យល់ហើយ"</string>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
index 656d75c..cd5d59d 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"ಆ್ಯಪ್ ಅನ್ನು ಸೂಚಿಸಬೇಡಿ"</string>
<string name="pin_prediction" msgid="4196423321649756498">"ಮುನ್ನೋಟ ಪಿನ್ ಮಾಡಿ"</string>
<string name="bubble" msgid="3072951361014076670">"ಬಬಲ್"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"ಟಾಸ್ಕ್ಬಾರ್ಗೆ ಪಿನ್ ಮಾಡಿ"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"ಶಾರ್ಟ್ಕಟ್ಗಳನ್ನು ಸ್ಥಾಪಿಸಿ"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"ಬಳಕೆದಾರರ ಹಸ್ತಕ್ಷೇಪವಿಲ್ಲದೆ ಶಾರ್ಟ್ಕಟ್ಗಳನ್ನು ಸೇರಿಸಲು ಅಪ್ಲಿಕೇಶನ್ಗೆ ಅನುಮತಿಸುತ್ತದೆ."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"ಹೋಮ್ ಸ್ಕ್ರೀನ್ ಸೆಟ್ಟಿಂಗ್ಗಳು ಮತ್ತು ಶಾರ್ಟ್ಕಟ್ಗಳನ್ನು ಓದಿ"</string>
@@ -118,10 +117,8 @@
<string name="default_scroll_format" msgid="7475544710230993317">"%2$d ರಲ್ಲಿ %1$d ಪುಟ"</string>
<string name="workspace_scroll_format" msgid="8458889198184077399">"%2$d ರಲ್ಲಿ %1$d ಮುಖಪುಟದ ಸ್ಕ್ರೀನ್"</string>
<string name="workspace_new_page" msgid="257366611030256142">"ಹೊಸ ಮುಖಪುಟ ಸ್ಕ್ರೀನ್"</string>
- <!-- no translation found for app_running_state_description (5645053189564740904) -->
- <skip />
- <!-- no translation found for app_minimized_state_description (710740620044902509) -->
- <skip />
+ <string name="app_running_state_description" msgid="5645053189564740904">"ಸಕ್ರಿಯವಾಗಿದೆ"</string>
+ <string name="app_minimized_state_description" msgid="710740620044902509">"ಮಿನಿಮೈಸ್ ಮಾಡಲಾಗಿದೆ"</string>
<string name="folder_opened" msgid="94695026776264709">"ಫೋಲ್ಡರ್ ತೆರೆಯಲಾಗಿದೆ, <xliff:g id="WIDTH">%1$d</xliff:g> ಬೈ <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
<string name="folder_tap_to_close" msgid="4625795376335528256">"ಫೋಲ್ಡರ್ ಮುಚ್ಚಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
<string name="folder_tap_to_rename" msgid="4017685068016979677">"ಮರುಹೆಸರನ್ನು ಉಳಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
@@ -191,6 +188,10 @@
<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="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-ko/strings.xml b/res/values-ko/strings.xml
index 6b2c290..e588634 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"앱 제안 받지 않음"</string>
<string name="pin_prediction" msgid="4196423321649756498">"예상 앱 고정"</string>
<string name="bubble" msgid="3072951361014076670">"풍선"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"태스크 바에 고정"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"바로가기 설치"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"앱이 사용자의 작업 없이 바로가기를 추가할 수 있도록 합니다."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"홈 설정 및 바로가기 읽기"</string>
@@ -191,6 +190,10 @@
<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="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-ky/strings.xml b/res/values-ky/strings.xml
index 2ab996d..fb1675e 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Cунушталбасын"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Божомолдонгон колдонмону кадап коюу"</string>
<string name="bubble" msgid="3072951361014076670">"Көбүкчө"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Тапшырмалар панелине кадоо"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"тез чакырмаларды орнотуу"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Колдонмого колдонуучуга кайрылбастан тез чакырма кошууга уруксат берет."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"үйдүн параметрлерин жана ыкчам баскычтарын окуу"</string>
@@ -191,6 +190,10 @@
<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="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-lo/strings.xml b/res/values-lo/strings.xml
index 918ea09..2aaf40b 100644
--- a/res/values-lo/strings.xml
+++ b/res/values-lo/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"ຢ່າແນະນຳແອັບ"</string>
<string name="pin_prediction" msgid="4196423321649756498">"ປັກໝຸດການຄາດເດົາ"</string>
<string name="bubble" msgid="3072951361014076670">"ຟອງ"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"ປັກໝຸດໃສ່ແຖບໜ້າວຽກ"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"ຕິດຕັ້ງທາງລັດ"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"ອະນຸຍາດໃຫ້ແອັບຯ ເພີ່ມທາງລັດໂດຍບໍ່ຕ້ອງຮັບການຢືນຢັນຈາກຜູ່ໃຊ້."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"ອ່ານການຕັ້ງຄ່າໜ້າຫຼັກ ແລະ ທາງລັດ"</string>
@@ -118,10 +117,8 @@
<string name="default_scroll_format" msgid="7475544710230993317">"ໜ້າ %1$d ຈາກ %2$d"</string>
<string name="workspace_scroll_format" msgid="8458889198184077399">"ໜ້າຈໍຫຼັກ %1$d ໃນ %2$d"</string>
<string name="workspace_new_page" msgid="257366611030256142">"ໜ້າຂອງໜ້າຈໍຫຼັກໃໝ່"</string>
- <!-- no translation found for app_running_state_description (5645053189564740904) -->
- <skip />
- <!-- no translation found for app_minimized_state_description (710740620044902509) -->
- <skip />
+ <string name="app_running_state_description" msgid="5645053189564740904">"ນຳໃຊ້ຢູ່"</string>
+ <string name="app_minimized_state_description" msgid="710740620044902509">"ຫຍໍ້ລົງແລ້ວ"</string>
<string name="folder_opened" msgid="94695026776264709">"ເປີດໂຟນເດີແລ້ວ, <xliff:g id="WIDTH">%1$d</xliff:g> ຄູນ <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
<string name="folder_tap_to_close" msgid="4625795376335528256">"ແຕະເພື່ອປິດໂຟນເດີ"</string>
<string name="folder_tap_to_rename" msgid="4017685068016979677">"ແຕະເພື່ອບັນທຶກການປ່ຽນຊື່"</string>
@@ -191,6 +188,10 @@
<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="work_profile_toggle_label" msgid="3081029915775481146">"ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກ"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"ແອັບບ່ອນເຮັດວຽກແມ່ນຖືກຕິດປ້າຍ ແລະ ສະແດງໃຫ້ຜູ້ເບິ່ງແຍງໄອທີຂອງທ່ານເຫັນ"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"ເຂົ້າໃຈແລ້ວ"</string>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index c700e8a..aeba444 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Nesiūlyti programos"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Prisegti numatymą"</string>
<string name="bubble" msgid="3072951361014076670">"Debesėlis"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Pris. prie užd. j."</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"įdiegti sparčiuosius klavišus"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Programai leidžiama pridėti sparčiuosius klavišus be naudotojo įsikišimo."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"skaityti pagrindinio ekrano nustatymus ir sparčiuosius klavišus"</string>
@@ -118,10 +117,8 @@
<string name="default_scroll_format" msgid="7475544710230993317">"%1$d psl. iš %2$d"</string>
<string name="workspace_scroll_format" msgid="8458889198184077399">"%1$d pagrindinis ekranas iš %2$d"</string>
<string name="workspace_new_page" msgid="257366611030256142">"Naujas pagrindinio ekrano puslapis"</string>
- <!-- no translation found for app_running_state_description (5645053189564740904) -->
- <skip />
- <!-- no translation found for app_minimized_state_description (710740620044902509) -->
- <skip />
+ <string name="app_running_state_description" msgid="5645053189564740904">"Aktyvi"</string>
+ <string name="app_minimized_state_description" msgid="710740620044902509">"Sumažinta"</string>
<string name="folder_opened" msgid="94695026776264709">"Atidarytas aplankas, <xliff:g id="WIDTH">%1$d</xliff:g> ir <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
<string name="folder_tap_to_close" msgid="4625795376335528256">"Palieskite, kad uždarytumėte aplanką"</string>
<string name="folder_tap_to_rename" msgid="4017685068016979677">"Palieskite, kad išsaugotumėte pakeistą pavadinimą"</string>
@@ -191,6 +188,10 @@
<string name="accessibility_close" msgid="2277148124685870734">"Uždaryti"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Asmeninės"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Darbo"</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="work_profile_toggle_label" msgid="3081029915775481146">"Darbo profilis"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Darbo programos yra pažymėtos ženkleliu ir matomos IT administratoriui"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Supratau"</string>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index 2511584..0ba127d 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Neieteikt lietotni"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Piespraust prognozēto lietotni"</string>
<string name="bubble" msgid="3072951361014076670">"Burbulis"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Pie uzdevumu joslas"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"instalēt saīsnes"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Ļauj lietotnei pievienot saīsnes, nejautājot lietotājam."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"sākuma ekrāna iestatījumu un saīšņu lasīšana"</string>
@@ -191,6 +190,10 @@
<string name="accessibility_close" msgid="2277148124685870734">"Aizvērt"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personīgās lietotnes"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Darba lietotnes"</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="work_profile_toggle_label" msgid="3081029915775481146">"Darba profils"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Darba lietotnēm ir pievienota emblēma, un tās ir redzamas jūsu IT administratoram"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Labi"</string>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
index 11bb3e5..ba119f7 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Не предлагај апл."</string>
<string name="pin_prediction" msgid="4196423321649756498">"Закачи го предвидувањето"</string>
<string name="bubble" msgid="3072951361014076670">"Балонче"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Закачи на лентата"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"инсталирање кратенки"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Овозможува апликацијата да додава кратенки без интервенција на корисникот."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"да чита поставки и кратенки на почетна страница"</string>
@@ -191,6 +190,10 @@
<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="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-ml/strings.xml b/res/values-ml/strings.xml
index a8d32d9..2a2e050 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"ആപ്പ് നിർദ്ദേശിക്കേണ്ട"</string>
<string name="pin_prediction" msgid="4196423321649756498">"പ്രവചനം പിൻ ചെയ്യുക"</string>
<string name="bubble" msgid="3072951361014076670">"ബബിൾ"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"ടാസ്ക്ബാറിൽ പിൻ ചെയ്യൂ"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"കുറുക്കുവഴികൾ ഇൻസ്റ്റാളുചെയ്യുക"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"ഉപയോക്തൃ ഇടപെടൽ ഇല്ലാതെ കുറുക്കുവഴികൾ ചേർക്കാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"ഹോം ക്രമീകരണവും കുറുക്കുവഴികളും വായിക്കുക"</string>
@@ -191,6 +190,10 @@
<string name="accessibility_close" msgid="2277148124685870734">"അടയ്ക്കൂ"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"വ്യക്തിപരം"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Work"</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="work_profile_toggle_label" msgid="3081029915775481146">"ഔദ്യോഗിക പ്രൊഫൈൽ"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"ഔദ്യോഗിക ആപ്പുകൾക്ക് ബാഡ്ജ് നൽകിയിരിക്കുന്നു, അവ നിങ്ങളുടെ ഐടി അഡ്മിന് കാണാനുമാകും"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"മനസ്സിലായി"</string>
diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml
index 8c3c360..ffe1b2c 100644
--- a/res/values-mn/strings.xml
+++ b/res/values-mn/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Апп бүү санал болго"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Таамаглалыг бэхлэх"</string>
<string name="bubble" msgid="3072951361014076670">"Бөмбөлөг"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Ажлын хэсэгт бэхлэх"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"товчлол суулгах"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Апп нь хэрэглэгчийн оролцоогүйгээр товчлолыг нэмэж чадна"</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"нүүрний тохиргоо болон товчлолыг унших"</string>
@@ -191,6 +190,10 @@
<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="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-mr/strings.xml b/res/values-mr/strings.xml
index 1f3a454..b249150 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"ॲप सुचवू नका"</string>
<string name="pin_prediction" msgid="4196423321649756498">"पूर्वानुमान पिन करा"</string>
<string name="bubble" msgid="3072951361014076670">"बबल"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"टास्कबारवर पिन करा"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"शॉर्टकट इंस्टॉल करा"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"वापरकर्ता हस्तक्षेपाशिवाय शॉर्टकट जोडण्यास अॅप ला अनुमती देते."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"होम सेटिंग्ज आणि शॉर्टकट वाचा"</string>
@@ -191,6 +190,10 @@
<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="work_profile_toggle_label" msgid="3081029915775481146">"कार्य प्रोफाइल"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"कार्य ॲप्स ही बॅज केलेली असून तुमच्या आयटी ॲडमिनला दृश्यमान आहेत"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"समजले"</string>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index d7e53f7..3585ec7 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Jangan cadangkan apl"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Sematkan Ramalan"</string>
<string name="bubble" msgid="3072951361014076670">"Gelembung"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Semat pada bar tugas"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"pasang pintasan"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Membenarkan apl menambah pintasan tanpa campur tangan pengguna."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"membaca tetapan dan pintasan skrin utama"</string>
@@ -118,10 +117,8 @@
<string name="default_scroll_format" msgid="7475544710230993317">"Halaman %1$d daripada %2$d"</string>
<string name="workspace_scroll_format" msgid="8458889198184077399">"Skrin Laman Utama %1$d daripada %2$d"</string>
<string name="workspace_new_page" msgid="257366611030256142">"Halaman skrin utama baharu"</string>
- <!-- no translation found for app_running_state_description (5645053189564740904) -->
- <skip />
- <!-- no translation found for app_minimized_state_description (710740620044902509) -->
- <skip />
+ <string name="app_running_state_description" msgid="5645053189564740904">"Aktif"</string>
+ <string name="app_minimized_state_description" msgid="710740620044902509">"Minimumkan"</string>
<string name="folder_opened" msgid="94695026776264709">"Folder dibuka, <xliff:g id="WIDTH">%1$d</xliff:g> kali <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
<string name="folder_tap_to_close" msgid="4625795376335528256">"Ketik untuk menutup folder"</string>
<string name="folder_tap_to_rename" msgid="4017685068016979677">"Ketik untuk menyimpan penamaan semula"</string>
@@ -191,6 +188,10 @@
<string name="accessibility_close" msgid="2277148124685870734">"Tutup"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Peribadi"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Kerja"</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="work_profile_toggle_label" msgid="3081029915775481146">"Profil kerja"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Apl kerja mempunyai lencana dan kelihatan kepada pentadbir IT anda"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"OK"</string>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index 5aba732..0116834 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"အက်ပ်အကြံမပြုပါနှင့်"</string>
<string name="pin_prediction" msgid="4196423321649756498">"ခန့်မှန်းချက်ကို ပင်ထိုးရန်"</string>
<string name="bubble" msgid="3072951361014076670">"ပူဖောင်းကွက်"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Taskbar ၌ပင်ထိုးရန်"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"ဖြတ်လမ်းလင့်ခ်များ ထည့်သွင်းခြင်း"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"အသုံးပြုသူ လုပ်ဆောင်မှုမရှိပဲ အပ်ပလီကေးရှင်းကို အတိုကောက်မှတ်သားမှုများ ပြုလုပ်ခွင့် ပေးခြင်း"</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"ပင်မဆက်တင်နှင့် ဖြတ်လမ်းလင့်ခ်များ ဖတ်ခြင်း"</string>
@@ -191,6 +190,10 @@
<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="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-nb/strings.xml b/res/values-nb/strings.xml
index efb3d1b..47c6abb 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Ikke foreslå app"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Fest forslaget"</string>
<string name="bubble" msgid="3072951361014076670">"Boble"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Fest til oppgavelinjen"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"installere snarveier"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Gir apper tillatelse til å legge til snarveier uten innblanding fra brukeren."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"lese startsideinnstillinger og -snarveier"</string>
@@ -191,6 +190,10 @@
<string name="accessibility_close" msgid="2277148124685870734">"Lukk"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personlig"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Jobb"</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="work_profile_toggle_label" msgid="3081029915775481146">"Jobbprofil"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Jobbapper er merket og synlige for IT-administratoren"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Greit"</string>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
index 85874e0..e451926 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -97,11 +97,10 @@
<string name="app_info_drop_target_label" msgid="692894985365717661">"एपसम्बन्धी जानकारी"</string>
<string name="install_private_system_shortcut_label" msgid="1616889277073184841">"निजी प्रोफाइलमा इन्स्टल गर्नुहोस्"</string>
<string name="uninstall_private_system_shortcut_label" msgid="8423460530441627982">"एप अनइन्स्टल गर्नुहोस्"</string>
- <string name="install_drop_target_label" msgid="2539096853673231757">"स्थापना गर्नुहोस्"</string>
+ <string name="install_drop_target_label" msgid="2539096853673231757">"इन्स्टल गर्नुहोस्"</string>
<string name="dismiss_prediction_label" msgid="3357562989568808658">"एप सिफारिस नगर्नुहोस्"</string>
<string name="pin_prediction" msgid="4196423321649756498">"सिफारिस गरिएको एप पिन गर्नुहोस्"</string>
<string name="bubble" msgid="3072951361014076670">"बबल"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"टास्कबारमा पिन गर्नुहोस्"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"सर्टकट स्थापना गर्नेहोस्"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"प्रयोगकर्ताको हस्तक्षेप बिना एउटा एपलाई सर्टकटमा थप्नको लागि अनुमति दिनुहोस्।"</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"होम स्क्रिनका सेटिङ र सर्टकटहरू रिड गर्नुहोस्"</string>
@@ -191,6 +190,10 @@
<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="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 3c3149a..75793b0 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Geen app voorstellen"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Voorspelling vastzetten"</string>
<string name="bubble" msgid="3072951361014076670">"Bubbel"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Vastzetten op taakbalk"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"Snelle links instellen"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Een app toestaan snelkoppelingen toe te voegen zonder tussenkomst van de gebruiker."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"instellingen en snelkoppelingen op startscherm lezen"</string>
@@ -118,10 +117,8 @@
<string name="default_scroll_format" msgid="7475544710230993317">"Pagina %1$d van %2$d"</string>
<string name="workspace_scroll_format" msgid="8458889198184077399">"Startscherm %1$d van %2$d"</string>
<string name="workspace_new_page" msgid="257366611030256142">"Nieuwe startschermpagina"</string>
- <!-- no translation found for app_running_state_description (5645053189564740904) -->
- <skip />
- <!-- no translation found for app_minimized_state_description (710740620044902509) -->
- <skip />
+ <string name="app_running_state_description" msgid="5645053189564740904">"Actief"</string>
+ <string name="app_minimized_state_description" msgid="710740620044902509">"Geminimaliseerd"</string>
<string name="folder_opened" msgid="94695026776264709">"Map geopend, <xliff:g id="WIDTH">%1$d</xliff:g> bij <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
<string name="folder_tap_to_close" msgid="4625795376335528256">"Tik om de map te sluiten"</string>
<string name="folder_tap_to_rename" msgid="4017685068016979677">"Tik om de gewijzigde naam op te slaan"</string>
@@ -191,6 +188,10 @@
<string name="accessibility_close" msgid="2277148124685870734">"Sluiten"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Privé"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Werk"</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="work_profile_toggle_label" msgid="3081029915775481146">"Werkprofiel"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Werk-apps hebben badges en zijn zichtbaar voor je IT-beheerder"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"OK"</string>
diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml
index baad44c..98ccaf1 100644
--- a/res/values-or/strings.xml
+++ b/res/values-or/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"ଆପ ପରାମର୍ଶ ଦିଅନ୍ତୁ ନାହିଁ"</string>
<string name="pin_prediction" msgid="4196423321649756498">"ପୂର୍ବାନୁମାନକୁ ପିନ୍ କରନ୍ତୁ"</string>
<string name="bubble" msgid="3072951361014076670">"ବବଲ"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"ଟାସ୍କବାରରେ ପିନ କର"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"ସର୍ଟକଟ୍ ଇନଷ୍ଟଲ୍ କରନ୍ତୁ"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"ୟୁଜରଙ୍କ ବିନା ହସ୍ତକ୍ଷେପରେ ଶର୍ଟକଟ୍ ଯୋଡ଼ିବାକୁ ଆପକୁ ଅନୁମତି ଦିଏ।"</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"ହୋମ ସେଟିଂସ ଏବଂ ସର୍ଟକଟଗୁଡ଼ିକୁ ପଢ଼ନ୍ତୁ"</string>
@@ -191,6 +190,10 @@
<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="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-pa/strings.xml b/res/values-pa/strings.xml
index ec0d1fd..3904473 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"ਐਪ ਦਾ ਸੁਝਾਅ ਨਾ ਦਿਓ"</string>
<string name="pin_prediction" msgid="4196423321649756498">"ਪੂਰਵ-ਅਨੁਮਾਨ ਪਿੰਨ ਕਰੋ"</string>
<string name="bubble" msgid="3072951361014076670">"ਬਬਲ"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"ਟਾਸਕਬਾਰ \'ਤੇ ਪਿੰਨ ਕਰੋ"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"ਸ਼ਾਰਟਕੱਟ ਸਥਾਪਤ ਕਰੋ"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"ਇੱਕ ਐਪ ਨੂੰ ਵਰਤੋਂਕਾਰ ਦੇ ਦਖ਼ਲ ਤੋਂ ਬਿਨਾਂ ਸ਼ਾਰਟਕੱਟ ਸ਼ਾਮਲ ਕਰਨ ਦੀ ਆਗਿਆ ਦਿੰਦਾ ਹੈ।"</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"ਹੋਮ ਸੈਟਿੰਗਾਂ ਅਤੇ ਸ਼ਾਰਟਕੱਟ ਪੜ੍ਹੋ"</string>
@@ -191,6 +190,10 @@
<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="work_profile_toggle_label" msgid="3081029915775481146">"ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"ਕੰਮ ਸੰਬੰਧੀ ਐਪਾਂ ਨੂੰ ਬੈਜ ਕੀਤਾ ਗਿਆ ਹੈ ਅਤੇ ਇਹ ਤੁਹਾਡੇ ਆਈ.ਟੀ. ਪ੍ਰਸ਼ਾਸਕ ਨੂੰ ਦਿਸਣਗੀਆਂ"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"ਸਮਝ ਲਿਆ"</string>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 0b875d7..f7f71f4 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Nie proponuj aplikacji"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Przypnij podpowiedź"</string>
<string name="bubble" msgid="3072951361014076670">"Dymek"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Przypnij na pasku zadań"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"Instalowanie skrótów"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Pozwala aplikacji dodawać skróty bez interwencji użytkownika."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"Odczytuje ustawienia i skróty na ekranie głównym"</string>
@@ -191,6 +190,10 @@
<string name="accessibility_close" msgid="2277148124685870734">"Zamknij"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Osobiste"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Służbowe"</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="work_profile_toggle_label" msgid="3081029915775481146">"Profil służbowy"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Aplikacje służbowe mają plakietki i są widoczne dla administratora IT"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"OK"</string>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 362fbff..24235d1 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Não sugerir app"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Fixar previsão"</string>
<string name="bubble" msgid="3072951361014076670">"Balão"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Afixar na barra tar."</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"instalar atalhos"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Permite a uma app adicionar atalhos sem a intervenção do utilizador."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"ler definições e atalhos do ecrã Principal"</string>
@@ -118,10 +117,8 @@
<string name="default_scroll_format" msgid="7475544710230993317">"Página %1$d de %2$d"</string>
<string name="workspace_scroll_format" msgid="8458889198184077399">"Ecrã principal %1$d de %2$d"</string>
<string name="workspace_new_page" msgid="257366611030256142">"Nova página do ecrã principal"</string>
- <!-- no translation found for app_running_state_description (5645053189564740904) -->
- <skip />
- <!-- no translation found for app_minimized_state_description (710740620044902509) -->
- <skip />
+ <string name="app_running_state_description" msgid="5645053189564740904">"Ativa"</string>
+ <string name="app_minimized_state_description" msgid="710740620044902509">"Minimizada"</string>
<string name="folder_opened" msgid="94695026776264709">"Pasta aberta, <xliff:g id="WIDTH">%1$d</xliff:g> por <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
<string name="folder_tap_to_close" msgid="4625795376335528256">"Tocar para fechar a pasta"</string>
<string name="folder_tap_to_rename" msgid="4017685068016979677">"Tocar para guardar o nome novo"</string>
@@ -191,6 +188,10 @@
<string name="accessibility_close" msgid="2277148124685870734">"Fechar"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Pessoal"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Trabalho"</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="work_profile_toggle_label" msgid="3081029915775481146">"Perfil de trabalho"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"As apps de trabalho têm um emblema e estão visíveis para o seu administrador de TI"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"OK"</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 877667f..d0e1178 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Não sugerir esse app"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Fixar previsão"</string>
<string name="bubble" msgid="3072951361014076670">"Balão"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Fixar na barra de tarefas"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"instalar atalhos"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Permite que um app adicione atalhos sem intervenção do usuário."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"ler configurações e atalhos da tela inicial"</string>
@@ -191,6 +190,10 @@
<string name="accessibility_close" msgid="2277148124685870734">"Fechar"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Pessoais"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Trabalho"</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="work_profile_toggle_label" msgid="3081029915775481146">"Perfil de trabalho"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Os apps de trabalho são identificados e ficam visíveis para o adm. de TI"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Ok"</string>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 6006c07..9022d6f 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Nu sugera aplicația"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Fixează predicția"</string>
<string name="bubble" msgid="3072951361014076670">"Balon"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Fixează pe bara de activități"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"instalează comenzi rapide"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Permite unei aplicații să adauge comenzi rapide fără intervenția utilizatorului."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"citește setările și comenzile rapide de pe ecranul de pornire"</string>
@@ -191,6 +190,10 @@
<string name="accessibility_close" msgid="2277148124685870734">"Închide"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personale"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Profesionale"</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="work_profile_toggle_label" msgid="3081029915775481146">"Profil de serviciu"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Aplicațiile pentru lucru sunt marcate și vizibile pentru administratorul IT"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"OK"</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 2ed7a1c..a0230e2 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Не рекомендовать"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Закрепить рекомендацию"</string>
<string name="bubble" msgid="3072951361014076670">"Подсказка"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Закрепить на панели"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"Создание ярлыков"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Приложение сможет самостоятельно добавлять ярлыки."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"Доступ к данным о настройках и ярлыках на главном экране"</string>
@@ -118,10 +117,8 @@
<string name="default_scroll_format" msgid="7475544710230993317">"Стр. %1$d из %2$d"</string>
<string name="workspace_scroll_format" msgid="8458889198184077399">"Главный экран %1$d из %2$d"</string>
<string name="workspace_new_page" msgid="257366611030256142">"Новый экран"</string>
- <!-- no translation found for app_running_state_description (5645053189564740904) -->
- <skip />
- <!-- no translation found for app_minimized_state_description (710740620044902509) -->
- <skip />
+ <string name="app_running_state_description" msgid="5645053189564740904">"Активно"</string>
+ <string name="app_minimized_state_description" msgid="710740620044902509">"Свернуто"</string>
<string name="folder_opened" msgid="94695026776264709">"Папка открыта, <xliff:g id="WIDTH">%1$d</xliff:g> x <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
<string name="folder_tap_to_close" msgid="4625795376335528256">"Нажмите, чтобы закрыть папку"</string>
<string name="folder_tap_to_rename" msgid="4017685068016979677">"Нажмите, чтобы подтвердить переименование"</string>
@@ -191,6 +188,10 @@
<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="work_profile_toggle_label" msgid="3081029915775481146">"Рабочий профиль"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"У рабочих приложений есть специальный значок. Они видны системному администратору."</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"ОК"</string>
diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml
index 37e8837..7e64c0d 100644
--- a/res/values-si/strings.xml
+++ b/res/values-si/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"යෙදුම යෝජනා නොකරන්න"</string>
<string name="pin_prediction" msgid="4196423321649756498">"පුරෝකථනය අමුණන්න"</string>
<string name="bubble" msgid="3072951361014076670">"බුබුළ"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"කාර්ය තීරුවට අමුණන්න"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"කෙටිමං ස්ථාපනය කරන්න"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"පරිශීලක මැදිහත්වීමෙන් තොරව කෙටිමං එක් කිරීමට යෙදුමකට අවසර දෙයි."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"මුල් පිටු සැකසීම් සහ කෙටි මං කියවන්න"</string>
@@ -191,6 +190,10 @@
<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="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-sk/strings.xml b/res/values-sk/strings.xml
index 8beb718..ba174ad 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Nenavrhovať aplikáciu"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Pripnúť predpoveď"</string>
<string name="bubble" msgid="3072951361014076670">"Bublina"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Pripnúť na panel"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"inštalácia odkazov"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Povoľuje aplikácii pridať odkazy bez zásahu používateľa."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"čítanie nastavení a odkazov plochy"</string>
@@ -118,10 +117,8 @@
<string name="default_scroll_format" msgid="7475544710230993317">"Stránka %1$d z %2$d"</string>
<string name="workspace_scroll_format" msgid="8458889198184077399">"Plocha %1$d z %2$d"</string>
<string name="workspace_new_page" msgid="257366611030256142">"Nová stránka plochy"</string>
- <!-- no translation found for app_running_state_description (5645053189564740904) -->
- <skip />
- <!-- no translation found for app_minimized_state_description (710740620044902509) -->
- <skip />
+ <string name="app_running_state_description" msgid="5645053189564740904">"Aktívne"</string>
+ <string name="app_minimized_state_description" msgid="710740620044902509">"Minimalizované"</string>
<string name="folder_opened" msgid="94695026776264709">"Otvorený priečinok, <xliff:g id="WIDTH">%1$d</xliff:g> x <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
<string name="folder_tap_to_close" msgid="4625795376335528256">"Priečinok zavriete klepnutím"</string>
<string name="folder_tap_to_rename" msgid="4017685068016979677">"Nový názov uložíte klepnutím"</string>
@@ -191,6 +188,10 @@
<string name="accessibility_close" msgid="2277148124685870734">"Zavrieť"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Osobné"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Pracovné"</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="work_profile_toggle_label" msgid="3081029915775481146">"Pracovný profil"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Pracovné aplikácie majú odznak a zobrazujú sa správcovi IT"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Dobre"</string>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 4328bac..9fabdcf 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Ne predlagaj"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Predvidevanje pripenjanja"</string>
<string name="bubble" msgid="3072951361014076670">"Mehurček"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Pripni v opravilno vrstico"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"namestitev bližnjic"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Aplikaciji dovoli dodajanje bližnjic brez posredovanja uporabnika."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"branje nastavitev in bližnjic na začetnem zaslonu"</string>
@@ -118,10 +117,8 @@
<string name="default_scroll_format" msgid="7475544710230993317">"Stran %1$d od %2$d"</string>
<string name="workspace_scroll_format" msgid="8458889198184077399">"Začetni zaslon %1$d od %2$d"</string>
<string name="workspace_new_page" msgid="257366611030256142">"Nova stran na začetnem zaslonu"</string>
- <!-- no translation found for app_running_state_description (5645053189564740904) -->
- <skip />
- <!-- no translation found for app_minimized_state_description (710740620044902509) -->
- <skip />
+ <string name="app_running_state_description" msgid="5645053189564740904">"Aktivno"</string>
+ <string name="app_minimized_state_description" msgid="710740620044902509">"Minimirano"</string>
<string name="folder_opened" msgid="94695026776264709">"Mapa je odprta, <xliff:g id="WIDTH">%1$d</xliff:g> krat <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
<string name="folder_tap_to_close" msgid="4625795376335528256">"Dotaknite se, da zaprete mapo"</string>
<string name="folder_tap_to_rename" msgid="4017685068016979677">"Dotaknite se, da shranite preimenovanje"</string>
@@ -191,6 +188,10 @@
<string name="accessibility_close" msgid="2277148124685870734">"Zapri"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Osebno"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Delo"</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="work_profile_toggle_label" msgid="3081029915775481146">"Delovni profil"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Delovne aplikacije so označene z značko in vidne skrbniku za IT."</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Razumem"</string>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index 8a78d08..ac47b0a 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Mos sugjero aplikacion"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Gozhdo parashikimin"</string>
<string name="bubble" msgid="3072951361014076670">"Flluskë"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Gozhdoje te shiriti i detyrave"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"instalimi i shkurtoreve"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Lejon një aplikacion të shtojë shkurtore pa ndërhyrjen e përdoruesit."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"lexo cilësimet dhe shkurtoret e ekranit bazë"</string>
@@ -191,6 +190,10 @@
<string name="accessibility_close" msgid="2277148124685870734">"Mbyll"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personale"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Punë"</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="work_profile_toggle_label" msgid="3081029915775481146">"Profili i punës"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Aplikacionet e punës janë të shënuara dhe të dukshme për administratorin e teknologjisë së informacionit"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"E kuptova"</string>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 09ae7db..fea7de5 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Не предлажи апликацију"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Закачи предвиђање"</string>
<string name="bubble" msgid="3072951361014076670">"Облачић"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Закачи за траку зад."</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"инсталирање пречица"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Дозвољава апликацији да додаје пречице без интервенције корисника."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"читање подешавања и пречица на почетном екрану"</string>
@@ -118,10 +117,8 @@
<string name="default_scroll_format" msgid="7475544710230993317">"%1$d. страница од %2$d"</string>
<string name="workspace_scroll_format" msgid="8458889198184077399">"%1$d. почетни екран од %2$d"</string>
<string name="workspace_new_page" msgid="257366611030256142">"Нова страница почетног екрана"</string>
- <!-- no translation found for app_running_state_description (5645053189564740904) -->
- <skip />
- <!-- no translation found for app_minimized_state_description (710740620044902509) -->
- <skip />
+ <string name="app_running_state_description" msgid="5645053189564740904">"Активно"</string>
+ <string name="app_minimized_state_description" msgid="710740620044902509">"Смањено"</string>
<string name="folder_opened" msgid="94695026776264709">"Фолдер је отворен, <xliff:g id="WIDTH">%1$d</xliff:g> пута <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
<string name="folder_tap_to_close" msgid="4625795376335528256">"Додирните да бисте затворили фолдер"</string>
<string name="folder_tap_to_rename" msgid="4017685068016979677">"Додирните да бисте сачували преименовање"</string>
@@ -191,6 +188,10 @@
<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="work_profile_toggle_label" msgid="3081029915775481146">"Пословни профил"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Пословне апликације су означене значком и ИТ администратор може да их види"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Важи"</string>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index b93df16..7c676e9 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Föreslå inte app"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Fäst förslag"</string>
<string name="bubble" msgid="3072951361014076670">"Bubbla"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Fäst i aktivitetsfält"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"installera genvägar"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Tillåter att en app lägger till genvägar utan åtgärd från användaren."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"läsa inställningar och genvägar på startskärmen"</string>
@@ -191,6 +190,10 @@
<string name="accessibility_close" msgid="2277148124685870734">"Stäng"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Privat"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Arbete"</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="work_profile_toggle_label" msgid="3081029915775481146">"Jobbprofil"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Jobbappar är märkta och synliga för IT-administratören"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"OK"</string>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 5ea0aa4..06ba981 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Isipendekeze programu"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Bandika Utabiri"</string>
<string name="bubble" msgid="3072951361014076670">"Kiputo"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Bandika kwa upauzana"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"kuweka njia za mkato"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Huruhusu programu kuongeza njia za mkato bila mtumiaji kuingilia kati."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"kusoma mipangilio ya skrini ya kwanza na njia za mkato"</string>
@@ -191,6 +190,10 @@
<string name="accessibility_close" msgid="2277148124685870734">"Funga"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Binafsi"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Kazini"</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="work_profile_toggle_label" msgid="3081029915775481146">"Wasifu wa kazini"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Programu za kazini zina beji na msimamizi wako wa TEHAMA anaziona"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Nimeelewa"</string>
diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml
index dd0d76b..4bb86da 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"பரிந்துரைக்காதே"</string>
<string name="pin_prediction" msgid="4196423321649756498">"கணிக்கப்பட்டதைப் பின் செய்"</string>
<string name="bubble" msgid="3072951361014076670">"குமிழ்"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"செயல்பட்டியில் பின் செய்"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"குறுக்குவழிகளை நிறுவுதல்"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"பயனரின் அனுமதி இல்லாமல் குறுக்குவழிகளைச் சேர்க்கப் ஆப்ஸை அனுமதிக்கிறது."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"முகப்புத் திரையின் அமைப்புகளையும் ஷார்ட்கட்களையும் படித்தல்"</string>
@@ -191,6 +190,10 @@
<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="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-te/strings.xml b/res/values-te/strings.xml
index f960e7a..cd4f456 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"యాప్ సూచించకు"</string>
<string name="pin_prediction" msgid="4196423321649756498">"సూచనను పిన్ చేయండి"</string>
<string name="bubble" msgid="3072951361014076670">"బబుల్"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"టాస్క్బార్కు పిన్"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"షార్ట్కట్లను ఇన్స్టాల్ చేయడం"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"వినియోగదారు ప్రమేయం లేకుండా షార్ట్కట్లను జోడించడానికి యాప్ను అనుమతిస్తుంది."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"హోమ్ సెట్టింగ్లు, షార్ట్కట్లను చదవండి"</string>
@@ -118,10 +117,8 @@
<string name="default_scroll_format" msgid="7475544710230993317">"%2$dలో %1$dవ పేజీ"</string>
<string name="workspace_scroll_format" msgid="8458889198184077399">"%2$dలో %1$dవ హోమ్ స్క్రీన్"</string>
<string name="workspace_new_page" msgid="257366611030256142">"కొత్త హోమ్ స్క్రీన్ పేజీ"</string>
- <!-- no translation found for app_running_state_description (5645053189564740904) -->
- <skip />
- <!-- no translation found for app_minimized_state_description (710740620044902509) -->
- <skip />
+ <string name="app_running_state_description" msgid="5645053189564740904">"యాక్టివ్"</string>
+ <string name="app_minimized_state_description" msgid="710740620044902509">"కుదించబడింది"</string>
<string name="folder_opened" msgid="94695026776264709">"ఫోల్డర్ తెరవబడింది, <xliff:g id="WIDTH">%1$d</xliff:g> X <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
<string name="folder_tap_to_close" msgid="4625795376335528256">"ఫోల్డర్ను మూసివేయడానికి నొక్కండి"</string>
<string name="folder_tap_to_rename" msgid="4017685068016979677">"పేరు మార్పును సేవ్ చేయడానికి నొక్కండి"</string>
@@ -191,6 +188,10 @@
<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="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-th/strings.xml b/res/values-th/strings.xml
index 814a941..1aa4a97 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"ไม่ต้องแนะนำแอป"</string>
<string name="pin_prediction" msgid="4196423321649756498">"ปักหมุดแอปที่คาดการณ์ไว้"</string>
<string name="bubble" msgid="3072951361014076670">"บับเบิล"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"ปักหมุดไปยังแถบงาน"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"ติดตั้งทางลัด"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"อนุญาตให้แอปเพิ่มทางลัดโดยไม่ต้องให้ผู้ใช้จัดการ"</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"อ่านการตั้งค่าและทางลัดในหน้าแรก"</string>
@@ -118,10 +117,8 @@
<string name="default_scroll_format" msgid="7475544710230993317">"หน้า %1$d จาก %2$d"</string>
<string name="workspace_scroll_format" msgid="8458889198184077399">"หน้าจอหลัก %1$d จาก %2$d"</string>
<string name="workspace_new_page" msgid="257366611030256142">"หน้าใหม่ในหน้าจอหลัก"</string>
- <!-- no translation found for app_running_state_description (5645053189564740904) -->
- <skip />
- <!-- no translation found for app_minimized_state_description (710740620044902509) -->
- <skip />
+ <string name="app_running_state_description" msgid="5645053189564740904">"ใช้งานอยู่"</string>
+ <string name="app_minimized_state_description" msgid="710740620044902509">"ลดขนาดเล็กสุด"</string>
<string name="folder_opened" msgid="94695026776264709">"เปิดโฟลเดอร์ <xliff:g id="WIDTH">%1$d</xliff:g> x <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
<string name="folder_tap_to_close" msgid="4625795376335528256">"แตะเพื่อปิดโฟลเดอร์"</string>
<string name="folder_tap_to_rename" msgid="4017685068016979677">"แตะเพื่อบันทึกการเปลี่ยนชื่อ"</string>
@@ -191,6 +188,10 @@
<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="work_profile_toggle_label" msgid="3081029915775481146">"โปรไฟล์งาน"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"แอปงานจะติดป้ายไว้และผู้ดูแลระบบไอทีจะมองเห็น"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"รับทราบ"</string>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 03ec82f..b8a0df4 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Huwag magmungkahi"</string>
<string name="pin_prediction" msgid="4196423321649756498">"I-pin ang Hula"</string>
<string name="bubble" msgid="3072951361014076670">"Bubble"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"I-pin sa taskbar"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"i-install ang mga shortcut"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Pinapayagan ang isang app na magdagdag ng mga shortcut nang walang panghihimasok ng user."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"basahin ang mga setting at shortcut ng home"</string>
@@ -191,6 +190,10 @@
<string name="accessibility_close" msgid="2277148124685870734">"Isara"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personal"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Trabaho"</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="work_profile_toggle_label" msgid="3081029915775481146">"Profile sa trabaho"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"May badge at nakikita ng iyong IT admin ang mga app para sa trabaho"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"OK"</string>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index d080416..5bd7c52 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Uygulamayı önerme"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Tahmini Sabitle"</string>
<string name="bubble" msgid="3072951361014076670">"Balon"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Çubuğa sabitle"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"kısayolları yükle"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Uygulamaya, kullanıcı müdahalesi olmadan kısayol ekleme izni verir."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"ana ekran ayarlarını ve kısayollarını oku"</string>
@@ -191,6 +190,10 @@
<string name="accessibility_close" msgid="2277148124685870734">"Kapat"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Kişisel"</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="work_profile_toggle_label" msgid="3081029915775481146">"İş profili"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"İş uygulamaları rozetle işaretlenmiş olup BT yöneticisi tarafından görülebilir"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Anladım"</string>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 84c1689..798c567 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Не пропонувати додаток"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Закріпити передбачений додаток"</string>
<string name="bubble" msgid="3072951361014076670">"Повідомлення"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"На панель завдань"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"створення ярликів"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Дозволяє програмі самостійно додавати ярлики."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"читати налаштування та ярлики головного екрана"</string>
@@ -191,6 +190,10 @@
<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="work_profile_toggle_label" msgid="3081029915775481146">"Робочий профіль"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Робочі додатки мають спеціальну позначку. Їх бачить системний адміністратор."</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"OK"</string>
diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml
index 904ec5d..ec5129d 100644
--- a/res/values-ur/strings.xml
+++ b/res/values-ur/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"ایپ تجویز نہ کریں"</string>
<string name="pin_prediction" msgid="4196423321649756498">"پیشگوئی پن کریں"</string>
<string name="bubble" msgid="3072951361014076670">"بلبلہ"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"ٹاسک بار میں پن کریں"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"شارٹ کٹس انسٹال کریں"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"کسی ایپ کو صارف کی مداخلت کے بغیر شارٹ کٹس شامل کرنے کی اجازت دیتا ہے۔"</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"ہوم ترتیبات اور شارٹ کٹس کو پڑھیں"</string>
@@ -191,6 +190,10 @@
<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="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-uz/strings.xml b/res/values-uz/strings.xml
index 346a7ae..48068d6 100644
--- a/res/values-uz/strings.xml
+++ b/res/values-uz/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Tavsiya qilinmasin"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Tavsiyani mahkamlash"</string>
<string name="bubble" msgid="3072951361014076670">"Pufaklar"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Panelga qadash"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"yorliqlar yaratish"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Ilovalarga foydalanuvchidan so‘ramasdan yorliqlar qo‘shishga ruxsat beradi."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"Bosh ekrandagi sozlamalar va yorliqlarni koʻrish"</string>
@@ -191,6 +190,10 @@
<string name="accessibility_close" msgid="2277148124685870734">"Yopish"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Shaxsiy"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Ish"</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="work_profile_toggle_label" msgid="3081029915775481146">"Ish profili"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Ishga oid ilovalarning maxsus belgisi bor hamda ular administratoringizga koʻrinadi"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"OK"</string>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 4303b91..5b88099 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Không gợi ý ứng dụng"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Ghim ứng dụng dự đoán"</string>
<string name="bubble" msgid="3072951361014076670">"Bong bóng"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Ghim vào thanh tác vụ"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"cài đặt lối tắt"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Cho phép ứng dụng thêm lối tắt mà không cần sự can thiệp của người dùng."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"đọc lối tắt và các chế độ cài đặt trên màn hình chính"</string>
@@ -191,6 +190,10 @@
<string name="accessibility_close" msgid="2277148124685870734">"Đóng"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Cá nhân"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Công việc"</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="work_profile_toggle_label" msgid="3081029915775481146">"Hồ sơ công việc"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Các ứng dụng công việc được gắn huy hiệu và quản trị viên CNTT có thể nhìn thấy"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"OK"</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index c1a6eed..7b51d1d 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -62,7 +62,7 @@
<string name="widget_button_text" msgid="2880537293434387943">"微件"</string>
<string name="widgets_full_sheet_search_bar_hint" msgid="8484659090860596457">"搜索"</string>
<string name="widgets_full_sheet_cancel_button_description" msgid="5766167035728653605">"清除搜索框中的文字"</string>
- <string name="no_widgets_available" msgid="4337693382501046170">"无法使用微件和快捷方式"</string>
+ <string name="no_widgets_available" msgid="4337693382501046170">"没有可用的微件和快捷方式"</string>
<string name="no_search_results" msgid="3787956167293097509">"未找到任何微件或快捷方式"</string>
<string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"个人"</string>
<string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"工作"</string>
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"不要推荐此应用"</string>
<string name="pin_prediction" msgid="4196423321649756498">"固定预测的应用"</string>
<string name="bubble" msgid="3072951361014076670">"气泡框"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"固定到任务栏"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"安装快捷方式"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"允许应用自行添加快捷方式。"</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"读取主屏幕设置和快捷方式"</string>
@@ -191,6 +190,10 @@
<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="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-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index da606b3..0dd1801 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"不要提供應用程式建議"</string>
<string name="pin_prediction" msgid="4196423321649756498">"固定預測"</string>
<string name="bubble" msgid="3072951361014076670">"氣泡"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"固定至工作列"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"安裝捷徑"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"允許應用程式無需使用者許可也可新增捷徑。"</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"讀取主畫面設定和捷徑"</string>
@@ -191,6 +190,10 @@
<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="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-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index de1dc36..424939b 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"不要建議此應用程式"</string>
<string name="pin_prediction" msgid="4196423321649756498">"固定預測的應用程式"</string>
<string name="bubble" msgid="3072951361014076670">"泡泡"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"固定到工作列"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"安裝捷徑"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"允許應用程式自動新增捷徑。"</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"讀取主畫面設定和捷徑"</string>
@@ -191,6 +190,10 @@
<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="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-zu/strings.xml b/res/values-zu/strings.xml
index bed4fe8..918b7ca 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -101,7 +101,6 @@
<string name="dismiss_prediction_label" msgid="3357562989568808658">"Ungaphakamisi uhlelo lokusebenza"</string>
<string name="pin_prediction" msgid="4196423321649756498">"Ukubikezela Iphinikhodi"</string>
<string name="bubble" msgid="3072951361014076670">"Ibhamuza"</string>
- <string name="pin_to_taskbar" msgid="1281337899690299038">"Phina kutaskbar"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"faka izinqamuleli"</string>
<string name="permdesc_install_shortcut" msgid="923466509822011139">"Ivumela uhlelo lokusebenza ukufaka izinqamuleli ngaphandle kokungenelela komsebenzisi."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"funda amasethingi wasekhaya nezinqamuleli"</string>
@@ -191,6 +190,10 @@
<string name="accessibility_close" msgid="2277148124685870734">"Vala"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Okomuntu siqu"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Umsebenzi"</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="work_profile_toggle_label" msgid="3081029915775481146">"Iphrofayela yomsebenzi"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Ama-app omsebenzi anebheji futhi ayabonakala kumphathi wakho we-IT"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Ngiyezwa"</string>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 64f67cd..a15c130 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -445,7 +445,6 @@
<dimen name="taskbar_running_app_indicator_height">0dp</dimen>
<dimen name="taskbar_running_app_indicator_width">0dp</dimen>
<dimen name="taskbar_running_app_indicator_top_margin">0dp</dimen>
- <dimen name="taskbar_minimized_app_indicator_width">0dp</dimen>
<!-- Transient taskbar (placeholders to compile in Launcher3 without Quickstep) -->
<dimen name="transient_taskbar_padding">0dp</dimen>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index db87686..cc740a5 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -477,9 +477,12 @@
<!-- Label of tab to indicate personal apps -->
<string name="all_apps_personal_tab">Personal</string>
-
<!-- Label of tab to indicate work apps -->
<string name="all_apps_work_tab">Work</string>
+ <!-- Content description of personal tab to indicate personal apps -->
+ <string name="all_apps_personal_tab_content_description">Personal apps tab</string>
+ <!-- Content description of work tab to indicate work apps -->
+ <string name="all_apps_work_tab_content_description">Work apps tab</string>
<!-- This string is in the work profile tab when a user has All Apps open on their phone. This is a label for a toggle to turn the work profile on and off. "Work profile" means a separate profile on a user's phone that's specifically for their work apps and managed by their company. "Work" is used as an adjective.-->
<string name="work_profile_toggle_label">Work profile</string>
diff --git a/src/com/android/launcher3/BaseActivity.java b/src/com/android/launcher3/BaseActivity.java
index 84c8040..3e6b4dd 100644
--- a/src/com/android/launcher3/BaseActivity.java
+++ b/src/com/android/launcher3/BaseActivity.java
@@ -37,6 +37,10 @@
import androidx.annotation.IntDef;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.LifecycleRegistry;
+import androidx.savedstate.SavedStateRegistry;
+import androidx.savedstate.SavedStateRegistryController;
import com.android.launcher3.DeviceProfile.OnDeviceProfileChangeListener;
import com.android.launcher3.logging.StatsLogManager;
@@ -47,6 +51,7 @@
import com.android.launcher3.util.DisplayController;
import com.android.launcher3.util.DisplayController.DisplayInfoChangeListener;
import com.android.launcher3.util.DisplayController.Info;
+import com.android.launcher3.util.LifecycleHelper;
import com.android.launcher3.util.RunnableList;
import com.android.launcher3.util.SystemUiController;
import com.android.launcher3.util.ViewCache;
@@ -97,11 +102,14 @@
private final ArrayList<MultiWindowModeChangedListener> mMultiWindowModeChangedListeners =
new ArrayList<>();
+ private final SavedStateRegistryController mSavedStateRegistryController =
+ SavedStateRegistryController.create(this);
+ private final LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
+
protected DeviceProfile mDeviceProfile;
protected SystemUiController mSystemUiController;
private StatsLogManager mStatsLogManager;
-
public static final int ACTIVITY_STATE_STARTED = 1 << 0;
public static final int ACTIVITY_STATE_RESUMED = 1 << 1;
@@ -178,6 +186,12 @@
private ActionMode mCurrentActionMode;
+ public BaseActivity() {
+ mSavedStateRegistryController.performAttach();
+ registerActivityLifecycleCallbacks(
+ new LifecycleHelper(this, mSavedStateRegistryController, mLifecycleRegistry));
+ }
+
@Override
public ViewCache getViewCache() {
return mViewCache;
@@ -478,6 +492,18 @@
protected void reapplyUi() {}
+ @NonNull
+ @Override
+ public SavedStateRegistry getSavedStateRegistry() {
+ return mSavedStateRegistryController.getSavedStateRegistry();
+ }
+
+ @NonNull
+ @Override
+ public Lifecycle getLifecycle() {
+ return mLifecycleRegistry;
+ }
+
public static <T extends BaseActivity> T fromContext(Context context) {
if (context instanceof BaseActivity) {
return (T) context;
diff --git a/src/com/android/launcher3/BubbleTextView.java b/src/com/android/launcher3/BubbleTextView.java
index 250bbe5..783e82c 100644
--- a/src/com/android/launcher3/BubbleTextView.java
+++ b/src/com/android/launcher3/BubbleTextView.java
@@ -20,6 +20,7 @@
import static android.graphics.fonts.FontStyle.FONT_WEIGHT_NORMAL;
import static android.text.Layout.Alignment.ALIGN_NORMAL;
+import static com.android.app.animation.Interpolators.EMPHASIZED;
import static com.android.launcher3.BubbleTextView.RunningAppState.RUNNING;
import static com.android.launcher3.BubbleTextView.RunningAppState.NOT_RUNNING;
import static com.android.launcher3.BubbleTextView.RunningAppState.MINIMIZED;
@@ -37,6 +38,7 @@
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
+import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.content.res.ColorStateList;
@@ -130,6 +132,9 @@
StringMatcherUtility.StringMatcher.getInstance();
private static final int BOLD_TEXT_ADJUSTMENT = FONT_WEIGHT_BOLD - FONT_WEIGHT_NORMAL;
+ public static final int LINE_INDICATOR_ANIM_DURATION = 150;
+ private static final float MINIMIZED_APP_INDICATOR_SCALE = 0.5f;
+
private static final int[] STATE_PRESSED = new int[]{android.R.attr.state_pressed};
private float mScaleForReorderBounce = 1f;
@@ -165,6 +170,36 @@
}
};
+ private static final Property<BubbleTextView, Integer> LINE_INDICATOR_COLOR_PROPERTY =
+ new Property<>(Integer.class, "lineIndicatorColor") {
+
+ @Override
+ public Integer get(BubbleTextView bubbleTextView) {
+ return bubbleTextView.mLineIndicatorColor;
+ }
+
+ @Override
+ public void set(BubbleTextView bubbleTextView, Integer color) {
+ bubbleTextView.mLineIndicatorColor = color;
+ bubbleTextView.invalidate();
+ }
+ };
+
+ private static final Property<BubbleTextView, Float> LINE_INDICATOR_SCALE_PROPERTY =
+ new Property<>(Float.TYPE, "lineIndicatorScale") {
+
+ @Override
+ public Float get(BubbleTextView bubbleTextView) {
+ return bubbleTextView.mLineIndicatorScale;
+ }
+
+ @Override
+ public void set(BubbleTextView bubbleTextView, Float scale) {
+ bubbleTextView.mLineIndicatorScale = scale;
+ bubbleTextView.invalidate();
+ }
+ };
+
private final MultiTranslateDelegate mTranslateDelegate = new MultiTranslateDelegate(this);
protected final ActivityContext mActivity;
private FastBitmapDrawable mIcon;
@@ -202,7 +237,6 @@
// These fields, related to showing running apps, are only used for Taskbar.
private final int mRunningAppIndicatorWidth;
- private final int mMinimizedAppIndicatorWidth;
private final int mRunningAppIndicatorHeight;
private final int mRunningAppIndicatorTopMargin;
private final Paint mRunningAppIndicatorPaint;
@@ -210,6 +244,12 @@
private RunningAppState mRunningAppState;
private final int mRunningAppIndicatorColor;
private final int mMinimizedAppIndicatorColor;
+ @ViewDebug.ExportedProperty(category = "launcher")
+ private int mLineIndicatorColor;
+ @ViewDebug.ExportedProperty(category = "launcher")
+ private float mLineIndicatorScale;
+ private int mLineIndicatorAnimStartDelay;
+ private Animator mLineIndicatorAnim;
private final String mMinimizedStateDescription;
private final String mRunningStateDescription;
@@ -294,8 +334,6 @@
mRunningAppIndicatorWidth =
getResources().getDimensionPixelSize(R.dimen.taskbar_running_app_indicator_width);
- mMinimizedAppIndicatorWidth =
- getResources().getDimensionPixelSize(R.dimen.taskbar_minimized_app_indicator_width);
mRunningAppIndicatorHeight =
getResources().getDimensionPixelSize(R.dimen.taskbar_running_app_indicator_height);
mRunningAppIndicatorTopMargin =
@@ -344,6 +382,11 @@
mForceHideDot = false;
setBackground(null);
+ mLineIndicatorColor = Color.TRANSPARENT;
+ mLineIndicatorScale = 0;
+ mLineIndicatorAnimStartDelay = 0;
+ cancelLineIndicatorAnim();
+
setTag(null);
if (mIconLoadRequest != null) {
mIconLoadRequest.cancel();
@@ -436,9 +479,50 @@
/** Updates whether the app this view represents is currently running. */
@UiThread
- public void updateRunningState(RunningAppState runningAppState) {
+ public void updateRunningState(RunningAppState runningAppState, boolean animate) {
+ if (runningAppState.equals(mRunningAppState)) {
+ return;
+ }
mRunningAppState = runningAppState;
- invalidate();
+ cancelLineIndicatorAnim();
+
+ int color = switch (mRunningAppState) {
+ case NOT_RUNNING -> Color.TRANSPARENT;
+ case RUNNING -> mRunningAppIndicatorColor;
+ case MINIMIZED -> mMinimizedAppIndicatorColor;
+ };
+ float scale = switch (mRunningAppState) {
+ case NOT_RUNNING -> 0;
+ case RUNNING -> 1;
+ case MINIMIZED -> MINIMIZED_APP_INDICATOR_SCALE;
+ };
+
+ if (!animate) {
+ mLineIndicatorColor = color;
+ mLineIndicatorScale = scale;
+ invalidate();
+ return;
+ }
+
+ AnimatorSet lineIndicatorAnim = new AnimatorSet();
+ mLineIndicatorAnim = lineIndicatorAnim;
+ Animator colorAnimator = ObjectAnimator.ofArgb(this, LINE_INDICATOR_COLOR_PROPERTY, color);
+ Animator scaleAnimator = ObjectAnimator.ofFloat(this, LINE_INDICATOR_SCALE_PROPERTY, scale);
+ lineIndicatorAnim.playTogether(colorAnimator, scaleAnimator);
+
+ lineIndicatorAnim.setInterpolator(EMPHASIZED);
+ lineIndicatorAnim.setStartDelay(mLineIndicatorAnimStartDelay);
+ lineIndicatorAnim.setDuration(LINE_INDICATOR_ANIM_DURATION).start();
+ }
+
+ public void setLineIndicatorAnimStartDelay(int lineIndicatorAnimStartDelay) {
+ mLineIndicatorAnimStartDelay = lineIndicatorAnimStartDelay;
+ }
+
+ private void cancelLineIndicatorAnim() {
+ if (mLineIndicatorAnim != null) {
+ mLineIndicatorAnim.cancel();
+ }
}
/**
@@ -505,7 +589,7 @@
}
private void setNonPendingIcon(ItemInfoWithIcon info) {
- int flags = shouldUseTheme() ? FLAG_THEMED : 0;
+ int flags = shouldUseTheme() ? FLAG_THEMED : info.bitmap.creationFlags;
// Remove badge on icons smaller than 48dp.
if (mHideBadge || mDisplay == DISPLAY_SEARCH_RESULT_SMALL) {
flags |= FLAG_NO_BADGE;
@@ -790,19 +874,18 @@
/** Draws a line under the app icon if this is representing a running app in Desktop Mode. */
protected void drawRunningAppIndicatorIfNecessary(Canvas canvas) {
- if (mRunningAppState == NOT_RUNNING || mDisplay != DISPLAY_TASKBAR) {
+ if (mDisplay != DISPLAY_TASKBAR
+ || mLineIndicatorScale == 0
+ || mLineIndicatorColor == Color.TRANSPARENT) {
return;
}
getIconBounds(mRunningAppIconBounds);
Utilities.scaleRectAboutCenter(mRunningAppIconBounds, ICON_VISIBLE_AREA_FACTOR);
- final boolean isMinimized = mRunningAppState == MINIMIZED;
final int indicatorTop = mRunningAppIconBounds.bottom + mRunningAppIndicatorTopMargin;
- final int indicatorWidth =
- isMinimized ? mMinimizedAppIndicatorWidth : mRunningAppIndicatorWidth;
+ final float indicatorWidth = mRunningAppIndicatorWidth * mLineIndicatorScale;
final float cornerRadius = mRunningAppIndicatorHeight / 2f;
- mRunningAppIndicatorPaint.setColor(
- isMinimized ? mMinimizedAppIndicatorColor : mRunningAppIndicatorColor);
+ mRunningAppIndicatorPaint.setColor(mLineIndicatorColor);
canvas.drawRoundRect(
mRunningAppIconBounds.centerX() - indicatorWidth / 2f,
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index 5644051..289f175 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -252,7 +252,6 @@
import com.android.launcher3.util.TouchController;
import com.android.launcher3.util.TraceHelper;
import com.android.launcher3.views.ActivityContext;
-import com.android.launcher3.views.ComposeInitializer;
import com.android.launcher3.views.FloatingIconView;
import com.android.launcher3.views.FloatingSurfaceView;
import com.android.launcher3.views.OptionsPopupView;
@@ -578,7 +577,6 @@
setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL);
setContentView(getRootView());
- ComposeInitializer.initCompose(this);
if (mOnInitialBindListener != null) {
getRootView().getViewTreeObserver().addOnPreDrawListener(mOnInitialBindListener);
diff --git a/src/com/android/launcher3/allapps/AlphabeticalAppsList.java b/src/com/android/launcher3/allapps/AlphabeticalAppsList.java
index 709b52a..5f632fe 100644
--- a/src/com/android/launcher3/allapps/AlphabeticalAppsList.java
+++ b/src/com/android/launcher3/allapps/AlphabeticalAppsList.java
@@ -15,10 +15,14 @@
*/
package com.android.launcher3.allapps;
+import static android.multiuser.Flags.enableMovingContentIntoPrivateSpace;
+
import static com.android.launcher3.allapps.BaseAllAppsAdapter.VIEW_TYPE_BOTTOM_VIEW_TO_SCROLL_TO;
+import static com.android.launcher3.allapps.BaseAllAppsAdapter.VIEW_TYPE_MASK_PRIVATE_SPACE_HEADER;
import static com.android.launcher3.allapps.SectionDecorationInfo.ROUND_BOTTOM_LEFT;
import static com.android.launcher3.allapps.SectionDecorationInfo.ROUND_BOTTOM_RIGHT;
import static com.android.launcher3.allapps.SectionDecorationInfo.ROUND_NOTHING;
+import static com.android.launcher3.icons.BitmapInfo.FLAG_NO_BADGE;
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_PRIVATE_SPACE_PREINSTALLED_APPS_COUNT;
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_PRIVATE_SPACE_USER_INSTALLED_APPS_COUNT;
@@ -60,6 +64,7 @@
AllAppsStore.OnUpdateListener {
public static final String TAG = "AlphabeticalAppsList";
+ private static final String PRIVATE_SPACE_PACKAGE = "com.android.privatespace";
private final WorkProfileManager mWorkProviderManager;
@@ -382,7 +387,7 @@
private int addPrivateSpaceApps(int position) {
// Add Install Apps Button first.
- if (Flags.privateSpaceAppInstallerButton()) {
+ if (Flags.privateSpaceAppInstallerButton() && !enableMovingContentIntoPrivateSpace()) {
mPrivateProviderManager.addPrivateSpaceInstallAppButton(mAdapterItems);
position++;
}
@@ -419,6 +424,28 @@
// Add system apps.
position = addAppsWithSections(split.get(false), position);
+ if (enableMovingContentIntoPrivateSpace()) {
+ // Look for the private space app via package and move it after header.
+ int headerIndex = -1;
+ int privateSpaceAppIndex = -1;
+ for (int i = 0; i < mAdapterItems.size(); i++) {
+ BaseAllAppsAdapter.AdapterItem currentItem = mAdapterItems.get(i);
+ if (currentItem.viewType == VIEW_TYPE_MASK_PRIVATE_SPACE_HEADER) {
+ headerIndex = i;
+ }
+ if (currentItem.itemInfo != null && Objects.equals(
+ currentItem.itemInfo.getTargetPackage(), PRIVATE_SPACE_PACKAGE)) {
+ currentItem.itemInfo.bitmap.creationFlags |= FLAG_NO_BADGE;
+ privateSpaceAppIndex = i;
+ }
+ }
+ if (headerIndex != -1 && privateSpaceAppIndex != -1) {
+ BaseAllAppsAdapter.AdapterItem movedItem =
+ mAdapterItems.remove(privateSpaceAppIndex);
+ // Move the icon after the header.
+ mAdapterItems.add(headerIndex + 1, movedItem);
+ }
+ }
return position;
}
diff --git a/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java b/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java
index 3836f7d..b80238c 100644
--- a/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java
+++ b/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java
@@ -38,7 +38,6 @@
import android.appwidget.AppWidgetHostView;
import android.appwidget.AppWidgetProviderInfo;
import android.content.Context;
-import android.content.ContextWrapper;
import android.content.res.Configuration;
import android.content.res.TypedArray;
import android.graphics.PointF;
@@ -64,7 +63,6 @@
import com.android.launcher3.BubbleTextView;
import com.android.launcher3.CellLayout;
import com.android.launcher3.DeviceProfile;
-import com.android.launcher3.DeviceProfile.OnDeviceProfileChangeListener;
import com.android.launcher3.Hotseat;
import com.android.launcher3.InsettableFrameLayout;
import com.android.launcher3.InvariantDeviceProfile;
@@ -90,11 +88,13 @@
import com.android.launcher3.model.data.ItemInfo;
import com.android.launcher3.model.data.LauncherAppWidgetInfo;
import com.android.launcher3.model.data.WorkspaceItemInfo;
+import com.android.launcher3.util.BaseContext;
import com.android.launcher3.util.ComponentKey;
import com.android.launcher3.util.DisplayController;
import com.android.launcher3.util.IntArray;
import com.android.launcher3.util.IntSet;
import com.android.launcher3.util.SandboxContext;
+import com.android.launcher3.util.Themes;
import com.android.launcher3.util.WindowBounds;
import com.android.launcher3.util.window.WindowManagerProxy;
import com.android.launcher3.views.ActivityContext;
@@ -109,7 +109,6 @@
import dagger.BindsInstance;
import dagger.Component;
-import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
@@ -127,7 +126,7 @@
* 3) Place appropriate elements like icons and first-page qsb
* 4) Measure and draw the view on a canvas
*/
-public class LauncherPreviewRenderer extends ContextWrapper
+public class LauncherPreviewRenderer extends BaseContext
implements ActivityContext, WorkspaceLayoutManager, LayoutInflater.Factory2 {
/**
@@ -156,7 +155,6 @@
}
}
- private final List<OnDeviceProfileChangeListener> mDpChangeListeners = new ArrayList<>();
private final Handler mUiHandler;
private final Context mContext;
private final InvariantDeviceProfile mIdp;
@@ -184,7 +182,7 @@
WallpaperColors wallpaperColorsOverride,
@Nullable final SparseArray<Size> launcherWidgetSpanInfo) {
- super(context);
+ super(context, Themes.getActivityThemeRes(context));
mUiHandler = new Handler(Looper.getMainLooper());
mContext = context;
mIdp = idp;
@@ -263,6 +261,13 @@
: null;
}
mAppWidgetHost = new LauncherPreviewAppWidgetHost(context);
+
+ onViewCreated();
+ }
+
+ @Override
+ public InsettableFrameLayout getRootView() {
+ return mRootView;
}
/**
@@ -349,11 +354,6 @@
}
@Override
- public List<OnDeviceProfileChangeListener> getOnDeviceProfileChangeListeners() {
- return mDpChangeListeners;
- }
-
- @Override
public Hotseat getHotseat() {
return mHotseat;
}
diff --git a/src/com/android/launcher3/logging/StatsLogManager.java b/src/com/android/launcher3/logging/StatsLogManager.java
index 2f1af68..74d5098 100644
--- a/src/com/android/launcher3/logging/StatsLogManager.java
+++ b/src/com/android/launcher3/logging/StatsLogManager.java
@@ -433,20 +433,29 @@
@UiEvent(doc = "Notification dismissed by swiping right.")
LAUNCHER_NOTIFICATION_DISMISSED(652),
- @UiEvent(doc = "Current grid size is changed to 6.")
- LAUNCHER_GRID_SIZE_6(930),
+ @UiEvent(doc = "Current grid size is changed to 2x2")
+ LAUNCHER_GRID_SIZE_2_BY_2(2181),
- @UiEvent(doc = "Current grid size is changed to 5.")
- LAUNCHER_GRID_SIZE_5(662),
+ @UiEvent(doc = "Current grid size is changed to 3x3")
+ LAUNCHER_GRID_SIZE_3_BY_3(2182),
- @UiEvent(doc = "Current grid size is changed to 4.")
- LAUNCHER_GRID_SIZE_4(663),
+ @UiEvent(doc = "Current grid size is changed to 4x4")
+ LAUNCHER_GRID_SIZE_4_BY_4(2183),
- @UiEvent(doc = "Current grid size is changed to 3.")
- LAUNCHER_GRID_SIZE_3(664),
+ @UiEvent(doc = "Current grid size is changed to 4x5")
+ LAUNCHER_GRID_SIZE_4_BY_5(2184),
- @UiEvent(doc = "Current grid size is changed to 2.")
- LAUNCHER_GRID_SIZE_2(665),
+ @UiEvent(doc = "Current grid size is changed to 4x6")
+ LAUNCHER_GRID_SIZE_4_BY_6(2185),
+
+ @UiEvent(doc = "Current grid size is changed to 5x5")
+ LAUNCHER_GRID_SIZE_5_BY_5(2186),
+
+ @UiEvent(doc = "Current grid size is changed to 5x6")
+ LAUNCHER_GRID_SIZE_5_BY_6(2187),
+
+ @UiEvent(doc = "Current grid size is changed to 6x5")
+ LAUNCHER_GRID_SIZE_6_BY_5(2188),
@UiEvent(doc = "Launcher entered into AllApps state.")
LAUNCHER_ALLAPPS_ENTRY(692),
diff --git a/src/com/android/launcher3/model/DeviceGridState.java b/src/com/android/launcher3/model/DeviceGridState.java
index d06f541..96ce4c8 100644
--- a/src/com/android/launcher3/model/DeviceGridState.java
+++ b/src/com/android/launcher3/model/DeviceGridState.java
@@ -21,11 +21,6 @@
import static com.android.launcher3.LauncherPrefs.DEVICE_TYPE;
import static com.android.launcher3.LauncherPrefs.HOTSEAT_COUNT;
import static com.android.launcher3.LauncherPrefs.WORKSPACE_SIZE;
-import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_GRID_SIZE_2;
-import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_GRID_SIZE_3;
-import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_GRID_SIZE_4;
-import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_GRID_SIZE_5;
-import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_GRID_SIZE_6;
import android.content.Context;
import android.text.TextUtils;
@@ -114,17 +109,23 @@
*/
public LauncherEvent getWorkspaceSizeEvent() {
if (!TextUtils.isEmpty(mGridSizeString)) {
- switch (getColumns()) {
- case 6:
- return LAUNCHER_GRID_SIZE_6;
- case 5:
- return LAUNCHER_GRID_SIZE_5;
- case 4:
- return LAUNCHER_GRID_SIZE_4;
- case 3:
- return LAUNCHER_GRID_SIZE_3;
- case 2:
- return LAUNCHER_GRID_SIZE_2;
+ switch (mGridSizeString) {
+ case "2,2":
+ return LauncherEvent.LAUNCHER_GRID_SIZE_2_BY_2;
+ case "3,3":
+ return LauncherEvent.LAUNCHER_GRID_SIZE_3_BY_3;
+ case "4,4":
+ return LauncherEvent.LAUNCHER_GRID_SIZE_4_BY_4;
+ case "4,5":
+ return LauncherEvent.LAUNCHER_GRID_SIZE_4_BY_5;
+ case "4,6":
+ return LauncherEvent.LAUNCHER_GRID_SIZE_4_BY_6;
+ case "5,5":
+ return LauncherEvent.LAUNCHER_GRID_SIZE_5_BY_5;
+ case "5,6":
+ return LauncherEvent.LAUNCHER_GRID_SIZE_5_BY_6;
+ case "6,5":
+ return LauncherEvent.LAUNCHER_GRID_SIZE_6_BY_5;
}
}
return null;
diff --git a/src/com/android/launcher3/secondarydisplay/SecondaryDisplayLauncher.java b/src/com/android/launcher3/secondarydisplay/SecondaryDisplayLauncher.java
index fd8b0e7..c4fed71 100644
--- a/src/com/android/launcher3/secondarydisplay/SecondaryDisplayLauncher.java
+++ b/src/com/android/launcher3/secondarydisplay/SecondaryDisplayLauncher.java
@@ -94,27 +94,6 @@
mModel = LauncherAppState.getInstance(this).getModel();
mDragController = new SecondaryDragController(this);
mSecondaryDisplayPredictions = SecondaryDisplayPredictions.newInstance(this);
- if (getWindow().getDecorView().isAttachedToWindow()) {
- initUi();
- }
- }
-
- @Override
- public void onAttachedToWindow() {
- super.onAttachedToWindow();
- initUi();
- }
-
- @Override
- public void onDetachedFromWindow() {
- super.onDetachedFromWindow();
- this.getDragController().removeDragListener(this);
- }
-
- private void initUi() {
- if (mDragLayer != null) {
- return;
- }
mDeviceProfile = InvariantDeviceProfile.INSTANCE.get(this)
.createDeviceProfileForSecondaryDisplay(this);
diff --git a/src/com/android/launcher3/statemanager/BaseState.java b/src/com/android/launcher3/statemanager/BaseState.java
index b7dd2bf..ea54159 100644
--- a/src/com/android/launcher3/statemanager/BaseState.java
+++ b/src/com/android/launcher3/statemanager/BaseState.java
@@ -69,6 +69,13 @@
}
/**
+ * For this state, whether we should show desktop exploded view in Overview.
+ */
+ default boolean showExplodedDesktopView() {
+ return false;
+ }
+
+ /**
* For this state, whether fullscreen and desktop quickswitch carousel are detached.
*/
default boolean detachDesktopCarousel() {
diff --git a/src/com/android/launcher3/util/BaseContext.kt b/src/com/android/launcher3/util/BaseContext.kt
new file mode 100644
index 0000000..819470b
--- /dev/null
+++ b/src/com/android/launcher3/util/BaseContext.kt
@@ -0,0 +1,131 @@
+/*
+ * 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.util
+
+import android.content.Context
+import android.view.ContextThemeWrapper
+import android.view.View
+import android.view.View.OnAttachStateChangeListener
+import android.view.ViewTreeObserver.OnWindowFocusChangeListener
+import android.view.ViewTreeObserver.OnWindowVisibilityChangeListener
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.Lifecycle.State.CREATED
+import androidx.lifecycle.Lifecycle.State.DESTROYED
+import androidx.lifecycle.Lifecycle.State.RESUMED
+import androidx.lifecycle.Lifecycle.State.STARTED
+import androidx.lifecycle.LifecycleRegistry
+import androidx.lifecycle.setViewTreeLifecycleOwner
+import androidx.savedstate.SavedStateRegistry
+import androidx.savedstate.SavedStateRegistryController
+import androidx.savedstate.setViewTreeSavedStateRegistryOwner
+import com.android.launcher3.DeviceProfile.OnDeviceProfileChangeListener
+import com.android.launcher3.Utilities
+import com.android.launcher3.views.ActivityContext
+
+/**
+ * A context wrapper with lifecycle tracking based on the window events on the rootView of the
+ * [ActivityContext]
+ */
+abstract class BaseContext
+@JvmOverloads
+constructor(base: Context, themeResId: Int, private val destroyOnDetach: Boolean = true) :
+ ContextThemeWrapper(base, themeResId), ActivityContext {
+
+ private val listeners = mutableListOf<OnDeviceProfileChangeListener>()
+
+ private val savedStateRegistryController = SavedStateRegistryController.create(this)
+ private val lifecycleRegistry = LifecycleRegistry(this)
+
+ override val savedStateRegistry: SavedStateRegistry
+ get() = savedStateRegistryController.savedStateRegistry
+
+ override val lifecycle: Lifecycle
+ get() = lifecycleRegistry
+
+ private val viewCache = ViewCache()
+
+ init {
+ Executors.MAIN_EXECUTOR.execute {
+ savedStateRegistryController.performAttach()
+ savedStateRegistryController.performRestore(null)
+ }
+ }
+
+ override fun getOnDeviceProfileChangeListeners() = listeners
+
+ private val finishActions = RunnableList()
+
+ /** Called when the root view is created for this context */
+ fun onViewCreated() {
+ val view = rootView
+ val attachListener =
+ object : OnAttachStateChangeListener {
+
+ override fun onViewAttachedToWindow(view: View) {
+ view.rootView.setViewTreeLifecycleOwner(this@BaseContext)
+ view.rootView.setViewTreeSavedStateRegistryOwner(this@BaseContext)
+ lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE)
+
+ val treeObserver = view.viewTreeObserver
+
+ val focusListener = OnWindowFocusChangeListener { updateState() }
+ treeObserver.addOnWindowFocusChangeListener(focusListener)
+ finishActions.add {
+ treeObserver.removeOnWindowFocusChangeListener(focusListener)
+ }
+
+ if (Utilities.ATLEAST_V) {
+ val visibilityListener = OnWindowVisibilityChangeListener { updateState() }
+ treeObserver.addOnWindowVisibilityChangeListener(visibilityListener)
+ finishActions.add {
+ treeObserver.removeOnWindowVisibilityChangeListener(visibilityListener)
+ }
+ }
+ }
+
+ override fun onViewDetachedFromWindow(view: View) {
+ if (destroyOnDetach) onViewDestroyed()
+ }
+ }
+ view.addOnAttachStateChangeListener(attachListener)
+ finishActions.add { view.removeOnAttachStateChangeListener(attachListener) }
+
+ if (view.isAttachedToWindow) attachListener.onViewAttachedToWindow(view)
+ updateState()
+ }
+
+ override fun getViewCache() = viewCache
+
+ private fun updateState() {
+ if (lifecycleRegistry.currentState.isAtLeast(CREATED)) {
+ lifecycleRegistry.currentState =
+ if (rootView.windowVisibility != View.VISIBLE) CREATED
+ else (if (!rootView.hasWindowFocus()) STARTED else RESUMED)
+ }
+ }
+
+ fun onViewDestroyed() {
+ if (
+ !lifecycleRegistry.currentState.isAtLeast(CREATED) &&
+ lifecycleRegistry.currentState != DESTROYED
+ ) {
+ lifecycleRegistry.currentState = CREATED
+ }
+ lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY)
+ finishActions.executeAllAndDestroy()
+ }
+}
diff --git a/src/com/android/launcher3/util/LifecycleHelper.kt b/src/com/android/launcher3/util/LifecycleHelper.kt
new file mode 100644
index 0000000..803adae
--- /dev/null
+++ b/src/com/android/launcher3/util/LifecycleHelper.kt
@@ -0,0 +1,69 @@
+/*
+ * 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.util
+
+import android.app.Activity
+import android.os.Bundle
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.LifecycleRegistry
+import androidx.lifecycle.setViewTreeLifecycleOwner
+import androidx.savedstate.SavedStateRegistryController
+import androidx.savedstate.SavedStateRegistryOwner
+import androidx.savedstate.setViewTreeSavedStateRegistryOwner
+
+/** Utility class for triggering various lifecycle events based on activity callbacks */
+class LifecycleHelper(
+ private val owner: SavedStateRegistryOwner,
+ private val savedStateRegistryController: SavedStateRegistryController,
+ private val lifecycleRegistry: LifecycleRegistry,
+) : ActivityLifecycleCallbacksAdapter {
+
+ override fun onActivityPreCreated(activity: Activity, savedInstanceState: Bundle?) {
+ savedStateRegistryController.performRestore(savedInstanceState)
+ }
+
+ override fun onActivityPostCreated(activity: Activity, savedInstanceState: Bundle?) {
+ activity.window.decorView.setViewTreeLifecycleOwner(owner)
+ activity.window.decorView.setViewTreeSavedStateRegistryOwner(owner)
+ lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE)
+ }
+
+ override fun onActivityPostStarted(activity: Activity) {
+ lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START)
+ }
+
+ override fun onActivityPostResumed(activity: Activity) {
+ lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME)
+ }
+
+ override fun onActivityPrePaused(activity: Activity) {
+ lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE)
+ }
+
+ override fun onActivityPreStopped(activity: Activity) {
+ lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP)
+ }
+
+ override fun onActivityPreDestroyed(activity: Activity) {
+ lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY)
+ }
+
+ override fun onActivitySaveInstanceState(activity: Activity, bundle: Bundle) {
+ lifecycleRegistry.currentState = Lifecycle.State.CREATED
+ savedStateRegistryController.performSave(bundle)
+ }
+}
diff --git a/src/com/android/launcher3/views/ActivityContext.java b/src/com/android/launcher3/views/ActivityContext.java
index 49adaec..bcb9295 100644
--- a/src/com/android/launcher3/views/ActivityContext.java
+++ b/src/com/android/launcher3/views/ActivityContext.java
@@ -56,6 +56,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.view.WindowInsetsCompat;
+import androidx.savedstate.SavedStateRegistryOwner;
import com.android.launcher3.BubbleTextView;
import com.android.launcher3.DeviceProfile;
@@ -94,7 +95,7 @@
* An interface to be used along with a context for various activities in Launcher. This allows a
* generic class to depend on Context subclass instead of an Activity.
*/
-public interface ActivityContext {
+public interface ActivityContext extends SavedStateRegistryOwner {
String TAG = "ActivityContext";
@@ -229,9 +230,7 @@
getOnDeviceProfileChangeListeners().remove(listener);
}
- default ViewCache getViewCache() {
- return new ViewCache();
- }
+ ViewCache getViewCache();
/**
* Controller for supporting item drag-and-drop
diff --git a/src/com/android/launcher3/views/ComposeInitializer.java b/src/com/android/launcher3/views/ComposeInitializer.java
deleted file mode 100644
index 0929885..0000000
--- a/src/com/android/launcher3/views/ComposeInitializer.java
+++ /dev/null
@@ -1,229 +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.views;
-
-import android.os.Build;
-import android.view.View;
-import android.view.ViewParent;
-import android.view.ViewTreeObserver;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.RequiresApi;
-import androidx.lifecycle.Lifecycle;
-import androidx.lifecycle.LifecycleOwner;
-import androidx.lifecycle.LifecycleRegistry;
-import androidx.lifecycle.ViewTreeLifecycleOwner;
-import androidx.savedstate.SavedStateRegistry;
-import androidx.savedstate.SavedStateRegistryController;
-import androidx.savedstate.SavedStateRegistryOwner;
-import androidx.savedstate.ViewTreeSavedStateRegistryOwner;
-
-import com.android.launcher3.Utilities;
-
-/**
- * An initializer to use Compose for classes implementing {@code ActivityContext}. This allows
- * adding ComposeView to ViewTree outside a {@link androidx.activity.ComponentActivity}.
- */
-public final class ComposeInitializer {
- /**
- * Performs the initialization to use Compose in the ViewTree of {@code target}.
- */
- public static void initCompose(ActivityContext target) {
- getContentChild(target).addOnAttachStateChangeListener(
- new View.OnAttachStateChangeListener() {
-
- @Override
- public void onViewAttachedToWindow(View v) {
- ComposeInitializer.onAttachedToWindow(v);
- }
-
- @Override
- public void onViewDetachedFromWindow(View v) {
- ComposeInitializer.onDetachedFromWindow(v);
- }
- });
- }
-
- /**
- * Find the "content child" for {@code target}.
- *
- * @see "WindowRecomposer.android.kt: [View.contentChild]"
- */
- private static View getContentChild(ActivityContext target) {
- View self = target.getDragLayer();
- ViewParent parent = self.getParent();
- while (parent instanceof View parentView) {
- if (parentView.getId() == android.R.id.content) return self;
- self = parentView;
- parent = self.getParent();
- }
- return self;
- }
-
- /**
- * Function to be called on your window root view's [View.onAttachedToWindow] function.
- */
- private static void onAttachedToWindow(View root) {
- if (ViewTreeLifecycleOwner.get(root) != null) {
- throw new IllegalStateException(
- "View " + root + " already has a LifecycleOwner");
- }
-
- ViewParent parent = root.getParent();
- if (parent instanceof View && ((View) parent).getId() != android.R.id.content) {
- throw new IllegalStateException(
- "ComposeInitializer.onContentChildAttachedToWindow(View) must be called on "
- + "the content child. Outside of activities and dialogs, this is "
- + "usually the top-most View of a window.");
- }
-
- // The lifecycle owner, which is STARTED when [root] is visible and RESUMED when [root]
- // is both visible and focused.
- ViewLifecycleOwner lifecycleOwner = new ViewLifecycleOwner(root);
-
- // We must call [ViewLifecycleOwner.onCreate] after creating the
- // [SavedStateRegistryOwner] because `onCreate` might move the lifecycle state to STARTED
- // which will make [SavedStateRegistryController.performRestore] throw.
- lifecycleOwner.onCreate();
-
- // Set the owners on the root. They will be reused by any ComposeView inside the root
- // hierarchy.
- ViewTreeLifecycleOwner.set(root, lifecycleOwner);
- ViewTreeSavedStateRegistryOwner.set(root, lifecycleOwner);
- }
-
- /**
- * Function to be called on your window root view's [View.onDetachedFromWindow] function.
- */
- private static void onDetachedFromWindow(View root) {
- final LifecycleOwner lifecycleOwner = ViewTreeLifecycleOwner.get(root);
- if (lifecycleOwner != null) {
- ((ViewLifecycleOwner) lifecycleOwner).onDestroy();
- }
- ViewTreeLifecycleOwner.set(root, null);
- ViewTreeSavedStateRegistryOwner.set(root, null);
- }
-
- /**
- * A [LifecycleOwner] for a [View] that updates lifecycle state based on window state.
- *
- * Also a trivial implementation of [SavedStateRegistryOwner] that does not do any save or
- * restore. This works for processes similar to the SystemUI process, which is always running
- * and top-level windows using this initialization are created once, when the process is
- * started.
- *
- * The implementation requires the caller to call [onCreate] and [onDestroy] when the view is
- * attached to or detached from a view hierarchy. After [onCreate] and before [onDestroy] is
- * called, the implementation monitors window state in the following way
- * * If the window is not visible, we are in the [Lifecycle.State.CREATED] state
- * * If the window is visible but not focused, we are in the [Lifecycle.State.STARTED] state
- * * If the window is visible and focused, we are in the [Lifecycle.State.RESUMED] state
- *
- * Or in table format:
- * ```
- * ┌───────────────┬───────────────────┬──────────────┬─────────────────┐
- * │ View attached │ Window Visibility │ Window Focus │ Lifecycle State │
- * ├───────────────┼───────────────────┴──────────────┼─────────────────┤
- * │ Not attached │ Any │ N/A │
- * ├───────────────┼───────────────────┬──────────────┼─────────────────┤
- * │ │ Not visible │ Any │ CREATED │
- * │ ├───────────────────┼──────────────┼─────────────────┤
- * │ Attached │ │ No focus │ STARTED │
- * │ │ Visible ├──────────────┼─────────────────┤
- * │ │ │ Has focus │ RESUMED │
- * └───────────────┴───────────────────┴──────────────┴─────────────────┘
- * ```
- */
- private static class ViewLifecycleOwner implements SavedStateRegistryOwner {
- private final ViewTreeObserver.OnWindowFocusChangeListener mWindowFocusListener =
- hasFocus -> updateState();
- private final LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
-
- private final SavedStateRegistryController mSavedStateRegistryController =
- SavedStateRegistryController.create(this);
-
- private final View mView;
- private final Api34Impl mApi34Impl;
-
- ViewLifecycleOwner(View view) {
- mView = view;
- if (Utilities.ATLEAST_U) {
- mApi34Impl = new Api34Impl();
- } else {
- mApi34Impl = null;
- }
-
- mSavedStateRegistryController.performRestore(null);
- }
-
- @NonNull
- @Override
- public Lifecycle getLifecycle() {
- return mLifecycleRegistry;
- }
-
- @NonNull
- @Override
- public SavedStateRegistry getSavedStateRegistry() {
- return mSavedStateRegistryController.getSavedStateRegistry();
- }
-
- void onCreate() {
- mLifecycleRegistry.setCurrentState(Lifecycle.State.CREATED);
- if (Utilities.ATLEAST_U) {
- mApi34Impl.addOnWindowVisibilityChangeListener();
- }
- mView.getViewTreeObserver().addOnWindowFocusChangeListener(
- mWindowFocusListener);
- updateState();
- }
-
- void onDestroy() {
- if (Utilities.ATLEAST_U) {
- mApi34Impl.removeOnWindowVisibilityChangeListener();
- }
- mView.getViewTreeObserver().removeOnWindowFocusChangeListener(
- mWindowFocusListener);
- mLifecycleRegistry.setCurrentState(Lifecycle.State.DESTROYED);
- }
-
- private void updateState() {
- Lifecycle.State state =
- mView.getWindowVisibility() != View.VISIBLE ? Lifecycle.State.CREATED
- : (!mView.hasWindowFocus() ? Lifecycle.State.STARTED
- : Lifecycle.State.RESUMED);
- mLifecycleRegistry.setCurrentState(state);
- }
-
- @RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
- private class Api34Impl {
- private final ViewTreeObserver.OnWindowVisibilityChangeListener
- mWindowVisibilityListener =
- visibility -> updateState();
-
- void addOnWindowVisibilityChangeListener() {
- mView.getViewTreeObserver().addOnWindowVisibilityChangeListener(
- mWindowVisibilityListener);
- }
-
- void removeOnWindowVisibilityChangeListener() {
- mView.getViewTreeObserver().removeOnWindowVisibilityChangeListener(
- mWindowVisibilityListener);
- }
- }
- }
-}
diff --git a/tests/multivalentTests/src/com/android/launcher3/AbstractDeviceProfileTest.kt b/tests/multivalentTests/src/com/android/launcher3/AbstractDeviceProfileTest.kt
index ad6afcf..a30261e 100644
--- a/tests/multivalentTests/src/com/android/launcher3/AbstractDeviceProfileTest.kt
+++ b/tests/multivalentTests/src/com/android/launcher3/AbstractDeviceProfileTest.kt
@@ -39,6 +39,7 @@
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
@@ -51,6 +52,7 @@
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
@@ -80,6 +82,13 @@
@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,
@@ -364,13 +373,9 @@
context.assets.open("dumpTests/$fileName").bufferedReader().use(BufferedReader::readText)
private fun writeToDevice(context: Context, fileName: String, content: String) {
- val dir =
- File(context.filesDir, "dumpTests").also {
- if (!it.exists()) {
- it.mkdirs()
- }
- }
- File(dir, fileName).writeText(content)
+ 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/util/ActivityContextWrapper.java b/tests/multivalentTests/src/com/android/launcher3/util/ActivityContextWrapper.java
index 4217d22..f4dc88d 100644
--- a/tests/multivalentTests/src/com/android/launcher3/util/ActivityContextWrapper.java
+++ b/tests/multivalentTests/src/com/android/launcher3/util/ActivityContextWrapper.java
@@ -18,23 +18,15 @@
import android.R;
import android.content.Context;
import android.content.ContextWrapper;
-import android.view.ContextThemeWrapper;
import com.android.launcher3.DeviceProfile;
-import com.android.launcher3.DeviceProfile.OnDeviceProfileChangeListener;
import com.android.launcher3.InvariantDeviceProfile;
-import com.android.launcher3.views.ActivityContext;
import com.android.launcher3.views.BaseDragLayer;
-import java.util.ArrayList;
-import java.util.List;
-
/**
* {@link ContextWrapper} with internal Launcher interface for testing
*/
-public class ActivityContextWrapper extends ContextThemeWrapper implements ActivityContext {
-
- private final List<OnDeviceProfileChangeListener> mDpChangeListeners = new ArrayList<>();
+public class ActivityContextWrapper extends BaseContext {
private final DeviceProfile mProfile;
private final MyDragLayer mMyDragLayer;
@@ -47,20 +39,15 @@
super(base, theme);
mProfile = InvariantDeviceProfile.INSTANCE.get(base).getDeviceProfile(base).copy(base);
mMyDragLayer = new MyDragLayer(this);
+ Executors.MAIN_EXECUTOR.execute(this::onViewCreated);
}
-
@Override
public BaseDragLayer getDragLayer() {
return mMyDragLayer;
}
@Override
- public List<OnDeviceProfileChangeListener> getOnDeviceProfileChangeListeners() {
- return mDpChangeListeners;
- }
-
- @Override
public DeviceProfile getDeviceProfile() {
return mProfile;
}
diff --git a/tests/multivalentTests/src/com/android/launcher3/util/rule/ZipFilesRule.kt b/tests/multivalentTests/src/com/android/launcher3/util/rule/ZipFilesRule.kt
new file mode 100644
index 0000000..d12de76
--- /dev/null
+++ b/tests/multivalentTests/src/com/android/launcher3/util/rule/ZipFilesRule.kt
@@ -0,0 +1,65 @@
+/*
+ * 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.util.rule
+
+import android.content.Context
+import android.os.FileUtils
+import java.io.File
+import java.io.FileInputStream
+import java.io.FileOutputStream
+import java.util.zip.ZipEntry
+import java.util.zip.ZipOutputStream
+import org.junit.rules.TestRule
+import org.junit.runner.Description
+import org.junit.runners.model.Statement
+
+class ZipFilesRule(val context: Context, val name: String) : TestRule {
+
+ var resultsZip: ZipOutputStream? = null
+
+ override fun apply(base: Statement, description: Description): Statement {
+ return object : Statement() {
+ @Throws(Throwable::class)
+ override fun evaluate() {
+ resultsZip =
+ ZipOutputStream(
+ FileOutputStream(
+ File(context.filesDir, "${description.testClass.simpleName}-$name.zip")
+ )
+ )
+ try {
+ base.evaluate() // This will run the test.
+ } finally {
+ resultsZip?.close()
+ }
+ }
+ }
+ }
+
+ fun write(file: File) {
+ if (resultsZip !is ZipOutputStream) {
+ throw RuntimeException(
+ "Cannot save files before the test rule starts! We need the rule to start to get the name of the test"
+ )
+ }
+ resultsZip!!.let {
+ it.putNextEntry(ZipEntry(file.name))
+ FileUtils.copy(FileInputStream(file), it)
+ it.closeEntry()
+ }
+ }
+}
diff --git a/tests/src/com/android/launcher3/backuprestore/BackupAndRestoreDBSelectionTest.kt b/tests/src/com/android/launcher3/backuprestore/BackupAndRestoreDBSelectionTest.kt
index 1e54603..38fad6b 100644
--- a/tests/src/com/android/launcher3/backuprestore/BackupAndRestoreDBSelectionTest.kt
+++ b/tests/src/com/android/launcher3/backuprestore/BackupAndRestoreDBSelectionTest.kt
@@ -32,7 +32,6 @@
import com.android.launcher3.util.rule.BackAndRestoreRule
import com.android.launcher3.util.rule.setFlags
import org.junit.Before
-import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
@@ -70,7 +69,6 @@
}
@Test
- @Ignore("b/385147987")
fun oldDatabasesNotPresentAfterRestore() {
val dbController = ModelDbController(getInstrumentation().targetContext)
if (Flags.gridMigrationRefactor()) {
diff --git a/tests/src/com/android/launcher3/ui/PortraitLandscapeRunner.java b/tests/src/com/android/launcher3/ui/PortraitLandscapeRunner.java
index 41685d7..e38cfec 100644
--- a/tests/src/com/android/launcher3/ui/PortraitLandscapeRunner.java
+++ b/tests/src/com/android/launcher3/ui/PortraitLandscapeRunner.java
@@ -10,7 +10,6 @@
import com.android.launcher3.LauncherPrefs;
import com.android.launcher3.tapl.TestHelpers;
import com.android.launcher3.util.rule.FailureWatcher;
-import com.android.launcher3.util.window.WindowManagerProxy;
import org.junit.rules.TestRule;
import org.junit.runner.Description;
@@ -109,9 +108,7 @@
private boolean shouldHaveFixedLandscape(Launcher launcher) {
return Flags.oneGridSpecs()
&& !launcher.getDeviceProfile().isTablet
- && !launcher.getDeviceProfile().isMultiDisplay
- && WindowManagerProxy.INSTANCE.get(mTest.mTargetContext)
- .isTaskbarDrawnInProcess();
+ && !launcher.getDeviceProfile().isMultiDisplay;
}
};
}
diff --git a/tests/tapl/com/android/launcher3/tapl/OverviewTask.java b/tests/tapl/com/android/launcher3/tapl/OverviewTask.java
index 8fbb5e3..02c6630 100644
--- a/tests/tapl/com/android/launcher3/tapl/OverviewTask.java
+++ b/tests/tapl/com/android/launcher3/tapl/OverviewTask.java
@@ -73,16 +73,18 @@
return getCombinedSplitTaskHeight();
}
- UiObject2 taskSnapshot1 = findObjectInTask((isDesktop() ? DESKTOP : DEFAULT).snapshotRes);
- return taskSnapshot1.getVisibleBounds().height();
+ if (isDesktop()) {
+ return getTaskSnapshot(DESKTOP).getVisibleBounds().height();
+ }
+ return getTaskSnapshot(DEFAULT).getVisibleBounds().height();
}
/**
* Calculates the visible height for split tasks, containing 2 snapshot tiles and a divider.
*/
private int getCombinedSplitTaskHeight() {
- UiObject2 taskSnapshot1 = findObjectInTask(SPLIT_TOP_OR_LEFT.snapshotRes);
- UiObject2 taskSnapshot2 = findObjectInTask(SPLIT_BOTTOM_OR_RIGHT.snapshotRes);
+ UiObject2 taskSnapshot1 = getTaskSnapshot(SPLIT_TOP_OR_LEFT);
+ UiObject2 taskSnapshot2 = getTaskSnapshot(SPLIT_BOTTOM_OR_RIGHT);
// If the split task is partly off screen, taskSnapshot1 can be invisible.
if (taskSnapshot1 == null) {
@@ -97,34 +99,6 @@
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;
}
@@ -142,6 +116,22 @@
}
/**
+ * 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() {
@@ -304,17 +294,13 @@
}
}
- 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 = findObjectInTask(overviewTaskContainer.snapshotRes).getContentDescription();
+ String actual = getTaskSnapshot(overviewTaskContainer).getContentDescription();
if (actual == null && expected == null) {
return true;
}
@@ -360,19 +346,19 @@
*/
public enum OverviewTaskContainer {
// The main task when the task is not split.
- DEFAULT("snapshot", "icon"),
+ DEFAULT("task_content_view", "icon"),
// The first task in split task.
- SPLIT_TOP_OR_LEFT("snapshot", "icon"),
+ SPLIT_TOP_OR_LEFT("task_content_view", "icon"),
// The second task in split task.
- SPLIT_BOTTOM_OR_RIGHT("bottomright_snapshot", "bottomRight_icon"),
+ SPLIT_BOTTOM_OR_RIGHT("bottomright_task_content_view", "bottomRight_icon"),
// The desktop task.
DESKTOP("background", "icon");
- public final String snapshotRes;
+ public final String taskContentViewRes;
public final String iconAppRes;
- OverviewTaskContainer(String snapshotRes, String iconAppRes) {
- this.snapshotRes = snapshotRes;
+ OverviewTaskContainer(String taskContentViewRes, String iconAppRes) {
+ this.taskContentViewRes = taskContentViewRes;
this.iconAppRes = iconAppRes;
}
}
diff --git a/tests/tapl/com/android/launcher3/tapl/Workspace.java b/tests/tapl/com/android/launcher3/tapl/Workspace.java
index 4230643..68c7049 100644
--- a/tests/tapl/com/android/launcher3/tapl/Workspace.java
+++ b/tests/tapl/com/android/launcher3/tapl/Workspace.java
@@ -58,7 +58,7 @@
*/
public final class Workspace extends Home {
private static final int FLING_STEPS = 10;
- private static final int DEFAULT_DRAG_STEPS = 15;
+ private static final int DEFAULT_DRAG_STEPS = 20;
private static final String DROP_BAR_RES_ID = "drop_target_bar";
private static final String DELETE_TARGET_TEXT_ID = "delete_target_text";
private static final String UNINSTALL_TARGET_TEXT_ID = "uninstall_target_text";
@@ -609,7 +609,7 @@
launcher,
launchable,
destSupplier,
- /* isDecelerating= */ false,
+ /* isDecelerating= */ !isDraggingToFolder,
() -> launcher.expectEvent(TestProtocol.SEQUENCE_MAIN, LONG_CLICK_EVENT),
/* expectDropEvents= */ null,
/* startsActivity = */ false,
@@ -682,7 +682,7 @@
launcher.movePointer(dragStart, targetDest,
DEFAULT_DRAG_STEPS, isDecelerating, downTime, SystemClock.uptimeMillis(),
- true, LauncherInstrumentation.GestureScope.DONT_EXPECT_PILFER);
+ !isDraggingToFolder, LauncherInstrumentation.GestureScope.DONT_EXPECT_PILFER);
dropDraggedIcon(launcher, targetDest, downTime, expectDropEvents, startsActivity);
}