Merge "Introduce `SingleTask` and `SplitTask`" into main
diff --git a/aconfig/launcher.aconfig b/aconfig/launcher.aconfig
index 06809d7..1726eca 100644
--- a/aconfig/launcher.aconfig
+++ b/aconfig/launcher.aconfig
@@ -564,3 +564,23 @@
purpose: PURPOSE_BUGFIX
}
}
+
+flag {
+ name: "restore_archived_shortcuts"
+ namespace: "launcher"
+ description: "Makes sure pre-archived pinned shortcuts also get restored"
+ bug: "375414891"
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
+}
+
+flag {
+ name: "restore_archived_app_icons_from_db"
+ namespace: "launcher"
+ description: "Restores pre-archived icons from db when available, mimicing promise icons"
+ bug: "391913214"
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
+}
diff --git a/go/quickstep/res/values-fa/strings.xml b/go/quickstep/res/values-fa/strings.xml
index 8453d4e..f0e4a57 100644
--- a/go/quickstep/res/values-fa/strings.xml
+++ b/go/quickstep/res/values-fa/strings.xml
@@ -5,7 +5,7 @@
<string name="action_listen" msgid="2370304050784689486">"گوش دادن"</string>
<string name="action_translate" msgid="8028378961867277746">"ترجمه"</string>
<string name="action_search" msgid="6269564710943755464">"لنز"</string>
- <string name="dialog_acknowledge" msgid="2804025517675853172">"متوجهام"</string>
+ <string name="dialog_acknowledge" msgid="2804025517675853172">"متوجهم"</string>
<string name="dialog_cancel" msgid="6464336969134856366">"لغو"</string>
<string name="dialog_settings" msgid="6564397136021186148">"تنظیمات"</string>
<string name="niu_actions_confirmation_title" msgid="3863451714863526143">"ترجمه نوشتار روی صفحهنمایش یا گوش دادن به آن"</string>
diff --git a/quickstep/AndroidManifest.xml b/quickstep/AndroidManifest.xml
index 201c5f6..5ca7143 100644
--- a/quickstep/AndroidManifest.xml
+++ b/quickstep/AndroidManifest.xml
@@ -119,6 +119,7 @@
android:autoRemoveFromRecents="true"
android:excludeFromRecents="true"
android:theme="@style/GestureTutorialActivity"
+ android:label="@string/gesture_tutorial_title"
android:exported="true"
android:configChanges="orientation">
<intent-filter>
diff --git a/quickstep/dagger/com/android/launcher3/dagger/AppModule.kt b/quickstep/dagger/com/android/launcher3/dagger/AppModule.kt
new file mode 100644
index 0000000..29586c4
--- /dev/null
+++ b/quickstep/dagger/com/android/launcher3/dagger/AppModule.kt
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.launcher3.dagger
+
+import dagger.Module
+
+/**
+ * Module containing bindings for the final derivative app, an implementation of this module should
+ * be included in the final app code.
+ */
+@Module abstract class AppModule {}
diff --git a/quickstep/res/values-af/strings.xml b/quickstep/res/values-af/strings.xml
index b9174a1..eba4ae6 100644
--- a/quickstep/res/values-af/strings.xml
+++ b/quickstep/res/values-af/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"Programvoorstelle is geaktiveer"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"Programvoorstelle is gedeaktiveer"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Voorspelde app: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Draai jou toestel"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Draai asseblief jou toestel om die tutoriaal oor gebaarnavigasie te voltooi"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Maak seker dat jy van die rand heel regs of heel links af swiep"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"vou <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g> uit"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"vou <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g> in"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"Omkring en Soek"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-am/strings.xml b/quickstep/res/values-am/strings.xml
index 086b98e..019850d 100644
--- a/quickstep/res/values-am/strings.xml
+++ b/quickstep/res/values-am/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"የመተግበሪያ አስተያየት ጥቆማዎች ነቅቷል"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"የመተግበሪያ አስተያየቶች ቦዝነዋል"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"የተገመተው መተግበሪያ፦ <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"መሣሪያዎን ያሽከርክሩ"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"የእጅ ምልክት ዳሰሳ አጋዥ ሥልጠናን ለማጠናቀቅ እባክዎ መሣሪያዎን ያሽከርክሩ"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"ከቀኝ ጥግ ወይም ከግራ ጥግ ጠርዝ ጀምሮ ማንሸራተትዎን ያረጋግጡ"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>ን ዘርጋ"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>ን ሰብስብ"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"ለመፈለግ ክበብ"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-ar/strings.xml b/quickstep/res/values-ar/strings.xml
index 3b09a31..a77335f 100644
--- a/quickstep/res/values-ar/strings.xml
+++ b/quickstep/res/values-ar/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"تم تفعيل ميزة \"التطبيقات المقترحة\"."</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"ميزة \"التطبيقات المقترحة\" غير مفعّلة."</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"التطبيق المتوقع: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"يُرجى تدوير الجهاز"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"يُرجى تدوير جهازك لإكمال الدليل التوجيهي للتنقُّل بالإيماءات."</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"تأكَّد من التمرير سريعًا من أقصى الحافة اليسرى أو اليمنى."</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"توسيع <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"تصغير <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"دائرة البحث"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-as/strings.xml b/quickstep/res/values-as/strings.xml
index 77a470a..a7a66e9 100644
--- a/quickstep/res/values-as/strings.xml
+++ b/quickstep/res/values-as/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"এপৰ পৰামৰ্শসমূহ সক্ষম কৰা আছে"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"এপৰ পৰামৰ্শসমূহ অক্ষম কৰা আছে"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"পূৰ্বানুমান কৰা এপ্: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"আপোনাৰ ডিভাইচটো ঘূৰাওক"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"আঙুলিৰ স্পৰ্শৰ নিৰ্দেশেৰে কৰা নেভিগেশ্বনৰ টিউট’ৰিয়েল শেষ কৰিবলৈ অনুগ্ৰহ কৰি আপোনাৰ ডিভাইচটো ঘূৰাওক"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"আপুনি সোঁ অথবা বাওঁ কাষৰ একেবাৰে সীমাৰ পৰা ছোৱাইপ কৰাটো নিশ্চিত কৰক"</string>
diff --git a/quickstep/res/values-az/strings.xml b/quickstep/res/values-az/strings.xml
index d72b1cf..0e0181a 100644
--- a/quickstep/res/values-az/strings.xml
+++ b/quickstep/res/values-az/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"Tətbiq təklifləri aktivdir"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"Tətbiq təklifləri deaktivdir"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Proqnozlaşdırılan tətbiq: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Cihazı fırladın"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Jest naviqasiyası təlimatını tamamlamaq üçün cihazı fırladın"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Ən sağ və ya sol kənardan sürüşdürün"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"genişləndirin: <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"yığcamlaşdırın: <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"Dairəyə alaraq axtarın"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-b+sr+Latn/strings.xml b/quickstep/res/values-b+sr+Latn/strings.xml
index cdd3e03..95767e2 100644
--- a/quickstep/res/values-b+sr+Latn/strings.xml
+++ b/quickstep/res/values-b+sr+Latn/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"Predlozi aplikacija su omogućeni"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"Predlozi aplikacija su onemogućeni"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Predviđamo aplikaciju: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Rotirajte uređaj"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Rotirajte uređaj da biste dovršili vodič za navigaciju pomoću pokreta"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Obavezno prevucite od same desne ili leve ivice"</string>
diff --git a/quickstep/res/values-be/strings.xml b/quickstep/res/values-be/strings.xml
index a0fcabc..0261c0f 100644
--- a/quickstep/res/values-be/strings.xml
+++ b/quickstep/res/values-be/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"Прапановы праграм уключаны"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"Прапановы праграм выключаны"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Праграма з падказкі: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Павярніце прыладу"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Каб пачаць азнаямленне з дапаможнікам па навігацыі жэстамі, павярніце прыладу"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Правядзіце пальцам справа налева ці злева направа ад самага краю экрана"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>: разгарнуць"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>: згарнуць"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"Абвесці для пошуку"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-bg/strings.xml b/quickstep/res/values-bg/strings.xml
index 5ef221e..660d816 100644
--- a/quickstep/res/values-bg/strings.xml
+++ b/quickstep/res/values-bg/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"Предложенията за приложения са активирани"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"Функцията „Предложения за приложения“ е деактивирана"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Предвидено приложение: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Завъртете устройството си"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Моля, завъртете устройството си, за да завършите урока за навигиране с жестове"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Трябва да плъзнете пръст от най-дясната или най-лявата част на екрана"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"разгъване на <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"свиване на <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"Търсене с ограждане"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-bn/strings.xml b/quickstep/res/values-bn/strings.xml
index e84deba..b5b0a5e 100644
--- a/quickstep/res/values-bn/strings.xml
+++ b/quickstep/res/values-bn/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"অ্যাপ সাজেশন চালু করা আছে"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"অ্যাপ সাজেশন বন্ধ করা আছে"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"আপনার প্রয়োজন হতে পারে এমন অ্যাপ: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"আপনার ডিভাইস ঘোরান"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"জেসচার নেভিগেশন টিউটোরিয়াল সম্পূর্ণ করতে আপনার ডিভাইসটি ঘোরান"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"স্ক্রিনের একেবারে ডান বা বাঁদিকের প্রান্ত থেকে সোয়াইপ করেছেন কিনা তা দেখে নিন"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g> বড় করুন"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g> আড়াল করুন"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"খোঁজার জন্য সার্কেল বানান"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-bs/strings.xml b/quickstep/res/values-bs/strings.xml
index d6f43bc..69a5cdb 100644
--- a/quickstep/res/values-bs/strings.xml
+++ b/quickstep/res/values-bs/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"Prijedlozi aplikacija su omogućeni"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"Prijedlozi aplikacija su onemogućeni"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Predviđena aplikacija: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Rotirajte uređaj"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Rotirajte uređaj da završite vodič za navigaciju pokretima"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Prevucite s krajnjeg desnog ili lijevog ruba"</string>
@@ -153,6 +155,6 @@
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"sužavanje oblačića <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"Pretraživanje zaokruživanjem"</string>
<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>
+ <string name="header_default_app_title" msgid="8308052350689531566">"Naslov aplikacije"</string>
+ <string name="header_close_icon_description" msgid="5400033616675911319">"Dugme za zatvaranje"</string>
</resources>
diff --git a/quickstep/res/values-ca/strings.xml b/quickstep/res/values-ca/strings.xml
index 04c9a07..cc643a6 100644
--- a/quickstep/res/values-ca/strings.xml
+++ b/quickstep/res/values-ca/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"Els suggeriments d\'aplicacions estan activats"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"Els suggeriments d\'aplicacions estan desactivats"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Predicció d\'aplicació: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Gira el dispositiu"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Gira el dispositiu per completar el tutorial de navegació amb gestos"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Assegura\'t de lliscar des de l\'extrem dret o esquerre de la pantalla."</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"desplega <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"replega <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"Encercla per cercar"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-cs/strings.xml b/quickstep/res/values-cs/strings.xml
index 82a9ca0..eb0e8c8 100644
--- a/quickstep/res/values-cs/strings.xml
+++ b/quickstep/res/values-cs/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"Návrhy aplikací jsou povoleny"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"Návrhy aplikací jsou zakázány"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Předpokládaná aplikace: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Otočte zařízení"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Pokud chcete dokončit výukový program navigace gesty, otočte zařízení"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Přejeďte prstem z úplného pravého nebo levého okraje obrazovky"</string>
@@ -134,7 +136,7 @@
<string name="taskbar_a11y_hidden_with_bubbles_title" msgid="7397395993149508087">"Panel a bubliny jsou skryty"</string>
<string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Navigační panel"</string>
<string name="always_show_taskbar" msgid="3608801276107751229">"Vždy zobrazovat panel aplikací"</string>
- <string name="change_navigation_mode" msgid="9088393078736808968">"Změnit režim navigace"</string>
+ <string name="change_navigation_mode" msgid="9088393078736808968">"Změnit navigační režim"</string>
<string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Rozdělovač panelu aplikací"</string>
<string name="taskbar_overflow_a11y_title" msgid="7960342079198820179">"Přetečení panelu aplikací"</string>
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Přesunout doleva nahoru"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"rozbalit <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"sbalit <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"Zakroužkuj a hledej"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-da/strings.xml b/quickstep/res/values-da/strings.xml
index f13338a..a7b7d04 100644
--- a/quickstep/res/values-da/strings.xml
+++ b/quickstep/res/values-da/strings.xml
@@ -23,7 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"Frit format"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"Computertilstand"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"Flyt til ekstern skærm"</string>
- <string name="recent_task_desktop" msgid="8081113562549637334">"Computer"</string>
+ <string name="recent_task_desktop" msgid="8081113562549637334">"Computertilstand"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"Ingen nye elementer"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"Indstillinger for appforbrug"</string>
<string name="recents_clear_all" msgid="5328176793634888831">"Ryd alt"</string>
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"Appforslag er aktiveret"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"Appforslag er deaktiveret"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"App, du forventes at skulle bruge: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Rotér din enhed"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Rotér enheden for at gennemgå vejledningen i navigation med bevægelser"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Stryg fra kanten yderst til højre eller venstre"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"udvid <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"skjul <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"Circle to Search"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-de/strings.xml b/quickstep/res/values-de/strings.xml
index 204ecb5..dd7b467 100644
--- a/quickstep/res/values-de/strings.xml
+++ b/quickstep/res/values-de/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"Funktion „App-Vorschläge“ aktiviert"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"Funktion \"App-Vorschläge\" deaktiviert"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Vorgeschlagene App: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Gerät drehen"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Bitte drehe dein Gerät, um die Anleitung für die Bedienung über Gesten abzuschließen"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Wische vom äußersten rechten oder linken Displayrand"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"„<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>“ maximieren"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"„<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>“ minimieren"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"Circle to Search"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-el/strings.xml b/quickstep/res/values-el/strings.xml
index 0f22562..058d7ba 100644
--- a/quickstep/res/values-el/strings.xml
+++ b/quickstep/res/values-el/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"Οι προτεινόμενες εφαρμογές ενεργοποιήθηκαν"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"Οι προτεινόμενες εφαρμογές είναι απενεργοποιημένες"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Εφαρμογή από πρόβλεψη: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Περιστρέψτε τη συσκευή σας"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Περιστρέψτε τη συσκευή σας για να ολοκληρώσετε τον οδηγό πλοήγησης με κινήσεις"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Φροντίστε να σύρετε από το άκρο της δεξιάς ή της αριστερής πλευράς."</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"ανάπτυξη <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"σύμπτυξη <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"Κυκλώστε για αναζήτηση"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-en-rAU/strings.xml b/quickstep/res/values-en-rAU/strings.xml
index 692fd6b..506e36d 100644
--- a/quickstep/res/values-en-rAU/strings.xml
+++ b/quickstep/res/values-en-rAU/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"App suggestions enabled"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"App suggestions are disabled"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Predicted app: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Rotate your device"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Please rotate your device to complete the gesture navigation tutorial"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Make sure you swipe from the far-right or far-left edge"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"expand <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"collapse <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"Circle to Search"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-en-rCA/strings.xml b/quickstep/res/values-en-rCA/strings.xml
index 259dff6..f91f4ee 100644
--- a/quickstep/res/values-en-rCA/strings.xml
+++ b/quickstep/res/values-en-rCA/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"App suggestions enabled"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"App suggestions are disabled"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Predicted app: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Rotate your device"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Please rotate your device to complete the gesture navigation tutorial"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Make sure you swipe from the far-right or far-left edge"</string>
diff --git a/quickstep/res/values-en-rGB/strings.xml b/quickstep/res/values-en-rGB/strings.xml
index 692fd6b..506e36d 100644
--- a/quickstep/res/values-en-rGB/strings.xml
+++ b/quickstep/res/values-en-rGB/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"App suggestions enabled"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"App suggestions are disabled"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Predicted app: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Rotate your device"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Please rotate your device to complete the gesture navigation tutorial"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Make sure you swipe from the far-right or far-left edge"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"expand <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"collapse <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"Circle to Search"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-en-rIN/strings.xml b/quickstep/res/values-en-rIN/strings.xml
index 692fd6b..506e36d 100644
--- a/quickstep/res/values-en-rIN/strings.xml
+++ b/quickstep/res/values-en-rIN/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"App suggestions enabled"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"App suggestions are disabled"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Predicted app: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Rotate your device"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Please rotate your device to complete the gesture navigation tutorial"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Make sure you swipe from the far-right or far-left edge"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"expand <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"collapse <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"Circle to Search"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-es-rUS/strings.xml b/quickstep/res/values-es-rUS/strings.xml
index f9c9b83..dd969d7 100644
--- a/quickstep/res/values-es-rUS/strings.xml
+++ b/quickstep/res/values-es-rUS/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"Sugerencias de apps habilitadas"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"Las sugerencias de aplicaciones están inhabilitadas"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Predicción de app: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Rota el dispositivo"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Rota el dispositivo para completar el instructivo de la navegación por gestos"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Asegúrate de deslizar desde el extremo derecho o izquierdo"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"expandir <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"contraer <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"Busca con un círculo"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-es/strings.xml b/quickstep/res/values-es/strings.xml
index 8b4d1ef..1da35e6 100644
--- a/quickstep/res/values-es/strings.xml
+++ b/quickstep/res/values-es/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"Sugerencias de aplicaciones habilitadas"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"Las sugerencias de aplicaciones están inhabilitadas"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Aplicación sugerida: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Gira el dispositivo"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Gira el dispositivo para completar el tutorial de navegación por gestos"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Asegúrate de deslizar desde el borde derecho o izquierdo de la pantalla"</string>
@@ -139,7 +141,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 arriba/a la izquierda"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Mover abajo/a la derecha"</string>
- <string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{aplicación más}other{aplicaciones más}}"</string>
+ <string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{app más}other{apps más}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Ordenador"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> y <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Burbuja"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"desplegar <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"contraer <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"Rodea para buscar"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-et/strings.xml b/quickstep/res/values-et/strings.xml
index 453c39c..70acc52 100644
--- a/quickstep/res/values-et/strings.xml
+++ b/quickstep/res/values-et/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"Rakenduste soovitused on lubatud"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"Rakenduste soovitused on keelatud"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Ennustatud rakendus: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Pöörake seadet"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Pöörake seadet, et liigutustega navigeerimise õpetused lõpetada"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Pühkige kindlasti parem- või vasakpoolsest servast"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"Toiminguriba <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g> laiendamine"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"Toiminguriba <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g> ahendamine"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"Ring otsimiseks"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-eu/strings.xml b/quickstep/res/values-eu/strings.xml
index 5089748..af5962a 100644
--- a/quickstep/res/values-eu/strings.xml
+++ b/quickstep/res/values-eu/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"Gaituta daude aplikazioen iradokizunak"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"Desgaituta daude aplikazioen iradokizunak"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Iragarritako aplikazioa: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Biratu gailua"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Keinu bidezko nabigazioaren tutoriala osatzeko, biratu gailua"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Ziurtatu hatza pantailaren eskuineko edo ezkerreko ertzetik hasten zarela pasatzen"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"zabaldu <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"tolestu <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"Inguratu bilatzeko"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-fa/strings.xml b/quickstep/res/values-fa/strings.xml
index aa12b9e..40469f5 100644
--- a/quickstep/res/values-fa/strings.xml
+++ b/quickstep/res/values-fa/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"«پیشنهاد برنامه» فعال است"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"«پیشنهاد برنامه» غیرفعال است"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"برنامه پیشبینیشده: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"دستگاهتان را بچرخانید"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"لطفاً برای تکمیل آموزش گامبهگام پیمایش اشارهای، دستگاهتان را بچرخانید"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"دقت کنید که از انتهای لبه سمت راست یا سمت چپ تند بکشید"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"ازهم باز کردن <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"جمع کردن <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"حلقه جستجو"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-fi/strings.xml b/quickstep/res/values-fi/strings.xml
index 7d28202..6907e49 100644
--- a/quickstep/res/values-fi/strings.xml
+++ b/quickstep/res/values-fi/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"Sovellusehdotukset käytössä"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"Sovellusehdotukset on poistettu käytöstä"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Ennakoitu sovellus: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Käännä laite"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Käännä laite, niin voit katsoa esittelyn eleillä navigoinnista"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Pyyhkäise aivan oikeasta tai vasemmasta reunasta"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"laajenna <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"tiivistä <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"Circle to Search"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-fr-rCA/strings.xml b/quickstep/res/values-fr-rCA/strings.xml
index 81146e0..d57479d 100644
--- a/quickstep/res/values-fr-rCA/strings.xml
+++ b/quickstep/res/values-fr-rCA/strings.xml
@@ -21,9 +21,9 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="recent_task_option_pin" msgid="7929860679018978258">"Épingler"</string>
<string name="recent_task_option_freeform" msgid="48863056265284071">"Forme libre"</string>
- <string name="recent_task_option_desktop" msgid="8280879717125435668">"Ordinateur de bureau"</string>
+ <string name="recent_task_option_desktop" msgid="8280879717125435668">"Bureau"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"Passer à un écran externe"</string>
- <string name="recent_task_desktop" msgid="8081113562549637334">"Ordinateur de bureau"</string>
+ <string name="recent_task_desktop" msgid="8081113562549637334">"Bureau"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"Aucun élément récent"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"Paramètres d\'utilisation de l\'appli"</string>
<string name="recents_clear_all" msgid="5328176793634888831">"Tout effacer"</string>
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"Les suggestions d\'applis sont activées"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"Les suggestions d\'applis sont désactivées"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Appli prédite : <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Faites pivoter votre appareil"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Veuillez faire pivoter votre appareil pour terminer le tutoriel de navigation par gestes"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Assurez-vous de balayer l\'écran à partir de l\'extrémité droite ou gauche"</string>
@@ -140,7 +142,7 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Déplacer vers le coin supérieur gauche de l\'écran"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Déplacer vers le coin inférieur droit de l\'écran"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{autre appli}one{autre appli}other{autres applis}}"</string>
- <string name="quick_switch_desktop" msgid="8393802056024499749">"Ordinateur de bureau"</string>
+ <string name="quick_switch_desktop" msgid="8393802056024499749">"Bureau"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> et <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Bulle"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Bulle à développer"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"Développer <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"Réduire <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"Encercler et rechercher"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-fr/strings.xml b/quickstep/res/values-fr/strings.xml
index 3b7c269..b185e0c 100644
--- a/quickstep/res/values-fr/strings.xml
+++ b/quickstep/res/values-fr/strings.xml
@@ -21,9 +21,9 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="recent_task_option_pin" msgid="7929860679018978258">"Épingler"</string>
<string name="recent_task_option_freeform" msgid="48863056265284071">"Format libre"</string>
- <string name="recent_task_option_desktop" msgid="8280879717125435668">"Ordinateur"</string>
+ <string name="recent_task_option_desktop" msgid="8280879717125435668">"Mode ordinateur"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"Déplacer vers l\'écran externe"</string>
- <string name="recent_task_desktop" msgid="8081113562549637334">"Ordinateur"</string>
+ <string name="recent_task_desktop" msgid="8081113562549637334">"Mode ordinateur"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"Aucun élément récent"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"Paramètres de consommation de l\'application"</string>
<string name="recents_clear_all" msgid="5328176793634888831">"Tout effacer"</string>
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"Suggestions d\'applications activées"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"Les suggestions d\'applications sont désactivées"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Application prédite : <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Faire pivoter l\'appareil"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Veuillez faire pivoter votre appareil pour effectuer le tutoriel de navigation par gestes"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Veillez à bien balayer l\'écran depuis le bord gauche ou droit"</string>
@@ -140,7 +142,7 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Déplacer en haut ou à gauche"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Déplacer en bas ou à droite"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{autre application}one{autre application}other{autres applications}}"</string>
- <string name="quick_switch_desktop" msgid="8393802056024499749">"Ordinateur"</string>
+ <string name="quick_switch_desktop" msgid="8393802056024499749">"Mode ordinateur"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> et <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Bulle"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Dépassement"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"Développer <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"Réduire <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"Entourer pour chercher"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-gl/strings.xml b/quickstep/res/values-gl/strings.xml
index f3397e4..8990a5f 100644
--- a/quickstep/res/values-gl/strings.xml
+++ b/quickstep/res/values-gl/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"As suxestións de aplicacións están activadas"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"As suxestións de aplicacións están desactivadas"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Aplicación predita: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Xira o dispositivo"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Xira o dispositivo para completar o titorial de navegación con xestos"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Asegúrate de pasar o dedo desde o bordo dereito ou esquerdo"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"despregar <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"contraer <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"Rodear para buscar"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-gu/strings.xml b/quickstep/res/values-gu/strings.xml
index f8c30e8..cb8a35a 100644
--- a/quickstep/res/values-gu/strings.xml
+++ b/quickstep/res/values-gu/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"ઍપના સુઝાવો ચાલુ છે"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"ઍપના સુઝાવો બંધ છે"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"પૂર્વાનુમાનિત ઍપ: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"તમારા ડિવાઇસને ફેરવો"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"સંકેતથી નૅવિગેશન ટ્યૂટૉરિઅલ પૂર્ણ કરવા માટે કૃપા કરીને તમારા ડિવાઇસને ફેરવો"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"ખાતરી કરો કે તમે એકદમ દૂરની જમણી કે ડાબી કિનારીએથી સ્વાઇપ કરો છો"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g> મોટો કરો"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g> નાનો કરો"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"શોધવા માટે વર્તુળ દોરો"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-hi/strings.xml b/quickstep/res/values-hi/strings.xml
index 2ee441a..b7ca582 100644
--- a/quickstep/res/values-hi/strings.xml
+++ b/quickstep/res/values-hi/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"सुझाए गए ऐप्लिकेशन की सुविधा चालू है"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"सुझाए गए ऐप्लिकेशन की सुविधा बंद है"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"सुझाया गया ऐप्लिकेशन: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"अपना डिवाइस घुमाएं"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"जेस्चर वाले नेविगेशन से जुड़े ट्यूटोरियल को पूरा करने के लिए अपने डिवाइस को घुमाएं"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"स्क्रीन पर बिलकुल दाएं या बाएं किनारे से स्वाइप करें"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g> को बड़ा करें"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g> को छोटा करें"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"सर्कल बनाकर ढूंढें"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-hr/strings.xml b/quickstep/res/values-hr/strings.xml
index 77c9f3d..cb7d9b9 100644
--- a/quickstep/res/values-hr/strings.xml
+++ b/quickstep/res/values-hr/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"Predlaganje apl. omogućeno"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"Predlaganje apl. onemogućeno"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Predviđena aplikacija: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Zakrenite uređaj"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Zakrenite uređaj da biste dovršili vodič o navigaciji pokretima"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Prijeđite prstom od krajnjeg desnog ili krajnjeg lijevog ruba"</string>
diff --git a/quickstep/res/values-hu/strings.xml b/quickstep/res/values-hu/strings.xml
index 0d1ac57..184fef0 100644
--- a/quickstep/res/values-hu/strings.xml
+++ b/quickstep/res/values-hu/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"Alkalmazásjavaslatok engedélyezve"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"Alkalmazásjavaslatok letiltva"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Várható alkalmazás: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Forgassa el eszközét"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Forgassa el eszközét a kézmozdulatokkal való navigáció útmutatójának befejezéséhez"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Csúsztasson a képernyő jobb vagy bal széléről."</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g> kibontása"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g> összecsukása"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"Bekarikázással keresés"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-hy/strings.xml b/quickstep/res/values-hy/strings.xml
index 0db64d1..8da1a6d 100644
--- a/quickstep/res/values-hy/strings.xml
+++ b/quickstep/res/values-hy/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"«Առաջարկվող հավելվածներ» գործառույթը միացված է"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"«Առաջարկվող հավելվածներ» գործառույթն անջատված է"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Առաջարկվող հավելված՝ <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Պտտեք սարքը"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Պտտեք սարքը՝ ժեստերով նավիգացիայի ուղեցույցն ավարտելու համար"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Համոզվեք, որ մատը սահեցնում եք էկրանի աջ կամ ձախ եզրից"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>. ծավալել"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>. ծալել"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"Շրջագծել որոնելու համար"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-in/strings.xml b/quickstep/res/values-in/strings.xml
index bb6621f..eb592db 100644
--- a/quickstep/res/values-in/strings.xml
+++ b/quickstep/res/values-in/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"Saran aplikasi diaktifkan"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"Saran aplikasi dinonaktifkan"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Aplikasi yang diprediksi: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Putar perangkat Anda"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Putar perangkat Anda untuk menyelesaikan tutorial navigasi gestur"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Pastikan Anda menggeser dari tepi ujung kanan atau ujung kiri"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"luaskan <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"ciutkan <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"Lingkari untuk Menelusuri"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-is/strings.xml b/quickstep/res/values-is/strings.xml
index cfbae74..3500001 100644
--- a/quickstep/res/values-is/strings.xml
+++ b/quickstep/res/values-is/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"Kveikt á tillögum að forritum"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"Slökkt er á tillögðum forritum"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Tillaga að forriti: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Snúðu tækinu"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Snúðu tækinu til að ljúka leiðsögn um bendingastjórnun"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Passaðu að strjúka frá jaðri hægri eða vinstri brúnar"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"stækka <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"minnka <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"Circle to Search"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-it/strings.xml b/quickstep/res/values-it/strings.xml
index 1dcf4ed..b8fa813 100644
--- a/quickstep/res/values-it/strings.xml
+++ b/quickstep/res/values-it/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"La funzionalità app suggerite è attiva"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"La funzionalità app suggerite è disattivata"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"App prevista: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Ruota il dispositivo"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Ruota il dispositivo per completare il tutorial relativo alla navigazione tramite gesti"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Assicurati di scorrere dal bordo all\'estrema destra o all\'estrema sinistra"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"espandi <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"comprimi <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"Cerchia e Cerca"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-iw/strings.xml b/quickstep/res/values-iw/strings.xml
index 3f951ba..c6fc845 100644
--- a/quickstep/res/values-iw/strings.xml
+++ b/quickstep/res/values-iw/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"התכונה \'הצעות לאפליקציות\' מופעלת"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"ההצעות לאפליקציות מושבתות"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"האפליקציות החזויות: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"צריך לסובב את המכשיר"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"צריך לסובב את המכשיר כדי להשלים את המדריך לניווט באמצעות תנועות"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"חשוב להחליק מהקצה השמאלי או הימני"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"הרחבה של <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"כיווץ של <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"מקיפים ומחפשים"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-ja/strings.xml b/quickstep/res/values-ja/strings.xml
index 81e967c..5fdcf4a 100644
--- a/quickstep/res/values-ja/strings.xml
+++ b/quickstep/res/values-ja/strings.xml
@@ -23,7 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"フリーフォーム"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"デスクトップ"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"外部ディスプレイに移動する"</string>
- <string name="recent_task_desktop" msgid="8081113562549637334">"パソコン"</string>
+ <string name="recent_task_desktop" msgid="8081113562549637334">"デスクトップ"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"最近のアイテムはありません"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"アプリの使用状況の設定"</string>
<string name="recents_clear_all" msgid="5328176793634888831">"すべてクリア"</string>
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"アプリの候補表示が有効です"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"アプリの候補は無効です"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"予測されたアプリ: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"デバイスを回転してください"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"ジェスチャー ナビゲーションのチュートリアルを終了するには、デバイスを回転してください"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"右端または左端からスワイプしてください"</string>
@@ -140,7 +142,7 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"上 / 左に移動"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"下 / 右に移動"</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_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>
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"ふきだし"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"オーバーフロー"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>を開きます"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>を閉じます"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"かこって検索"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-ka/strings.xml b/quickstep/res/values-ka/strings.xml
index 1ee4b9e..01becd7 100644
--- a/quickstep/res/values-ka/strings.xml
+++ b/quickstep/res/values-ka/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"აპის შეთავაზებები ჩართულია"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"აპის შეთავაზებები გათიშულია"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"ნაწინასწარმეტყველები აპი: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"შეატრიალეთ მოწყობილობა"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"ჟესტებით ნავიგაციის სახელმძღვანელოს დასასრულებლად შეატრიალეთ თქვენი მოწყობილობა"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"გადაფურცლეთ უკიდურესი მარჯვენა ან მარცხენა ბოლოდან"</string>
diff --git a/quickstep/res/values-kk/strings.xml b/quickstep/res/values-kk/strings.xml
index 37d28f1..3280908 100644
--- a/quickstep/res/values-kk/strings.xml
+++ b/quickstep/res/values-kk/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"\"Қолданба ұсыныстары\" функциясы қосылды."</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"\"Қолданба ұсыныстары\" функциясы өшірулі."</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Болжалды қолданба: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Құрылғыны бұрыңыз"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Қимылмен басқару нұсқаулығын аяқтау үшін құрылғыны бұрыңыз."</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Экранның оң немесе сол жиегінен сырғытыңыз."</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>: жаю"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>: жию"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"Қоршау арқылы іздеу"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-km/strings.xml b/quickstep/res/values-km/strings.xml
index 7e1b0f2..d05ef16 100644
--- a/quickstep/res/values-km/strings.xml
+++ b/quickstep/res/values-km/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"បានបើកការណែនាំកម្មវិធី"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"បានបិទការណែនាំកម្មវិធី"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"កម្មវិធីដែលបានព្យាករ៖ <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"បង្វិលឧបករណ៍របស់អ្នក"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"សូមបង្វិលឧបករណ៍របស់អ្នក ដើម្បីបញ្ចប់មេរៀនអំពីការរុករកដោយប្រើចលនា"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"ត្រូវប្រាកដថាអ្នកអូសពីគែមខាងស្ដាំ ឬខាងឆ្វេង"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"ពង្រីក <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"បង្រួម <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"គូររង្វង់ដើម្បីស្វែងរក"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-kn/strings.xml b/quickstep/res/values-kn/strings.xml
index 1df7dc4..3240b2a 100644
--- a/quickstep/res/values-kn/strings.xml
+++ b/quickstep/res/values-kn/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"ಆ್ಯಪ್ ಸಲಹೆಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"ಆ್ಯಪ್ ಸಲಹೆಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"ಶಿಫಾರಸು ಮಾಡಿದ ಆ್ಯಪ್: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"ನಿಮ್ಮ ಸಾಧನವನ್ನು ತಿರುಗಿಸಿ"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"ಗೆಸ್ಚರ್ ನ್ಯಾವಿಗೇಶನ್ ಟುಟೋರಿಯಲ್ ಅನ್ನು ಪೂರ್ಣಗೊಳಿಸಲು, ನಿಮ್ಮ ಸಾಧನವನ್ನು ತಿರುಗಿಸಿ"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"ನೀವು ಬಲಕೊನೆಯ ಅಂಚಿನಿಂದ ಅಥವಾ ಎಡಕೊನೆಯ ಅಂಚಿನಿಂದ ಸ್ವೈಪ್ ಮಾಡುತ್ತಿದ್ದೀರಿ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g> ಅನ್ನು ವಿಸ್ತೃತಗೊಳಿಸಿ"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g> ಅನ್ನು ಕುಗ್ಗಿಸಿ"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"ಹುಡುಕಲು ಒಂದು ಸರ್ಕಲ್ ರಚಿಸಿ"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-ko/strings.xml b/quickstep/res/values-ko/strings.xml
index 4bb2c8f..c8b8674 100644
--- a/quickstep/res/values-ko/strings.xml
+++ b/quickstep/res/values-ko/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"앱 제안이 사용 설정됨"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"앱 제안이 사용 중지됨"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"예상 앱: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"기기를 회전시키세요"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"동작 탐색 튜토리얼을 완료하려면 기기를 회전시키세요."</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"오른쪽 또는 왼쪽 가장자리 끝에서 스와이프하세요."</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g> 펼치기"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g> 접기"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"서클 투 서치"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-ky/strings.xml b/quickstep/res/values-ky/strings.xml
index 19f480c..6dafcd0 100644
--- a/quickstep/res/values-ky/strings.xml
+++ b/quickstep/res/values-ky/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"Сунушталган колдонмолор функциясы иштетилди"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"Сунушталган колдонмолор функциясы өчүрүлгөн"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Божомолдонгон колдонмо: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Түзмөгүңүздү буруңуз"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Жаңсап чабыттоо үйрөткүчүнүн аягына чыгуу үчүн түзмөктү буруңуз"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Экранды эң четинен оңдон солго же солдон оңго карай сүрүңүз"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g> жайып көрсөтүү"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g> жыйыштыруу"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"Тегеректеп издөө"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-lo/strings.xml b/quickstep/res/values-lo/strings.xml
index 8c826e2..a13da69 100644
--- a/quickstep/res/values-lo/strings.xml
+++ b/quickstep/res/values-lo/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"ເປີດການນຳໃຊ້ການແນະນຳແອັບແລ້ວ"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"ປິດການນຳໃຊ້ການແນະນຳແອັບແລ້ວ"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"ແອັບທີ່ຄາດເດົາໄວ້: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"ໝຸນອຸປະກອນຂອງທ່ານ"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"ກະລຸນາໝຸນອຸປະກອນຂອງທ່ານເພື່ອເຮັດຕາມການສອນການນຳໃຊ້ກ່ຽວກັບການນຳທາງແບບທ່າທາງໃຫ້ສຳເລັດ"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"ກະລຸນາກວດສອບວ່າທ່ານປັດຈາກຂອບຂວາສຸດ ຫຼື ຊ້າຍສຸດ"</string>
diff --git a/quickstep/res/values-lt/strings.xml b/quickstep/res/values-lt/strings.xml
index 784f353..7334b0a 100644
--- a/quickstep/res/values-lt/strings.xml
+++ b/quickstep/res/values-lt/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"Siūlomų programų funkcija įgalinta"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"Siūlomų programų funkcija išjungta"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Numatoma programa: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Pasukite įrenginį"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Pasukite įrenginį, kad pereitumėte į naršymo gestais mokomąją medžiagą"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Turite perbraukti nuo dešiniojo ar kairiojo krašto"</string>
diff --git a/quickstep/res/values-lv/strings.xml b/quickstep/res/values-lv/strings.xml
index 65cadc5..bbf45c3 100644
--- a/quickstep/res/values-lv/strings.xml
+++ b/quickstep/res/values-lv/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"Ieteicamās lietotnes ir iespējotas"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"Ieteicamās lietotnes ir atspējotas"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Prognozētā lietotne: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Pagrieziet ierīci"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Lūdzu, pagrieziet savu ierīci, lai pabeigtu žestu navigācijas apmācību."</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Jāvelk no pašas labās vai kreisās malas."</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"izvērst “<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>”"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"sakļaut “<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>”"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"Apvilkt un meklēt"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-mk/strings.xml b/quickstep/res/values-mk/strings.xml
index 50fa316..5340854 100644
--- a/quickstep/res/values-mk/strings.xml
+++ b/quickstep/res/values-mk/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"Предлозите за апликации се овозможени"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"Предлозите за апликации се оневозможени"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Предвидена апликација: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Ротирајте го уредот"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Ротирајте го уредот за да го завршите упатството за навигација со движење"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Повлечете од крајниот десен или крајниот лев раб"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"прошири <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"собери <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"Пребарување со заокружување"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-ml/strings.xml b/quickstep/res/values-ml/strings.xml
index f9018eb..d92ddbc 100644
--- a/quickstep/res/values-ml/strings.xml
+++ b/quickstep/res/values-ml/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"ആപ്പ് നിർദ്ദേശങ്ങൾ പ്രവർത്തനക്ഷമമാക്കി"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"ആപ്പ് നിർദ്ദേശങ്ങൾ പ്രവർത്തനരഹിതമാക്കി"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"പ്രവചിച്ച ആപ്പ്: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"നിങ്ങളുടെ ഉപകരണം റൊട്ടേറ്റ് ചെയ്യുക"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"ജെസ്ച്ചർ നാവിഗേഷൻ ട്യൂട്ടോറിയൽ പൂർത്തിയാക്കാൻ നിങ്ങളുടെ ഉപകരണം റൊട്ടേറ്റ് ചെയ്യുക"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"വലത്തേയറ്റത്തെയോ ഇടത്തേയറ്റത്തെയോ അരികിൽ നിന്നാണ് സ്വെെപ്പ് ചെയ്യുന്നതെന്ന് ഉറപ്പാക്കുക"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g> വികസിപ്പിക്കുക"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g> ചുരുക്കുക"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"തിരയാൻ വട്ടം വരയ്ക്കൽ"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-mn/strings.xml b/quickstep/res/values-mn/strings.xml
index bdff33a..2b335a9 100644
--- a/quickstep/res/values-mn/strings.xml
+++ b/quickstep/res/values-mn/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"Санал болгож буй аппуудыг идэвхжүүлсэн"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"Санал болгож буй аппуудыг идэвхгүй болгосон"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Таамаглаж буй апп: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Төхөөрөмжөө эргүүлэх"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Зангааны навигацын практик хичээлийг дуусгахын тулд төхөөрөмжөө эргүүлнэ үү"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Та баруун зах эсвэл зүүн захын ирмэгээс шударна уу"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>-г дэлгэх"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>-г хураах"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"Тойруулж зураад хай"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-mr/strings.xml b/quickstep/res/values-mr/strings.xml
index 26177e1..647e88d 100644
--- a/quickstep/res/values-mr/strings.xml
+++ b/quickstep/res/values-mr/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"अॅप सूचना सुरू केल्या आहेत"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"अॅप सूचना बंद केल्या आहेत"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"पूर्वानुमान केलेले अॅप: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"तुमचे डिव्हाइस फिरवा"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"कृपया जेश्चर नेव्हिगेशन ट्यूटोरियल पूर्ण करण्यासाठी तुमचे डिव्हाइस फिरवा"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"तुम्ही स्क्रीनच्या अगदी उजव्या किंवा अगदी डाव्या कडेपासून स्वाइप करत आहात खात्री करा"</string>
diff --git a/quickstep/res/values-ms/strings.xml b/quickstep/res/values-ms/strings.xml
index 5b3061e..baffcbb 100644
--- a/quickstep/res/values-ms/strings.xml
+++ b/quickstep/res/values-ms/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"Cadangan apl didayakan"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"Cadangan apl dilumpuhkan"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Apl yang diramalkan: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Putarkan peranti anda"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Sila putarkan peranti anda untuk melengkapkan tutorial navigasi gerak isyarat"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Pastikan anda meleret dari hujung sebelah kanan atau hujung sebelah kiri"</string>
diff --git a/quickstep/res/values-my/strings.xml b/quickstep/res/values-my/strings.xml
index 9f05013..f89920b 100644
--- a/quickstep/res/values-my/strings.xml
+++ b/quickstep/res/values-my/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"အက်ပ်အကြံပြုချက်များ ဖွင့်ထားသည်"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"အက်ပ်အကြံပြုချက်များကို ပိတ်ထားသည်"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"ကြိုတင်မှန်းဆထားသော အက်ပ်− <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"သင့်စက်ကို လှည့်ပါ"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"လက်ဟန်ဖြင့် လမ်းညွှန်ခြင်း ရှင်းလင်းပို့ချချက်အား အပြီးသတ်ရန် သင့်စက်ကို လှည့်ပါ"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"ညာ (သို့) ဘယ်ဘက်အစွန်ဆုံးမှ ပွတ်ဆွဲကြောင်း သေချာပါစေ"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g> ကို ပိုပြပါ"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g> ကို လျှော့ပြပါ"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"ရှာရန် ကွက်၍ဝိုင်းလိုက်ပါ"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-nb/strings.xml b/quickstep/res/values-nb/strings.xml
index f0080ce..3be8d68 100644
--- a/quickstep/res/values-nb/strings.xml
+++ b/quickstep/res/values-nb/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"Appforslag er på"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"Appforslag er slått av"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Foreslått app: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Roter enheten"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Roter enheten for å fullføre veiledningen for navigasjon med bevegelser"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Sørg for at du sveiper fra kanten helt til høyre eller venstre"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"vis <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"skjul <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"Circle to Search"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-ne/strings.xml b/quickstep/res/values-ne/strings.xml
index 8600a67..4ed8bb9 100644
--- a/quickstep/res/values-ne/strings.xml
+++ b/quickstep/res/values-ne/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"सिफारिस गरिएका एप देखाउने सुविधा अन गरिएको छ"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"सिफारिस गरिएका एपहरू देखाउने सुविधा असक्षम पारिएको छ"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"पूर्वानुमान गरिएको एप: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"आफ्नो डिभाइस रोटेट गर्नुहोस्"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"जेस्चर नेभिगेसनको ट्युटोरियल पूरा गर्न कृपया आफ्नो डिभाइस रोटेट गर्नुहोस्"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"स्क्रिनको सबैभन्दा दायाँ किनारा वा सबैभन्दा बायाँ किनाराबाट स्वाइप गर्नुहोस्"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g> एक्स्पान्ड गर्नुहोस्"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g> कोल्याप्स गर्नुहोस्"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"खोज्न सर्कल बनाउनुहोस्"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-nl/strings.xml b/quickstep/res/values-nl/strings.xml
index f7f93cd..c1c1a22 100644
--- a/quickstep/res/values-nl/strings.xml
+++ b/quickstep/res/values-nl/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"App-suggesties staan aan"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"App-suggesties staan uit"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Voorspelde app: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Het apparaat draaien"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Draai het apparaat om de tutorial voor navigatie met gebaren af te ronden"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Swipe vanaf de rechter- of linkerrand"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g> uitvouwen"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g> samenvouwen"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"Circle to Search"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-or/strings.xml b/quickstep/res/values-or/strings.xml
index 16f2f80..789ba0a 100644
--- a/quickstep/res/values-or/strings.xml
+++ b/quickstep/res/values-or/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"ଆପ୍ ପରାମର୍ଶଗୁଡ଼ିକୁ ସକ୍ଷମ କରାଯାଇଛି"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"ଆପ୍ ପରାମର୍ଶଗୁଡ଼ିକୁ ଅକ୍ଷମ କରାଯାଇଛି"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"ପୂର୍ବାନୁମାନ କରାଯାଇଥିବା ଆପ୍: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"ଆପଣଙ୍କ ଡିଭାଇସକୁ ରୋଟେଟ କରନ୍ତୁ"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"ଜେଶ୍ଚର ନାଭିଗେସନ ଟ୍ୟୁଟୋରିଆଲ ସମ୍ପୂର୍ଣ୍ଣ କରିବାକୁ ଦୟାକରି ଆପଣଙ୍କ ଡିଭାଇସ ରୋଟେଟ କରନ୍ତୁ"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"ଆପଣ ସ୍କ୍ରିନର ଏକଦମ-ଡାହାଣ ବା ବାମ ଧାରରୁ ସ୍ୱାଇପ କରୁଥିବା ସୁନିଶ୍ଚିତ କରନ୍ତୁ।"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g> ବିସ୍ତାର କରନ୍ତୁ"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g> ସଙ୍କୁଚିତ କରନ୍ତୁ"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"ସର୍ଚ୍ଚ କରିବାକୁ ସର୍କଲ କରନ୍ତୁ"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-pa/strings.xml b/quickstep/res/values-pa/strings.xml
index e875497..2392890 100644
--- a/quickstep/res/values-pa/strings.xml
+++ b/quickstep/res/values-pa/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"ਐਪ ਸੁਝਾਵਾਂ ਨੂੰ ਚਾਲੂ ਕੀਤਾ ਗਿਆ"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"ਐਪ ਸੁਝਾਵਾਂ ਨੂੰ ਬੰਦ ਕੀਤਾ ਗਿਆ"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"ਪੂਰਵ ਅਨੁਮਾਨਿਤ ਐਪ: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"ਆਪਣੇ ਡੀਵਾਈਸ ਨੂੰ ਘੁੰਮਾਓ"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"ਕਿਰਪਾ ਕਰਕੇ ਇਸ਼ਾਰਾ ਨੈਵੀਗੇਸ਼ਨ ਟਿਊਟੋਰੀਅਲ ਨੂੰ ਪੂਰਾ ਕਰਨ ਲਈ ਆਪਣੇ ਡੀਵਾਈਸ ਨੂੰ ਘੁੰਮਾਓ"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"ਇਹ ਪੱਕਾ ਕਰੋ ਕਿ ਤੁਸੀਂ ਸੱਜੇ ਜਾਂ ਖੱਬੇ ਪਾਸੇ ਦੇ ਬਿਲਕੁਲ ਕਿਨਾਰੇ ਤੋਂ ਸਵਾਈਪ ਕਰਦੇ ਹੋ"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g> ਦਾ ਵਿਸਤਾਰ ਕਰੋ"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g> ਨੂੰ ਸਮੇਟੋ"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"ਖੋਜਣ ਲਈ ਚੱਕਰ ਬਣਾਓ"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-pl/strings.xml b/quickstep/res/values-pl/strings.xml
index c52a3ea..74aec66 100644
--- a/quickstep/res/values-pl/strings.xml
+++ b/quickstep/res/values-pl/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"Włączono sugestie aplikacji"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"Sugestie aplikacji są wyłączone"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Przewidywana aplikacja: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Obróć urządzenie"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Obróć urządzenie, aby ukończyć samouczek nawigacji przy użyciu gestów"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Pamiętaj, aby przesuwać palcem od samej krawędzi (prawej lub lewej)"</string>
diff --git a/quickstep/res/values-pt-rPT/strings.xml b/quickstep/res/values-pt-rPT/strings.xml
index 3866d97..56d5514 100644
--- a/quickstep/res/values-pt-rPT/strings.xml
+++ b/quickstep/res/values-pt-rPT/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"Sugestões de apps ativadas"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"As sugestões de apps estão desativadas"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"App prevista: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Rode o dispositivo"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Rode o seu dispositivo para concluir o tutorial de navegação por gestos"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Deslize a partir da extremidade mais à direita ou mais à esquerda"</string>
diff --git a/quickstep/res/values-pt/strings.xml b/quickstep/res/values-pt/strings.xml
index 0008a27..bdcad13 100644
--- a/quickstep/res/values-pt/strings.xml
+++ b/quickstep/res/values-pt/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"O recurso \"sugestões de apps\" está ativado"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"O recurso \"sugestões de apps\" está desativado"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"App previsto: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Gire o dispositivo"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Gire o dispositivo para concluir o tutorial da navegação por gestos"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Deslize da borda direita ou esquerda"</string>
diff --git a/quickstep/res/values-ro/strings.xml b/quickstep/res/values-ro/strings.xml
index 65b0dd3..6a05909 100644
--- a/quickstep/res/values-ro/strings.xml
+++ b/quickstep/res/values-ro/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"Sugestiile de aplicații au fost activate"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"Sugestiile de aplicații au fost dezactivate"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Aplicația estimată: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Rotește dispozitivul"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Rotește dispozitivul pentru a încheia tutorialul de navigare prin gesturi"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Glisează dinspre marginea dreaptă îndepărtată sau dinspre marginea stângă îndepărtată"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"extinde <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"restrânge <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"Încercuiește și caută"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-ru/strings.xml b/quickstep/res/values-ru/strings.xml
index 49b17fc..69f560d 100644
--- a/quickstep/res/values-ru/strings.xml
+++ b/quickstep/res/values-ru/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"Функция \"Рекомендуемые приложения\" включена."</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"Функция \"Рекомендуемые приложения\" отключена."</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Рекомендуемое приложение: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Поверните устройство"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Чтобы перейти к руководству по жестам, нужно повернуть устройство."</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Проведите справа налево или слева направо от самого края экрана."</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"Развернуто: <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"Свернуто: <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"Обвести и найти"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-si/strings.xml b/quickstep/res/values-si/strings.xml
index 58fe3b1..2b1f147 100644
--- a/quickstep/res/values-si/strings.xml
+++ b/quickstep/res/values-si/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"යෙදුම් යෝජනා සබලිතයි"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"යෙදුම් යෝජනා අබල කර ඇත"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"පුරෝකථනය කළ යෙදුම: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"ඔබේ උපාංගය කරකවන්න"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"අභින සංචාලන නිබන්ධනය සම්පූර්ණ කිරීම සඳහා ඔබේ උපාංගය කරකවන්න"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"ඔබ ඈත දකුණු හෝ ඈත වම් දාරයේ සිට ස්වයිප් කරන බව සහතික කර ගන්න"</string>
diff --git a/quickstep/res/values-sk/strings.xml b/quickstep/res/values-sk/strings.xml
index 55253d7..c2e6b85 100644
--- a/quickstep/res/values-sk/strings.xml
+++ b/quickstep/res/values-sk/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"Návrhy aplikácií zapnuté"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"Návrhy aplikácií vypnuté"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Predpovedaná aplikácia: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Otočte zariadenie"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Otočte zariadenie a dokončite tak návod, ako navigovať gestami"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Musíte potiahnuť úplne z pravého alebo ľavého okraja."</string>
diff --git a/quickstep/res/values-sl/strings.xml b/quickstep/res/values-sl/strings.xml
index a046c3d..0922f24 100644
--- a/quickstep/res/values-sl/strings.xml
+++ b/quickstep/res/values-sl/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"Predlogi aplikacij so omogočeni."</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"Predlogi aplikacij so onemogočeni."</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Predvidena aplikacija: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Zasukajte napravo"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Zasukajte napravo, če si želite ogledati vadnico za krmarjenje s potezami"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Pazite, da povlečete s skrajno desnega ali skrajno levega roba."</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"razširitev oblačka <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"strnitev oblačka <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"Iskanje z obkroževanjem"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-sq/strings.xml b/quickstep/res/values-sq/strings.xml
index 431efa3..50b9fa1 100644
--- a/quickstep/res/values-sq/strings.xml
+++ b/quickstep/res/values-sq/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"Aplikacionet e sugjeruara janë aktivizuar"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"Sugjerimet e aplikacioneve janë çaktivizuar"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Aplikacioni i parashikuar: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Rrotullo pajisjen"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Rrotullo pajisjen për të përfunduar udhëzuesin e navigimit me gjeste"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Sigurohu që të rrëshqasësh shpejt nga skaji më i djathtë ose më i majtë"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"zgjero <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"palos <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"Qarko për të kërkuar"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-sr/strings.xml b/quickstep/res/values-sr/strings.xml
index 2b544fd..a20e927 100644
--- a/quickstep/res/values-sr/strings.xml
+++ b/quickstep/res/values-sr/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"Предлози апликација су омогућени"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"Предлози апликација су онемогућени"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Предвиђамо апликацију: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Ротирајте уређај"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Ротирајте уређај да бисте довршили водич за навигацију помоћу покрета"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Обавезно превуците од саме десне или леве ивице"</string>
diff --git a/quickstep/res/values-sv/strings.xml b/quickstep/res/values-sv/strings.xml
index 2a196eb..7c826cd 100644
--- a/quickstep/res/values-sv/strings.xml
+++ b/quickstep/res/values-sv/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"Appförslag har aktiverats"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"Appförslag har inaktiverats"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Appförslag: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Rotera enheten"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Rotera enheten för att slutföra guiden för navigering med rörelser"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Se till att du sveper ända från högerkanten eller vänsterkanten"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"utöka <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"komprimera <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"Circle to Search"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-sw/strings.xml b/quickstep/res/values-sw/strings.xml
index b313c84..9181599 100644
--- a/quickstep/res/values-sw/strings.xml
+++ b/quickstep/res/values-sw/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"Mapendekezo ya programu yamewashwa"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"Umezima mapendekezo ya programu"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Programu iliyotabiriwa: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Zungusha kifaa chako"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Tafadhali zungusha kifaa chako ili ukamilishe mafunzo ya usogezaji kwa kutumia ishara"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Hakikisha unatelezesha kidole kutoka ukingo wa kulia au kushoto kabisa"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"panua <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"kunja <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"Chora Mviringo ili Kutafuta"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-ta/strings.xml b/quickstep/res/values-ta/strings.xml
index 2385c20..4e3a075 100644
--- a/quickstep/res/values-ta/strings.xml
+++ b/quickstep/res/values-ta/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"ஆப்ஸ் பரிந்துரைகள் இயக்கப்பட்டுள்ளன"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"ஆப்ஸ் பரிந்துரைகள் முடக்கப்பட்டுள்ளன"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"கணித்த ஆப்ஸ்: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"உங்கள் சாதனத்தைச் சுழற்றுங்கள்"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"சைகை வழிசெலுத்தல் பயிற்சியை நிறைவுசெய்ய உங்கள் சாதனத்தைச் சுழற்றுங்கள்"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"வலது அல்லது இடது ஓரத்தின் விளிம்பிலிருந்து ஸ்வைப் செய்வதை உறுதிசெய்துகொள்ளுங்கள்"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g> ஐ விரிவாக்கும்"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g> ஐச் சுருக்கும்"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"வட்டமிட்டுத் தேடல்"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-te/strings.xml b/quickstep/res/values-te/strings.xml
index a13a970..94fac1b 100644
--- a/quickstep/res/values-te/strings.xml
+++ b/quickstep/res/values-te/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"యాప్ సలహాలు ఎనేబుల్ చేయబడ్డాయి"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"యాప్ సూచనలు డిజేబుల్ చేయబడ్డాయి"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"సూచించబడిన యాప్: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"మీ పరికరాన్ని రొటేట్ చేయండి"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"సంజ్ఞ నావిగేషన్ ట్యుటోరియల్ను పూర్తి చేయడానికి దయచేసి మీ పరికరాన్ని రొటేట్ చేయండి"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"కుడి వైపు చిట్ట చివరి లేదా ఎడమ వైపు చిట్ట చివరి అంచు నుండి స్వైప్ చేస్తున్నారని నిర్ధారించుకోండి"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>ను విస్తరించండి"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>ను కుదించండి"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"సెర్చ్ చేయడానికి సర్కిల్ గీయండి"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-th/strings.xml b/quickstep/res/values-th/strings.xml
index 254e359..ee515b9 100644
--- a/quickstep/res/values-th/strings.xml
+++ b/quickstep/res/values-th/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"เปิดใช้แอปแนะนำแล้ว"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"ปิดใช้คำแนะนำเกี่ยวกับแอปอยู่"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"แอปที่คาดว่าจะใช้: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"หมุนอุปกรณ์ของคุณ"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"โปรดหมุนอุปกรณ์เพื่อทำตามบทแนะนำการนำทางด้วยท่าทางสัมผัสให้เสร็จสมบูรณ์"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"ปัดจากขอบด้านขวาสุดหรือซ้ายสุด"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"ขยาย <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"ยุบ <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"วงเพื่อค้นหา"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-tl/strings.xml b/quickstep/res/values-tl/strings.xml
index fe8bbce..1bc4a3d 100644
--- a/quickstep/res/values-tl/strings.xml
+++ b/quickstep/res/values-tl/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"Naka-enable ang mga iminumungkahing app"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"Naka-disable ang mga iminumungkahing app"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Hinulaang app: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"I-rotate ang iyong device"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Paki-rotate ang iyong device para tapusin ang tutorial sa navigation gamit ang galaw"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Tiyaking magsa-swipe ka mula sa dulong kanan o dulong kaliwang gilid"</string>
diff --git a/quickstep/res/values-tr/strings.xml b/quickstep/res/values-tr/strings.xml
index 73a87c5..691e6c0 100644
--- a/quickstep/res/values-tr/strings.xml
+++ b/quickstep/res/values-tr/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"Uygulama önerileri etkinleştirildi"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"Uygulama önerileri devre dışı bırakıldı"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Tahmin edilen uygulama: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Cihazınızı döndürün"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Hareketle gezinme eğitimini tamamlamak için lütfen cihazınızı döndürün"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"En sağ veya en sol kenardan kaydırdığınızdan emin olun"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"genişlet: <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"daralt: <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"Seçerek Arat"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-uk/strings.xml b/quickstep/res/values-uk/strings.xml
index 711089f..1668b4f 100644
--- a/quickstep/res/values-uk/strings.xml
+++ b/quickstep/res/values-uk/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"Рекомендовані додатки ввімкнено"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"Рекомендовані додатки вимкнено"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Передбачений додаток: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Оберніть пристрій"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Обертайте пристрій, щоб ознайомитися з посібником із навігації за допомогою жестів"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Проведіть пальцем від самого краю екрана (правого або лівого)"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"розгорнути \"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>\""</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"згорнути \"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>\""</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"Обвести й знайти"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-ur/strings.xml b/quickstep/res/values-ur/strings.xml
index d101822..5b780c3 100644
--- a/quickstep/res/values-ur/strings.xml
+++ b/quickstep/res/values-ur/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"ایپ کی تجاویز فعال ہیں"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"ایپ کی تجاویز غیر فعال ہیں"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"پیشن گوئی کردہ ایپ: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"اپنا آلہ گھمائیں"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"براہ کرم اشاروں والی نیویگیشن کا ٹیوٹوریل مکمل کرنے کے لیے اپنا آلہ گھمائیں"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"یقینی بنائیں کہ آپ دائیں یا بائیں کنارے سے دور سے سوائپ کریں"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g> کو پھیلائیں"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g> کو سکیڑیں"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"تلاش کرنے کیلئے دائرہ بنائیں"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-uz/strings.xml b/quickstep/res/values-uz/strings.xml
index e0e91c9..7de3648 100644
--- a/quickstep/res/values-uz/strings.xml
+++ b/quickstep/res/values-uz/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"Ilova tavsiyalari yoqildi"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"Endi ilova takliflari chiqmaydi"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Taklif etilgan ilova: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Qurilmangizni buring"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Ishorali navigatsiya darsligini tugatish uchun qurilmani buring"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Ekran chetidan boshlab oʻngdan yoki chapdan suring"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>ni yoyish"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>ni yigʻish"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"Chizib qidirish"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-vi/strings.xml b/quickstep/res/values-vi/strings.xml
index 21f269d..dffcd6c 100644
--- a/quickstep/res/values-vi/strings.xml
+++ b/quickstep/res/values-vi/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"Đã bật tính năng Ứng dụng đề xuất"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"Tính năng Ứng dụng đề xuất bị tắt"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Ứng dụng dự đoán: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Xoay thiết bị của bạn"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Vui lòng xoay thiết bị của bạn để hoàn tất hướng dẫn thao tác bằng cử chỉ"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Hãy vuốt từ mép ngoài cùng bên phải hoặc ngoài cùng bên trái"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"mở rộng <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"thu gọn <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"Khoanh tròn để tìm kiếm"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-zh-rCN/strings.xml b/quickstep/res/values-zh-rCN/strings.xml
index 0c1e110..4d35d39 100644
--- a/quickstep/res/values-zh-rCN/strings.xml
+++ b/quickstep/res/values-zh-rCN/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"已启用应用建议"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"已停用应用建议"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"预测的应用:<xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"请旋转设备"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"请旋转设备,完成手势导航教程"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"确保从最右侧或最左侧边缘开始滑动"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"展开“<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>”"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"收起“<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>”"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"圈定即搜"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-zh-rHK/strings.xml b/quickstep/res/values-zh-rHK/strings.xml
index db19dbf..fd11ba1 100644
--- a/quickstep/res/values-zh-rHK/strings.xml
+++ b/quickstep/res/values-zh-rHK/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"已啟用應用程式建議"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"已停用應用程式建議"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"預測應用程式:<xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"旋轉裝置方向"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"請旋轉裝置方向以完成手勢導覽教學課程"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"請確保從螢幕最右側或最左側邊緣滑動"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"打開<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"收埋<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"一圈即搜"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-zh-rTW/strings.xml b/quickstep/res/values-zh-rTW/strings.xml
index f168deb..729f7fd 100644
--- a/quickstep/res/values-zh-rTW/strings.xml
+++ b/quickstep/res/values-zh-rTW/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"應用程式建議功能已啟用"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"應用程式建議功能已停用"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"預測的應用程式:<xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"旋轉裝置螢幕方向"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"如要完成手勢操作教學課程,請旋轉裝置螢幕方向"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"請務必從螢幕最右側或最左側滑動"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"展開「<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>」"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"收合「<xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>」"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"畫圈搜尋"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values-zu/strings.xml b/quickstep/res/values-zu/strings.xml
index 498476b..5209ac1 100644
--- a/quickstep/res/values-zu/strings.xml
+++ b/quickstep/res/values-zu/strings.xml
@@ -46,6 +46,8 @@
<string name="hotsaet_tip_prediction_enabled" msgid="2233554377501347650">"Iziphakamiso zohlelo lokusebenza zinikwe amandla"</string>
<string name="hotsaet_tip_prediction_disabled" msgid="1506426298884658491">"Iziphakamiso zohlelo lokusebenza zikhutshaziwe"</string>
<string name="hotseat_prediction_content_description" msgid="4582028296938078419">"Uhlelo lokusebenza olubikezelwe: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
+ <!-- no translation found for gesture_tutorial_title (2750751261768388354) -->
+ <skip />
<string name="gesture_tutorial_rotation_prompt_title" msgid="7537946781362766964">"Zungezisa idivayisi yakho"</string>
<string name="gesture_tutorial_rotation_prompt" msgid="1664493449851960691">"Sicela uzungezise idivayisi yakho ukuze uqedele okokufundisa kokufuna ngokuthinta"</string>
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Qinisekisa ukuthi uswayipha ukusuka onqenqemeni olukude ngakwesokudla noma olukude ngakwesokunxele"</string>
@@ -152,10 +154,7 @@
<string name="bubble_bar_accessibility_announce_expand" msgid="1503192695527477102">"nweba <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="bubble_bar_accessibility_announce_collapse" msgid="928284600086798791">"goqa <xliff:g id="BUBBLE_DESCRIPTION">%1$s</xliff:g>"</string>
<string name="search_gesture_feature_title" msgid="1294044108313175306">"Khethela Ukusesha"</string>
- <!-- no translation found for header_app_icon_description (2184625881433608027) -->
- <skip />
- <!-- no translation found for header_default_app_title (8308052350689531566) -->
- <skip />
- <!-- no translation found for header_close_icon_description (5400033616675911319) -->
- <skip />
+ <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>
</resources>
diff --git a/quickstep/res/values/config.xml b/quickstep/res/values/config.xml
index 1f33e08..a530325 100644
--- a/quickstep/res/values/config.xml
+++ b/quickstep/res/values/config.xml
@@ -34,7 +34,6 @@
<string name="launcher_restore_event_logger_class" translatable="false">com.android.quickstep.LauncherRestoreEventLoggerImpl</string>
<string name="taskbar_edu_tooltip_controller_class" translatable="false">com.android.launcher3.taskbar.TaskbarEduTooltipController</string>
<string name="nav_handle_long_press_handler_class" translatable="false"></string>
- <string name="contextual_search_state_manager_class" translatable="false"></string>
<!-- The number of thumbnails and icons to keep in the cache. The thumbnail cache size also
determines how many thumbnails will be fetched in the background. -->
diff --git a/quickstep/res/values/strings.xml b/quickstep/res/values/strings.xml
index 324ea31..0474000 100644
--- a/quickstep/res/values/strings.xml
+++ b/quickstep/res/values/strings.xml
@@ -98,6 +98,9 @@
<!-- content description for hotseat items -->
<string name="hotseat_prediction_content_description">Predicted app: <xliff:g id="title" example="Chrome">%1$s</xliff:g></string>
+ <!-- Title of the Gesture Navigation Tutorial page [CHAR LIMIT=NONE] -->
+ <string name="gesture_tutorial_title">Gesture Navigation Tutorial</string>
+
<!-- Title of prompt shown before the gesture navigation tutorial to users who need to rotate their screen. [CHAR LIMIT=100] -->
<string name="gesture_tutorial_rotation_prompt_title">Rotate your device</string>
<!-- Prompt shown before the gesture navigation tutorial to users who need to rotate their screen to begin. [CHAR LIMIT=100] -->
diff --git a/quickstep/src/com/android/launcher3/dagger/Modules.kt b/quickstep/src/com/android/launcher3/dagger/Modules.kt
index 04c1d5e..52be413 100644
--- a/quickstep/src/com/android/launcher3/dagger/Modules.kt
+++ b/quickstep/src/com/android/launcher3/dagger/Modules.kt
@@ -21,9 +21,11 @@
import com.android.launcher3.util.ApiWrapper
import com.android.launcher3.util.PluginManagerWrapper
import com.android.launcher3.util.window.WindowManagerProxy
+import com.android.quickstep.util.GestureExclusionManager
import com.android.quickstep.util.SystemWindowManagerProxy
import dagger.Binds
import dagger.Module
+import dagger.Provides
private object Modules {}
@@ -42,3 +44,11 @@
@Binds
abstract fun bindPluginManagerWrapper(impl: PluginManagerWrapperImpl): PluginManagerWrapper
}
+
+@Module
+object StaticObjectModule {
+
+ @Provides
+ @JvmStatic
+ fun provideGestureExclusionManager(): GestureExclusionManager = GestureExclusionManager.INSTANCE
+}
diff --git a/quickstep/src/com/android/launcher3/desktop/DesktopRecentsTransitionController.kt b/quickstep/src/com/android/launcher3/desktop/DesktopRecentsTransitionController.kt
index 8b064d3..010a5c8 100644
--- a/quickstep/src/com/android/launcher3/desktop/DesktopRecentsTransitionController.kt
+++ b/quickstep/src/com/android/launcher3/desktop/DesktopRecentsTransitionController.kt
@@ -64,11 +64,16 @@
}
/** Launch desktop tasks from recents view */
- fun moveToDesktop(taskContainer: TaskContainer, transitionSource: DesktopModeTransitionSource) {
+ fun moveToDesktop(
+ taskContainer: TaskContainer,
+ transitionSource: DesktopModeTransitionSource,
+ successCallback: Runnable,
+ ) {
systemUiProxy.moveToDesktop(
taskContainer.task.key.id,
transitionSource,
/* transition = */ null,
+ successCallback,
)
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchController.java b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchController.java
index bef753e..3736e6d 100644
--- a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchController.java
@@ -28,6 +28,7 @@
import com.android.launcher3.taskbar.overlay.TaskbarOverlayContext;
import com.android.launcher3.taskbar.overlay.TaskbarOverlayDragLayer;
import com.android.launcher3.util.TouchController;
+import com.android.quickstep.RecentsFilterState;
import com.android.quickstep.RecentsModel;
import com.android.quickstep.util.DesktopTask;
import com.android.quickstep.util.GroupTask;
@@ -154,6 +155,8 @@
// Skip the task reload if the list is not changed.
if (!mModel.isTaskListValid(mTaskListChangeId) || !taskIdsToExclude.equals(
mExcludedTaskIds)) {
+ final boolean shouldShowDesktopTasks = mControllers.taskbarDesktopModeController
+ .shouldShowDesktopTasksInTaskbar();
mExcludedTaskIds = taskIdsToExclude;
mTaskListChangeId = mModel.getTasks((tasks) -> {
processLoadedTasks(tasks, taskIdsToExclude);
@@ -163,7 +166,8 @@
currentFocusIndexOverride,
mHasDesktopTask,
mWasDesktopTaskFilteredOut);
- });
+ }, shouldShowDesktopTasks ? RecentsFilterState.EMPTY_FILTER
+ : RecentsFilterState.getEmptyDesktopTaskFilter());
}
mQuickSwitchViewController.updateLayoutForSurface(wasOpenedFromTaskbar,
@@ -189,8 +193,8 @@
mQuickSwitchViewController = new KeyboardQuickSwitchViewController(
mControllers, mOverlayContext, keyboardQuickSwitchView, mControllerCallbacks);
- final boolean onDesktop = mControllers.taskbarDesktopModeController
- .getAreDesktopTasksVisibleAndNotInOverview();
+ final boolean shouldShowDesktopTasks = mControllers.taskbarDesktopModeController
+ .shouldShowDesktopTasksInTaskbar();
if (mModel.isTaskListValid(mTaskListChangeId)
&& taskIdsToExclude.equals(mExcludedTaskIds)) {
@@ -202,7 +206,7 @@
/* updateTasks= */ false,
currentFocusedIndex == -1 && !mControllerCallbacks.isFirstTaskRunning()
? 0 : currentFocusedIndex,
- onDesktop,
+ shouldShowDesktopTasks,
mHasDesktopTask,
mWasDesktopTaskFilteredOut,
wasOpenedFromTaskbar);
@@ -220,11 +224,12 @@
/* updateTasks= */ true,
currentFocusedIndex == -1 && !mControllerCallbacks.isFirstTaskRunning()
? 0 : currentFocusedIndex,
- onDesktop,
+ shouldShowDesktopTasks,
mHasDesktopTask,
mWasDesktopTaskFilteredOut,
wasOpenedFromTaskbar);
- });
+ }, shouldShowDesktopTasks ? RecentsFilterState.EMPTY_FILTER
+ : RecentsFilterState.getEmptyDesktopTaskFilter());
}
private boolean shouldExcludeTask(GroupTask task, Set<Integer> taskIdsToExclude) {
@@ -234,7 +239,7 @@
private void processLoadedTasks(List<GroupTask> tasks, Set<Integer> taskIdsToExclude) {
mHasDesktopTask = false;
mWasDesktopTaskFilteredOut = false;
- if (mControllers.taskbarDesktopModeController.getAreDesktopTasksVisibleAndNotInOverview()) {
+ if (mControllers.taskbarDesktopModeController.shouldShowDesktopTasksInTaskbar()) {
processLoadedTasksOnDesktop(tasks, taskIdsToExclude);
} else {
processLoadedTasksOutsideDesktop(tasks, taskIdsToExclude);
diff --git a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java
index 1144ac5..289e720 100644
--- a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java
@@ -42,7 +42,7 @@
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_BACK_DISABLED;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_HOME_DISABLED;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_IME_SHOWING;
-import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_IME_SWITCHER_SHOWING;
+import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_IME_SWITCHER_BUTTON_SHOWING;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NAV_BAR_HIDDEN;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_OVERVIEW_DISABLED;
@@ -129,7 +129,9 @@
private final Rect mTempRect = new Rect();
- private static final int FLAG_SWITCHER_SHOWING = 1 << 0;
+ /** Whether the IME Switcher button is visible. */
+ private static final int FLAG_IME_SWITCHER_BUTTON_VISIBLE = 1 << 0;
+ /** Whether the IME is visible. */
private static final int FLAG_IME_VISIBLE = 1 << 1;
private static final int FLAG_ROTATION_BUTTON_VISIBLE = 1 << 2;
private static final int FLAG_A11Y_VISIBLE = 1 << 3;
@@ -301,7 +303,7 @@
isThreeButtonNav ? mStartContextualContainer : mEndContextualContainer,
mControllers.navButtonController, R.id.ime_switcher);
mPropertyHolders.add(new StatePropertyHolder(mImeSwitcherButton,
- flags -> ((flags & FLAG_SWITCHER_SHOWING) != 0)
+ flags -> ((flags & FLAG_IME_SWITCHER_BUTTON_VISIBLE) != 0)
&& ((flags & FLAG_ROTATION_BUTTON_VISIBLE) == 0)));
}
@@ -507,8 +509,9 @@
private void parseSystemUiFlags(@SystemUiStateFlags long sysUiStateFlags) {
mSysuiStateFlags = sysUiStateFlags;
+ boolean isImeSwitcherButtonVisible =
+ (sysUiStateFlags & SYSUI_STATE_IME_SWITCHER_BUTTON_SHOWING) != 0;
boolean isImeVisible = (sysUiStateFlags & SYSUI_STATE_IME_SHOWING) != 0;
- boolean isImeSwitcherShowing = (sysUiStateFlags & SYSUI_STATE_IME_SWITCHER_SHOWING) != 0;
boolean a11yVisible = (sysUiStateFlags & SYSUI_STATE_A11Y_BUTTON_CLICKABLE) != 0;
boolean isHomeDisabled = (sysUiStateFlags & SYSUI_STATE_HOME_DISABLED) != 0;
boolean isRecentsDisabled = (sysUiStateFlags & SYSUI_STATE_OVERVIEW_DISABLED) != 0;
@@ -522,9 +525,8 @@
boolean isKeyboardShortcutHelperShowing =
(sysUiStateFlags & SYSUI_STATE_SHORTCUT_HELPER_SHOWING) != 0;
- // TODO(b/202218289) we're getting IME as not visible on lockscreen from system
+ updateStateForFlag(FLAG_IME_SWITCHER_BUTTON_VISIBLE, isImeSwitcherButtonVisible);
updateStateForFlag(FLAG_IME_VISIBLE, isImeVisible);
- updateStateForFlag(FLAG_SWITCHER_SHOWING, isImeSwitcherShowing);
updateStateForFlag(FLAG_A11Y_VISIBLE, a11yVisible);
updateStateForFlag(FLAG_DISABLE_HOME, isHomeDisabled);
updateStateForFlag(FLAG_DISABLE_RECENTS, isRecentsDisabled);
@@ -1226,7 +1228,8 @@
private static String getStateString(int flags) {
StringJoiner str = new StringJoiner("|");
- appendFlag(str, flags, FLAG_SWITCHER_SHOWING, "FLAG_SWITCHER_SHOWING");
+ appendFlag(str, flags, FLAG_IME_SWITCHER_BUTTON_VISIBLE,
+ "FLAG_IME_SWITCHER_BUTTON_VISIBLE");
appendFlag(str, flags, FLAG_IME_VISIBLE, "FLAG_IME_VISIBLE");
appendFlag(str, flags, FLAG_ROTATION_BUTTON_VISIBLE, "FLAG_ROTATION_BUTTON_VISIBLE");
appendFlag(str, flags, FLAG_A11Y_VISIBLE, "FLAG_A11Y_VISIBLE");
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
index a0f3948..e8a0c45 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
@@ -59,7 +59,6 @@
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.hardware.display.DisplayManager;
-import android.os.Bundle;
import android.os.IRemoteCallback;
import android.os.Process;
import android.os.Trace;
@@ -85,8 +84,8 @@
import com.android.internal.jank.Cuj;
import com.android.launcher3.AbstractFloatingView;
import com.android.launcher3.BubbleTextView;
+import com.android.launcher3.BubbleTextView.RunningAppState;
import com.android.launcher3.DeviceProfile;
-import com.android.launcher3.Flags;
import com.android.launcher3.LauncherPrefs;
import com.android.launcher3.LauncherSettings.Favorites;
import com.android.launcher3.R;
@@ -368,7 +367,8 @@
new KeyboardQuickSwitchController(),
new TaskbarPinningController(this),
bubbleControllersOptional,
- new TaskbarDesktopModeController(DesktopVisibilityController.INSTANCE.get(this)));
+ new TaskbarDesktopModeController(this,
+ DesktopVisibilityController.INSTANCE.get(this)));
mLauncherPrefs = LauncherPrefs.get(this);
}
@@ -891,36 +891,10 @@
return makeDefaultActivityOptions(SPLASH_SCREEN_STYLE_UNDEFINED);
}
- private ActivityOptionsWrapper getActivityLaunchDesktopOptions(ItemInfo info) {
- if (!DesktopModeFlags.ENABLE_DESKTOP_APP_LAUNCH_TRANSITIONS.isTrue()
- && !DesktopModeFlags.ENABLE_DESKTOP_APP_LAUNCH_TRANSITIONS_BUGFIX.isTrue()) {
- return null;
- }
- if (!areDesktopTasksVisible()) {
- return null;
- }
- BubbleTextView.RunningAppState appState =
- mControllers.taskbarRecentAppsController.getDesktopItemState(info);
- AppLaunchType launchType = null;
- switch (appState) {
- case RUNNING:
- return null;
- case MINIMIZED:
- launchType = AppLaunchType.UNMINIMIZE;
- break;
- case NOT_RUNNING:
- launchType = AppLaunchType.LAUNCH;
- break;
- }
+ private ActivityOptionsWrapper getActivityLaunchDesktopOptions() {
ActivityOptions options = ActivityOptions.makeRemoteTransition(
- new RemoteTransition(
- new DesktopAppLaunchTransition(
- /* context= */ this,
- getMainExecutor(),
- launchType,
- Cuj.CUJ_DESKTOP_MODE_APP_LAUNCH_FROM_ICON
- ),
- "TaskbarDesktopLaunch"));
+ createDesktopAppLaunchRemoteTransition(
+ AppLaunchType.LAUNCH, Cuj.CUJ_DESKTOP_MODE_APP_LAUNCH_FROM_ICON));
return new ActivityOptionsWrapper(options, new RunnableList());
}
@@ -1322,8 +1296,9 @@
if (tag instanceof GroupTask groupTask) {
RemoteTransition remoteTransition =
(areDesktopTasksVisible() && canUnminimizeDesktopTask(groupTask.task1.key.id))
- ? createUnminimizeRemoteTransition(
- Cuj.CUJ_DESKTOP_MODE_APP_LAUNCH_FROM_ICON) : null;
+ ? createDesktopAppLaunchRemoteTransition(AppLaunchType.UNMINIMIZE,
+ Cuj.CUJ_DESKTOP_MODE_APP_LAUNCH_FROM_ICON)
+ : null;
if (areDesktopTasksVisible() && mControllers.uiController.isInOverviewUi()) {
RunnableList runnableList = recents.launchRunningDesktopTaskView();
// Wrapping it in runnable so we post after DW is ready for the app
@@ -1354,9 +1329,10 @@
mControllers.uiController.onTaskbarIconLaunched(api);
mControllers.taskbarStashController.updateAndAnimateTransientTaskbar(true);
}
- } else if (tag instanceof TaskItemInfo info && !Flags.enableMultiInstanceMenuTaskbar()) {
+ } else if (tag instanceof TaskItemInfo info) {
RemoteTransition remoteTransition = canUnminimizeDesktopTask(info.getTaskId())
- ? createUnminimizeRemoteTransition(Cuj.CUJ_DESKTOP_MODE_APP_LAUNCH_FROM_ICON)
+ ? createDesktopAppLaunchRemoteTransition(
+ AppLaunchType.UNMINIMIZE, Cuj.CUJ_DESKTOP_MODE_APP_LAUNCH_FROM_ICON)
: null;
TaskView taskView = null;
@@ -1364,7 +1340,8 @@
taskView = recents.getTaskViewByTaskId(info.getTaskId());
}
- if (areDesktopTasksVisible() && taskView != null) {
+ if (areDesktopTasksVisible() && taskView != null
+ && mControllers.uiController.isInOverviewUi()) {
RunnableList runnableList = taskView.launchWithAnimation();
if (runnableList != null) {
runnableList.add(() ->
@@ -1535,21 +1512,22 @@
public boolean canUnminimizeDesktopTask(int taskId) {
BubbleTextView.RunningAppState runningAppState =
mControllers.taskbarRecentAppsController.getRunningAppState(taskId);
- return runningAppState == BubbleTextView.RunningAppState.MINIMIZED
+ return runningAppState == RunningAppState.MINIMIZED
&& (DesktopModeFlags.ENABLE_DESKTOP_APP_LAUNCH_ALTTAB_TRANSITIONS.isTrue()
|| DesktopModeFlags.ENABLE_DESKTOP_APP_LAUNCH_ALTTAB_TRANSITIONS_BUGFIX.isTrue()
);
}
- private RemoteTransition createUnminimizeRemoteTransition(@Cuj.CujType int cujType) {
+ private RemoteTransition createDesktopAppLaunchRemoteTransition(
+ AppLaunchType appLaunchType, @Cuj.CujType int cujType) {
return new RemoteTransition(
new DesktopAppLaunchTransition(
this,
getMainExecutor(),
- AppLaunchType.UNMINIMIZE,
+ appLaunchType,
cujType
),
- "TaskbarDesktopUnminimize");
+ "TaskbarDesktopAppLaunch");
}
/**
@@ -1680,10 +1658,9 @@
return;
}
}
- if (areDesktopTasksVisible()) {
- ActivityOptionsWrapper opts = getActivityLaunchDesktopOptions(info);
- Bundle optionsBundle = opts == null ? null : opts.options.toBundle();
- mSysUiProxy.startLaunchIntentTransition(intent, optionsBundle, displayId);
+ if (areDesktopTasksVisible()
+ && DesktopModeFlags.ENABLE_DESKTOP_APP_LAUNCH_TRANSITIONS_BUGFIX.isTrue()) {
+ launchDesktopApp(intent, info, displayId);
} else {
startActivity(intent, null);
}
@@ -1694,6 +1671,27 @@
}
}
+ private void launchDesktopApp(Intent intent, ItemInfo info, int displayId) {
+ TaskbarRecentAppsController.TaskState taskState =
+ mControllers.taskbarRecentAppsController.getDesktopItemState(info);
+ RunningAppState appState = taskState.getRunningAppState();
+ if (appState == RunningAppState.RUNNING || appState == RunningAppState.MINIMIZED) {
+ // We only need a custom animation (a RemoteTransition) if the task is minimized - if
+ // it's already visible it will just be brought forward.
+ RemoteTransition remoteTransition = (appState == RunningAppState.MINIMIZED)
+ ? createDesktopAppLaunchRemoteTransition(
+ AppLaunchType.UNMINIMIZE, Cuj.CUJ_DESKTOP_MODE_APP_LAUNCH_FROM_ICON)
+ : null;
+ UI_HELPER_EXECUTOR.execute(() ->
+ SystemUiProxy.INSTANCE.get(this).showDesktopApp(taskState.getTaskId(),
+ remoteTransition, DesktopTaskToFrontReason.TASKBAR_TAP));
+ return;
+ }
+ // There is no task associated with this launch - launch a new task through an intent
+ ActivityOptionsWrapper opts = getActivityLaunchDesktopOptions();
+ mSysUiProxy.startLaunchIntentTransition(intent, opts.options.toBundle(), displayId);
+ }
+
/** Expands a folder icon when it is clicked */
private void expandFolder(FolderIcon folderIcon) {
Folder folder = folderIcon.getFolder();
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarDesktopModeController.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarDesktopModeController.kt
index a7c7381..8806bc6 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarDesktopModeController.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarDesktopModeController.kt
@@ -16,13 +16,16 @@
package com.android.launcher3.taskbar
+import android.content.Context
import com.android.launcher3.statehandlers.DesktopVisibilityController
import com.android.launcher3.statehandlers.DesktopVisibilityController.TaskbarDesktopModeListener
import com.android.launcher3.taskbar.TaskbarBackgroundRenderer.Companion.MAX_ROUNDNESS
+import com.android.launcher3.util.DisplayController
/** Handles Taskbar in Desktop Windowing mode. */
class TaskbarDesktopModeController(
- private val desktopVisibilityController: DesktopVisibilityController
+ private val context: Context,
+ private val desktopVisibilityController: DesktopVisibilityController,
) : TaskbarDesktopModeListener {
private lateinit var taskbarControllers: TaskbarControllers
private lateinit var taskbarSharedState: TaskbarSharedState
@@ -45,6 +48,12 @@
taskbarControllers.taskbarCornerRoundness.animateToValue(cornerRadius).start()
}
+ fun shouldShowDesktopTasksInTaskbar(): Boolean {
+ return desktopVisibilityController.areDesktopTasksVisible() ||
+ DisplayController.showLockedTaskbarOnHome(context) &&
+ taskbarControllers.taskbarStashController.isOnHome
+ }
+
fun getTaskbarCornerRoundness(doesAnyTaskRequireTaskbarRounding: Boolean): Float {
return if (doesAnyTaskRequireTaskbarRounding) {
MAX_ROUNDNESS
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
index 21c8255..b46b0dc 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
@@ -89,6 +89,8 @@
public class TaskbarManager {
private static final String TAG = "TaskbarManager";
private static final boolean DEBUG = false;
+ // TODO(b/382378283) remove all logs with this tag
+ public static final String NULL_TASKBAR_ROOT_LAYOUT_TAG = "b/382378283";
/**
* All the configurations which do not initiate taskbar recreation.
@@ -151,6 +153,20 @@
private class RecreationListener implements DisplayController.DisplayInfoChangeListener {
@Override
public void onDisplayInfoChanged(Context context, DisplayController.Info info, int flags) {
+
+ if ((flags & CHANGE_DENSITY) != 0) {
+ Log.d(NULL_TASKBAR_ROOT_LAYOUT_TAG, "Display density changed");
+ }
+ if ((flags & CHANGE_NAVIGATION_MODE) != 0) {
+ Log.d(NULL_TASKBAR_ROOT_LAYOUT_TAG, "Navigation mode changed");
+ }
+ if ((flags & CHANGE_DESKTOP_MODE) != 0) {
+ Log.d(NULL_TASKBAR_ROOT_LAYOUT_TAG, "Desktop mode changed");
+ }
+ if ((flags & CHANGE_TASKBAR_PINNING) != 0) {
+ Log.d(NULL_TASKBAR_ROOT_LAYOUT_TAG, "Taskbar pinning changed");
+ }
+
if ((flags & (CHANGE_DENSITY | CHANGE_NAVIGATION_MODE | CHANGE_DESKTOP_MODE
| CHANGE_TASKBAR_PINNING)) != 0) {
recreateTaskbar();
@@ -345,13 +361,13 @@
private void destroyTaskbarForDisplay(int displayId) {
TaskbarActivityContext taskbar = getTaskbarForDisplay(displayId);
- debugWhyTaskbarNotDestroyed(
- "destroyTaskbarForDisplay: " + taskbar + " displayId=" + displayId);
+ debugWhyTaskbarNotDestroyed("destroyTaskbarForDisplay: " + taskbar, displayId);
if (taskbar != null) {
taskbar.onDestroy();
// remove all defaults that we store
removeTaskbarFromMap(displayId);
}
+ // make this display-specific
DeviceProfile dp = mUserUnlocked ?
LauncherAppState.getIDP(mWindowContext).getDeviceProfile(mWindowContext) : null;
if (dp == null || !isTaskbarEnabled(dp)) {
@@ -506,6 +522,7 @@
private void recreateTaskbarForDisplay(int displayId) {
Trace.beginSection("recreateTaskbar");
try {
+ // TODO: make this code display specific
DeviceProfile dp = mUserUnlocked ?
LauncherAppState.getIDP(mWindowContext).getDeviceProfile(mWindowContext) : null;
@@ -547,9 +564,14 @@
if (enableTaskbarNoRecreate()) {
addTaskbarRootViewToWindow(displayId);
FrameLayout taskbarRootLayout = getTaskbarRootLayoutForDisplay(displayId);
- taskbarRootLayout.removeAllViews();
- taskbarRootLayout.addView(taskbar.getDragLayer());
- taskbar.notifyUpdateLayoutParams();
+ if (taskbarRootLayout != null) {
+ taskbarRootLayout.removeAllViews();
+ taskbarRootLayout.addView(taskbar.getDragLayer());
+ taskbar.notifyUpdateLayoutParams();
+ } else {
+ Log.e(NULL_TASKBAR_ROOT_LAYOUT_TAG,
+ "taskbarRootLayout is null for displayId=" + displayId);
+ }
}
} finally {
Trace.endSection();
@@ -744,17 +766,25 @@
public void dumpLogs(String prefix, PrintWriter pw) {
pw.println(prefix + "TaskbarManager:");
- TaskbarActivityContext taskbar = getTaskbarForDisplay(getDefaultDisplayId());
- if (taskbar == null) {
- pw.println(prefix + "\tTaskbarActivityContext: null");
- } else {
- taskbar.dumpLogs(prefix + "\t", pw);
+ // iterate through taskbars and do the dump for each
+ for (int i = 0; i < mTaskbars.size(); i++) {
+ int displayId = mTaskbars.keyAt(i);
+ TaskbarActivityContext taskbar = mTaskbars.get(i);
+ pw.println(prefix + "\tTaskbar at display " + displayId + ":");
+ if (taskbar == null) {
+ pw.println(prefix + "\t\tTaskbarActivityContext: null");
+ } else {
+ taskbar.dumpLogs(prefix + "\t\t", pw);
+ }
}
+
}
private void addTaskbarRootViewToWindow(int displayId) {
TaskbarActivityContext taskbar = getTaskbarForDisplay(displayId);
if (!enableTaskbarNoRecreate() || taskbar == null) {
+ Log.d(NULL_TASKBAR_ROOT_LAYOUT_TAG,
+ "addTaskbarRootViewToWindow - taskbar null | displayId=" + displayId);
return;
}
@@ -762,6 +792,10 @@
mWindowManager.addView(getTaskbarRootLayoutForDisplay(displayId),
taskbar.getWindowLayoutParams());
mAddedRootLayouts.put(displayId, true);
+ } else {
+ Log.d(NULL_TASKBAR_ROOT_LAYOUT_TAG,
+ "addTaskbarRootViewToWindow - root layout already added | displayId="
+ + displayId);
}
}
@@ -854,6 +888,7 @@
}
};
addTaskbarRootLayoutToMap(displayId, newTaskbarRootLayout);
+ Log.d(NULL_TASKBAR_ROOT_LAYOUT_TAG, "created new root layout - displayId=" + displayId);
}
private boolean isDefaultDisplay(int displayId) {
@@ -867,7 +902,14 @@
* @return The taskbar root layout {@link FrameLayout} for a given display or {@code null}.
*/
private FrameLayout getTaskbarRootLayoutForDisplay(int displayId) {
- return mRootLayouts.get(displayId);
+ FrameLayout frameLayout = mRootLayouts.get(displayId);
+ if (frameLayout != null) {
+ return frameLayout;
+ } else {
+ Log.d(NULL_TASKBAR_ROOT_LAYOUT_TAG,
+ "getTaskbarRootLayoutForDisplay == null | displayId=" + displayId);
+ return null;
+ }
}
/**
@@ -880,6 +922,8 @@
if (!mRootLayouts.contains(displayId) && rootLayout != null) {
mRootLayouts.put(displayId, rootLayout);
}
+
+ Log.d(NULL_TASKBAR_ROOT_LAYOUT_TAG, "mRootLayouts.size()=" + mRootLayouts.size());
}
/**
@@ -892,6 +936,8 @@
mAddedRootLayouts.delete(displayId);
mRootLayouts.delete(displayId);
}
+
+ Log.d(NULL_TASKBAR_ROOT_LAYOUT_TAG, "mRootLayouts.size()=" + mRootLayouts.size());
}
private int getDefaultDisplayId() {
@@ -900,11 +946,17 @@
/** Temp logs for b/254119092. */
public void debugWhyTaskbarNotDestroyed(String debugReason) {
+ debugWhyTaskbarNotDestroyed(debugReason, getDefaultDisplayId());
+ }
+
+ /** Temp logs for b/254119092. */
+ public void debugWhyTaskbarNotDestroyed(String debugReason, int displayId) {
StringJoiner log = new StringJoiner("\n");
- log.add(debugReason);
+ log.add(debugReason + " displayId=" + displayId);
boolean activityTaskbarPresent = mActivity != null
&& mActivity.getDeviceProfile().isTaskbarPresent;
+ // TODO: make this display specific
boolean contextTaskbarPresent = mUserUnlocked && LauncherAppState.getIDP(mWindowContext)
.getDeviceProfile(mWindowContext).isTaskbarPresent;
if (activityTaskbarPresent == contextTaskbarPresent) {
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarOverflowView.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarOverflowView.java
index 0ed6669..017a12c 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarOverflowView.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarOverflowView.java
@@ -39,7 +39,6 @@
import androidx.core.graphics.ColorUtils;
import com.android.app.animation.Interpolators;
-import com.android.launcher3.R;
import com.android.launcher3.Reorderable;
import com.android.launcher3.Utilities;
import com.android.launcher3.icons.IconNormalizer;
@@ -243,7 +242,9 @@
private void init() {
mIsRtlLayout = Utilities.isRtl(getResources());
mItemBackgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
- mItemBackgroundColor = getContext().getColor(R.color.taskbar_background);
+ mItemBackgroundColor = getContext().getColor(Utilities.isDarkTheme(getContext())
+ ? com.android.internal.R.color.materialColorSurface
+ : com.android.internal.R.color.materialColorInverseOnSurface);
mLeaveBehindColor = Themes.getAttrColor(getContext(), android.R.attr.textColorTertiary);
setWillNotDraw(false);
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarRecentAppsController.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarRecentAppsController.kt
index 753da9e..6047999 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarRecentAppsController.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarRecentAppsController.kt
@@ -26,6 +26,7 @@
import com.android.launcher3.model.data.WorkspaceItemInfo
import com.android.launcher3.taskbar.TaskbarControllers.LoggableTaskbarController
import com.android.launcher3.util.CancellableTask
+import com.android.quickstep.RecentsFilterState
import com.android.quickstep.RecentsModel
import com.android.quickstep.util.DesktopTask
import com.android.quickstep.util.GroupTask
@@ -76,30 +77,43 @@
private set
/**
+ * The task-state of an app, i.e. whether the app has a task and what state
+ * that task is in.
+ *
+ * @property taskId The ID of the task if one exists (i.e. if the state is
+ * RUNNING or MINIMIZED), null otherwise (NOT_RUNNING).
+ */
+ data class TaskState(val runningAppState: RunningAppState, val taskId: Int? = null)
+
+ /**
* Returns the state of the most active Desktop task represented by the given [ItemInfo].
*
* If there are several tasks represented by the same [ItemInfo] we return the most active one,
* i.e. we return [DesktopAppState.RUNNING] over [DesktopAppState.MINIMIZED], and
* [DesktopAppState.MINIMIZED] over [DesktopAppState.NOT_RUNNING].
*/
- fun getDesktopItemState(itemInfo: ItemInfo?): RunningAppState {
- val packageName = itemInfo?.getTargetPackage() ?: return RunningAppState.NOT_RUNNING
- return getDesktopAppState(packageName, itemInfo.user.identifier)
+ fun getDesktopItemState(itemInfo: ItemInfo?): TaskState {
+ val packageName =
+ itemInfo?.getTargetPackage() ?: return TaskState(RunningAppState.NOT_RUNNING)
+ return getDesktopTaskState(packageName, itemInfo.user.identifier)
}
- private fun getDesktopAppState(packageName: String, userId: Int): RunningAppState {
- val tasks = desktopTask?.tasks ?: return RunningAppState.NOT_RUNNING
+ private fun getDesktopTaskState(packageName: String, userId: Int): TaskState {
+ val tasks = desktopTask?.tasks ?: return TaskState(RunningAppState.NOT_RUNNING)
val appTasks =
tasks.filter { task ->
packageName == task.key.packageName && task.key.userId == userId
}
- if (appTasks.find { getRunningAppState(it.key.id) == RunningAppState.RUNNING } != null) {
- return RunningAppState.RUNNING
+ val runningTask = appTasks.find { getRunningAppState(it.key.id) == RunningAppState.RUNNING }
+ if (runningTask != null) {
+ return TaskState(RunningAppState.RUNNING, runningTask.key.id)
}
- if (appTasks.find { getRunningAppState(it.key.id) == RunningAppState.MINIMIZED } != null) {
- return RunningAppState.MINIMIZED
+ val minimizedTask =
+ appTasks.find { getRunningAppState(it.key.id) == RunningAppState.MINIMIZED }
+ if (minimizedTask != null) {
+ return TaskState(RunningAppState.MINIMIZED, taskId = minimizedTask.key.id)
}
- return RunningAppState.NOT_RUNNING
+ return TaskState(RunningAppState.NOT_RUNNING)
}
/** Get the [RunningAppState] for the given task. */
@@ -120,7 +134,7 @@
get() {
if (
!canShowRunningApps ||
- !controllers.taskbarDesktopModeController.areDesktopTasksVisible
+ !controllers.taskbarDesktopModeController.shouldShowDesktopTasksInTaskbar()
) {
return emptySet()
}
@@ -136,7 +150,7 @@
get() {
if (
!canShowRunningApps ||
- !controllers.taskbarDesktopModeController.areDesktopTasksVisible
+ !controllers.taskbarDesktopModeController.shouldShowDesktopTasksInTaskbar()
) {
return emptySet()
}
@@ -172,10 +186,10 @@
/** Called to update hotseatItems, in order to de-dupe them from Recent/Running tasks later. */
fun updateHotseatItemInfos(hotseatItems: Array<ItemInfo?>): Array<ItemInfo?> {
// Ignore predicted apps - we show running or recent apps instead.
- val areDesktopTasksVisible = controllers.taskbarDesktopModeController.areDesktopTasksVisible
+ val showDesktopTasks =
+ controllers.taskbarDesktopModeController.shouldShowDesktopTasksInTaskbar()
val removePredictions =
- (areDesktopTasksVisible && canShowRunningApps) ||
- (!areDesktopTasksVisible && canShowRecentApps)
+ (showDesktopTasks && canShowRunningApps) || (!showDesktopTasks && canShowRecentApps)
if (!removePredictions) {
shownHotseatItems = hotseatItems.filterNotNull()
onRecentsOrHotseatChanged()
@@ -187,7 +201,7 @@
.filter { itemInfo -> !itemInfo.isPredictedItem }
.toMutableList()
- if (areDesktopTasksVisible && canShowRunningApps) {
+ if (showDesktopTasks && canShowRunningApps) {
shownHotseatItems =
updateHotseatItemsFromRunningTasks(
getOrderedAndWrappedDesktopTasks(),
@@ -211,19 +225,24 @@
private fun reloadRecentTasksIfNeeded() {
if (!recentsModel.isTaskListValid(taskListChangeId)) {
taskListChangeId =
- recentsModel.getTasks { tasks ->
- allRecentTasks = tasks
- val oldRunningTaskdIds = runningTaskIds
- val oldMinimizedTaskIds = minimizedTaskIds
- desktopTask = allRecentTasks.filterIsInstance<DesktopTask>().firstOrNull()
- val runningTasksChanged = oldRunningTaskdIds != runningTaskIds
- val minimizedTasksChanged = oldMinimizedTaskIds != minimizedTaskIds
- if (
- onRecentsOrHotseatChanged() || runningTasksChanged || minimizedTasksChanged
- ) {
- controllers.taskbarViewController.commitRunningAppsToUI()
- }
- }
+ recentsModel.getTasks(
+ { tasks ->
+ allRecentTasks = tasks
+ val oldRunningTaskdIds = runningTaskIds
+ val oldMinimizedTaskIds = minimizedTaskIds
+ desktopTask = allRecentTasks.filterIsInstance<DesktopTask>().firstOrNull()
+ val runningTasksChanged = oldRunningTaskdIds != runningTaskIds
+ val minimizedTasksChanged = oldMinimizedTaskIds != minimizedTaskIds
+ if (
+ onRecentsOrHotseatChanged() ||
+ runningTasksChanged ||
+ minimizedTasksChanged
+ ) {
+ controllers.taskbarViewController.commitRunningAppsToUI()
+ }
+ },
+ RecentsFilterState.EMPTY_FILTER,
+ )
}
}
@@ -236,7 +255,7 @@
val oldShownTasks = shownTasks
orderedRunningTaskIds = updateOrderedRunningTaskIds()
shownTasks =
- if (controllers.taskbarDesktopModeController.areDesktopTasksVisible) {
+ if (controllers.taskbarDesktopModeController.shouldShowDesktopTasksInTaskbar()) {
computeShownRunningTasks()
} else {
computeShownRecentTasks()
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java
index 502c001..68114f1 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java
@@ -35,7 +35,7 @@
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_BUBBLES_EXPANDED;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_DIALOG_SHOWING;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_IME_SHOWING;
-import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_IME_SWITCHER_SHOWING;
+import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_IME_SWITCHER_BUTTON_SHOWING;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NOTIFICATION_PANEL_VISIBLE;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SCREEN_PINNING;
@@ -259,8 +259,10 @@
private @Nullable AnimatorSet mAnimator;
private boolean mIsSystemGestureInProgress;
+ /** Whether the IME is visible. */
private boolean mIsImeShowing;
- private boolean mIsImeSwitcherShowing;
+ /** Whether the IME Switcher button is visible. */
+ private boolean mIsImeSwitcherButtonShowing;
private final Alarm mTimeoutAlarm = new Alarm();
private boolean mEnableBlockingTimeoutDuringTests = false;
@@ -269,6 +271,8 @@
private final long mTaskbarBackgroundDuration;
private boolean mUserIsNotGoingHome = false;
+ private final boolean mInAppStateAffectsDesktopTasksVisibilityInTaskbar;
+
// Evaluate whether the handle should be stashed
private final LongPredicate mIsStashedPredicate = flags -> {
boolean inApp = hasAnyFlag(flags, FLAGS_IN_APP);
@@ -293,8 +297,17 @@
mSystemUiProxy = SystemUiProxy.INSTANCE.get(activity);
mAccessibilityManager = mActivity.getSystemService(AccessibilityManager.class);
- mTaskbarBackgroundDuration =
- activity.getResources().getInteger(R.integer.taskbar_background_duration);
+ // Taskbar, via `TaskbarDesktopModeController`, depends on `TaskbarStashController` state to
+ // determine whether desktop tasks should be shown because taskbar is pinned on the home
+ // screen for freeform windowing displays. In this case, list of items shown in the taskbar
+ // needs to be updated when in-app state changes.
+ // TODO(b/390665752): Feature to "lock" pinned taskbar to home screen will be superseded by
+ // pinning, in other launcher states, at which point this variable can be removed.
+ mInAppStateAffectsDesktopTasksVisibilityInTaskbar =
+ DisplayController.showLockedTaskbarOnHome(mActivity);
+
+ mTaskbarBackgroundDuration = activity.getResources().getInteger(
+ R.integer.taskbar_background_duration);
if (mActivity.isPhoneMode()) {
mUnstashedHeight = mActivity.getResources().getDimensionPixelSize(
R.dimen.taskbar_phone_size);
@@ -1136,7 +1149,8 @@
SystemUiFlagUtils.isLocked(systemUiStateFlags));
mIsImeShowing = hasAnyFlag(systemUiStateFlags, SYSUI_STATE_IME_SHOWING);
- mIsImeSwitcherShowing = hasAnyFlag(systemUiStateFlags, SYSUI_STATE_IME_SWITCHER_SHOWING);
+ mIsImeSwitcherButtonShowing =
+ hasAnyFlag(systemUiStateFlags, SYSUI_STATE_IME_SWITCHER_BUTTON_SHOWING);
if (updateStateForFlag(FLAG_STASHED_IME, shouldStashForIme())) {
animDuration = TASKBAR_STASH_DURATION_FOR_IME;
startDelay = getTaskbarStashStartDelayForIme();
@@ -1188,7 +1202,7 @@
return false;
}
- return mIsImeShowing || mIsImeSwitcherShowing;
+ return mIsImeShowing || mIsImeSwitcherButtonShowing;
}
/**
@@ -1237,6 +1251,10 @@
if (hasAnyFlag(changedFlags, FLAG_IN_OVERVIEW | FLAG_IN_APP)) {
mControllers.runAfterInit(() -> mControllers.taskbarInsetsController
.onTaskbarOrBubblebarWindowHeightOrInsetsChanged());
+ if (mInAppStateAffectsDesktopTasksVisibilityInTaskbar) {
+ mControllers.runAfterInit(
+ () -> mControllers.taskbarViewController.commitRunningAppsToUI());
+ }
}
mActivity.applyForciblyShownFlagWhileTransientTaskbarUnstashed(!isStashedInApp());
}
@@ -1360,7 +1378,7 @@
pw.println(prefix + "\tmState=" + getStateString(mState));
pw.println(prefix + "\tmIsSystemGestureInProgress=" + mIsSystemGestureInProgress);
pw.println(prefix + "\tmIsImeShowing=" + mIsImeShowing);
- pw.println(prefix + "\tmIsImeSwitcherShowing=" + mIsImeSwitcherShowing);
+ pw.println(prefix + "\tmIsImeSwitcherButtonShowing=" + mIsImeSwitcherButtonShowing);
}
private static String getStateString(long flags) {
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarController.java b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarController.java
index 7d39bf8..aff879e 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarController.java
@@ -20,7 +20,7 @@
import static com.android.launcher3.util.Executors.MAIN_EXECUTOR;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_BOUNCER_SHOWING;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_IME_SHOWING;
-import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_IME_SWITCHER_SHOWING;
+import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_IME_SWITCHER_BUTTON_SHOWING;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_QUICK_SETTINGS_EXPANDED;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING;
@@ -34,6 +34,7 @@
import android.os.SystemProperties;
import android.util.ArrayMap;
import android.util.Log;
+import android.widget.Toast;
import com.android.launcher3.taskbar.TaskbarSharedState;
import com.android.launcher3.taskbar.bubbles.stashing.BubbleStashController;
@@ -94,7 +95,7 @@
| SYSUI_STATE_IME_SHOWING
| SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED
| SYSUI_STATE_QUICK_SETTINGS_EXPANDED
- | SYSUI_STATE_IME_SWITCHER_SHOWING;
+ | SYSUI_STATE_IME_SWITCHER_BUTTON_SHOWING;
private static final long MASK_HIDE_HANDLE_VIEW = SYSUI_STATE_BOUNCER_SHOWING
| SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING
@@ -589,6 +590,18 @@
});
}
+ @Override
+ public void onDragItemOverBubbleBarDragZone(BubbleBarLocation location) {
+ //TODO(b/388894910): add meaningful implementation
+ MAIN_EXECUTOR.execute(() ->
+ Toast.makeText(mContext, "onDragItemOver " + location, Toast.LENGTH_SHORT).show());
+ }
+
+ @Override
+ public void onItemDraggedOutsideBubbleBarDropZone() {
+
+ }
+
/** Notifies WMShell to show the expanded view. */
void showExpandedView() {
mSystemUiProxy.showExpandedView();
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java
index afbc932..026f239 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java
@@ -588,7 +588,7 @@
/** Returns maximum height of the bubble bar with the flyout view. */
public int getBubbleBarWithFlyoutMaximumHeight() {
- if (!isBubbleBarVisible() && !isAnimatingNewBubble()) return 0;
+ if (!hasBubbles() && !isAnimatingNewBubble()) return 0;
int bubbleBarTopOnHome = (int) (mBubbleStashController.getBubbleBarVerticalCenterForHome()
+ mBarView.getBubbleBarCollapsedHeight() / 2 + mBarView.getArrowHeight());
if (isAnimatingNewBubble()) {
diff --git a/quickstep/src/com/android/launcher3/uioverrides/PredictedAppIcon.java b/quickstep/src/com/android/launcher3/uioverrides/PredictedAppIcon.java
index b0cb484..a85e5e0 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/PredictedAppIcon.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/PredictedAppIcon.java
@@ -50,8 +50,8 @@
import com.android.launcher3.anim.AnimatorListeners;
import com.android.launcher3.celllayout.CellLayoutLayoutParams;
import com.android.launcher3.celllayout.DelegatedCellDrawing;
+import com.android.launcher3.graphics.IconShape;
import com.android.launcher3.icons.FastBitmapDrawable;
-import com.android.launcher3.icons.GraphicsUtils;
import com.android.launcher3.icons.IconNormalizer;
import com.android.launcher3.icons.LauncherIcons;
import com.android.launcher3.model.data.ItemInfoWithIcon;
@@ -142,7 +142,7 @@
int shadowSize = context.getResources().getDimensionPixelSize(
R.dimen.blur_size_thin_outline);
mShadowFilter = new BlurMaskFilter(shadowSize, BlurMaskFilter.Blur.OUTER);
- mShapePath = GraphicsUtils.getShapePath(context, mNormalizedIconSize);
+ mShapePath = IconShape.INSTANCE.get(context).getShapeOverridePath(mNormalizedIconSize);
}
@Override
diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
index 58ebc50..f672840 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
@@ -23,6 +23,7 @@
import static com.android.app.animation.Interpolators.EMPHASIZED;
import static com.android.internal.jank.Cuj.CUJ_LAUNCHER_LAUNCH_APP_PAIR_FROM_WORKSPACE;
+import static com.android.launcher3.Flags.enableExpressiveDismissTaskMotion;
import static com.android.launcher3.Flags.enableUnfoldStateAnimation;
import static com.android.launcher3.LauncherConstants.SavedInstanceKeys.PENDING_SPLIT_SELECT_INFO;
import static com.android.launcher3.LauncherConstants.SavedInstanceKeys.RUNTIME_STATE;
@@ -149,7 +150,9 @@
import com.android.launcher3.uioverrides.touchcontrollers.PortraitStatesTouchController;
import com.android.launcher3.uioverrides.touchcontrollers.QuickSwitchTouchController;
import com.android.launcher3.uioverrides.touchcontrollers.StatusBarTouchController;
+import com.android.launcher3.uioverrides.touchcontrollers.TaskViewRecentsTouchContext;
import com.android.launcher3.uioverrides.touchcontrollers.TaskViewTouchController;
+import com.android.launcher3.uioverrides.touchcontrollers.TaskViewTouchControllerDeprecated;
import com.android.launcher3.uioverrides.touchcontrollers.TransposedQuickSwitchTouchController;
import com.android.launcher3.uioverrides.touchcontrollers.TwoButtonNavbarTouchController;
import com.android.launcher3.util.ActivityOptionsWrapper;
@@ -265,6 +268,25 @@
private final OverviewChangeListener mOverviewChangeListener = this::onOverviewTargetChanged;
+ private final TaskViewRecentsTouchContext mTaskViewRecentsTouchContext =
+ new TaskViewRecentsTouchContext() {
+ @Override
+ public boolean isRecentsInteractive() {
+ return isInState(OVERVIEW) || isInState(OVERVIEW_MODAL_TASK);
+ }
+
+ @Override
+ public boolean isRecentsModal() {
+ return isInState(OVERVIEW_MODAL_TASK);
+ }
+
+ @Override
+ public void onUserControlledAnimationCreated(
+ AnimatorPlaybackController animController) {
+ getStateManager().setCurrentUserControlledAnimation(animController);
+ }
+ };
+
public static QuickstepLauncher getLauncher(Context context) {
return fromContext(context);
}
@@ -665,7 +687,11 @@
list.add(new StatusBarTouchController(this));
}
- list.add(new LauncherTaskViewController(this));
+ if (enableExpressiveDismissTaskMotion()) {
+ list.add(new TaskViewTouchController<>(this, mTaskViewRecentsTouchContext));
+ } else {
+ list.add(new TaskViewTouchControllerDeprecated<>(this, mTaskViewRecentsTouchContext));
+ }
return list.toArray(new TouchController[list.size()]);
}
@@ -1442,29 +1468,6 @@
mBubbleBarLocation = bubbleBarLocation;
}
- private static final class LauncherTaskViewController extends
- TaskViewTouchController<QuickstepLauncher> {
-
- LauncherTaskViewController(QuickstepLauncher activity) {
- super(activity);
- }
-
- @Override
- protected boolean isRecentsInteractive() {
- return mContainer.isInState(OVERVIEW) || mContainer.isInState(OVERVIEW_MODAL_TASK);
- }
-
- @Override
- protected boolean isRecentsModal() {
- return mContainer.isInState(OVERVIEW_MODAL_TASK);
- }
-
- @Override
- protected void onUserControlledAnimationCreated(AnimatorPlaybackController animController) {
- mContainer.getStateManager().setCurrentUserControlledAnimation(animController);
- }
- }
-
@Override
public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {
super.dump(prefix, fd, writer, args);
diff --git a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewRecentsTouchContext.java b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewRecentsTouchContext.java
new file mode 100644
index 0000000..e8d31c1
--- /dev/null
+++ b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewRecentsTouchContext.java
@@ -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.launcher3.uioverrides.touchcontrollers;
+
+import com.android.launcher3.anim.AnimatorPlaybackController;
+
+/** Interface providing context about the RecentsView state to a {@link TaskViewTouchController}. */
+public interface TaskViewRecentsTouchContext {
+ /** Returns whether Recents is interactive for touch. */
+ boolean isRecentsInteractive();
+
+ /** Returns if Recents is showing a single task in a modal way. */
+ boolean isRecentsModal();
+
+ /** Runs when a user controlled animation is created. */
+ default void onUserControlledAnimationCreated(AnimatorPlaybackController animController) {
+ }
+}
diff --git a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewTouchController.kt b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewTouchController.kt
new file mode 100644
index 0000000..c996f34
--- /dev/null
+++ b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewTouchController.kt
@@ -0,0 +1,394 @@
+/*
+ * 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.uioverrides.touchcontrollers
+
+import android.animation.Animator
+import android.animation.AnimatorListenerAdapter
+import android.content.Context
+import android.graphics.Rect
+import android.os.VibrationEffect
+import android.view.MotionEvent
+import android.view.animation.Interpolator
+import com.android.app.animation.Interpolators
+import com.android.launcher3.AbstractFloatingView
+import com.android.launcher3.LauncherAnimUtils.SUCCESS_TRANSITION_PROGRESS
+import com.android.launcher3.LauncherAnimUtils.blockedFlingDurationFactor
+import com.android.launcher3.R
+import com.android.launcher3.Utilities
+import com.android.launcher3.anim.AnimatorPlaybackController
+import com.android.launcher3.anim.PendingAnimation
+import com.android.launcher3.touch.BaseSwipeDetector
+import com.android.launcher3.touch.SingleAxisSwipeDetector
+import com.android.launcher3.util.DisplayController
+import com.android.launcher3.util.FlingBlockCheck
+import com.android.launcher3.util.TouchController
+import com.android.launcher3.util.VibratorWrapper
+import com.android.quickstep.util.VibrationConstants
+import com.android.quickstep.views.RecentsView
+import com.android.quickstep.views.RecentsViewContainer
+import com.android.quickstep.views.TaskView
+import kotlin.math.abs
+
+/** Touch controller for handling task view card swipes */
+class TaskViewTouchController<CONTAINER>(
+ private val container: CONTAINER,
+ private val taskViewRecentsTouchContext: TaskViewRecentsTouchContext,
+) : AnimatorListenerAdapter(), TouchController, SingleAxisSwipeDetector.Listener where
+CONTAINER : Context,
+CONTAINER : RecentsViewContainer {
+ private val recentsView: RecentsView<*, *> = container.getOverviewPanel()
+ private val detector: SingleAxisSwipeDetector =
+ SingleAxisSwipeDetector(
+ container as Context,
+ this,
+ recentsView.pagedOrientationHandler.upDownSwipeDirection,
+ )
+ private val tempRect = Rect()
+ private val isRtl = Utilities.isRtl(container.resources)
+ private val flingBlockCheck = FlingBlockCheck()
+
+ private var currentAnimation: AnimatorPlaybackController? = null
+ private var currentAnimationIsGoingUp = false
+ private var allowGoingUp = false
+ private var allowGoingDown = false
+ private var noIntercept = false
+ private var displacementShift = 0f
+ private var progressMultiplier = 0f
+ private var endDisplacement = 0f
+ private var draggingEnabled = true
+ private var overrideVelocity: Float? = null
+ private var taskBeingDragged: TaskView? = null
+ private var isDismissHapticRunning = false
+
+ private fun canInterceptTouch(ev: MotionEvent): Boolean {
+ val currentAnimation = currentAnimation
+ return when {
+ (ev.edgeFlags and Utilities.EDGE_NAV_BAR) != 0 -> {
+ // Don't intercept swipes on the nav bar, as user might be trying to go home
+ // during a task dismiss animation.
+ currentAnimation?.animationPlayer?.end()
+ false
+ }
+ currentAnimation != null -> {
+ currentAnimation.forceFinishIfCloseToEnd()
+ true
+ }
+ AbstractFloatingView.getTopOpenViewWithType(
+ container,
+ AbstractFloatingView.TYPE_TOUCH_CONTROLLER_NO_INTERCEPT,
+ ) != null -> false
+ else -> taskViewRecentsTouchContext.isRecentsInteractive
+ }
+ }
+
+ override fun onAnimationCancel(animation: Animator) {
+ if (animation === currentAnimation?.target) {
+ clearState()
+ }
+ }
+
+ override fun onControllerInterceptTouchEvent(ev: MotionEvent): Boolean {
+ if (
+ (ev.action == MotionEvent.ACTION_UP || ev.action == MotionEvent.ACTION_CANCEL) &&
+ currentAnimation == null
+ ) {
+ clearState()
+ }
+ if (ev.action == MotionEvent.ACTION_DOWN) {
+ // Disable swiping up and down if the task overlay is modal.
+ if (taskViewRecentsTouchContext.isRecentsModal) {
+ noIntercept = true
+ return false
+ }
+ noIntercept = !canInterceptTouch(ev)
+ if (noIntercept) {
+ return false
+ }
+ // Now figure out which direction scroll events the controller will start
+ // calling the callbacks.
+ var directionsToDetectScroll = 0
+ var ignoreSlopWhenSettling = false
+ if (currentAnimation != null) {
+ directionsToDetectScroll = SingleAxisSwipeDetector.DIRECTION_BOTH
+ ignoreSlopWhenSettling = true
+ } else {
+ taskBeingDragged = null
+ recentsView.taskViews.forEach { taskView ->
+ if (
+ recentsView.isTaskViewVisible(taskView) &&
+ container.dragLayer.isEventOverView(taskView, ev)
+ ) {
+ taskBeingDragged = taskView
+ val upDirection = recentsView.pagedOrientationHandler.getUpDirection(isRtl)
+
+ // The task can be dragged up to dismiss it
+ allowGoingUp = true
+
+ // The task can be dragged down to open it if:
+ // - It's the current page
+ // - We support gestures to enter overview
+ // - It's the focused task if in grid view
+ // - The task is snapped
+ allowGoingDown =
+ taskView === recentsView.currentPageTaskView &&
+ DisplayController.getNavigationMode(container).hasGestures &&
+ (!recentsView.showAsGrid() || taskView.isLargeTile) &&
+ recentsView.isTaskInExpectedScrollPosition(taskView)
+
+ directionsToDetectScroll =
+ if (allowGoingDown) SingleAxisSwipeDetector.DIRECTION_BOTH
+ else upDirection
+ return@forEach
+ }
+ }
+ if (taskBeingDragged == null) {
+ noIntercept = true
+ return false
+ }
+ }
+ detector.setDetectableScrollConditions(directionsToDetectScroll, ignoreSlopWhenSettling)
+ }
+ if (noIntercept) {
+ return false
+ }
+ onControllerTouchEvent(ev)
+ return detector.isDraggingOrSettling
+ }
+
+ override fun onControllerTouchEvent(ev: MotionEvent): Boolean = detector.onTouchEvent(ev)
+
+ private fun reInitAnimationController(goingUp: Boolean) {
+ if (currentAnimation != null && currentAnimationIsGoingUp == goingUp) {
+ // No need to init
+ return
+ }
+ if ((goingUp && !allowGoingUp) || (!goingUp && !allowGoingDown)) {
+ // Trying to re-init in an unsupported direction.
+ return
+ }
+ val taskBeingDragged = taskBeingDragged ?: return
+ currentAnimation?.setPlayFraction(0f)
+ currentAnimation?.target?.removeListener(this)
+ currentAnimation?.dispatchOnCancel()
+
+ val orientationHandler = recentsView.pagedOrientationHandler
+ currentAnimationIsGoingUp = goingUp
+ val dl = container.dragLayer
+ val secondaryLayerDimension = orientationHandler.getSecondaryDimension(dl)
+ val maxDuration = 2L * secondaryLayerDimension
+ val verticalFactor = orientationHandler.getTaskDragDisplacementFactor(isRtl)
+ val secondaryTaskDimension = orientationHandler.getSecondaryDimension(taskBeingDragged)
+ // The interpolator controlling the most prominent visual movement. We use this to determine
+ // whether we passed SUCCESS_TRANSITION_PROGRESS.
+ val currentInterpolator: Interpolator
+ val pa: PendingAnimation
+ if (goingUp) {
+ currentInterpolator = Interpolators.LINEAR
+ pa = PendingAnimation(maxDuration)
+ recentsView.createTaskDismissAnimation(
+ pa,
+ taskBeingDragged,
+ true, /* animateTaskView */
+ true, /* removeTask */
+ maxDuration,
+ false, /* dismissingForSplitSelection*/
+ )
+
+ endDisplacement = -secondaryTaskDimension.toFloat()
+ } else {
+ currentInterpolator = Interpolators.ZOOM_IN
+ pa =
+ recentsView.createTaskLaunchAnimation(
+ taskBeingDragged,
+ maxDuration,
+ currentInterpolator,
+ )
+
+ // Since the thumbnail is what is filling the screen, based the end displacement on it.
+ taskBeingDragged.getThumbnailBounds(tempRect, /* relativeToDragLayer= */ true)
+ endDisplacement = (secondaryLayerDimension - tempRect.bottom).toFloat()
+ }
+ endDisplacement *= verticalFactor.toFloat()
+ currentAnimation =
+ pa.createPlaybackController().apply {
+ // Setting this interpolator doesn't affect the visual motion, but is used to
+ // determine whether we successfully reached the target state in onDragEnd().
+ target.interpolator = currentInterpolator
+ taskViewRecentsTouchContext.onUserControlledAnimationCreated(this)
+ target.addListener(this@TaskViewTouchController)
+ dispatchOnStart()
+ }
+ progressMultiplier = 1 / endDisplacement
+ }
+
+ override fun onDragStart(start: Boolean, startDisplacement: Float) {
+ if (!draggingEnabled) return
+ val currentAnimation = currentAnimation
+
+ val orientationHandler = recentsView.pagedOrientationHandler
+ if (currentAnimation == null) {
+ reInitAnimationController(orientationHandler.isGoingUp(startDisplacement, isRtl))
+ displacementShift = 0f
+ } else {
+ displacementShift = currentAnimation.progressFraction / progressMultiplier
+ currentAnimation.pause()
+ }
+ flingBlockCheck.unblockFling()
+ overrideVelocity = null
+ }
+
+ override fun onDrag(displacement: Float): Boolean {
+ if (!draggingEnabled) return true
+ val taskBeingDragged = taskBeingDragged ?: return true
+ val currentAnimation = currentAnimation ?: return true
+
+ val orientationHandler = recentsView.pagedOrientationHandler
+ val totalDisplacement = displacement + displacementShift
+ val isGoingUp =
+ if (totalDisplacement == 0f) currentAnimationIsGoingUp
+ else orientationHandler.isGoingUp(totalDisplacement, isRtl)
+ if (isGoingUp != currentAnimationIsGoingUp) {
+ reInitAnimationController(isGoingUp)
+ flingBlockCheck.blockFling()
+ } else {
+ flingBlockCheck.onEvent()
+ }
+
+ if (isGoingUp) {
+ if (currentAnimation.progressFraction < ANIMATION_PROGRESS_FRACTION_MIDPOINT) {
+ // Halve the value when dismissing, as we are animating the drag across the full
+ // length for only the first half of the progress
+ currentAnimation.setPlayFraction(
+ Utilities.boundToRange(totalDisplacement * progressMultiplier / 2, 0f, 1f)
+ )
+ } else {
+ // Set mOverrideVelocity to control task dismiss velocity in onDragEnd
+ var velocityDimenId = R.dimen.default_task_dismiss_drag_velocity
+ if (recentsView.showAsGrid()) {
+ velocityDimenId =
+ if (taskBeingDragged.isLargeTile) {
+ R.dimen.default_task_dismiss_drag_velocity_grid_focus_task
+ } else {
+ R.dimen.default_task_dismiss_drag_velocity_grid
+ }
+ }
+ overrideVelocity = -taskBeingDragged.resources.getDimension(velocityDimenId)
+
+ // Once halfway through task dismissal interpolation, switch from reversible
+ // dragging-task animation to playing the remaining task translation animations,
+ // while this is in progress disable dragging.
+ draggingEnabled = false
+ }
+ } else {
+ currentAnimation.setPlayFraction(
+ Utilities.boundToRange(totalDisplacement * progressMultiplier, 0f, 1f)
+ )
+ }
+
+ return true
+ }
+
+ override fun onDragEnd(velocity: Float) {
+ val taskBeingDragged = taskBeingDragged ?: return
+ val currentAnimation = currentAnimation ?: return
+
+ // Limit velocity, as very large scalar values make animations play too quickly
+ val maxTaskDismissDragVelocity =
+ taskBeingDragged.resources.getDimension(R.dimen.max_task_dismiss_drag_velocity)
+ val endVelocity =
+ Utilities.boundToRange(
+ overrideVelocity ?: velocity,
+ -maxTaskDismissDragVelocity,
+ maxTaskDismissDragVelocity,
+ )
+ overrideVelocity = null
+
+ var fling = draggingEnabled && detector.isFling(endVelocity)
+ val goingToEnd: Boolean
+ val blockedFling = fling && flingBlockCheck.isBlocked
+ if (blockedFling) {
+ fling = false
+ }
+ val orientationHandler = recentsView.pagedOrientationHandler
+ val goingUp = orientationHandler.isGoingUp(endVelocity, isRtl)
+ val progress = currentAnimation.progressFraction
+ val interpolatedProgress = currentAnimation.interpolatedProgress
+ goingToEnd =
+ if (fling) {
+ goingUp == currentAnimationIsGoingUp
+ } else {
+ interpolatedProgress > SUCCESS_TRANSITION_PROGRESS
+ }
+ var animationDuration =
+ BaseSwipeDetector.calculateDuration(
+ endVelocity,
+ if (goingToEnd) (1 - progress) else progress,
+ )
+ if (blockedFling && !goingToEnd) {
+ animationDuration *= blockedFlingDurationFactor(endVelocity).toLong()
+ }
+ // Due to very high or low velocity dismissals, animation durations can be inconsistently
+ // long or short. Bound the duration for animation of task translations for a more
+ // standardized feel.
+ animationDuration =
+ Utilities.boundToRange(
+ animationDuration,
+ MIN_TASK_DISMISS_ANIMATION_DURATION,
+ MAX_TASK_DISMISS_ANIMATION_DURATION,
+ )
+
+ currentAnimation.setEndAction { this.clearState() }
+ currentAnimation.startWithVelocity(
+ container,
+ goingToEnd,
+ abs(endVelocity.toDouble()).toFloat(),
+ endDisplacement,
+ animationDuration,
+ )
+ if (goingUp && goingToEnd && !isDismissHapticRunning) {
+ VibratorWrapper.INSTANCE.get(container)
+ .vibrate(
+ TASK_DISMISS_VIBRATION_PRIMITIVE,
+ TASK_DISMISS_VIBRATION_PRIMITIVE_SCALE,
+ TASK_DISMISS_VIBRATION_FALLBACK,
+ )
+ isDismissHapticRunning = true
+ }
+
+ draggingEnabled = true
+ }
+
+ private fun clearState() {
+ detector.finishedScrolling()
+ detector.setDetectableScrollConditions(0, false)
+ draggingEnabled = true
+ taskBeingDragged = null
+ currentAnimation = null
+ isDismissHapticRunning = false
+ }
+
+ companion object {
+ private const val ANIMATION_PROGRESS_FRACTION_MIDPOINT = 0.5f
+ private const val MIN_TASK_DISMISS_ANIMATION_DURATION: Long = 300
+ private const val MAX_TASK_DISMISS_ANIMATION_DURATION: Long = 600
+
+ private const val TASK_DISMISS_VIBRATION_PRIMITIVE: Int =
+ VibrationEffect.Composition.PRIMITIVE_TICK
+ private const val TASK_DISMISS_VIBRATION_PRIMITIVE_SCALE: Float = 1f
+ private val TASK_DISMISS_VIBRATION_FALLBACK: VibrationEffect =
+ VibrationConstants.EFFECT_TEXTURE_TICK
+ }
+}
diff --git a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewTouchController.java b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewTouchControllerDeprecated.java
similarity index 94%
rename from quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewTouchController.java
rename to quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewTouchControllerDeprecated.java
index d622987..b1a36c7 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewTouchController.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewTouchControllerDeprecated.java
@@ -49,10 +49,13 @@
/**
* Touch controller for handling task view card swipes
+ *
+ * @deprecated This class will be replaced by the new {@link TaskViewTouchController}.
*/
-public abstract class TaskViewTouchController<CONTAINER extends Context & RecentsViewContainer>
- extends AnimatorListenerAdapter implements TouchController,
- SingleAxisSwipeDetector.Listener {
+@Deprecated
+public class TaskViewTouchControllerDeprecated<
+ CONTAINER extends Context & RecentsViewContainer> extends AnimatorListenerAdapter
+ implements TouchController, SingleAxisSwipeDetector.Listener {
private static final float ANIMATION_PROGRESS_FRACTION_MIDPOINT = 0.5f;
private static final long MIN_TASK_DISMISS_ANIMATION_DURATION = 300;
@@ -65,6 +68,7 @@
VibrationConstants.EFFECT_TEXTURE_TICK;
protected final CONTAINER mContainer;
+ private final TaskViewRecentsTouchContext mTaskViewRecentsTouchContext;
private final SingleAxisSwipeDetector mDetector;
private final RecentsView<?, ?> mRecentsView;
private final Rect mTempRect = new Rect();
@@ -88,8 +92,10 @@
private boolean mIsDismissHapticRunning = false;
- public TaskViewTouchController(CONTAINER container) {
+ public TaskViewTouchControllerDeprecated(CONTAINER container,
+ TaskViewRecentsTouchContext taskViewRecentsTouchContext) {
mContainer = container;
+ mTaskViewRecentsTouchContext = taskViewRecentsTouchContext;
mRecentsView = container.getOverviewPanel();
mIsRtl = Utilities.isRtl(container.getResources());
SingleAxisSwipeDetector.Direction dir =
@@ -117,15 +123,7 @@
mContainer, TYPE_TOUCH_CONTROLLER_NO_INTERCEPT) != null) {
return false;
}
- return isRecentsInteractive();
- }
-
- protected abstract boolean isRecentsInteractive();
-
- /** Is recents view showing a single task in a modal way. */
- protected abstract boolean isRecentsModal();
-
- protected void onUserControlledAnimationCreated(AnimatorPlaybackController animController) {
+ return mTaskViewRecentsTouchContext.isRecentsInteractive();
}
@Override
@@ -161,7 +159,7 @@
if (mRecentsView.isTaskViewVisible(taskView) && mContainer.getDragLayer()
.isEventOverView(taskView, ev)) {
// Disable swiping up and down if the task overlay is modal.
- if (isRecentsModal()) {
+ if (mTaskViewRecentsTouchContext.isRecentsModal()) {
mTaskBeingDragged = null;
break;
}
@@ -259,7 +257,7 @@
// Setting this interpolator doesn't affect the visual motion, but is used to determine
// whether we successfully reached the target state in onDragEnd().
mCurrentAnimation.getTarget().setInterpolator(currentInterpolator);
- onUserControlledAnimationCreated(mCurrentAnimation);
+ mTaskViewRecentsTouchContext.onUserControlledAnimationCreated(mCurrentAnimation);
mCurrentAnimation.getTarget().addListener(this);
mCurrentAnimation.dispatchOnStart();
mProgressMultiplier = 1 / mEndDisplacement;
diff --git a/quickstep/src/com/android/quickstep/RecentTasksList.java b/quickstep/src/com/android/quickstep/RecentTasksList.java
index ed394cb..01ced75 100644
--- a/quickstep/src/com/android/quickstep/RecentTasksList.java
+++ b/quickstep/src/com/android/quickstep/RecentTasksList.java
@@ -424,10 +424,6 @@
private @Nullable DesktopTask createDesktopTask(GroupedTaskInfo recentTaskInfo) {
ArrayList<Task> tasks = new ArrayList<>(recentTaskInfo.getTaskInfoList().size());
int[] minimizedTaskIds = recentTaskInfo.getMinimizedTaskIds();
- if (minimizedTaskIds.length == recentTaskInfo.getTaskInfoList().size()) {
- // All Tasks are minimized -> don't create a DesktopTask
- return null;
- }
for (TaskInfo taskInfo : recentTaskInfo.getTaskInfoList()) {
Task.TaskKey key = new Task.TaskKey(taskInfo);
Task task = Task.from(key, taskInfo, false);
diff --git a/quickstep/src/com/android/quickstep/RecentsAnimationDeviceState.java b/quickstep/src/com/android/quickstep/RecentsAnimationDeviceState.java
index d4305a5..0c89a80 100644
--- a/quickstep/src/com/android/quickstep/RecentsAnimationDeviceState.java
+++ b/quickstep/src/com/android/quickstep/RecentsAnimationDeviceState.java
@@ -64,12 +64,15 @@
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
+import com.android.launcher3.dagger.ApplicationContext;
+import com.android.launcher3.dagger.LauncherAppComponent;
+import com.android.launcher3.dagger.LauncherAppSingleton;
+import com.android.launcher3.util.DaggerSingletonObject;
+import com.android.launcher3.util.DaggerSingletonTracker;
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.MainThreadInitializedObject;
import com.android.launcher3.util.NavigationMode;
-import com.android.launcher3.util.SafeCloseable;
import com.android.launcher3.util.SettingsCache;
import com.android.quickstep.TopTaskTracker.CachedTaskInfo;
import com.android.quickstep.util.ActiveGestureLog;
@@ -85,13 +88,14 @@
import com.android.systemui.shared.system.TaskStackChangeListeners;
import java.io.PrintWriter;
-import java.util.ArrayList;
+
+import javax.inject.Inject;
/**
* Manages the state of the system during a swipe up gesture.
*/
-public class RecentsAnimationDeviceState implements DisplayInfoChangeListener, ExclusionListener,
- SafeCloseable {
+@LauncherAppSingleton
+public class RecentsAnimationDeviceState implements DisplayInfoChangeListener, ExclusionListener {
static final String SUPPORT_ONE_HANDED_MODE = "ro.support_one_handed_mode";
@@ -99,8 +103,8 @@
private static final float QUICKSTEP_TOUCH_SLOP_RATIO_TWO_BUTTON = 3f;
private static final float QUICKSTEP_TOUCH_SLOP_RATIO_GESTURAL = 1.414f;
- public static MainThreadInitializedObject<RecentsAnimationDeviceState> INSTANCE =
- new MainThreadInitializedObject<>(RecentsAnimationDeviceState::new);
+ public static DaggerSingletonObject<RecentsAnimationDeviceState> INSTANCE =
+ new DaggerSingletonObject<>(LauncherAppComponent::getRecentsAnimationDeviceState);
private final Context mContext;
private final DisplayController mDisplayController;
@@ -110,12 +114,11 @@
private final RotationTouchHelper mRotationTouchHelper;
private final TaskStackChangeListener mPipListener;
+ private final DaggerSingletonTracker mLifeCycle;
// Cache for better performance since it doesn't change at runtime.
private final boolean mCanImeRenderGesturalNavButtons =
InputMethodService.canImeRenderGesturalNavButtons();
- private final ArrayList<Runnable> mOnDestroyActions = new ArrayList<>();
-
private @SystemUiStateFlags long mSystemUiStateFlags = QuickStepContract.SYSUI_STATE_AWAKE;
private NavigationMode mMode = THREE_BUTTONS;
private NavBarPosition mNavBarPosition;
@@ -134,35 +137,39 @@
private @NonNull Region mExclusionRegion = GestureExclusionManager.EMPTY_REGION;
private boolean mExclusionListenerRegistered;
- private RecentsAnimationDeviceState(Context context) {
- this(context, GestureExclusionManager.INSTANCE);
- }
-
@VisibleForTesting
- RecentsAnimationDeviceState(Context context, GestureExclusionManager exclusionManager) {
+ @Inject
+ RecentsAnimationDeviceState(
+ @ApplicationContext Context context,
+ GestureExclusionManager exclusionManager,
+ DisplayController displayController,
+ ContextualSearchStateManager contextualSearchStateManager,
+ RotationTouchHelper rotationTouchHelper,
+ SettingsCache settingsCache,
+ DaggerSingletonTracker lifeCycle) {
mContext = context;
- mDisplayController = DisplayController.INSTANCE.get(context);
+ mDisplayController = displayController;
mExclusionManager = exclusionManager;
- mContextualSearchStateManager = ContextualSearchStateManager.INSTANCE.get(context);
+ mContextualSearchStateManager = contextualSearchStateManager;
+ mRotationTouchHelper = rotationTouchHelper;
+ mLifeCycle = lifeCycle;
mIsOneHandedModeSupported = SystemProperties.getBoolean(SUPPORT_ONE_HANDED_MODE, false);
- mRotationTouchHelper = RotationTouchHelper.INSTANCE.get(context);
// Register for exclusion updates
- runOnDestroy(this::unregisterExclusionListener);
+ mLifeCycle.addCloseable(this::unregisterExclusionListener);
// Register for display changes changes
mDisplayController.addChangeListener(this);
onDisplayInfoChanged(context, mDisplayController.getInfo(), CHANGE_ALL);
- runOnDestroy(() -> mDisplayController.removeChangeListener(this));
+ mLifeCycle.addCloseable(() -> mDisplayController.removeChangeListener(this));
- SettingsCache settingsCache = SettingsCache.INSTANCE.get(mContext);
if (mIsOneHandedModeSupported) {
Uri oneHandedUri = Settings.Secure.getUriFor(ONE_HANDED_ENABLED);
SettingsCache.OnChangeListener onChangeListener =
enabled -> mIsOneHandedModeEnabled = enabled;
settingsCache.register(oneHandedUri, onChangeListener);
mIsOneHandedModeEnabled = settingsCache.getValue(oneHandedUri);
- runOnDestroy(() -> settingsCache.unregister(oneHandedUri, onChangeListener));
+ mLifeCycle.addCloseable(() -> settingsCache.unregister(oneHandedUri, onChangeListener));
} else {
mIsOneHandedModeEnabled = false;
}
@@ -173,14 +180,16 @@
enabled -> mIsSwipeToNotificationEnabled = enabled;
settingsCache.register(swipeBottomNotificationUri, onChangeListener);
mIsSwipeToNotificationEnabled = settingsCache.getValue(swipeBottomNotificationUri);
- runOnDestroy(() -> settingsCache.unregister(swipeBottomNotificationUri, onChangeListener));
+ mLifeCycle.addCloseable(
+ () -> settingsCache.unregister(swipeBottomNotificationUri, onChangeListener));
Uri setupCompleteUri = Settings.Secure.getUriFor(Settings.Secure.USER_SETUP_COMPLETE);
mIsUserSetupComplete = settingsCache.getValue(setupCompleteUri, 0);
if (!mIsUserSetupComplete) {
SettingsCache.OnChangeListener userSetupChangeListener = e -> mIsUserSetupComplete = e;
settingsCache.register(setupCompleteUri, userSetupChangeListener);
- runOnDestroy(() -> settingsCache.unregister(setupCompleteUri, userSetupChangeListener));
+ mLifeCycle.addCloseable(
+ () -> settingsCache.unregister(setupCompleteUri, userSetupChangeListener));
}
try {
@@ -201,21 +210,10 @@
}
};
TaskStackChangeListeners.getInstance().registerTaskStackListener(mPipListener);
- runOnDestroy(() ->
+ mLifeCycle.addCloseable(() ->
TaskStackChangeListeners.getInstance().unregisterTaskStackListener(mPipListener));
}
- private void runOnDestroy(Runnable action) {
- mOnDestroyActions.add(action);
- }
-
- @Override
- public void close() {
- for (Runnable r : mOnDestroyActions) {
- r.run();
- }
- }
-
/**
* Adds a listener for the nav mode change, guaranteed to be called after the device state's
* mode has changed.
@@ -228,7 +226,7 @@
};
mDisplayController.addChangeListener(listener);
callback.run();
- runOnDestroy(() -> mDisplayController.removeChangeListener(listener));
+ mLifeCycle.addCloseable(() -> mDisplayController.removeChangeListener(listener));
}
@Override
diff --git a/quickstep/src/com/android/quickstep/RecentsFilterState.java b/quickstep/src/com/android/quickstep/RecentsFilterState.java
index 70d5696..c4b0f25 100644
--- a/quickstep/src/com/android/quickstep/RecentsFilterState.java
+++ b/quickstep/src/com/android/quickstep/RecentsFilterState.java
@@ -19,6 +19,7 @@
import androidx.annotation.Nullable;
import com.android.quickstep.util.GroupTask;
+import com.android.quickstep.views.TaskViewType;
import com.android.systemui.shared.recents.model.Task;
import java.util.HashMap;
@@ -38,7 +39,7 @@
public static final int MIN_FILTERING_TASK_COUNT = 2;
// default filter that returns true for any input
- public static final Predicate<GroupTask> DEFAULT_FILTER = (groupTask -> true);
+ public static final Predicate<GroupTask> EMPTY_FILTER = (groupTask -> true);
// the package name to filter recent tasks by
@Nullable
@@ -116,14 +117,37 @@
* Returns a predicate for filtering out GroupTasks by package name.
*
* @param packageName package name to filter GroupTasks by
- * if null, Predicate always returns true.
+ * if null, Predicate filters out desktop tasks with no non-minimized tasks.
*/
public static Predicate<GroupTask> getFilter(@Nullable String packageName) {
if (packageName == null) {
- return DEFAULT_FILTER;
+ return getEmptyDesktopTaskFilter();
}
- return (groupTask) -> (groupTask.containsPackage(packageName));
+ return (groupTask) -> (groupTask.containsPackage(packageName)
+ && !isDestopTaskWithMinimizedTasksOnly(groupTask));
+ }
+
+ /**
+ * Returns a predicate that filters out desk tasks that contain no non-minimized desktop tasks.
+ */
+ public static Predicate<GroupTask> getEmptyDesktopTaskFilter() {
+ return (groupTask -> !isDestopTaskWithMinimizedTasksOnly(groupTask));
+ }
+
+ /**
+ * Whether the provided task is a desktop task with no non-minimized tasks - returns true if the
+ * desktop task has no tasks at all.
+ *
+ * @param groupTask The group task to check.
+ */
+ static boolean isDestopTaskWithMinimizedTasksOnly(GroupTask groupTask) {
+ if (groupTask.taskViewType != TaskViewType.DESKTOP) {
+ return false;
+ }
+ return groupTask.getTasks().stream()
+ .filter(task -> !task.isMinimized)
+ .toList().isEmpty();
}
/**
diff --git a/quickstep/src/com/android/quickstep/RecentsModel.java b/quickstep/src/com/android/quickstep/RecentsModel.java
index 6498b7a..dc5d59f 100644
--- a/quickstep/src/com/android/quickstep/RecentsModel.java
+++ b/quickstep/src/com/android/quickstep/RecentsModel.java
@@ -154,7 +154,7 @@
/**
* Fetches the list of recent tasks. Tasks are ordered by recency, with the latest active tasks
- * at the end of the list.
+ * at the end of the list. Filters out desktop tasks that contain no non-minimized tasks.
*
* @param callback The callback to receive the task plan once its complete or null. This is
* always called on the UI thread.
@@ -163,7 +163,7 @@
@Override
public int getTasks(@Nullable Consumer<List<GroupTask>> callback) {
return mTaskList.getTasks(false /* loadKeysOnly */, callback,
- RecentsFilterState.DEFAULT_FILTER);
+ RecentsFilterState.getEmptyDesktopTaskFilter());
}
/**
diff --git a/quickstep/src/com/android/quickstep/RotationTouchHelper.java b/quickstep/src/com/android/quickstep/RotationTouchHelper.java
index f54b655..a614327 100644
--- a/quickstep/src/com/android/quickstep/RotationTouchHelper.java
+++ b/quickstep/src/com/android/quickstep/RotationTouchHelper.java
@@ -33,13 +33,16 @@
import android.view.MotionEvent;
import android.view.OrientationEventListener;
+import com.android.launcher3.dagger.ApplicationContext;
+import com.android.launcher3.dagger.LauncherAppComponent;
+import com.android.launcher3.dagger.LauncherAppSingleton;
import com.android.launcher3.testing.shared.TestProtocol;
+import com.android.launcher3.util.DaggerSingletonObject;
+import com.android.launcher3.util.DaggerSingletonTracker;
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.MainThreadInitializedObject;
import com.android.launcher3.util.NavigationMode;
-import com.android.launcher3.util.SafeCloseable;
import com.android.quickstep.util.RecentsOrientedState;
import com.android.systemui.shared.Flags;
import com.android.systemui.shared.system.QuickStepContract;
@@ -48,16 +51,20 @@
import java.io.PrintWriter;
+import javax.inject.Inject;
+
/**
* Helper class for transforming touch events
*/
-public class RotationTouchHelper implements DisplayInfoChangeListener, SafeCloseable {
+@LauncherAppSingleton
+public class RotationTouchHelper implements DisplayInfoChangeListener {
- public static final MainThreadInitializedObject<RotationTouchHelper> INSTANCE =
- new MainThreadInitializedObject<>(RotationTouchHelper::new);
+ public static final DaggerSingletonObject<RotationTouchHelper> INSTANCE =
+ new DaggerSingletonObject<>(LauncherAppComponent::getRotationTouchHelper);
private final OrientationTouchTransformer mOrientationTouchTransformer;
private final DisplayController mDisplayController;
+ private final SystemUiProxy mSystemUiProxy;
private final int mDisplayId;
private int mDisplayRotation;
@@ -127,12 +134,17 @@
private boolean mTaskListFrozen;
private final Context mContext;
- private RotationTouchHelper(Context context) {
+ @Inject
+ RotationTouchHelper(@ApplicationContext Context context,
+ DisplayController displayController,
+ SystemUiProxy systemUiProxy,
+ DaggerSingletonTracker lifeCycle) {
mContext = context;
- mDisplayController = DisplayController.INSTANCE.get(mContext);
- Resources resources = mContext.getResources();
+ mDisplayController = displayController;
+ mSystemUiProxy = systemUiProxy;
mDisplayId = DEFAULT_DISPLAY;
+ Resources resources = mContext.getResources();
mOrientationTouchTransformer = new OrientationTouchTransformer(resources, mMode,
() -> QuickStepContract.getWindowCornerRadius(mContext));
@@ -160,14 +172,13 @@
}
}
};
- }
- @Override
- public void close() {
- mDisplayController.removeChangeListener(this);
- mOrientationListener.disable();
- TaskStackChangeListeners.getInstance()
- .unregisterTaskStackListener(mFrozenTaskListener);
+ lifeCycle.addCloseable(() -> {
+ mDisplayController.removeChangeListener(this);
+ mOrientationListener.disable();
+ TaskStackChangeListeners.getInstance()
+ .unregisterTaskStackListener(mFrozenTaskListener);
+ });
}
public boolean isTaskListFrozen() {
@@ -340,8 +351,7 @@
}
private void notifySysuiOfCurrentRotation(int rotation) {
- UI_HELPER_EXECUTOR.execute(() -> SystemUiProxy.INSTANCE.get(mContext)
- .notifyPrioritizedRotation(rotation));
+ UI_HELPER_EXECUTOR.execute(() -> mSystemUiProxy.notifyPrioritizedRotation(rotation));
}
/**
diff --git a/quickstep/src/com/android/quickstep/SystemUiProxy.kt b/quickstep/src/com/android/quickstep/SystemUiProxy.kt
index 0459da0..87953c7 100644
--- a/quickstep/src/com/android/quickstep/SystemUiProxy.kt
+++ b/quickstep/src/com/android/quickstep/SystemUiProxy.kt
@@ -81,6 +81,7 @@
import com.android.wm.shell.common.pip.IPipAnimationListener
import com.android.wm.shell.desktopmode.IDesktopMode
import com.android.wm.shell.desktopmode.IDesktopTaskListener
+import com.android.wm.shell.desktopmode.IMoveToDesktopCallback
import com.android.wm.shell.draganddrop.IDragAndDrop
import com.android.wm.shell.onehanded.IOneHanded
import com.android.wm.shell.recents.IRecentTasks
@@ -169,7 +170,7 @@
* different process). It is bare-bones, so it's expected that the component and options will be
* provided via fill-in intent.
*/
- private val recentsPendingIntent =
+ private val recentsPendingIntent by lazy {
PendingIntent.getActivity(
context,
0,
@@ -183,6 +184,7 @@
)
.toBundle(),
)
+ }
val unfoldTransitionProvider: ProxyUnfoldTransitionProvider? =
if ((Flags.enableUnfoldStateAnimation() && ResourceUnfoldTransitionConfig().isEnabled))
@@ -1071,6 +1073,19 @@
//
// Desktop Mode
//
+ /** Calls shell to create a new desk (if possible) on the display whose ID is `displayId`. */
+ fun createDesktop(displayId: Int) =
+ executeWithErrorLog({ "Failed call createDesk" }) { desktopMode?.createDesk(displayId) }
+
+ /**
+ * Calls shell to activate the desk whose ID is `deskId` on whatever display it exists on. This
+ * will bring all tasks on this desk to the front.
+ */
+ fun activateDesktop(deskId: Int, transition: RemoteTransition?) =
+ executeWithErrorLog({ "Failed call activateDesk" }) {
+ desktopMode?.activateDesk(deskId, transition)
+ }
+
/** Call shell to show all apps active on the desktop */
fun showDesktopApps(displayId: Int, transition: RemoteTransition?) =
executeWithErrorLog({ "Failed call showDesktopApps" }) {
@@ -1087,14 +1102,6 @@
desktopMode?.showDesktopApp(taskId, transition, toFrontReason)
}
- /** Call shell to get number of visible freeform tasks */
- fun getVisibleDesktopTaskCount(displayId: Int): Int {
- executeWithErrorLog({ "Failed call getVisibleDesktopTaskCount" }) {
- return desktopMode?.getVisibleTaskCount(displayId) ?: 0
- }
- return 0
- }
-
/** Set a listener on shell to get updates about desktop task state */
fun setDesktopTaskListener(listener: IDesktopTaskListener?) {
desktopTaskListener = listener
@@ -1114,9 +1121,19 @@
taskId: Int,
transitionSource: DesktopModeTransitionSource?,
transition: RemoteTransition?,
+ successCallback: Runnable,
) =
executeWithErrorLog({ "Failed call moveToDesktop" }) {
- desktopMode?.moveToDesktop(taskId, transitionSource, transition)
+ desktopMode?.moveToDesktop(
+ taskId,
+ transitionSource,
+ transition,
+ object : IMoveToDesktopCallback.Stub() {
+ override fun onTaskMovedToDesktop() {
+ successCallback.run()
+ }
+ },
+ )
}
/** Call shell to remove the desktop that is on given `displayId` */
diff --git a/quickstep/src/com/android/quickstep/dagger/QuickstepBaseAppComponent.java b/quickstep/src/com/android/quickstep/dagger/QuickstepBaseAppComponent.java
index 1d40d76..fe25f32 100644
--- a/quickstep/src/com/android/quickstep/dagger/QuickstepBaseAppComponent.java
+++ b/quickstep/src/com/android/quickstep/dagger/QuickstepBaseAppComponent.java
@@ -21,10 +21,13 @@
import com.android.launcher3.model.WellbeingModel;
import com.android.launcher3.statehandlers.DesktopVisibilityController;
import com.android.quickstep.OverviewComponentObserver;
+import com.android.quickstep.RecentsAnimationDeviceState;
+import com.android.quickstep.RotationTouchHelper;
import com.android.quickstep.SystemUiProxy;
import com.android.quickstep.TopTaskTracker;
import com.android.quickstep.fallback.window.RecentsDisplayModel;
import com.android.quickstep.util.AsyncClockEventDelegate;
+import com.android.quickstep.util.ContextualSearchStateManager;
/**
* Launcher Quickstep base component for Dagger injection.
@@ -49,4 +52,10 @@
DesktopVisibilityController getDesktopVisibilityController();
TopTaskTracker getTopTaskTracker();
+
+ RotationTouchHelper getRotationTouchHelper();
+
+ ContextualSearchStateManager getContextualSearchStateManager();
+
+ RecentsAnimationDeviceState getRecentsAnimationDeviceState();
}
diff --git a/quickstep/src/com/android/quickstep/fallback/RecentsDragLayer.java b/quickstep/src/com/android/quickstep/fallback/RecentsDragLayer.java
index a2884b6..7e5afc3 100644
--- a/quickstep/src/com/android/quickstep/fallback/RecentsDragLayer.java
+++ b/quickstep/src/com/android/quickstep/fallback/RecentsDragLayer.java
@@ -15,9 +15,15 @@
*/
package com.android.quickstep.fallback;
+import static com.android.launcher3.Flags.enableExpressiveDismissTaskMotion;
+
import android.content.Context;
import android.util.AttributeSet;
+import com.android.launcher3.statemanager.StatefulContainer;
+import com.android.launcher3.uioverrides.touchcontrollers.TaskViewRecentsTouchContext;
+import com.android.launcher3.uioverrides.touchcontrollers.TaskViewTouchController;
+import com.android.launcher3.uioverrides.touchcontrollers.TaskViewTouchControllerDeprecated;
import com.android.launcher3.util.TouchController;
import com.android.launcher3.views.BaseDragLayer;
import com.android.quickstep.views.RecentsViewContainer;
@@ -25,16 +31,33 @@
/**
* Drag layer for fallback recents activity
*/
-public class RecentsDragLayer<T extends Context & RecentsViewContainer> extends BaseDragLayer<T> {
+public class RecentsDragLayer<T extends Context & RecentsViewContainer
+ & StatefulContainer<RecentsState>> extends BaseDragLayer<T> {
+
+ private final TaskViewRecentsTouchContext mTaskViewRecentsTouchContext =
+ new TaskViewRecentsTouchContext() {
+ @Override
+ public boolean isRecentsInteractive() {
+ return mContainer.getRootView().hasWindowFocus()
+ || mContainer.getStateManager().getState().hasLiveTile();
+ }
+
+ @Override
+ public boolean isRecentsModal() {
+ return false;
+ }
+ };
+
public RecentsDragLayer(Context context, AttributeSet attrs) {
super(context, attrs, 1 /* alphaChannelCount */);
}
@Override
public void recreateControllers() {
- mControllers = new TouchController[] {
- new RecentsTaskController(mContainer),
- new FallbackNavBarTouchController(mContainer),
- };
+ mControllers = new TouchController[]{
+ enableExpressiveDismissTaskMotion() ? new TaskViewTouchController<>(mContainer,
+ mTaskViewRecentsTouchContext) : new TaskViewTouchControllerDeprecated<>(
+ mContainer, mTaskViewRecentsTouchContext),
+ new FallbackNavBarTouchController(mContainer)};
}
}
diff --git a/quickstep/src/com/android/quickstep/fallback/RecentsTaskController.java b/quickstep/src/com/android/quickstep/fallback/RecentsTaskController.java
deleted file mode 100644
index 07da379..0000000
--- a/quickstep/src/com/android/quickstep/fallback/RecentsTaskController.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 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.
- */
-package com.android.quickstep.fallback;
-
-import android.content.Context;
-
-import com.android.launcher3.statemanager.StatefulContainer;
-import com.android.launcher3.uioverrides.touchcontrollers.TaskViewTouchController;
-import com.android.quickstep.views.RecentsViewContainer;
-
-public class RecentsTaskController<T extends Context & RecentsViewContainer &
- StatefulContainer<RecentsState>> extends TaskViewTouchController<T> {
- public RecentsTaskController(T container) {
- super(container);
- }
-
- @Override
- protected boolean isRecentsInteractive() {
- return mContainer.getRootView().hasWindowFocus()
- || mContainer.getStateManager().getState().hasLiveTile();
- }
-
- @Override
- protected boolean isRecentsModal() {
- return false;
- }
-}
diff --git a/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailView.kt b/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailView.kt
index 639d3a7..02baa39 100644
--- a/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailView.kt
+++ b/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailView.kt
@@ -146,8 +146,8 @@
}
}
- override fun onDetachedFromWindow() {
- super.onDetachedFromWindow()
+ // TODO(b/391842220): Cancel scope in onDetach instead of having a specific method for this.
+ fun destroyScopes() {
val scopeToCancel = viewAttachedScope
recentsCoroutineScope.launch(dispatcherProvider.background) {
scopeToCancel.cancel("TaskThumbnailView detaching from window")
diff --git a/quickstep/src/com/android/quickstep/util/ContextualSearchStateManager.java b/quickstep/src/com/android/quickstep/util/ContextualSearchStateManager.java
index f75d3b3..ed96399 100644
--- a/quickstep/src/com/android/quickstep/util/ContextualSearchStateManager.java
+++ b/quickstep/src/com/android/quickstep/util/ContextualSearchStateManager.java
@@ -21,7 +21,6 @@
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_LAUNCH_OMNI_SUCCESSFUL_SYSTEM_ACTION;
import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR;
-import static com.android.launcher3.util.MainThreadInitializedObject.forOverride;
import static com.android.quickstep.util.SystemActionConstants.SYSTEM_ACTION_ID_SEARCH_SCREEN;
import android.app.PendingIntent;
@@ -44,11 +43,13 @@
import androidx.annotation.VisibleForTesting;
import com.android.launcher3.R;
+import com.android.launcher3.dagger.ApplicationContext;
+import com.android.launcher3.dagger.LauncherAppComponent;
+import com.android.launcher3.dagger.LauncherAppSingleton;
import com.android.launcher3.logging.StatsLogManager;
+import com.android.launcher3.util.DaggerSingletonObject;
+import com.android.launcher3.util.DaggerSingletonTracker;
import com.android.launcher3.util.EventLogArray;
-import com.android.launcher3.util.MainThreadInitializedObject;
-import com.android.launcher3.util.ResourceBasedOverride;
-import com.android.launcher3.util.SafeCloseable;
import com.android.launcher3.util.SettingsCache;
import com.android.launcher3.util.SimpleBroadcastReceiver;
import com.android.quickstep.DeviceConfigWrapper;
@@ -58,12 +59,14 @@
import java.io.PrintWriter;
import java.util.Optional;
-/** Long-lived class to manage Contextual Search states like the user setting and availability. */
-public class ContextualSearchStateManager implements ResourceBasedOverride, SafeCloseable {
+import javax.inject.Inject;
- public static final MainThreadInitializedObject<ContextualSearchStateManager> INSTANCE =
- forOverride(ContextualSearchStateManager.class,
- R.string.contextual_search_state_manager_class);
+/** Long-lived class to manage Contextual Search states like the user setting and availability. */
+@LauncherAppSingleton
+public class ContextualSearchStateManager {
+
+ public static final DaggerSingletonObject<ContextualSearchStateManager> INSTANCE =
+ new DaggerSingletonObject<>(LauncherAppComponent::getContextualSearchStateManager);
private static final String TAG = "ContextualSearchStMgr";
private static final int MAX_DEBUG_EVENT_SIZE = 20;
@@ -73,23 +76,29 @@
private final Runnable mSysUiStateChangeListener = this::updateOverridesToSysUi;
private final SimpleBroadcastReceiver mContextualSearchPackageReceiver =
new SimpleBroadcastReceiver(UI_HELPER_EXECUTOR, (unused) -> requestUpdateProperties());
- private final SettingsCache.OnChangeListener mContextualSearchSettingChangedListener =
- this::onContextualSearchSettingChanged;
protected final EventLogArray mEventLogArray = new EventLogArray(TAG, MAX_DEBUG_EVENT_SIZE);
// Cached value whether the ContextualSearch intent filter matched any enabled components.
private boolean mIsContextualSearchIntentAvailable;
private boolean mIsContextualSearchSettingEnabled;
- protected Context mContext;
- protected String mContextualSearchPackage;
+ protected final Context mContext;
+ protected final String mContextualSearchPackage;
+ protected final SystemUiProxy mSystemUiProxy;
+ protected final TopTaskTracker mTopTaskTracker;
- public ContextualSearchStateManager() {}
-
- public ContextualSearchStateManager(Context context) {
+ @Inject
+ public ContextualSearchStateManager(
+ @ApplicationContext Context context,
+ SettingsCache settingsCache,
+ SystemUiProxy systemUiProxy,
+ TopTaskTracker topTaskTracker,
+ DaggerSingletonTracker lifeCycle) {
mContext = context;
mContextualSearchPackage = mContext.getResources().getString(
com.android.internal.R.string.config_defaultContextualSearchPackageName);
+ mSystemUiProxy = systemUiProxy;
+ mTopTaskTracker = topTaskTracker;
if (areAllContextualSearchFlagsDisabled()
|| !context.getPackageManager().hasSystemFeature(FEATURE_CONTEXTUAL_SEARCH)) {
@@ -106,11 +115,20 @@
context, mContextualSearchPackage, Intent.ACTION_PACKAGE_ADDED,
Intent.ACTION_PACKAGE_CHANGED, Intent.ACTION_PACKAGE_REMOVED);
- SettingsCache.INSTANCE.get(context).register(SEARCH_ALL_ENTRYPOINTS_ENABLED_URI,
- mContextualSearchSettingChangedListener);
- onContextualSearchSettingChanged(
- SettingsCache.INSTANCE.get(context).getValue(SEARCH_ALL_ENTRYPOINTS_ENABLED_URI));
- SystemUiProxy.INSTANCE.get(mContext).addOnStateChangeListener(mSysUiStateChangeListener);
+ SettingsCache.OnChangeListener settingChangedListener =
+ isEnabled -> mIsContextualSearchSettingEnabled = isEnabled;
+ settingsCache.register(SEARCH_ALL_ENTRYPOINTS_ENABLED_URI, settingChangedListener);
+ mIsContextualSearchSettingEnabled =
+ settingsCache.getValue(SEARCH_ALL_ENTRYPOINTS_ENABLED_URI);
+
+ systemUiProxy.addOnStateChangeListener(mSysUiStateChangeListener);
+
+ lifeCycle.addCloseable(() -> {
+ mContextualSearchPackageReceiver.unregisterReceiverSafely(mContext);
+ unregisterSearchScreenSystemAction();
+ settingsCache.unregister(SEARCH_ALL_ENTRYPOINTS_ENABLED_URI, settingChangedListener);
+ systemUiProxy.removeOnStateChangeListener(mSysUiStateChangeListener);
+ });
}
/** Return {@code true} if the Settings toggle is enabled. */
@@ -118,10 +136,6 @@
return mIsContextualSearchSettingEnabled;
}
- private void onContextualSearchSettingChanged(boolean isEnabled) {
- mIsContextualSearchSettingEnabled = isEnabled;
- }
-
/** Whether search supports showing on the lockscreen. */
protected boolean supportsShowWhenLocked() {
return false;
@@ -208,7 +222,7 @@
protected final void updateOverridesToSysUi() {
// LPH commit haptic is always enabled
- SystemUiProxy.INSTANCE.get(mContext).setOverrideHomeButtonLongPress(
+ mSystemUiProxy.setOverrideHomeButtonLongPress(
getLPHDurationMillis().orElse(0L), getLPHCustomSlopMultiplier().orElse(0f), true);
Log.i(TAG, "Sent LPH override to sysui: " + getLPHDurationMillis().orElse(0L) + ";"
+ getLPHCustomSlopMultiplier().orElse(0f));
@@ -227,10 +241,8 @@
new ContextualSearchInvoker(mContext).show(
ENTRYPOINT_SYSTEM_ACTION);
if (contextualSearchInvoked) {
- String runningPackage =
- TopTaskTracker.INSTANCE.get(mContext).getCachedTopTask(
- /* filterOnlyVisibleRecents */
- true).getPackageName();
+ String runningPackage = mTopTaskTracker.getCachedTopTask(
+ /* filterOnlyVisibleRecents */ true).getPackageName();
StatsLogManager.newInstance(mContext).logger()
.withPackageName(runningPackage)
.log(LAUNCHER_LAUNCH_OMNI_SUCCESSFUL_SYSTEM_ACTION);
@@ -259,15 +271,6 @@
}
}
- @Override
- public void close() {
- mContextualSearchPackageReceiver.unregisterReceiverSafely(mContext);
- unregisterSearchScreenSystemAction();
- SettingsCache.INSTANCE.get(mContext).unregister(SEARCH_ALL_ENTRYPOINTS_ENABLED_URI,
- mContextualSearchSettingChangedListener);
- SystemUiProxy.INSTANCE.get(mContext).removeOnStateChangeListener(mSysUiStateChangeListener);
- }
-
protected final void addEventLog(String event) {
synchronized (mEventLogArray) {
mEventLogArray.addLog(event);
diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java
index b5d9936..c0b026b 100644
--- a/quickstep/src/com/android/quickstep/views/RecentsView.java
+++ b/quickstep/src/com/android/quickstep/views/RecentsView.java
@@ -2693,16 +2693,17 @@
}
private void onReset() {
- if (enableRefactorTaskThumbnail()) {
- mRecentsViewModel.onReset();
- removeAllViews();
- }
unloadVisibleTaskData(TaskView.FLAG_UPDATE_ALL);
setCurrentPage(0);
LayoutUtils.setViewEnabled(mActionsView, true);
if (mOrientationState.setGestureActive(false)) {
updateOrientationHandler(/* forceRecreateDragLayerControllers = */ false);
}
+ if (enableRefactorTaskThumbnail()) {
+ mRecentsViewModel.onReset();
+ // TODO(b/391842220) Remove TaskViews rather than calling specific logic to cancel scope
+ getTaskViews().forEach(TaskView::destroyScopes);
+ }
}
public int getRunningTaskViewId() {
@@ -6839,10 +6840,8 @@
return;
}
- mDesktopRecentsTransitionController.moveToDesktop(taskContainer, transitionSource);
- // TODO(b/387471509): Invoke successCallback after actual transition completion of
- // overview menu to desktop
- successCallback.run();
+ mDesktopRecentsTransitionController.moveToDesktop(taskContainer, transitionSource,
+ successCallback);
}
/**
diff --git a/quickstep/src/com/android/quickstep/views/TaskContainer.kt b/quickstep/src/com/android/quickstep/views/TaskContainer.kt
index 5de8d1c..7ac0946 100644
--- a/quickstep/src/com/android/quickstep/views/TaskContainer.kt
+++ b/quickstep/src/com/android/quickstep/views/TaskContainer.kt
@@ -141,6 +141,11 @@
}
}
+ // TODO(b/391842220): Cancel scope in onDetach instead of having a specific method for this.
+ fun destroyScopes() {
+ thumbnailView.destroyScopes()
+ }
+
fun bindThumbnailView() {
taskThumbnailViewModel.bind(task.key.id)
}
diff --git a/quickstep/src/com/android/quickstep/views/TaskThumbnailViewDeprecated.java b/quickstep/src/com/android/quickstep/views/TaskThumbnailViewDeprecated.java
index 9f2bb9a..5ee5e10 100644
--- a/quickstep/src/com/android/quickstep/views/TaskThumbnailViewDeprecated.java
+++ b/quickstep/src/com/android/quickstep/views/TaskThumbnailViewDeprecated.java
@@ -46,7 +46,6 @@
import com.android.launcher3.DeviceProfile;
import com.android.launcher3.Utilities;
-import com.android.launcher3.util.MainThreadInitializedObject;
import com.android.launcher3.util.SystemUiController;
import com.android.launcher3.util.SystemUiController.SystemUiControllerFlags;
import com.android.launcher3.util.ViewPool;
@@ -66,8 +65,6 @@
*/
@Deprecated
public class TaskThumbnailViewDeprecated extends View implements ViewPool.Reusable {
- private static final MainThreadInitializedObject<FullscreenDrawParams> TEMP_PARAMS =
- new MainThreadInitializedObject<>(FullscreenDrawParams::new);
public static final Property<TaskThumbnailViewDeprecated, Float> DIM_ALPHA =
new FloatProperty<TaskThumbnailViewDeprecated>("dimAlpha") {
@@ -145,8 +142,7 @@
mClearPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
mContainer = RecentsViewContainer.containerFromContext(context);
// Initialize with placeholder value. It is overridden later by TaskView
- mFullscreenParams = TEMP_PARAMS.get(context);
-
+ mFullscreenParams = new FullscreenDrawParams(context, __ -> 0f, __ -> 0f);
mDimColor = RecentsView.getForegroundScrimDimColor(context);
mDimmingPaintAfterClearing.setColor(mDimColor);
}
diff --git a/quickstep/src/com/android/quickstep/views/TaskView.kt b/quickstep/src/com/android/quickstep/views/TaskView.kt
index 99df84c..e7a395f 100644
--- a/quickstep/src/com/android/quickstep/views/TaskView.kt
+++ b/quickstep/src/com/android/quickstep/views/TaskView.kt
@@ -617,6 +617,11 @@
taskContainers.forEach { it.destroy() }
}
+ fun destroyScopes() {
+ // TODO(b/391842220): Cancel scope in onDetach instead of having a specific method for this.
+ taskContainers.forEach { it.destroyScopes() }
+ }
+
// TODO: Clip-out the icon region from the thumbnail, since they are overlapping.
override fun hasOverlappingRendering() = false
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarRecentAppsControllerTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarRecentAppsControllerTest.kt
index 2374cc1..c792783 100644
--- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarRecentAppsControllerTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarRecentAppsControllerTest.kt
@@ -35,6 +35,7 @@
import com.android.launcher3.model.data.ItemInfo
import com.android.launcher3.model.data.TaskItemInfo
import com.android.launcher3.model.data.WorkspaceItemInfo
+import com.android.launcher3.taskbar.TaskbarRecentAppsController.TaskState
import com.android.launcher3.util.LauncherMultivalentJUnit
import com.android.launcher3.util.SplitConfigurationOptions
import com.android.quickstep.RecentsModel
@@ -152,7 +153,7 @@
@Test
fun canShowRunningAndRecentAppsIsFalseAfterInit_getTasksOnlyCalledInInit() {
// getTasks() should have been called once from init().
- verify(mockRecentsModel, times(1)).getTasks(any<Consumer<List<GroupTask>>>())
+ verify(mockRecentsModel, times(1)).getTasks(any<Consumer<List<GroupTask>>>(), any())
recentAppsController.canShowRunningApps = false
recentAppsController.canShowRecentApps = false
prepareHotseatAndRunningAndRecentApps(
@@ -161,29 +162,28 @@
recentTaskPackages = listOf(RECENT_PACKAGE_1, RECENT_PACKAGE_2),
)
// Verify that getTasks() was not called again after the init().
- verify(mockRecentsModel, times(1)).getTasks(any<Consumer<List<GroupTask>>>())
+ verify(mockRecentsModel, times(1)).getTasks(any<Consumer<List<GroupTask>>>(), any())
}
@Test
fun getDesktopItemState_nullItemInfo_returnsNotRunning() {
setInDesktopMode(true)
- assertThat(recentAppsController.getDesktopItemState(/* itemInfo= */ null))
- .isEqualTo(RunningAppState.NOT_RUNNING)
+ val taskState = recentAppsController.getDesktopItemState(/* itemInfo= */ null)
+ assertThat(taskState).isEqualTo(TaskState(RunningAppState.NOT_RUNNING))
}
@Test
fun getDesktopItemState_noItemPackage_returnsNotRunning() {
setInDesktopMode(true)
- assertThat(recentAppsController.getDesktopItemState(ItemInfo()))
- .isEqualTo(RunningAppState.NOT_RUNNING)
+ val taskState = recentAppsController.getDesktopItemState(ItemInfo())
+ assertThat(taskState).isEqualTo(TaskState(RunningAppState.NOT_RUNNING))
}
@Test
fun getDesktopItemState_noMatchingTasks_returnsNotRunning() {
setInDesktopMode(true)
- val itemInfo = createItemInfo("package")
- assertThat(recentAppsController.getDesktopItemState(itemInfo))
- .isEqualTo(RunningAppState.NOT_RUNNING)
+ val taskState = recentAppsController.getDesktopItemState(createItemInfo("package"))
+ assertThat(taskState).isEqualTo(TaskState(RunningAppState.NOT_RUNNING))
}
@Test
@@ -191,10 +191,10 @@
setInDesktopMode(true)
val visibleTask = createTask(id = 1, "visiblePackage", isVisible = true)
updateRecentTasks(runningTasks = listOf(visibleTask), recentTaskPackages = emptyList())
- val itemInfo = createItemInfo("visiblePackage")
- assertThat(recentAppsController.getDesktopItemState(itemInfo))
- .isEqualTo(RunningAppState.RUNNING)
+ val taskState = recentAppsController.getDesktopItemState(createItemInfo("visiblePackage"))
+
+ assertThat(taskState).isEqualTo(TaskState(RunningAppState.RUNNING, taskId = 1))
}
@Test
@@ -202,10 +202,10 @@
setInDesktopMode(true)
val minimizedTask = createTask(id = 1, "minimizedPackage", isVisible = false)
updateRecentTasks(runningTasks = listOf(minimizedTask), recentTaskPackages = emptyList())
- val itemInfo = createItemInfo("minimizedPackage")
- assertThat(recentAppsController.getDesktopItemState(itemInfo))
- .isEqualTo(RunningAppState.MINIMIZED)
+ val taskState = recentAppsController.getDesktopItemState(createItemInfo("minimizedPackage"))
+
+ assertThat(taskState).isEqualTo(TaskState(RunningAppState.MINIMIZED, taskId = 1))
}
@Test
@@ -219,10 +219,10 @@
),
recentTaskPackages = emptyList(),
)
- val itemInfo = createItemInfo("package")
- assertThat(recentAppsController.getDesktopItemState(itemInfo))
- .isEqualTo(RunningAppState.RUNNING)
+ val taskState = recentAppsController.getDesktopItemState(createItemInfo("package"))
+
+ assertThat(taskState).isEqualTo(TaskState(RunningAppState.RUNNING, taskId = 2))
}
@Test
@@ -236,10 +236,11 @@
),
recentTaskPackages = emptyList(),
)
- val itemInfo = createItemInfo("package", USER_HANDLE_2)
- assertThat(recentAppsController.getDesktopItemState(itemInfo))
- .isEqualTo(RunningAppState.NOT_RUNNING)
+ val taskState =
+ recentAppsController.getDesktopItemState(createItemInfo("package", USER_HANDLE_2))
+
+ assertThat(taskState).isEqualTo(TaskState(RunningAppState.NOT_RUNNING))
}
@Test
@@ -886,7 +887,7 @@
taskListChangeId
}
.whenever(mockRecentsModel)
- .getTasks(any<Consumer<List<GroupTask>>>())
+ .getTasks(any<Consumer<List<GroupTask>>>(), any())
recentTasksChangedListener?.onRecentTasksChanged()
}
@@ -956,7 +957,7 @@
}
private fun setInDesktopMode(inDesktopMode: Boolean) {
- whenever(taskbarControllers.taskbarDesktopModeController.areDesktopTasksVisible)
+ whenever(taskbarControllers.taskbarDesktopModeController.shouldShowDesktopTasksInTaskbar())
.thenReturn(inDesktopMode)
}
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/LauncherSwipeHandlerV2Test.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/LauncherSwipeHandlerV2Test.kt
index f05b422..af741f6 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/LauncherSwipeHandlerV2Test.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/LauncherSwipeHandlerV2Test.kt
@@ -86,17 +86,11 @@
whenever(displayManager.displays).thenReturn(arrayOf(display))
sandboxContext.initDaggerComponent(
- DaggerTestComponent.builder().bindSystemUiProxy(systemUiProxy)
+ DaggerTestComponent.builder()
+ .bindSystemUiProxy(systemUiProxy)
+ .bindRotationHelper(mock(RotationTouchHelper::class.java))
+ .bindRecentsState(mock(RecentsAnimationDeviceState::class.java))
)
- sandboxContext.putObject(
- RotationTouchHelper.INSTANCE,
- mock(RotationTouchHelper::class.java),
- )
- sandboxContext.putObject(
- RecentsAnimationDeviceState.INSTANCE,
- mock(RecentsAnimationDeviceState::class.java),
- )
-
gestureState = spy(GestureState(OverviewComponentObserver.INSTANCE.get(sandboxContext), 0))
underTest =
@@ -117,20 +111,14 @@
gestureState.setTrackpadGestureType(GestureState.TrackpadGestureType.THREE_FINGER)
underTest.onGestureEnded(flingSpeed, PointF())
verify(systemUiProxy)
- .updateContextualEduStats(
- /* isTrackpadGesture= */ eq(true),
- eq(GestureType.HOME),
- )
+ .updateContextualEduStats(/* isTrackpadGesture= */ eq(true), eq(GestureType.HOME))
}
@Test
fun goHomeFromAppByTouch_updateEduStats() {
underTest.onGestureEnded(flingSpeed, PointF())
verify(systemUiProxy)
- .updateContextualEduStats(
- /* isTrackpadGesture= */ eq(false),
- eq(GestureType.HOME),
- )
+ .updateContextualEduStats(/* isTrackpadGesture= */ eq(false), eq(GestureType.HOME))
}
}
@@ -141,6 +129,10 @@
interface Builder : LauncherAppComponent.Builder {
@BindsInstance fun bindSystemUiProxy(proxy: SystemUiProxy): Builder
+ @BindsInstance fun bindRotationHelper(helper: RotationTouchHelper): Builder
+
+ @BindsInstance fun bindRecentsState(state: RecentsAnimationDeviceState): Builder
+
override fun build(): TestComponent
}
}
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/RecentTasksListTest.java b/quickstep/tests/multivalentTests/src/com/android/quickstep/RecentTasksListTest.java
index d168ba1..cad3b99 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/RecentTasksListTest.java
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/RecentTasksListTest.java
@@ -21,6 +21,8 @@
import static junit.framework.TestCase.assertNull;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
@@ -174,12 +176,15 @@
List<Task> actualFreeformTasks = taskList.get(0).getTasks();
assertEquals(3, actualFreeformTasks.size());
assertEquals(1, actualFreeformTasks.get(0).key.id);
+ assertFalse(actualFreeformTasks.get(0).isMinimized);
assertEquals(4, actualFreeformTasks.get(1).key.id);
+ assertFalse(actualFreeformTasks.get(1).isMinimized);
assertEquals(5, actualFreeformTasks.get(2).key.id);
+ assertFalse(actualFreeformTasks.get(2).isMinimized);
}
@Test
- public void loadTasksInBackground_freeformTask_onlyMinimizedTasks_doesNotCreateDesktopTask()
+ public void loadTasksInBackground_freeformTask_onlyMinimizedTasks_createDesktopTask()
throws Exception {
List<TaskInfo> tasks = Arrays.asList(
createRecentTaskInfo(1 /* taskId */),
@@ -194,7 +199,16 @@
List<GroupTask> taskList = mRecentTasksList.loadTasksInBackground(
Integer.MAX_VALUE /* numTasks */, -1 /* requestId */, false /* loadKeysOnly */);
- assertEquals(0, taskList.size());
+ assertEquals(1, taskList.size());
+ assertEquals(TaskViewType.DESKTOP, taskList.get(0).taskViewType);
+ List<Task> actualFreeformTasks = taskList.get(0).getTasks();
+ assertEquals(3, actualFreeformTasks.size());
+ assertEquals(1, actualFreeformTasks.get(0).key.id);
+ assertTrue(actualFreeformTasks.get(0).isMinimized);
+ assertEquals(4, actualFreeformTasks.get(1).key.id);
+ assertTrue(actualFreeformTasks.get(1).isMinimized);
+ assertEquals(5, actualFreeformTasks.get(2).key.id);
+ assertTrue(actualFreeformTasks.get(2).isMinimized);
}
private TaskInfo createRecentTaskInfo(int taskId) {
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/RecentsAnimationDeviceStateTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/RecentsAnimationDeviceStateTest.kt
index 0245908..b652ee8 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/RecentsAnimationDeviceStateTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/RecentsAnimationDeviceStateTest.kt
@@ -1,9 +1,8 @@
package com.android.quickstep
-import android.content.Context
import androidx.test.annotation.UiThreadTest
-import androidx.test.core.app.ApplicationProvider
import androidx.test.filters.SmallTest
+import com.android.launcher3.dagger.LauncherComponentProvider
import com.android.launcher3.util.DisplayController.CHANGE_DENSITY
import com.android.launcher3.util.DisplayController.CHANGE_NAVIGATION_MODE
import com.android.launcher3.util.DisplayController.CHANGE_ROTATION
@@ -12,6 +11,7 @@
import com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR
import com.android.launcher3.util.LauncherMultivalentJUnit
import com.android.launcher3.util.NavigationMode
+import com.android.launcher3.util.SandboxApplication
import com.android.quickstep.util.GestureExclusionManager
import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_ALLOW_GESTURE_IGNORING_BAR_VISIBILITY
import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_DEVICE_DREAMING
@@ -27,6 +27,7 @@
import com.google.common.truth.Truth.assertThat
import org.junit.After
import org.junit.Before
+import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
@@ -43,21 +44,32 @@
@RunWith(LauncherMultivalentJUnit::class)
class RecentsAnimationDeviceStateTest {
+ @get:Rule val context = SandboxApplication()
+
@Mock private lateinit var exclusionManager: GestureExclusionManager
@Mock private lateinit var info: Info
- private val context = ApplicationProvider.getApplicationContext() as Context
private lateinit var underTest: RecentsAnimationDeviceState
@Before
fun setup() {
MockitoAnnotations.initMocks(this)
- underTest = RecentsAnimationDeviceState(context, exclusionManager)
+
+ val component = LauncherComponentProvider.get(context)
+ underTest =
+ RecentsAnimationDeviceState(
+ context,
+ exclusionManager,
+ component.displayController,
+ component.contextualSearchStateManager,
+ component.rotationTouchHelper,
+ component.settingsCache,
+ component.daggerSingletonTracker,
+ )
}
@After
fun tearDown() {
- underTest.close()
UI_HELPER_EXECUTOR.submit {}.get()
MAIN_EXECUTOR.submit {}.get()
}
diff --git a/quickstep/tests/src/com/android/quickstep/InputConsumerUtilsTest.java b/quickstep/tests/src/com/android/quickstep/InputConsumerUtilsTest.java
index 3c5e1e8..e2ca91a 100644
--- a/quickstep/tests/src/com/android/quickstep/InputConsumerUtilsTest.java
+++ b/quickstep/tests/src/com/android/quickstep/InputConsumerUtilsTest.java
@@ -16,8 +16,6 @@
package com.android.quickstep;
-import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
-
import static com.android.quickstep.InputConsumerUtils.newBaseConsumer;
import static com.android.quickstep.InputConsumerUtils.newConsumer;
@@ -40,6 +38,9 @@
import com.android.launcher3.DeviceProfile;
import com.android.launcher3.anim.AnimatedFloat;
+import com.android.launcher3.dagger.LauncherAppComponent;
+import com.android.launcher3.dagger.LauncherAppModule;
+import com.android.launcher3.dagger.LauncherAppSingleton;
import com.android.launcher3.taskbar.TaskbarActivityContext;
import com.android.launcher3.taskbar.TaskbarManager;
import com.android.launcher3.taskbar.bubbles.BubbleBarController;
@@ -54,7 +55,7 @@
import com.android.launcher3.taskbar.bubbles.BubbleStashedHandleViewController;
import com.android.launcher3.taskbar.bubbles.stashing.BubbleStashController;
import com.android.launcher3.util.LockedUserState;
-import com.android.launcher3.util.MainThreadInitializedObject;
+import com.android.launcher3.util.SandboxApplication;
import com.android.launcher3.views.BaseDragLayer;
import com.android.quickstep.inputconsumers.AccessibilityInputConsumer;
import com.android.quickstep.inputconsumers.BubbleBarInputConsumer;
@@ -75,6 +76,9 @@
import com.android.systemui.shared.system.InputChannelCompat;
import com.android.systemui.shared.system.InputMonitorCompat;
+import dagger.BindsInstance;
+import dagger.Component;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
@@ -93,8 +97,8 @@
@RunWith(AndroidJUnit4.class)
public class InputConsumerUtilsTest {
- @NonNull private final MainThreadInitializedObject.SandboxContext mContext =
- new MainThreadInitializedObject.SandboxContext(getApplicationContext());
+ @Rule public final SandboxApplication mContext = new SandboxApplication();
+
@NonNull private final InputMonitorCompat mInputMonitorCompat = new InputMonitorCompat("", 0);
private TaskAnimationManager mTaskAnimationManager;
@@ -125,10 +129,12 @@
}
@Before
- public void setupMainThreadInitializedObjects() {
- mContext.putObject(LockedUserState.INSTANCE, mLockedUserState);
- mContext.putObject(RotationTouchHelper.INSTANCE, mock(RotationTouchHelper.class));
- mContext.putObject(RecentsAnimationDeviceState.INSTANCE, mDeviceState);
+ public void setupDaggerGraphOverrides() {
+ mContext.initDaggerComponent(DaggerInputConsumerUtilsTest_TestComponent
+ .builder()
+ .bindLockedState(mLockedUserState)
+ .bindRotationHelper(mock(RotationTouchHelper.class))
+ .bindRecentsState(mDeviceState));
}
@Before
@@ -595,4 +601,18 @@
return bubbleControllers;
}
+
+ @LauncherAppSingleton
+ @Component(modules = {LauncherAppModule.class})
+ interface TestComponent extends LauncherAppComponent {
+ @Component.Builder
+ interface Builder extends LauncherAppComponent.Builder {
+ @BindsInstance Builder bindLockedState(LockedUserState state);
+ @BindsInstance Builder bindRotationHelper(RotationTouchHelper helper);
+ @BindsInstance Builder bindRecentsState(RecentsAnimationDeviceState state);
+
+ @Override
+ TestComponent build();
+ }
+ }
}
diff --git a/quickstep/tests/src/com/android/quickstep/TaplTestsOverviewDesktop.kt b/quickstep/tests/src/com/android/quickstep/TaplTestsOverviewDesktop.kt
index b744039..75947ab 100644
--- a/quickstep/tests/src/com/android/quickstep/TaplTestsOverviewDesktop.kt
+++ b/quickstep/tests/src/com/android/quickstep/TaplTestsOverviewDesktop.kt
@@ -122,25 +122,25 @@
val desktop = moveTaskToDesktop(TEST_ACTIVITY_EXTRA)
var overview = desktop.switchToOverview()
- // Open focused task and go back to Overview to validate whether it has adjacent tasks in
- // its both sides (grid task on left and desktop tasks at its right side)
- val focusedTaskOpened = overview.getTestActivityTask(TEST_ACTIVITY_2).open()
+ // Open first fullscreen task and go back to Overview to validate whether it has adjacent
+ // tasks in its both sides (grid task on left and desktop tasks at its right side)
+ val firstFullscreenTaskOpened = overview.getTestActivityTask(TEST_ACTIVITY_2).open()
- // Fling to desktop task and dismiss the focused task to check repositioning of
+ // Fling to desktop task and dismiss the first fullscreen task to check repositioning of
// grid tasks.
- overview = focusedTaskOpened.switchToOverview().apply { flingBackward() }
+ overview = firstFullscreenTaskOpened.switchToOverview().apply { flingBackward() }
val desktopTask = overview.currentTask
assertWithMessage("The current task is not a Desktop.").that(desktopTask.isDesktop).isTrue()
- // Get focused task (previously opened task) then dismiss this task
- val focusedTaskInOverview = overview.getTestActivityTask(TEST_ACTIVITY_2)
- assertTaskContentDescription(focusedTaskInOverview, TEST_ACTIVITY_2)
- focusedTaskInOverview.dismiss()
+ // Get first fullscreen task (previously opened task) then dismiss this task
+ val firstFullscreenTaskInOverview = overview.getTestActivityTask(TEST_ACTIVITY_2)
+ assertTaskContentDescription(firstFullscreenTaskInOverview, TEST_ACTIVITY_2)
+ firstFullscreenTaskInOverview.dismiss()
- // Dismiss DesktopTask to validate whether the new focused task will take its position
+ // Dismiss DesktopTask to validate whether the new task will take its position
desktopTask.dismiss()
- // Dismiss last focused task
+ // Dismiss last fullscreen task
val lastFocusedTask = overview.currentTask
assertTaskContentDescription(lastFocusedTask, TEST_ACTIVITY_1)
lastFocusedTask.dismiss()
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index b62bbfa..c45d372 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -189,13 +189,13 @@
<string name="all_apps_work_tab" msgid="4884822796154055118">"کاری"</string>
<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>
+ <string name="work_profile_edu_accept" msgid="6069788082535149071">"متوجهم"</string>
<string name="work_apps_paused_title" msgid="3040901117349444598">"برنامههای کاری موقتاً متوقف شدهاند."</string>
<string name="work_apps_paused_info_body" msgid="1687828929959237477">"از برنامههای کاریتان اعلان دریافت نخواهید کرد"</string>
<string name="work_apps_paused_body" msgid="261634750995824906">"برنامههای کاری نمیتوانند برای شما اعلان ارسال کنند، از باتری استفاده کنند، یا به مکانتان دسترسی داشته باشند"</string>
<string name="work_apps_paused_telephony_unavailable_body" msgid="8358872357502756790">"از برنامههای کاریتان تماس تلفنی، پیام نوشتاری، یا اعلان دریافت نخواهید کرد"</string>
<string name="work_apps_paused_edu_banner" msgid="8872412121608402058">"برنامههای کاری نشاندار هستند و سرپرست فناوری اطلاعات میتواند آنها را ببیند."</string>
- <string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"متوجهام"</string>
+ <string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"متوجهم"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"توقف موقت برنامههای کاری"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"ازسرگیری"</string>
<string name="work_scheduler_button_content_description" msgid="917340740986764967">"برنامه زمانی برنامههای کاری"</string>
diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java
index 3d71ff1..c38444c 100644
--- a/src/com/android/launcher3/CellLayout.java
+++ b/src/com/android/launcher3/CellLayout.java
@@ -529,9 +529,11 @@
for (int i = 0; i < mDelegatedCellDrawings.size(); i++) {
DelegatedCellDrawing cellDrawing = mDelegatedCellDrawings.get(i);
- cellToPoint(cellDrawing.mDelegateCellX, cellDrawing.mDelegateCellY, mTempLocation);
canvas.save();
- canvas.translate(mTempLocation[0], mTempLocation[1]);
+ if (cellDrawing.mDelegateCellX >= 0 && cellDrawing.mDelegateCellY >= 0) {
+ cellToPoint(cellDrawing.mDelegateCellX, cellDrawing.mDelegateCellY, mTempLocation);
+ canvas.translate(mTempLocation[0], mTempLocation[1]);
+ }
cellDrawing.drawUnderItem(canvas);
canvas.restore();
}
@@ -660,9 +662,11 @@
for (int i = 0; i < mDelegatedCellDrawings.size(); i++) {
DelegatedCellDrawing bg = mDelegatedCellDrawings.get(i);
- cellToPoint(bg.mDelegateCellX, bg.mDelegateCellY, mTempLocation);
canvas.save();
- canvas.translate(mTempLocation[0], mTempLocation[1]);
+ if (bg.mDelegateCellX >= 0 && bg.mDelegateCellY >= 0) {
+ cellToPoint(bg.mDelegateCellX, bg.mDelegateCellY, mTempLocation);
+ canvas.translate(mTempLocation[0], mTempLocation[1]);
+ }
bg.drawOverItem(canvas);
canvas.restore();
}
diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java
index 9ebae9f..9f47da7 100644
--- a/src/com/android/launcher3/DeviceProfile.java
+++ b/src/com/android/launcher3/DeviceProfile.java
@@ -26,7 +26,6 @@
import static com.android.launcher3.Utilities.dpiFromPx;
import static com.android.launcher3.Utilities.pxFromSp;
import static com.android.launcher3.folder.ClippedFolderIconLayoutRule.ICON_OVERLAP_FACTOR;
-import static com.android.launcher3.icons.GraphicsUtils.getShapePath;
import static com.android.launcher3.icons.IconNormalizer.ICON_VISIBLE_AREA_FACTOR;
import static com.android.launcher3.testing.shared.ResourceUtils.INVALID_RESOURCE_HANDLE;
import static com.android.launcher3.testing.shared.ResourceUtils.pxFromDp;
@@ -53,6 +52,7 @@
import com.android.launcher3.CellLayout.ContainerType;
import com.android.launcher3.DevicePaddings.DevicePadding;
+import com.android.launcher3.graphics.IconShape;
import com.android.launcher3.icons.DotRenderer;
import com.android.launcher3.icons.IconNormalizer;
import com.android.launcher3.model.data.ItemInfo;
@@ -792,8 +792,7 @@
int leftRightSplitPortraitResId = Resources.getSystem().getIdentifier(
"config_leftRightSplitInPortrait", "bool", "android");
boolean allowLeftRightSplitInPortrait =
- com.android.wm.shell.Flags.enableLeftRightSplitInPortrait()
- && leftRightSplitPortraitResId > 0
+ leftRightSplitPortraitResId > 0
&& res.getBoolean(leftRightSplitPortraitResId);
if (allowLeftRightSplitInPortrait && isTablet) {
isLeftRightSplit = !isLandscape;
@@ -872,7 +871,9 @@
@NonNull Context context, int size, @NonNull SparseArray<DotRenderer> cache) {
DotRenderer renderer = cache.get(size);
if (renderer == null) {
- renderer = new DotRenderer(size, getShapePath(context, DEFAULT_DOT_SIZE),
+ renderer = new DotRenderer(
+ size,
+ IconShape.INSTANCE.get(context).getShapeOverridePath(DEFAULT_DOT_SIZE),
DEFAULT_DOT_SIZE);
cache.put(size, renderer);
}
diff --git a/src/com/android/launcher3/dagger/LauncherAppModule.java b/src/com/android/launcher3/dagger/LauncherAppModule.java
index ef136d0..c58a414 100644
--- a/src/com/android/launcher3/dagger/LauncherAppModule.java
+++ b/src/com/android/launcher3/dagger/LauncherAppModule.java
@@ -21,7 +21,9 @@
@Module(includes = {
WindowManagerProxyModule.class,
ApiWrapperModule.class,
- PluginManagerWrapperModule.class
+ PluginManagerWrapperModule.class,
+ StaticObjectModule.class,
+ AppModule.class
})
public class LauncherAppModule {
}
diff --git a/src/com/android/launcher3/dagger/LauncherBaseAppComponent.java b/src/com/android/launcher3/dagger/LauncherBaseAppComponent.java
index c3e3992..0b7b20f 100644
--- a/src/com/android/launcher3/dagger/LauncherBaseAppComponent.java
+++ b/src/com/android/launcher3/dagger/LauncherBaseAppComponent.java
@@ -27,6 +27,7 @@
import com.android.launcher3.util.DaggerSingletonTracker;
import com.android.launcher3.util.DisplayController;
import com.android.launcher3.util.DynamicResource;
+import com.android.launcher3.util.LockedUserState;
import com.android.launcher3.util.MSDLPlayerWrapper;
import com.android.launcher3.util.PackageManagerHelper;
import com.android.launcher3.util.PluginManagerWrapper;
@@ -68,6 +69,7 @@
ThemeManager getThemeManager();
DisplayController getDisplayController();
WallpaperColorHints getWallpaperColorHints();
+ LockedUserState getLockedUserState();
/** Builder for LauncherBaseAppComponent. */
interface Builder {
diff --git a/src/com/android/launcher3/dragndrop/DragView.java b/src/com/android/launcher3/dragndrop/DragView.java
index f1b461b..9c82748 100644
--- a/src/com/android/launcher3/dragndrop/DragView.java
+++ b/src/com/android/launcher3/dragndrop/DragView.java
@@ -60,6 +60,7 @@
import com.android.app.animation.Interpolators;
import com.android.launcher3.R;
import com.android.launcher3.Utilities;
+import com.android.launcher3.graphics.IconShape;
import com.android.launcher3.icons.FastBitmapDrawable;
import com.android.launcher3.icons.LauncherIcons;
import com.android.launcher3.model.data.ItemInfo;
@@ -272,7 +273,7 @@
Rect shrunkBounds = new Rect(bounds);
Utilities.scaleRectAboutCenter(shrunkBounds, 0.98f);
adaptiveIcon.setBounds(shrunkBounds);
- final Path mask = adaptiveIcon.getIconMask();
+ final Path mask = IconShape.INSTANCE.get(getContext()).getShapeOverridePath(w);
mTranslateX = new SpringFloatValue(DragView.this,
w * AdaptiveIconDrawable.getExtraInsetFraction());
diff --git a/src/com/android/launcher3/graphics/IconShape.kt b/src/com/android/launcher3/graphics/IconShape.kt
index 2d2ee30..2c4d8e4 100644
--- a/src/com/android/launcher3/graphics/IconShape.kt
+++ b/src/com/android/launcher3/graphics/IconShape.kt
@@ -34,6 +34,7 @@
import android.view.View
import android.view.ViewOutlineProvider
import androidx.annotation.VisibleForTesting
+import androidx.core.graphics.PathParser
import androidx.graphics.shapes.CornerRounding
import androidx.graphics.shapes.Morph
import androidx.graphics.shapes.RoundedPolygon
@@ -65,7 +66,7 @@
constructor(
@ApplicationContext private val context: Context,
private val prefs: LauncherPrefs,
- themeManager: ThemeManager,
+ private val themeManager: ThemeManager,
lifeCycle: DaggerSingletonTracker,
) {
@@ -89,6 +90,17 @@
lifeCycle.addCloseable { themeManager.removeChangeListener(changeListener) }
}
+ fun getShapeOverridePath(pathSize: Float = DEFAULT_PATH_SIZE): Path {
+ val path = PathParser.createPathFromPathData(themeManager.iconState.iconMask)
+ if (pathSize != DEFAULT_PATH_SIZE) {
+ val matrix = Matrix()
+ val scale: Float = pathSize / DEFAULT_PATH_SIZE
+ matrix.setScale(scale, scale)
+ path.transform(matrix)
+ }
+ return path
+ }
+
/** Initializes the shape which is closest to the [AdaptiveIconDrawable] */
private fun pickBestShape(themeManager: ThemeManager): ShapeDelegate {
val drawable =
@@ -281,6 +293,7 @@
const val TAG = "IconShape"
const val KEY_ICON_SHAPE = "icon_shape"
+ const val DEFAULT_PATH_SIZE = 100f
const val AREA_CALC_SIZE = 1000
// .1% error margin
const val AREA_DIFF_THRESHOLD = AREA_CALC_SIZE * AREA_CALC_SIZE / 1000
diff --git a/src/com/android/launcher3/graphics/PreloadIconDrawable.java b/src/com/android/launcher3/graphics/PreloadIconDrawable.java
index 9fffcc1..3464e9b 100644
--- a/src/com/android/launcher3/graphics/PreloadIconDrawable.java
+++ b/src/com/android/launcher3/graphics/PreloadIconDrawable.java
@@ -40,7 +40,6 @@
import com.android.launcher3.anim.AnimatedFloat;
import com.android.launcher3.anim.AnimatorListeners;
import com.android.launcher3.icons.FastBitmapDrawable;
-import com.android.launcher3.icons.GraphicsUtils;
import com.android.launcher3.model.data.ItemInfoWithIcon;
import com.android.launcher3.util.Themes;
@@ -121,7 +120,8 @@
IconPalette.getPreloadProgressColor(context, info.bitmap.color),
getPreloadColors(context),
Utilities.isDarkTheme(context),
- GraphicsUtils.getShapePath(context, DEFAULT_PATH_SIZE));
+ IconShape.INSTANCE.get(context).getShapeOverridePath(DEFAULT_PATH_SIZE)
+ );
}
public PreloadIconDrawable(
diff --git a/src/com/android/launcher3/model/GridSizeMigrationDBController.java b/src/com/android/launcher3/model/GridSizeMigrationDBController.java
index 0732379..8cbe764 100644
--- a/src/com/android/launcher3/model/GridSizeMigrationDBController.java
+++ b/src/com/android/launcher3/model/GridSizeMigrationDBController.java
@@ -140,22 +140,13 @@
try (SQLiteTransaction t = new SQLiteTransaction(target.getWritableDatabase())) {
if (shouldMigrateToStrictlyTallerGrid) {
- // This is a special case where if the grid is the same amount of columns but a
- // larger amount of rows we simply copy over the source grid to the destination
- // grid, rather than undergoing the general grid migration. If there are more icons
- // on the bottom of the first page then we shift the icons down to the bottom of the
- // grid so that the icons remain bottom-anchored.
+ // We want to add the extra row(s) to the top of the screen, so we shift the grid
+ // down.
if (oneGridSpecs()) {
- DbReader destReader = new DbReader(
- target.getWritableDatabase(), TABLE_NAME, context);
- boolean shouldShiftCells =
- shouldShiftCells(destReader, srcDeviceState.getRows());
- if (shouldShiftCells) {
- shiftTableByXCells(
- target.getWritableDatabase(),
- (destDeviceState.getRows() - srcDeviceState.getRows()),
- TABLE_NAME);
- }
+ shiftTableByXCells(
+ target.getWritableDatabase(),
+ (destDeviceState.getRows() - srcDeviceState.getRows()),
+ TABLE_NAME);
}
// Save current configuration, so that the migration does not run again.
@@ -455,22 +446,6 @@
}
}
- private static boolean shouldShiftCells(final DbReader destReader, final int srcGridRowCount) {
- List<DbEntry> workspaceItems = destReader.loadAllWorkspaceEntries();
- int firstPageItemsRowPosSum = workspaceItems.stream()
- .filter(entry -> entry.screenId == 0)
- .mapToInt(entry -> entry.cellY).sum();
- int firstPageWorkspaceItemsCount = (int) workspaceItems.stream()
- .filter(entry -> entry.screenId == 0).count();
- if (firstPageWorkspaceItemsCount == 0) {
- return false;
- }
- float srcGridMidPoint = srcGridRowCount / 2f;
- float firstPageItemPosAvg = (float) firstPageItemsRowPosSum / firstPageWorkspaceItemsCount;
- return (firstPageItemPosAvg >= srcGridMidPoint);
- }
-
-
@VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE)
public static class DbReader {
diff --git a/src/com/android/launcher3/model/GridSizeMigrationLogic.kt b/src/com/android/launcher3/model/GridSizeMigrationLogic.kt
index 1729153..dfda8e4 100644
--- a/src/com/android/launcher3/model/GridSizeMigrationLogic.kt
+++ b/src/com/android/launcher3/model/GridSizeMigrationLogic.kt
@@ -77,24 +77,16 @@
val migrationStartTime = System.currentTimeMillis()
try {
SQLiteTransaction(target.writableDatabase).use { t ->
- // This is a special case where if the grid is the same amount of columns but a
- // larger amount of rows we simply copy over the source grid to the destination
- // grid, rather than undergoing the general grid migration. If there are more icons
- // on the bottom of the first page then we shift the icons down to the bottom of the
- // grid so that the icons remain bottom-anchored.
+ // We want to add the extra row(s) to the top of the screen, so we shift the grid
+ // down.
if (shouldMigrateToStrtictlyTallerGrid) {
Log.d(TAG, "Migrating to strictly taller grid")
if (oneGridSpecs()) {
- val destReader = DbReader(target.writableDatabase, TABLE_NAME, context)
- val shouldShiftCells = shouldShiftCells(destReader, srcDeviceState.rows)
- if (shouldShiftCells) {
- Log.i("TAGTAG", "should shift cells")
- shiftTableByXCells(
- target.writableDatabase,
- (destDeviceState.rows - srcDeviceState.rows),
- TABLE_NAME,
- )
- }
+ shiftTableByXCells(
+ target.writableDatabase,
+ (destDeviceState.rows - srcDeviceState.rows),
+ TABLE_NAME,
+ )
}
// Save current configuration, so that the migration does not run again.
destDeviceState.writeToPrefs(context)
@@ -139,19 +131,6 @@
}
}
- private fun shouldShiftCells(destReader: DbReader, srcGridRowCount: Int): Boolean {
- val workspaceItems = destReader.loadAllWorkspaceEntries()
- val firstPageItemsRowPosSum =
- workspaceItems.sumOf { entry -> if (entry.screenId == 0) entry.cellY else 0 }
- val firstPageWorkspaceItemsCount = workspaceItems.count { entry -> entry.screenId == 0 }
- if (firstPageWorkspaceItemsCount == 0) {
- return false
- }
- val srcGridMidPoint = srcGridRowCount / 2f
- val firstPageItemPosAvg = firstPageItemsRowPosSum / firstPageWorkspaceItemsCount.toFloat()
- return (firstPageItemPosAvg >= srcGridMidPoint)
- }
-
/** Handles hotseat migration. */
@VisibleForTesting
fun migrateHotseat(
diff --git a/src/com/android/launcher3/notification/NotificationListener.java b/src/com/android/launcher3/notification/NotificationListener.java
index 836ea4a..864fed0 100644
--- a/src/com/android/launcher3/notification/NotificationListener.java
+++ b/src/com/android/launcher3/notification/NotificationListener.java
@@ -170,6 +170,9 @@
for (NotificationsChangedListener listener : sNotificationsChangedListeners) {
listener.onNotificationPosted(msg.first, msg.second);
}
+ Log.i(TAG, "received notification posted event - " + msg.first);
+ } else {
+ Log.i(TAG, "received notification posted event, but there are no listeners");
}
break;
case MSG_NOTIFICATION_REMOVED:
@@ -178,6 +181,9 @@
for (NotificationsChangedListener listener : sNotificationsChangedListeners) {
listener.onNotificationRemoved(msg.first, msg.second);
}
+ Log.i(TAG, "received notification removed event - " + msg.first);
+ } else {
+ Log.i(TAG, "received notification removed event, but there are no listeners");
}
break;
case MSG_NOTIFICATION_FULL_REFRESH:
@@ -186,6 +192,11 @@
listener.onNotificationFullRefresh(
(List<StatusBarNotification>) message.obj);
}
+ ((List<StatusBarNotification>) message.obj).forEach(sbn -> Log.i(TAG,
+ "Handling notification state refresh for " + sbn.getPackageName() + "#"
+ + sbn.getUserId()));
+ } else {
+ Log.i(TAG, "received notification refresh event, but there are no listeners");
}
break;
}
@@ -205,6 +216,7 @@
@Override
public void onListenerConnected() {
super.onListenerConnected();
+ Log.i(TAG, "onListenerConnected");
sIsConnected = true;
// Register an observer to rebind the notification listener when dots are re-enabled.
@@ -230,6 +242,7 @@
@Override
public void onListenerDisconnected() {
super.onListenerDisconnected();
+ Log.i(TAG, "onListenerDisconnected");
sIsConnected = false;
mSettingsCache.unregister(NOTIFICATION_BADGING_URI, mNotificationSettingsChangedListener);
onNotificationFullRefresh();
diff --git a/src/com/android/launcher3/util/LockedUserState.kt b/src/com/android/launcher3/util/LockedUserState.kt
index c8d86d4..a6a6ceb 100644
--- a/src/com/android/launcher3/util/LockedUserState.kt
+++ b/src/com/android/launcher3/util/LockedUserState.kt
@@ -20,10 +20,17 @@
import android.os.Process
import android.os.UserManager
import androidx.annotation.VisibleForTesting
+import com.android.launcher3.dagger.ApplicationContext
+import com.android.launcher3.dagger.LauncherAppComponent
+import com.android.launcher3.dagger.LauncherAppSingleton
import com.android.launcher3.util.Executors.MAIN_EXECUTOR
import com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR
+import javax.inject.Inject
-class LockedUserState(private val mContext: Context) : SafeCloseable {
+@LauncherAppSingleton
+class LockedUserState
+@Inject
+constructor(@ApplicationContext private val context: Context, lifeCycle: DaggerSingletonTracker) {
val isUserUnlockedAtLauncherStartup: Boolean
var isUserUnlocked = false
private set(value) {
@@ -36,7 +43,7 @@
private val mUserUnlockedActions: RunnableList = RunnableList()
@VisibleForTesting
- val mUserUnlockedReceiver =
+ val userUnlockedReceiver =
SimpleBroadcastReceiver(UI_HELPER_EXECUTOR) {
if (Intent.ACTION_USER_UNLOCKED == it.action) {
isUserUnlocked = true
@@ -53,8 +60,8 @@
isUserUnlocked = checkIsUserUnlocked()
isUserUnlockedAtLauncherStartup = isUserUnlocked
if (!isUserUnlocked) {
- mUserUnlockedReceiver.register(
- mContext,
+ userUnlockedReceiver.register(
+ context,
{
// If user is unlocked while registering broadcast receiver, we should update
// [isUserUnlocked], which will call [notifyUserUnlocked] in setter
@@ -62,22 +69,18 @@
MAIN_EXECUTOR.execute { isUserUnlocked = true }
}
},
- Intent.ACTION_USER_UNLOCKED
+ Intent.ACTION_USER_UNLOCKED,
)
}
+ lifeCycle.addCloseable { userUnlockedReceiver.unregisterReceiverSafely(context) }
}
private fun checkIsUserUnlocked() =
- mContext.getSystemService(UserManager::class.java)!!.isUserUnlocked(Process.myUserHandle())
+ context.getSystemService(UserManager::class.java)!!.isUserUnlocked(Process.myUserHandle())
private fun notifyUserUnlocked() {
mUserUnlockedActions.executeAllAndDestroy()
- mUserUnlockedReceiver.unregisterReceiverSafely(mContext)
- }
-
- /** Stops the receiver from listening for ACTION_USER_UNLOCK broadcasts. */
- override fun close() {
- mUserUnlockedReceiver.unregisterReceiverSafely(mContext)
+ userUnlockedReceiver.unregisterReceiverSafely(context)
}
/**
@@ -88,9 +91,7 @@
mUserUnlockedActions.add(action)
}
- /**
- * Removes a previously queued `Runnable` to be run when the user is unlocked.
- */
+ /** Removes a previously queued `Runnable` to be run when the user is unlocked. */
fun removeOnUserUnlockedRunnable(action: Runnable) {
mUserUnlockedActions.remove(action)
}
@@ -98,7 +99,7 @@
companion object {
@VisibleForTesting
@JvmField
- val INSTANCE = MainThreadInitializedObject { LockedUserState(it) }
+ val INSTANCE = DaggerSingletonObject(LauncherAppComponent::getLockedUserState)
@JvmStatic fun get(context: Context): LockedUserState = INSTANCE.get(context)
}
diff --git a/src/com/android/launcher3/util/SettingsCache.java b/src/com/android/launcher3/util/SettingsCache.java
index 8fe6e93..fa183c8 100644
--- a/src/com/android/launcher3/util/SettingsCache.java
+++ b/src/com/android/launcher3/util/SettingsCache.java
@@ -34,11 +34,11 @@
import com.android.launcher3.dagger.LauncherAppSingleton;
import com.android.launcher3.dagger.LauncherBaseAppComponent;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.function.Function;
import javax.inject.Inject;
@@ -57,7 +57,7 @@
* Cache will also be updated if a key queried is missing (even if it has no listeners registered).
*/
@LauncherAppSingleton
-public class SettingsCache extends ContentObserver implements SafeCloseable {
+public class SettingsCache extends ContentObserver {
/** Hidden field Settings.Secure.NOTIFICATION_BADGING */
public static final Uri NOTIFICATION_BADGING_URI =
@@ -79,11 +79,17 @@
private static final String SYSTEM_URI_PREFIX = Settings.System.CONTENT_URI.toString();
private static final String GLOBAL_URI_PREFIX = Settings.Global.CONTENT_URI.toString();
+ private final Function<Uri, CopyOnWriteArrayList<OnChangeListener>> mListenerMapper = uri -> {
+ registerUriAsync(uri);
+ return new CopyOnWriteArrayList<>();
+ };
+
/**
* Caches the last seen value for registered keys.
*/
- private Map<Uri, Boolean> mKeyCache = new ConcurrentHashMap<>();
- private final Map<Uri, CopyOnWriteArrayList<OnChangeListener>> mListenerMap = new HashMap<>();
+ private final Map<Uri, Boolean> mKeyCache = new ConcurrentHashMap<>();
+ private final Map<Uri, CopyOnWriteArrayList<OnChangeListener>> mListenerMap =
+ new ConcurrentHashMap<>();
protected final ContentResolver mResolver;
/**
@@ -96,12 +102,8 @@
SettingsCache(@ApplicationContext Context context, DaggerSingletonTracker tracker) {
super(new Handler(Looper.getMainLooper()));
mResolver = context.getContentResolver();
- tracker.addCloseable(this);
- }
-
- @Override
- public void close() {
- UI_HELPER_EXECUTOR.execute(() -> mResolver.unregisterContentObserver(this));
+ tracker.addCloseable(() ->
+ UI_HELPER_EXECUTOR.execute(() -> mResolver.unregisterContentObserver(this)));
}
@Override
@@ -109,11 +111,12 @@
// We use default of 1, but if we're getting an onChange call, can assume a non-default
// value will exist
boolean newVal = updateValue(uri, 1 /* Effectively Unused */);
- if (!mListenerMap.containsKey(uri)) {
+ List<OnChangeListener> listeners = mListenerMap.get(uri);
+ if (listeners == null) {
return;
}
- for (OnChangeListener listener : mListenerMap.get(uri)) {
+ for (OnChangeListener listener : listeners) {
listener.onSettingsChanged(newVal);
}
}
@@ -138,22 +141,17 @@
}
}
+ private void registerUriAsync(Uri uri) {
+ UI_HELPER_EXECUTOR.execute(() -> mResolver.registerContentObserver(uri, false, this));
+ }
+
/**
* Does not de-dupe if you add same listeners for the same key multiple times.
* Unregister once complete using {@link #unregister(Uri, OnChangeListener)}
*/
@UiThread
public void register(Uri uri, OnChangeListener changeListener) {
- Preconditions.assertUIThread();
- if (mListenerMap.containsKey(uri)) {
- mListenerMap.get(uri).add(changeListener);
- } else {
- CopyOnWriteArrayList<OnChangeListener> l = new CopyOnWriteArrayList<>();
- l.add(changeListener);
- mListenerMap.put(uri, l);
- UI_HELPER_EXECUTOR.execute(
- () -> mResolver.registerContentObserver(uri, false, this));
- }
+ mListenerMap.computeIfAbsent(uri, mListenerMapper).add(changeListener);
}
private boolean updateValue(Uri keyUri, int defaultValue) {
diff --git a/src/com/android/launcher3/views/ArrowTipView.java b/src/com/android/launcher3/views/ArrowTipView.java
index bb4f040..abb0081 100644
--- a/src/com/android/launcher3/views/ArrowTipView.java
+++ b/src/com/android/launcher3/views/ArrowTipView.java
@@ -73,7 +73,7 @@
}
};
- private final ActivityContext mActivityContext;
+ protected final ActivityContext mActivityContext;
private final Handler mHandler = new Handler();
private boolean mIsPointingUp;
private Runnable mOnClosed;
@@ -103,16 +103,26 @@
R.dimen.arrow_toast_arrow_width);
mArrowMinOffset = context.getResources().getDimensionPixelSize(
R.dimen.dynamic_grid_cell_border_spacing);
- TypedArray ta = context.obtainStyledAttributes(R.styleable.ArrowTipView);
+ Context localContext = context;
+ TypedArray ta = localContext.obtainStyledAttributes(R.styleable.ArrowTipView);
// Set style to default to avoid inflation issues with missing attributes.
if (!ta.hasValue(R.styleable.ArrowTipView_arrowTipBackground)
|| !ta.hasValue(R.styleable.ArrowTipView_arrowTipTextColor)) {
- context = new ContextThemeWrapper(context, R.style.ArrowTipStyle);
+ localContext = new ContextThemeWrapper(localContext, R.style.ArrowTipStyle);
}
- mArrowViewPaintColor = ta.getColor(R.styleable.ArrowTipView_arrowTipBackground,
+ mArrowViewPaintColor = applyArrowPaintColor(ta, localContext);
+ init(localContext, layoutId);
+ }
+
+ protected int applyArrowPaintColor(TypedArray typedArray, Context context) {
+ int arrowPaintColor = typedArray.getColor(R.styleable.ArrowTipView_arrowTipBackground,
context.getColor(R.color.arrow_tip_view_bg));
- ta.recycle();
- init(context, layoutId);
+ typedArray.recycle();
+ return arrowPaintColor;
+ }
+
+ protected int getArrowId() {
+ return R.id.arrow;
}
@Override
@@ -154,7 +164,7 @@
inflate(context, layoutId, this);
setOrientation(LinearLayout.VERTICAL);
- mArrowView = findViewById(R.id.arrow);
+ mArrowView = findViewById(getArrowId());
updateArrowTipInView(mIsPointingUp);
setAlpha(0);
@@ -343,6 +353,34 @@
parent.addView(this);
requestLayout();
}
+ return showAtLocation(arrowXCoord, yCoordDownPointingTip, yCoordUpPointingTip,
+ minViewMargin, parentViewWidth, parentViewHeight, shouldAutoClose);
+ }
+
+ /**
+ * Show the ArrowTipView (tooltip) custom aligned. The tooltip is vertically flipped if it
+ * cannot fit on screen in the requested orientation.
+ *
+ * @param arrowXCoord The X coordinate for the arrow on the tooltip. The arrow is usually in the
+ * center of tooltip unless the tooltip goes beyond screen margin.
+ * @param yCoordDownPointingTip The Y coordinate of the pointed tip end of the tooltip when the
+ * tooltip is placed pointing downwards.
+ * @param yCoordUpPointingTip The Y coordinate of the pointed tip end of the tooltip when the
+ * tooltip is placed pointing upwards.
+ * @param minViewMargin The view margin in pixels from the tip end to the y coordinate.
+ * @param parentViewWidth The width in pixels of the parent view.
+ * @param parentViewHeight The height in pixels of the parent view.
+ * @param shouldAutoClose If Tooltip should be auto close.
+ * @return The tool tip view. {@code null} if the tip can not be shown.
+ */
+ protected ArrowTipView showAtLocation(
+ @Px int arrowXCoord,
+ @Px int yCoordDownPointingTip,
+ @Px int yCoordUpPointingTip,
+ @Px int minViewMargin,
+ @Px int parentViewWidth,
+ @Px int parentViewHeight,
+ boolean shouldAutoClose) {
post(() -> {
// Adjust the tooltip horizontally.
diff --git a/src_no_quickstep/com/android/launcher3/dagger/Modules.kt b/src_no_quickstep/com/android/launcher3/dagger/Modules.kt
index dab33a0..c3bf7c5 100644
--- a/src_no_quickstep/com/android/launcher3/dagger/Modules.kt
+++ b/src_no_quickstep/com/android/launcher3/dagger/Modules.kt
@@ -25,3 +25,8 @@
@Module abstract class ApiWrapperModule {}
@Module abstract class PluginManagerWrapperModule {}
+
+@Module object StaticObjectModule {}
+
+// Module containing bindings for the final derivative app
+@Module abstract class AppModule {}
diff --git a/tests/assets/databases/GridMigrationTest/result5x5to5x8.db b/tests/assets/databases/GridMigrationTest/result5x5to5x8.db
index 311a112..d750774 100644
--- a/tests/assets/databases/GridMigrationTest/result5x5to5x8.db
+++ b/tests/assets/databases/GridMigrationTest/result5x5to5x8.db
Binary files differ
diff --git a/tests/assets/databases/GridMigrationTest/result5x5to5x8WithShift.db b/tests/assets/databases/GridMigrationTest/result5x5to5x8WithShift.db
deleted file mode 100644
index d750774..0000000
--- a/tests/assets/databases/GridMigrationTest/result5x5to5x8WithShift.db
+++ /dev/null
Binary files differ
diff --git a/tests/assets/databases/GridMigrationTest/test_launcher_2.db b/tests/assets/databases/GridMigrationTest/test_launcher_2.db
deleted file mode 100644
index b538e26..0000000
--- a/tests/assets/databases/GridMigrationTest/test_launcher_2.db
+++ /dev/null
Binary files differ
diff --git a/tests/multivalentTests/src/com/android/launcher3/util/DaggerGraphs.kt b/tests/multivalentTests/src/com/android/launcher3/util/DaggerGraphs.kt
index 68da9ff..b66a9d3 100644
--- a/tests/multivalentTests/src/com/android/launcher3/util/DaggerGraphs.kt
+++ b/tests/multivalentTests/src/com/android/launcher3/util/DaggerGraphs.kt
@@ -19,6 +19,8 @@
import com.android.launcher3.FakeLauncherPrefs
import com.android.launcher3.LauncherPrefs
import com.android.launcher3.dagger.ApiWrapperModule
+import com.android.launcher3.dagger.AppModule
+import com.android.launcher3.dagger.StaticObjectModule
import com.android.launcher3.dagger.WindowManagerProxyModule
import dagger.Binds
import dagger.Module
@@ -31,11 +33,21 @@
}
/** All modules. We also exclude the plugin module from tests */
-@Module(includes = [ApiWrapperModule::class, WindowManagerProxyModule::class])
+@Module(
+ includes =
+ [
+ ApiWrapperModule::class,
+ WindowManagerProxyModule::class,
+ StaticObjectModule::class,
+ AppModule::class,
+ ]
+)
class AllModulesForTest
/** All modules except the WMProxy */
-@Module(includes = [ApiWrapperModule::class]) class AllModulesMinusWMProxy
+@Module(includes = [ApiWrapperModule::class, StaticObjectModule::class, AppModule::class])
+class AllModulesMinusWMProxy
/** All modules except the ApiWrapper */
-@Module(includes = [WindowManagerProxyModule::class]) class AllModulesMinusApiWrapper
+@Module(includes = [WindowManagerProxyModule::class, StaticObjectModule::class, AppModule::class])
+class AllModulesMinusApiWrapper
diff --git a/tests/multivalentTests/src/com/android/launcher3/util/LockedUserStateTest.kt b/tests/multivalentTests/src/com/android/launcher3/util/LockedUserStateTest.kt
index 2711d7a..99f5a5b 100644
--- a/tests/multivalentTests/src/com/android/launcher3/util/LockedUserStateTest.kt
+++ b/tests/multivalentTests/src/com/android/launcher3/util/LockedUserStateTest.kt
@@ -22,7 +22,10 @@
import android.os.UserManager
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
+import com.android.launcher3.util.Executors.MAIN_EXECUTOR
+import com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR
import com.google.common.truth.Truth.assertThat
+import org.junit.After
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
@@ -38,17 +41,24 @@
private val userManager: UserManager = mock()
private val context: Context = mock()
+ private val lifeCycle: DaggerSingletonTracker = mock()
@Before
fun setup() {
whenever(context.getSystemService(UserManager::class.java)).thenReturn(userManager)
}
+ @After
+ fun tearDown() {
+ UI_HELPER_EXECUTOR.submit {}.get()
+ MAIN_EXECUTOR.submit {}.get()
+ }
+
@Test
fun runOnUserUnlocked_runs_action_immediately_if_already_unlocked() {
whenever(userManager.isUserUnlocked(Process.myUserHandle())).thenReturn(true)
val action: Runnable = mock()
- LockedUserState(context).runOnUserUnlocked(action)
+ LockedUserState(context, lifeCycle).runOnUserUnlocked(action)
verify(action).run()
}
@@ -56,23 +66,23 @@
fun runOnUserUnlocked_waits_to_run_action_until_user_is_unlocked() {
whenever(userManager.isUserUnlocked(Process.myUserHandle())).thenReturn(false)
val action: Runnable = mock()
- val state = LockedUserState(context)
+ val state = LockedUserState(context, lifeCycle)
state.runOnUserUnlocked(action)
// b/343530737
verifyNoMoreInteractions(action)
- state.mUserUnlockedReceiver.onReceive(context, Intent(Intent.ACTION_USER_UNLOCKED))
+ state.userUnlockedReceiver.onReceive(context, Intent(Intent.ACTION_USER_UNLOCKED))
verify(action).run()
}
@Test
fun isUserUnlocked_returns_true_when_user_is_unlocked() {
whenever(userManager.isUserUnlocked(Process.myUserHandle())).thenReturn(true)
- assertThat(LockedUserState(context).isUserUnlocked).isTrue()
+ assertThat(LockedUserState(context, lifeCycle).isUserUnlocked).isTrue()
}
@Test
fun isUserUnlocked_returns_false_when_user_is_locked() {
whenever(userManager.isUserUnlocked(Process.myUserHandle())).thenReturn(false)
- assertThat(LockedUserState(context).isUserUnlocked).isFalse()
+ assertThat(LockedUserState(context, lifeCycle).isUserUnlocked).isFalse()
}
}
diff --git a/tests/multivalentTests/src/com/android/launcher3/util/SandboxApplication.kt b/tests/multivalentTests/src/com/android/launcher3/util/SandboxApplication.kt
index efe7637..0da8891 100644
--- a/tests/multivalentTests/src/com/android/launcher3/util/SandboxApplication.kt
+++ b/tests/multivalentTests/src/com/android/launcher3/util/SandboxApplication.kt
@@ -48,6 +48,7 @@
class SandboxApplication private constructor(private val base: SandboxApplicationWrapper) :
SandboxModelContext(base), TestRule {
+ @JvmOverloads
constructor(
base: Context = ApplicationProvider.getApplicationContext()
) : this(SandboxApplicationWrapper(base))
diff --git a/tests/src/com/android/launcher3/model/GridMigrationTest.kt b/tests/src/com/android/launcher3/model/GridMigrationTest.kt
index 8bd0c60..380c208 100644
--- a/tests/src/com/android/launcher3/model/GridMigrationTest.kt
+++ b/tests/src/com/android/launcher3/model/GridMigrationTest.kt
@@ -82,8 +82,6 @@
@RunWith(AndroidJUnit4::class)
class GridMigrationTest {
private val DB_FILE = "test_launcher.db"
- // This DB is used for testing the heuristic where we add an extra row at the bottom.
- private val DB_FILE_NO_SHIFT = "test_launcher_2.db"
@JvmField
@Rule
@@ -230,42 +228,6 @@
@JvmField
@Rule
- val result5x5to5x8WithShift =
- TestToPhoneFileCopier(
- src = "databases/GridMigrationTest/result5x5to5x8WithShift.db",
- dest = "databases/result5x5to5x8WithShift.db",
- removeOnFinish = true,
- )
-
- @Test
- fun `5x5 to 5x8 with cells shifting down`() =
- runTest(
- src = GridMigrationData(DB_FILE, DeviceGridState(5, 5, 5, TYPE_PHONE, DB_FILE)),
- dst =
- GridMigrationData(
- null, // in memory db, to download a new db change null
- // for
- // the filename of the db name to store it. Do not use existing names.
- DeviceGridState(5, 8, 5, TYPE_PHONE, ""),
- ),
- target =
- GridMigrationData(
- "result5x5to5x8WithShift.db",
- DeviceGridState(5, 8, 5, TYPE_PHONE, ""),
- ),
- )
-
- @JvmField
- @Rule
- val fileCopierNoShift =
- TestToPhoneFileCopier(
- src = "databases/GridMigrationTest/$DB_FILE_NO_SHIFT",
- dest = "databases/$DB_FILE_NO_SHIFT",
- removeOnFinish = true,
- )
-
- @JvmField
- @Rule
val result5x5to5x8 =
TestToPhoneFileCopier(
src = "databases/GridMigrationTest/result5x5to5x8.db",
@@ -274,16 +236,13 @@
)
@Test
- fun `5x5 to 5x8 without cell shift`() =
+ fun `5x5 to 5x8`() =
runTest(
- src =
- GridMigrationData(
- DB_FILE_NO_SHIFT,
- DeviceGridState(5, 5, 5, TYPE_PHONE, DB_FILE_NO_SHIFT),
- ),
+ src = GridMigrationData(DB_FILE, DeviceGridState(5, 5, 5, TYPE_PHONE, DB_FILE)),
dst =
GridMigrationData(
- null, // in memory db, to download a new db change null for
+ null, // in memory db, to download a new db change null
+ // for
// the filename of the db name to store it. Do not use existing names.
DeviceGridState(5, 8, 5, TYPE_PHONE, ""),
),
diff --git a/tests/src/com/android/launcher3/pm/InstallSessionHelperTest.kt b/tests/src/com/android/launcher3/pm/InstallSessionHelperTest.kt
index c7db741..707c2c1 100644
--- a/tests/src/com/android/launcher3/pm/InstallSessionHelperTest.kt
+++ b/tests/src/com/android/launcher3/pm/InstallSessionHelperTest.kt
@@ -35,7 +35,6 @@
import com.android.launcher3.util.TestUtil
import com.google.common.truth.Truth.assertThat
import org.junit.Before
-import org.junit.Ignore
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.kotlin.any
@@ -53,7 +52,7 @@
private val sandboxContext = spy(launcherModelHelper.sandboxContext)
private val packageManager = sandboxContext.packageManager
private val expectedAppPackage = "expectedAppPackage"
- private val expectedInstallerPackage = "expectedInstallerPackage"
+ private val expectedInstallerPackage = sandboxContext.packageName
private val mockPackageInstaller: PackageInstaller = mock()
private lateinit var installSessionHelper: InstallSessionHelper
@@ -62,7 +61,6 @@
@Before
fun setup() {
whenever(packageManager.packageInstaller).thenReturn(mockPackageInstaller)
- whenever(sandboxContext.packageName).thenReturn(expectedInstallerPackage)
launcherApps = sandboxContext.spyService(LauncherApps::class.java)
installSessionHelper = InstallSessionHelper(sandboxContext)
}
@@ -167,7 +165,6 @@
}
@Test
- @Ignore("b/388258969")
fun `promiseIconAddedForId returns true if there is a promiseIcon with the session id`() {
// Given
val expectedIdString = IntArray().apply { add(1) }.toConcatString()
diff --git a/tests/tapl/com/android/launcher3/tapl/OverviewTask.java b/tests/tapl/com/android/launcher3/tapl/OverviewTask.java
index 70bfb60..2431ef5 100644
--- a/tests/tapl/com/android/launcher3/tapl/OverviewTask.java
+++ b/tests/tapl/com/android/launcher3/tapl/OverviewTask.java
@@ -157,6 +157,7 @@
}
boolean taskWasFocused = mLauncher.isTablet()
+ && !isDesktop()
&& getVisibleHeight() == mLauncher.getOverviewTaskSize().height();
List<Integer> originalTasksCenterX =
getCurrentTasksCenterXList().stream().sorted().toList();