Merge "Revert^2 "Update status bar scrim"" into main
diff --git a/aconfig/launcher.aconfig b/aconfig/launcher.aconfig
index 5689c8a..760d8ac 100644
--- a/aconfig/launcher.aconfig
+++ b/aconfig/launcher.aconfig
@@ -69,3 +69,10 @@
description: "Enables initiating split from a fullscreen app using keyboard shortcuts"
bug: "270394122"
}
+
+flag {
+ name: "enable_launcher_br_metrics"
+ namespace: "launcher"
+ description: "Enables logging of Launcher restore metrics to the Backup & Restore team"
+ bug: "307527314"
+}
diff --git a/quickstep/res/layout/icon_app_chip_view.xml b/quickstep/res/layout/icon_app_chip_view.xml
index 37d5eb2..b7acb70 100644
--- a/quickstep/res/layout/icon_app_chip_view.xml
+++ b/quickstep/res/layout/icon_app_chip_view.xml
@@ -23,6 +23,7 @@
android:focusable="false"
android:importantForAccessibility="no"
android:autoMirrored="true"
+ android:background="@drawable/icon_menu_elevation_background"
android:elevation="@dimen/task_thumbnail_icon_menu_elevation" >
<ImageView
@@ -59,9 +60,8 @@
android:maxLines="1"
android:ellipsize="end"
android:textAlignment="viewStart"
- android:textColor="?androidprv:attr/materialColorOnSurface"
- android:textSize="@dimen/task_thumbnail_icon_menu_text_size"
- android:importantForAccessibility="no" />
+ android:importantForAccessibility="no"
+ style="@style/IconAppChipMenuTextStyle" />
<TextView
android:id="@+id/icon_text_expanded"
@@ -71,9 +71,8 @@
android:maxLines="1"
android:ellipsize="end"
android:textAlignment="viewStart"
- android:textColor="?androidprv:attr/materialColorOnSurface"
- android:textSize="@dimen/task_thumbnail_icon_menu_text_size"
- android:importantForAccessibility="no" />
+ android:importantForAccessibility="no"
+ style="@style/IconAppChipMenuTextStyle" />
<ImageView
android:id="@+id/icon_arrow"
diff --git a/quickstep/res/layout/split_instructions_view.xml b/quickstep/res/layout/split_instructions_view.xml
index c663bf4..0bbbfd5 100644
--- a/quickstep/res/layout/split_instructions_view.xml
+++ b/quickstep/res/layout/split_instructions_view.xml
@@ -30,9 +30,15 @@
android:id="@+id/split_instructions_text"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
- android:gravity="center"
android:textColor="?androidprv:attr/textColorOnAccent"
- android:drawableEnd="@drawable/ic_split_exit"
- android:drawablePadding="@dimen/split_instructions_drawable_padding"
android:text="@string/toast_split_select_app" />
+
+ <androidx.appcompat.widget.AppCompatTextView
+ android:id="@+id/split_instructions_text_cancel"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ android:textColor="?androidprv:attr/textColorOnAccent"
+ android:layout_marginStart="@dimen/split_instructions_start_margin_cancel"
+ android:text="@string/toast_split_select_app_cancel"
+ android:visibility="gone"/>
</com.android.quickstep.views.SplitInstructionsView>
\ No newline at end of file
diff --git a/quickstep/res/values-af/strings.xml b/quickstep/res/values-af/strings.xml
index b7d9cf1..b008b67 100644
--- a/quickstep/res/values-af/strings.xml
+++ b/quickstep/res/values-af/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Verlaat verdeeldeskermkeuse"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Kies nog ’n app as jy verdeelde skerm wil gebruik"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Jou organisasie laat nie hierdie program toe nie"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Legstukke word nie tans ondersteun nie; kies asseblief ’n ander program"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Slaan navigasietutoriaal oor?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Jy kan dit later in die <xliff:g id="NAME">%1$s</xliff:g>-program kry"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Kanselleer"</string>
diff --git a/quickstep/res/values-am/strings.xml b/quickstep/res/values-am/strings.xml
index f270f5d..d95118b 100644
--- a/quickstep/res/values-am/strings.xml
+++ b/quickstep/res/values-am/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"ከተከፈለ ማያ ገፅ ምርጫ ይውጡ"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"የተከፈለ ማያ ገጽን ለመቀበል ሌላ መተግበሪያ ይምረጡ"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"ይህ ድርጊት በመተግበሪያው ወይም በእርስዎ ድርጅት አይፈቀድም"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"መግብሮች በአሁኑ ጊዜ አይደገፉም፣ እባክዎ ሌላ መተግበሪያ ይምረጡ"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"የአሰሳ አጋዥ ሥልጠናን ይዝለሉ?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"ይህን በኋላ በ<xliff:g id="NAME">%1$s</xliff:g> መተግበሪያው ውስጥ ማግኘት ይችላሉ"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"ይቅር"</string>
diff --git a/quickstep/res/values-ar/strings.xml b/quickstep/res/values-ar/strings.xml
index a53057b..d79e981 100644
--- a/quickstep/res/values-ar/strings.xml
+++ b/quickstep/res/values-ar/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"الخروج من وضع تقسيم الشاشة"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"اختَر تطبيقًا آخر لاستخدام وضع تقسيم الشاشة."</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"لا يسمح التطبيق أو لا تسمح مؤسستك بهذا الإجراء."</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"التطبيقات المصغّرة غير متوفّرة حاليًا، يرجى اختيار تطبيق آخر."</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"هل تريد تخطي الدليل التوجيهي للتنقّل؟"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"يمكنك العثور على هذا الدليل التوجيهي لاحقًا في التطبيق \"<xliff:g id="NAME">%1$s</xliff:g>\""</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"إلغاء"</string>
diff --git a/quickstep/res/values-as/strings.xml b/quickstep/res/values-as/strings.xml
index 18d32d9..7d8545a 100644
--- a/quickstep/res/values-as/strings.xml
+++ b/quickstep/res/values-as/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"বিভাজিত স্ক্ৰীনৰ বাছনিৰ পৰা বাহিৰ হওক"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"বিভাজিত স্ক্ৰীন ব্যৱহাৰ কৰিবলৈ অন্য এটা এপ্ বাছক"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"এপ্টোৱে অথবা আপোনাৰ প্ৰতিষ্ঠানে এই কাৰ্যটোৰ অনুমতি নিদিয়ে"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"বৰ্তমান ৱিজেট সমৰ্থিত নহয়, অনুগ্ৰহ কৰি আন এটা এপ্ বাছনি কৰক"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"নেভিগেশ্বনৰ টিউট’ৰিয়েল এৰিব বিচাৰে নেকি?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"আপুনি এয়া পাছত <xliff:g id="NAME">%1$s</xliff:g> এপ্টোত বিচাৰিব পাৰিব"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"বাতিল কৰক"</string>
diff --git a/quickstep/res/values-az/strings.xml b/quickstep/res/values-az/strings.xml
index 6675495..0732d71 100644
--- a/quickstep/res/values-az/strings.xml
+++ b/quickstep/res/values-az/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Bölünmüş ekran seçimindən çıxın"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Bölünmüş ekrandan istifadə üçün başqa tətbiq seçin"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Bu əməliyyata tətbiq və ya təşkilatınız tərəfindən icazə verilmir"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Vidcetlər dəstəklənmir, başqa tətbiq seçin"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Naviqasiya dərsliyi ötürülsün?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Bunu sonra <xliff:g id="NAME">%1$s</xliff:g> tətbiqində tapa bilərsiniz"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Ləğv edin"</string>
diff --git a/quickstep/res/values-b+sr+Latn/strings.xml b/quickstep/res/values-b+sr+Latn/strings.xml
index f962c35..83d4564 100644
--- a/quickstep/res/values-b+sr+Latn/strings.xml
+++ b/quickstep/res/values-b+sr+Latn/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Izlazak iz biranja podeljenog ekrana"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Odaberite drugu aplikaciju za podeljeni ekran"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Aplikacija ili organizacija ne dozvoljavaju ovu radnju"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Vidžeti trenutno nisu podržani. Izaberite drugu aplikaciju"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Želite da preskočite vodič za kretanje?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Možete da pronađete ovo kasnije u aplikaciji <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Otkaži"</string>
diff --git a/quickstep/res/values-be/strings.xml b/quickstep/res/values-be/strings.xml
index a7f6df9..36c976b 100644
--- a/quickstep/res/values-be/strings.xml
+++ b/quickstep/res/values-be/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Выйсці з рэжыму падзеленага экрана"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Каб падзяліць экран, выберыце іншую праграму"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Гэта дзеянне не дазволена праграмай ці вашай арганізацыяй"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Віджэты зараз не падтрымліваюцца. Выберыце іншую праграму."</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Прапусціць дапаможнік па навігацыі?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Знайсці дапаможнік можна ў праграме \"<xliff:g id="NAME">%1$s</xliff:g>\""</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Скасаваць"</string>
diff --git a/quickstep/res/values-bg/strings.xml b/quickstep/res/values-bg/strings.xml
index 537943b..ce814f0 100644
--- a/quickstep/res/values-bg/strings.xml
+++ b/quickstep/res/values-bg/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Изход от избора на разделен екран"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"За разделен екран изберете още едно приложение"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Това действие не е разрешено от приложението или организацията ви"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Понастоящем приспособленията не се поддържат. Моля, изберете друго приложение"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Пропускане на урока за навигиране?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Урокът е налице в приложението <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Отказ"</string>
diff --git a/quickstep/res/values-bn/strings.xml b/quickstep/res/values-bn/strings.xml
index 139b5f6..2b21ee5 100644
--- a/quickstep/res/values-bn/strings.xml
+++ b/quickstep/res/values-bn/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"স্প্লিট স্ক্রিন বেছে নেওয়ার বিকল্প থেকে বেরিয়ে আসুন"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"স্প্লিট স্ক্রিন ব্যবহার করতে অন্য অ্যাপ বেছে নিন"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"এই অ্যাপ বা আপনার প্রতিষ্ঠান এই অ্যাকশনটি পারফর্ম করার অনুমতি দেয়নি"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"উইজেট বর্তমানে ব্যবহার করা যাচ্ছে না, অন্য একটি অ্যাপ বেছে নিন"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"নেভিগেশন টিউটোরিয়াল এড়িয়ে যেতে চান?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"আপনি <xliff:g id="NAME">%1$s</xliff:g> অ্যাপে পরে এটি খুঁজে পাবেন"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"বাতিল করুন"</string>
diff --git a/quickstep/res/values-bs/strings.xml b/quickstep/res/values-bs/strings.xml
index 6860796..26abe60 100644
--- a/quickstep/res/values-bs/strings.xml
+++ b/quickstep/res/values-bs/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Izlaz iz odabira podijeljenog ekrana"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Odaberite drugu apl. da koristite podijeljeni ekran"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Ovu radnju ne dozvoljava aplikacija ili vaša organizacija"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Vidžeti trenutno nisu podržani. Odaberite drugu aplikaciju"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Preskočiti vodič za navigiranje?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Možete ga pronaći kasnije u aplikaciji <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Otkaži"</string>
diff --git a/quickstep/res/values-ca/strings.xml b/quickstep/res/values-ca/strings.xml
index cc1c7fa..1dc1b68 100644
--- a/quickstep/res/values-ca/strings.xml
+++ b/quickstep/res/values-ca/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Surt de la selecció de pantalla dividida"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Tria una altra app per utilitzar pantalla dividida"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"L\'aplicació o la teva organització no permeten aquesta acció"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Actualment els widgets no s\'admeten; selecciona una altra aplicació"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Vols ometre el tutorial de navegació?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Pots trobar-lo més tard a l\'aplicació <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Cancel·la"</string>
diff --git a/quickstep/res/values-cs/strings.xml b/quickstep/res/values-cs/strings.xml
index 93a8786..09cfea8 100644
--- a/quickstep/res/values-cs/strings.xml
+++ b/quickstep/res/values-cs/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Výběr opuštění rozdělené obrazovky"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Vyberte podporovanou aplikaci"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Aplikace nebo organizace zakazuje tuto akci"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Widgety momentálně nejsou podporovány, vyberte jinou aplikaci"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Přeskočit výukový program k navigaci?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Program později najdete v aplikaci <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Zrušit"</string>
diff --git a/quickstep/res/values-da/strings.xml b/quickstep/res/values-da/strings.xml
index 8e44917..db8789c 100644
--- a/quickstep/res/values-da/strings.xml
+++ b/quickstep/res/values-da/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Luk valg af opdelt skærm"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Vælg en anden app for at bruge opdelt skærm"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Appen eller din organisation tillader ikke denne handling"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Widgets understøttes ikke i øjeblikket. Vælg en anden app."</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Vil du springe vejledningen for navigation over?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Du kan finde dette senere i appen <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Annuller"</string>
diff --git a/quickstep/res/values-de/strings.xml b/quickstep/res/values-de/strings.xml
index 3c25927..eabee77 100644
--- a/quickstep/res/values-de/strings.xml
+++ b/quickstep/res/values-de/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Splitscreen-Auswahl beenden"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Für Splitscreen andere App auswählen"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Die App oder deine Organisation lässt diese Aktion nicht zu"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Widgets werden momentan nicht unterstützt, bitte wähle eine andere App aus"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Tutorial zur Bedienung überspringen?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Du findest es später auch in der <xliff:g id="NAME">%1$s</xliff:g> App"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Abbrechen"</string>
diff --git a/quickstep/res/values-el/strings.xml b/quickstep/res/values-el/strings.xml
index 69802dc..36fb256 100644
--- a/quickstep/res/values-el/strings.xml
+++ b/quickstep/res/values-el/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Έξοδος από την επιλογή διαχωρισμού οθόνης"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Επιλέξτε άλλη εφαρμογή για διαχωρισμό οθόνης"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Αυτή η ενέργεια δεν επιτρέπεται από την εφαρμογή ή τον οργανισμό σας."</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Προς το παρόν, τα γραφικά στοιχεία δεν υποστηρίζονται. Επιλέξτε άλλη εφαρμογή"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Παράβλεψη οδηγού πλοήγησης;"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Βρείτε τον αργότερα στην εφαρμογή <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Ακύρωση"</string>
diff --git a/quickstep/res/values-en-rAU/strings.xml b/quickstep/res/values-en-rAU/strings.xml
index 0a4c110..21b2359 100644
--- a/quickstep/res/values-en-rAU/strings.xml
+++ b/quickstep/res/values-en-rAU/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Exit split screen selection"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Choose another app to use split screen"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"This action isn\'t allowed by the app or your organisation"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Widgets not currently supported; please select another app"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Skip navigation tutorial?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"You can find this later in the <xliff:g id="NAME">%1$s</xliff:g> app"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Cancel"</string>
diff --git a/quickstep/res/values-en-rGB/strings.xml b/quickstep/res/values-en-rGB/strings.xml
index 0a4c110..21b2359 100644
--- a/quickstep/res/values-en-rGB/strings.xml
+++ b/quickstep/res/values-en-rGB/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Exit split screen selection"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Choose another app to use split screen"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"This action isn\'t allowed by the app or your organisation"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Widgets not currently supported; please select another app"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Skip navigation tutorial?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"You can find this later in the <xliff:g id="NAME">%1$s</xliff:g> app"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Cancel"</string>
diff --git a/quickstep/res/values-en-rIN/strings.xml b/quickstep/res/values-en-rIN/strings.xml
index 0a4c110..21b2359 100644
--- a/quickstep/res/values-en-rIN/strings.xml
+++ b/quickstep/res/values-en-rIN/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Exit split screen selection"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Choose another app to use split screen"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"This action isn\'t allowed by the app or your organisation"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Widgets not currently supported; please select another app"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Skip navigation tutorial?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"You can find this later in the <xliff:g id="NAME">%1$s</xliff:g> app"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Cancel"</string>
diff --git a/quickstep/res/values-es-rUS/strings.xml b/quickstep/res/values-es-rUS/strings.xml
index 05f5ff7..0c16988 100644
--- a/quickstep/res/values-es-rUS/strings.xml
+++ b/quickstep/res/values-es-rUS/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Salir de la selección de pantalla dividida"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Elige otra app para usar la pantalla dividida"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"La app o tu organización no permiten realizar esta acción"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"En este momento, los widgets no son compatibles; selecciona otra app"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"¿Omitir el instructivo de navegación?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Puedes encontrarlo en la app de <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Cancelar"</string>
diff --git a/quickstep/res/values-es/strings.xml b/quickstep/res/values-es/strings.xml
index f3b3c4b..0cedff1 100644
--- a/quickstep/res/values-es/strings.xml
+++ b/quickstep/res/values-es/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Salir de la selección de pantalla dividida"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Elige otra app para usar la pantalla dividida"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"No puedes hacerlo porque la aplicación o tu organización no lo permiten"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Actualmente no se admiten widgets; selecciona otra aplicación"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"¿Saltar tutorial de navegación?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Puedes consultarlo en otro momento en la aplicación <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Cancelar"</string>
diff --git a/quickstep/res/values-et/strings.xml b/quickstep/res/values-et/strings.xml
index 215f058..9628172 100644
--- a/quickstep/res/values-et/strings.xml
+++ b/quickstep/res/values-et/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Jagatud ekraanikuva valikust väljumine"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Valige jagatud ekraanikuva jaoks muu rakendus"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Rakendus või teie organisatsioon on selle toimingu keelanud"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Vidinaid praegu ei toetata, valige mõni muu rakendus"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Kas jätta navigeerimise õpetused vahele?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Leiate selle hiljem rakendusest <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Tühista"</string>
diff --git a/quickstep/res/values-eu/strings.xml b/quickstep/res/values-eu/strings.xml
index 4367cba..47ea4d6 100644
--- a/quickstep/res/values-eu/strings.xml
+++ b/quickstep/res/values-eu/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Irten pantaila zatituaren hautapenetik"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Pantaila zatitzeko, aukeratu beste aplikazio bat"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Aplikazioak edo erakundeak ez du eman ekintza hori gauzatzeko baimena"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Une honetan ez dira onartzen widgetak. Hautatu beste aplikazio bat."</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Nabigazio-tutoriala saltatu nahi duzu?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"<xliff:g id="NAME">%1$s</xliff:g> aplikazioan dago eskuragarri tutoriala"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Utzi"</string>
diff --git a/quickstep/res/values-fa/strings.xml b/quickstep/res/values-fa/strings.xml
index 5a1d1e5..86408cb 100644
--- a/quickstep/res/values-fa/strings.xml
+++ b/quickstep/res/values-fa/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"خروج از انتخاب صفحهٔ دونیمه"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"انتخاب برنامهای دیگر برای استفاده از صفحه دونیمه"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"برنامه یا سازمان شما اجازه نمیدهد این کنش انجام شود."</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"درحالحاضر از ابزارکها پشتیبانی نمیشود، لطفاً برنامه دیگری را انتخاب کنید"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"آموزش گامبهگام پیمایش رد شود؟"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"میتوانید آن را بعداً در برنامه <xliff:g id="NAME">%1$s</xliff:g> پیدا کنید"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"لغو"</string>
diff --git a/quickstep/res/values-fi/strings.xml b/quickstep/res/values-fi/strings.xml
index 2269eff..c38ab4a 100644
--- a/quickstep/res/values-fi/strings.xml
+++ b/quickstep/res/values-fi/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Poistu jaetun näytön valinnasta"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Käytä jaettua näyttöä valitsemalla toinen sovellus"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Sovellus tai organisaatio ei salli tätä toimintoa"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Widgetejä ei tällä hetkellä tueta, valitse toinen sovellus"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Ohitetaanko navigointiohje?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Löydät tämän myöhemmin sovelluksesta: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Peru"</string>
diff --git a/quickstep/res/values-fr-rCA/strings.xml b/quickstep/res/values-fr-rCA/strings.xml
index 0e52222..0c1bac6 100644
--- a/quickstep/res/values-fr-rCA/strings.xml
+++ b/quickstep/res/values-fr-rCA/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Quitter la sélection d\'écran divisé"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Choisir une autre application pour utiliser l\'écran partagé"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"L\'application ou votre organisation n\'autorise pas cette action"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Les widgets ne sont actuellement pas pris en charge. Veuillez sélectionner une autre application"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Ignorer le tutoriel sur la navigation?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Vous trouverez le tutoriel dans l\'application <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Annuler"</string>
diff --git a/quickstep/res/values-fr/strings.xml b/quickstep/res/values-fr/strings.xml
index 2e3c45e..33b51d9 100644
--- a/quickstep/res/values-fr/strings.xml
+++ b/quickstep/res/values-fr/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Quitter la sélection de l\'écran partagé"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Sélect. autre appli pour utiliser l\'écran partagé"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Cette action n\'est pas autorisée par l\'application ou par votre organisation"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Les widgets ne sont actuellement pas pris en charge, veuillez sélectionner une autre appli"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Ignorer le tutoriel de navigation ?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Vous le retrouverez dans l\'appli <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Annuler"</string>
diff --git a/quickstep/res/values-gl/strings.xml b/quickstep/res/values-gl/strings.xml
index 56a509a..3e20656 100644
--- a/quickstep/res/values-gl/strings.xml
+++ b/quickstep/res/values-gl/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Saír da selección de pantalla dividida"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Escolle outra app para usar a pantalla dividida"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"A aplicación ou a túa organización non permite realizar esta acción"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Actualmente os widgets non se admiten. Selecciona outra aplicación"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Queres omitir o titorial de navegación?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Podes atopalo máis tarde na aplicación <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Cancelar"</string>
diff --git a/quickstep/res/values-gu/strings.xml b/quickstep/res/values-gu/strings.xml
index 7e1b3f6..cb78db2 100644
--- a/quickstep/res/values-gu/strings.xml
+++ b/quickstep/res/values-gu/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"\'સ્ક્રીનને વિભાજિત કરો\' પસંદગીમાંથી બહાર નીકળો"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"સ્ક્રીન વિભાજનનો ઉપયોગ કરવા કોઈ અન્ય ઍપ પસંદ કરો"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"ઍપ કે તમારી સંસ્થા દ્વારા આ ક્રિયા કરવાની મંજૂરી નથી"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"વિજેટ હાલમાં સપોર્ટેડ નથી, કૃપા કરીને કોઈ બીજી ઍપ પસંદ કરો"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"નૅવિગેશન ટ્યૂટૉરિઅલ છોડી દઈએ?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"તમે આને પછીથી <xliff:g id="NAME">%1$s</xliff:g> ઍપમાં જોઈ શકો છો"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"રદ કરો"</string>
diff --git a/quickstep/res/values-hi/strings.xml b/quickstep/res/values-hi/strings.xml
index 1c05352..3ed9ed8 100644
--- a/quickstep/res/values-hi/strings.xml
+++ b/quickstep/res/values-hi/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"स्प्लिट स्क्रीन मोड से बाहर निकलें"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"स्प्लिट स्क्रीन के लिए, दूसरा ऐप्लिकेशन चुनें"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"ऐप्लिकेशन या आपका संगठन इस कार्रवाई की अनुमति नहीं देता"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"फ़िलहाल, विजेट काम नहीं कर रहें हैं. कृपया कोई दूसरा ऐप्लिकेशन चुनें"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"क्या आपको अभी नेविगेशन ट्यूटोरियल नहीं देखना है?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"इसे बाद में <xliff:g id="NAME">%1$s</xliff:g> ऐप्लिकेशन पर देखा जा सकता है"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"रद्द करें"</string>
diff --git a/quickstep/res/values-hr/strings.xml b/quickstep/res/values-hr/strings.xml
index b4443d9..1a352f6 100644
--- a/quickstep/res/values-hr/strings.xml
+++ b/quickstep/res/values-hr/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Zatvori odabir podijeljenog zaslona"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Odaberite drugu aplikaciju za upotrebu podijeljenog zaslona"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Aplikacija ili vaša organizacija ne dopuštaju ovu radnju"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Widgeti trenutačno nisu podržani, odaberite drugu aplikaciju"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Želite li preskočiti vodič za kretanje?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Kasnije ga možete pronaći u aplikaciji <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Odustani"</string>
diff --git a/quickstep/res/values-hu/strings.xml b/quickstep/res/values-hu/strings.xml
index 19c3c4e..00079a1 100644
--- a/quickstep/res/values-hu/strings.xml
+++ b/quickstep/res/values-hu/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Kilépés az osztott képernyő elemeinek kiválasztásából"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Válasszon másik appot a képernyő felosztásához"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Az alkalmazás vagy az Ön szervezete nem engedélyezi ezt a műveletet"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"A modulok jelenleg nem támogatottak; válasszon másik alkalmazást"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Kihagyja a navigáció bemutatóját?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Ezt később megtalálhatja a(z) <xliff:g id="NAME">%1$s</xliff:g> alkalmazásban"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Mégse"</string>
diff --git a/quickstep/res/values-hy/strings.xml b/quickstep/res/values-hy/strings.xml
index 4646660..4eebc67 100644
--- a/quickstep/res/values-hy/strings.xml
+++ b/quickstep/res/values-hy/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Դուրս գալ տրոհված էկրանի ռեժիմից"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Ընտրեք այլ հավելված՝ կիսված էկրանից օգտվելու համար"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Այս գործողությունն արգելված է հավելվածի կամ ձեր կազմակերպության կողմից"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Վիջեթները ներկայումս չեն աջակցվում. ընտրեք այլ հավելված"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Բաց թողնե՞լ նավիգացիայի ուղեցույցը"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Հետագայում սա կարող եք գտնել «<xliff:g id="NAME">%1$s</xliff:g>» հավելվածում"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Չեղարկել"</string>
diff --git a/quickstep/res/values-in/strings.xml b/quickstep/res/values-in/strings.xml
index 3f3bc4b..785b943 100644
--- a/quickstep/res/values-in/strings.xml
+++ b/quickstep/res/values-in/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Keluar dari pemilihan layar terpisah"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Pilih aplikasi lain untuk memakai layar terpisah"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Tindakan ini tidak diizinkan oleh aplikasi atau organisasi Anda"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Widget saat ini tidak didukung, pilih aplikasi lain"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Lewati tutorial gestur?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Anda dapat menemukan tutorial ini di lain waktu di aplikasi <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Batal"</string>
diff --git a/quickstep/res/values-is/strings.xml b/quickstep/res/values-is/strings.xml
index 349faac..35f3f23 100644
--- a/quickstep/res/values-is/strings.xml
+++ b/quickstep/res/values-is/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Loka skjáskiptingu"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Veldu annað forrit til að nota skjáskiptingu"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Forritið eða fyrirtækið leyfir ekki þessa aðgerð"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Græjur ekki studdar eins og er, veldu annað forrit"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Sleppa flettileiðsögn?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Þú getur fundið þetta síðar í forritinu <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Hætta við"</string>
diff --git a/quickstep/res/values-it/strings.xml b/quickstep/res/values-it/strings.xml
index a3e6276..fbb4d9d 100644
--- a/quickstep/res/values-it/strings.xml
+++ b/quickstep/res/values-it/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Esci dalla selezione dello schermo diviso"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Scegli un\'altra app per usare lo schermo diviso"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Questa azione non è consentita dall\'app o dall\'organizzazione"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Attualmente i widget non sono supportati, seleziona un\'altra app"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Saltare il tutorial di navigazione?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Puoi trovarlo in un secondo momento nell\'app <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Annulla"</string>
diff --git a/quickstep/res/values-iw/strings.xml b/quickstep/res/values-iw/strings.xml
index a63256c..f59f6d7 100644
--- a/quickstep/res/values-iw/strings.xml
+++ b/quickstep/res/values-iw/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"יציאה מתצוגת מסך מפוצל"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"כדי להשתמש במסך מפוצל צריך לבחור אפליקציה אחרת"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"האפליקציה או הארגון שלך אינם מתירים את הפעולה הזאת"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"הווידג\'טים לא נתמכים כרגע, צריך לבחור אפליקציה אחרת"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"לדלג על המדריך לניווט?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"ניתן למצוא את המדריך מאוחר יותר באפליקציה <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"ביטול"</string>
diff --git a/quickstep/res/values-ja/strings.xml b/quickstep/res/values-ja/strings.xml
index d0fe3d3..9bbeece 100644
--- a/quickstep/res/values-ja/strings.xml
+++ b/quickstep/res/values-ja/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"分割画面の選択を終了します"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"分割画面にするには、別のアプリを選択してください"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"この操作はアプリまたは組織で許可されていません"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"ウィジェットは現在サポートされていません。他のアプリを選択してください。"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"操作チュートリアルをスキップしますか?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"チュートリアルは後から <xliff:g id="NAME">%1$s</xliff:g> アプリで確認できます"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"キャンセル"</string>
diff --git a/quickstep/res/values-ka/strings.xml b/quickstep/res/values-ka/strings.xml
index 1d56afc..e7d7cb4 100644
--- a/quickstep/res/values-ka/strings.xml
+++ b/quickstep/res/values-ka/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"ეკრანის გაყოფის არჩევანიდან გასვლა"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"აირჩიეთ სხვა აპი ეკრანის გასაყოფად"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"ეს მოქმედება არ არის დაშვებული აპის ან თქვენი ორგანიზაციის მიერ"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"ვიჯეტები ამჟამად არ არის მხარდაჭერილი. გთხოვთ, აირჩიოთ სხვა აპი"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"გსურთ, გამოტოვოთ ნავიგაციის სახელმძღვანელო?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"ამის მოგვიანებით პოვნა <xliff:g id="NAME">%1$s</xliff:g> აპში შეგიძლიათ"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"გაუქმება"</string>
diff --git a/quickstep/res/values-kk/strings.xml b/quickstep/res/values-kk/strings.xml
index 7fb8ecb..65838f9 100644
--- a/quickstep/res/values-kk/strings.xml
+++ b/quickstep/res/values-kk/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Экранды бөлу режимінен шығу"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Экранды бөлу үшін басқа қолданбаны таңдаңыз."</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Бұл әрекетке қолданба не ұйым рұқсат етпейді."</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Виджеттерге қазір қолдау көрсетілмейді. Басқа қолданба таңдаңыз."</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Қимылдар оқулығын өткізіп жіберу керек пе?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Мұны кейін <xliff:g id="NAME">%1$s</xliff:g> қолданбасынан таба аласыз."</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Бас тарту"</string>
diff --git a/quickstep/res/values-km/strings.xml b/quickstep/res/values-km/strings.xml
index fc0177b..54b9260 100644
--- a/quickstep/res/values-km/strings.xml
+++ b/quickstep/res/values-km/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"ចាកចេញពីការជ្រើសរើសរបស់មុខងារបំបែកអេក្រង់"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"ជ្រើសរើសកម្មវិធីផ្សេងទៀត ដើម្បីប្រើមុខងារបំបែកអេក្រង់"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"សកម្មភាពនេះមិនត្រូវបានអនុញ្ញាតដោយកម្មវិធី ឬស្ថាប័នរបស់អ្នកទេ"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"បច្ចុប្បន្ន ធាតុក្រាហ្វិកមិនអាចប្រើបានទេ សូមជ្រើសរើសកម្មវិធីផ្សេងទៀត"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"រំលងមេរៀនអំពីការរុករកឬ?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"អ្នកអាចស្វែងរកមេរៀននេះនៅពេលក្រោយក្នុងកម្មវិធី <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"បោះបង់"</string>
diff --git a/quickstep/res/values-kn/strings.xml b/quickstep/res/values-kn/strings.xml
index 4de0c4f..870515d 100644
--- a/quickstep/res/values-kn/strings.xml
+++ b/quickstep/res/values-kn/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"ಸ್ಪ್ಲಿಟ್ ಸ್ಕ್ರೀನ್ ಆಯ್ಕೆಯಿಂದ ನಿರ್ಗಮಿಸಿ"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"\"ಪರದೆ ಬೇರ್ಪಡಿಸಿ\" ಬಳಸಲು ಬೇರೆ ಆ್ಯಪ್ ಅನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"ಆ್ಯಪ್ ಅಥವಾ ನಿಮ್ಮ ಸಂಸ್ಥೆಯು ಈ ಕ್ರಿಯೆಯನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"ವಿಜೆಟ್ಗಳು ಪ್ರಸ್ತುತ ಬೆಂಬಲಿತವಾಗಿಲ್ಲ, ಮತ್ತೊಂದು ಆ್ಯಪ್ ಅನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"ನ್ಯಾವಿಗೇಶನ್ ಟ್ಯುಟೋರಿಯಲ್ ಸ್ಕಿಪ್ ಮಾಡಬೇಕೇ?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"<xliff:g id="NAME">%1$s</xliff:g> ಆ್ಯಪ್ನಲ್ಲಿ ಇದನ್ನು ನಂತರ ಕಾಣಬಹುದು"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"ರದ್ದುಮಾಡಿ"</string>
diff --git a/quickstep/res/values-ko/strings.xml b/quickstep/res/values-ko/strings.xml
index bc9c967..8141ce5 100644
--- a/quickstep/res/values-ko/strings.xml
+++ b/quickstep/res/values-ko/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"화면 분할 선택 종료"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"화면 분할을 사용하려면 다른 앱을 선택하세요."</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"이 작업은 앱 또는 조직에서 허용되지 않습니다."</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"위젯이 현재 지원되지 않습니다. 다른 앱을 선택하세요."</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"이동 방법 튜토리얼을 건너뛰시겠습니까?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"이 튜토리얼은 <xliff:g id="NAME">%1$s</xliff:g> 앱에서 다시 볼 수 있습니다."</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"취소"</string>
diff --git a/quickstep/res/values-ky/strings.xml b/quickstep/res/values-ky/strings.xml
index d3fc891..6b096ba 100644
--- a/quickstep/res/values-ky/strings.xml
+++ b/quickstep/res/values-ky/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Тандалган экранды бөлүүдөн чыгуу"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Экранды бөлүү үчүн башка колдонмону тандаңыз"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Бул аракетти аткарууга колдонмо же ишканаңыз тыюу салган"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Виджеттер учурда колдоого алынбайт, башка колдонмону тандаңыз"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Жаңсоолор үйрөткүчүн өткөрүп жибересизби?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Аны кийин <xliff:g id="NAME">%1$s</xliff:g> колдонмосунан табасыз"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Жокко чыгаруу"</string>
diff --git a/quickstep/res/values-lo/strings.xml b/quickstep/res/values-lo/strings.xml
index 58c8354..45aed77 100644
--- a/quickstep/res/values-lo/strings.xml
+++ b/quickstep/res/values-lo/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"ອອກຈາກາກນເລືອກການແບ່ງໜ້າຈໍ"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"ເລືອກແອັບອື່ນເພື່ອໃຊ້ການແບ່ງໜ້າຈໍ"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"ແອັບ ຫຼື ອົງການຂອງທ່ານບໍ່ອະນຸຍາດໃຫ້ໃຊ້ຄຳສັ່ງນີ້"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"ຍັງບໍ່ຮອງຮັບວິດເຈັດໃນຕອນນີ້, ກະລຸນາເລືອກແອັບອື່ນ"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"ຂ້າມການສອນການນຳໃຊ້ການນຳທາງບໍ?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"ທ່ານສາມາດຊອກສ່ວນນີ້ພາຍຫຼັງໄດ້ໃນແອັບ <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"ຍົກເລີກ"</string>
diff --git a/quickstep/res/values-lt/strings.xml b/quickstep/res/values-lt/strings.xml
index 511061d..0ee9848 100644
--- a/quickstep/res/values-lt/strings.xml
+++ b/quickstep/res/values-lt/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Išeiti iš išskaidyto ekrano pasirinkimo"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Išskaidyto ekrano režimą naudokite kita programa"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Jūsų organizacijoje arba naudojant šią programą neleidžiama atlikti šio veiksmo"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Valdikliai šiuo metu nepalaikomi, pasirinkite kitą programą"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Praleisti naršymo mokymo programą?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Tai galėsite rasti vėliau programoje „<xliff:g id="NAME">%1$s</xliff:g>“"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Atšaukti"</string>
diff --git a/quickstep/res/values-lv/strings.xml b/quickstep/res/values-lv/strings.xml
index faeb1a6..49b7184 100644
--- a/quickstep/res/values-lv/strings.xml
+++ b/quickstep/res/values-lv/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Izejiet no ekrāna sadalīšanas režīma atlases."</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Izvēlieties citu lietotni, lai sadalītu ekrānu"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Lietotne vai jūsu organizācija neatļauj veikt šo darbību."</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Logrīki pašlaik netiek atbalstīti. Lūdzu, atlasiet citu lietotni."</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Vai izlaist navigācijas mācības?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Varēsiet to vēlāk atrast lietotnē <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Atcelt"</string>
diff --git a/quickstep/res/values-mk/strings.xml b/quickstep/res/values-mk/strings.xml
index 56aa476..f254345 100644
--- a/quickstep/res/values-mk/strings.xml
+++ b/quickstep/res/values-mk/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Излези од изборот на поделен екран"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Изберете друга апликација за да користите поделен екран"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Апликацијата или вашата организација не го дозволува дејствово"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Виџетите не се поддржани во моментов, изберете друга апликација"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Да се прескокне упатството за навигација?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Ова може да го најдете подоцна во апликацијата <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Откажи"</string>
diff --git a/quickstep/res/values-ml/strings.xml b/quickstep/res/values-ml/strings.xml
index ccd960b..9923fde 100644
--- a/quickstep/res/values-ml/strings.xml
+++ b/quickstep/res/values-ml/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"സ്ക്രീൻ വിഭജന തിരഞ്ഞെടുപ്പിൽ നിന്ന് പുറത്തുകടക്കുക"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"സ്ക്രീൻ വിഭജന മോഡിന് മറ്റൊരു ആപ്പ് തിരഞ്ഞെടുക്കൂ"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"ഈ നടപടി എടുക്കുന്നത് ആപ്പോ നിങ്ങളുടെ സ്ഥാപനമോ അനുവദിക്കുന്നില്ല"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"വിജറ്റുകൾക്ക് നിലവിൽ പിന്തുണയില്ല, മറ്റൊരു ആപ്പ് തിരഞ്ഞെടുക്കുക"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"നാവിഗേഷൻ ട്യൂട്ടോറിയൽ ഒഴിവാക്കണോ?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"<xliff:g id="NAME">%1$s</xliff:g> ആപ്പിൽ നിങ്ങൾക്ക് ഇത് പിന്നീട് കാണാനാകും"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"റദ്ദാക്കുക"</string>
diff --git a/quickstep/res/values-mn/strings.xml b/quickstep/res/values-mn/strings.xml
index 6c2cedb..9cc47ba 100644
--- a/quickstep/res/values-mn/strings.xml
+++ b/quickstep/res/values-mn/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Дэлгэцийг хуваах сонголтоос гарах"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Дэлгэцийг хуваах горим ашиглах өөр апп сонгоно уу"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Энэ үйлдлийг апп эсвэл танай байгууллага зөвшөөрдөггүй"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Виджетүүдийг одоогоор дэмждэггүй. Өөр апп сонгоно уу"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Навигацын практик хичээлийг алгасах уу?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Та үүнийг дараа нь <xliff:g id="NAME">%1$s</xliff:g> аппаас олох боломжтой"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Цуцлах"</string>
diff --git a/quickstep/res/values-mr/strings.xml b/quickstep/res/values-mr/strings.xml
index 975c94e..728ac79 100644
--- a/quickstep/res/values-mr/strings.xml
+++ b/quickstep/res/values-mr/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"स्प्लिट स्क्रीन निवडीतून बाहेर पडा"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"स्प्लिट स्क्रीन वापरण्यासाठी दुसरे ॲप निवडा"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"अॅप किंवा तुमच्या संस्थेद्वारे ही क्रिया करण्याची अनुमती नाही"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"विजेटना सध्या सपोर्ट नाही, कृपया दुसरे अॅप निवडा"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"नेव्हिगेशन ट्यूटोरियल वगळायचे आहे का?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"तुम्हाला हे नंतर <xliff:g id="NAME">%1$s</xliff:g> ॲपमध्ये मिळेल"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"रद्द करा"</string>
diff --git a/quickstep/res/values-ms/strings.xml b/quickstep/res/values-ms/strings.xml
index 6c794c5..643898b 100644
--- a/quickstep/res/values-ms/strings.xml
+++ b/quickstep/res/values-ms/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Keluar daripada pilihan skrin pisah"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Pilih apl lain untuk menggunakan skrin pisah"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Tindakan ini tidak dibenarkan oleh apl atau organisasi anda"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Widget tidak disokong pada masa ini, sila pilih apl lain"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Langkau tutorial navigasi?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Anda boleh mendapatkan tutorial ini kemudian dalam apl <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Batal"</string>
diff --git a/quickstep/res/values-my/strings.xml b/quickstep/res/values-my/strings.xml
index 8c500a7..5e177e8 100644
--- a/quickstep/res/values-my/strings.xml
+++ b/quickstep/res/values-my/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"မျက်နှာပြင် ခွဲ၍ပြသခြင်း ရွေးချယ်မှုမှ ထွက်ရန်"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"မျက်နှာပြင်ခွဲ၍ပြသခြင်းသုံးရန် နောက်အက်ပ်တစ်ခုရွေးပါ"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"ဤလုပ်ဆောင်ချက်ကို အက်ပ် သို့မဟုတ် သင်၏အဖွဲ့အစည်းက ခွင့်မပြုပါ"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"ဝိဂျက်များကို လောလောဆယ် ပံ့ပိုးမထားပါ။ အခြားအက်ပ်ရွေးပါ"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"လမ်းညွှန်ခြင်း ရှင်းလင်းပို့ချချက်ကို ကျော်မလား။"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"၎င်းကို နောက်မှ <xliff:g id="NAME">%1$s</xliff:g> အက်ပ်တွင် ရှာနိုင်သည်"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"မလုပ်တော့"</string>
diff --git a/quickstep/res/values-nb/strings.xml b/quickstep/res/values-nb/strings.xml
index 633f2e7..b04a15c 100644
--- a/quickstep/res/values-nb/strings.xml
+++ b/quickstep/res/values-nb/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Avslutt valg av delt skjerm"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Velg en annen app for å bruke delt skjerm"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Appen eller organisasjonen din tillater ikke denne handlingen"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Moduler støttes ikke for øyeblikket – velg en annen app"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Vil du hoppe over navigeringsveiledningen?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Du kan finne dette i <xliff:g id="NAME">%1$s</xliff:g>-appen senere"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Avbryt"</string>
diff --git a/quickstep/res/values-ne/strings.xml b/quickstep/res/values-ne/strings.xml
index d4a328a..a2b7eed 100644
--- a/quickstep/res/values-ne/strings.xml
+++ b/quickstep/res/values-ne/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"स्प्लिट स्क्रिन मोडबाट बाहिरिनुहोस्"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"स्प्लिट स्क्रिन प्रयोग गर्न अर्को एप रोज्नुहोस्"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"यो एप वा तपाईंको सङ्गठनले यो कारबाही गर्ने अनुमति दिँदैन"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"हाल विजेटहरू प्रयोग गर्न मिल्दैनन् कृपया अर्को एप चयन गर्नुहोस्"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"नेभिगेसन ट्युटोरियल स्किप गर्ने हो?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"तपाईं पछि <xliff:g id="NAME">%1$s</xliff:g> नामक एपमा गई यो ट्युटोरियल भेट्टाउन सक्नुहुन्छ"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"रद्द गर्नुहोस्"</string>
diff --git a/quickstep/res/values-nl/strings.xml b/quickstep/res/values-nl/strings.xml
index b57f1f8..88155ab 100644
--- a/quickstep/res/values-nl/strings.xml
+++ b/quickstep/res/values-nl/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Sluit de selectie voor gesplitst scherm"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Kies andere app om gesplitst scherm te gebruiken"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Deze actie wordt niet toegestaan door de app of je organisatie"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Widgets worden op dit moment niet ondersteund, selecteer een andere app"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Navigatietutorial overslaan?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Je vindt dit later terug in de app <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Annuleren"</string>
diff --git a/quickstep/res/values-or/strings.xml b/quickstep/res/values-or/strings.xml
index f8a6bc0..a97bf36 100644
--- a/quickstep/res/values-or/strings.xml
+++ b/quickstep/res/values-or/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନ ଚୟନରୁ ବାହାରି ଯାଆନ୍ତୁ"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନ ବ୍ୟବହାର କରିବାକୁ ଅନ୍ୟ ଏକ ଆପ ବାଛନ୍ତୁ"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"ଆପ୍ କିମ୍ବା ଆପଣଙ୍କ ସଂସ୍ଥା ଦ୍ୱାରା ଏହି କାର୍ଯ୍ୟକୁ ଅନୁମତି ଦିଆଯାଇ ନାହିଁ"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"ୱିଜେଟଗୁଡ଼ିକ ବର୍ତ୍ତମାନ ସମର୍ଥିତ ନୁହେଁ, ଦୟାକରି ଅନ୍ୟ ଏକ ଆପ ଚୟନ କରନ୍ତୁ"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"ନାଭିଗେସନ୍ ଟ୍ୟୁଟୋରିଆଲକୁ ବାଦ୍ ଦେବେ?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"ଆପଣ ପରେ ଏହାକୁ <xliff:g id="NAME">%1$s</xliff:g> ଆପରେ ପାଇପାରିବେ"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"ବାତିଲ କରନ୍ତୁ"</string>
diff --git a/quickstep/res/values-pa/strings.xml b/quickstep/res/values-pa/strings.xml
index 4a1471e..2c71840 100644
--- a/quickstep/res/values-pa/strings.xml
+++ b/quickstep/res/values-pa/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਦੀ ਚੋਣ ਤੋਂ ਬਾਹਰ ਜਾਓ"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਵਰਤਣ ਲਈ ਕਿਸੇ ਹੋਰ ਐਪ ਨੂੰ ਚੁਣੋ"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"ਐਪ ਜਾਂ ਤੁਹਾਡੀ ਸੰਸਥਾ ਵੱਲੋਂ ਇਸ ਕਾਰਵਾਈ ਦੀ ਇਜਾਜ਼ਤ ਨਹੀਂ ਹੈ"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"ਫ਼ਿਲਹਾਲ ਵਿਜੇਟ ਸਮਰਥਿਤ ਨਹੀਂ ਹਨ, ਕਿਰਪਾ ਕਰਕੇ ਕੋਈ ਹੋਰ ਐਪ ਚੁਣੋ"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"ਕੀ ਨੈਵੀਗੇਸ਼ਨ ਟਿਊਟੋਰੀਅਲ ਨੂੰ ਛੱਡਣਾ ਹੈ?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"ਤੁਸੀਂ ਇਸਨੂੰ ਬਾਅਦ ਵਿੱਚ <xliff:g id="NAME">%1$s</xliff:g> ਐਪ ਵਿੱਚ ਲੱਭ ਸਕਦੇ ਹੋ"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"ਰੱਦ ਕਰੋ"</string>
diff --git a/quickstep/res/values-pl/strings.xml b/quickstep/res/values-pl/strings.xml
index 39e5811..22e30bc 100644
--- a/quickstep/res/values-pl/strings.xml
+++ b/quickstep/res/values-pl/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Wyjdź z wyboru podzielonego ekranu"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Wybierz drugą aplikację, aby podzielić ekran"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Nie możesz wykonać tego działania, bo nie zezwala na to aplikacja lub Twoja organizacja"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Widżety nie są obecnie obsługiwane, wybierz inną aplikację"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Pominąć samouczek nawigacji?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Znajdziesz to później w aplikacji <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Anuluj"</string>
diff --git a/quickstep/res/values-pt-rPT/strings.xml b/quickstep/res/values-pt-rPT/strings.xml
index 6144fea..d6b2ce0 100644
--- a/quickstep/res/values-pt-rPT/strings.xml
+++ b/quickstep/res/values-pt-rPT/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Saia da seleção de ecrã dividido"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Escolher outra app para usar o ecrã dividido"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Esta ação não é permitida pela app ou a sua entidade."</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Os widgets não são atualmente suportados. Selecione outra app"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Ignorar o tutorial de navegação?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Pode encontrar isto mais tarde na app <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Cancelar"</string>
diff --git a/quickstep/res/values-pt/strings.xml b/quickstep/res/values-pt/strings.xml
index c8517eb..ee2fb32 100644
--- a/quickstep/res/values-pt/strings.xml
+++ b/quickstep/res/values-pt/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Sair da seleção de tela dividida"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Escolha outro app para usar na tela dividida"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Essa ação não é permitida pelo app ou pela organização"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Atualmente, não há suporte para widgets. Selecione outro app"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Pular o tutorial de navegação?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Veja o tutorial mais tarde no app <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Cancelar"</string>
diff --git a/quickstep/res/values-ro/strings.xml b/quickstep/res/values-ro/strings.xml
index 11170cd..ce6d634 100644
--- a/quickstep/res/values-ro/strings.xml
+++ b/quickstep/res/values-ro/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Ieși din selecția cu ecran împărțit"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Alege altă aplicație pentru ecranul împărțit"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Această acțiune nu este permisă de aplicație sau de organizația ta"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Nu se acceptă widgeturile. Selectează altă aplicație."</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Omiți tutorialul de navigare?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Îl poți găsi mai târziu în aplicația <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Anulează"</string>
diff --git a/quickstep/res/values-ru/strings.xml b/quickstep/res/values-ru/strings.xml
index 70840a7..6ca658d 100644
--- a/quickstep/res/values-ru/strings.xml
+++ b/quickstep/res/values-ru/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Выйдите из режима разделения экрана."</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Выберите другое приложение для разделения экрана."</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Это действие заблокировано приложением или организацией."</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Виджеты не поддерживаются. Выберите другое приложение."</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Пропустить руководство по жестам?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Его можно найти в приложении \"<xliff:g id="NAME">%1$s</xliff:g>\"."</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Отмена"</string>
diff --git a/quickstep/res/values-si/strings.xml b/quickstep/res/values-si/strings.xml
index 683ee83..96e73f5 100644
--- a/quickstep/res/values-si/strings.xml
+++ b/quickstep/res/values-si/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"බෙදීම් තිර තේරීමෙන් පිටවන්න"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"බෙදීම් තිරය භාවිතා කිරීමට වෙනත් යෙදුමක් තෝරා ගන්න"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"මෙම ක්රියාව යෙදුම හෝ ඔබේ සංවිධානය මගින් ඉඩ නොදේ"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"විජට් දැනට සහාය නොදක්වයි, වෙනත් යෙදුමක් තෝරන්න"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"නිබන්ධනය සංචාලනය මඟ හරින්නද?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"ඔබට මෙය පසුව <xliff:g id="NAME">%1$s</xliff:g> යෙදුම තුළ සොයා ගත හැකිය"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"අවලංගු කරන්න"</string>
diff --git a/quickstep/res/values-sk/strings.xml b/quickstep/res/values-sk/strings.xml
index f38e80d..2bdbf59 100644
--- a/quickstep/res/values-sk/strings.xml
+++ b/quickstep/res/values-sk/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Ukončite výber rozdelenej obrazovky"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Na použitie rozd. obrazovky vyberte inú aplikáciu"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Aplikácia alebo vaša organizácia túto akciu nepovoľuje"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Miniaplikácie nie sú momentálne podporované, vyberte inú aplikáciu"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Chcete preskočiť návod na navigáciu?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Tento návod nájdete v aplikácii <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Zrušiť"</string>
diff --git a/quickstep/res/values-sl/strings.xml b/quickstep/res/values-sl/strings.xml
index bdb60fe..ec0d085 100644
--- a/quickstep/res/values-sl/strings.xml
+++ b/quickstep/res/values-sl/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Zapri izbiro razdeljenega zaslona"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Izberite drugo aplikacijo za uporabo razdeljenega zaslona."</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Aplikacija ali vaša organizacija ne dovoljuje tega dejanja"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Pripomočki trenutno niso podprti, izberite drugo aplikacijo"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Želite preskočiti vadnico za krmarjenje?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"To lahko pozneje najdete v aplikaciji <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Prekliči"</string>
diff --git a/quickstep/res/values-sq/strings.xml b/quickstep/res/values-sq/strings.xml
index 4990d02..b0ae56e 100644
--- a/quickstep/res/values-sq/strings.xml
+++ b/quickstep/res/values-sq/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Dil nga zgjedhja e ekranit të ndarë"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Zgjidh një aplikacion tjetër për të përdorur ekranin e ndarë"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Ky veprim nuk lejohet nga aplikacioni ose organizata jote"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Miniaplikacionet nuk mbështeten për momentin. Zgjidh një aplikacion tjetër"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Të kapërcehet udhëzuesi i navigimit?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Këtë mund ta gjesh më vonë tek aplikacioni \"<xliff:g id="NAME">%1$s</xliff:g>\""</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Anulo"</string>
diff --git a/quickstep/res/values-sr/strings.xml b/quickstep/res/values-sr/strings.xml
index 110b1be..8084cb5 100644
--- a/quickstep/res/values-sr/strings.xml
+++ b/quickstep/res/values-sr/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Излазак из бирања подељеног екрана"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Одаберите другу апликацију за подељени екран"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Апликација или организација не дозвољавају ову радњу"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Виџети тренутно нису подржани. Изаберите другу апликацију"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Желите да прескочите водич за кретање?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Можете да пронађете ово касније у апликацији <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Откажи"</string>
diff --git a/quickstep/res/values-sv/strings.xml b/quickstep/res/values-sv/strings.xml
index 37fd647..42b7cd5 100644
--- a/quickstep/res/values-sv/strings.xml
+++ b/quickstep/res/values-sv/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Avsluta val av delad skärm"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Välj en annan app för att använda delad skärm"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Appen eller organisationen tillåter inte den här åtgärden"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Widgetar stöds för närvarande inte. Välj en annan app"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Vill du hoppa över självstudierna?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Du hittar det här igen i <xliff:g id="NAME">%1$s</xliff:g>-appen"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Avbryt"</string>
diff --git a/quickstep/res/values-sw/strings.xml b/quickstep/res/values-sw/strings.xml
index 3d63858..03a05de 100644
--- a/quickstep/res/values-sw/strings.xml
+++ b/quickstep/res/values-sw/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Ondoka kwenye hali ya skrini iliyogawanywa"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Chagua programu nyingine ili utumie hali ya kugawa skrini"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Kitendo hiki hakiruhusiwi na programu au shirika lako"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Wijeti hazitumiwi kwa sasa, tafadhali chagua programu nyingine"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Ungependa kuruka mafunzo ya usogezaji?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Utapata mafunzo haya baadaye katika programu ya <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Ghairi"</string>
diff --git a/quickstep/res/values-ta/strings.xml b/quickstep/res/values-ta/strings.xml
index a967d5e..882202f 100644
--- a/quickstep/res/values-ta/strings.xml
+++ b/quickstep/res/values-ta/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"திரைப் பிரிப்பு தேர்வில் இருந்து வெளியேறும்"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"திரைப் பிரிப்பை பயன்படுத்த வேறு ஆப்ஸை தேர்வுசெய்க"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"ஆப்ஸோ உங்கள் நிறுவனமோ இந்த செயலை அனுமதிப்பதில்லை"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"விட்ஜெட்கள் தற்போது ஆதரிக்கப்படவில்லை, வேறு ஆப்ஸைத் தேர்ந்தெடுக்கவும்"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"வழிகாட்டுதல் பயிற்சியைத் தவிர்க்கவா?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"<xliff:g id="NAME">%1$s</xliff:g> ஆப்ஸில் பிறகு இதைக் கண்டறியலாம்"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"ரத்துசெய்"</string>
diff --git a/quickstep/res/values-te/strings.xml b/quickstep/res/values-te/strings.xml
index 72eaccf..e15ce71 100644
--- a/quickstep/res/values-te/strings.xml
+++ b/quickstep/res/values-te/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"స్ప్లిట్ స్క్రీన్ ఎంపిక నుండి ఎగ్జిట్ అవ్వండి"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"స్ప్లిట్ స్క్రీన్ ఉపయోగానికి మరొక యాప్ ఎంచుకోండి"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"ఈ చర్యను యాప్ గానీ, మీ సంస్థ గానీ అనుమతించవు"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"విడ్జెట్లకు ప్రస్తుతం సపోర్ట్ లేదు, దయచేసి మరొక యాప్ను ఎంచుకోండి"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"నావిగేషన్ ట్యుటోరియల్ను స్కిప్ చేయాలా?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"<xliff:g id="NAME">%1$s</xliff:g> యాప్లో మీరు తర్వాత కనుగొనవచ్చు"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"రద్దు చేయండి"</string>
diff --git a/quickstep/res/values-th/strings.xml b/quickstep/res/values-th/strings.xml
index 6da112c..70b6d5c 100644
--- a/quickstep/res/values-th/strings.xml
+++ b/quickstep/res/values-th/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"ออกจากการเลือกโหมดแยกหน้าจอ"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"เลือกแอปอื่นเพื่อใช้การแยกหน้าจอ"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"แอปหรือองค์กรของคุณไม่อนุญาตการดำเนินการนี้"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"ยังไม่รองรับวิดเจ็ตในขณะนี้ โปรดเลือกแอปอื่น"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"ข้ามบทแนะนำการนำทางไหม"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"คุณดูบทแนะนำนี้ได้ภายหลังในแอป \"<xliff:g id="NAME">%1$s</xliff:g>\""</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"ยกเลิก"</string>
diff --git a/quickstep/res/values-tl/strings.xml b/quickstep/res/values-tl/strings.xml
index dc555e8..8e8e069 100644
--- a/quickstep/res/values-tl/strings.xml
+++ b/quickstep/res/values-tl/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Lumabas sa pagpili ng split screen"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Pumili ng ibang app para gamitin ang split screen"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Hindi pinapayagan ng app o ng iyong organisasyon ang pagkilos na ito"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Kasalukuyang hindi sinusuportahan ang mga widget, pumili ng ibang app"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Laktawan ang tutorial sa pag-navigate?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Makikita mo ito sa <xliff:g id="NAME">%1$s</xliff:g> app sa ibang pagkakataon"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Kanselahin"</string>
diff --git a/quickstep/res/values-tr/strings.xml b/quickstep/res/values-tr/strings.xml
index bbe14de..eb6c48c 100644
--- a/quickstep/res/values-tr/strings.xml
+++ b/quickstep/res/values-tr/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Bölünmüş ekran seçiminden çıkın"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Bölünmüş ekran kullanmak için başka bir uygulama seçin"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Uygulamanız veya kuruluşunuz bu işleme izin vermiyor"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Widget\'lar şu anda desteklenmiyor. Lütfen başka bir uygulama seçin"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Gezinme eğitimi atlansın mı?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Bunu daha sonra <xliff:g id="NAME">%1$s</xliff:g> uygulamasında bulabilirsiniz"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"İptal"</string>
diff --git a/quickstep/res/values-uk/strings.xml b/quickstep/res/values-uk/strings.xml
index 965b0d9..7139e71 100644
--- a/quickstep/res/values-uk/strings.xml
+++ b/quickstep/res/values-uk/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Вийти з режиму розділення екрана"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Щоб розділити екран, виберіть ще один додаток"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Ця дія заборонена додатком або адміністратором організації"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Віджети наразі не підтримуються. Виберіть інший додаток."</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Пропустити посібник із навігації?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Ви знайдете його пізніше в додатку <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Скасувати"</string>
diff --git a/quickstep/res/values-ur/strings.xml b/quickstep/res/values-ur/strings.xml
index 331096e..1026322 100644
--- a/quickstep/res/values-ur/strings.xml
+++ b/quickstep/res/values-ur/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"اسپلٹ اسکرین کے انتخاب سے باہر نکلیں"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"اسپلٹ اسکرین کے استعمال کیلئے دوسری ایپ منتخب کریں"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"ایپ یا آپ کی تنظیم کی جانب سے اس کارروائی کی اجازت نہیں ہے"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"وجیٹس فی الحال تعاون یافتہ نہیں ہیں، براہ کرم کوئی اور ایپ منتخب کریں"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"نیویگیشن کا ٹیوٹوریل نظر انداز کریں؟"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"آپ اسے بعد میں <xliff:g id="NAME">%1$s</xliff:g> ایپ میں تلاش کر سکتے ہیں"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"منسوخ کریں"</string>
diff --git a/quickstep/res/values-uz/strings.xml b/quickstep/res/values-uz/strings.xml
index c66f9ba..518e532 100644
--- a/quickstep/res/values-uz/strings.xml
+++ b/quickstep/res/values-uz/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Ekranni ikkiga ajratish tanlovidan chiqish"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Ekranni ikkiga ajratish uchun boshqa ilovani tanlang"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Bu amal ilova yoki tashkilotingiz tomonidan taqiqlangan"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Vidjetlar ishlamaydi. Boshqa ilovani tanlang"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Navigatsiya darsi yopilsinmi?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Bu darslar <xliff:g id="NAME">%1$s</xliff:g> ilovasida chiqadi"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Bekor qilish"</string>
diff --git a/quickstep/res/values-vi/strings.xml b/quickstep/res/values-vi/strings.xml
index c2c1c00..f6946c9 100644
--- a/quickstep/res/values-vi/strings.xml
+++ b/quickstep/res/values-vi/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Thoát khỏi lựa chọn chia đôi màn hình"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Chọn một ứng dụng khác để dùng chế độ chia đôi màn hình"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Ứng dụng hoặc tổ chức của bạn không cho phép thực hiện hành động này"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Các tiện ích hiện không được hỗ trợ, vui lòng chọn một ứng dụng khác"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Bỏ qua phần hướng dẫn thao tác?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Bạn có thể tìm lại phần hướng dẫn này trong ứng dụng <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Hủy"</string>
diff --git a/quickstep/res/values-zh-rCN/strings.xml b/quickstep/res/values-zh-rCN/strings.xml
index c46f03f..097602f 100644
--- a/quickstep/res/values-zh-rCN/strings.xml
+++ b/quickstep/res/values-zh-rCN/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"退出分屏选择模式"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"另外选择一个应用才可使用分屏模式"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"该应用或您所在的单位不允许执行此操作"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"目前不支持微件,请选择其他应用"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"要跳过导航教程吗?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"您之后可以在“<xliff:g id="NAME">%1$s</xliff:g>”应用中找到此教程"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"取消"</string>
diff --git a/quickstep/res/values-zh-rHK/strings.xml b/quickstep/res/values-zh-rHK/strings.xml
index b350d0f..badbf06 100644
--- a/quickstep/res/values-zh-rHK/strings.xml
+++ b/quickstep/res/values-zh-rHK/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"退出分割螢幕選取頁面"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"選擇其他應用程式才能使用分割螢幕"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"應用程式或你的機構不允許此操作"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"目前不支援小工具,請選取其他應用程式"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"要略過手勢操作教學課程嗎?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"你之後可以在「<xliff:g id="NAME">%1$s</xliff:g>」應用程式找到這些說明"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"取消"</string>
diff --git a/quickstep/res/values-zh-rTW/strings.xml b/quickstep/res/values-zh-rTW/strings.xml
index a114f81..eb40152 100644
--- a/quickstep/res/values-zh-rTW/strings.xml
+++ b/quickstep/res/values-zh-rTW/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"退出分割畫面選擇器"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"必須選擇另一個應用程式才能使用分割畫面"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"這個應用程式或貴機構不允許執行這個動作"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"目前不支援小工具,請選取其他應用程式"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"要略過手勢操作教學課程嗎?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"你之後可以在「<xliff:g id="NAME">%1$s</xliff:g>」應用程式找到這些說明"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"取消"</string>
diff --git a/quickstep/res/values-zu/strings.xml b/quickstep/res/values-zu/strings.xml
index 8d19724..8397470 100644
--- a/quickstep/res/values-zu/strings.xml
+++ b/quickstep/res/values-zu/strings.xml
@@ -98,8 +98,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Phuma ekukhetheni ukuhlukaniswa kwesikrini"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Khetha enye i-app ukuze usebenzise ukuhlukanisa isikrini"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Lesi senzo asivunyelwanga uhlelo lokusebenza noma inhlangano yakho"</string>
- <!-- no translation found for split_widgets_not_supported (1355743038053053866) -->
- <skip />
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Amawijethi awasekelwe okwamanje, sicela ukhethe enye i-app"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Yeqa isifundo sokuzulazula?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Lokhu ungakuthola kamuva ku-app ye-<xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Khansela"</string>
diff --git a/quickstep/res/values/dimens.xml b/quickstep/res/values/dimens.xml
index 13a9fff..4867eba 100644
--- a/quickstep/res/values/dimens.xml
+++ b/quickstep/res/values/dimens.xml
@@ -55,7 +55,7 @@
<!-- The max width of the icon menu text -->
<dimen name="task_thumbnail_icon_menu_text_max_width">118dp</dimen>
<!-- The size of the icon menu text -->
- <dimen name="task_thumbnail_icon_menu_text_size">16sp</dimen>
+ <dimen name="task_thumbnail_icon_menu_text_size">14sp</dimen>
<!-- The max width of the thumbnail icon menu background -->
<dimen name="task_thumbnail_icon_menu_background_max_width">164dp</dimen>
<!-- The height of the thumbnail icon menu -->
@@ -73,9 +73,9 @@
<!-- The margin at the start of the task icon menu -->
<dimen name="task_thumbnail_icon_menu_start_margin">12dp</dimen>
<!-- The margin at the top of the task icon menu -->
- <dimen name="task_thumbnail_icon_menu_top_margin">6dp</dimen>
- <!-- The margin at the top of the task icon menu when expanded -->
- <dimen name="task_thumbnail_icon_menu_top_margin_expanded">4dp</dimen>
+ <dimen name="task_thumbnail_icon_menu_top_margin">12dp</dimen>
+ <!-- The gap at the top of the task icon menu when expanded -->
+ <dimen name="task_thumbnail_icon_menu_expanded_gap">6dp</dimen>
<!-- The margin at the start of the task icon view in the icon menu -->
<dimen name="task_thumbnail_icon_view_start_margin">6dp</dimen>
<!-- The space around the task icon arrow within the icon menu -->
@@ -88,7 +88,7 @@
<dimen name="task_thumbnail_icon_menu_drawable_max_size">32dp</dimen>
<!-- The size of the icon menu's icon touch target -->
<dimen name="task_thumbnail_icon_menu_drawable_touch_size">44dp</dimen>
- <dimen name="task_thumbnail_icon_menu_elevation">14dp</dimen>
+ <dimen name="task_thumbnail_icon_menu_elevation">4dp</dimen>
<dimen name="task_icon_cache_default_icon_size">72dp</dimen>
<item name="overview_modal_max_scale" format="float" type="dimen">1.1</item>
diff --git a/quickstep/res/values/strings.xml b/quickstep/res/values/strings.xml
index 3dade66..077b233 100644
--- a/quickstep/res/values/strings.xml
+++ b/quickstep/res/values/strings.xml
@@ -230,6 +230,7 @@
<string name="action_split">Split</string>
<!-- Label for toast with instructions for split screen selection mode. [CHAR_LIMIT=50] -->
<string name="toast_split_select_app">Tap another app to use split screen</string>
+ <string name="toast_split_select_app_cancel"><b>Cancel</b></string>
<string name="toast_split_select_cont_desc">Exit split screen selection</string>
<!-- Label for toast when app selected for split isn't supported. [CHAR_LIMIT=50] -->
<string name="toast_split_app_unsupported">Choose another app to use split screen</string>
diff --git a/quickstep/res/values/styles.xml b/quickstep/res/values/styles.xml
index fc03704..ae62c26 100644
--- a/quickstep/res/values/styles.xml
+++ b/quickstep/res/values/styles.xml
@@ -303,4 +303,12 @@
<item name="arrowTipBackground">?androidprv:attr/materialColorSurfaceContainer</item>
<item name="arrowTipTextColor">?androidprv:attr/materialColorOnSurface</item>
</style>
+
+ <style name="IconAppChipMenuTextStyle">
+ <item name="android:fontFamily">google-sans-text-medium</item>
+ <item name="android:textSize">@dimen/task_thumbnail_icon_menu_text_size</item>
+ <item name="android:textColor">?androidprv:attr/materialColorOnSurface</item>
+ <item name="android:letterSpacing">0.025</item>
+ <item name="android:lineHeight">20sp</item>
+ </style>
</resources>
diff --git a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java
index e77d2c6..d6ab54e 100644
--- a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java
+++ b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java
@@ -239,7 +239,7 @@
|| Global.getFloat(mLauncher.getContentResolver(),
Global.TRANSITION_ANIMATION_SCALE, 1f) > 0;
}
- };;
+ };
private DeviceProfile mDeviceProfile;
@@ -329,7 +329,7 @@
ItemInfo tag = (ItemInfo) v.getTag();
if (tag != null && tag.shouldUseBackgroundAnimation()) {
ContainerAnimationRunner containerAnimationRunner = ContainerAnimationRunner.from(
- v, mLauncher, mStartingWindowListener, onEndCallback);
+ v, mLauncher, mStartingWindowListener, onEndCallback);
if (containerAnimationRunner != null) {
mAppLaunchRunner = containerAnimationRunner;
}
@@ -491,9 +491,9 @@
/**
* Content is everything on screen except the background and the floating view (if any).
*
- * @param isAppOpening True when this is called when an app is opening.
- * False when this is called when an app is closing.
- * @param startDelay Start delay duration.
+ * @param isAppOpening True when this is called when an app is opening.
+ * False when this is called when an app is closing.
+ * @param startDelay Start delay duration.
* @param skipAllAppsScale True if we want to avoid scaling All Apps
*/
private Pair<AnimatorSet, Runnable> getLauncherContentAnimator(boolean isAppOpening,
@@ -1060,7 +1060,7 @@
LaunchDepthController depthController = new LaunchDepthController(mLauncher);
ObjectAnimator backgroundRadiusAnim = ObjectAnimator.ofFloat(depthController.stateDepth,
MULTI_PROPERTY_VALUE, BACKGROUND_APP.getDepth(mLauncher))
- .setDuration(APP_LAUNCH_DURATION);
+ .setDuration(APP_LAUNCH_DURATION);
if (allowBlurringLauncher) {
// Create a temporary effect layer, that lives on top of launcher, so we can apply
@@ -1309,7 +1309,7 @@
return null;
}
- final ComponentName[] taskInfoActivities = new ComponentName[] {
+ final ComponentName[] taskInfoActivities = new ComponentName[]{
runningTaskTarget.taskInfo.baseActivity,
runningTaskTarget.taskInfo.origActivity,
runningTaskTarget.taskInfo.realActivity,
@@ -1355,7 +1355,7 @@
.getPrimaryValue(dp.availableWidthPx, dp.availableHeightPx);
float secondaryDimension = orientationHandler
.getSecondaryValue(dp.availableWidthPx, dp.availableHeightPx);
- final float targetX = primaryDimension / 2f;
+ final float targetX = primaryDimension / 2f;
final float targetY = secondaryDimension - dp.hotseatBarSizePx;
return new RectF(targetX - halfIconSize, targetY - halfIconSize,
targetX + halfIconSize, targetY + halfIconSize);
@@ -1366,7 +1366,7 @@
*/
protected RectFSpringAnim getClosingWindowAnimators(AnimatorSet animation,
RemoteAnimationTarget[] targets, View launcherView, PointF velocityPxPerS,
- RectF closingWindowStartRect, float startWindowCornerRadius) {
+ RectF closingWindowStartRectF, float startWindowCornerRadius) {
FloatingIconView floatingIconView = null;
FloatingWidgetView floatingWidget = null;
RectF targetRect = new RectF();
@@ -1406,14 +1406,16 @@
boolean useTaskbarHotseatParams = mDeviceProfile.isTaskbarPresent && isInHotseat;
RectFSpringAnim anim = new RectFSpringAnim(useTaskbarHotseatParams
- ? new TaskbarHotseatSpringConfig(mLauncher, closingWindowStartRect, targetRect)
- : new DefaultSpringConfig(mLauncher, mDeviceProfile, closingWindowStartRect,
+ ? new TaskbarHotseatSpringConfig(mLauncher, closingWindowStartRectF, targetRect)
+ : new DefaultSpringConfig(mLauncher, mDeviceProfile, closingWindowStartRectF,
targetRect));
// Hook up floating views to the closing window animators.
// note the coordinate of closingWindowStartRect is based on launcher
- Rect windowTargetBounds = new Rect();
- closingWindowStartRect.round(windowTargetBounds);
+ Rect closingWindowStartRect = new Rect();
+ closingWindowStartRectF.round(closingWindowStartRect);
+ Rect closingWindowOriginalRect =
+ new Rect(0, 0, mDeviceProfile.widthPx, mDeviceProfile.heightPx);
if (floatingIconView != null) {
anim.addAnimatorListener(floatingIconView);
floatingIconView.setOnTargetChangeListener(anim::onTargetPositionChanged);
@@ -1425,7 +1427,7 @@
final float windowAlphaThreshold = 1f - SHAPE_PROGRESS_DURATION;
RectFSpringAnim.OnUpdateListener runner = new SpringAnimRunner(targets, targetRect,
- windowTargetBounds, startWindowCornerRadius) {
+ closingWindowStartRect, closingWindowOriginalRect, startWindowCornerRadius) {
@Override
public void onUpdate(RectF currentRectF, float progress) {
finalFloatingIconView.update(1f, currentRectF, progress, windowAlphaThreshold,
@@ -1443,7 +1445,7 @@
final float floatingWidgetAlpha = isTransluscent ? 0 : 1;
FloatingWidgetView finalFloatingWidget = floatingWidget;
RectFSpringAnim.OnUpdateListener runner = new SpringAnimRunner(targets, targetRect,
- windowTargetBounds, startWindowCornerRadius) {
+ closingWindowStartRect, closingWindowOriginalRect, startWindowCornerRadius) {
@Override
public void onUpdate(RectF currentRectF, float progress) {
final float fallbackBackgroundAlpha =
@@ -1461,7 +1463,8 @@
// If no floating icon or widget is present, animate the to the default window
// target rect.
anim.addOnUpdateListener(new SpringAnimRunner(
- targets, targetRect, windowTargetBounds, startWindowCornerRadius));
+ targets, targetRect, closingWindowStartRect, closingWindowOriginalRect,
+ startWindowCornerRadius));
}
// Use a fixed velocity to start the animation.
@@ -1647,7 +1650,7 @@
// is initialized.
if (launcherIsForceInvisibleOrOpening) {
addCujInstrumentation(anim, playFallBackAnimation
- ? CUJ_APP_CLOSE_TO_HOME_FALLBACK : CUJ_APP_CLOSE_TO_HOME);
+ ? CUJ_APP_CLOSE_TO_HOME_FALLBACK : CUJ_APP_CLOSE_TO_HOME);
// Only register the content animation for cancellation when state changes
mLauncher.getStateManager().setCurrentAnimation(anim);
@@ -1961,6 +1964,7 @@
/**
* Transfer the rectangle to another coordinate if needed.
+ *
* @param toLauncher which one is the anchor of this transfer, if true then transfer from
* animation target to launcher, false transfer from launcher to animation
* target.
@@ -2016,27 +2020,45 @@
private final float mStartRadius;
private final float mEndRadius;
private final SurfaceTransactionApplier mSurfaceApplier;
- private final Rect mWindowTargetBounds = new Rect();
+ private final Rect mWindowStartBounds = new Rect();
+ private final Rect mWindowOriginalBounds = new Rect();
private final Rect mTmpRect = new Rect();
+ /**
+ * Constructor for SpringAnimRunner
+ *
+ * @param appTargets the list of opening/closing apps
+ * @param targetRect target rectangle
+ * @param closingWindowStartRect start position of the window when the spring animation
+ * is started. In the predictive back to home case this
+ * will be smaller than closingWindowOriginalRect because
+ * the window is already scaled by the user gesture
+ * @param closingWindowOriginalRect Original unscaled window rect
+ * @param startWindowCornerRadius corner radius of window at the start position
+ */
SpringAnimRunner(RemoteAnimationTarget[] appTargets, RectF targetRect,
- Rect windowTargetBounds, float startWindowCornerRadius) {
+ Rect closingWindowStartRect, Rect closingWindowOriginalRect,
+ float startWindowCornerRadius) {
mAppTargets = appTargets;
mStartRadius = startWindowCornerRadius;
mEndRadius = Math.max(1, targetRect.width()) / 2f;
mSurfaceApplier = new SurfaceTransactionApplier(mDragLayer);
- mWindowTargetBounds.set(windowTargetBounds);
+ mWindowStartBounds.set(closingWindowStartRect);
+ mWindowOriginalBounds.set(closingWindowOriginalRect);
// transfer the coordinate based on animation target.
if (mAppTargets != null) {
for (RemoteAnimationTarget t : mAppTargets) {
if (t.mode == MODE_CLOSING) {
- final RectF targetBounds = new RectF(mWindowTargetBounds);
+ final RectF transferRect = new RectF(mWindowStartBounds);
final RectF result = new RectF();
- transferRectToTargetCoordinate(
- t, targetBounds, false, result);
- result.round(mWindowTargetBounds);
+ transferRectToTargetCoordinate(t, transferRect, false, result);
+ result.round(mWindowStartBounds);
+
+ transferRect.set(closingWindowOriginalRect);
+ transferRectToTargetCoordinate(t, transferRect, false, result);
+ result.round(mWindowOriginalBounds);
break;
}
}
@@ -2061,7 +2083,6 @@
}
if (target.mode == MODE_CLOSING) {
- final RectF before = new RectF(currentRectF);
transferRectToTargetCoordinate(target, currentRectF, false, currentRectF);
currentRectF.round(mCurrentRect);
@@ -2069,20 +2090,21 @@
final float scale;
// We need to infer the crop (we crop the window to match the currentRectF).
- if (mWindowTargetBounds.height() > mWindowTargetBounds.width()) {
- scale = Math.min(1f, currentRectF.width() / mWindowTargetBounds.width());
+ if (mWindowStartBounds.height() > mWindowStartBounds.width()) {
+ scale = Math.min(1f, currentRectF.width() / mWindowOriginalBounds.width());
int unscaledHeight = (int) (mCurrentRect.height() * (1f / scale));
- int croppedHeight = mWindowTargetBounds.height() - unscaledHeight;
- mTmpRect.set(0, 0, mWindowTargetBounds.width(),
- mWindowTargetBounds.height() - croppedHeight);
+ int croppedHeight = mWindowStartBounds.height() - unscaledHeight;
+ mTmpRect.set(0, 0, mWindowOriginalBounds.width(),
+ mWindowStartBounds.height() - croppedHeight);
} else {
- scale = Math.min(1f, currentRectF.height() / mWindowTargetBounds.height());
+ scale = Math.min(1f, currentRectF.height()
+ / mWindowOriginalBounds.height());
int unscaledWidth = (int) (mCurrentRect.width() * (1f / scale));
- int croppedWidth = mWindowTargetBounds.width() - unscaledWidth;
- mTmpRect.set(0, 0, mWindowTargetBounds.width() - croppedWidth,
- mWindowTargetBounds.height());
+ int croppedWidth = mWindowStartBounds.width() - unscaledWidth;
+ mTmpRect.set(0, 0, mWindowStartBounds.width() - croppedWidth,
+ mWindowOriginalBounds.height());
}
// Match size and position of currentRect.
diff --git a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java
index 0ef4541..3514447 100644
--- a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java
@@ -26,6 +26,7 @@
import static com.android.launcher3.config.FeatureFlags.ENABLE_TASKBAR_NAVBAR_UNIFICATION;
import static com.android.launcher3.taskbar.LauncherTaskbarUIController.SYSUI_SURFACE_PROGRESS_INDEX;
import static com.android.launcher3.taskbar.TaskbarManager.isPhoneButtonNavMode;
+import static com.android.launcher3.taskbar.TaskbarManager.isPhoneMode;
import static com.android.launcher3.taskbar.TaskbarNavButtonController.BUTTON_A11Y;
import static com.android.launcher3.taskbar.TaskbarNavButtonController.BUTTON_BACK;
import static com.android.launcher3.taskbar.TaskbarNavButtonController.BUTTON_HOME;
@@ -380,10 +381,12 @@
int navButtonSize = mContext.getResources().getDimensionPixelSize(
R.dimen.taskbar_nav_buttons_size);
boolean isRtl = Utilities.isRtl(mContext.getResources());
- mPropertyHolders.add(new StatePropertyHolder(
- mBackButton, flags -> (flags & FLAG_ONLY_BACK_FOR_BOUNCER_VISIBLE) != 0
- || (flags & FLAG_KEYGUARD_VISIBLE) != 0,
- VIEW_TRANSLATE_X, navButtonSize * (isRtl ? -2 : 2), 0));
+ if (!isPhoneMode(mContext.getDeviceProfile())) {
+ mPropertyHolders.add(new StatePropertyHolder(
+ mBackButton, flags -> (flags & FLAG_ONLY_BACK_FOR_BOUNCER_VISIBLE) != 0
+ || (flags & FLAG_KEYGUARD_VISIBLE) != 0,
+ VIEW_TRANSLATE_X, navButtonSize * (isRtl ? -2 : 2), 0));
+ }
// home button
mHomeButton = addButton(R.drawable.ic_sysbar_home, BUTTON_HOME, navContainer,
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarEduTooltipController.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarEduTooltipController.kt
index d29f8ea..ea3411b 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarEduTooltipController.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarEduTooltipController.kt
@@ -251,5 +251,5 @@
return
}
- LottieAnimationColorUtils.updateColors(this, DARK_TO_LIGHT_COLORS, context.theme)
+ LottieAnimationColorUtils.updateToColorResources(this, DARK_TO_LIGHT_COLORS, context.theme)
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayDragLayer.java b/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayDragLayer.java
index e742a3d..432d272 100644
--- a/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayDragLayer.java
+++ b/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayDragLayer.java
@@ -118,6 +118,15 @@
topView.onBackInvoked();
return true;
}
+ } else if (event.getAction() == KeyEvent.ACTION_DOWN
+ && event.getKeyCode() == KeyEvent.KEYCODE_ESCAPE && event.hasNoModifiers()) {
+ // Ignore escape if pressed in conjunction with any modifier keys. Close each
+ // floating view one at a time for each key press.
+ AbstractFloatingView topView = AbstractFloatingView.getTopOpenView(mActivity);
+ if (topView != null) {
+ topView.close(/* animate= */ true);
+ return true;
+ }
}
return super.dispatchKeyEvent(event);
}
diff --git a/quickstep/src/com/android/launcher3/uioverrides/PredictedAppIcon.java b/quickstep/src/com/android/launcher3/uioverrides/PredictedAppIcon.java
index 2064fe2..110ca16 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/PredictedAppIcon.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/PredictedAppIcon.java
@@ -44,13 +44,13 @@
import androidx.core.graphics.ColorUtils;
-import com.android.launcher3.CellLayout;
import com.android.launcher3.DeviceProfile;
import com.android.launcher3.Launcher;
import com.android.launcher3.LauncherSettings;
import com.android.launcher3.R;
import com.android.launcher3.anim.AnimatorListeners;
import com.android.launcher3.celllayout.CellLayoutLayoutParams;
+import com.android.launcher3.celllayout.DelegatedCellDrawing;
import com.android.launcher3.icons.BitmapInfo;
import com.android.launcher3.icons.GraphicsUtils;
import com.android.launcher3.icons.IconNormalizer;
@@ -418,7 +418,7 @@
/**
* Draws Predicted Icon outline on cell layout
*/
- public static class PredictedIconOutlineDrawing extends CellLayout.DelegatedCellDrawing {
+ public static class PredictedIconOutlineDrawing extends DelegatedCellDrawing {
private final PredictedAppIcon mIcon;
private final Paint mOutlinePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
index 165ed80..5b0c8c3 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
@@ -480,7 +480,11 @@
@Override
public void onDestroy() {
- mAppTransitionManager.onActivityDestroyed();
+ if (mAppTransitionManager != null) {
+ mAppTransitionManager.onActivityDestroyed();
+ }
+ mAppTransitionManager = null;
+
if (mUnfoldTransitionProgressProvider != null) {
SystemUiProxy.INSTANCE.get(this).setUnfoldAnimationListener(null);
mUnfoldTransitionProgressProvider.destroy();
diff --git a/quickstep/src/com/android/launcher3/uioverrides/states/QuickstepAtomicAnimationFactory.java b/quickstep/src/com/android/launcher3/uioverrides/states/QuickstepAtomicAnimationFactory.java
index e7b285a..6651c73 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/states/QuickstepAtomicAnimationFactory.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/states/QuickstepAtomicAnimationFactory.java
@@ -55,12 +55,14 @@
import static com.android.quickstep.views.RecentsView.RECENTS_SCALE_PROPERTY;
import android.animation.ValueAnimator;
+import android.util.Log;
import com.android.launcher3.CellLayout;
import com.android.launcher3.Hotseat;
import com.android.launcher3.LauncherState;
import com.android.launcher3.Workspace;
import com.android.launcher3.states.StateAnimationConfig;
+import com.android.launcher3.testing.shared.TestProtocol;
import com.android.launcher3.touch.AllAppsSwipeController;
import com.android.launcher3.uioverrides.QuickstepLauncher;
import com.android.launcher3.util.DisplayController;
@@ -94,6 +96,8 @@
@Override
public void prepareForAtomicAnimation(LauncherState fromState, LauncherState toState,
StateAnimationConfig config) {
+ Log.d(TestProtocol.OVERVIEW_OVER_HOME, "creating animation fromState: "
+ + fromState + " toState: " + toState);
RecentsView overview = mActivity.getOverviewPanel();
if ((fromState == OVERVIEW || fromState == OVERVIEW_SPLIT_SELECT) && toState == NORMAL) {
overview.switchToScreenshot(() ->
diff --git a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
index 8313e09..d7ff59e 100644
--- a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
+++ b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
@@ -855,7 +855,9 @@
if (windowInsets.isVisible(WindowInsets.Type.ime())) {
return result;
}
- buildAnimationController();
+ if (mGestureState.getEndTarget() == null) {
+ buildAnimationController();
+ }
// Reapply the current shift to ensure it takes new insets into account, e.g. when long
// pressing to stash taskbar without moving the finger.
onCurrentShiftUpdated();
@@ -1223,12 +1225,12 @@
: null;
ActiveGestureLog.INSTANCE.addLog(
new ActiveGestureLog.CompoundString("calculateEndTarget: velocities=(x=")
- .append(Float.toString(dpiFromPx(velocityPxPerMs.x)))
+ .append(dpiFromPx(velocityPxPerMs.x))
.append("dp/ms, y=")
- .append(Float.toString(dpiFromPx(velocityPxPerMs.y)))
+ .append(dpiFromPx(velocityPxPerMs.y))
.append("dp/ms), angle=")
- .append(Double.toString(Math.toDegrees(Math.atan2(
- -velocityPxPerMs.y, velocityPxPerMs.x)))), gestureEvent);
+ .append(Math.toDegrees(Math.atan2(
+ -velocityPxPerMs.y, velocityPxPerMs.x))), gestureEvent);
if (mGestureState.isHandlingAtomicEvent()) {
// Button mode, this is only used to go to recents.
diff --git a/quickstep/src/com/android/quickstep/LauncherBackAnimationController.java b/quickstep/src/com/android/quickstep/LauncherBackAnimationController.java
index 406e9f4..27b3126 100644
--- a/quickstep/src/com/android/quickstep/LauncherBackAnimationController.java
+++ b/quickstep/src/com/android/quickstep/LauncherBackAnimationController.java
@@ -487,10 +487,14 @@
tryFinishBackAnimation();
}
});
+ if (mScrimLayer == null) {
+ // Scrim hasn't been attached yet. Let's attach it.
+ addScrimLayer();
+ }
mScrimAlphaAnimator = new ValueAnimator().ofFloat(1, 0);
mScrimAlphaAnimator.addUpdateListener(animation -> {
float value = (Float) animation.getAnimatedValue();
- if (mScrimLayer.isValid()) {
+ if (mScrimLayer != null && mScrimLayer.isValid()) {
mTransaction.setAlpha(mScrimLayer, value * mScrimAlpha);
mTransaction.apply();
}
diff --git a/quickstep/src/com/android/quickstep/TaskAnimationManager.java b/quickstep/src/com/android/quickstep/TaskAnimationManager.java
index 0bc44e1..8e03a91 100644
--- a/quickstep/src/com/android/quickstep/TaskAnimationManager.java
+++ b/quickstep/src/com/android/quickstep/TaskAnimationManager.java
@@ -34,6 +34,7 @@
import android.util.Log;
import android.view.RemoteAnimationTarget;
+import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.UiThread;
@@ -102,7 +103,7 @@
* Starts a new recents animation for the activity with the given {@param intent}.
*/
@UiThread
- public RecentsAnimationCallbacks startRecentsAnimation(GestureState gestureState,
+ public RecentsAnimationCallbacks startRecentsAnimation(@NonNull GestureState gestureState,
Intent intent, RecentsAnimationCallbacks.RecentsAnimationListener listener) {
ActiveGestureLog.INSTANCE.addLog(
/* event= */ "startRecentsAnimation",
@@ -163,6 +164,7 @@
// other apps need to keep visible so finish the animating state after the
// enter animation of overview is done. Then 3p launcher can be stopped.
mLastGestureState.runOnceAtState(STATE_END_TARGET_ANIMATION_FINISHED, () -> {
+ if (mLastGestureState != gestureState) return;
// Only finish if the end target is RECENTS. Otherwise, if the target is
// NEW_TASK, startActivityFromRecents will be skipped.
if (mLastGestureState.getEndTarget() == RECENTS) {
diff --git a/quickstep/src/com/android/quickstep/TaskIconCache.java b/quickstep/src/com/android/quickstep/TaskIconCache.java
index 20a751b..1b3f598 100644
--- a/quickstep/src/com/android/quickstep/TaskIconCache.java
+++ b/quickstep/src/com/android/quickstep/TaskIconCache.java
@@ -31,7 +31,6 @@
import android.os.UserHandle;
import android.text.TextUtils;
import android.util.SparseArray;
-import android.view.accessibility.AccessibilityManager;
import androidx.annotation.WorkerThread;
@@ -45,6 +44,7 @@
import com.android.launcher3.util.DisplayController;
import com.android.launcher3.util.DisplayController.DisplayInfoChangeListener;
import com.android.launcher3.util.DisplayController.Info;
+import com.android.launcher3.util.FlagOp;
import com.android.launcher3.util.Preconditions;
import com.android.quickstep.util.CancellableTask;
import com.android.quickstep.util.TaskKeyLruCache;
@@ -62,7 +62,6 @@
public class TaskIconCache implements DisplayInfoChangeListener {
private final Executor mBgExecutor;
- private final AccessibilityManager mAccessibilityManager;
private final Context mContext;
private final TaskKeyLruCache<TaskCacheEntry> mIconCache;
@@ -79,7 +78,6 @@
public TaskIconCache(Context context, Executor bgExecutor, IconProvider iconProvider) {
mContext = context;
mBgExecutor = bgExecutor;
- mAccessibilityManager = context.getSystemService(AccessibilityManager.class);
mIconProvider = iconProvider;
Resources res = context.getResources();
@@ -238,14 +236,11 @@
if ((index = mDefaultIcons.indexOfKey(userId)) >= 0) {
return mDefaultIcons.valueAt(index).newIcon(mContext);
} else {
- try (BaseIconFactory li = getIconFactory()) {
- BitmapInfo info = mDefaultIconBase.withFlags(
- li.getBitmapFlagOp(new IconOptions()
- .setUser(UserCache.INSTANCE.get(mContext)
- .getUserInfo(UserHandle.of(userId)))));
- mDefaultIcons.put(userId, info);
- return info.newIcon(mContext);
- }
+ BitmapInfo info = mDefaultIconBase.withFlags(
+ UserCache.INSTANCE.get(mContext).getUserInfo(UserHandle.of(userId))
+ .applyBitmapInfoFlags(FlagOp.NO_OP));
+ mDefaultIcons.put(userId, info);
+ return info.newIcon(mContext);
}
}
}
diff --git a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java
index 95ce406..35fa539 100644
--- a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java
+++ b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java
@@ -238,6 +238,12 @@
if (toState == MODAL_TASK) {
setOverviewSelectEnabled(true);
}
+
+ // Set border after select mode changes to avoid showing border during state transition
+ if (!toState.overviewUi() || toState == MODAL_TASK) {
+ setTaskBorderEnabled(false);
+ }
+
setFreezeViewVisibility(true);
}
@@ -253,6 +259,11 @@
if (finalState != MODAL_TASK) {
setOverviewSelectEnabled(false);
}
+
+ if (finalState.overviewUi() && finalState != MODAL_TASK) {
+ setTaskBorderEnabled(true);
+ }
+
if (finalState != OVERVIEW_SPLIT_SELECT) {
if (FeatureFlags.enableSplitContextually()) {
mSplitSelectStateController.resetState();
diff --git a/quickstep/src/com/android/quickstep/interaction/AllSetActivity.java b/quickstep/src/com/android/quickstep/interaction/AllSetActivity.java
index fce188f..1bec970 100644
--- a/quickstep/src/com/android/quickstep/interaction/AllSetActivity.java
+++ b/quickstep/src/com/android/quickstep/interaction/AllSetActivity.java
@@ -184,7 +184,7 @@
mAnimatedBackground.setAnimation(resources.openRawResource(R.raw.all_set_page_bg),
null);
- LottieAnimationColorUtils.updateColors(
+ LottieAnimationColorUtils.updateToColorResources(
mAnimatedBackground,
Map.of(LOTTIE_PRIMARY_COLOR_TOKEN, R.color.all_set_bg_primary,
LOTTIE_TERTIARY_COLOR_TOKEN, R.color.all_set_bg_tertiary),
diff --git a/quickstep/src/com/android/quickstep/interaction/BackGestureTutorialController.java b/quickstep/src/com/android/quickstep/interaction/BackGestureTutorialController.java
index 631cff7..404bca9 100644
--- a/quickstep/src/com/android/quickstep/interaction/BackGestureTutorialController.java
+++ b/quickstep/src/com/android/quickstep/interaction/BackGestureTutorialController.java
@@ -41,13 +41,13 @@
super(fragment, tutorialType);
// Set the Lottie animation colors specifically for the Back gesture
if (ENABLE_NEW_GESTURE_NAV_TUTORIAL.get()) {
- LottieAnimationColorUtils.updateColors(
+ LottieAnimationColorUtils.updateToArgbColors(
mAnimatedGestureDemonstration,
Map.of(".onSurfaceBack", fragment.mRootView.mColorOnSurfaceBack,
".surfaceBack", fragment.mRootView.mColorSurfaceBack,
".secondaryBack", fragment.mRootView.mColorSecondaryBack));
- LottieAnimationColorUtils.updateColors(
+ LottieAnimationColorUtils.updateToArgbColors(
mCheckmarkAnimation,
Map.of(".checkmark",
Utilities.isDarkTheme(mContext)
diff --git a/quickstep/src/com/android/quickstep/interaction/HomeGestureTutorialController.java b/quickstep/src/com/android/quickstep/interaction/HomeGestureTutorialController.java
index daac99b..df552cf 100644
--- a/quickstep/src/com/android/quickstep/interaction/HomeGestureTutorialController.java
+++ b/quickstep/src/com/android/quickstep/interaction/HomeGestureTutorialController.java
@@ -38,13 +38,13 @@
// Set the Lottie animation colors specifically for the Home gesture
if (ENABLE_NEW_GESTURE_NAV_TUTORIAL.get()) {
- LottieAnimationColorUtils.updateColors(
+ LottieAnimationColorUtils.updateToArgbColors(
mAnimatedGestureDemonstration,
Map.of(".onSurfaceHome", fragment.mRootView.mColorOnSurfaceHome,
".surfaceHome", fragment.mRootView.mColorSurfaceHome,
".secondaryHome", fragment.mRootView.mColorSecondaryHome));
- LottieAnimationColorUtils.updateColors(
+ LottieAnimationColorUtils.updateToArgbColors(
mCheckmarkAnimation,
Map.of(".checkmark",
Utilities.isDarkTheme(mContext)
diff --git a/quickstep/src/com/android/quickstep/interaction/OverviewGestureTutorialController.java b/quickstep/src/com/android/quickstep/interaction/OverviewGestureTutorialController.java
index afdc1e5..65f3a01 100644
--- a/quickstep/src/com/android/quickstep/interaction/OverviewGestureTutorialController.java
+++ b/quickstep/src/com/android/quickstep/interaction/OverviewGestureTutorialController.java
@@ -53,13 +53,13 @@
// Set the Lottie animation colors specifically for the Overview gesture
if (ENABLE_NEW_GESTURE_NAV_TUTORIAL.get()) {
- LottieAnimationColorUtils.updateColors(
+ LottieAnimationColorUtils.updateToArgbColors(
mAnimatedGestureDemonstration,
Map.of(".onSurfaceOverview", fragment.mRootView.mColorOnSurfaceOverview,
".surfaceOverview", fragment.mRootView.mColorSurfaceOverview,
".secondaryOverview", fragment.mRootView.mColorSecondaryOverview));
- LottieAnimationColorUtils.updateColors(
+ LottieAnimationColorUtils.updateToArgbColors(
mCheckmarkAnimation,
Map.of(".checkmark",
Utilities.isDarkTheme(mContext)
diff --git a/quickstep/src/com/android/quickstep/logging/StatsLogCompatManager.java b/quickstep/src/com/android/quickstep/logging/StatsLogCompatManager.java
index ac6c274..2aa9240 100644
--- a/quickstep/src/com/android/quickstep/logging/StatsLogCompatManager.java
+++ b/quickstep/src/com/android/quickstep/logging/StatsLogCompatManager.java
@@ -32,6 +32,7 @@
import static com.android.systemui.shared.system.SysUiStatsLog.LAUNCHER_UICHANGED__DST_STATE__OVERVIEW;
import android.content.Context;
+import android.text.TextUtils;
import android.util.Log;
import android.util.StatsEvent;
import android.view.View;
@@ -227,6 +228,7 @@
private Optional<Integer> mCardinality = Optional.empty();
private int mInputType = SysUiStatsLog.LAUNCHER_UICHANGED__INPUT_TYPE__UNKNOWN;
private Optional<Integer> mFeatures = Optional.empty();
+ private Optional<String> mPackageName = Optional.empty();
StatsCompatLogger(Context context, ActivityContext activityContext) {
mContext = context;
@@ -332,6 +334,12 @@
}
@Override
+ public StatsLogger withPackageName(@Nullable String packageName) {
+ mPackageName = Optional.ofNullable(packageName);
+ return this;
+ }
+
+ @Override
public void log(EventEnum event) {
if (!Utilities.ATLEAST_R) {
return;
@@ -431,6 +439,7 @@
int srcState = mSrcState;
int dstState = mDstState;
int inputType = mInputType;
+ String packageName = mPackageName.orElseGet(() -> getPackageName(atomInfo));
if (IS_VERBOSE) {
String name = (event instanceof Enum) ? ((Enum) event).name() :
event.getId() + "";
@@ -448,6 +457,9 @@
if (atomInfo.hasContainerInfo()) {
logStringBuilder.append("\n").append(atomInfo);
}
+ if (!TextUtils.isEmpty(packageName)) {
+ logStringBuilder.append(String.format("\nPackage name: %s", packageName));
+ }
Log.d(TAG, logStringBuilder.toString());
}
@@ -472,7 +484,7 @@
atomInfo.getItemCase().getNumber() /* target_id */,
instanceId.getId() /* instance_id TODO */,
0 /* uid TODO */,
- getPackageName(atomInfo) /* package_name */,
+ packageName /* package_name */,
getComponentName(atomInfo) /* component_name */,
getGridX(atomInfo, false) /* grid_x */,
getGridY(atomInfo, false) /* grid_y */,
diff --git a/quickstep/src/com/android/quickstep/util/ActiveGestureLog.java b/quickstep/src/com/android/quickstep/util/ActiveGestureLog.java
index 6f4b6cb..278ca56 100644
--- a/quickstep/src/com/android/quickstep/util/ActiveGestureLog.java
+++ b/quickstep/src/com/android/quickstep/util/ActiveGestureLog.java
@@ -18,6 +18,8 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import com.android.launcher3.util.Preconditions;
+
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
@@ -43,14 +45,6 @@
*/
public static final String INTENT_EXTRA_LOG_TRACE_ID = "INTENT_EXTRA_LOG_TRACE_ID";
- private static final int TYPE_ONE_OFF = 0;
- private static final int TYPE_FLOAT = 1;
- private static final int TYPE_INTEGER = 2;
- private static final int TYPE_BOOL_TRUE = 3;
- private static final int TYPE_BOOL_FALSE = 4;
- private static final int TYPE_COMPOUND_STRING = 5;
- private static final int TYPE_GESTURE_EVENT = 6;
-
private final EventLog[] logs;
private int nextIndex;
private int mCurrentLogId = 100;
@@ -67,9 +61,12 @@
* execution.
*/
public void trackEvent(@Nullable ActiveGestureErrorDetector.GestureEvent gestureEvent) {
- addLog(TYPE_GESTURE_EVENT, "", 0, CompoundString.NO_OP, gestureEvent);
+ addLog(CompoundString.NO_OP, gestureEvent);
}
+ /**
+ * Adds a log to be printed at log-dump-time.
+ */
public void addLog(String event) {
addLog(event, null);
}
@@ -82,54 +79,35 @@
addLog(event, extras, null);
}
- public void addLog(CompoundString compoundString) {
- if (compoundString == CompoundString.NO_OP) return;
- addLog(TYPE_COMPOUND_STRING, "", 0, compoundString, null);
- }
-
- public void addLog(
- CompoundString compoundString,
- @Nullable ActiveGestureErrorDetector.GestureEvent gestureEvent) {
- if (compoundString == CompoundString.NO_OP) {
- trackEvent(gestureEvent);
- return;
- }
- addLog(TYPE_COMPOUND_STRING, "", 0, compoundString, gestureEvent);
- }
-
/**
- * Adds a log and track the associated event for error detection.
+ * Adds a log to be printed at log-dump-time and track the associated event for error detection.
*
* @param gestureEvent GestureEvent representing the event being logged.
*/
public void addLog(
String event, @Nullable ActiveGestureErrorDetector.GestureEvent gestureEvent) {
- addLog(TYPE_ONE_OFF, event, 0, CompoundString.NO_OP, gestureEvent);
+ addLog(new CompoundString(event), gestureEvent);
}
public void addLog(
String event,
int extras,
@Nullable ActiveGestureErrorDetector.GestureEvent gestureEvent) {
- addLog(TYPE_INTEGER, event, extras, CompoundString.NO_OP, gestureEvent);
+ addLog(new CompoundString(event).append(": ").append(extras), gestureEvent);
}
public void addLog(
String event,
boolean extras,
@Nullable ActiveGestureErrorDetector.GestureEvent gestureEvent) {
- addLog(
- extras ? TYPE_BOOL_TRUE : TYPE_BOOL_FALSE,
- event,
- 0,
- CompoundString.NO_OP,
- gestureEvent);
+ addLog(new CompoundString(event).append(": ").append(extras), gestureEvent);
}
- private void addLog(
- int type,
- String event,
- float extras,
+ public void addLog(CompoundString compoundString) {
+ addLog(compoundString, null);
+ }
+
+ public void addLog(
CompoundString compoundString,
@Nullable ActiveGestureErrorDetector.GestureEvent gestureEvent) {
EventLog lastEventLog = logs[(nextIndex + logs.length - 1) % logs.length];
@@ -137,7 +115,7 @@
EventLog eventLog = new EventLog(mCurrentLogId, mIsFullyGesturalNavMode);
EventEntry eventEntry = new EventEntry();
- eventEntry.update(type, event, extras, compoundString, gestureEvent);
+ eventEntry.update(compoundString, gestureEvent);
eventLog.eventEntries.add(eventEntry);
logs[nextIndex] = eventLog;
nextIndex = (nextIndex + 1) % logs.length;
@@ -146,17 +124,17 @@
// Update the last EventLog
List<EventEntry> lastEventEntries = lastEventLog.eventEntries;
- EventEntry lastEntry = lastEventEntries.size() > 0
+ EventEntry lastEntry = !lastEventEntries.isEmpty()
? lastEventEntries.get(lastEventEntries.size() - 1) : null;
// Update the last EventEntry if it's a duplicate
- if (isEntrySame(lastEntry, type, event, extras, compoundString, gestureEvent)) {
+ if (isEntrySame(lastEntry, compoundString, gestureEvent)) {
lastEntry.duplicateCount++;
return;
}
EventEntry eventEntry = new EventEntry();
- eventEntry.update(type, event, extras, compoundString, gestureEvent);
+ eventEntry.update(compoundString, gestureEvent);
lastEventEntries.add(eventEntry);
}
@@ -181,30 +159,14 @@
writer.println(prefix + "\tLogs for logId: " + eventLog.logId);
for (EventEntry eventEntry : eventLog.eventEntries) {
+ if (eventEntry.mCompoundString.mIsNoOp) {
+ continue;
+ }
date.setTime(eventEntry.time);
- StringBuilder msg = new StringBuilder(prefix + "\t\t").append(sdf.format(date))
- .append(eventEntry.event);
- switch (eventEntry.type) {
- case TYPE_BOOL_FALSE:
- msg.append(": false");
- break;
- case TYPE_BOOL_TRUE:
- msg.append(": true");
- break;
- case TYPE_FLOAT:
- msg.append(": ").append(eventEntry.extras);
- break;
- case TYPE_INTEGER:
- msg.append(": ").append((int) eventEntry.extras);
- break;
- case TYPE_COMPOUND_STRING:
- msg.append(eventEntry.mCompoundString);
- break;
- case TYPE_GESTURE_EVENT:
- continue;
- default: // fall out
- }
+ StringBuilder msg = new StringBuilder(prefix + "\t\t")
+ .append(sdf.format(date))
+ .append(eventEntry.mCompoundString);
if (eventEntry.duplicateCount > 0) {
msg.append(" & ").append(eventEntry.duplicateCount).append(" similar events");
}
@@ -232,15 +194,9 @@
private boolean isEntrySame(
EventEntry entry,
- int type,
- String event,
- float extras,
CompoundString compoundString,
ActiveGestureErrorDetector.GestureEvent gestureEvent) {
return entry != null
- && entry.type == type
- && entry.event.equals(event)
- && Float.compare(entry.extras, extras) == 0
&& entry.mCompoundString.equals(compoundString)
&& entry.gestureEvent == gestureEvent;
}
@@ -248,9 +204,6 @@
/** A single event entry. */
protected static class EventEntry {
- private int type;
- private String event;
- private float extras;
@NonNull private CompoundString mCompoundString;
private ActiveGestureErrorDetector.GestureEvent gestureEvent;
private long time;
@@ -264,14 +217,8 @@
}
private void update(
- int type,
- String event,
- float extras,
@NonNull CompoundString compoundString,
ActiveGestureErrorDetector.GestureEvent gestureEvent) {
- this.type = type;
- this.event = event;
- this.extras = extras;
this.mCompoundString = compoundString;
this.gestureEvent = gestureEvent;
time = System.currentTimeMillis();
@@ -302,6 +249,7 @@
public static final CompoundString NO_OP = new CompoundString();
private final List<String> mSubstrings;
+ private final List<Object> mArgs;
private final boolean mIsNoOp;
@@ -313,10 +261,12 @@
mIsNoOp = substring == null;
if (mIsNoOp) {
mSubstrings = null;
+ mArgs = null;
return;
}
mSubstrings = new ArrayList<>();
mSubstrings.add(substring);
+ mArgs = new ArrayList<>();
}
public CompoundString append(CompoundString substring) {
@@ -338,19 +288,41 @@
}
public CompoundString append(int num) {
- if (mIsNoOp) {
- return this;
- }
- mSubstrings.add(Integer.toString(num));
+ mArgs.add(num);
- return this;
+ return append("%d");
+ }
+
+ public CompoundString append(float num) {
+ mArgs.add(num);
+
+ return append("%.2f");
+ }
+
+ public CompoundString append(double num) {
+ mArgs.add(num);
+
+ return append("%.2f");
+ }
+
+ public CompoundString append(boolean bool) {
+ mArgs.add(bool);
+
+ return append("%b");
+ }
+
+ public Object[] getArgs() {
+ return mArgs.toArray();
}
@Override
public String toString() {
- if (mIsNoOp) {
- return "ERROR: cannot use No-Op compound string";
- }
+ return String.format(toUnformattedString(), getArgs());
+ }
+
+ public String toUnformattedString() {
+ Preconditions.assertTrue(!mIsNoOp);
+
StringBuilder sb = new StringBuilder();
for (String substring : mSubstrings) {
sb.append(substring);
diff --git a/quickstep/src/com/android/quickstep/util/LottieAnimationColorUtils.java b/quickstep/src/com/android/quickstep/util/LottieAnimationColorUtils.java
index f98b04b..8833b46 100644
--- a/quickstep/src/com/android/quickstep/util/LottieAnimationColorUtils.java
+++ b/quickstep/src/com/android/quickstep/util/LottieAnimationColorUtils.java
@@ -17,13 +17,11 @@
import static com.airbnb.lottie.LottieProperty.COLOR_FILTER;
-import android.content.res.Resources;
import android.content.res.Resources.Theme;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import com.airbnb.lottie.LottieAnimationView;
import com.airbnb.lottie.model.KeyPath;
@@ -40,51 +38,39 @@
/**
* Updates the given Lottie animation's tokenized colors according to the given mapping.
* <p>
- * Use this method signature only when {@code tokenToColorCodeMap} maps to packed ARBG color
- * integers.
- * <p>
* @param animationView {@link LottieAnimationView} whose animation's colors need to be updated
- * @param tokenToColorCodeMap A mapping from the color tokens used in the Lottie file used in
+ * @param tokenToArgbColorMap A mapping from the color tokens used in the Lottie file used in
* {@code animationView} to packed ARBG color integers.
*/
- public static void updateColors(
+ public static void updateToArgbColors(
@NonNull LottieAnimationView animationView,
- @NonNull Map<String, Integer> tokenToColorCodeMap) {
- updateColors(animationView, tokenToColorCodeMap, null);
- }
-
- /**
- * Updates the given Lottie animation's tokenized colors according to the given mapping.
- * <p>
- * Use this method signature with a non-null theme only when {@code tokenToColorCodeMap} maps
- * to color resource references.
- * <p>
- * @param animationView {@link LottieAnimationView} whose animation's colors need to be updated
- * @param tokenToColorCodeMap A mapping from the color tokens used in the Lottie file used in
- * {@code animationView} to packed ARBG color integers or color
- * resource references.
- * @param theme {@link Theme} to be used when resolving color resource references. {@code null}
- * iff {@code tokenToColorCodeMap} maps to packed ARBG color integers.
- */
- public static void updateColors(
- @NonNull LottieAnimationView animationView,
- @NonNull Map<String, Integer> tokenToColorCodeMap,
- @Nullable Theme theme) {
- Resources resources = animationView.getResources();
- final Map<String, Integer> tokenToColorMap = theme == null
- // tokenToColorCodeMap maps directly to ARBG values
- ? tokenToColorCodeMap
- // tokenToColorCodeMap maps to color references, build a mapping to resolved colors
- : tokenToColorCodeMap.keySet().stream().collect(Collectors.toMap(
- Function.identity(),
- token -> resources.getColor(tokenToColorCodeMap.get(token), theme)));
-
+ @NonNull Map<String, Integer> tokenToArgbColorMap) {
animationView.addLottieOnCompositionLoadedListener(
- composition -> tokenToColorMap.forEach(
+ composition -> tokenToArgbColorMap.forEach(
(token, color) -> animationView.addValueCallback(
new KeyPath("**", token, "**"),
COLOR_FILTER,
frameInfo -> new PorterDuffColorFilter(
color, PorterDuff.Mode.SRC_ATOP))));
}
+
+ /**
+ * Updates the given Lottie animation's tokenized colors according to the given mapping.
+ * <p>
+ * @param animationView {@link LottieAnimationView} whose animation's colors need to be updated
+ * @param tokenToColorResourceMap A mapping from the color tokens used in the Lottie file used
+ * in {@code animationView} to color resource references.
+ * @param theme {@link Theme} to be used when resolving color resource references.
+ */
+ public static void updateToColorResources(
+ @NonNull LottieAnimationView animationView,
+ @NonNull Map<String, Integer> tokenToColorResourceMap,
+ @NonNull Theme theme) {
+ updateToArgbColors(
+ animationView,
+ tokenToColorResourceMap.keySet().stream().collect(Collectors.toMap(
+ Function.identity(),
+ token -> animationView.getResources().getColor(
+ tokenToColorResourceMap.get(token), theme))));
+ }
}
diff --git a/quickstep/src/com/android/quickstep/util/SplitAnimationController.kt b/quickstep/src/com/android/quickstep/util/SplitAnimationController.kt
index 6ee65d4..b7c6bf5 100644
--- a/quickstep/src/com/android/quickstep/util/SplitAnimationController.kt
+++ b/quickstep/src/com/android/quickstep/util/SplitAnimationController.kt
@@ -252,6 +252,7 @@
splitSelectStateController.splitInstructionsView = splitInstructionsView
val timings = AnimUtils.getDeviceOverviewToSplitTimings(launcher.deviceProfile.isTablet)
val anim = PendingAnimation(100 /*duration */)
+ splitInstructionsView.alpha = 0f
anim.setViewAlpha(splitInstructionsView, 1f,
Interpolators.clampToProgress(Interpolators.LINEAR,
timings.instructionsContainerFadeInStartOffset,
diff --git a/quickstep/src/com/android/quickstep/util/TaskKeyByLastActiveTimeCache.java b/quickstep/src/com/android/quickstep/util/TaskKeyByLastActiveTimeCache.java
index 79ca076..21c9e09 100644
--- a/quickstep/src/com/android/quickstep/util/TaskKeyByLastActiveTimeCache.java
+++ b/quickstep/src/com/android/quickstep/util/TaskKeyByLastActiveTimeCache.java
@@ -44,7 +44,7 @@
private final PriorityQueue<Task.TaskKey> mQueue;
public TaskKeyByLastActiveTimeCache(int maxSize) {
- mMap = new HashMap(maxSize);
+ mMap = new HashMap(0);
mQueue = new PriorityQueue<>(Comparator.comparingLong(t -> t.lastActiveTime));
mMaxSize = new AtomicInteger(maxSize);
}
@@ -106,7 +106,8 @@
}
/**
- * Adds an entry to the cache, optionally evicting the last accessed entry
+ * Adds an entry to the cache, optionally evicting the last accessed entry excluding the newly
+ * added entry
*/
@Override
public final synchronized void put(Task.TaskKey key, V value) {
@@ -117,9 +118,9 @@
mQueue.remove(entry.mKey);
}
+ removeExcessIfNeeded(mMaxSize.get() - 1);
mMap.put(key.id, new Entry<>(key, value));
mQueue.add(key);
- removeExcessIfNeeded();
} else {
Log.e(TAG, "Unexpected null key or value: " + key + ", " + value);
}
@@ -143,11 +144,11 @@
@Override
public synchronized void updateCacheSizeAndRemoveExcess(int cacheSize) {
mMaxSize.compareAndSet(mMaxSize.get(), cacheSize);
- removeExcessIfNeeded();
+ removeExcessIfNeeded(mMaxSize.get());
}
- private synchronized void removeExcessIfNeeded() {
- while (mQueue.size() > mMaxSize.get() && !mQueue.isEmpty()) {
+ private synchronized void removeExcessIfNeeded(int maxSize) {
+ while (mQueue.size() > maxSize && !mQueue.isEmpty()) {
Task.TaskKey key = mQueue.poll();
mMap.remove(key.id);
}
diff --git a/quickstep/src/com/android/quickstep/views/FloatingTaskView.java b/quickstep/src/com/android/quickstep/views/FloatingTaskView.java
index 92ffcd0..efc0a35 100644
--- a/quickstep/src/com/android/quickstep/views/FloatingTaskView.java
+++ b/quickstep/src/com/android/quickstep/views/FloatingTaskView.java
@@ -319,7 +319,7 @@
// Fade in the placeholder view during Normal > OverviewSplitSelect
if (mSplitPlaceholderView.getAlpha() == 0) {
- mSplitPlaceholderView.getIconView().setAlpha(0);
+ mSplitPlaceholderView.getIconView().setContentAlpha(0);
fadeInSplitPlaceholder(animation, timings);
}
diff --git a/quickstep/src/com/android/quickstep/views/GroupedTaskView.java b/quickstep/src/com/android/quickstep/views/GroupedTaskView.java
index 8559b37..dd201af 100644
--- a/quickstep/src/com/android/quickstep/views/GroupedTaskView.java
+++ b/quickstep/src/com/android/quickstep/views/GroupedTaskView.java
@@ -436,7 +436,7 @@
super.setIconsAndBannersTransitionProgress(progress, invert);
// Value set by super call
float scale = mIconView.getAlpha();
- mIconView2.setAlpha(scale);
+ mIconView2.setContentAlpha(scale);
mDigitalWellBeingToast2.updateBannerOffset(1f - scale);
}
diff --git a/quickstep/src/com/android/quickstep/views/IconAppChipView.java b/quickstep/src/com/android/quickstep/views/IconAppChipView.java
index b14b917..ee09c4d 100644
--- a/quickstep/src/com/android/quickstep/views/IconAppChipView.java
+++ b/quickstep/src/com/android/quickstep/views/IconAppChipView.java
@@ -40,6 +40,7 @@
import com.android.launcher3.R;
import com.android.launcher3.Utilities;
import com.android.launcher3.touch.PagedOrientationHandler;
+import com.android.launcher3.util.MultiValueAlpha;
import com.android.launcher3.views.ActivityContext;
import com.android.quickstep.util.RecentsOrientedState;
@@ -51,6 +52,12 @@
private static final int MENU_BACKGROUND_REVEAL_DURATION = 417;
private static final int MENU_BACKGROUND_HIDE_DURATION = 333;
+ private static final int NUM_ALPHA_CHANNELS = 2;
+ private static final int INDEX_CONTENT_ALPHA = 0;
+ private static final int INDEX_COLOR_FILTER_ALPHA = 1;
+
+ private final MultiValueAlpha mMultiValueAlpha;
+
private IconView mIconView;
// Two textview so we can ellipsize the collapsed view and crossfade on expand to the full name.
private TextView mIconTextCollapsedView;
@@ -98,6 +105,8 @@
int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
Resources res = getResources();
+ mMultiValueAlpha = new MultiValueAlpha(this, NUM_ALPHA_CHANNELS);
+ mMultiValueAlpha.setUpdateVisibility(/* updateVisibility= */ true);
// Menu dimensions
mMaxMenuWidth = res.getDimensionPixelSize(R.dimen.task_thumbnail_icon_menu_max_width);
@@ -286,7 +295,13 @@
@Override
public void setIconColorTint(int color, float amount) {
// RecentsView's COLOR_TINT animates between 0 and 0.5f, we want to hide the app chip menu.
- setAlpha(Utilities.mapToRange(amount, 0f, 0.5f, 1f, 0f, LINEAR));
+ float colorTintAlpha = Utilities.mapToRange(amount, 0f, 0.5f, 1f, 0f, LINEAR);
+ mMultiValueAlpha.get(INDEX_COLOR_FILTER_ALPHA).setValue(colorTintAlpha);
+ }
+
+ @Override
+ public void setContentAlpha(float alpha) {
+ mMultiValueAlpha.get(INDEX_CONTENT_ALPHA).setValue(alpha);
}
@Override
diff --git a/quickstep/src/com/android/quickstep/views/IconView.java b/quickstep/src/com/android/quickstep/views/IconView.java
index 64caba7..a4bda7f 100644
--- a/quickstep/src/com/android/quickstep/views/IconView.java
+++ b/quickstep/src/com/android/quickstep/views/IconView.java
@@ -144,6 +144,11 @@
}
@Override
+ public void setContentAlpha(float alpha) {
+ setAlpha(alpha);
+ }
+
+ @Override
public void setAlpha(float alpha) {
super.setAlpha(alpha);
if (alpha > 0) {
diff --git a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java
index a265146..5b5d0de 100644
--- a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java
+++ b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java
@@ -16,7 +16,6 @@
package com.android.quickstep.views;
import static android.app.ActivityTaskManager.INVALID_TASK_ID;
-
import static com.android.launcher3.LauncherState.ALL_APPS;
import static com.android.launcher3.LauncherState.CLEAR_ALL_BUTTON;
import static com.android.launcher3.LauncherState.EDIT_MODE;
@@ -31,6 +30,7 @@
import android.content.Context;
import android.os.Build;
import android.util.AttributeSet;
+import android.util.Log;
import android.view.MotionEvent;
import androidx.annotation.Nullable;
@@ -44,6 +44,7 @@
import com.android.launcher3.statehandlers.DesktopVisibilityController;
import com.android.launcher3.statemanager.StateManager;
import com.android.launcher3.statemanager.StateManager.StateListener;
+import com.android.launcher3.testing.shared.TestProtocol;
import com.android.launcher3.uioverrides.QuickstepLauncher;
import com.android.launcher3.util.PendingSplitSelectInfo;
import com.android.launcher3.util.SplitConfigurationOptions;
@@ -144,6 +145,12 @@
if (toState == OVERVIEW_MODAL_TASK) {
setOverviewSelectEnabled(true);
}
+
+ // Set border after select mode changes to avoid showing border during state transition
+ if (!toState.overviewUi || toState == OVERVIEW_MODAL_TASK) {
+ setTaskBorderEnabled(false);
+ }
+
setFreezeViewVisibility(true);
if (mActivity.getDesktopVisibilityController() != null) {
mActivity.getDesktopVisibilityController().onLauncherStateChanged(toState);
@@ -164,6 +171,10 @@
setOverviewSelectEnabled(false);
}
+ if (finalState.overviewUi && finalState != OVERVIEW_MODAL_TASK) {
+ setTaskBorderEnabled(true);
+ }
+
if (isOverlayEnabled) {
runActionOnRemoteHandles(remoteTargetHandle ->
remoteTargetHandle.getTaskViewSimulator().setDrawsBelowRecents(true));
@@ -173,6 +184,8 @@
@Override
public void setOverviewStateEnabled(boolean enabled) {
super.setOverviewStateEnabled(enabled);
+ Log.d(TestProtocol.OVERVIEW_OVER_HOME, "overview state enabled state has changed: "
+ + enabled);
if (enabled) {
LauncherState state = mActivity.getStateManager().getState();
boolean hasClearAllButton = (state.getVisibleElements(mActivity)
diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java
index f55dce9..22a5064 100644
--- a/quickstep/src/com/android/quickstep/views/RecentsView.java
+++ b/quickstep/src/com/android/quickstep/views/RecentsView.java
@@ -1410,6 +1410,17 @@
}
/**
+ * Enable or disable showing border on hover and focus change on task views
+ */
+ public void setTaskBorderEnabled(boolean enabled) {
+ int taskCount = getTaskViewCount();
+ for (int i = 0; i < taskCount; i++) {
+ TaskView taskView = requireTaskViewAt(i);
+ taskView.setBorderEnabled(enabled);
+ }
+ }
+
+ /**
* Whether the Clear All button is hidden or fully visible. Used to determine if center
* displayed page is a task or the Clear All button.
*
diff --git a/quickstep/src/com/android/quickstep/views/SplitInstructionsView.java b/quickstep/src/com/android/quickstep/views/SplitInstructionsView.java
index e8f06ee..8bc85cf 100644
--- a/quickstep/src/com/android/quickstep/views/SplitInstructionsView.java
+++ b/quickstep/src/com/android/quickstep/views/SplitInstructionsView.java
@@ -17,14 +17,12 @@
package com.android.quickstep.views;
import android.content.Context;
-import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.AttributeSet;
import android.util.FloatProperty;
-import android.view.MotionEvent;
import android.view.ViewGroup;
import android.view.accessibility.AccessibilityNodeInfo;
-import android.widget.FrameLayout;
+import android.widget.LinearLayout;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatTextView;
@@ -41,9 +39,11 @@
*
* Appears and disappears concurrently with a FloatingTaskView.
*/
-public class SplitInstructionsView extends FrameLayout {
+public class SplitInstructionsView extends LinearLayout {
private final StatefulActivity mLauncher;
- private AppCompatTextView mTextView;
+ private AppCompatTextView mInstructionTextView;
+ /** Only used if {@link com.android.wm.shell.FeatureFlags#enableSplitContextual()} is true. */
+ private AppCompatTextView mCancelTextView;
public static final FloatProperty<SplitInstructionsView> UNFOLD =
new FloatProperty<SplitInstructionsView>("SplitInstructionsUnfold") {
@@ -97,22 +97,13 @@
}
private void init() {
- mTextView = findViewById(R.id.split_instructions_text);
+ mInstructionTextView = findViewById(R.id.split_instructions_text);
+ mCancelTextView = findViewById(R.id.split_instructions_text_cancel);
- if (!FeatureFlags.enableSplitContextually()) {
- mTextView.setCompoundDrawables(null, null, null, null);
- return;
+ if (FeatureFlags.enableSplitContextually()) {
+ mCancelTextView.setVisibility(VISIBLE);
+ mCancelTextView.setOnClickListener((v) -> exitSplitSelection());
}
-
- mTextView.setOnTouchListener((v, event) -> {
- if (isTouchInsideRightCompoundDrawable(event)) {
- if (event.getAction() == MotionEvent.ACTION_UP) {
- exitSplitSelection();
- }
- return true;
- }
- return false;
- });
}
private void exitSplitSelection() {
@@ -121,20 +112,6 @@
mLauncher.getStateManager().goToState(LauncherState.NORMAL);
}
- private boolean isTouchInsideRightCompoundDrawable(MotionEvent event) {
- // Get the right compound drawable of the TextView.
- Drawable rightDrawable = mTextView.getCompoundDrawablesRelative()[2];
-
- // Check if the touch event intersects with the drawable's bounds.
- if (rightDrawable != null) {
- // We can get away w/o caring about the Y bounds since it's such a small view, if it's
- // above/below the drawable just assume they meant to touch it. ¯\_(ツ)_/¯
- return event.getX() >= (mTextView.getWidth() - rightDrawable.getBounds().width());
- } else {
- return false;
- }
- }
-
@Override
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
super.onInitializeAccessibilityNodeInfo(info);
@@ -172,6 +149,6 @@
}
public AppCompatTextView getTextView() {
- return mTextView;
+ return mInstructionTextView;
}
}
diff --git a/quickstep/src/com/android/quickstep/views/TaskMenuView.java b/quickstep/src/com/android/quickstep/views/TaskMenuView.java
index 0c816b8..cf89d2e 100644
--- a/quickstep/src/com/android/quickstep/views/TaskMenuView.java
+++ b/quickstep/src/com/android/quickstep/views/TaskMenuView.java
@@ -311,14 +311,14 @@
- mActivity.getDeviceProfile().getOverviewActionsClaimedSpaceBelow();
float midpoint = (taskBottom + taskbarTop) / 2f;
additionalTranslationY = -Math.max(menuBottom - midpoint, 0);
- } else {
- // Animate the menu to leave a small margin at the top of the task.
- additionalTranslationY = getResources().getDimensionPixelSize(
- R.dimen.task_thumbnail_icon_menu_top_margin_expanded);
}
+ // Translate the menu to account for the expansion of the app chip menu as well.
+ float expandOffsetTranslationY = getResources().getDimensionPixelSize(
+ R.dimen.task_thumbnail_icon_menu_expanded_gap);
ObjectAnimator translationYAnim = ObjectAnimator.ofFloat(this, TRANSLATION_Y,
closing ? mMenuTranslationYBeforeOpen
- : mMenuTranslationYBeforeOpen + additionalTranslationY);
+ : mMenuTranslationYBeforeOpen + additionalTranslationY
+ + expandOffsetTranslationY);
translationYAnim.setInterpolator(EMPHASIZED);
ObjectAnimator menuTranslationYAnim = ObjectAnimator.ofFloat(
diff --git a/quickstep/src/com/android/quickstep/views/TaskView.java b/quickstep/src/com/android/quickstep/views/TaskView.java
index ab51a70..af4f402 100644
--- a/quickstep/src/com/android/quickstep/views/TaskView.java
+++ b/quickstep/src/com/android/quickstep/views/TaskView.java
@@ -408,6 +408,7 @@
new TaskIdAttributeContainer[2];
private boolean mShowScreenshot;
+ private boolean mBorderEnabled;
// The current background requests to load the task thumbnail and icon
@Nullable
@@ -439,8 +440,15 @@
this(context, attrs, defStyleAttr, 0);
}
- public TaskView(
- Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ public TaskView(Context context, @Nullable AttributeSet attrs, int defStyleAttr,
+ int defStyleRes) {
+ this(context, attrs, defStyleAttr, defStyleRes, null, null);
+ }
+
+ @VisibleForTesting
+ public TaskView(Context context, @Nullable AttributeSet attrs, int defStyleAttr,
+ int defStyleRes, BorderAnimator focusBorderAnimator,
+ BorderAnimator hoverBorderAnimator) {
super(context, attrs, defStyleAttr, defStyleRes);
mActivity = StatefulActivity.fromContext(context);
setOnClickListener(this::onClick);
@@ -457,28 +465,35 @@
TypedArray styledAttrs = context.obtainStyledAttributes(
attrs, R.styleable.TaskView, defStyleAttr, defStyleRes);
- mFocusBorderAnimator = keyboardFocusHighlightEnabled
- ? BorderAnimator.createSimpleBorderAnimator(
- /* borderRadiusPx= */ (int) mCurrentFullscreenParams.mCornerRadius,
- /* borderWidthPx= */ context.getResources().getDimensionPixelSize(
- R.dimen.keyboard_quick_switch_border_width),
- /* boundsBuilder= */ this::updateBorderBounds,
- /* targetView= */ this,
- /* borderColor= */ styledAttrs.getColor(
- R.styleable.TaskView_focusBorderColor, DEFAULT_BORDER_COLOR))
- : null;
+ if (focusBorderAnimator != null) {
+ mFocusBorderAnimator = focusBorderAnimator;
+ } else {
+ mFocusBorderAnimator = keyboardFocusHighlightEnabled
+ ? BorderAnimator.createSimpleBorderAnimator(
+ /* borderRadiusPx= */ (int) mCurrentFullscreenParams.mCornerRadius,
+ /* borderWidthPx= */ context.getResources().getDimensionPixelSize(
+ R.dimen.keyboard_quick_switch_border_width),
+ /* boundsBuilder= */ this::updateBorderBounds,
+ /* targetView= */ this,
+ /* borderColor= */ styledAttrs.getColor(
+ R.styleable.TaskView_focusBorderColor, DEFAULT_BORDER_COLOR))
+ : null;
+ }
- mHoverBorderAnimator = cursorHoverStatesEnabled
- ? BorderAnimator.createSimpleBorderAnimator(
- /* borderRadiusPx= */ (int) mCurrentFullscreenParams.mCornerRadius,
- /* borderWidthPx= */ context.getResources().getDimensionPixelSize(
- R.dimen.task_hover_border_width),
- /* boundsBuilder= */ this::updateBorderBounds,
- /* targetView= */ this,
- /* borderColor= */ styledAttrs.getColor(
- R.styleable.TaskView_hoverBorderColor, DEFAULT_BORDER_COLOR))
- : null;
-
+ if (hoverBorderAnimator != null) {
+ mHoverBorderAnimator = hoverBorderAnimator;
+ } else {
+ mHoverBorderAnimator = cursorHoverStatesEnabled
+ ? BorderAnimator.createSimpleBorderAnimator(
+ /* borderRadiusPx= */ (int) mCurrentFullscreenParams.mCornerRadius,
+ /* borderWidthPx= */ context.getResources().getDimensionPixelSize(
+ R.dimen.task_hover_border_width),
+ /* boundsBuilder= */ this::updateBorderBounds,
+ /* targetView= */ this,
+ /* borderColor= */ styledAttrs.getColor(
+ R.styleable.TaskView_hoverBorderColor, DEFAULT_BORDER_COLOR))
+ : null;
+ }
styledAttrs.recycle();
}
@@ -538,24 +553,25 @@
}
@Override
- protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) {
+ @VisibleForTesting(otherwise = VisibleForTesting.PROTECTED)
+ public void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) {
super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
- if (mFocusBorderAnimator != null) {
+ if (mFocusBorderAnimator != null && mBorderEnabled) {
mFocusBorderAnimator.setBorderVisibility(gainFocus, /* animated= */ true);
}
}
@Override
public boolean onHoverEvent(MotionEvent event) {
- if (mHoverBorderAnimator != null) {
+ if (mHoverBorderAnimator != null && mBorderEnabled) {
switch (event.getAction()) {
case MotionEvent.ACTION_HOVER_ENTER:
- mHoverBorderAnimator.setBorderVisibility(
- /* visible= */ true, /* animated= */ true);
+ mHoverBorderAnimator.setBorderVisibility(/* visible= */ true, /* animated= */
+ true);
break;
case MotionEvent.ACTION_HOVER_EXIT:
- mHoverBorderAnimator.setBorderVisibility(
- /* visible= */ false, /* animated= */ true);
+ mHoverBorderAnimator.setBorderVisibility(/* visible= */ false, /* animated= */
+ true);
break;
default:
break;
@@ -564,6 +580,24 @@
return super.onHoverEvent(event);
}
+ /**
+ * Enable or disable showing border on hover and focus change
+ */
+ public void setBorderEnabled(boolean enabled) {
+ mBorderEnabled = enabled;
+ // Set the animation correctly in case it misses the hover/focus event during state
+ // transition
+ if (mHoverBorderAnimator != null) {
+ mHoverBorderAnimator.setBorderVisibility(/* visible= */
+ enabled && isHovered(), /* animated= */ true);
+ }
+
+ if (mFocusBorderAnimator != null) {
+ mFocusBorderAnimator.setBorderVisibility(/* visible= */
+ enabled && isFocused(), /* animated= */true);
+ }
+ }
+
@Override
public boolean onInterceptHoverEvent(MotionEvent event) {
if (enableCursorHoverStates()) {
@@ -630,7 +664,7 @@
return;
}
mModalness = modalness;
- mIconView.setAlpha(1 - modalness);
+ mIconView.setContentAlpha(1 - modalness);
mDigitalWellBeingToast.updateBannerOffset(modalness);
}
@@ -1253,7 +1287,7 @@
float upperClamp = invert ? 1 : iconScalePercentage;
float scale = Interpolators.clampToProgress(FAST_OUT_SLOW_IN, lowerClamp, upperClamp)
.getInterpolation(progress);
- mIconView.setAlpha(scale);
+ mIconView.setContentAlpha(scale);
mDigitalWellBeingToast.updateBannerOffset(1f - scale);
}
@@ -1327,6 +1361,7 @@
mSnapshotView.setThumbnail(mTask, null);
setOverlayEnabled(false);
onTaskListVisibilityChanged(false);
+ mBorderEnabled = false;
}
public float getTaskCornerRadius() {
diff --git a/quickstep/src/com/android/quickstep/views/TaskViewIcon.java b/quickstep/src/com/android/quickstep/views/TaskViewIcon.java
index b4f21be..4e82725 100644
--- a/quickstep/src/com/android/quickstep/views/TaskViewIcon.java
+++ b/quickstep/src/com/android/quickstep/views/TaskViewIcon.java
@@ -40,7 +40,7 @@
/**
* Sets the opacity of the view.
*/
- void setAlpha(float alpha);
+ void setContentAlpha(float alpha);
/**
* Returns this icon view's drawable.
diff --git a/quickstep/tests/src/com/android/quickstep/AbstractTaplTestsTaskbar.java b/quickstep/tests/src/com/android/quickstep/AbstractTaplTestsTaskbar.java
index ba9ae67..fc757b4 100644
--- a/quickstep/tests/src/com/android/quickstep/AbstractTaplTestsTaskbar.java
+++ b/quickstep/tests/src/com/android/quickstep/AbstractTaplTestsTaskbar.java
@@ -25,7 +25,6 @@
import com.android.launcher3.tapl.LauncherInstrumentation;
import com.android.launcher3.tapl.Taskbar;
import com.android.launcher3.ui.AbstractLauncherUiTest;
-import com.android.launcher3.ui.TaplTestsLauncher3;
import com.android.launcher3.util.DisplayController;
import com.android.launcher3.util.LauncherLayoutBuilder;
import com.android.launcher3.util.TestUtil;
@@ -55,7 +54,7 @@
"com.google.android.apps.nexuslauncher.tests",
"com.android.launcher3.testcomponent.BaseTestingActivity");
mLauncherLayout = TestUtil.setLauncherDefaultLayout(mTargetContext, layoutBuilder);
- TaplTestsLauncher3.initialize(this);
+ AbstractLauncherUiTest.initialize(this);
startAppFast(CALCULATOR_APP_PACKAGE);
mLauncher.enableBlockTimeout(true);
mLauncher.showTaskbarIfHidden();
diff --git a/quickstep/tests/src/com/android/quickstep/StartLauncherViaGestureTests.java b/quickstep/tests/src/com/android/quickstep/StartLauncherViaGestureTests.java
index a89eab5..85440e9 100644
--- a/quickstep/tests/src/com/android/quickstep/StartLauncherViaGestureTests.java
+++ b/quickstep/tests/src/com/android/quickstep/StartLauncherViaGestureTests.java
@@ -22,7 +22,7 @@
import androidx.test.filters.LargeTest;
import androidx.test.runner.AndroidJUnit4;
-import com.android.launcher3.ui.TaplTestsLauncher3;
+import com.android.launcher3.ui.AbstractLauncherUiTest;
import com.android.launcher3.util.rule.TestStabilityRule.Stability;
import com.android.quickstep.NavigationModeSwitchRule.NavigationModeSwitch;
@@ -40,7 +40,7 @@
@Before
public void setUp() throws Exception {
super.setUp();
- TaplTestsLauncher3.initialize(this);
+ AbstractLauncherUiTest.initialize(this);
// b/143488140
mLauncher.goHome();
// Start an activity where the gestures start.
@@ -49,6 +49,8 @@
@Test
@NavigationModeSwitch
+ // Stress tests are long. We permanently demote them from presubmit to match the presubmit SLO.
+ @Stability(flavors = LOCAL | PLATFORM_POSTSUBMIT)
public void testStressPressHome() {
for (int i = 0; i < STRESS_REPEAT_COUNT; ++i) {
// Destroy Launcher activity.
@@ -61,7 +63,8 @@
@Test
@NavigationModeSwitch
- @Stability(flavors = LOCAL | PLATFORM_POSTSUBMIT) // b/187761685
+ // Stress tests are long. We permanently demote them from presubmit to match the presubmit SLO.
+ @Stability(flavors = LOCAL | PLATFORM_POSTSUBMIT)
public void testStressSwipeToOverview() {
for (int i = 0; i < STRESS_REPEAT_COUNT; ++i) {
// Destroy Launcher activity.
diff --git a/quickstep/tests/src/com/android/quickstep/TaplOverviewIconTest.java b/quickstep/tests/src/com/android/quickstep/TaplOverviewIconTest.java
index c4c95bc..3f806d1 100644
--- a/quickstep/tests/src/com/android/quickstep/TaplOverviewIconTest.java
+++ b/quickstep/tests/src/com/android/quickstep/TaplOverviewIconTest.java
@@ -15,7 +15,7 @@
*/
package com.android.quickstep;
-import static com.android.launcher3.ui.TaplTestsLauncher3.initialize;
+import static com.android.launcher3.ui.AbstractLauncherUiTest.initialize;
import static com.android.launcher3.util.rule.TestStabilityRule.LOCAL;
import static com.android.launcher3.util.rule.TestStabilityRule.PLATFORM_POSTSUBMIT;
diff --git a/quickstep/tests/src/com/android/quickstep/TaplTestsKeyboardQuickSwitch.java b/quickstep/tests/src/com/android/quickstep/TaplTestsKeyboardQuickSwitch.java
index 74f37a4..829e54b 100644
--- a/quickstep/tests/src/com/android/quickstep/TaplTestsKeyboardQuickSwitch.java
+++ b/quickstep/tests/src/com/android/quickstep/TaplTestsKeyboardQuickSwitch.java
@@ -22,7 +22,7 @@
import androidx.test.runner.AndroidJUnit4;
import com.android.launcher3.tapl.KeyboardQuickSwitch;
-import com.android.launcher3.ui.TaplTestsLauncher3;
+import com.android.launcher3.ui.AbstractLauncherUiTest;
import org.junit.Assume;
import org.junit.Test;
@@ -56,7 +56,7 @@
public void setUp() throws Exception {
Assume.assumeTrue(mLauncher.isTablet());
super.setUp();
- TaplTestsLauncher3.initialize(this);
+ AbstractLauncherUiTest.initialize(this);
startAppFast(CALCULATOR_APP_PACKAGE);
startTestActivity(2);
}
diff --git a/quickstep/tests/src/com/android/quickstep/TaplTestsQuickstep.java b/quickstep/tests/src/com/android/quickstep/TaplTestsQuickstep.java
index 8e142c3..b3cc215 100644
--- a/quickstep/tests/src/com/android/quickstep/TaplTestsQuickstep.java
+++ b/quickstep/tests/src/com/android/quickstep/TaplTestsQuickstep.java
@@ -45,8 +45,8 @@
import com.android.launcher3.tapl.Overview;
import com.android.launcher3.tapl.OverviewActions;
import com.android.launcher3.tapl.OverviewTask;
+import com.android.launcher3.ui.AbstractLauncherUiTest;
import com.android.launcher3.ui.PortraitLandscapeRunner.PortraitLandscape;
-import com.android.launcher3.ui.TaplTestsLauncher3;
import com.android.launcher3.util.Wait;
import com.android.launcher3.util.rule.ScreenRecordRule.ScreenRecord;
import com.android.launcher3.util.rule.TestStabilityRule;
@@ -72,7 +72,7 @@
@Before
public void setUp() throws Exception {
super.setUp();
- TaplTestsLauncher3.initialize(this);
+ AbstractLauncherUiTest.initialize(this);
executeOnLauncher(launcher -> {
RecentsView recentsView = launcher.getOverviewPanel();
recentsView.getPagedViewOrientedState().forceAllowRotationForTesting(true);
diff --git a/quickstep/tests/src/com/android/quickstep/TaplTestsSplitscreen.java b/quickstep/tests/src/com/android/quickstep/TaplTestsSplitscreen.java
index 234fe63..1e33635 100644
--- a/quickstep/tests/src/com/android/quickstep/TaplTestsSplitscreen.java
+++ b/quickstep/tests/src/com/android/quickstep/TaplTestsSplitscreen.java
@@ -32,15 +32,14 @@
import com.android.launcher3.tapl.Overview;
import com.android.launcher3.tapl.Taskbar;
import com.android.launcher3.tapl.TaskbarAppIcon;
+import com.android.launcher3.ui.AbstractLauncherUiTest;
import com.android.launcher3.ui.PortraitLandscapeRunner.PortraitLandscape;
-import com.android.launcher3.ui.TaplTestsLauncher3;
import com.android.launcher3.util.rule.TestStabilityRule;
import com.android.quickstep.TaskbarModeSwitchRule.TaskbarModeSwitch;
import com.android.wm.shell.Flags;
import org.junit.After;
import org.junit.Before;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -58,7 +57,7 @@
@Before
public void setUp() throws Exception {
super.setUp();
- TaplTestsLauncher3.initialize(this);
+ AbstractLauncherUiTest.initialize(this);
if (mLauncher.isTablet()) {
mLauncher.enableBlockTimeout(true);
diff --git a/quickstep/tests/src/com/android/quickstep/TaplTestsTrackpad.java b/quickstep/tests/src/com/android/quickstep/TaplTestsTrackpad.java
index 907dbcc..0eec8b7 100644
--- a/quickstep/tests/src/com/android/quickstep/TaplTestsTrackpad.java
+++ b/quickstep/tests/src/com/android/quickstep/TaplTestsTrackpad.java
@@ -19,7 +19,6 @@
import static com.android.quickstep.NavigationModeSwitchRule.Mode.ZERO_BUTTON;
import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
import static org.junit.Assume.assumeFalse;
import static org.junit.Assume.assumeTrue;
@@ -32,8 +31,8 @@
import com.android.launcher3.config.FeatureFlags;
import com.android.launcher3.tapl.LauncherInstrumentation.TrackpadGestureType;
import com.android.launcher3.tapl.Workspace;
+import com.android.launcher3.ui.AbstractLauncherUiTest;
import com.android.launcher3.ui.PortraitLandscapeRunner.PortraitLandscape;
-import com.android.launcher3.ui.TaplTestsLauncher3;
import com.android.quickstep.NavigationModeSwitchRule.NavigationModeSwitch;
import org.junit.After;
@@ -51,7 +50,7 @@
@Before
public void setUp() throws Exception {
super.setUp();
- TaplTestsLauncher3.initialize(this);
+ AbstractLauncherUiTest.initialize(this);
}
@After
diff --git a/quickstep/tests/src/com/android/quickstep/TaskViewTest.java b/quickstep/tests/src/com/android/quickstep/TaskViewTest.java
new file mode 100644
index 0000000..d744194
--- /dev/null
+++ b/quickstep/tests/src/com/android/quickstep/TaskViewTest.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.quickstep;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.pm.ApplicationInfo;
+import android.content.res.Configuration;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.graphics.Rect;
+import android.util.DisplayMetrics;
+import android.view.MotionEvent;
+
+import androidx.test.filters.SmallTest;
+
+import com.android.launcher3.statemanager.StatefulActivity;
+import com.android.quickstep.util.BorderAnimator;
+import com.android.quickstep.views.TaskView;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+@SmallTest
+public class TaskViewTest {
+
+ @Mock
+ private StatefulActivity mContext;
+ @Mock
+ private Resources mResource;
+ @Mock
+ private BorderAnimator mHoverAnimator;
+ @Mock
+ private BorderAnimator mFocusAnimator;
+ private TaskView mTaskView;
+
+ @Before
+ public void setup() {
+ MockitoAnnotations.initMocks(this);
+ when(mResource.getDisplayMetrics()).thenReturn(mock(DisplayMetrics.class));
+ when(mResource.getConfiguration()).thenReturn(new Configuration());
+
+ when(mContext.getResources()).thenReturn(mResource);
+ when(mContext.getTheme()).thenReturn(mock(Resources.Theme.class));
+ when(mContext.getApplicationInfo()).thenReturn(mock(ApplicationInfo.class));
+ when(mContext.obtainStyledAttributes(any(), any(), anyInt(), anyInt())).thenReturn(
+ mock(TypedArray.class));
+
+ mTaskView = new TaskView(mContext, null, 0, 0, mFocusAnimator, mHoverAnimator);
+ }
+
+ @Test
+ public void notShowBorderOnBorderDisabled() {
+ mTaskView.setBorderEnabled(/* enabled= */ false);
+ MotionEvent event = MotionEvent.obtain(0, 0, MotionEvent.ACTION_HOVER_ENTER, 0.0f, 0.0f, 0);
+ mTaskView.onHoverEvent(MotionEvent.obtain(event));
+ verify(mHoverAnimator, never()).setBorderVisibility(/* visible= */ true, /* animated= */
+ true);
+
+ mTaskView.onFocusChanged(false, 0, new Rect());
+ verify(mFocusAnimator, never()).setBorderVisibility(/* visible= */ true, /* animated= */
+ true);
+ }
+
+ @Test
+ public void showBorderOnBorderEnabled() {
+ mTaskView.setBorderEnabled(/* enabled= */ true);
+ MotionEvent event = MotionEvent.obtain(0, 0, MotionEvent.ACTION_HOVER_ENTER, 0.0f, 0.0f, 0);
+ mTaskView.onHoverEvent(MotionEvent.obtain(event));
+ verify(mHoverAnimator, times(1)).setBorderVisibility(/* visible= */ true, /* animated= */
+ true);
+ mTaskView.onFocusChanged(true, 0, new Rect());
+ verify(mFocusAnimator, times(1)).setBorderVisibility(/* visible= */ true, /* animated= */
+ true);
+ }
+
+ @Test
+ public void hideBorderOnBorderDisabled() {
+ mTaskView.setBorderEnabled(/* enabled= */ false);
+ verify(mHoverAnimator, times(1)).setBorderVisibility(/* visible= */ false, /* animated= */
+ true);
+ verify(mFocusAnimator, times(1)).setBorderVisibility(/* visible= */ false, /* animated= */
+ true);
+ }
+
+ @Test
+ public void notShowBorderByDefault() {
+ MotionEvent event = MotionEvent.obtain(0, 0, MotionEvent.ACTION_HOVER_ENTER, 0.0f, 0.0f, 0);
+ mTaskView.onHoverEvent(MotionEvent.obtain(event));
+ verify(mHoverAnimator, never()).setBorderVisibility(/* visible= */ false, /* animated= */
+ true);
+ mTaskView.onFocusChanged(true, 0, new Rect());
+ verify(mHoverAnimator, never()).setBorderVisibility(/* visible= */ false, /* animated= */
+ true);
+ }
+}
diff --git a/quickstep/tests/src/com/android/quickstep/ViewInflationDuringSwipeUp.java b/quickstep/tests/src/com/android/quickstep/ViewInflationDuringSwipeUp.java
index 8cc8487..2318f54 100644
--- a/quickstep/tests/src/com/android/quickstep/ViewInflationDuringSwipeUp.java
+++ b/quickstep/tests/src/com/android/quickstep/ViewInflationDuringSwipeUp.java
@@ -56,7 +56,7 @@
import com.android.launcher3.testcomponent.ListViewService;
import com.android.launcher3.testcomponent.ListViewService.SimpleViewsFactory;
import com.android.launcher3.testcomponent.TestCommandReceiver;
-import com.android.launcher3.ui.TaplTestsLauncher3;
+import com.android.launcher3.ui.AbstractLauncherUiTest;
import com.android.launcher3.ui.TestViewHelpers;
import com.android.launcher3.util.Executors;
import com.android.launcher3.widget.LauncherAppWidgetProviderInfo;
@@ -102,7 +102,7 @@
// is started only after starting another app.
startAppFast(resolveSystemApp(Intent.CATEGORY_APP_CALCULATOR));
- TaplTestsLauncher3.initialize(this);
+ AbstractLauncherUiTest.initialize(this);
mModel = LauncherAppState.getInstance(mTargetContext).getModel();
Executors.MODEL_EXECUTOR.submit(mModel.getModelDbController()::createEmptyDB).get();
diff --git a/res/drawable/ic_drag_handle.xml b/res/drawable/ic_drag_handle.xml
deleted file mode 100644
index 9db75f4..0000000
--- a/res/drawable/ic_drag_handle.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2016 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="@dimen/deep_shortcut_drag_handle_size"
- android:height="@dimen/deep_shortcut_drag_handle_size"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0"
- android:tint="?android:attr/textColorPrimary" >
-
- <path
- android:pathData="M20,9H4v2h16V9z M4,15h16v-2H4V15z"
- android:fillColor="@android:color/white" />
-</vector>
\ No newline at end of file
diff --git a/res/drawable/icon_menu_elevation_background.xml b/res/drawable/icon_menu_elevation_background.xml
new file mode 100644
index 0000000..16e3fe2
--- /dev/null
+++ b/res/drawable/icon_menu_elevation_background.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2023 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
+ android:shape="rectangle">
+ <solid android:color="?androidprv:attr/materialColorSurfaceBright" />
+ <corners android:radius="@dimen/task_thumbnail_icon_menu_corner_radius" />
+</shape>
\ No newline at end of file
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index a5983b9..ea6e0fa 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -172,18 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Onderbreek werkprogramme"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Hervat"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filter"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Deursoek jou foon"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Deursoek jou tablet"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Misluk: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Privaat ruimte"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
- <!-- no translation found for bubble_bar_overflow_description (7410995531938041192) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Privaat"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Privaat Ruimte-instellings"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Sluit/ontsluit Privaat Ruimte"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Privaat Ruimte-oorgang"</string>
+ <string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Oorvloei"</string>
</resources>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index a6a1d24..893f4c4 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -172,17 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"የሥራ መተግበሪያዎችን ባሉበት አቁም"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"ካቆመበት ቀጥል"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"አጣራ"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"ስልክዎን ይፈልጉ"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"ጡባዊዎን ይፈልጉ"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"አልተሳካም፦ <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"የግል ቦታ"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"የግል"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"የግል ቦታ ቅንብሮች"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"የግል ቦታን ቆልፍ/ክፈት"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"የግል ቦታ ሽግግር"</string>
<string name="bubble_bar_overflow_description" msgid="7410995531938041192">"ትርፍ ፍሰት"</string>
</resources>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 95f6d10..a2a43db 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -172,18 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"إيقاف تطبيقات العمل مؤقتًا"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"إلغاء الإيقاف المؤقت"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"فلتر"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"البحث في هاتفك"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"البحث في جهازك اللوحي"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"تعذَّر <xliff:g id="WHAT">%1$s</xliff:g>."</string>
<string name="private_space_label" msgid="2359721649407947001">"مساحة خاصة"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
- <!-- no translation found for bubble_bar_overflow_description (7410995531938041192) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"المساحة الخاصة"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"إعدادات المساحة الخاصة"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"قفل المساحة الخاصة أو فتح قفلها"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"النقل إلى المساحة الخاصة"</string>
+ <string name="bubble_bar_overflow_description" msgid="7410995531938041192">"القائمة الكاملة"</string>
</resources>
diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml
index 9b2b341..93c5e3a 100644
--- a/res/values-as/strings.xml
+++ b/res/values-as/strings.xml
@@ -172,17 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"কৰ্মস্থানৰ এপ্ পজ কৰক"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"আনপজ কৰক"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"ফিল্টাৰ"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"আপোনাৰ ফ’নৰ বস্তু সন্ধান কৰক"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"আপোনাৰ টেবলেটৰ বস্তু সন্ধান কৰক"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"বিফল: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"ব্যক্তিগত স্পে’চ"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"ব্যক্তিগত"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"ব্যক্তিগত স্পে’চৰ ছেটিং"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"ব্যক্তিগত স্পে’চ লক/আনলক কৰক"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"ব্যক্তিগত স্পে’চৰ স্থানান্তৰণ"</string>
<string name="bubble_bar_overflow_description" msgid="7410995531938041192">"অ’ভাৰফ্ল’"</string>
</resources>
diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml
index 004d598..31d485d 100644
--- a/res/values-az/strings.xml
+++ b/res/values-az/strings.xml
@@ -172,18 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"İş tətbiqlərini durdurun"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Davam etdirin"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filtr"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Telefonunuzu axtarın"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Planşetinizi axtarın"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Alınmadı: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Şəxsi yer"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
- <!-- no translation found for bubble_bar_overflow_description (7410995531938041192) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Şəxsi"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Şəxsi məkan ayarları"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Şəxsi məkanı kilidləyin/kiliddən çıxarın"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Şəxsi məkana keçid"</string>
+ <string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Kənara çıxma"</string>
</resources>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index 8187b6e..aa08cc4 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -172,17 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Pauziraj poslovne aplikacije"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Ponovo aktiviraj"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filter"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Pretražite telefon"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Pretražite tablet"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Nije uspelo: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Privatni prostor"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Privatno"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Podešavanja privatnog prostora"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Zaključaj/otključaj privatni prostor"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Prenos privatnog prostora"</string>
<string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Preklopno"</string>
</resources>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index 31c5cd0..ae47fa0 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -172,18 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Прыпыніць працоўныя праграмы"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Актываваць"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Фільтр"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Пошук на тэлефоне"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Пошук на планшэце"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Не ўдалося: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Прыватная вобласць"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
- <!-- no translation found for bubble_bar_overflow_description (7410995531938041192) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Прыватная"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Налады прыватнай вобласці"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Заблакіраваць (разблакіраваць) прыватную вобласць"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Пераход у прыватную вобласць"</string>
+ <string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Дадатковае меню"</string>
</resources>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 4fb4848..2f196ca 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -172,18 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Поставяне на пауза на служебните приложения"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Отмяна на паузата"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Филтър"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Търсене в телефона ви"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Търсене в таблета ви"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Неуспешно: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Лично пространство"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
- <!-- no translation found for bubble_bar_overflow_description (7410995531938041192) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Лично"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Настройки за личното пространство"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Заключване/отключване на личното пространство"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Преминаване към личното пространство"</string>
+ <string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Препълване"</string>
</resources>
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
index 324bfbc..8c08794 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -172,18 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"অফিসের অ্যাপ পজ করুন"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"আনপজ করুন"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"ফিল্টার"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"ফোনে সার্চ করে দেখুন"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"আপনার ট্যাবলেটে সার্চ করুন"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"কাজটি করা যায়নি: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"ব্যক্তিগত স্পেস"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
- <!-- no translation found for bubble_bar_overflow_description (7410995531938041192) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"ব্যক্তিগত"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"ব্যক্তিগত স্পেসের সেটিংস"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"ব্যক্তিগত স্পেস লক/আনলক করুন"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"ব্যক্তিগত স্পেস ট্রানজিট করা"</string>
+ <string name="bubble_bar_overflow_description" msgid="7410995531938041192">"ওভারফ্লো"</string>
</resources>
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
index 2e90423..9641416 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -172,17 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Pauziraj poslovne aplikacije"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Ponovo pokreni"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filtrirajte"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Pretražite telefon"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Pretražite tablet"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Nije uspjelo: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Privatan prostor"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Privatno"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Postavke privatnog prostora"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Zaključavanje/otključavanje privatnog prostora"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Prelazak u privatan prostor"</string>
<string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Preklopni meni"</string>
</resources>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 7796a9f..25a8ce6 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -172,18 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Posa en pausa les aplicacions de treball"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Reactiva"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filtra"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Cerca al telèfon"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Cerca a la tauleta"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Error: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Espai privat"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
- <!-- no translation found for bubble_bar_overflow_description (7410995531938041192) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Privat"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Configuració d\'Espai privat"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Bloqueja o desbloqueja Espai privat"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Canvia a Espai privat"</string>
+ <string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Menú addicional"</string>
</resources>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index ddb4cca..4927508 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -172,17 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Pozastavit pracovní aplikace"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Zrušit pozastavení"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filtr"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Prohledávání telefonu"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Vyhledávání na tabletu"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Selhalo: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Soukromý prostor"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Soukromé"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Nastavení soukromého prostoru"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Zamknout/odemknout soukromý prostor"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Převádění soukromého prostoru"</string>
<string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Rozbalovací nabídka"</string>
</resources>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 5127abb..9d5a55f 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -172,18 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Sæt arbejdsapps på pause"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Genoptag"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filter"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Søg på din telefon"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Søg på din tablet"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Mislykket: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Privat rum"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
- <!-- no translation found for bubble_bar_overflow_description (7410995531938041192) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Privat"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Indstillinger for privat rum"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Lås/oplås det private rum"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Ændringer af tilstanden for det private rum"</string>
+ <string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Overløb"</string>
</resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 0050f2c..29dcca1 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -172,17 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Geschäftliche Apps pausieren"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Nicht mehr pausieren"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filter"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Auf dem Smartphone suchen"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Auf dem Tablet suchen"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Fehler: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Privater Bereich"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Privat"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Einstellungen für privaten Bereich"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Privaten Bereich sperren/entsperren"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Umstellung des privaten Bereichs"</string>
<string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Weitere Optionen"</string>
</resources>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 4a6338a..bc8458b 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -172,17 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Παύση εφαρμογών εργασιών"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Αναίρεση παύσης"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Φίλτρο"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Αναζήτηση στο τηλέφωνό σας"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Αναζήτηση στο tablet σας"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Αποτυχία: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Ιδιωτικός χώρος"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Ιδιωτικό"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Ρυθμίσεις Ιδιωτικού χώρου"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Κλείδωμα/Ξεκλείδωμα Ιδιωτικού χώρου"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Μετάβαση στον Ιδιωτικό χώρο"</string>
<string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Υπερχείλιση"</string>
</resources>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index 6c5ef3d..c002ef9 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -172,17 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Pause work apps"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Unpause"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filter"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Search your phone"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Search your tablet"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Failed: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Private space"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Private"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Private Space Settings"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Lock/Unlock Private Space"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Private Space transitioning"</string>
<string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Overflow"</string>
</resources>
diff --git a/res/values-en-rCA/strings.xml b/res/values-en-rCA/strings.xml
index 250de73..1ad42f3 100644
--- a/res/values-en-rCA/strings.xml
+++ b/res/values-en-rCA/strings.xml
@@ -172,17 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Pause work apps"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Unpause"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filter"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Search your phone"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Search your tablet"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Failed: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Private space"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Private"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Private Space Settings"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Lock/Unlock Private Space"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Private Space Transitioning"</string>
<string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Overflow"</string>
</resources>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index 6c5ef3d..c002ef9 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -172,17 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Pause work apps"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Unpause"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filter"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Search your phone"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Search your tablet"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Failed: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Private space"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Private"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Private Space Settings"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Lock/Unlock Private Space"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Private Space transitioning"</string>
<string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Overflow"</string>
</resources>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index 6c5ef3d..c002ef9 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -172,17 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Pause work apps"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Unpause"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filter"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Search your phone"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Search your tablet"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Failed: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Private space"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Private"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Private Space Settings"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Lock/Unlock Private Space"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Private Space transitioning"</string>
<string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Overflow"</string>
</resources>
diff --git a/res/values-en-rXC/strings.xml b/res/values-en-rXC/strings.xml
index d05c553..81bb474 100644
--- a/res/values-en-rXC/strings.xml
+++ b/res/values-en-rXC/strings.xml
@@ -172,17 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Pause work apps"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Unpause"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filter"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Search your phone"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Search your tablet"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Failed: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Private space"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Private"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Private Space Settings"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Lock/Unlock Private Space"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Private Space Transitioning"</string>
<string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Overflow"</string>
</resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index f6c8a27..d37b1e9 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -172,17 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Detener apps de trabajo"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Reanudar"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filtro"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Busca tu teléfono"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Busca en tu tablet"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Error: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Espacio privado"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Privado"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Configuración de Espacio privado"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Bloquear o desbloquear Espacio privado"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Pasar a Espacio privado"</string>
<string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Ampliada"</string>
</resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index d607d45..7db8239 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -172,18 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Pausar aplicaciones de trabajo"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Reanudar"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filtro"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Busca en tu teléfono"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Buscar en tu tablet"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Se ha producido un error: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Espacio privado"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
- <!-- no translation found for bubble_bar_overflow_description (7410995531938041192) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Privado"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Ajustes del espacio privado"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Bloquear/Desbloquear espacio privado"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Cambiar a espacio privado"</string>
+ <string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Desplegable"</string>
</resources>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index 0946ba6..9e4a534 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -172,18 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Peata töörakendused"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Lõpeta peatamine"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filter"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Otsimine telefonist"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Otsimine tahvelarvutist"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Nurjus: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Privaatne ruum"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
- <!-- no translation found for bubble_bar_overflow_description (7410995531938041192) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Privaatne"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Privaatse ruumi seaded"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Privaatse ruumi lukustamine/avamine"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Privaatse ruumi üleviimine"</string>
+ <string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Ületäide"</string>
</resources>
diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml
index f0acbb8..4123096 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -172,18 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Pausatu laneko aplikazioak"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Aktibatu berriro"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Iragazi"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Bilatu telefonoan"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Bilatu tabletan"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Huts egin du: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Eremu pribatua"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
- <!-- no translation found for bubble_bar_overflow_description (7410995531938041192) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Pribatua"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Eremu pribatuaren ezarpenak"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Blokeatu/Desblokeatu eremu pribatua"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Eremu pribaturako trantsizioa"</string>
+ <string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Luzapena"</string>
</resources>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 18ebbfc..161c7c5 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -172,17 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"توقف موقت برنامههای کاری"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"ازسرگیری"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"فیلتر"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"جستجوی تلفن"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"جستجوی رایانه لوحی"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"ناموفق بود: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"فضای خصوصی"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"خصوصی"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"تنظیمات «فضای خصوصی»"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"قفل/ باز کردن «فضای خصوصی»"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"انتقال «فضای خصوصی»"</string>
<string name="bubble_bar_overflow_description" msgid="7410995531938041192">"سرریز"</string>
</resources>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 50d5af6..87e3040 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -172,18 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Keskeytä työsovellusten käyttö"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Jatka"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Suodatin"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Hae puhelimesta"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Hae tabletilta"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Epäonnistui: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Yksityinen tila"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
- <!-- no translation found for bubble_bar_overflow_description (7410995531938041192) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Yksityinen"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Yksityisen tilan asetukset"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Lukitse yksityinen tila / avaa sen lukitus"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Yksityisen tilan siirtäminen"</string>
+ <string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Ylivuoto"</string>
</resources>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 4791aa1..0e8fe9c 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -172,18 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Mettre en pause les applications professionnelles"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Réactiver"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filtrer"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Rechercher sur votre téléphone"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Rechercher sur votre tablette"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Échec : <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Espace privé"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
- <!-- no translation found for bubble_bar_overflow_description (7410995531938041192) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Privé"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Paramètres de l\'Espace privé"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Verrouiller/Déverrouiller l\'Espace privé"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Transition vers l\'Espace privé"</string>
+ <string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Menu à développer"</string>
</resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 62f9aa8..9aa6ad2 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -172,17 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Mettre en pause les applis professionnelles"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Réactiver"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filtre"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Rechercher sur votre téléphone"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Rechercher sur votre tablette"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Échec : <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Espace privé"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Privé"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Paramètres d\'Espace privé"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Verrouiller/Déverrouiller Espace privé"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Transition vers Espace privé"</string>
<string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Dépassement"</string>
</resources>
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index 346d46f..4eda3cf 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -172,18 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Pór en pausa aplicacións do traballo"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Volver activar"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filtra"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Buscar no teléfono"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Facer buscas na tableta"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Erro: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Espazo privado"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
- <!-- no translation found for bubble_bar_overflow_description (7410995531938041192) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Privado"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Configuración do espazo privado"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Bloquear ou desbloquear o espazo privado"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Transición ao espazo privado"</string>
+ <string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Menú adicional"</string>
</resources>
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
index 36cb129..deaee86 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -172,17 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"ઑફિસની ઍપ થોભાવો"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"ફરી ચાલુ કરો"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"ફિલ્ટર કરો"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"તમારો ફોન શોધો"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"તમારું ટૅબ્લેટ શોધો"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"નિષ્ફળ: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"ખાનગી સ્પેસ"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"ખાનગી"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"ખાનગી સ્પેસના સેટિંગ"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"ખાનગી સ્પેસને લૉક/અનલૉક કરો"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"ખાનગી સ્પેસ પર સ્થાનાંતરણ"</string>
<string name="bubble_bar_overflow_description" msgid="7410995531938041192">"ઓવરફ્લો"</string>
</resources>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index ea53a5c..52bc50a 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -172,17 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"वर्क ऐप्लिकेशन रोकें"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"चालू करें"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"फ़िल्टर"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"अपने फ़ोन में खोजें"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"अपने टैबलेट में खोजें"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"पूरा नहीं हुआ: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"प्राइवेट स्पेस"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"निजी"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"प्राइवेट स्पेस सेटिंग"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"प्राइवेट स्पेस को लॉक करें/अनलॉक करें"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"प्राइवेट स्पेस की सेटिंग में बदलाव किया जा रहा है"</string>
<string name="bubble_bar_overflow_description" msgid="7410995531938041192">"ओवरफ़्लो"</string>
</resources>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 7dc7923..9694428 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -172,17 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Pauziraj poslovne aplikacije"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Ponovno pokreni"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filtrirajte"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Pretraživanje telefona"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Pretraživanje tableta"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Nije uspjelo: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Privatni prostor"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Privatno"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Postavke privatnog prostora"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Zaključavanje/otključavanje privatnog prostora"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Prelazak na privatni prostor"</string>
<string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Dodatni izbornik"</string>
</resources>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index afeb7c0..7c83ec0 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -172,17 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Munkahelyi alkalmazások szüneteltetése"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Folytatás"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Szűrő"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Keresés a telefonon"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Keresés a táblagépen"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Sikertelen: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Privát terület"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Privát"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Privát terület beállításai"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Privát terület zárolása/zárolásának feloldása"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Átállás privát területre…"</string>
<string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Túlcsordulás"</string>
</resources>
diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml
index 44be7e3..7aa432b 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -172,18 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Դադարեցնել աշխատանքային հավելվածները"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Վերսկսել"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Զտեք"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Որոնում հեռախոսում"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Որոնում պլանշետում"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Չհաջողվեց կատարել գործողությունը (<xliff:g id="WHAT">%1$s</xliff:g>)"</string>
<string name="private_space_label" msgid="2359721649407947001">"Անձնական տարածք"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
- <!-- no translation found for bubble_bar_overflow_description (7410995531938041192) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Անձնական"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Անձնական տարածքի կարգավորումներ"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Կողպել/ապակողպել անձնական տարածքը"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Անցում անձնական տարածք"</string>
+ <string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Լրացուցիչ ընտրացանկ"</string>
</resources>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 3a8347c..e3bd5e7 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -172,18 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Jeda aplikasi kerja"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Aktifkan lagi"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filter"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Telusuri di ponsel"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Telusuri di tablet"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Gagal: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Ruang pribadi"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
- <!-- no translation found for bubble_bar_overflow_description (7410995531938041192) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Pribadi"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Setelan Ruang Pribadi"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Kunci/Buka Kunci Ruang Pribadi"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Transisi Ruang Pribadi"</string>
+ <string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Menu tambahan"</string>
</resources>
diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml
index cb493a8..4ba0623 100644
--- a/res/values-is/strings.xml
+++ b/res/values-is/strings.xml
@@ -172,18 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Setja vinnuforrit í bið"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Ljúka hléi"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Sía"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Leita í símanum"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Leita í spjaldtölvunni"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Mistókst: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Einkarými"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
- <!-- no translation found for bubble_bar_overflow_description (7410995531938041192) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Lokað"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Stillingar einkarýmis"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Læsaeinkarými/taka einkarými úr lás"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Einkarými að breytast"</string>
+ <string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Yfirflæði"</string>
</resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 4bd1661..644d680 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -172,18 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Metti in pausa le app di lavoro"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Riattiva"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filtra"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Ricerche sul telefono"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Ricerche sul tablet"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Operazione non riuscita: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Spazio privato"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
- <!-- no translation found for bubble_bar_overflow_description (7410995531938041192) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Privato"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Impostazioni dello Spazio privato"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Blocca/sblocca Spazio privato"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Transizione dello Spazio privato in corso…"</string>
+ <string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Extra"</string>
</resources>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 5c2fe1a..c91e57c 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -172,18 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"השהיית האפליקציות לעבודה"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"ביטול ההשהיה"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"סינון"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"חיפוש בטלפון"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"חיפוש בטאבלט"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"הפעולה נכשלה: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"מרחב פרטי"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
- <!-- no translation found for bubble_bar_overflow_description (7410995531938041192) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"פרטי"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"הגדרות המרחב הפרטי"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"נעילה או ביטול הנעילה של המרחב הפרטי"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"מעבר למרחב הפרטי"</string>
+ <string name="bubble_bar_overflow_description" msgid="7410995531938041192">"אפשרויות נוספות"</string>
</resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 402d2b6..00b061f 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -172,17 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"仕事用アプリを一時停止"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"停止解除"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"フィルタ"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"スマートフォンを検索"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"タブレットを探す"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"失敗: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"プライベート スペース"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"プライベート"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"プライベート スペースの設定"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"プライベート スペースをロック / ロック解除する"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"プライベート スペース移行中"</string>
<string name="bubble_bar_overflow_description" msgid="7410995531938041192">"オーバーフロー"</string>
</resources>
diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml
index 17358b6..d428447 100644
--- a/res/values-ka/strings.xml
+++ b/res/values-ka/strings.xml
@@ -172,18 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"სამსახურის აპების დაპაუზება"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"პაუზის გაუქმება"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"ფილტრი"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"მოიძიეთ თქვენს ტელეფონში"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"ძიება თქვენს ტაბლეტში"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"ვერ მოხერხდა: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"პირადი სივრცე"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
- <!-- no translation found for bubble_bar_overflow_description (7410995531938041192) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"პირადი"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"პირადი სივრცის პარამეტრები"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"პირადი სივრცის ჩაკეტვა/განბლოკვა"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"პირად სივრცეზე გადასვლა"</string>
+ <string name="bubble_bar_overflow_description" msgid="7410995531938041192">"გადავსება"</string>
</resources>
diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml
index bc9d3d7..4f6c6fd 100644
--- a/res/values-kk/strings.xml
+++ b/res/values-kk/strings.xml
@@ -172,18 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Жұмыс қолданбаларын кідірту"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Қайта қосу"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Сүзгі"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Телефоннан іздеу"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Планшеттен іздеу"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Қате шықты: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Жеке бөлме"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
- <!-- no translation found for bubble_bar_overflow_description (7410995531938041192) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Жеке"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Жеке бөлме параметрлері"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Жеке бөлмені құлыптау/оның құлпын ашу"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Жеке бөлмеге өту"</string>
+ <string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Қосымша мәзір"</string>
</resources>
diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml
index 004dbb5..91622f0 100644
--- a/res/values-km/strings.xml
+++ b/res/values-km/strings.xml
@@ -172,17 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"ផ្អាកកម្មវិធីការងារ"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"ឈប់ផ្អាក"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"តម្រង"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"ស្វែងរកក្នុងទូរសព្ទរបស់អ្នក"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"ស្វែងរកក្នុងថេប្លេតរបស់អ្នក"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"បានបរាជ័យ៖ <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"បន្ទប់ឯកជន"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"ឯកជន"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"ការកំណត់ Private Space"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"ចាក់សោ/ដោះសោ Private Space"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"ការផ្លាស់ប្ដូរ Private Space"</string>
<string name="bubble_bar_overflow_description" msgid="7410995531938041192">"ម៉ឺនុយបន្ថែម"</string>
</resources>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
index 2d8a04c..3f4de33 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -172,17 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"ಕೆಲಸಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಆ್ಯಪ್ಗಳನ್ನು ವಿರಾಮಗೊಳಿಸಿ"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"ವಿರಾಮವನ್ನು ರದ್ದುಗೊಳಿಸಿ"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"ಫಿಲ್ಟರ್"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"ನಿಮ್ಮ ಫೋನ್ ಅನ್ನು ಹುಡುಕಿ"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"ನಿಮ್ಮ ಟ್ಯಾಬ್ಲೆಟ್ ಅನ್ನು ಹುಡುಕಿ"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"ವಿಫಲವಾಗಿದೆ: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"ಖಾಸಗಿ ಸ್ಪೇಸ್"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"ಖಾಸಗಿ"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"ಖಾಸಗಿ ಸ್ಪೇಸ್ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"ಖಾಸಗಿ ಸ್ಪೇಸ್ ಅನ್ನು ಲಾಕ್/ಅನ್ಲಾಕ್ ಮಾಡಿ"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"ಖಾಸಗಿ ಸ್ಪೇಸ್ ಪರಿವರ್ತಿಸಲಾಗುತ್ತಿದೆ"</string>
<string name="bubble_bar_overflow_description" msgid="7410995531938041192">"ಓವರ್ಫ್ಲೋ"</string>
</resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 8fc3367..b2b0c0c 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -172,18 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"직장 앱 일시중지"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"일시중지 해제"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"필터"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"휴대전화 속 항목 검색"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"태블릿 속 항목 검색"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"실패: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"비공개 스페이스"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
- <!-- no translation found for bubble_bar_overflow_description (7410995531938041192) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"비공개"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"비공개 스페이스 설정"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"비공개 스페이스 잠금/잠금 해제"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"비공개 스페이스 전환"</string>
+ <string name="bubble_bar_overflow_description" msgid="7410995531938041192">"오버플로"</string>
</resources>
diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml
index 5a695bc..78e96a6 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -172,18 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Жумуш колдонмолорун тындыруу"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Улантуу"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Чыпкалоо"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Телефондо издөө"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Планшетте издөө"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Аткарылган жок: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Жеке чөйрө"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
- <!-- no translation found for bubble_bar_overflow_description (7410995531938041192) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Жеке"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Жеке чөйрөнүн параметрлери"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Жеке чөйрөнү кулпулоо/кулпусун ачуу"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Жеке чөйрөгө өтүү"</string>
+ <string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Кошумча меню"</string>
</resources>
diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml
index 6ef6912..bb99150 100644
--- a/res/values-lo/strings.xml
+++ b/res/values-lo/strings.xml
@@ -172,18 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"ຢຸດແອັບບ່ອນເຮັດວຽກຊົ່ວຄາວ"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"ຍົກເລີກການຢຸດຊົ່ວຄາວ"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"ກັ່ນຕອງ"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"ຊອກຫາໂທລະສັບຂອງທ່ານ"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"ຊອກຫາແທັບເລັດຂອງທ່ານ"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"ບໍ່ສຳເລັດ: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"ພື້ນທີ່ສ່ວນຕົວ"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
- <!-- no translation found for bubble_bar_overflow_description (7410995531938041192) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"ສ່ວນຕົວ"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"ການຕັ້ງຄ່າພື້ນທີ່ສ່ວນຕົວ"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"ລັອກ/ປົດລັອກພື້ນທີ່ສ່ວນຕົວ"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"ການປ່ຽນແປງພື້ນທີ່ສ່ວນຕົວ"</string>
+ <string name="bubble_bar_overflow_description" msgid="7410995531938041192">"ການດຳເນີນການເພີ່ມເຕີມ"</string>
</resources>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 2066aca..075bbb2 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -172,18 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Pristabdyti darbo programas"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Atšaukti pristabdymą"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filtruoti"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Paieška telefone"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Paieška planšetiniame kompiuteryje"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Nepavyko: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Privati erdvė"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
- <!-- no translation found for bubble_bar_overflow_description (7410995531938041192) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Privatus"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Privačios erdvės nustatymai"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Užrakinti ir (arba) atrakinti privačią erdvę"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Privačios erdvės perkėlimas"</string>
+ <string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Perpildymas"</string>
</resources>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index a4e8f1c..5edee25 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -172,18 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Pārtraukt darba lietotņu darbību"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Atsākt"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filtrs"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Meklēšana tālrunī"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Meklēšana planšetdatorā"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Neizdevās: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Privātā telpa"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
- <!-- no translation found for bubble_bar_overflow_description (7410995531938041192) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Privātā mape"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Privātās mapes iestatījumi"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Bloķēt/atbloķēt privāto mapi"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Pāriet uz privāto mapi"</string>
+ <string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Pārpilde"</string>
</resources>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
index 67f3597..a95b7bf 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -172,18 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Паузирај ги работните апликации"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Прекини ја паузата"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Филтер"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Пребарување низ телефонот"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Пребарување низ таблетот"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Не успеа: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Приватен простор"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
- <!-- no translation found for bubble_bar_overflow_description (7410995531938041192) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Приватен"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Поставки за „Приватен простор“"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Заклучување/отклучување на „Приватен простор“"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Префрлање на „Приватен простор“"</string>
+ <string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Проширено балонче"</string>
</resources>
diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml
index b0a3bee..1cdcb09 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -172,17 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"ഔദ്യോഗിക ആപ്പുകൾ താൽക്കാലികമായി നിർത്തുക"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"താൽക്കാലികമായി നിർത്തിയത് മാറ്റുക"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"ഫിൽട്ടർ ചെയ്യുക"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"നിങ്ങളുടെ ഫോണിലുള്ളവ തിരയുക"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"നിങ്ങളുടെ ടാബ്ലെറ്റിലുള്ളവ തിരയുക"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"പരാജയപ്പെട്ടു: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"സ്വകാര്യ സ്പേസ്"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"സ്വകാര്യം"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"സ്വകാര്യ സ്പേസ് ക്രമീകരണം"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"സ്വകാര്യ സ്പേസ് ലോക്ക് ചെയ്യുക/അൺലോക്ക് ചെയ്യുക"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"പ്രൈവറ്റ് സ്പേസ് ട്രാൻസിഷനിംഗ്"</string>
<string name="bubble_bar_overflow_description" msgid="7410995531938041192">"ഓവർഫ്ലോ"</string>
</resources>
diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml
index 85e4671..2d53dea 100644
--- a/res/values-mn/strings.xml
+++ b/res/values-mn/strings.xml
@@ -172,18 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Ажлын аппуудыг түр зогсоох"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Түр зогсоохоо болих"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Шүүлтүүр"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Утаснаасаа хайх"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Таблетнаасаа хайх"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Амжилтгүй болсон: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Хувийн орон зай"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
- <!-- no translation found for bubble_bar_overflow_description (7410995531938041192) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Хувийн"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Private Space-н тохиргоо"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Private Space-г түгжих/түгжээг тайлах"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Private Space-н шилжилт"</string>
+ <string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Урт цэс"</string>
</resources>
diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml
index baf8363..9e44733 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -172,17 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"कार्य ॲप्स थांबवा"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"अनपॉझ करा"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"फिल्टर"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"तुमच्या फोनमध्ये शोधा"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"तुमच्या टॅबलेटमध्ये शोधा"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"हे करता आले नाही: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"खाजगी स्पेस"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"खाजगी"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"खाजगी स्पेस ची सेटिंग्ज"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"खाजगी स्पेस लॉक/अनलॉक करा"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"खाजगी स्पेस वर स्विच करणे"</string>
<string name="bubble_bar_overflow_description" msgid="7410995531938041192">"ओव्हरफ्लो"</string>
</resources>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index 8aec20b..c90082a 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -172,17 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Jeda apl kerja"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Nyahjeda"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Tapis"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Cari pada telefon"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Cari pada tablet anda"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Gagal: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Ruang peribadi"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Peribadi"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Tetapan Ruang Peribadi"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Kunci/Buka kunci Ruang Peribadi"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Peralihan Ruang Peribadi"</string>
<string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Limpahan"</string>
</resources>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index 1ff0027..d1bef97 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -172,18 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"အလုပ်သုံးအက်ပ်များကို ခဏရပ်ရန်"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"ပြန်ဖွင့်ရန်"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"စစ်ထုတ်ရန်"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"သင့်ဖုန်းတွင် ရှာခြင်း"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"သင့်တက်ဘလက်ကို ရှာခြင်း"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"မအောင်မြင်ပါ− <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"သီးသန့်ချတ်ခန်း"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
- <!-- no translation found for bubble_bar_overflow_description (7410995531938041192) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"သီးသန့်"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"သီးသန့်ချတ်ခန်း ဆက်တင်များ"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"သီးသန့်ချတ်ခန်း လော့ခ်ချ/ဖွင့်ရန်"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"သီးသန့်ချတ်ခန်း အပြောင်းအလဲ"</string>
+ <string name="bubble_bar_overflow_description" msgid="7410995531938041192">"မီနူးအပို"</string>
</resources>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 05f52d9..cd2fb1f 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -172,17 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Sett jobbapper på pause"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Gjenoppta"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filter"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Søk på telefonen"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Søk på nettbrettet"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Mislyktes: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Privat område"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Privat"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Innstillinger for Private Space"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Lås / lås opp Private Space"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Private Space-overgang"</string>
<string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Overflyt"</string>
</resources>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
index a88b53d..b9397a0 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -172,17 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"कामसम्बन्धी एपहरू पज गर्नुहोस्"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"सुचारु गर्नुहोस्"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"फिल्टर"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"आफ्नो फोन खोज्नुहोस्"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"आफ्नो ट्याबलेटमा खोज्नुहोस्"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"कार्य पूरा गर्न सकिएन: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"निजी स्पेस"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"निजी"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"निजी स्पेससम्बन्धी सेटिङ"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"निजी स्पेस लक/अनलक गर्नुहोस्"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"निजी स्पेस ट्रान्जिसन गरिँदै छ"</string>
<string name="bubble_bar_overflow_description" msgid="7410995531938041192">"ओभरफ्लो"</string>
</resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index fc63880..84d5c15 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -172,17 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Werk-apps pauzeren"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Hervatten"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filteren"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Zoeken op je telefoon"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Zoeken op je tablet"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Mislukt: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Privéruimte"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Privé"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Instellingen voor privéruimte"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Privéruimte vergrendelen/ontgrendelen"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Overschakelen naar privéruimte"</string>
<string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Overloop"</string>
</resources>
diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml
index 7b69370..3fa8754 100644
--- a/res/values-or/strings.xml
+++ b/res/values-or/strings.xml
@@ -172,17 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"ୱାର୍କ ଆପ୍ସ ବିରତ କରନ୍ତୁ"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"ପୁଣି ଚାଲୁ କରନ୍ତୁ"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"ଫିଲ୍ଟର୍"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"ଆପଣଙ୍କ ଫୋନରେ ସନ୍ଧାନ କରନ୍ତୁ"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"ଆପଣଙ୍କ ଟାବଲେଟରେ ସନ୍ଧାନ କରନ୍ତୁ"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"ବିଫଳ ହୋଇଛି: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"ପ୍ରାଇଭେଟ ସ୍ପେସ"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"ପ୍ରାଇଭେଟ"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"ପ୍ରାଇଭେଟ ସ୍ପେସ ସେଟିଂସ"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"ପ୍ରାଇଭେଟ ସ୍ପେସକୁ ଲକ/ଅନଲକ କରନ୍ତୁ"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"ପ୍ରାଇଭେଟ ସ୍ପେସ ଟ୍ରାଞ୍ଜିସନିଂ"</string>
<string name="bubble_bar_overflow_description" msgid="7410995531938041192">"ଓଭରଫ୍ଲୋ"</string>
</resources>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index e56f5a3..98bc36d 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -172,17 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"ਕੰਮ ਸੰਬੰਧੀ ਐਪਾਂ ਰੋਕੋ"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"ਰੋਕ ਹਟਾਓ"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"ਫਿਲਟਰ"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"ਆਪਣਾ ਫ਼ੋਨ ਖੋਜੋ"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"ਆਪਣਾ ਟੈਬਲੈੱਟ ਖੋਜੋ"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"ਇਹ ਕਾਰਵਾਈ ਅਸਫਲ ਹੋਈ: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"ਨਿੱਜੀ ਸਪੇਸ"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"ਨਿੱਜੀ"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"ਨਿੱਜੀ ਸਪੇਸ ਸੰਬੰਧੀ ਸੈਟਿੰਗਾਂ"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"ਨਿੱਜੀ ਸਪੇਸ ਨੂੰ ਲਾਕ/ਅਣਲਾਕ ਕਰੋ"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"ਨਿੱਜੀ ਸਪੇਸ ਨੂੰ ਤਬਦੀਲ ਕਰਨਾ"</string>
<string name="bubble_bar_overflow_description" msgid="7410995531938041192">"ਓਵਰਫ਼ਲੋ"</string>
</resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 92eba6a..30a953c 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -172,18 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Wstrzymaj aplikacje służbowe"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Cofnij wstrzymywanie"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filtruj"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Przeszukuj telefon"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Przeszukuj tablet"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Niepowodzenie: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Obszar prywatny"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
- <!-- no translation found for bubble_bar_overflow_description (7410995531938041192) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Prywatne"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Ustawienia obszaru prywatnego"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Zablokuj/odblokuj obszar prywatny"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Przenoszenie obszaru prywatnego"</string>
+ <string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Rozwiń menu"</string>
</resources>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index d7e3ded..af760f8 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -172,17 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Pausar apps de trabalho"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Retomar"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filtrar"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Pesquise no telemóvel"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Pesquise no tablet"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Falhou: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Espaço privado"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Privado"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Definições do espaço privado"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Bloquear/desbloquear espaço privado"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Transição do espaço privado"</string>
<string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Menu adicional"</string>
</resources>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index f14da2d..4359e9a 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -172,17 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Pausar apps de trabalho"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Ativar"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filtrar"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Pesquisar no smartphone"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Pesquisar no tablet"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Falha: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Espaço particular"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Particular"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Configurações do Espaço particular"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Bloquear/desbloquear o Espaço particular"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Espaço particular em transição"</string>
<string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Balão flutuante"</string>
</resources>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index a9d6cf2..836ac99 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -172,18 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Întrerupe aplicațiile pentru lucru"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Anulează întreruperea"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filtru"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Caută pe telefon"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Caută pe tabletă"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Eșuare: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Spațiu privat"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
- <!-- no translation found for bubble_bar_overflow_description (7410995531938041192) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Privat"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Setări spațiu privat"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Blochează / deblochează spațiul privat"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Tranziție pentru spațiul privat"</string>
+ <string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Suplimentar"</string>
</resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 8ca058c..bb7b0a0 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -172,18 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Приостановить рабочие приложения"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Возобновить"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Фильтр"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Поиск на телефоне"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Поиск на планшете"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Не удалось выполнить действие (<xliff:g id="WHAT">%1$s</xliff:g>)."</string>
<string name="private_space_label" msgid="2359721649407947001">"Личное пространство"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
- <!-- no translation found for bubble_bar_overflow_description (7410995531938041192) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Доступно только вам"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Настройки личного пространства"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Блокировка и разблокировка личного пространства"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Переход к личному пространству"</string>
+ <string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Дополнительное меню"</string>
</resources>
diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml
index f935dba..401e0fb 100644
--- a/res/values-si/strings.xml
+++ b/res/values-si/strings.xml
@@ -172,18 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"කාර්යාල යෙදුම් විරාම කරන්න"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"විරාම නොකරන්න"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"පෙරහන"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"ඔබගේ දුරකථනය සොයන්න"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"ඔබගේ ටැබ්ලටය සොයන්න"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"අසාර්ථකයි: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"පෞද්ගලික ඉඩ"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
- <!-- no translation found for bubble_bar_overflow_description (7410995531938041192) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"පෞද්ගලික"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"පෞද්ගලික අවකාශ සැකසීම්"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"පෞද්ගලික අවකාශය අගුළු දමන්න/අගුළු හරින්න"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"පෞද්ගලික අවකාශ සංක්රමණය"</string>
+ <string name="bubble_bar_overflow_description" msgid="7410995531938041192">"පිටාර යාම"</string>
</resources>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index 1fc9b7a..fbe64a8 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -172,18 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Pozastaviť pracovné aplikácie"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Zrušiť pozastavenie"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filtrujte"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Vyhľadávanie v telefóne"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Vyhľadávanie v tablete"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Zlyhalo: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Súkromný priestor"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
- <!-- no translation found for bubble_bar_overflow_description (7410995531938041192) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Súkromné"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Nastavenia súkromného priestoru"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Súkromný priestor zamykania a odomykania"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Prechod súkromného priestoru"</string>
+ <string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Rozšírená ponuka"</string>
</resources>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index a66367e..d91e83f 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -172,18 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Začasno zaustavi delovne aplikacije"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Znova aktiviraj"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filtriranje"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Iskanje po telefonu"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Iskanje po tabličnem računalniku"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Ni uspelo: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Zasebni prostor"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
- <!-- no translation found for bubble_bar_overflow_description (7410995531938041192) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Zasebno"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Nastavitve zasebnega prostora"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Zaklepanje/odklepanje zasebnega prostora"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Preklapljanje zasebnega prostora"</string>
+ <string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Oblaček z dodatnimi elementi"</string>
</resources>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index b494b98..a3bd673 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -172,18 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Vendos në pauzë aplikacionet e punës"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Hiq nga pauza"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filtro"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Kërko në telefonin tënd"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Kërko në tabletin tënd"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Dështoi: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Hapësira private"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
- <!-- no translation found for bubble_bar_overflow_description (7410995531938041192) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Private"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Cilësimet e \"Hapësirës private\""</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Kyç/Shkyç \"Hapësirën private\""</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Kalimi te \"Hapësira private\""</string>
+ <string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Tejkalimi"</string>
</resources>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index 3788dff..5242848 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -172,17 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Паузирај пословне апликације"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Поново активирај"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Филтер"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Претражите телефон"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Претражите таблет"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Није успело: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Приватни простор"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Приватно"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Подешавања приватног простора"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Закључај/откључај приватни простор"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Пренос приватног простора"</string>
<string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Преклопно"</string>
</resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 729fadc..1e1436f 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -172,18 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Pausa jobbappar"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Återuppta"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filter"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Sök på telefonen"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Sök på surfplattan"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Misslyckades: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Privat rum"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
- <!-- no translation found for bubble_bar_overflow_description (7410995531938041192) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Privat"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Inställningar för privat rum"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Lås eller lås upp ditt privata rum"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Överföring av privat rum"</string>
+ <string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Fler alternativ"</string>
</resources>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 70988f3..2486cae 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -172,17 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Simamisha programu za kazini"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Acha kusimamisha"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Kichujio"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Tafuta kwenye simu yako"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Tafuta kwenye kompyuta kibao yako"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Hitilafu: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Nafasi ya faragha"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Ya Faragha"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Mipangilio ya Nafasi ya Faragha"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Funga/Fungua Nafasi ya Faragha"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Mabadiliko ya Nafasi ya Faragha"</string>
<string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Menyu ya vipengee vya ziada"</string>
</resources>
diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml
index 1f34674..cb0ca67 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -172,18 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"பணி ஆப்ஸை இடைநிறுத்து"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"மீண்டும் இயக்கு"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"வடிப்பான்"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"உங்கள் மொபைலில் தேடுதல்"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"உங்கள் டேப்லெட்டில் தேடுதல்"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"தோல்வி: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"தனிப்பட்ட சேமிப்பிடம்"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
- <!-- no translation found for bubble_bar_overflow_description (7410995531938041192) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"தனிப்பட்டது"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"தனிப்பட்ட சேமிப்பிட அமைப்புகள்"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"தனிப்பட்ட சேமிப்பிடத்தை லாக்/அன்லாக் செய்யும்"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"தனிப்பட்ட சேமிப்பிடத்திற்கு மாற்றுகிறது"</string>
+ <string name="bubble_bar_overflow_description" msgid="7410995531938041192">"கூடுதல் விருப்பங்களைக் காட்டும்"</string>
</resources>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index de2b023..27cec72 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -172,18 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"వర్క్ యాప్లను పాజ్ చేయండి"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"పాజ్ నుండి తీసివేయండి"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"ఫిల్టర్ చేయి"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"మీ ఫోన్లో సెర్చ్ చేయండి"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"మీ టాబ్లెట్లో సెర్చ్ చేయండి"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"విఫలమైంది: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"ప్రైవేట్ స్పేస్"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
- <!-- no translation found for bubble_bar_overflow_description (7410995531938041192) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"ప్రైవేట్"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"ప్రైవేట్ స్పేస్ సెట్టింగ్లు"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"ప్రైవేట్ స్పేస్ను లాక్/అన్లాక్ చేయండి"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"ప్రైవేట్ స్పేస్ కేటాయించడం జరుగుతుంది"</string>
+ <string name="bubble_bar_overflow_description" msgid="7410995531938041192">"ఓవర్ఫ్లో"</string>
</resources>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index fbe6439..78cbcfa 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -172,17 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"หยุดแอปงานชั่วคราว"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"ยกเลิกการหยุดชั่วคราว"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"ตัวกรอง"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"ค้นหาในโทรศัพท์"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"ค้นหาในแท็บเล็ต"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"ไม่สำเร็จ: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"พื้นที่ส่วนตัว"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"ส่วนตัว"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"การตั้งค่าพื้นที่ส่วนตัว"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"ล็อก/ปลดล็อกพื้นที่ส่วนตัว"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"การเปลี่ยนไปใช้พื้นที่ส่วนตัว"</string>
<string name="bubble_bar_overflow_description" msgid="7410995531938041192">"การดำเนินการเพิ่มเติม"</string>
</resources>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index b23bcd5..acf60ff 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -172,17 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"I-pause ang mga app para sa trabaho"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"I-unpause"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filter"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Maghanap sa iyong telepono"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Maghanap sa iyong tablet"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Hindi nagawa: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Pribadong space"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Pribado"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Mga Setting ng Pribadong Space"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"I-lock/I-unlock ang Pribadong Space"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Pag-transition ng Pribadong Space"</string>
<string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Overflow"</string>
</resources>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 547fdbb..1449202 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -172,18 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"İş uygulamalarını duraklat"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Devam ettir"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filtre"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"telefonunuzda arama yapmak"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Tabletinizde arama yapma"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Başarısız: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Gizli alan"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
- <!-- no translation found for bubble_bar_overflow_description (7410995531938041192) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Gizli"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Gizli Alan Ayarları"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Gizli Alanı Kilitleyin/Kilidini Açın"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Gizli Alana Geçiş"</string>
+ <string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Taşma"</string>
</resources>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 85d0614..ad325cc 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -172,18 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Призупинити робочі додатки"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Відновити"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Фільтр"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Пошук на телефоні"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Пошук на планшеті"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Не вдалося <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Приватний простір"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
- <!-- no translation found for bubble_bar_overflow_description (7410995531938041192) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Приватні"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Налаштування приватного простору"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Заблокувати/розблокувати приватний простір"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Перехід у приватний простір"</string>
+ <string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Додаткове меню"</string>
</resources>
diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml
index 7c437aa..1c0e3ae 100644
--- a/res/values-ur/strings.xml
+++ b/res/values-ur/strings.xml
@@ -172,17 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"ورک ایپس موقوف کریں"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"چلائیں"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"فلٹر"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"اپنے فون پر تلاش کریں"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"اپنے ٹیبلیٹ پر تلاش کریں"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"ناکام ہو گيا: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"نجی اسپیس"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"نجی"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"نجی اسپیس کی ترتیبات"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"نجی اسپیس کو مقفل کریں/غیر مقفل کریں"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"نجی اسپیس کی منتقلی"</string>
<string name="bubble_bar_overflow_description" msgid="7410995531938041192">"اوورفلو"</string>
</resources>
diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml
index de822af..8e6d392 100644
--- a/res/values-uz/strings.xml
+++ b/res/values-uz/strings.xml
@@ -172,17 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Ishga oid ilovalarni pauza qilish"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Pauzadan chiqarish"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Saralash"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Telefondan qidirish"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Planshetingizni qidiring"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Xato: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Shaxsiy xona"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Yopiq"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Shaxsiy xona sozlamalari"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Shaxsiy xonani ochish/qulflash"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Maxfiy joyga almashtirish"</string>
<string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Kengaytirish"</string>
</resources>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 8d26f37..8ed3089 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -172,18 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Tạm dừng các ứng dụng công việc"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Bỏ tạm dừng"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Bộ lọc"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Tìm trên điện thoại"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Tìm kiếm trong máy tính bảng của bạn"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Không thực hiện được thao tác: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Không gian riêng tư"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
- <!-- no translation found for bubble_bar_overflow_description (7410995531938041192) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Riêng tư"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Cài đặt không gian riêng tư"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Khoá/mở khoá không gian riêng tư"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Chuyển đổi sang không gian riêng tư"</string>
+ <string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Bong bóng bổ sung"</string>
</resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index add6a9b..53b85f2 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -172,17 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"暂停工作应用"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"取消暂停"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"过滤器"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"手机内搜索"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"平板电脑内搜索"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"失败:<xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"私密空间"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"私密"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"私密空间设置"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"锁定/解锁私密空间"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"私密空间转换"</string>
<string name="bubble_bar_overflow_description" msgid="7410995531938041192">"菜单"</string>
</resources>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index c21b8cb..e6aaef5 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -172,17 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"暫停工作應用程式"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"取消暫停"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"篩選器"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"搜尋手機內容"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"搜尋平板電腦內容"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"操作失敗:<xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"私人空間"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"私人"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"「私人空間」設定"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"鎖定/解鎖「私人空間」"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"轉為「私人空間」"</string>
<string name="bubble_bar_overflow_description" msgid="7410995531938041192">"顯示更多"</string>
</resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index b320715..462b651 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -172,17 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"暫停工作應用程式"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"取消暫停"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"篩選器"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"搜尋手機內容"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"搜尋平板電腦內容"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"失敗:<xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"私人空間"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"私人"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"私人空間設定"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"鎖定/取消鎖定私人空間"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"轉換私人空間狀態"</string>
<string name="bubble_bar_overflow_description" msgid="7410995531938041192">"溢位"</string>
</resources>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index b519ce6..efc0824 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -172,18 +172,11 @@
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Misa ama-app omsebenzi"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Susa ukumisa"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Hlunga"</string>
- <string name="search_pref_screen_title" msgid="3258959643336315962">"Sesha ifoni yakho"</string>
- <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Sesha ithebulethi yakho"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Yehlulekile: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Isikhala esiyimfihlo"</string>
- <!-- no translation found for ps_container_title (4391796149519594205) -->
- <skip />
- <!-- no translation found for ps_container_settings (6059734123353320479) -->
- <skip />
- <!-- no translation found for ps_container_lock_unlock_button (7605602332253423755) -->
- <skip />
- <!-- no translation found for ps_container_transition (8667331812048014412) -->
- <skip />
- <!-- no translation found for bubble_bar_overflow_description (7410995531938041192) -->
- <skip />
+ <string name="ps_container_title" msgid="4391796149519594205">"Okuyimfihlo"</string>
+ <string name="ps_container_settings" msgid="6059734123353320479">"Amasethingi Esikhala Esiyimfihlo"</string>
+ <string name="ps_container_lock_unlock_button" msgid="7605602332253423755">"Khiya/Vula Isikhala Esiyimfihlo"</string>
+ <string name="ps_container_transition" msgid="8667331812048014412">"Ukuguqulwa Kwendawo Yangasese"</string>
+ <string name="bubble_bar_overflow_description" msgid="7410995531938041192">"Ukugcwala kakhulu"</string>
</resources>
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index 3682830..8d84c90 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -164,7 +164,19 @@
<!-- numFolderRows & numFolderColumns defaults to numRows & numColumns, if not specified -->
<attr name="numFolderRows" format="integer" />
+ <!-- defaults to numFolderRows, if not specified -->
+ <attr name="numFolderRowsLandscape" format="integer" />
+ <!-- defaults to numFolderRows, if not specified -->
+ <attr name="numFolderRowsTwoPanelLandscape" format="integer" />
+ <!-- defaults to numFolderRows, if not specified -->
+ <attr name="numFolderRowsTwoPanelPortrait" format="integer" />
<attr name="numFolderColumns" format="integer" />
+ <!-- defaults to numFolderColumns, if not specified -->
+ <attr name="numFolderColumnsLandscape" format="integer" />
+ <!-- defaults to numFolderColumns, if not specified -->
+ <attr name="numFolderColumnsTwoPanelLandscape" format="integer" />
+ <!-- defaults to numFolderColumns, if not specified -->
+ <attr name="numFolderColumnsTwoPanelPortrait" format="integer" />
<!-- Support attributes in FolderStyle -->
<attr name="folderStyle" format="reference" />
@@ -220,6 +232,14 @@
Needs FeatureFlags.ENABLE_RESPONSIVE_WORKSPACE enabled -->
<attr name="hotseatSpecsId" format="reference" />
<attr name="hotseatSpecsTwoPanelId" format="reference" />
+ <!-- File that contains the specs for workspace icon and text size.
+ Needs FeatureFlags.ENABLE_RESPONSIVE_WORKSPACE enabled -->
+ <attr name="workspaceCellSpecsId" format="reference" />
+ <attr name="workspaceCellSpecsTwoPanelId" format="reference" />
+ <!-- File that contains the specs for all apps icon and text size.
+ Needs FeatureFlags.ENABLE_RESPONSIVE_WORKSPACE enabled -->
+ <attr name="allAppsCellSpecsId" format="reference" />
+ <attr name="allAppsCellSpecsTwoPanelId" format="reference" />
<!-- By default all categories are enabled -->
<attr name="deviceCategory" format="integer">
@@ -292,6 +312,11 @@
<attr name="maxAvailableSize" />
</declare-styleable>
+ <declare-styleable name="CellSpec">
+ <attr name="dimensionType" />
+ <attr name="maxAvailableSize" />
+ </declare-styleable>
+
<declare-styleable name="SizeSpec">
<attr name="fixedSize" format="dimension" />
<attr name="ofAvailableSpace" format="float" />
diff --git a/res/values/config.xml b/res/values/config.xml
index 4b15a6b..154312a 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -228,6 +228,10 @@
<dimen name="iconSize60dp">66dp</dimen>
<dimen name="iconSize66dp">72dp</dimen>
<dimen name="iconSize72dp">79dp</dimen>
+ <dimen name="iconSize82dp">90dp</dimen>
+ <dimen name="iconSize110dp">121dp</dimen>
+ <dimen name="iconSize144dp">158dp</dimen>
+
<!-- Icon size steps in dp -->
<integer-array name="icon_size_steps">
@@ -240,6 +244,9 @@
<item>@dimen/iconSize60dp</item>
<item>@dimen/iconSize66dp</item>
<item>@dimen/iconSize72dp</item>
+ <item>@dimen/iconSize82dp</item>
+ <item>@dimen/iconSize110dp</item>
+ <item>@dimen/iconSize144dp</item>
</integer-array>
<dimen name="minimum_icon_label_size">8sp</dimen>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 6c9a238..137ffe8 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -290,7 +290,6 @@
<dimen name="popup_single_item_radius">100dp</dimen>
<dimen name="popup_smaller_radius">4dp</dimen>
<dimen name="deep_shortcut_drawable_padding">16dp</dimen>
- <dimen name="deep_shortcut_drag_handle_size">16dp</dimen>
<dimen name="popup_padding_start">10dp</dimen>
<dimen name="popup_padding_end">14dp</dimen>
<dimen name="popup_vertical_padding">4dp</dimen>
@@ -430,6 +429,7 @@
<dimen name="split_instructions_drawable_padding">10dp</dimen>
<dimen name="split_instructions_bottom_margin_phone_landscape">24dp</dimen>
<dimen name="split_instructions_bottom_margin_phone_portrait">60dp</dimen>
+ <dimen name="split_instructions_start_margin_cancel">8dp</dimen>
<!-- Workspace grid visualization parameters -->
<dimen name="grid_visualization_rounding_radius">28dp</dimen>
diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java
index 1a0f2cf..7257d86 100644
--- a/src/com/android/launcher3/CellLayout.java
+++ b/src/com/android/launcher3/CellLayout.java
@@ -67,7 +67,10 @@
import com.android.launcher3.accessibility.DragAndDropAccessibilityDelegate;
import com.android.launcher3.celllayout.CellLayoutLayoutParams;
import com.android.launcher3.celllayout.CellPosMapper.CellPos;
+import com.android.launcher3.celllayout.DelegatedCellDrawing;
+import com.android.launcher3.celllayout.ItemConfiguration;
import com.android.launcher3.celllayout.ReorderAlgorithm;
+import com.android.launcher3.celllayout.ViewCluster;
import com.android.launcher3.config.FeatureFlags;
import com.android.launcher3.dragndrop.DraggableView;
import com.android.launcher3.folder.PreviewBackground;
@@ -86,7 +89,6 @@
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Stack;
@@ -1434,9 +1436,8 @@
View child = mShortcutsAndWidgets.getChildAt(i);
if (child == dragView) continue;
CellAndSpan c = solution.map.get(child);
- boolean skip = mode == ReorderPreviewAnimation.MODE_HINT && solution.intersectingViews
- != null && !solution.intersectingViews.contains(child);
-
+ boolean skip = mode == ReorderPreviewAnimation.MODE_HINT
+ && !solution.intersectingViews.contains(child);
CellLayoutLayoutParams lp = (CellLayoutLayoutParams) child.getLayoutParams();
if (c != null && !skip && (child instanceof Reorderable)) {
@@ -1832,7 +1833,7 @@
private boolean pushViewsToTempLocation(ArrayList<View> views, Rect rectOccupiedByPotentialDrop,
int[] direction, View dragView, ItemConfiguration currentState) {
- ViewCluster cluster = new ViewCluster(views, currentState);
+ ViewCluster cluster = new ViewCluster(this, views, currentState);
Rect clusterRect = cluster.getBoundingRect();
int whichEdge;
int pushDistance;
@@ -1924,191 +1925,6 @@
return foundSolution;
}
- /**
- * This helper class defines a cluster of views. It helps with defining complex edges
- * of the cluster and determining how those edges interact with other views. The edges
- * essentially define a fine-grained boundary around the cluster of views -- like a more
- * precise version of a bounding box.
- */
- private class ViewCluster {
- final static int LEFT = 1 << 0;
- final static int TOP = 1 << 1;
- final static int RIGHT = 1 << 2;
- final static int BOTTOM = 1 << 3;
-
- final ArrayList<View> views;
- final ItemConfiguration config;
- final Rect boundingRect = new Rect();
-
- final int[] leftEdge = new int[mCountY];
- final int[] rightEdge = new int[mCountY];
- final int[] topEdge = new int[mCountX];
- final int[] bottomEdge = new int[mCountX];
- int dirtyEdges;
- boolean boundingRectDirty;
-
- @SuppressWarnings("unchecked")
- public ViewCluster(ArrayList<View> views, ItemConfiguration config) {
- this.views = (ArrayList<View>) views.clone();
- this.config = config;
- resetEdges();
- }
-
- void resetEdges() {
- for (int i = 0; i < mCountX; i++) {
- topEdge[i] = -1;
- bottomEdge[i] = -1;
- }
- for (int i = 0; i < mCountY; i++) {
- leftEdge[i] = -1;
- rightEdge[i] = -1;
- }
- dirtyEdges = LEFT | TOP | RIGHT | BOTTOM;
- boundingRectDirty = true;
- }
-
- void computeEdge(int which) {
- int count = views.size();
- for (int i = 0; i < count; i++) {
- CellAndSpan cs = config.map.get(views.get(i));
- switch (which) {
- case LEFT:
- int left = cs.cellX;
- for (int j = cs.cellY; j < cs.cellY + cs.spanY; j++) {
- if (left < leftEdge[j] || leftEdge[j] < 0) {
- leftEdge[j] = left;
- }
- }
- break;
- case RIGHT:
- int right = cs.cellX + cs.spanX;
- for (int j = cs.cellY; j < cs.cellY + cs.spanY; j++) {
- if (right > rightEdge[j]) {
- rightEdge[j] = right;
- }
- }
- break;
- case TOP:
- int top = cs.cellY;
- for (int j = cs.cellX; j < cs.cellX + cs.spanX; j++) {
- if (top < topEdge[j] || topEdge[j] < 0) {
- topEdge[j] = top;
- }
- }
- break;
- case BOTTOM:
- int bottom = cs.cellY + cs.spanY;
- for (int j = cs.cellX; j < cs.cellX + cs.spanX; j++) {
- if (bottom > bottomEdge[j]) {
- bottomEdge[j] = bottom;
- }
- }
- break;
- }
- }
- }
-
- boolean isViewTouchingEdge(View v, int whichEdge) {
- CellAndSpan cs = config.map.get(v);
-
- if ((dirtyEdges & whichEdge) == whichEdge) {
- computeEdge(whichEdge);
- dirtyEdges &= ~whichEdge;
- }
-
- switch (whichEdge) {
- case LEFT:
- for (int i = cs.cellY; i < cs.cellY + cs.spanY; i++) {
- if (leftEdge[i] == cs.cellX + cs.spanX) {
- return true;
- }
- }
- break;
- case RIGHT:
- for (int i = cs.cellY; i < cs.cellY + cs.spanY; i++) {
- if (rightEdge[i] == cs.cellX) {
- return true;
- }
- }
- break;
- case TOP:
- for (int i = cs.cellX; i < cs.cellX + cs.spanX; i++) {
- if (topEdge[i] == cs.cellY + cs.spanY) {
- return true;
- }
- }
- break;
- case BOTTOM:
- for (int i = cs.cellX; i < cs.cellX + cs.spanX; i++) {
- if (bottomEdge[i] == cs.cellY) {
- return true;
- }
- }
- break;
- }
- return false;
- }
-
- void shift(int whichEdge, int delta) {
- for (View v: views) {
- CellAndSpan c = config.map.get(v);
- switch (whichEdge) {
- case LEFT:
- c.cellX -= delta;
- break;
- case RIGHT:
- c.cellX += delta;
- break;
- case TOP:
- c.cellY -= delta;
- break;
- case BOTTOM:
- default:
- c.cellY += delta;
- break;
- }
- }
- resetEdges();
- }
-
- public void addView(View v) {
- views.add(v);
- resetEdges();
- }
-
- public Rect getBoundingRect() {
- if (boundingRectDirty) {
- config.getBoundingRectForViews(views, boundingRect);
- }
- return boundingRect;
- }
-
- final PositionComparator comparator = new PositionComparator();
- class PositionComparator implements Comparator<View> {
- int whichEdge = 0;
- public int compare(View left, View right) {
- CellAndSpan l = config.map.get(left);
- CellAndSpan r = config.map.get(right);
- switch (whichEdge) {
- case LEFT:
- return (r.cellX + r.spanX) - (l.cellX + l.spanX);
- case RIGHT:
- return l.cellX - r.cellX;
- case TOP:
- return (r.cellY + r.spanY) - (l.cellY + l.spanY);
- case BOTTOM:
- default:
- return l.cellY - r.cellY;
- }
- }
- }
-
- public void sortConfigurationForEdgePush(int edge) {
- comparator.whichEdge = edge;
- Collections.sort(config.sortedViews, comparator);
- }
- }
-
// This method tries to find a reordering solution which satisfies the push mechanic by trying
// to push items in each of the cardinal directions, in an order based on the direction vector
// passed.
@@ -2532,54 +2348,6 @@
}
/**
- * Represents the solution to a reorder of items in the Workspace.
- */
- public static class ItemConfiguration extends CellAndSpan {
- public final ArrayMap<View, CellAndSpan> map = new ArrayMap<>();
- private final ArrayMap<View, CellAndSpan> savedMap = new ArrayMap<>();
- public final ArrayList<View> sortedViews = new ArrayList<>();
- public ArrayList<View> intersectingViews;
- public boolean isSolution = false;
-
- public void save() {
- // Copy current state into savedMap
- for (View v: map.keySet()) {
- savedMap.get(v).copyFrom(map.get(v));
- }
- }
-
- public void restore() {
- // Restore current state from savedMap
- for (View v: savedMap.keySet()) {
- map.get(v).copyFrom(savedMap.get(v));
- }
- }
-
- public void add(View v, CellAndSpan cs) {
- map.put(v, cs);
- savedMap.put(v, new CellAndSpan());
- sortedViews.add(v);
- }
-
- public int area() {
- return spanX * spanY;
- }
-
- public void getBoundingRectForViews(ArrayList<View> views, Rect outRect) {
- boolean first = true;
- for (View v: views) {
- CellAndSpan c = map.get(v);
- if (first) {
- outRect.set(c.cellX, c.cellY, c.cellX + c.spanX, c.cellY + c.spanY);
- first = false;
- } else {
- outRect.union(c.cellX, c.cellY, c.cellX + c.spanX, c.cellY + c.spanY);
- }
- }
- }
- }
-
- /**
* Find a starting cell position that will fit the given bounds nearest the requested
* cell location. Uses Euclidean distance to score multiple vacant areas.
*
@@ -2758,52 +2526,6 @@
return new CellLayoutLayoutParams(p);
}
- // This class stores info for two purposes:
- // 1. When dragging items (mDragInfo in Workspace), we store the View, its cellX & cellY,
- // its spanX, spanY, and the screen it is on
- // 2. When long clicking on an empty cell in a CellLayout, we save information about the
- // cellX and cellY coordinates and which page was clicked. We then set this as a tag on
- // the CellLayout that was long clicked
- public static final class CellInfo extends CellAndSpan {
- public final View cell;
- final int screenId;
- final int container;
-
- public CellInfo(View v, ItemInfo info, CellPos cellPos) {
- cellX = cellPos.cellX;
- cellY = cellPos.cellY;
- spanX = info.spanX;
- spanY = info.spanY;
- cell = v;
- screenId = cellPos.screenId;
- container = info.container;
- }
-
- @Override
- public String toString() {
- return "Cell[view=" + (cell == null ? "null" : cell.getClass())
- + ", x=" + cellX + ", y=" + cellY + "]";
- }
- }
-
- /**
- * A Delegated cell Drawing for drawing on CellLayout
- */
- public abstract static class DelegatedCellDrawing {
- public int mDelegateCellX;
- public int mDelegateCellY;
-
- /**
- * Draw under CellLayout
- */
- public abstract void drawUnderItem(Canvas canvas);
-
- /**
- * Draw over CellLayout
- */
- public abstract void drawOverItem(Canvas canvas);
- }
-
/**
* Returns whether an item can be placed in this CellLayout (after rearranging and/or resizing
* if necessary).
diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java
index 85d02eb..f277926 100644
--- a/src/com/android/launcher3/DeviceProfile.java
+++ b/src/com/android/launcher3/DeviceProfile.java
@@ -54,9 +54,11 @@
import com.android.launcher3.icons.DotRenderer;
import com.android.launcher3.icons.IconNormalizer;
import com.android.launcher3.model.data.ItemInfo;
+import com.android.launcher3.responsive.CalculatedCellSpec;
import com.android.launcher3.responsive.CalculatedHotseatSpec;
import com.android.launcher3.responsive.CalculatedResponsiveSpec;
import com.android.launcher3.responsive.HotseatSpecsProvider;
+import com.android.launcher3.responsive.ResponsiveCellSpecsProvider;
import com.android.launcher3.responsive.ResponsiveSpec.Companion.ResponsiveSpecType;
import com.android.launcher3.responsive.ResponsiveSpec.DimensionType;
import com.android.launcher3.responsive.ResponsiveSpecsProvider;
@@ -125,6 +127,8 @@
private CalculatedResponsiveSpec mResponsiveFolderWidthSpec;
private CalculatedResponsiveSpec mResponsiveFolderHeightSpec;
private CalculatedHotseatSpec mResponsiveHotseatSpec;
+ private CalculatedCellSpec mResponsiveWorkspaceCellSpec;
+ private CalculatedCellSpec mResponsiveAllAppsCellSpec;
/**
* The maximum amount of left/right workspace padding as a percentage of the screen width.
@@ -165,7 +169,7 @@
public int iconSizePx;
public int iconTextSizePx;
public int iconDrawablePaddingPx;
- private final int mIconDrawablePaddingOriginalPx;
+ private int mIconDrawablePaddingOriginalPx;
public boolean iconCenterVertically;
public float cellScaleToFit;
@@ -176,7 +180,9 @@
public int cellYPaddingPx = -1;
// Folder
- public float folderLabelTextScale;
+ public final int numFolderRows;
+ public final int numFolderColumns;
+ public final float folderLabelTextScale;
public int folderLabelTextSizePx;
public int folderFooterHeightPx;
public int folderIconSizePx;
@@ -328,7 +334,9 @@
mIsResponsiveGrid = inv.workspaceSpecsId != INVALID_RESOURCE_HANDLE
&& inv.allAppsSpecsId != INVALID_RESOURCE_HANDLE
&& inv.folderSpecsId != INVALID_RESOURCE_HANDLE
- && inv.hotseatSpecsId != INVALID_RESOURCE_HANDLE;
+ && inv.hotseatSpecsId != INVALID_RESOURCE_HANDLE
+ && inv.workspaceCellSpecsId != INVALID_RESOURCE_HANDLE
+ && inv.allAppsCellSpecsId != INVALID_RESOURCE_HANDLE;
mIsScalableGrid = inv.isScalable && !isVerticalBarLayout() && !isMultiWindowMode;
// Determine device posture.
@@ -431,6 +439,8 @@
}
folderLabelTextScale = res.getFloat(R.dimen.folder_label_text_scale);
+ numFolderRows = inv.numFolderRows[mTypeIndex];
+ numFolderColumns = inv.numFolderColumns[mTypeIndex];
if (mIsScalableGrid && inv.folderStyle != INVALID_RESOURCE_HANDLE) {
TypedArray folderStyle = context.obtainStyledAttributes(inv.folderStyle,
@@ -466,17 +476,19 @@
mWorkspacePageIndicatorOverlapWorkspace =
res.getDimensionPixelSize(R.dimen.workspace_page_indicator_overlap_workspace);
- TypedArray cellStyle;
- if (inv.cellStyle != INVALID_RESOURCE_HANDLE) {
- cellStyle = context.obtainStyledAttributes(inv.cellStyle,
- R.styleable.CellStyle);
- } else {
- cellStyle = context.obtainStyledAttributes(R.style.CellStyleDefault,
- R.styleable.CellStyle);
+ if (!mIsResponsiveGrid) {
+ TypedArray cellStyle;
+ if (inv.cellStyle != INVALID_RESOURCE_HANDLE) {
+ cellStyle = context.obtainStyledAttributes(inv.cellStyle,
+ R.styleable.CellStyle);
+ } else {
+ cellStyle = context.obtainStyledAttributes(R.style.CellStyleDefault,
+ R.styleable.CellStyle);
+ }
+ mIconDrawablePaddingOriginalPx = cellStyle.getDimensionPixelSize(
+ R.styleable.CellStyle_iconDrawablePadding, 0);
+ cellStyle.recycle();
}
- mIconDrawablePaddingOriginalPx = cellStyle.getDimensionPixelSize(
- R.styleable.CellStyle_iconDrawablePadding, 0);
- cellStyle.recycle();
dropTargetBarSizePx = res.getDimensionPixelSize(R.dimen.dynamic_grid_drop_target_size);
dropTargetBarTopMarginPx = res.getDimensionPixelSize(R.dimen.drop_target_top_margin);
@@ -533,6 +545,13 @@
mHotseatBarEdgePaddingPx =
isVerticalBarLayout() ? mResponsiveHotseatSpec.getEdgePadding() : 0;
mHotseatBarWorkspaceSpacePx = 0;
+
+ ResponsiveCellSpecsProvider workspaceCellSpecs = ResponsiveCellSpecsProvider.create(
+ new ResourceHelper(context,
+ isTwoPanels ? inv.workspaceCellSpecsTwoPanelId
+ : inv.workspaceCellSpecsId));
+ mResponsiveWorkspaceCellSpec = workspaceCellSpecs.getCalculatedSpec(
+ responsiveAspectRatio, heightPx);
} else {
hotseatQsbSpace = pxFromDp(inv.hotseatQsbSpace[mTypeIndex], mMetrics);
hotseatBarBottomSpace = pxFromDp(inv.hotseatBarBottomSpace[mTypeIndex], mMetrics);
@@ -566,7 +585,13 @@
springLoadedHotseatBarTopMarginPx = res.getDimensionPixelSize(
R.dimen.spring_loaded_hotseat_top_margin);
- updateHotseatSizes(pxFromDp(inv.iconSize[mTypeIndex], mMetrics));
+
+ if (mIsResponsiveGrid) {
+ updateHotseatSizes(mResponsiveWorkspaceCellSpec.getIconSize());
+ } else {
+ updateHotseatSizes(pxFromDp(inv.iconSize[mTypeIndex], mMetrics));
+ }
+
if (areNavButtonsInline && !isPhone) {
inlineNavButtonsEndSpacingPx =
res.getDimensionPixelSize(inv.inlineNavButtonsEndSpacing);
@@ -622,13 +647,22 @@
isTwoPanels ? inv.folderSpecsTwoPanelId : inv.folderSpecsId),
ResponsiveSpecType.Folder);
mResponsiveFolderWidthSpec = folderSpecs.getCalculatedSpec(responsiveAspectRatio,
- DimensionType.WIDTH, inv.numFolderColumns,
+ DimensionType.WIDTH, numFolderColumns,
mResponsiveWorkspaceWidthSpec.getAvailableSpace(),
mResponsiveWorkspaceWidthSpec);
mResponsiveFolderHeightSpec = folderSpecs.getCalculatedSpec(responsiveAspectRatio,
- DimensionType.HEIGHT, inv.numFolderRows,
+ DimensionType.HEIGHT, numFolderRows,
mResponsiveWorkspaceHeightSpec.getAvailableSpace(),
mResponsiveWorkspaceHeightSpec);
+
+ ResponsiveCellSpecsProvider allAppsCellSpecs = ResponsiveCellSpecsProvider.create(
+ new ResourceHelper(context,
+ isTwoPanels ? inv.allAppsCellSpecsTwoPanelId
+ : inv.allAppsCellSpecsId));
+ mResponsiveAllAppsCellSpec = allAppsCellSpecs.getCalculatedSpec(
+ responsiveAspectRatio,
+ mResponsiveAllAppsHeightSpec.getAvailableSpace(),
+ mResponsiveWorkspaceCellSpec);
}
desiredWorkspaceHorizontalMarginPx = getHorizontalMarginPx(inv, res);
@@ -965,19 +999,25 @@
* Returns the amount of extra (or unused) vertical space.
*/
private int updateAvailableDimensions(Resources res) {
+ iconCenterVertically = mIsScalableGrid || mIsResponsiveGrid;
+
+ if (mIsResponsiveGrid) {
+ iconSizePx = mResponsiveWorkspaceCellSpec.getIconSize();
+ iconTextSizePx = mResponsiveWorkspaceCellSpec.getIconTextSize();
+ mIconDrawablePaddingOriginalPx = mResponsiveWorkspaceCellSpec.getIconDrawablePadding();
+ updateIconSize(1f, res);
+ updateWorkspacePadding();
+ return 0;
+ }
+
float invIconSizeDp = inv.iconSize[mTypeIndex];
float invIconTextSizeSp = inv.iconTextSize[mTypeIndex];
iconSizePx = Math.max(1, pxFromDp(invIconSizeDp, mMetrics));
iconTextSizePx = pxFromSp(invIconTextSizeSp, mMetrics);
- iconCenterVertically = mIsScalableGrid || mIsResponsiveGrid;
updateIconSize(1f, res);
updateWorkspacePadding();
- if (mIsResponsiveGrid) {
- return 0;
- }
-
// Check to see if the icons fit within the available height.
float usedHeight = getCellLayoutHeightSpecification();
final int maxHeight = getCellLayoutHeight();
@@ -1021,7 +1061,7 @@
// TODO(b/235886078): workaround needed because of this bug
// Icons are 10% larger on XML than their visual size,
// so remove that extra space to get labels closer to the correct padding
- int iconVisibleSizePx = (int) Math.round(ICON_VISIBLE_AREA_FACTOR * iconSizePx);
+ int iconVisibleSizePx = Math.round(ICON_VISIBLE_AREA_FACTOR * iconSizePx);
return Math.max(0, iconDrawablePadding - ((iconSizePx - iconVisibleSizePx) / 2));
}
@@ -1164,7 +1204,7 @@
// All apps
if (mIsResponsiveGrid) {
- updateAllAppsWithResponsiveMeasures(res);
+ updateAllAppsWithResponsiveMeasures();
} else {
updateAllAppsIconSize(scale, res);
}
@@ -1263,13 +1303,16 @@
}
}
- private void updateAllAppsWithResponsiveMeasures(Resources res) {
+ private void updateAllAppsWithResponsiveMeasures() {
+ allAppsIconSizePx = mResponsiveAllAppsCellSpec.getIconSize();
+ allAppsIconTextSizePx = mResponsiveAllAppsCellSpec.getIconTextSize();
+ allAppsIconDrawablePaddingPx = getNormalizedIconDrawablePadding(allAppsIconSizePx,
+ mResponsiveAllAppsCellSpec.getIconDrawablePadding());
allAppsBorderSpacePx = new Point(
mResponsiveAllAppsWidthSpec.getGutterPx(),
mResponsiveAllAppsHeightSpec.getGutterPx()
);
- allAppsCellHeightPx = mResponsiveAllAppsHeightSpec.getCellSizePx()
- + mResponsiveAllAppsHeightSpec.getGutterPx();
+ allAppsCellHeightPx = mResponsiveAllAppsHeightSpec.getCellSizePx();
allAppsCellWidthPx = mResponsiveAllAppsWidthSpec.getCellSizePx();
// This workaround is needed to align AllApps icons with Workspace icons
@@ -1278,22 +1321,6 @@
allAppsPadding.left = mResponsiveAllAppsWidthSpec.getStartPaddingPx() - halfBorder;
allAppsPadding.right = mResponsiveAllAppsWidthSpec.getEndPaddingPx() - halfBorder;
- // TODO(b/287975993): Remove this after icon size is extracted to responsive grid
- // Copy icon size from the workspace when spec is matchWorkspace or
- // use the default all apps icon size
- if (mResponsiveAllAppsHeightSpec.isCellSizeMatchWorkspace()
- || mResponsiveAllAppsWidthSpec.isCellSizeMatchWorkspace()) {
- allAppsIconSizePx = iconSizePx;
- allAppsIconTextSizePx = iconTextSizePx;
- allAppsIconDrawablePaddingPx = iconDrawablePaddingPx;
- } else {
- allAppsIconSizePx = pxFromDp(inv.allAppsIconSize[mTypeIndex], mMetrics);
- allAppsIconTextSizePx = pxFromSp(inv.allAppsIconTextSize[mTypeIndex], mMetrics);
- allAppsIconDrawablePaddingPx = res.getDimensionPixelSize(
- R.dimen.all_apps_icon_drawable_padding);
- allAppsIconDrawablePaddingPx = getNormalizedIconDrawablePadding(allAppsIconSizePx,
- allAppsIconDrawablePaddingPx);
- }
// Reduce the size of the app icon if it doesn't fit
if (allAppsCellWidthPx < allAppsIconSizePx) {
@@ -1318,6 +1345,8 @@
allAppsIconDrawablePaddingPx = cellContentDimensions.getIconDrawablePaddingPx();
allAppsIconTextSizePx = cellContentDimensions.getIconTextSizePx();
}
+
+ allAppsCellHeightPx += mResponsiveAllAppsHeightSpec.getGutterPx();
}
/**
@@ -1365,16 +1394,16 @@
Point totalWorkspacePadding = getTotalWorkspacePadding();
// Check if the folder fit within the available height.
- float contentUsedHeight = folderCellHeightPx * inv.numFolderRows
- + ((inv.numFolderRows - 1) * folderCellLayoutBorderSpacePx.y)
+ float contentUsedHeight = folderCellHeightPx * numFolderRows
+ + ((numFolderRows - 1) * folderCellLayoutBorderSpacePx.y)
+ folderFooterHeightPx
+ folderContentPaddingTop;
int contentMaxHeight = availableHeightPx - totalWorkspacePadding.y;
float scaleY = contentMaxHeight / contentUsedHeight;
// Check if the folder fit within the available width.
- float contentUsedWidth = folderCellWidthPx * inv.numFolderColumns
- + ((inv.numFolderColumns - 1) * folderCellLayoutBorderSpacePx.x)
+ float contentUsedWidth = folderCellWidthPx * numFolderColumns
+ + ((numFolderColumns - 1) * folderCellLayoutBorderSpacePx.x)
+ folderContentPaddingLeftRight * 2;
int contentMaxWidth = availableWidthPx - totalWorkspacePadding.x;
float scaleX = contentMaxWidth / contentUsedWidth;
@@ -1386,15 +1415,14 @@
}
private void updateFolderCellSize(float scale, Resources res) {
- float invIconSizeDp = inv.iconSize[mTypeIndex];
- folderChildIconSizePx = Math.max(1, pxFromDp(invIconSizeDp, mMetrics, scale));
- folderChildTextSizePx = pxFromSp(inv.iconTextSize[mTypeIndex], mMetrics, scale);
- folderLabelTextSizePx = Math.max(pxFromSp(MIN_FOLDER_TEXT_SIZE_SP, mMetrics, scale),
- (int) (folderChildTextSizePx * folderLabelTextScale));
-
- int textHeight = Utilities.calculateTextHeight(folderChildTextSizePx);
-
+ int minLabelTextSize = pxFromSp(MIN_FOLDER_TEXT_SIZE_SP, mMetrics, scale);
if (mIsResponsiveGrid) {
+ folderChildIconSizePx = mResponsiveWorkspaceCellSpec.getIconSize();
+ folderChildTextSizePx = mResponsiveWorkspaceCellSpec.getIconTextSize();
+ folderLabelTextSizePx = Math.max(minLabelTextSize,
+ (int) (folderChildTextSizePx * folderLabelTextScale));
+ int textHeight = Utilities.calculateTextHeight(folderChildTextSizePx);
+
folderCellWidthPx = mResponsiveFolderWidthSpec.getCellSizePx();
folderCellHeightPx = mResponsiveFolderHeightSpec.getCellSizePx();
folderContentPaddingTop = mResponsiveFolderHeightSpec.getStartPaddingPx();
@@ -1421,9 +1449,20 @@
folderChildIconSizePx = cellContentDimensions.getIconSizePx();
folderChildDrawablePaddingPx = cellContentDimensions.getIconDrawablePaddingPx();
folderChildTextSizePx = cellContentDimensions.getIconTextSizePx();
- folderLabelTextSizePx = Math.max(pxFromSp(MIN_FOLDER_TEXT_SIZE_SP, mMetrics, scale),
+ folderLabelTextSizePx = Math.max(minLabelTextSize,
(int) (folderChildTextSizePx * folderLabelTextScale));
- } else if (mIsScalableGrid) {
+ return;
+ }
+
+ float invIconSizeDp = inv.iconSize[mTypeIndex];
+ float invIconTextSizeDp = inv.iconTextSize[mTypeIndex];
+ folderChildIconSizePx = Math.max(1, pxFromDp(invIconSizeDp, mMetrics, scale));
+ folderChildTextSizePx = pxFromSp(invIconTextSizeDp, mMetrics, scale);
+ folderLabelTextSizePx = Math.max(minLabelTextSize,
+ (int) (folderChildTextSizePx * folderLabelTextScale));
+ int textHeight = Utilities.calculateTextHeight(folderChildTextSizePx);
+
+ if (mIsScalableGrid) {
if (inv.folderStyle == INVALID_RESOURCE_HANDLE) {
folderCellWidthPx = roundPxValueFromFloat(getCellSize().x * scale);
folderCellHeightPx = roundPxValueFromFloat(getCellSize().y * scale);
@@ -1993,8 +2032,8 @@
writer.println(prefix + pxToDpStr("iconTextSizePx", iconTextSizePx));
writer.println(prefix + pxToDpStr("iconDrawablePaddingPx", iconDrawablePaddingPx));
- writer.println(prefix + "\tinv.numFolderRows: " + inv.numFolderRows);
- writer.println(prefix + "\tinv.numFolderColumns: " + inv.numFolderColumns);
+ writer.println(prefix + "\tnumFolderRows: " + numFolderRows);
+ writer.println(prefix + "\tnumFolderColumns: " + numFolderColumns);
writer.println(prefix + pxToDpStr("folderCellWidthPx", folderCellWidthPx));
writer.println(prefix + pxToDpStr("folderCellHeightPx", folderCellHeightPx));
writer.println(prefix + pxToDpStr("folderChildIconSizePx", folderChildIconSizePx));
@@ -2132,6 +2171,9 @@
writer.println(prefix + "\tmResponsiveFolderHeightSpec:" + mResponsiveFolderHeightSpec);
writer.println(prefix + "\tmResponsiveFolderWidthSpec:" + mResponsiveFolderWidthSpec);
writer.println(prefix + "\tmResponsiveHotseatSpec:" + mResponsiveHotseatSpec);
+ writer.println(prefix + "\tmResponsiveWorkspaceCellSpec:"
+ + mResponsiveWorkspaceCellSpec);
+ writer.println(prefix + "\tmResponsiveAllAppsCellSpec:" + mResponsiveAllAppsCellSpec);
}
}
diff --git a/src/com/android/launcher3/FastScrollRecyclerView.java b/src/com/android/launcher3/FastScrollRecyclerView.java
index 01e65ae..a13dcc1 100644
--- a/src/com/android/launcher3/FastScrollRecyclerView.java
+++ b/src/com/android/launcher3/FastScrollRecyclerView.java
@@ -27,6 +27,7 @@
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;
+import com.android.app.animation.Interpolators;
import com.android.launcher3.compat.AccessibilityManagerCompat;
import com.android.launcher3.views.RecyclerViewFastScroller;
@@ -194,12 +195,13 @@
}
/**
- * Scrolls this recycler view to the bottom.
+ * Scrolls this recycler view to the bottom with easing and duration.
*/
- public void scrollToBottom() {
+ public void scrollToBottomWithMotion() {
if (mScrollbar != null) {
mScrollbar.reattachThumbToScroll();
}
- smoothScrollToPosition(getAdapter().getItemCount() - 1);
+ // Emphasized interpolators with 500ms duration
+ smoothScrollBy(0, getAvailableScrollHeight(), Interpolators.EMPHASIZED, 500);
}
}
diff --git a/src/com/android/launcher3/InvariantDeviceProfile.java b/src/com/android/launcher3/InvariantDeviceProfile.java
index e5a6b2b..dfbbcaa 100644
--- a/src/com/android/launcher3/InvariantDeviceProfile.java
+++ b/src/com/android/launcher3/InvariantDeviceProfile.java
@@ -122,8 +122,8 @@
/**
* Number of icons per row and column in the folder.
*/
- public int numFolderRows;
- public int numFolderColumns;
+ public int[] numFolderRows;
+ public int[] numFolderColumns;
public float[] iconSize;
public float[] iconTextSize;
public int iconBitmapSize;
@@ -191,8 +191,18 @@
public int folderSpecsId = INVALID_RESOURCE_HANDLE;
@XmlRes
public int folderSpecsTwoPanelId = INVALID_RESOURCE_HANDLE;
+ @XmlRes
public int hotseatSpecsId = INVALID_RESOURCE_HANDLE;
+ @XmlRes
public int hotseatSpecsTwoPanelId = INVALID_RESOURCE_HANDLE;
+ @XmlRes
+ public int workspaceCellSpecsId = INVALID_RESOURCE_HANDLE;
+ @XmlRes
+ public int workspaceCellSpecsTwoPanelId = INVALID_RESOURCE_HANDLE;
+ @XmlRes
+ public int allAppsCellSpecsId = INVALID_RESOURCE_HANDLE;
+ @XmlRes
+ public int allAppsCellSpecsTwoPanelId = INVALID_RESOURCE_HANDLE;
public String dbFile;
public int defaultLayoutId;
@@ -375,6 +385,10 @@
folderSpecsTwoPanelId = closestProfile.mFolderSpecsTwoPanelId;
hotseatSpecsId = closestProfile.mHotseatSpecsId;
hotseatSpecsTwoPanelId = closestProfile.mHotseatSpecsTwoPanelId;
+ workspaceCellSpecsId = closestProfile.mWorkspaceCellSpecsId;
+ workspaceCellSpecsTwoPanelId = closestProfile.mWorkspaceCellSpecsTwoPanelId;
+ allAppsCellSpecsId = closestProfile.mAllAppsCellSpecsId;
+ allAppsCellSpecsTwoPanelId = closestProfile.mAllAppsCellSpecsTwoPanelId;
this.deviceType = deviceType;
inlineNavButtonsEndSpacing = closestProfile.inlineNavButtonsEndSpacing;
@@ -796,8 +810,8 @@
public final int numSearchContainerColumns;
public final int deviceCategory;
- private final int numFolderRows;
- private final int numFolderColumns;
+ private final int[] numFolderRows = new int[COUNT_SIZES];
+ private final int[] numFolderColumns = new int[COUNT_SIZES];
private final @StyleRes int folderStyle;
private final @StyleRes int cellStyle;
@@ -827,6 +841,10 @@
private final int mFolderSpecsTwoPanelId;
private final int mHotseatSpecsId;
private final int mHotseatSpecsTwoPanelId;
+ private final int mWorkspaceCellSpecsId;
+ private final int mWorkspaceCellSpecsTwoPanelId;
+ private final int mAllAppsCellSpecsId;
+ private final int mAllAppsCellSpecsTwoPanelId;
public GridOption(Context context, AttributeSet attrs) {
TypedArray a = context.obtainStyledAttributes(
@@ -870,11 +888,39 @@
a.getResourceId(R.styleable.GridDisplayOption_inlineNavButtonsEndSpacing,
R.dimen.taskbar_button_margin_default);
- numFolderRows = a.getInt(
+ numFolderRows[INDEX_DEFAULT] = a.getInt(
R.styleable.GridDisplayOption_numFolderRows, numRows);
- numFolderColumns = a.getInt(
+ numFolderColumns[INDEX_DEFAULT] = a.getInt(
R.styleable.GridDisplayOption_numFolderColumns, numColumns);
+ if (FeatureFlags.enableResponsiveWorkspace()) {
+ numFolderRows[INDEX_LANDSCAPE] = a.getInt(
+ R.styleable.GridDisplayOption_numFolderRowsLandscape,
+ numFolderRows[INDEX_DEFAULT]);
+ numFolderColumns[INDEX_LANDSCAPE] = a.getInt(
+ R.styleable.GridDisplayOption_numFolderColumnsLandscape,
+ numFolderColumns[INDEX_DEFAULT]);
+ numFolderRows[INDEX_TWO_PANEL_PORTRAIT] = a.getInt(
+ R.styleable.GridDisplayOption_numFolderRowsTwoPanelPortrait,
+ numFolderRows[INDEX_DEFAULT]);
+ numFolderColumns[INDEX_TWO_PANEL_PORTRAIT] = a.getInt(
+ R.styleable.GridDisplayOption_numFolderColumnsTwoPanelPortrait,
+ numFolderColumns[INDEX_DEFAULT]);
+ numFolderRows[INDEX_TWO_PANEL_LANDSCAPE] = a.getInt(
+ R.styleable.GridDisplayOption_numFolderRowsTwoPanelLandscape,
+ numFolderRows[INDEX_DEFAULT]);
+ numFolderColumns[INDEX_TWO_PANEL_LANDSCAPE] = a.getInt(
+ R.styleable.GridDisplayOption_numFolderColumnsTwoPanelLandscape,
+ numFolderColumns[INDEX_DEFAULT]);
+ } else {
+ numFolderRows[INDEX_LANDSCAPE] = numFolderRows[INDEX_DEFAULT];
+ numFolderColumns[INDEX_LANDSCAPE] = numFolderColumns[INDEX_DEFAULT];
+ numFolderRows[INDEX_TWO_PANEL_PORTRAIT] = numFolderRows[INDEX_DEFAULT];
+ numFolderColumns[INDEX_TWO_PANEL_PORTRAIT] = numFolderColumns[INDEX_DEFAULT];
+ numFolderRows[INDEX_TWO_PANEL_LANDSCAPE] = numFolderRows[INDEX_DEFAULT];
+ numFolderColumns[INDEX_TWO_PANEL_LANDSCAPE] = numFolderColumns[INDEX_DEFAULT];
+ }
+
folderStyle = a.getResourceId(R.styleable.GridDisplayOption_folderStyle,
INVALID_RESOURCE_HANDLE);
@@ -909,6 +955,18 @@
mHotseatSpecsTwoPanelId = a.getResourceId(
R.styleable.GridDisplayOption_hotseatSpecsTwoPanelId,
INVALID_RESOURCE_HANDLE);
+ mWorkspaceCellSpecsId = a.getResourceId(
+ R.styleable.GridDisplayOption_workspaceCellSpecsId,
+ INVALID_RESOURCE_HANDLE);
+ mWorkspaceCellSpecsTwoPanelId = a.getResourceId(
+ R.styleable.GridDisplayOption_workspaceCellSpecsTwoPanelId,
+ INVALID_RESOURCE_HANDLE);
+ mAllAppsCellSpecsId = a.getResourceId(
+ R.styleable.GridDisplayOption_allAppsCellSpecsId,
+ INVALID_RESOURCE_HANDLE);
+ mAllAppsCellSpecsTwoPanelId = a.getResourceId(
+ R.styleable.GridDisplayOption_allAppsCellSpecsTwoPanelId,
+ INVALID_RESOURCE_HANDLE);
} else {
mWorkspaceSpecsId = INVALID_RESOURCE_HANDLE;
mWorkspaceSpecsTwoPanelId = INVALID_RESOURCE_HANDLE;
@@ -918,6 +976,10 @@
mFolderSpecsTwoPanelId = INVALID_RESOURCE_HANDLE;
mHotseatSpecsId = INVALID_RESOURCE_HANDLE;
mHotseatSpecsTwoPanelId = INVALID_RESOURCE_HANDLE;
+ mWorkspaceCellSpecsId = INVALID_RESOURCE_HANDLE;
+ mWorkspaceCellSpecsTwoPanelId = INVALID_RESOURCE_HANDLE;
+ mAllAppsCellSpecsId = INVALID_RESOURCE_HANDLE;
+ mAllAppsCellSpecsTwoPanelId = INVALID_RESOURCE_HANDLE;
}
int inlineForRotation = a.getInt(R.styleable.GridDisplayOption_inlineQsb,
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index 22870bc..9f7575d 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -528,6 +528,7 @@
mAppWidgetManager = new WidgetManagerHelper(this);
mAppWidgetHolder = createAppWidgetHolder();
mAppWidgetHolder.startListening();
+ mAppWidgetHolder.addProviderChangeListener(() -> refreshAndBindWidgetsForPackageUser(null));
mPopupDataProvider = new PopupDataProvider(this::updateNotificationDots);
@@ -802,7 +803,7 @@
if (info.container >= 0) {
View folderIcon = getWorkspace().getHomescreenIconByItemId(info.container);
if (folderIcon instanceof FolderIcon && folderIcon.getTag() instanceof FolderInfo) {
- if (new FolderGridOrganizer(getDeviceProfile().inv)
+ if (new FolderGridOrganizer(getDeviceProfile())
.setFolderInfo((FolderInfo) folderIcon.getTag())
.isItemInPreview(info.rank)) {
folderIcon.invalidate();
@@ -2657,7 +2658,7 @@
// Cache one page worth of icons
getViewCache().setCacheSize(R.layout.folder_application,
- mDeviceProfile.inv.numFolderColumns * mDeviceProfile.inv.numFolderRows);
+ mDeviceProfile.numFolderColumns * mDeviceProfile.numFolderRows);
getViewCache().setCacheSize(R.layout.folder_page, 2);
TraceHelper.INSTANCE.endSection();
diff --git a/src/com/android/launcher3/MultipageCellLayout.java b/src/com/android/launcher3/MultipageCellLayout.java
index 4b5c9ef..123e8ca 100644
--- a/src/com/android/launcher3/MultipageCellLayout.java
+++ b/src/com/android/launcher3/MultipageCellLayout.java
@@ -23,6 +23,7 @@
import android.view.View;
import com.android.launcher3.celllayout.CellLayoutLayoutParams;
+import com.android.launcher3.celllayout.ItemConfiguration;
import com.android.launcher3.celllayout.MulticellReorderAlgorithm;
import com.android.launcher3.util.CellAndSpan;
import com.android.launcher3.util.GridOccupancy;
diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java
index 8ba6d2c..3f1ccb9 100644
--- a/src/com/android/launcher3/Utilities.java
+++ b/src/com/android/launcher3/Utilities.java
@@ -79,7 +79,6 @@
import com.android.launcher3.dragndrop.FolderAdaptiveIcon;
import com.android.launcher3.graphics.TintedDrawableSpan;
-import com.android.launcher3.icons.BaseIconFactory;
import com.android.launcher3.icons.BitmapInfo;
import com.android.launcher3.icons.LauncherIcons;
import com.android.launcher3.icons.ShortcutCachingLogic;
@@ -91,6 +90,7 @@
import com.android.launcher3.shortcuts.ShortcutKey;
import com.android.launcher3.shortcuts.ShortcutRequest;
import com.android.launcher3.testing.shared.ResourceUtils;
+import com.android.launcher3.util.FlagOp;
import com.android.launcher3.util.IntArray;
import com.android.launcher3.util.SplitConfigurationOptions.SplitPositionOption;
import com.android.launcher3.util.Themes;
@@ -676,12 +676,11 @@
}
if (badge == null) {
- try (LauncherIcons li = LauncherIcons.obtain(context)) {
- badge = BitmapInfo.LOW_RES_INFO.withFlags(
- li.getBitmapFlagOp(new BaseIconFactory.IconOptions().setUser(
- UserCache.INSTANCE.get(context).getUserInfo(info.user))))
- .getBadgeDrawable(context, useTheme);
- }
+ badge = BitmapInfo.LOW_RES_INFO.withFlags(
+ UserCache.INSTANCE.get(context)
+ .getUserInfo(info.user)
+ .applyBitmapInfoFlags(FlagOp.NO_OP))
+ .getBadgeDrawable(context, useTheme);
if (badge == null) {
badge = new ColorDrawable(Color.TRANSPARENT);
}
diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java
index 30f3f5f..be4168d 100644
--- a/src/com/android/launcher3/Workspace.java
+++ b/src/com/android/launcher3/Workspace.java
@@ -74,6 +74,7 @@
import com.android.launcher3.accessibility.WorkspaceAccessibilityHelper;
import com.android.launcher3.anim.PendingAnimation;
import com.android.launcher3.apppairs.AppPairIcon;
+import com.android.launcher3.celllayout.CellInfo;
import com.android.launcher3.celllayout.CellLayoutLayoutParams;
import com.android.launcher3.celllayout.CellPosMapper;
import com.android.launcher3.celllayout.CellPosMapper.CellPos;
@@ -189,7 +190,7 @@
/**
* CellInfo for the cell that is currently being dragged
*/
- protected CellLayout.CellInfo mDragInfo;
+ protected CellInfo mDragInfo;
/**
* Target drop area calculated during last acceptDrop call.
@@ -1620,7 +1621,7 @@
page.setAccessibilityDelegate(null);
}
- public void startDrag(CellLayout.CellInfo cellInfo, DragOptions options) {
+ public void startDrag(CellInfo cellInfo, DragOptions options) {
View child = cellInfo.cell;
mDragInfo = cellInfo;
@@ -1784,7 +1785,7 @@
int spanX;
int spanY;
if (mDragInfo != null) {
- final CellLayout.CellInfo dragCellInfo = mDragInfo;
+ final CellInfo dragCellInfo = mDragInfo;
spanX = dragCellInfo.spanX;
spanY = dragCellInfo.spanY;
} else {
@@ -3078,7 +3079,7 @@
* so that Launcher can sync this object with the correct info when the activity is created/
* destroyed
*/
- public CellLayout.CellInfo getDragInfo() {
+ public CellInfo getDragInfo() {
return mDragInfo;
}
diff --git a/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java b/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java
index c9e5b1e..e5a223a 100644
--- a/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java
+++ b/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java
@@ -515,7 +515,7 @@
// Switch to the main tab
switchToTab(ActivityAllAppsContainerView.AdapterHolder.MAIN);
// Scroll to bottom
- getActiveRecyclerView().scrollToBottom();
+ getActiveRecyclerView().scrollToBottomWithMotion();
});
}
diff --git a/src/com/android/launcher3/celllayout/CellInfo.kt b/src/com/android/launcher3/celllayout/CellInfo.kt
new file mode 100644
index 0000000..5a3b7f7
--- /dev/null
+++ b/src/com/android/launcher3/celllayout/CellInfo.kt
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.launcher3.celllayout
+
+import android.view.View
+import com.android.launcher3.celllayout.CellPosMapper.CellPos
+import com.android.launcher3.model.data.ItemInfo
+import com.android.launcher3.util.CellAndSpan
+
+// This class stores info for two purposes:
+// 1. When dragging items (mDragInfo in Workspace), we store the View, its cellX & cellY,
+// its spanX, spanY, and the screen it is on
+// 2. When long clicking on an empty cell in a CellLayout, we save information about the
+// cellX and cellY coordinates and which page was clicked. We then set this as a tag on
+// the CellLayout that was long clicked
+class CellInfo(v: View?, info: ItemInfo, cellPos: CellPos) :
+ CellAndSpan(cellPos.cellX, cellPos.cellY, info.spanX, info.spanY) {
+ @JvmField val cell: View?
+ @JvmField val screenId: Int
+ @JvmField val container: Int
+
+ init {
+ cell = v
+ screenId = cellPos.screenId
+ container = info.container
+ }
+
+ override fun toString(): String {
+ return "CellInfo(cell=$cell, screenId=$screenId, container=$container)"
+ }
+}
diff --git a/src/com/android/launcher3/celllayout/DelegatedCellDrawing.kt b/src/com/android/launcher3/celllayout/DelegatedCellDrawing.kt
new file mode 100644
index 0000000..1703f9b
--- /dev/null
+++ b/src/com/android/launcher3/celllayout/DelegatedCellDrawing.kt
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.launcher3.celllayout
+
+import android.graphics.Canvas
+
+/** A Delegated cell Drawing for drawing on CellLayout */
+abstract class DelegatedCellDrawing {
+ @JvmField var mDelegateCellX = 0
+ @JvmField var mDelegateCellY = 0
+
+ /** Draw under CellLayout */
+ abstract fun drawUnderItem(canvas: Canvas)
+
+ /** Draw over CellLayout */
+ abstract fun drawOverItem(canvas: Canvas)
+}
diff --git a/src/com/android/launcher3/celllayout/ItemConfiguration.kt b/src/com/android/launcher3/celllayout/ItemConfiguration.kt
new file mode 100644
index 0000000..e775145
--- /dev/null
+++ b/src/com/android/launcher3/celllayout/ItemConfiguration.kt
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.launcher3.celllayout
+
+import android.graphics.Rect
+import android.util.ArrayMap
+import android.view.View
+import com.android.launcher3.util.CellAndSpan
+
+/** Represents the solution to a reorder of items in the Workspace. */
+class ItemConfiguration : CellAndSpan() {
+ @JvmField val map = ArrayMap<View, CellAndSpan>()
+ private val savedMap = ArrayMap<View, CellAndSpan>()
+
+ @JvmField val sortedViews = ArrayList<View>()
+
+ @JvmField var intersectingViews: ArrayList<View> = ArrayList()
+
+ @JvmField var isSolution = false
+ fun save() {
+ // Copy current state into savedMap
+ map.forEach { (k, v) -> savedMap[k]?.copyFrom(v) }
+ }
+
+ fun restore() {
+ // Restore current state from savedMap
+ savedMap.forEach { (k, v) -> map[k]?.copyFrom(v) }
+ }
+
+ fun add(v: View, cs: CellAndSpan) {
+ map[v] = cs
+ savedMap[v] = CellAndSpan()
+ sortedViews.add(v)
+ }
+
+ fun area(): Int {
+ return spanX * spanY
+ }
+
+ fun getBoundingRectForViews(views: ArrayList<View>, outRect: Rect) {
+ views
+ .mapNotNull { v -> map[v] }
+ .forEachIndexed { i, c ->
+ if (i == 0) outRect.set(c.cellX, c.cellY, c.cellX + c.spanX, c.cellY + c.spanY)
+ else outRect.union(c.cellX, c.cellY, c.cellX + c.spanX, c.cellY + c.spanY)
+ }
+ }
+}
diff --git a/src/com/android/launcher3/celllayout/MulticellReorderAlgorithm.java b/src/com/android/launcher3/celllayout/MulticellReorderAlgorithm.java
index a2e26b3..7deb653 100644
--- a/src/com/android/launcher3/celllayout/MulticellReorderAlgorithm.java
+++ b/src/com/android/launcher3/celllayout/MulticellReorderAlgorithm.java
@@ -38,8 +38,8 @@
mSeam = new View(cellLayout.getContext());
}
- private CellLayout.ItemConfiguration removeSeamFromSolution(
- CellLayout.ItemConfiguration solution) {
+ public ItemConfiguration removeSeamFromSolution(ItemConfiguration solution) {
+ solution.map.remove(mSeam);
solution.map.forEach((view, cell) -> cell.cellX =
cell.cellX > mCellLayout.getCountX() / 2 ? cell.cellX - 1 : cell.cellX);
solution.cellX =
@@ -48,25 +48,24 @@
}
@Override
- public CellLayout.ItemConfiguration closestEmptySpaceReorder(int pixelX, int pixelY,
- int minSpanX, int minSpanY,
- int spanX, int spanY) {
+ public ItemConfiguration closestEmptySpaceReorder(int pixelX, int pixelY, int minSpanX,
+ int minSpanY, int spanX, int spanY) {
return removeSeamFromSolution(simulateSeam(
() -> super.closestEmptySpaceReorder(pixelX, pixelY, minSpanX, minSpanY, spanX,
spanY)));
}
@Override
- public CellLayout.ItemConfiguration findReorderSolution(int pixelX, int pixelY, int minSpanX,
+ public ItemConfiguration findReorderSolution(int pixelX, int pixelY, int minSpanX,
int minSpanY, int spanX, int spanY, int[] direction, View dragView, boolean decX,
- CellLayout.ItemConfiguration solution) {
+ ItemConfiguration solution) {
return removeSeamFromSolution(simulateSeam(
() -> super.findReorderSolution(pixelX, pixelY, minSpanX, minSpanY, spanX, spanY,
direction, dragView, decX, solution)));
}
@Override
- public CellLayout.ItemConfiguration dropInPlaceSolution(int pixelX, int pixelY, int spanX,
+ public ItemConfiguration dropInPlaceSolution(int pixelX, int pixelY, int spanX,
int spanY,
View dragView) {
return removeSeamFromSolution(simulateSeam(
diff --git a/src/com/android/launcher3/celllayout/ReorderAlgorithm.java b/src/com/android/launcher3/celllayout/ReorderAlgorithm.java
index 17786f2..0f6464b 100644
--- a/src/com/android/launcher3/celllayout/ReorderAlgorithm.java
+++ b/src/com/android/launcher3/celllayout/ReorderAlgorithm.java
@@ -59,9 +59,17 @@
* @param solution variable to store the solution
* @return the same solution variable
*/
- public CellLayout.ItemConfiguration findReorderSolution(int pixelX, int pixelY, int minSpanX,
+ public ItemConfiguration findReorderSolution(int pixelX, int pixelY, int minSpanX,
int minSpanY, int spanX, int spanY, int[] direction, View dragView, boolean decX,
- CellLayout.ItemConfiguration solution) {
+ ItemConfiguration solution) {
+ return findReorderSolutionRecursive(pixelX, pixelY, minSpanX, minSpanY, spanX, spanY,
+ direction, dragView, decX, solution);
+ }
+
+
+ private ItemConfiguration findReorderSolutionRecursive(int pixelX, int pixelY,
+ int minSpanX, int minSpanY, int spanX, int spanY, int[] direction, View dragView,
+ boolean decX, ItemConfiguration solution) {
// Copy the current state into the solution. This solution will be manipulated as necessary.
mCellLayout.copyCurrentStateToSolution(solution, false);
// Copy the current occupied array into the temporary occupied array. This array will be
@@ -83,11 +91,11 @@
// We try shrinking the widget down to size in an alternating pattern, shrink 1 in
// x, then 1 in y etc.
if (spanX > minSpanX && (minSpanY == spanY || decX)) {
- return findReorderSolution(pixelX, pixelY, minSpanX, minSpanY, spanX - 1, spanY,
- direction, dragView, false, solution);
+ return findReorderSolutionRecursive(pixelX, pixelY, minSpanX, minSpanY, spanX - 1,
+ spanY, direction, dragView, false, solution);
} else if (spanY > minSpanY) {
- return findReorderSolution(pixelX, pixelY, minSpanX, minSpanY, spanX, spanY - 1,
- direction, dragView, true, solution);
+ return findReorderSolutionRecursive(pixelX, pixelY, minSpanX, minSpanY, spanX,
+ spanY - 1, direction, dragView, true, solution);
}
solution.isSolution = false;
} else {
@@ -110,11 +118,11 @@
* @param dragView view being dragged in reorder
* @return the configuration that represents the found reorder
*/
- public CellLayout.ItemConfiguration dropInPlaceSolution(int pixelX, int pixelY, int spanX,
+ public ItemConfiguration dropInPlaceSolution(int pixelX, int pixelY, int spanX,
int spanY, View dragView) {
int[] result = mCellLayout.findNearestAreaIgnoreOccupied(pixelX, pixelY, spanX, spanY,
new int[2]);
- CellLayout.ItemConfiguration solution = new CellLayout.ItemConfiguration();
+ ItemConfiguration solution = new ItemConfiguration();
mCellLayout.copyCurrentStateToSolution(solution, false);
solution.isSolution = !isConfigurationRegionOccupied(
@@ -133,7 +141,7 @@
}
private boolean isConfigurationRegionOccupied(Rect region,
- CellLayout.ItemConfiguration configuration, View ignoreView) {
+ ItemConfiguration configuration, View ignoreView) {
return configuration.map.entrySet()
.stream()
.filter(entry -> entry.getKey() != ignoreView)
@@ -153,9 +161,9 @@
* @param spanY vertical cell span
* @return the configuration that represents the found reorder
*/
- public CellLayout.ItemConfiguration closestEmptySpaceReorder(int pixelX, int pixelY,
+ public ItemConfiguration closestEmptySpaceReorder(int pixelX, int pixelY,
int minSpanX, int minSpanY, int spanX, int spanY) {
- CellLayout.ItemConfiguration solution = new CellLayout.ItemConfiguration();
+ ItemConfiguration solution = new ItemConfiguration();
int[] result = new int[2];
int[] resultSpan = new int[2];
mCellLayout.findNearestVacantArea(pixelX, pixelY, minSpanX, minSpanY, spanX, spanY, result,
@@ -188,23 +196,22 @@
* @return returns a solution for the given parameters, the solution contains all the icons and
* the locations they should be in the given solution.
*/
- public CellLayout.ItemConfiguration calculateReorder(int pixelX, int pixelY, int minSpanX,
+ public ItemConfiguration calculateReorder(int pixelX, int pixelY, int minSpanX,
int minSpanY, int spanX, int spanY, View dragView) {
mCellLayout.getDirectionVectorForDrop(pixelX, pixelY, spanX, spanY, dragView,
mCellLayout.mDirectionVector);
- CellLayout.ItemConfiguration dropInPlaceSolution = dropInPlaceSolution(pixelX, pixelY,
- spanX, spanY,
+ ItemConfiguration dropInPlaceSolution = dropInPlaceSolution(pixelX, pixelY, spanX, spanY,
dragView);
// Find a solution involving pushing / displacing any items in the way
- CellLayout.ItemConfiguration swapSolution = findReorderSolution(pixelX, pixelY, minSpanX,
+ ItemConfiguration swapSolution = findReorderSolution(pixelX, pixelY, minSpanX,
minSpanY, spanX, spanY, mCellLayout.mDirectionVector, dragView, true,
- new CellLayout.ItemConfiguration());
+ new ItemConfiguration());
// We attempt the approach which doesn't shuffle views at all
- CellLayout.ItemConfiguration closestSpaceSolution = closestEmptySpaceReorder(
- pixelX, pixelY, minSpanX, minSpanY, spanX, spanY);
+ ItemConfiguration closestSpaceSolution = closestEmptySpaceReorder(pixelX, pixelY, minSpanX,
+ minSpanY, spanX, spanY);
// If the reorder solution requires resizing (shrinking) the item being dropped, we instead
// favor a solution in which the item is not resized, but
diff --git a/src/com/android/launcher3/celllayout/ViewCluster.kt b/src/com/android/launcher3/celllayout/ViewCluster.kt
new file mode 100644
index 0000000..49693e3
--- /dev/null
+++ b/src/com/android/launcher3/celllayout/ViewCluster.kt
@@ -0,0 +1,185 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.launcher3.celllayout
+
+import android.graphics.Rect
+import android.view.View
+import com.android.launcher3.CellLayout
+import java.util.Collections
+
+/**
+ * This helper class defines a cluster of views. It helps with defining complex edges of the cluster
+ * and determining how those edges interact with other views. The edges essentially define a
+ * fine-grained boundary around the cluster of views -- like a more precise version of a bounding
+ * box.
+ */
+class ViewCluster(
+ private val mCellLayout: CellLayout,
+ views: ArrayList<View>,
+ val config: ItemConfiguration
+) {
+
+ @JvmField val views = ArrayList<View>(views)
+ private val boundingRect = Rect()
+
+ private val leftEdge = IntArray(mCellLayout.countY)
+ private val rightEdge = IntArray(mCellLayout.countY)
+ private val topEdge = IntArray(mCellLayout.countX)
+ private val bottomEdge = IntArray(mCellLayout.countX)
+
+ private var dirtyEdges = 0
+ private var boundingRectDirty = false
+
+ val comparator: PositionComparator = PositionComparator()
+
+ init {
+ resetEdges()
+ }
+ private fun resetEdges() {
+ for (i in 0 until mCellLayout.countX) {
+ topEdge[i] = -1
+ bottomEdge[i] = -1
+ }
+ for (i in 0 until mCellLayout.countY) {
+ leftEdge[i] = -1
+ rightEdge[i] = -1
+ }
+ dirtyEdges = LEFT or TOP or RIGHT or BOTTOM
+ boundingRectDirty = true
+ }
+
+ private fun computeEdge(which: Int) =
+ views
+ .mapNotNull { v -> config.map[v] }
+ .forEach { cs ->
+ val left = cs.cellX
+ val right = cs.cellX + cs.spanX
+ val top = cs.cellY
+ val bottom = cs.cellY + cs.spanY
+ when (which) {
+ LEFT ->
+ for (j in top until bottom) {
+ if (left < leftEdge[j] || leftEdge[j] < 0) {
+ leftEdge[j] = left
+ }
+ }
+ RIGHT ->
+ for (j in top until bottom) {
+ if (right > rightEdge[j]) {
+ rightEdge[j] = right
+ }
+ }
+ TOP ->
+ for (j in left until right) {
+ if (top < topEdge[j] || topEdge[j] < 0) {
+ topEdge[j] = top
+ }
+ }
+ BOTTOM ->
+ for (j in left until right) {
+ if (bottom > bottomEdge[j]) {
+ bottomEdge[j] = bottom
+ }
+ }
+ }
+ }
+
+ fun isViewTouchingEdge(v: View?, whichEdge: Int): Boolean {
+ val cs = config.map[v] ?: return false
+ val left = cs.cellX
+ val right = cs.cellX + cs.spanX
+ val top = cs.cellY
+ val bottom = cs.cellY + cs.spanY
+ if ((dirtyEdges and whichEdge) == whichEdge) {
+ computeEdge(whichEdge)
+ dirtyEdges = dirtyEdges and whichEdge.inv()
+ }
+ return when (whichEdge) {
+ // In this case if any of the values of leftEdge is equal to right, which is the
+ // rightmost x value of the view, it means that the cluster is touching the view from
+ // the left the same logic applies for the other sides.
+ LEFT -> edgeContainsValue(top, bottom, leftEdge, right)
+ RIGHT -> edgeContainsValue(top, bottom, rightEdge, left)
+ TOP -> edgeContainsValue(left, right, topEdge, bottom)
+ BOTTOM -> edgeContainsValue(left, right, bottomEdge, top)
+ else -> false
+ }
+ }
+
+ private fun edgeContainsValue(start: Int, end: Int, edge: IntArray, value: Int): Boolean {
+ for (i in start until end) {
+ if (edge[i] == value) {
+ return true
+ }
+ }
+ return false
+ }
+
+ fun shift(whichEdge: Int, delta: Int) {
+ views
+ .mapNotNull { v -> config.map[v] }
+ .forEach { c ->
+ when (whichEdge) {
+ LEFT -> c.cellX -= delta
+ RIGHT -> c.cellX += delta
+ TOP -> c.cellY -= delta
+ BOTTOM -> c.cellY += delta
+ else -> c.cellY += delta
+ }
+ }
+ resetEdges()
+ }
+
+ fun addView(v: View) {
+ views.add(v)
+ resetEdges()
+ }
+
+ fun getBoundingRect(): Rect {
+ if (boundingRectDirty) {
+ config.getBoundingRectForViews(views, boundingRect)
+ }
+ return boundingRect
+ }
+
+ inner class PositionComparator : Comparator<View?> {
+ var whichEdge = 0
+ override fun compare(left: View?, right: View?): Int {
+ val l = config.map[left]
+ val r = config.map[right]
+ if (l == null || r == null) throw NullPointerException()
+ return when (whichEdge) {
+ LEFT -> r.cellX + r.spanX - (l.cellX + l.spanX)
+ RIGHT -> l.cellX - r.cellX
+ TOP -> r.cellY + r.spanY - (l.cellY + l.spanY)
+ BOTTOM -> l.cellY - r.cellY
+ else -> l.cellY - r.cellY
+ }
+ }
+ }
+
+ fun sortConfigurationForEdgePush(edge: Int) {
+ comparator.whichEdge = edge
+ Collections.sort(config.sortedViews, comparator)
+ }
+
+ companion object {
+ const val LEFT = 1 shl 0
+ const val TOP = 1 shl 1
+ const val RIGHT = 1 shl 2
+ const val BOTTOM = 1 shl 3
+ }
+}
diff --git a/src/com/android/launcher3/config/FeatureFlags.java b/src/com/android/launcher3/config/FeatureFlags.java
index 14d1683..2a64eea 100644
--- a/src/com/android/launcher3/config/FeatureFlags.java
+++ b/src/com/android/launcher3/config/FeatureFlags.java
@@ -198,7 +198,7 @@
"Enables generating the reorder using a set of parameters");
public static final BooleanFlag ENABLE_NO_LONG_PRESS_DRAG = getDebugFlag(299748096,
- "ENABLE_NO_LONG_PRESS_DRAG", DISABLED,
+ "ENABLE_NO_LONG_PRESS_DRAG", ENABLED,
"Don't trigger the drag if we are still under long press");
// TODO(Block 12): Clean up flags
diff --git a/src/com/android/launcher3/folder/Folder.java b/src/com/android/launcher3/folder/Folder.java
index 8bf7ec2..e7a559e 100644
--- a/src/com/android/launcher3/folder/Folder.java
+++ b/src/com/android/launcher3/folder/Folder.java
@@ -1082,7 +1082,7 @@
private void updateItemLocationsInDatabaseBatch(boolean isBind) {
FolderGridOrganizer verifier = new FolderGridOrganizer(
- mActivityContext.getDeviceProfile().inv).setFolderInfo(mInfo);
+ mActivityContext.getDeviceProfile()).setFolderInfo(mInfo);
ArrayList<ItemInfo> items = new ArrayList<>();
int total = mInfo.contents.size();
@@ -1381,7 +1381,7 @@
@Override
public void onAdd(WorkspaceItemInfo item, int rank) {
FolderGridOrganizer verifier = new FolderGridOrganizer(
- mActivityContext.getDeviceProfile().inv).setFolderInfo(mInfo);
+ mActivityContext.getDeviceProfile()).setFolderInfo(mInfo);
verifier.updateRankAndPos(item, rank);
mLauncherDelegate.getModelWriter().addOrMoveItemInDatabase(item, mInfo.id, 0, item.cellX,
item.cellY);
diff --git a/src/com/android/launcher3/folder/FolderAnimationManager.java b/src/com/android/launcher3/folder/FolderAnimationManager.java
index 9e2e2bf..a91373b 100644
--- a/src/com/android/launcher3/folder/FolderAnimationManager.java
+++ b/src/com/android/launcher3/folder/FolderAnimationManager.java
@@ -96,7 +96,7 @@
mContext = folder.getContext();
mDeviceProfile = folder.mActivityContext.getDeviceProfile();
- mPreviewVerifier = new FolderGridOrganizer(mDeviceProfile.inv);
+ mPreviewVerifier = new FolderGridOrganizer(mDeviceProfile);
mIsOpening = isOpening;
diff --git a/src/com/android/launcher3/folder/FolderGridOrganizer.java b/src/com/android/launcher3/folder/FolderGridOrganizer.java
index 4be82ed..0436011 100644
--- a/src/com/android/launcher3/folder/FolderGridOrganizer.java
+++ b/src/com/android/launcher3/folder/FolderGridOrganizer.java
@@ -20,7 +20,7 @@
import android.graphics.Point;
-import com.android.launcher3.InvariantDeviceProfile;
+import com.android.launcher3.DeviceProfile;
import com.android.launcher3.model.data.FolderInfo;
import com.android.launcher3.model.data.ItemInfo;
@@ -41,16 +41,33 @@
private int mCountX;
private int mCountY;
private boolean mDisplayingUpperLeftQuadrant = false;
+ private static final int PREVIEW_MAX_ROWS = 2;
+ private static final int PREVIEW_MAX_COLUMNS = 2;
/**
* Note: must call {@link #setFolderInfo(FolderInfo)} manually for verifier to work.
*/
- public FolderGridOrganizer(InvariantDeviceProfile profile) {
+ public FolderGridOrganizer(DeviceProfile profile) {
mMaxCountX = profile.numFolderColumns;
mMaxCountY = profile.numFolderRows;
mMaxItemsPerPage = mMaxCountX * mMaxCountY;
}
+ private FolderGridOrganizer(int maxCountX, int maxCountY) {
+ mMaxCountX = maxCountX;
+ mMaxCountY = maxCountY;
+ mMaxItemsPerPage = mMaxCountX * mMaxCountY;
+ }
+
+ /**
+ * Returns a FolderGridOrganizer that should only be used to verify if the folder icon is
+ * showing in the preview. Max number of rows is {@link #PREVIEW_MAX_ROWS} and columns is
+ * {@link #PREVIEW_MAX_COLUMNS}.
+ */
+ public static FolderGridOrganizer getPreviewIconVerifier() {
+ return new FolderGridOrganizer(PREVIEW_MAX_ROWS, PREVIEW_MAX_COLUMNS);
+ }
+
/**
* Updates the organizer with the provided folder info
*/
@@ -127,6 +144,7 @@
/**
* Updates the item's cellX, cellY and rank corresponding to the provided rank.
+ *
* @return true if there was any change
*/
public boolean updateRankAndPos(ItemInfo item, int rank) {
@@ -189,7 +207,7 @@
if (page > 0 || mDisplayingUpperLeftQuadrant) {
int col = rank % mCountX;
int row = rank / mCountX;
- return col < 2 && row < 2;
+ return col < PREVIEW_MAX_COLUMNS && row < PREVIEW_MAX_ROWS;
}
return rank < MAX_NUM_ITEMS_IN_PREVIEW;
}
diff --git a/src/com/android/launcher3/folder/FolderIcon.java b/src/com/android/launcher3/folder/FolderIcon.java
index cb1dc4f..c80fb8c 100644
--- a/src/com/android/launcher3/folder/FolderIcon.java
+++ b/src/com/android/launcher3/folder/FolderIcon.java
@@ -221,7 +221,7 @@
icon.setAccessibilityDelegate(activity.getAccessibilityDelegate());
- icon.mPreviewVerifier = new FolderGridOrganizer(activity.getDeviceProfile().inv);
+ icon.mPreviewVerifier = new FolderGridOrganizer(activity.getDeviceProfile());
icon.mPreviewVerifier.setFolderInfo(folderInfo);
icon.updatePreviewItems(false);
diff --git a/src/com/android/launcher3/folder/FolderPagedView.java b/src/com/android/launcher3/folder/FolderPagedView.java
index 36e5e1b..f2bed92 100644
--- a/src/com/android/launcher3/folder/FolderPagedView.java
+++ b/src/com/android/launcher3/folder/FolderPagedView.java
@@ -37,8 +37,6 @@
import com.android.launcher3.BubbleTextView;
import com.android.launcher3.CellLayout;
import com.android.launcher3.DeviceProfile;
-import com.android.launcher3.InvariantDeviceProfile;
-import com.android.launcher3.LauncherAppState;
import com.android.launcher3.PagedView;
import com.android.launcher3.R;
import com.android.launcher3.ShortcutAndWidgetContainer;
@@ -101,14 +99,15 @@
public FolderPagedView(Context context, AttributeSet attrs) {
super(context, attrs);
- InvariantDeviceProfile profile = LauncherAppState.getIDP(context);
+ ActivityContext activityContext = ActivityContext.lookupContext(context);
+ DeviceProfile profile = activityContext.getDeviceProfile();
mOrganizer = new FolderGridOrganizer(profile);
mIsRtl = Utilities.isRtl(getResources());
setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES);
mFocusIndicatorHelper = new ViewGroupFocusHelper(this);
- mViewCache = ActivityContext.lookupContext(context).getViewCache();
+ mViewCache = activityContext.getViewCache();
}
public void setFolder(Folder folder) {
diff --git a/src/com/android/launcher3/folder/PreviewBackground.java b/src/com/android/launcher3/folder/PreviewBackground.java
index b320ceb..ec03803 100644
--- a/src/com/android/launcher3/folder/PreviewBackground.java
+++ b/src/com/android/launcher3/folder/PreviewBackground.java
@@ -48,6 +48,7 @@
import com.android.launcher3.CellLayout;
import com.android.launcher3.DeviceProfile;
import com.android.launcher3.R;
+import com.android.launcher3.celllayout.DelegatedCellDrawing;
import com.android.launcher3.util.Themes;
import com.android.launcher3.views.ActivityContext;
@@ -55,7 +56,7 @@
* This object represents a FolderIcon preview background. It stores drawing / measurement
* information, handles drawing, and animation (accept state <--> rest state).
*/
-public class PreviewBackground extends CellLayout.DelegatedCellDrawing {
+public class PreviewBackground extends DelegatedCellDrawing {
private static final boolean DRAW_SHADOW = false;
private static final boolean DRAW_STROKE = false;
diff --git a/src/com/android/launcher3/logging/KeyboardStateManager.java b/src/com/android/launcher3/logging/KeyboardStateManager.java
index d0f9c74..cd80608 100644
--- a/src/com/android/launcher3/logging/KeyboardStateManager.java
+++ b/src/com/android/launcher3/logging/KeyboardStateManager.java
@@ -28,6 +28,9 @@
// Height of the keyboard when it's shown.
// mImeShownHeightPx>=mImeHeightPx always.
private int mImeShownHeightPx;
+ // Indicate if the latest All Apps session was started from a11y action (rather than a direct
+ // user interaction).
+ private boolean mLaunchedFromA11y;
public enum KeyboardState {
NO_IME_ACTION,
@@ -89,4 +92,14 @@
mImeShownHeightPx = mImeHeightPx;
}
}
+
+ /** Getter for {@code mLaunchedFromA11y} */
+ public boolean getLaunchedFromA11y() {
+ return mLaunchedFromA11y;
+ }
+
+ /** Setter for {@code mLaunchedFromA11y} */
+ public void setLaunchedFromA11y(boolean fromA11y) {
+ mLaunchedFromA11y = fromA11y;
+ }
}
diff --git a/src/com/android/launcher3/logging/StatsLogManager.java b/src/com/android/launcher3/logging/StatsLogManager.java
index bad9b79..9980218 100644
--- a/src/com/android/launcher3/logging/StatsLogManager.java
+++ b/src/com/android/launcher3/logging/StatsLogManager.java
@@ -341,6 +341,12 @@
@UiEvent(doc = "User tapped on image content in Overview Select mode.")
LAUNCHER_SELECT_MODE_IMAGE(627),
+ @UiEvent(doc = "User tapped on barcode content in Overview Select mode.")
+ LAUNCHER_SELECT_MODE_BARCODE(1531),
+
+ @UiEvent(doc = "Highlight gleams for barcode content in Overview Select mode.")
+ LAUNCHER_SELECT_MODE_SHOW_BARCODE_REGIONS(1532),
+
@UiEvent(doc = "Activity to add external item was started")
LAUNCHER_ADD_EXTERNAL_ITEM_START(641),
@@ -498,6 +504,21 @@
@UiEvent(doc = "User taps the More button to share an image")
LAUNCHER_OVERVIEW_SHARING_TAP_MORE_TO_SHARE_IMAGE(778),
+ @UiEvent(doc = "Show Barode indicator for overview sharing")
+ LAUNCHER_OVERVIEW_SHARING_SHOW_BARCODE_INDICATOR(1533),
+
+ @UiEvent(doc = "User taps barcode indicator in overview")
+ LAUNCHER_OVERVIEW_SHARING_BARCODE_INDICATOR_TAP(1534),
+
+ @UiEvent(doc = "Configure barcode region for long_press action for overview sharing")
+ LAUNCHER_OVERVIEW_SHARING_CONFIGURE_BARCODE_REGION_LONG_PRESS(1535),
+
+ @UiEvent(doc = "User long presses a barcode region in overview")
+ LAUNCHER_OVERVIEW_SHARING_BARCODE_REGION_LONG_PRESS(1536),
+
+ @UiEvent(doc = "User drags a barcode region in overview")
+ LAUNCHER_OVERVIEW_SHARING_BARCODE_REGION_DRAG(1537),
+
@UiEvent(doc = "User started resizing a widget on their home screen.")
LAUNCHER_WIDGET_RESIZE_STARTED(820),
@@ -839,6 +860,13 @@
}
/**
+ * Set the package name of the log message.
+ */
+ default StatsLogger withPackageName(@Nullable String packageName) {
+ return this;
+ }
+
+ /**
* Builds the final message and logs it as {@link EventEnum}.
*/
default void log(EventEnum event) {
diff --git a/src/com/android/launcher3/model/LoaderTask.java b/src/com/android/launcher3/model/LoaderTask.java
index f4ce360..d9f43ef 100644
--- a/src/com/android/launcher3/model/LoaderTask.java
+++ b/src/com/android/launcher3/model/LoaderTask.java
@@ -481,8 +481,7 @@
mItemsDeleted = c.commitDeleted();
// Sort the folder items, update ranks, and make sure all preview items are high res.
- FolderGridOrganizer verifier =
- new FolderGridOrganizer(mApp.getInvariantDeviceProfile());
+ FolderGridOrganizer verifier = FolderGridOrganizer.getPreviewIconVerifier();
for (FolderInfo folder : mBgDataModel.folders) {
Collections.sort(folder.contents, Folder.ITEM_POS_COMPARATOR);
verifier.setFolderInfo(folder);
diff --git a/src/com/android/launcher3/model/PackageUpdatedTask.java b/src/com/android/launcher3/model/PackageUpdatedTask.java
index 9a0a6eb..4f2d398 100644
--- a/src/com/android/launcher3/model/PackageUpdatedTask.java
+++ b/src/com/android/launcher3/model/PackageUpdatedTask.java
@@ -34,7 +34,6 @@
import androidx.annotation.NonNull;
import com.android.launcher3.Flags;
-import com.android.launcher3.Launcher;
import com.android.launcher3.LauncherAppState;
import com.android.launcher3.LauncherSettings;
import com.android.launcher3.LauncherSettings.Favorites;
@@ -136,14 +135,6 @@
iconCache.updateIconsForPkg(packages[i], mUser);
activitiesLists.put(
packages[i], appsList.updatePackage(context, packages[i], mUser));
-
- // The update may have changed which shortcuts/widgets are available.
- // Refresh the widgets for the package if we have an activity running.
- Launcher launcher = Launcher.ACTIVITY_TRACKER.getCreatedActivity();
- if (launcher != null) {
- launcher.refreshAndBindWidgetsForPackageUser(
- new PackageUserKey(packages[i], mUser));
- }
}
}
// Since package was just updated, the target must be available now.
diff --git a/src/com/android/launcher3/responsive/HotseatSpecsProvider.kt b/src/com/android/launcher3/responsive/HotseatSpecsProvider.kt
index 8710303..ebbff51 100644
--- a/src/com/android/launcher3/responsive/HotseatSpecsProvider.kt
+++ b/src/com/android/launcher3/responsive/HotseatSpecsProvider.kt
@@ -23,7 +23,14 @@
import com.android.launcher3.responsive.ResponsiveSpec.DimensionType
import com.android.launcher3.util.ResourceHelper
-class HotseatSpecsProvider(private val groupOfSpecs: List<ResponsiveSpecGroup<HotseatSpec>>) {
+class HotseatSpecsProvider(groupOfSpecs: List<ResponsiveSpecGroup<HotseatSpec>>) {
+
+ private val groupOfSpecs: List<ResponsiveSpecGroup<HotseatSpec>>
+
+ init {
+ this.groupOfSpecs = groupOfSpecs.sortedBy { it.aspectRatio }
+ }
+
fun getSpecsByAspectRatio(aspectRatio: Float): ResponsiveSpecGroup<HotseatSpec> {
check(aspectRatio > 0f) { "Invalid aspect ratio! The value should be bigger than 0." }
@@ -84,13 +91,18 @@
fun isValid(): Boolean {
if (maxAvailableSize <= 0) {
- Log.e(LOG_TAG, "${this::class.simpleName}#isValid - maxAvailableSize <= 0")
+ logError("The property maxAvailableSize must be higher than 0.")
return false
}
// All specs need to be individually valid
if (!allSpecsAreValid()) {
- Log.e(LOG_TAG, "${this::class.simpleName}#isValid - !allSpecsAreValid()")
+ logError("One or more specs are invalid!")
+ return false
+ }
+
+ if (!isValidFixedSize()) {
+ logError("The total Fixed Size used must be lower or equal to $maxAvailableSize.")
return false
}
@@ -104,6 +116,13 @@
edgePadding.onlyFixedSize()
}
+ private fun isValidFixedSize() =
+ hotseatQsbSpace.fixedSize + edgePadding.fixedSize <= maxAvailableSize
+
+ private fun logError(message: String) {
+ Log.e(LOG_TAG, "${this::class.simpleName}#isValid - $message - $this")
+ }
+
companion object {
private const val LOG_TAG = "HotseatSpec"
}
diff --git a/src/com/android/launcher3/responsive/ResponsiveCellSpecsProvider.kt b/src/com/android/launcher3/responsive/ResponsiveCellSpecsProvider.kt
new file mode 100644
index 0000000..a4b25e5
--- /dev/null
+++ b/src/com/android/launcher3/responsive/ResponsiveCellSpecsProvider.kt
@@ -0,0 +1,200 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.launcher3.responsive
+
+import android.content.res.TypedArray
+import android.util.Log
+import com.android.launcher3.R
+import com.android.launcher3.responsive.ResponsiveSpec.Companion.ResponsiveSpecType
+import com.android.launcher3.responsive.ResponsiveSpec.DimensionType
+import com.android.launcher3.util.ResourceHelper
+
+class ResponsiveCellSpecsProvider(groupOfSpecs: List<ResponsiveSpecGroup<CellSpec>>) {
+ private val groupOfSpecs: List<ResponsiveSpecGroup<CellSpec>>
+
+ init {
+ this.groupOfSpecs =
+ groupOfSpecs
+ .onEach { group ->
+ check(group.widthSpecs.isEmpty() && group.heightSpecs.isNotEmpty()) {
+ "${this::class.simpleName} is invalid, only heightSpecs are allowed - " +
+ "width list size = ${group.widthSpecs.size}; " +
+ "height list size = ${group.heightSpecs.size}."
+ }
+ }
+ .sortedBy { it.aspectRatio }
+ }
+
+ fun getSpecsByAspectRatio(aspectRatio: Float): ResponsiveSpecGroup<CellSpec> {
+ check(aspectRatio > 0f) { "Invalid aspect ratio! The value should be bigger than 0." }
+
+ val specsGroup = groupOfSpecs.firstOrNull { aspectRatio <= it.aspectRatio }
+ check(specsGroup != null) { "No available spec with aspectRatio within $aspectRatio." }
+
+ return specsGroup
+ }
+
+ fun getCalculatedSpec(aspectRatio: Float, availableHeightSpace: Int): CalculatedCellSpec {
+ val specsGroup = getSpecsByAspectRatio(aspectRatio)
+ val spec = specsGroup.getSpec(DimensionType.HEIGHT, availableHeightSpace)
+ return CalculatedCellSpec(availableHeightSpace, spec)
+ }
+
+ fun getCalculatedSpec(
+ aspectRatio: Float,
+ availableHeightSpace: Int,
+ workspaceCellSpec: CalculatedCellSpec
+ ): CalculatedCellSpec {
+ val specsGroup = getSpecsByAspectRatio(aspectRatio)
+ val spec = specsGroup.getSpec(DimensionType.HEIGHT, availableHeightSpace)
+ return CalculatedCellSpec(availableHeightSpace, spec, workspaceCellSpec)
+ }
+
+ companion object {
+ @JvmStatic
+ fun create(resourceHelper: ResourceHelper): ResponsiveCellSpecsProvider {
+ val parser = ResponsiveSpecsParser(resourceHelper)
+ val specs = parser.parseXML(ResponsiveSpecType.Cell, ::CellSpec)
+ return ResponsiveCellSpecsProvider(specs)
+ }
+ }
+}
+
+data class CellSpec(
+ override val maxAvailableSize: Int,
+ override val dimensionType: DimensionType,
+ override val specType: ResponsiveSpecType,
+ val iconSize: SizeSpec,
+ val iconTextSize: SizeSpec,
+ val iconDrawablePadding: SizeSpec
+) : IResponsiveSpec {
+ init {
+ check(isValid()) { "Invalid CellSpec found." }
+ }
+
+ constructor(
+ responsiveSpecType: ResponsiveSpecType,
+ attrs: TypedArray,
+ specs: Map<String, SizeSpec>
+ ) : this(
+ maxAvailableSize =
+ attrs.getDimensionPixelSize(R.styleable.ResponsiveSpec_maxAvailableSize, 0),
+ dimensionType =
+ DimensionType.entries[
+ attrs.getInt(
+ R.styleable.ResponsiveSpec_dimensionType,
+ DimensionType.HEIGHT.ordinal
+ )],
+ specType = responsiveSpecType,
+ iconSize = specs.getOrError(SizeSpec.XmlTags.ICON_SIZE),
+ iconTextSize = specs.getOrError(SizeSpec.XmlTags.ICON_TEXT_SIZE),
+ iconDrawablePadding = specs.getOrError(SizeSpec.XmlTags.ICON_DRAWABLE_PADDING)
+ )
+
+ fun isValid(): Boolean {
+ if (maxAvailableSize <= 0) {
+ logError("The property maxAvailableSize must be higher than 0.")
+ return false
+ }
+
+ // All specs need to be individually valid
+ if (!allSpecsAreValid()) {
+ logError("Specs must be either Fixed Size or Match Workspace!")
+ return false
+ }
+
+ if (!isValidFixedSize()) {
+ logError("The total Fixed Size used must be lower or equal to $maxAvailableSize.")
+ return false
+ }
+
+ return true
+ }
+
+ private fun isValidFixedSize(): Boolean {
+ val totalSize = iconSize.fixedSize + iconTextSize.fixedSize + iconDrawablePadding.fixedSize
+ return totalSize <= maxAvailableSize
+ }
+
+ private fun allSpecsAreValid(): Boolean {
+ return (iconSize.fixedSize > 0f || iconSize.matchWorkspace) &&
+ (iconTextSize.fixedSize >= 0f || iconTextSize.matchWorkspace) &&
+ (iconDrawablePadding.fixedSize >= 0f || iconDrawablePadding.matchWorkspace)
+ }
+
+ private fun logError(message: String) {
+ Log.e(LOG_TAG, "${this::class.simpleName}#isValid - $message - $this")
+ }
+
+ companion object {
+ private const val LOG_TAG = "CellSpec"
+ }
+}
+
+data class CalculatedCellSpec(
+ val availableSpace: Int,
+ val spec: CellSpec,
+ val iconSize: Int,
+ val iconTextSize: Int,
+ val iconDrawablePadding: Int
+) {
+ constructor(
+ availableSpace: Int,
+ spec: CellSpec
+ ) : this(
+ availableSpace = availableSpace,
+ spec = spec,
+ iconSize = spec.iconSize.getCalculatedValue(availableSpace),
+ iconTextSize = spec.iconTextSize.getCalculatedValue(availableSpace),
+ iconDrawablePadding = spec.iconDrawablePadding.getCalculatedValue(availableSpace)
+ )
+
+ constructor(
+ availableSpace: Int,
+ spec: CellSpec,
+ workspaceCellSpec: CalculatedCellSpec
+ ) : this(
+ availableSpace = availableSpace,
+ spec = spec,
+ iconSize = getCalculatedValue(availableSpace, spec.iconSize, workspaceCellSpec.iconSize),
+ iconTextSize =
+ getCalculatedValue(availableSpace, spec.iconTextSize, workspaceCellSpec.iconTextSize),
+ iconDrawablePadding =
+ getCalculatedValue(
+ availableSpace,
+ spec.iconDrawablePadding,
+ workspaceCellSpec.iconDrawablePadding
+ )
+ )
+
+ companion object {
+ private fun getCalculatedValue(
+ availableSpace: Int,
+ spec: SizeSpec,
+ workspaceValue: Int
+ ): Int =
+ if (spec.matchWorkspace) workspaceValue else spec.getCalculatedValue(availableSpace)
+ }
+
+ override fun toString(): String {
+ return "${this::class.simpleName}(" +
+ "availableSpace=$availableSpace, iconSize=$iconSize, " +
+ "iconTextSize=$iconTextSize, iconDrawablePadding=$iconDrawablePadding, " +
+ "${spec::class.simpleName}.maxAvailableSize=${spec.maxAvailableSize}" +
+ ")"
+ }
+}
diff --git a/src/com/android/launcher3/responsive/ResponsiveSpec.kt b/src/com/android/launcher3/responsive/ResponsiveSpec.kt
index 413e2dc..b0e1b27 100644
--- a/src/com/android/launcher3/responsive/ResponsiveSpec.kt
+++ b/src/com/android/launcher3/responsive/ResponsiveSpec.kt
@@ -90,18 +90,33 @@
gutter.matchWorkspace ||
cellSize.matchWorkspace)
) {
- Log.e(LOG_TAG, "WorkspaceSpec#isValid - workspace shouldn't contain matchWorkspace!")
+ logError("Workspace spec provided must not have any match workspace value.")
return false
}
if (maxAvailableSize <= 0) {
- Log.e(LOG_TAG, "${this::class.simpleName}#isValid - maxAvailableSize <= 0")
+ logError("The property maxAvailableSize must be higher than 0.")
return false
}
// All specs need to be individually valid
if (!allSpecsAreValid()) {
- Log.e(LOG_TAG, "${this::class.simpleName}#isValid - !allSpecsAreValid()")
+ logError("One or more specs are invalid!")
+ return false
+ }
+
+ if (!isValidRemainderSpace()) {
+ logError("The total Remainder Space used must be lower or equal to 100%.")
+ return false
+ }
+
+ if (!isValidAvailableSpace()) {
+ logError("The total Available Space used must be lower or equal to 100%.")
+ return false
+ }
+
+ if (!isValidFixedSize()) {
+ logError("The total Fixed Size used must be lower or equal to $maxAvailableSize.")
return false
}
@@ -115,6 +130,32 @@
cellSize.isValid()
}
+ private fun isValidRemainderSpace(): Boolean {
+ // TODO(b/313621277): This validation must be update do accept only 0 or 1 instead of <= 1f.
+ return startPadding.ofRemainderSpace +
+ endPadding.ofRemainderSpace +
+ gutter.ofRemainderSpace +
+ cellSize.ofRemainderSpace <= 1f
+ }
+
+ private fun isValidAvailableSpace(): Boolean {
+ return startPadding.ofAvailableSpace +
+ endPadding.ofAvailableSpace +
+ gutter.ofAvailableSpace +
+ cellSize.ofAvailableSpace < 1f
+ }
+
+ private fun isValidFixedSize(): Boolean {
+ return startPadding.fixedSize +
+ endPadding.fixedSize +
+ gutter.fixedSize +
+ cellSize.fixedSize <= maxAvailableSize
+ }
+
+ private fun logError(message: String) {
+ Log.e(LOG_TAG, "${this::class.simpleName}#isValid - $message - $this")
+ }
+
enum class DimensionType {
HEIGHT,
WIDTH
@@ -127,7 +168,8 @@
AllApps("allAppsSpec"),
Folder("folderSpec"),
Workspace("workspaceSpec"),
- Hotseat("hotseatSpec")
+ Hotseat("hotseatSpec"),
+ Cell("cellSpec")
}
}
}
@@ -205,9 +247,6 @@
fun isResponsiveSpecType(type: ResponsiveSpecType) = spec.specType == type
- // TODO(b/287975993): Remove this after icon size is extracted to responsive grid
- fun isCellSizeMatchWorkspace(): Boolean = spec.cellSize.matchWorkspace
-
private fun updateRemainderSpaces(availableSpace: Int, cells: Int, spec: ResponsiveSpec) {
val gutters = cells - 1
val usedSpace = startPaddingPx + endPaddingPx + (gutterPx * gutters) + (cellSizePx * cells)
diff --git a/src/com/android/launcher3/responsive/SizeSpec.kt b/src/com/android/launcher3/responsive/SizeSpec.kt
index 2db843b..d146898 100644
--- a/src/com/android/launcher3/responsive/SizeSpec.kt
+++ b/src/com/android/launcher3/responsive/SizeSpec.kt
@@ -122,6 +122,9 @@
const val CELL_SIZE = "cellSize"
const val HOTSEAT_QSB_SPACE = "hotseatQsbSpace"
const val EDGE_PADDING = "edgePadding"
+ const val ICON_SIZE = "iconSize"
+ const val ICON_TEXT_SIZE = "iconTextSize"
+ const val ICON_DRAWABLE_PADDING = "iconDrawablePadding"
}
companion object {
diff --git a/src/com/android/launcher3/shortcuts/DeepShortcutTextView.java b/src/com/android/launcher3/shortcuts/DeepShortcutTextView.java
index ad3f8df..ded2cee 100644
--- a/src/com/android/launcher3/shortcuts/DeepShortcutTextView.java
+++ b/src/com/android/launcher3/shortcuts/DeepShortcutTextView.java
@@ -17,13 +17,11 @@
package com.android.launcher3.shortcuts;
import android.content.Context;
-import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.text.TextUtils;
import android.util.AttributeSet;
-import android.widget.Toast;
import com.android.launcher3.BubbleTextView;
import com.android.launcher3.R;
@@ -33,11 +31,6 @@
* A {@link BubbleTextView} that has the shortcut icon on the left and drag handle on the right.
*/
public class DeepShortcutTextView extends BubbleTextView {
- private final Rect mDragHandleBounds = new Rect();
- private final int mDragHandleWidth;
- private boolean mShowInstructionToast = false;
-
- private Toast mInstructionToast;
private boolean mShowLoadingState;
private Drawable mLoadingStatePlaceholder;
@@ -53,23 +46,12 @@
public DeepShortcutTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
-
- Resources resources = getResources();
- mDragHandleWidth = resources.getDimensionPixelSize(R.dimen.popup_padding_end)
- + resources.getDimensionPixelSize(R.dimen.deep_shortcut_drag_handle_size)
- + resources.getDimensionPixelSize(R.dimen.deep_shortcut_drawable_padding) / 2;
showLoadingState(true);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-
- mDragHandleBounds.set(0, 0, mDragHandleWidth, getMeasuredHeight());
- if (!Utilities.isRtl(getResources())) {
- mDragHandleBounds.offset(getMeasuredWidth() - mDragHandleBounds.width(), 0);
- }
-
setLoadingBounds();
}
@@ -80,10 +62,10 @@
mLoadingStateBounds.set(
0,
0,
- getMeasuredWidth() - mDragHandleWidth - getPaddingStart(),
+ getMeasuredWidth() - getPaddingEnd() - getPaddingStart(),
mLoadingStatePlaceholder.getIntrinsicHeight());
mLoadingStateBounds.offset(
- Utilities.isRtl(getResources()) ? mDragHandleWidth : getPaddingStart(),
+ Utilities.isRtl(getResources()) ? getPaddingEnd() : getPaddingStart(),
(int) ((getMeasuredHeight() - mLoadingStatePlaceholder.getIntrinsicHeight())
/ 2.0f)
);
@@ -106,23 +88,11 @@
@Override
protected boolean shouldIgnoreTouchDown(float x, float y) {
- // Show toast if user touches the drag handle (long clicks still start the drag).
- mShowInstructionToast = mDragHandleBounds.contains((int) x, (int) y);
-
// assume the whole view as clickable
return false;
}
@Override
- public boolean performClick() {
- if (mShowInstructionToast) {
- showToast();
- return true;
- }
- return super.performClick();
- }
-
- @Override
public void onDraw(Canvas canvas) {
if (!mShowLoadingState) {
super.onDraw(canvas);
@@ -155,15 +125,4 @@
invalidate();
}
-
- private void showToast() {
- if (mInstructionToast != null) {
- mInstructionToast.cancel();
- }
- CharSequence msg = Utilities.wrapForTts(
- getContext().getText(R.string.long_press_shortcut_to_add),
- getContext().getString(R.string.long_accessible_way_to_add_shortcut));
- mInstructionToast = Toast.makeText(getContext(), msg, Toast.LENGTH_SHORT);
- mInstructionToast.show();
- }
}
diff --git a/src/com/android/launcher3/statemanager/StateManager.java b/src/com/android/launcher3/statemanager/StateManager.java
index 9ac8f6b..360ff7e 100644
--- a/src/com/android/launcher3/statemanager/StateManager.java
+++ b/src/com/android/launcher3/statemanager/StateManager.java
@@ -27,6 +27,7 @@
import android.animation.AnimatorSet;
import android.os.Handler;
import android.os.Looper;
+import android.util.Log;
import androidx.annotation.FloatRange;
@@ -35,6 +36,7 @@
import com.android.launcher3.anim.PendingAnimation;
import com.android.launcher3.states.StateAnimationConfig;
import com.android.launcher3.states.StateAnimationConfig.AnimationFlags;
+import com.android.launcher3.testing.shared.TestProtocol;
import java.io.PrintWriter;
import java.util.ArrayList;
@@ -225,6 +227,7 @@
private void goToState(
STATE_TYPE state, boolean animated, long delay, AnimatorListener listener) {
+ Log.d(TestProtocol.OVERVIEW_OVER_HOME, "go to state " + state);
animated &= areAnimatorsEnabled();
if (mActivity.isInState(state)) {
@@ -380,6 +383,8 @@
mState = state;
mActivity.onStateSetStart(mState);
+ Log.d(TestProtocol.OVERVIEW_OVER_HOME, "Notifying listeners for state transition start"
+ + " to state: " + state.toString());
for (int i = mListeners.size() - 1; i >= 0; i--) {
mListeners.get(i).onStateTransitionStart(state);
}
@@ -397,6 +402,8 @@
setRestState(null);
}
+ Log.d(TestProtocol.OVERVIEW_OVER_HOME, "Notifying " + mListeners.size() + " listeners "
+ + "for end transition for state: " + state.toString());
for (int i = mListeners.size() - 1; i >= 0; i--) {
mListeners.get(i).onStateTransitionComplete(state);
}
@@ -434,6 +441,7 @@
* Cancels the current animation.
*/
public void cancelAnimation() {
+ Log.d(TestProtocol.OVERVIEW_OVER_HOME, "current animation cancelled");
mConfig.reset();
// It could happen that a new animation is set as a result of an endListener on the
// existing animation.
@@ -457,6 +465,7 @@
* @param toState The state we are animating towards.
*/
public void setCurrentAnimation(AnimatorSet anim, STATE_TYPE toState) {
+ Log.d(TestProtocol.OVERVIEW_OVER_HOME, "setting animation to " + toState.toString());
cancelAnimation();
setCurrentAnimation(anim);
anim.addListener(createStateAnimationListener(toState));
diff --git a/src/com/android/launcher3/touch/ItemClickHandler.java b/src/com/android/launcher3/touch/ItemClickHandler.java
index db32829..3bce377 100644
--- a/src/com/android/launcher3/touch/ItemClickHandler.java
+++ b/src/com/android/launcher3/touch/ItemClickHandler.java
@@ -61,7 +61,10 @@
import com.android.launcher3.util.ItemInfoMatcher;
import com.android.launcher3.util.PackageManagerHelper;
import com.android.launcher3.views.FloatingIconView;
+import com.android.launcher3.views.Snackbar;
import com.android.launcher3.widget.LauncherAppWidgetProviderInfo;
+import com.android.launcher3.widget.PendingAddShortcutInfo;
+import com.android.launcher3.widget.PendingAddWidgetInfo;
import com.android.launcher3.widget.PendingAppWidgetHostView;
import com.android.launcher3.widget.WidgetAddFlowHandler;
import com.android.launcher3.widget.WidgetManagerHelper;
@@ -107,6 +110,16 @@
}
} else if (tag instanceof ItemClickProxy) {
((ItemClickProxy) tag).onItemClicked(v);
+ } else if (tag instanceof PendingAddShortcutInfo) {
+ CharSequence msg = Utilities.wrapForTts(
+ launcher.getText(R.string.long_press_shortcut_to_add),
+ launcher.getString(R.string.long_accessible_way_to_add_shortcut));
+ Snackbar.show(launcher, msg, null);
+ } else if (tag instanceof PendingAddWidgetInfo) {
+ CharSequence msg = Utilities.wrapForTts(
+ launcher.getText(R.string.long_press_widget_to_add),
+ launcher.getString(R.string.long_accessible_way_to_add));
+ Snackbar.show(launcher, msg, null);
}
}
diff --git a/src/com/android/launcher3/touch/ItemLongClickListener.java b/src/com/android/launcher3/touch/ItemLongClickListener.java
index 0c322cc..9e7d4dc 100644
--- a/src/com/android/launcher3/touch/ItemLongClickListener.java
+++ b/src/com/android/launcher3/touch/ItemLongClickListener.java
@@ -24,12 +24,15 @@
import static com.android.launcher3.LauncherState.OVERVIEW;
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_ALLAPPS_ITEM_LONG_PRESSED;
+import android.graphics.Point;
+import android.graphics.Rect;
import android.view.View;
import android.view.View.OnLongClickListener;
-import com.android.launcher3.CellLayout;
+import com.android.launcher3.DragSource;
import com.android.launcher3.DropTarget;
import com.android.launcher3.Launcher;
+import com.android.launcher3.celllayout.CellInfo;
import com.android.launcher3.config.FeatureFlags;
import com.android.launcher3.dragndrop.DragController;
import com.android.launcher3.dragndrop.DragOptions;
@@ -40,6 +43,10 @@
import com.android.launcher3.testing.shared.TestProtocol;
import com.android.launcher3.views.BubbleTextHolder;
import com.android.launcher3.widget.LauncherAppWidgetHostView;
+import com.android.launcher3.widget.NavigableAppWidgetHostView;
+import com.android.launcher3.widget.PendingItemDragHelper;
+import com.android.launcher3.widget.WidgetCell;
+import com.android.launcher3.widget.WidgetImageView;
/**
* Class to handle long-clicks on workspace items and start drag as a result.
@@ -86,12 +93,51 @@
}
}
- CellLayout.CellInfo longClickCellInfo = new CellLayout.CellInfo(v, info,
+ CellInfo longClickCellInfo = new CellInfo(v, info,
launcher.getCellPosMapper().mapModelToPresenter(info));
launcher.getWorkspace().startDrag(longClickCellInfo, dragOptions);
}
+ private static boolean onWidgetItemLongClick(WidgetCell v) {
+ // Get the widget preview as the drag representation
+ WidgetImageView image = v.getWidgetView();
+ Launcher launcher = Launcher.getLauncher(v.getContext());
+ DragSource dragSource = (target, dragObject, success) -> { };
+
+ // If the ImageView doesn't have a drawable yet, the widget preview hasn't been loaded and
+ // we abort the drag.
+ if (image.getDrawable() == null && v.getAppWidgetHostViewPreview() == null) {
+ return false;
+ }
+
+ PendingItemDragHelper dragHelper = new PendingItemDragHelper(v);
+ // RemoteViews are being rendered in AppWidgetHostView in WidgetCell. And thus, the scale of
+ // RemoteViews is equivalent to the AppWidgetHostView scale.
+ dragHelper.setRemoteViewsPreview(v.getRemoteViewsPreview(), v.getAppWidgetHostViewScale());
+ dragHelper.setAppWidgetHostViewPreview(v.getAppWidgetHostViewPreview());
+
+ if (image.getDrawable() != null) {
+ int[] loc = new int[2];
+ launcher.getDragLayer().getLocationInDragLayer(image, loc);
+
+ dragHelper.startDrag(image.getBitmapBounds(), image.getDrawable().getIntrinsicWidth(),
+ image.getWidth(), new Point(loc[0], loc[1]), dragSource, new DragOptions());
+ } else {
+ NavigableAppWidgetHostView preview = v.getAppWidgetHostViewPreview();
+ int[] loc = new int[2];
+ launcher.getDragLayer().getLocationInDragLayer(preview, loc);
+ Rect r = new Rect();
+ preview.getWorkspaceVisualDragBounds(r);
+ dragHelper.startDrag(r, preview.getMeasuredWidth(), preview.getMeasuredWidth(),
+ new Point(loc[0], loc[1]), dragSource, new DragOptions());
+ }
+ return true;
+ }
+
private static boolean onAllAppsItemLongClick(View view) {
+ if (view instanceof WidgetCell wc) {
+ return onWidgetItemLongClick(wc);
+ }
TestLogging.recordEvent(TestProtocol.SEQUENCE_MAIN, "onAllAppsItemLongClick");
view.cancelLongPress();
View v = (view instanceof BubbleTextHolder)
diff --git a/src/com/android/launcher3/util/KeyboardShortcutsDelegate.java b/src/com/android/launcher3/util/KeyboardShortcutsDelegate.java
index 3ec339d..c9db83d 100644
--- a/src/com/android/launcher3/util/KeyboardShortcutsDelegate.java
+++ b/src/com/android/launcher3/util/KeyboardShortcutsDelegate.java
@@ -25,6 +25,7 @@
import android.view.KeyboardShortcutInfo;
import android.view.Menu;
+import com.android.launcher3.AbstractFloatingView;
import com.android.launcher3.Launcher;
import com.android.launcher3.R;
import com.android.launcher3.Utilities;
@@ -108,14 +109,26 @@
* @see android.view.KeyEvent
*/
public Boolean onKeyDown(int keyCode, KeyEvent event) {
- if (keyCode == KeyEvent.KEYCODE_ESCAPE) {
- // Close any open floating views.
- mLauncher.closeOpenViews();
- return true;
+ // Ignore escape if pressed in conjunction with any modifier keys.
+ if (keyCode == KeyEvent.KEYCODE_ESCAPE && event.hasNoModifiers()) {
+ AbstractFloatingView topView = AbstractFloatingView.getTopOpenView(mLauncher);
+ if (topView != null) {
+ // Close each floating view one at a time for each key press.
+ topView.close(/* animate= */ true);
+ return true;
+ } else if (mLauncher.getAppsView().isInAllApps()) {
+ // Close all apps if there are no open floating views.
+ closeAllApps();
+ return true;
+ }
}
return null;
}
+ private void closeAllApps() {
+ mLauncher.getStateManager().goToState(NORMAL, true);
+ }
+
/**
* Handle key up event.
* @param keyCode code of the key being pressed.
diff --git a/src/com/android/launcher3/util/Preconditions.java b/src/com/android/launcher3/util/Preconditions.java
index 63d56e4..0e5ab9a 100644
--- a/src/com/android/launcher3/util/Preconditions.java
+++ b/src/com/android/launcher3/util/Preconditions.java
@@ -51,6 +51,12 @@
}
}
+ public static void assertTrue(boolean condition) {
+ if (FeatureFlags.IS_STUDIO_BUILD && !condition) {
+ throw new IllegalStateException();
+ }
+ }
+
private static boolean isSameLooper(Looper looper) {
return Looper.myLooper() == looper;
}
diff --git a/src/com/android/launcher3/views/AccessibilityActionsView.java b/src/com/android/launcher3/views/AccessibilityActionsView.java
index 1d136c3..fcb7c28 100644
--- a/src/com/android/launcher3/views/AccessibilityActionsView.java
+++ b/src/com/android/launcher3/views/AccessibilityActionsView.java
@@ -79,6 +79,7 @@
}
Launcher l = Launcher.getLauncher(getContext());
if (action == R.string.all_apps_button_label) {
+ l.getStatsLogManager().keyboardStateManager().setLaunchedFromA11y(true);
l.getStateManager().goToState(ALL_APPS);
return true;
}
diff --git a/src/com/android/launcher3/views/ActivityContext.java b/src/com/android/launcher3/views/ActivityContext.java
index 20bcc3c..bef84f7 100644
--- a/src/com/android/launcher3/views/ActivityContext.java
+++ b/src/com/android/launcher3/views/ActivityContext.java
@@ -53,6 +53,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.core.view.WindowInsetsCompat;
import com.android.launcher3.BubbleTextView;
import com.android.launcher3.DeviceProfile;
@@ -315,6 +316,25 @@
}
/**
+ * Returns if the software keyboard is hidden. Hardware keyboards do not display on screen by
+ * default.
+ */
+ default boolean isSoftwareKeyboardHidden() {
+ if (isHardwareKeyboard()) {
+ return true;
+ } else {
+ View dragLayer = getDragLayer();
+ WindowInsets insets = dragLayer.getRootWindowInsets();
+ if (insets == null) {
+ return false;
+ }
+ WindowInsetsCompat insetsCompat =
+ WindowInsetsCompat.toWindowInsetsCompat(insets, dragLayer);
+ return !insetsCompat.isVisible(WindowInsetsCompat.Type.ime());
+ }
+ }
+
+ /**
* Sends a pending intent animating from a view.
*
* @param v View to animate.
diff --git a/src/com/android/launcher3/views/Snackbar.java b/src/com/android/launcher3/views/Snackbar.java
index 99040ff..54aa6e4 100644
--- a/src/com/android/launcher3/views/Snackbar.java
+++ b/src/com/android/launcher3/views/Snackbar.java
@@ -66,8 +66,8 @@
}
/** Show a snackbar with just a label. */
- public static <T extends Context & ActivityContext> void show(T activity, String labelString,
- Runnable onDismissed) {
+ public static void show(
+ ActivityContext activity, CharSequence labelString, Runnable onDismissed) {
show(activity, labelString, NO_ID, onDismissed, null);
}
@@ -76,21 +76,21 @@
int actionStringResId, Runnable onDismissed, @Nullable Runnable onActionClicked) {
show(
activity,
- activity.getResources().getString(labelStringResId),
+ activity.getResources().getText(labelStringResId),
actionStringResId,
onDismissed,
onActionClicked);
}
/** Show a snackbar with a label and action. */
- public static <T extends Context & ActivityContext> void show(T activity, String labelString,
+ public static void show(ActivityContext activity, CharSequence labelString,
int actionStringResId, Runnable onDismissed, @Nullable Runnable onActionClicked) {
closeOpenViews(activity, true, TYPE_SNACKBAR);
- Snackbar snackbar = new Snackbar(activity, null);
+ Snackbar snackbar = new Snackbar((Context) activity, null);
// Set some properties here since inflated xml only contains the children.
snackbar.setOrientation(HORIZONTAL);
snackbar.setGravity(Gravity.CENTER_VERTICAL);
- Resources res = activity.getResources();
+ Resources res = snackbar.getResources();
snackbar.setElevation(res.getDimension(R.dimen.snackbar_elevation));
int padding = res.getDimensionPixelSize(R.dimen.snackbar_padding);
snackbar.setPadding(padding, padding, padding, padding);
@@ -143,7 +143,8 @@
actionView.setVisibility(GONE);
}
- int totalContentWidth = (int) (labelView.getPaint().measureText(labelString) + actionWidth)
+ int totalContentWidth = (int) (labelView.getPaint().measureText(labelString.toString())
+ + actionWidth)
+ labelView.getPaddingRight() + labelView.getPaddingLeft()
+ padding * 2;
if (totalContentWidth > params.width) {
@@ -177,7 +178,7 @@
.setDuration(SHOW_DURATION_MS)
.setInterpolator(Interpolators.ACCELERATE_DECELERATE)
.start();
- int timeout = AccessibilityManagerCompat.getRecommendedTimeoutMillis(activity,
+ int timeout = AccessibilityManagerCompat.getRecommendedTimeoutMillis(snackbar.getContext(),
TIMEOUT_DURATION_MS, FLAG_CONTENT_TEXT | FLAG_CONTENT_CONTROLS);
snackbar.postDelayed(() -> snackbar.close(true), timeout);
}
diff --git a/src/com/android/launcher3/views/WidgetsEduView.java b/src/com/android/launcher3/views/WidgetsEduView.java
index e70b1cb..40c6115 100644
--- a/src/com/android/launcher3/views/WidgetsEduView.java
+++ b/src/com/android/launcher3/views/WidgetsEduView.java
@@ -20,15 +20,15 @@
import android.util.AttributeSet;
import android.view.LayoutInflater;
+import com.android.launcher3.BaseActivity;
import com.android.launcher3.DeviceProfile;
import com.android.launcher3.Insettable;
-import com.android.launcher3.Launcher;
import com.android.launcher3.R;
/**
* Education view about widgets.
*/
-public class WidgetsEduView extends AbstractSlideInView<Launcher> implements Insettable {
+public class WidgetsEduView extends AbstractSlideInView<BaseActivity> implements Insettable {
private static final int DEFAULT_CLOSE_DURATION = 200;
@@ -124,10 +124,10 @@
}
/** Shows widget education dialog. */
- public static WidgetsEduView showEducationDialog(Launcher launcher) {
- LayoutInflater layoutInflater = LayoutInflater.from(launcher);
+ public static WidgetsEduView showEducationDialog(BaseActivity activity) {
+ LayoutInflater layoutInflater = LayoutInflater.from(activity);
WidgetsEduView v = (WidgetsEduView) layoutInflater.inflate(
- R.layout.widgets_edu, launcher.getDragLayer(), false);
+ R.layout.widgets_edu, activity.getDragLayer(), false);
v.show();
return v;
}
diff --git a/src/com/android/launcher3/widget/BaseWidgetSheet.java b/src/com/android/launcher3/widget/BaseWidgetSheet.java
index fc9c774..5ec1022 100644
--- a/src/com/android/launcher3/widget/BaseWidgetSheet.java
+++ b/src/com/android/launcher3/widget/BaseWidgetSheet.java
@@ -21,7 +21,6 @@
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
-import android.graphics.Point;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.View;
@@ -29,47 +28,39 @@
import android.view.View.OnLongClickListener;
import android.view.WindowInsets;
import android.view.animation.Interpolator;
-import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.annotation.Px;
import androidx.core.view.ViewCompat;
+import com.android.launcher3.BaseActivity;
import com.android.launcher3.DeviceProfile;
import com.android.launcher3.DeviceProfile.OnDeviceProfileChangeListener;
-import com.android.launcher3.DragSource;
-import com.android.launcher3.DropTarget.DragObject;
import com.android.launcher3.Insettable;
import com.android.launcher3.Launcher;
import com.android.launcher3.LauncherPrefs;
import com.android.launcher3.R;
import com.android.launcher3.Utilities;
-import com.android.launcher3.dragndrop.DragOptions;
import com.android.launcher3.popup.PopupDataProvider;
import com.android.launcher3.testing.TestLogging;
import com.android.launcher3.testing.shared.TestProtocol;
-import com.android.launcher3.touch.ItemLongClickListener;
import com.android.launcher3.util.SystemUiController;
import com.android.launcher3.util.Themes;
import com.android.launcher3.util.window.WindowManagerProxy;
import com.android.launcher3.views.AbstractSlideInView;
-import com.android.launcher3.views.ActivityContext;
import com.android.launcher3.views.ArrowTipView;
/**
* Base class for various widgets popup
*/
-public abstract class BaseWidgetSheet extends AbstractSlideInView<Launcher>
- implements OnClickListener, OnLongClickListener, DragSource,
+public abstract class BaseWidgetSheet extends AbstractSlideInView<BaseActivity>
+ implements OnClickListener, OnLongClickListener,
PopupDataProvider.PopupDataChangeListener, Insettable, OnDeviceProfileChangeListener {
/** The default number of cells that can fit horizontally in a widget sheet. */
public static final int DEFAULT_MAX_HORIZONTAL_SPANS = 4;
protected final Rect mInsets = new Rect();
- /* Touch handling related member variables. */
- private Toast mWidgetInstructionToast;
-
@Px protected int mContentHorizontalMargin;
@Px protected int mWidgetCellHorizontalPadding;
@@ -118,32 +109,30 @@
@Override
public final void onClick(View v) {
- Object tag = null;
if (v instanceof WidgetCell) {
- tag = v.getTag();
- } else if (v.getParent() instanceof WidgetCell) {
- tag = ((WidgetCell) v.getParent()).getTag();
+ mActivityContext.getItemOnClickListener().onClick(v);
+ } else if (v.getParent() instanceof WidgetCell wc) {
+ mActivityContext.getItemOnClickListener().onClick(wc);
}
- if (tag instanceof PendingAddShortcutInfo) {
- mWidgetInstructionToast = showShortcutToast(getContext(), mWidgetInstructionToast);
- } else {
- mWidgetInstructionToast = showWidgetToast(getContext(), mWidgetInstructionToast);
- }
-
}
@Override
public boolean onLongClick(View v) {
TestLogging.recordEvent(TestProtocol.SEQUENCE_MAIN, "Widgets.onLongClick");
v.cancelLongPress();
- if (!ItemLongClickListener.canStartDrag(mActivityContext)) return false;
+ boolean result;
if (v instanceof WidgetCell) {
- return beginDraggingWidget((WidgetCell) v);
- } else if (v.getParent() instanceof WidgetCell) {
- return beginDraggingWidget((WidgetCell) v.getParent());
+ result = mActivityContext.getAllAppsItemLongClickListener().onLongClick(v);
+ } else if (v.getParent() instanceof WidgetCell wc) {
+ result = mActivityContext.getAllAppsItemLongClickListener().onLongClick(wc);
+ } else {
+ return true;
}
- return true;
+ if (result) {
+ close(true);
+ }
+ return result;
}
@Override
@@ -212,55 +201,12 @@
MeasureSpec.getSize(heightMeasureSpec));
}
- private boolean beginDraggingWidget(WidgetCell v) {
- // Get the widget preview as the drag representation
- WidgetImageView image = v.getWidgetView();
-
- // If the ImageView doesn't have a drawable yet, the widget preview hasn't been loaded and
- // we abort the drag.
- if (image.getDrawable() == null && v.getAppWidgetHostViewPreview() == null) {
- return false;
- }
-
- PendingItemDragHelper dragHelper = new PendingItemDragHelper(v);
- // RemoteViews are being rendered in AppWidgetHostView in WidgetCell. And thus, the scale of
- // RemoteViews is equivalent to the AppWidgetHostView scale.
- dragHelper.setRemoteViewsPreview(v.getRemoteViewsPreview(), v.getAppWidgetHostViewScale());
- dragHelper.setAppWidgetHostViewPreview(v.getAppWidgetHostViewPreview());
-
- if (image.getDrawable() != null) {
- int[] loc = new int[2];
- getPopupContainer().getLocationInDragLayer(image, loc);
-
- dragHelper.startDrag(image.getBitmapBounds(), image.getDrawable().getIntrinsicWidth(),
- image.getWidth(), new Point(loc[0], loc[1]), this, new DragOptions());
- } else {
- NavigableAppWidgetHostView preview = v.getAppWidgetHostViewPreview();
- int[] loc = new int[2];
- getPopupContainer().getLocationInDragLayer(preview, loc);
- Rect r = new Rect();
- preview.getWorkspaceVisualDragBounds(r);
- dragHelper.startDrag(r, preview.getMeasuredWidth(), preview.getMeasuredWidth(),
- new Point(loc[0], loc[1]), this, new DragOptions());
- }
- close(true);
- return true;
- }
-
@Override
protected Interpolator getIdleInterpolator() {
return mActivityContext.getDeviceProfile().isTablet
? EMPHASIZED : super.getIdleInterpolator();
}
- //
- // Drag related handling methods that implement {@link DragSource} interface.
- //
-
- @Override
- public void onDropCompleted(View target, DragObject d, boolean success) { }
-
-
protected void onCloseComplete() {
super.onCloseComplete();
clearNavBarColor();
@@ -282,40 +228,6 @@
return mActivityContext.getSystemUiController();
}
- /**
- * Show Widget tap toast prompting user to drag instead
- */
- public static Toast showWidgetToast(Context context, Toast toast) {
- // Let the user know that they have to long press to add a widget
- if (toast != null) {
- toast.cancel();
- }
-
- CharSequence msg = Utilities.wrapForTts(
- context.getText(R.string.long_press_widget_to_add),
- context.getString(R.string.long_accessible_way_to_add));
- toast = Toast.makeText(context, msg, Toast.LENGTH_SHORT);
- toast.show();
- return toast;
- }
-
- /**
- * Show shortcut tap toast prompting user to drag instead.
- */
- private static Toast showShortcutToast(Context context, Toast toast) {
- // Let the user know that they have to long press to add a widget
- if (toast != null) {
- toast.cancel();
- }
-
- CharSequence msg = Utilities.wrapForTts(
- context.getText(R.string.long_press_shortcut_to_add),
- context.getString(R.string.long_accessible_way_to_add_shortcut));
- toast = Toast.makeText(context, msg, Toast.LENGTH_SHORT);
- toast.show();
- return toast;
- }
-
/** Shows education tip on top center of {@code view} if view is laid out. */
@Nullable
protected ArrowTipView showEducationTipOnViewIfPossible(@Nullable View view) {
@@ -344,7 +256,8 @@
@Override
protected void setTranslationShift(float translationShift) {
super.setTranslationShift(translationShift);
- Launcher launcher = ActivityContext.lookupContext(getContext());
- launcher.onWidgetsTransition(1 - translationShift);
+ if (mActivityContext instanceof Launcher ls) {
+ ls.onWidgetsTransition(1 - translationShift);
+ }
}
}
diff --git a/src/com/android/launcher3/widget/picker/WidgetsFullSheet.java b/src/com/android/launcher3/widget/picker/WidgetsFullSheet.java
index af77d03..953ecda 100644
--- a/src/com/android/launcher3/widget/picker/WidgetsFullSheet.java
+++ b/src/com/android/launcher3/widget/picker/WidgetsFullSheet.java
@@ -55,8 +55,9 @@
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.RecyclerView;
+import com.android.launcher3.BaseActivity;
import com.android.launcher3.DeviceProfile;
-import com.android.launcher3.Launcher;
+import com.android.launcher3.LauncherAppState;
import com.android.launcher3.LauncherPrefs;
import com.android.launcher3.R;
import com.android.launcher3.Utilities;
@@ -72,7 +73,6 @@
import com.android.launcher3.views.StickyHeaderLayout;
import com.android.launcher3.views.WidgetsEduView;
import com.android.launcher3.widget.BaseWidgetSheet;
-import com.android.launcher3.widget.LauncherWidgetHolder.ProviderChangedListener;
import com.android.launcher3.widget.model.WidgetsListBaseEntry;
import com.android.launcher3.widget.picker.search.SearchModeListener;
import com.android.launcher3.widget.picker.search.WidgetsSearchBar;
@@ -89,7 +89,7 @@
* Popup for showing the full list of available widgets
*/
public class WidgetsFullSheet extends BaseWidgetSheet
- implements ProviderChangedListener, OnActivePageChangedListener,
+ implements OnActivePageChangedListener,
WidgetsRecyclerView.HeaderViewDimensionsProvider, SearchModeListener {
private static final long FADE_IN_DURATION = 150;
@@ -166,7 +166,7 @@
private boolean mIsInSearchMode;
private boolean mIsNoWidgetsViewNeeded;
@Px private int mMaxSpanPerRow;
- private DeviceProfile mDeviceProfile;
+ private final DeviceProfile mDeviceProfile;
private int mOrientation;
@@ -181,7 +181,7 @@
public WidgetsFullSheet(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
- mDeviceProfile = Launcher.getLauncher(context).getDeviceProfile();
+ mDeviceProfile = mActivityContext.getDeviceProfile();
mHasWorkProfile = context.getSystemService(LauncherApps.class).getProfiles().size() > 1;
mOrientation = context.getResources().getConfiguration().orientation;
mAdapters.put(AdapterHolder.PRIMARY, new AdapterHolder(AdapterHolder.PRIMARY));
@@ -353,15 +353,14 @@
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
- mActivityContext.getAppWidgetHolder().addProviderChangeListener(this);
- notifyWidgetProvidersChanged();
+ LauncherAppState.getInstance(mActivityContext).getModel()
+ .refreshAndBindWidgetsAndShortcuts(null);
onRecommendedWidgetsBound();
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
- mActivityContext.getAppWidgetHolder().removeProviderChangeListener(this);
mAdapters.get(AdapterHolder.PRIMARY).mWidgetsRecyclerView
.removeOnAttachStateChangeListener(mBindScrollbarInSearchMode);
if (mHasWorkProfile) {
@@ -482,11 +481,6 @@
}
@Override
- public void notifyWidgetProvidersChanged() {
- mActivityContext.refreshAndBindWidgetsForPackageUser(null);
- }
-
- @Override
public void onWidgetsBound() {
if (mIsInSearchMode) {
return;
@@ -682,22 +676,22 @@
}
/** Shows the {@link WidgetsFullSheet} on the launcher. */
- public static WidgetsFullSheet show(Launcher launcher, boolean animate) {
- boolean isTwoPane = launcher.getDeviceProfile().isTablet
- && launcher.getDeviceProfile().isLandscape
- && (!launcher.getDeviceProfile().isTwoPanels
+ public static WidgetsFullSheet show(BaseActivity activity, boolean animate) {
+ boolean isTwoPane = activity.getDeviceProfile().isTablet
+ && activity.getDeviceProfile().isLandscape
+ && (!activity.getDeviceProfile().isTwoPanels
|| FeatureFlags.UNFOLDED_WIDGET_PICKER.get());
WidgetsFullSheet sheet;
if (isTwoPane) {
- sheet = (WidgetsTwoPaneSheet) launcher.getLayoutInflater().inflate(
+ sheet = (WidgetsTwoPaneSheet) activity.getLayoutInflater().inflate(
R.layout.widgets_two_pane_sheet,
- launcher.getDragLayer(),
+ activity.getDragLayer(),
false);
} else {
- sheet = (WidgetsFullSheet) launcher.getLayoutInflater().inflate(
+ sheet = (WidgetsFullSheet) activity.getLayoutInflater().inflate(
R.layout.widgets_full_sheet,
- launcher.getDragLayer(),
+ activity.getDragLayer(),
false);
}
@@ -754,7 +748,7 @@
/** Gets the {@link WidgetsRecyclerView} which shows all widgets in {@link WidgetsFullSheet}. */
@VisibleForTesting
- public static WidgetsRecyclerView getWidgetsView(Launcher launcher) {
+ public static WidgetsRecyclerView getWidgetsView(BaseActivity launcher) {
return launcher.findViewById(R.id.primary_widgets_list_view);
}
@@ -803,7 +797,7 @@
mOrientation = newConfig.orientation;
if (mDeviceProfile.isTablet && !mDeviceProfile.isTwoPanels) {
handleClose(false);
- show(Launcher.getLauncher(getContext()), false);
+ show(BaseActivity.fromContext(getContext()), false);
} else {
reset();
}
diff --git a/tests/Android.bp b/tests/Android.bp
index 8725b46..84c3951 100644
--- a/tests/Android.bp
+++ b/tests/Android.bp
@@ -33,8 +33,8 @@
filegroup {
name: "launcher-image-tests-src",
srcs: [
- "src/com/android/launcher3/celllayout/TestWorkspaceBuilder.java",
- "src/com/android/launcher3/celllayout/CellLayoutBoard.java",
+ "src/com/android/launcher3/celllayout/board/*.java",
+ "src/com/android/launcher3/celllayout/board/*.kt",
"src/com/android/launcher3/celllayout/FavoriteItemsTransaction.java",
"src/com/android/launcher3/ui/AbstractLauncherUiTest.java",
"src/com/android/launcher3/ui/PortraitLandscapeRunner.java",
diff --git a/tests/assets/dumpTests/DeviceProfileDumpTest/phonePortrait.txt b/tests/assets/dumpTests/DeviceProfileDumpTest/phonePortrait.txt
index 6c3fa5e..8473b68 100644
--- a/tests/assets/dumpTests/DeviceProfileDumpTest/phonePortrait.txt
+++ b/tests/assets/dumpTests/DeviceProfileDumpTest/phonePortrait.txt
@@ -37,8 +37,8 @@
iconSizePx: 147.0px (56.0dp)
iconTextSizePx: 38.0px (14.476191dp)
iconDrawablePaddingPx: 12.0px (4.571429dp)
- inv.numFolderRows: 4
- inv.numFolderColumns: 4
+ numFolderRows: 4
+ numFolderColumns: 4
folderCellWidthPx: 195.0px (74.28571dp)
folderCellHeightPx: 230.0px (87.61905dp)
folderChildIconSizePx: 147.0px (56.0dp)
diff --git a/tests/assets/dumpTests/DeviceProfileDumpTest/phonePortrait3Button.txt b/tests/assets/dumpTests/DeviceProfileDumpTest/phonePortrait3Button.txt
index cd06ed9..c23fcc0 100644
--- a/tests/assets/dumpTests/DeviceProfileDumpTest/phonePortrait3Button.txt
+++ b/tests/assets/dumpTests/DeviceProfileDumpTest/phonePortrait3Button.txt
@@ -37,8 +37,8 @@
iconSizePx: 147.0px (56.0dp)
iconTextSizePx: 38.0px (14.476191dp)
iconDrawablePaddingPx: 12.0px (4.571429dp)
- inv.numFolderRows: 4
- inv.numFolderColumns: 4
+ numFolderRows: 4
+ numFolderColumns: 4
folderCellWidthPx: 195.0px (74.28571dp)
folderCellHeightPx: 230.0px (87.61905dp)
folderChildIconSizePx: 147.0px (56.0dp)
diff --git a/tests/assets/dumpTests/DeviceProfileDumpTest/phoneVerticalBar.txt b/tests/assets/dumpTests/DeviceProfileDumpTest/phoneVerticalBar.txt
index cd19907..5cd7dc8 100644
--- a/tests/assets/dumpTests/DeviceProfileDumpTest/phoneVerticalBar.txt
+++ b/tests/assets/dumpTests/DeviceProfileDumpTest/phoneVerticalBar.txt
@@ -37,8 +37,8 @@
iconSizePx: 147.0px (56.0dp)
iconTextSizePx: 0.0px (0.0dp)
iconDrawablePaddingPx: 0.0px (0.0dp)
- inv.numFolderRows: 4
- inv.numFolderColumns: 4
+ numFolderRows: 4
+ numFolderColumns: 4
folderCellWidthPx: 163.0px (62.095238dp)
folderCellHeightPx: 192.0px (73.14286dp)
folderChildIconSizePx: 123.0px (46.857143dp)
diff --git a/tests/assets/dumpTests/DeviceProfileDumpTest/phoneVerticalBar3Button.txt b/tests/assets/dumpTests/DeviceProfileDumpTest/phoneVerticalBar3Button.txt
index 8850583..f8afa37 100644
--- a/tests/assets/dumpTests/DeviceProfileDumpTest/phoneVerticalBar3Button.txt
+++ b/tests/assets/dumpTests/DeviceProfileDumpTest/phoneVerticalBar3Button.txt
@@ -37,8 +37,8 @@
iconSizePx: 147.0px (56.0dp)
iconTextSizePx: 0.0px (0.0dp)
iconDrawablePaddingPx: 0.0px (0.0dp)
- inv.numFolderRows: 4
- inv.numFolderColumns: 4
+ numFolderRows: 4
+ numFolderColumns: 4
folderCellWidthPx: 173.0px (65.90476dp)
folderCellHeightPx: 205.0px (78.09524dp)
folderChildIconSizePx: 131.0px (49.904762dp)
diff --git a/tests/assets/dumpTests/DeviceProfileDumpTest/tabletLandscape.txt b/tests/assets/dumpTests/DeviceProfileDumpTest/tabletLandscape.txt
index 26b86dc..32e1f1b 100644
--- a/tests/assets/dumpTests/DeviceProfileDumpTest/tabletLandscape.txt
+++ b/tests/assets/dumpTests/DeviceProfileDumpTest/tabletLandscape.txt
@@ -37,8 +37,8 @@
iconSizePx: 120.0px (60.0dp)
iconTextSizePx: 28.0px (14.0dp)
iconDrawablePaddingPx: 9.0px (4.5dp)
- inv.numFolderRows: 3
- inv.numFolderColumns: 3
+ numFolderRows: 3
+ numFolderColumns: 3
folderCellWidthPx: 240.0px (120.0dp)
folderCellHeightPx: 208.0px (104.0dp)
folderChildIconSizePx: 120.0px (60.0dp)
diff --git a/tests/assets/dumpTests/DeviceProfileDumpTest/tabletLandscape3Button.txt b/tests/assets/dumpTests/DeviceProfileDumpTest/tabletLandscape3Button.txt
index 5778306..7c52c90 100644
--- a/tests/assets/dumpTests/DeviceProfileDumpTest/tabletLandscape3Button.txt
+++ b/tests/assets/dumpTests/DeviceProfileDumpTest/tabletLandscape3Button.txt
@@ -37,8 +37,8 @@
iconSizePx: 120.0px (60.0dp)
iconTextSizePx: 28.0px (14.0dp)
iconDrawablePaddingPx: 9.0px (4.5dp)
- inv.numFolderRows: 3
- inv.numFolderColumns: 3
+ numFolderRows: 3
+ numFolderColumns: 3
folderCellWidthPx: 240.0px (120.0dp)
folderCellHeightPx: 208.0px (104.0dp)
folderChildIconSizePx: 120.0px (60.0dp)
diff --git a/tests/assets/dumpTests/DeviceProfileDumpTest/tabletPortrait.txt b/tests/assets/dumpTests/DeviceProfileDumpTest/tabletPortrait.txt
index 9e943ae..b284ce0 100644
--- a/tests/assets/dumpTests/DeviceProfileDumpTest/tabletPortrait.txt
+++ b/tests/assets/dumpTests/DeviceProfileDumpTest/tabletPortrait.txt
@@ -37,8 +37,8 @@
iconSizePx: 120.0px (60.0dp)
iconTextSizePx: 28.0px (14.0dp)
iconDrawablePaddingPx: 9.0px (4.5dp)
- inv.numFolderRows: 3
- inv.numFolderColumns: 3
+ numFolderRows: 3
+ numFolderColumns: 3
folderCellWidthPx: 204.0px (102.0dp)
folderCellHeightPx: 240.0px (120.0dp)
folderChildIconSizePx: 120.0px (60.0dp)
diff --git a/tests/assets/dumpTests/DeviceProfileDumpTest/tabletPortrait3Button.txt b/tests/assets/dumpTests/DeviceProfileDumpTest/tabletPortrait3Button.txt
index f159b85..7001967 100644
--- a/tests/assets/dumpTests/DeviceProfileDumpTest/tabletPortrait3Button.txt
+++ b/tests/assets/dumpTests/DeviceProfileDumpTest/tabletPortrait3Button.txt
@@ -37,8 +37,8 @@
iconSizePx: 120.0px (60.0dp)
iconTextSizePx: 28.0px (14.0dp)
iconDrawablePaddingPx: 9.0px (4.5dp)
- inv.numFolderRows: 3
- inv.numFolderColumns: 3
+ numFolderRows: 3
+ numFolderColumns: 3
folderCellWidthPx: 204.0px (102.0dp)
folderCellHeightPx: 240.0px (120.0dp)
folderChildIconSizePx: 120.0px (60.0dp)
diff --git a/tests/assets/dumpTests/DeviceProfileDumpTest/twoPanelLandscape.txt b/tests/assets/dumpTests/DeviceProfileDumpTest/twoPanelLandscape.txt
index 55e9880..ba83533 100644
--- a/tests/assets/dumpTests/DeviceProfileDumpTest/twoPanelLandscape.txt
+++ b/tests/assets/dumpTests/DeviceProfileDumpTest/twoPanelLandscape.txt
@@ -37,8 +37,8 @@
iconSizePx: 141.0px (53.714287dp)
iconTextSizePx: 34.0px (12.952381dp)
iconDrawablePaddingPx: 13.0px (4.952381dp)
- inv.numFolderRows: 3
- inv.numFolderColumns: 4
+ numFolderRows: 3
+ numFolderColumns: 4
folderCellWidthPx: 189.0px (72.0dp)
folderCellHeightPx: 219.0px (83.42857dp)
folderChildIconSizePx: 141.0px (53.714287dp)
diff --git a/tests/assets/dumpTests/DeviceProfileDumpTest/twoPanelLandscape3Button.txt b/tests/assets/dumpTests/DeviceProfileDumpTest/twoPanelLandscape3Button.txt
index a2f0aa2..1b1240b 100644
--- a/tests/assets/dumpTests/DeviceProfileDumpTest/twoPanelLandscape3Button.txt
+++ b/tests/assets/dumpTests/DeviceProfileDumpTest/twoPanelLandscape3Button.txt
@@ -37,8 +37,8 @@
iconSizePx: 141.0px (53.714287dp)
iconTextSizePx: 34.0px (12.952381dp)
iconDrawablePaddingPx: 13.0px (4.952381dp)
- inv.numFolderRows: 3
- inv.numFolderColumns: 4
+ numFolderRows: 3
+ numFolderColumns: 4
folderCellWidthPx: 189.0px (72.0dp)
folderCellHeightPx: 219.0px (83.42857dp)
folderChildIconSizePx: 141.0px (53.714287dp)
diff --git a/tests/assets/dumpTests/DeviceProfileDumpTest/twoPanelPortrait.txt b/tests/assets/dumpTests/DeviceProfileDumpTest/twoPanelPortrait.txt
index ca42cda..11e7077 100644
--- a/tests/assets/dumpTests/DeviceProfileDumpTest/twoPanelPortrait.txt
+++ b/tests/assets/dumpTests/DeviceProfileDumpTest/twoPanelPortrait.txt
@@ -37,8 +37,8 @@
iconSizePx: 141.0px (53.714287dp)
iconTextSizePx: 34.0px (12.952381dp)
iconDrawablePaddingPx: 13.0px (4.952381dp)
- inv.numFolderRows: 3
- inv.numFolderColumns: 4
+ numFolderRows: 3
+ numFolderColumns: 4
folderCellWidthPx: 189.0px (72.0dp)
folderCellHeightPx: 219.0px (83.42857dp)
folderChildIconSizePx: 141.0px (53.714287dp)
diff --git a/tests/assets/dumpTests/DeviceProfileDumpTest/twoPanelPortrait3Button.txt b/tests/assets/dumpTests/DeviceProfileDumpTest/twoPanelPortrait3Button.txt
index d53badc..1a8b3ac 100644
--- a/tests/assets/dumpTests/DeviceProfileDumpTest/twoPanelPortrait3Button.txt
+++ b/tests/assets/dumpTests/DeviceProfileDumpTest/twoPanelPortrait3Button.txt
@@ -37,8 +37,8 @@
iconSizePx: 141.0px (53.714287dp)
iconTextSizePx: 34.0px (12.952381dp)
iconDrawablePaddingPx: 13.0px (4.952381dp)
- inv.numFolderRows: 3
- inv.numFolderColumns: 4
+ numFolderRows: 3
+ numFolderColumns: 4
folderCellWidthPx: 189.0px (72.0dp)
folderCellHeightPx: 219.0px (83.42857dp)
folderChildIconSizePx: 141.0px (53.714287dp)
diff --git a/tests/res/xml/invalid_cell_specs_1.xml b/tests/res/xml/invalid_cell_specs_1.xml
new file mode 100644
index 0000000..1e54771
--- /dev/null
+++ b/tests/res/xml/invalid_cell_specs_1.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<!-- invalid: only fixedSize attribute is allowed -->
+<cellSpecs xmlns:launcher="http://schemas.android.com/apk/res-auto">
+ <!-- portrait -->
+ <specs launcher:maxAspectRatio="1.0">
+ <cellSpec
+ launcher:dimensionType="height"
+ launcher:maxAvailableSize="9999dp">
+ <iconDrawablePadding launcher:ofAvailableSpace="0.0125" />
+ <iconSize launcher:fixedSize="48dp" />
+ <iconTextSize launcher:fixedSize="12sp" />
+ </cellSpec>
+ </specs>
+ <!-- landscape -->
+ <specs launcher:maxAspectRatio="10">
+ <cellSpec
+ launcher:dimensionType="height"
+ launcher:maxAvailableSize="9999dp">
+ <iconDrawablePadding launcher:fixedSize="0dp" />
+ <iconSize launcher:ofAvailableSpace="0.0125" />
+ <iconTextSize launcher:fixedSize="0sp" />
+ </cellSpec>
+ </specs>
+</cellSpecs>
\ No newline at end of file
diff --git a/tests/res/xml/invalid_cell_specs_2.xml b/tests/res/xml/invalid_cell_specs_2.xml
new file mode 100644
index 0000000..6edfda0
--- /dev/null
+++ b/tests/res/xml/invalid_cell_specs_2.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<!-- invalid: dimension type should be height -->
+<cellSpecs xmlns:launcher="http://schemas.android.com/apk/res-auto">
+ <!-- portrait -->
+ <specs launcher:maxAspectRatio="1.0">
+ <cellSpec
+ launcher:dimensionType="width"
+ launcher:maxAvailableSize="9999dp">
+ <iconDrawablePadding launcher:fixedSize="8dp" />
+ <iconSize launcher:fixedSize="48dp" />
+ <iconTextSize launcher:fixedSize="12sp" />
+ </cellSpec>
+ <cellSpec
+ launcher:dimensionType="height"
+ launcher:maxAvailableSize="9999dp">
+ <iconDrawablePadding launcher:fixedSize="8dp" />
+ <iconSize launcher:fixedSize="48dp" />
+ <iconTextSize launcher:fixedSize="12sp" />
+ </cellSpec>
+ </specs>
+ <!-- landscape -->
+ <specs launcher:maxAspectRatio="10">
+ <cellSpec
+ launcher:dimensionType="height"
+ launcher:maxAvailableSize="9999dp">
+ <iconDrawablePadding launcher:fixedSize="0dp" />
+ <iconSize launcher:fixedSize="52dp" />
+ <iconTextSize launcher:fixedSize="0sp" />
+ </cellSpec>
+ <cellSpec
+ launcher:dimensionType="height"
+ launcher:maxAvailableSize="9999dp">
+ <iconDrawablePadding launcher:fixedSize="0dp" />
+ <iconSize launcher:fixedSize="52dp" />
+ <iconTextSize launcher:fixedSize="0sp" />
+ </cellSpec>
+ <cellSpec
+ launcher:dimensionType="width"
+ launcher:maxAvailableSize="9999dp">
+ <iconDrawablePadding launcher:fixedSize="0dp" />
+ <iconSize launcher:fixedSize="52dp" />
+ <iconTextSize launcher:fixedSize="0sp" />
+ </cellSpec>
+ </specs>
+</cellSpecs>
\ No newline at end of file
diff --git a/tests/res/xml/invalid_cell_specs_3.xml b/tests/res/xml/invalid_cell_specs_3.xml
new file mode 100644
index 0000000..8f8e42b
--- /dev/null
+++ b/tests/res/xml/invalid_cell_specs_3.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<!-- invalid: total fixedSize > maxAvailableSize -->
+<cellSpecs xmlns:launcher="http://schemas.android.com/apk/res-auto">
+ <!-- portrait -->
+ <specs launcher:maxAspectRatio="1.0">
+ <cellSpec
+ launcher:dimensionType="height"
+ launcher:maxAvailableSize="9999dp">
+ <iconDrawablePadding launcher:ofAvailableSpace="0.0125" />
+ <iconSize launcher:fixedSize="48dp" />
+ <iconTextSize launcher:fixedSize="12sp" />
+ </cellSpec>
+ </specs>
+ <!-- landscape -->
+ <specs launcher:maxAspectRatio="10">
+ <cellSpec
+ launcher:dimensionType="height"
+ launcher:maxAvailableSize="9999dp">
+ <iconDrawablePadding launcher:fixedSize="9999dp" />
+ <iconSize launcher:ofAvailableSpace="0.0125" />
+ <iconTextSize launcher:fixedSize="1dp" />
+ </cellSpec>
+ </specs>
+</cellSpecs>
\ No newline at end of file
diff --git a/tests/res/xml/invalid_hotseat_file_case_2.xml b/tests/res/xml/invalid_hotseat_file_case_2.xml
new file mode 100644
index 0000000..fbf40ef
--- /dev/null
+++ b/tests/res/xml/invalid_hotseat_file_case_2.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<!-- invalid: total fixed size > maxAvailableSize -->
+<hotseatSpecs xmlns:launcher="http://schemas.android.com/apk/res-auto">
+ <specs launcher:maxAspectRatio="10">
+ <hotseatSpec
+ launcher:dimensionType="height"
+ launcher:maxAvailableSize="847dp">
+ <hotseatQsbSpace launcher:fixedSize="845dp" />
+ <edgePadding launcher:fixedSize="36dp" />
+ </hotseatSpec>
+
+ <hotseatSpec
+ launcher:dimensionType="height"
+ launcher:maxAvailableSize="9999dp">
+ <hotseatQsbSpace launcher:fixedSize="36dp" />
+ <edgePadding launcher:fixedSize="36dp" />
+ </hotseatSpec>
+ </specs>
+</hotseatSpecs>
\ No newline at end of file
diff --git a/tests/res/xml/invalid_responsive_spec_4.xml b/tests/res/xml/invalid_responsive_spec_4.xml
new file mode 100644
index 0000000..e9d510e
--- /dev/null
+++ b/tests/res/xml/invalid_responsive_spec_4.xml
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<!-- invalid file - remainder space > 1 (it must be lower or equal 1) -->
+<workspaceSpecs xmlns:launcher="http://schemas.android.com/apk/res-auto">
+ <specs launcher:maxAspectRatio="10">
+ <workspaceSpec
+ launcher:dimensionType="height"
+ launcher:maxAvailableSize="9999dp">
+ <startPadding launcher:fixedSize="0dp" />
+ <endPadding launcher:fixedSize="34dp" />
+ <gutter launcher:fixedSize="12dp" />
+ <cellSize launcher:ofRemainderSpace="0.25" />
+ </workspaceSpec>
+
+ <!-- Height spec -->
+ <workspaceSpec
+ launcher:dimensionType="height"
+ launcher:maxAvailableSize="371dp">
+ <startPadding launcher:fixedSize="0dp" />
+ <endPadding launcher:fixedSize="24dp" />
+ <gutter launcher:fixedSize="12dp" />
+ <cellSize launcher:ofRemainderSpace="0.25" />
+ </workspaceSpec>
+
+ <!-- Width spec -->
+ <workspaceSpec
+ launcher:dimensionType="width"
+ launcher:maxAvailableSize="716dp">
+ <startPadding launcher:fixedSize="16dp" />
+ <endPadding launcher:fixedSize="64dp" />
+ <gutter launcher:fixedSize="12dp" />
+ <cellSize launcher:ofRemainderSpace="0.25" />
+ </workspaceSpec>
+ <workspaceSpec
+ launcher:dimensionType="width"
+ launcher:maxAvailableSize="9999dp">
+ <startPadding launcher:fixedSize="36dp" />
+ <endPadding launcher:fixedSize="80dp" />
+ <gutter launcher:fixedSize="12dp" />
+ <cellSize launcher:ofRemainderSpace="0.25" />
+ </workspaceSpec>
+ <workspaceSpec
+ launcher:dimensionType="width"
+ launcher:maxAvailableSize="602dp">
+ <startPadding launcher:ofRemainderSpace=".5" />
+ <endPadding launcher:ofRemainderSpace=".5" />
+ <gutter launcher:ofRemainderSpace="0.01" />
+ <cellSize launcher:fixedSize="80dp" />
+ </workspaceSpec>
+ </specs>
+
+ <!-- specs from land/handheld_workspace_spec_4x4.xml -->
+ <specs launcher:maxAspectRatio="12">
+ <!-- Height spec -->
+ <workspaceSpec
+ launcher:dimensionType="height"
+ launcher:maxAvailableSize="9999dp">
+ <startPadding launcher:fixedSize="2dp" />
+ <endPadding launcher:fixedSize="2dp" />
+ <gutter launcher:fixedSize="8dp" />
+ <cellSize launcher:ofRemainderSpace="0.25" />
+ </workspaceSpec>
+
+ <!-- Width spec -->
+ <workspaceSpec
+ launcher:dimensionType="width"
+ launcher:maxAvailableSize="9999dp">
+ <startPadding launcher:fixedSize="1dp" />
+ <endPadding launcher:fixedSize="1dp" />
+ <gutter launcher:fixedSize="8dp" />
+ <cellSize launcher:ofRemainderSpace="0.25" />
+ </workspaceSpec>
+ </specs>
+
+ <specs launcher:maxAspectRatio="1.05">
+ <!-- 584 grid height + 28 remainder space -->
+ <workspaceSpec
+ launcher:dimensionType="height"
+ launcher:maxAvailableSize="612dp">
+ <startPadding launcher:fixedSize="0dp" />
+ <endPadding launcher:ofRemainderSpace="1" />
+ <gutter launcher:fixedSize="16dp" />
+ <cellSize launcher:fixedSize="104dp" />
+ </workspaceSpec>
+
+ <workspaceSpec
+ launcher:dimensionType="height"
+ launcher:maxAvailableSize="9999dp">
+ <startPadding launcher:fixedSize="8dp" />
+ <endPadding launcher:ofRemainderSpace="1" />
+ <gutter launcher:fixedSize="16dp" />
+ <cellSize launcher:fixedSize="104dp" />
+ </workspaceSpec>
+
+ <!-- 584 grid height -->
+ <workspaceSpec
+ launcher:dimensionType="height"
+ launcher:maxAvailableSize="584dp">
+ <startPadding launcher:fixedSize="0dp" />
+ <endPadding launcher:fixedSize="32dp" />
+ <gutter launcher:fixedSize="16dp" />
+ <cellSize launcher:ofAvailableSpace="0.15808" />
+ </workspaceSpec>
+
+ <!-- Width spec is always the same -->
+ <workspaceSpec
+ launcher:dimensionType="width"
+ launcher:maxAvailableSize="9999dp">
+ <startPadding launcher:fixedSize="22dp" />
+ <endPadding launcher:fixedSize="22dp" />
+ <gutter launcher:fixedSize="16dp" />
+ <cellSize launcher:ofRemainderSpace="0.25" />
+ </workspaceSpec>
+ </specs>
+</workspaceSpecs>
diff --git a/tests/res/xml/invalid_responsive_spec_5.xml b/tests/res/xml/invalid_responsive_spec_5.xml
new file mode 100644
index 0000000..584df35
--- /dev/null
+++ b/tests/res/xml/invalid_responsive_spec_5.xml
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<!-- invalid file - available space > 1 (it must be lower or equal 1) -->
+<workspaceSpecs xmlns:launcher="http://schemas.android.com/apk/res-auto">
+ <specs launcher:maxAspectRatio="10">
+ <workspaceSpec
+ launcher:dimensionType="height"
+ launcher:maxAvailableSize="9999dp">
+ <startPadding launcher:fixedSize="0dp" />
+ <endPadding launcher:fixedSize="34dp" />
+ <gutter launcher:fixedSize="12dp" />
+ <cellSize launcher:ofRemainderSpace="0.25" />
+ </workspaceSpec>
+
+ <!-- Height spec -->
+ <workspaceSpec
+ launcher:dimensionType="height"
+ launcher:maxAvailableSize="371dp">
+ <startPadding launcher:fixedSize="0dp" />
+ <endPadding launcher:fixedSize="24dp" />
+ <gutter launcher:fixedSize="12dp" />
+ <cellSize launcher:ofRemainderSpace="0.25" />
+ </workspaceSpec>
+
+ <!-- Width spec -->
+ <workspaceSpec
+ launcher:dimensionType="width"
+ launcher:maxAvailableSize="716dp">
+ <startPadding launcher:fixedSize="16dp" />
+ <endPadding launcher:fixedSize="64dp" />
+ <gutter launcher:fixedSize="12dp" />
+ <cellSize launcher:ofRemainderSpace="0.25" />
+ </workspaceSpec>
+ <workspaceSpec
+ launcher:dimensionType="width"
+ launcher:maxAvailableSize="9999dp">
+ <startPadding launcher:fixedSize="36dp" />
+ <endPadding launcher:fixedSize="80dp" />
+ <gutter launcher:fixedSize="12dp" />
+ <cellSize launcher:ofRemainderSpace="0.25" />
+ </workspaceSpec>
+ <workspaceSpec
+ launcher:dimensionType="width"
+ launcher:maxAvailableSize="602dp">
+ <startPadding launcher:ofAvailableSpace=".5" />
+ <endPadding launcher:ofAvailableSpace=".5" />
+ <gutter launcher:ofAvailableSpace="0.01" />
+ <cellSize launcher:fixedSize="80dp" />
+ </workspaceSpec>
+ </specs>
+
+ <!-- specs from land/handheld_workspace_spec_4x4.xml -->
+ <specs launcher:maxAspectRatio="12">
+ <!-- Height spec -->
+ <workspaceSpec
+ launcher:dimensionType="height"
+ launcher:maxAvailableSize="9999dp">
+ <startPadding launcher:fixedSize="2dp" />
+ <endPadding launcher:fixedSize="2dp" />
+ <gutter launcher:fixedSize="8dp" />
+ <cellSize launcher:ofRemainderSpace="0.25" />
+ </workspaceSpec>
+
+ <!-- Width spec -->
+ <workspaceSpec
+ launcher:dimensionType="width"
+ launcher:maxAvailableSize="9999dp">
+ <startPadding launcher:fixedSize="1dp" />
+ <endPadding launcher:fixedSize="1dp" />
+ <gutter launcher:fixedSize="8dp" />
+ <cellSize launcher:ofRemainderSpace="0.25" />
+ </workspaceSpec>
+ </specs>
+
+ <specs launcher:maxAspectRatio="1.05">
+ <!-- 584 grid height + 28 remainder space -->
+ <workspaceSpec
+ launcher:dimensionType="height"
+ launcher:maxAvailableSize="612dp">
+ <startPadding launcher:fixedSize="0dp" />
+ <endPadding launcher:ofRemainderSpace="1" />
+ <gutter launcher:fixedSize="16dp" />
+ <cellSize launcher:fixedSize="104dp" />
+ </workspaceSpec>
+
+ <workspaceSpec
+ launcher:dimensionType="height"
+ launcher:maxAvailableSize="9999dp">
+ <startPadding launcher:fixedSize="8dp" />
+ <endPadding launcher:ofRemainderSpace="1" />
+ <gutter launcher:fixedSize="16dp" />
+ <cellSize launcher:fixedSize="104dp" />
+ </workspaceSpec>
+
+ <!-- 584 grid height -->
+ <workspaceSpec
+ launcher:dimensionType="height"
+ launcher:maxAvailableSize="584dp">
+ <startPadding launcher:fixedSize="0dp" />
+ <endPadding launcher:fixedSize="32dp" />
+ <gutter launcher:fixedSize="16dp" />
+ <cellSize launcher:ofAvailableSpace="0.15808" />
+ </workspaceSpec>
+
+ <!-- Width spec is always the same -->
+ <workspaceSpec
+ launcher:dimensionType="width"
+ launcher:maxAvailableSize="9999dp">
+ <startPadding launcher:fixedSize="22dp" />
+ <endPadding launcher:fixedSize="22dp" />
+ <gutter launcher:fixedSize="16dp" />
+ <cellSize launcher:ofRemainderSpace="0.25" />
+ </workspaceSpec>
+ </specs>
+</workspaceSpecs>
diff --git a/tests/res/xml/invalid_responsive_spec_6.xml b/tests/res/xml/invalid_responsive_spec_6.xml
new file mode 100644
index 0000000..9711efb
--- /dev/null
+++ b/tests/res/xml/invalid_responsive_spec_6.xml
@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<!-- invalid file - fixed size < maxAvailableSize (it must be lower or equal 1) -->
+<workspaceSpecs xmlns:launcher="http://schemas.android.com/apk/res-auto">
+ <specs launcher:maxAspectRatio="10">
+ <workspaceSpec
+ launcher:dimensionType="height"
+ launcher:maxAvailableSize="9999dp">
+ <startPadding launcher:fixedSize="0dp" />
+ <endPadding launcher:fixedSize="34dp" />
+ <gutter launcher:fixedSize="12dp" />
+ <cellSize launcher:ofRemainderSpace="0.25" />
+ </workspaceSpec>
+
+ <!-- Height spec -->
+ <workspaceSpec
+ launcher:dimensionType="height"
+ launcher:maxAvailableSize="371dp">
+ <startPadding launcher:fixedSize="0dp" />
+ <endPadding launcher:fixedSize="24dp" />
+ <gutter launcher:fixedSize="12dp" />
+ <cellSize launcher:ofRemainderSpace="0.25" />
+ </workspaceSpec>
+
+ <!-- Width spec -->
+ <workspaceSpec
+ launcher:dimensionType="width"
+ launcher:maxAvailableSize="716dp">
+ <startPadding launcher:fixedSize="16dp" />
+ <endPadding launcher:fixedSize="64dp" />
+ <gutter launcher:fixedSize="12dp" />
+ <cellSize launcher:ofRemainderSpace="0.25" />
+ </workspaceSpec>
+ <workspaceSpec
+ launcher:dimensionType="width"
+ launcher:maxAvailableSize="9999dp">
+ <startPadding launcher:fixedSize="36dp" />
+ <endPadding launcher:fixedSize="80dp" />
+ <gutter launcher:fixedSize="12dp" />
+ <cellSize launcher:ofRemainderSpace="0.25" />
+ </workspaceSpec>
+ <workspaceSpec
+ launcher:dimensionType="width"
+ launcher:maxAvailableSize="602dp">
+ <startPadding launcher:fixedSize="200dp" />
+ <endPadding launcher:fixedSize="200dp" />
+ <gutter launcher:fixedSize="150dp" />
+ <cellSize launcher:fixedSize="80dp" />
+ </workspaceSpec>
+ </specs>
+
+ <!-- specs from land/handheld_workspace_spec_4x4.xml -->
+ <specs launcher:maxAspectRatio="12">
+ <!-- Height spec -->
+ <workspaceSpec
+ launcher:dimensionType="height"
+ launcher:maxAvailableSize="9999dp">
+ <startPadding launcher:fixedSize="2dp" />
+ <endPadding launcher:fixedSize="2dp" />
+ <gutter launcher:fixedSize="8dp" />
+ <cellSize launcher:ofRemainderSpace="0.25" />
+ </workspaceSpec>
+
+ <!-- Width spec -->
+ <workspaceSpec
+ launcher:dimensionType="width"
+ launcher:maxAvailableSize="9999dp">
+ <startPadding launcher:fixedSize="1dp" />
+ <endPadding launcher:fixedSize="1dp" />
+ <gutter launcher:fixedSize="8dp" />
+ <cellSize launcher:ofRemainderSpace="0.25" />
+ </workspaceSpec>
+ </specs>
+
+ <specs launcher:maxAspectRatio="1.05">
+ <!-- 584 grid height + 28 remainder space -->
+ <workspaceSpec
+ launcher:dimensionType="height"
+ launcher:maxAvailableSize="612dp">
+ <startPadding launcher:fixedSize="0dp" />
+ <endPadding launcher:ofRemainderSpace="1" />
+ <gutter launcher:fixedSize="16dp" />
+ <cellSize launcher:fixedSize="104dp" />
+ </workspaceSpec>
+
+ <workspaceSpec
+ launcher:dimensionType="height"
+ launcher:maxAvailableSize="9999dp">
+ <startPadding launcher:fixedSize="8dp" />
+ <endPadding launcher:ofRemainderSpace="1" />
+ <gutter launcher:fixedSize="16dp" />
+ <cellSize launcher:fixedSize="104dp" />
+ </workspaceSpec>
+
+ <!-- 584 grid height -->
+ <workspaceSpec
+ launcher:dimensionType="height"
+ launcher:maxAvailableSize="584dp">
+ <startPadding launcher:fixedSize="0dp" />
+ <endPadding launcher:fixedSize="32dp" />
+ <gutter launcher:fixedSize="16dp" />
+ <cellSize launcher:ofAvailableSpace="0.15808" />
+ </workspaceSpec>
+
+ <!-- Width spec is always the same -->
+ <workspaceSpec
+ launcher:dimensionType="width"
+ launcher:maxAvailableSize="9999dp">
+ <startPadding launcher:fixedSize="22dp" />
+ <endPadding launcher:fixedSize="22dp" />
+ <gutter launcher:fixedSize="16dp" />
+ <cellSize launcher:ofRemainderSpace="0.25" />
+ </workspaceSpec>
+ </specs>
+</workspaceSpecs>
diff --git a/tests/res/xml/valid_cell_specs_file.xml b/tests/res/xml/valid_cell_specs_file.xml
new file mode 100644
index 0000000..7a5f03f
--- /dev/null
+++ b/tests/res/xml/valid_cell_specs_file.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ ~ Copyright (C) 2023 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<cellSpecs xmlns:launcher="http://schemas.android.com/apk/res-auto">
+ <!-- portrait -->
+ <specs launcher:maxAspectRatio="1.0">
+ <cellSpec
+ launcher:dimensionType="height"
+ launcher:maxAvailableSize="606dp">
+ <iconDrawablePadding launcher:fixedSize="8dp" />
+ <iconSize launcher:fixedSize="48dp" />
+ <iconTextSize launcher:fixedSize="12sp" />
+ </cellSpec>
+ <cellSpec
+ launcher:dimensionType="height"
+ launcher:maxAvailableSize="9999dp">
+ <iconDrawablePadding launcher:fixedSize="11dp" />
+ <iconSize launcher:fixedSize="52dp" />
+ <iconTextSize launcher:fixedSize="12sp" />
+ </cellSpec>
+ </specs>
+ <!-- landscape -->
+ <specs launcher:maxAspectRatio="10">
+ <cellSpec
+ launcher:dimensionType="height"
+ launcher:maxAvailableSize="9999dp">
+ <iconDrawablePadding launcher:fixedSize="0dp" />
+ <iconSize launcher:fixedSize="52dp" />
+ <iconTextSize launcher:fixedSize="0sp" />
+ </cellSpec>
+ </specs>
+</cellSpecs>
\ No newline at end of file
diff --git a/tests/shared/com/android/launcher3/testing/shared/TestProtocol.java b/tests/shared/com/android/launcher3/testing/shared/TestProtocol.java
index e1b06a8..4f79adc 100644
--- a/tests/shared/com/android/launcher3/testing/shared/TestProtocol.java
+++ b/tests/shared/com/android/launcher3/testing/shared/TestProtocol.java
@@ -156,9 +156,11 @@
public static final String REQUEST_MOCK_SENSOR_ROTATION = "mock-sensor-rotation";
public static final String PERMANENT_DIAG_TAG = "TaplTarget";
+ public static final String TWO_NEXUS_LAUNCHER_ACTIVITY_WHILE_UNLOCKING = "b/273347463";
public static final String TWO_TASKBAR_LONG_CLICKS = "b/262282528";
public static final String ICON_MISSING = "b/282963545";
public static final String WORKSPACE_LONG_PRESS = "b/311099513";
+ public static final String OVERVIEW_OVER_HOME = "b/279059025";
public static final String REQUEST_EMULATE_DISPLAY = "emulate-display";
public static final String REQUEST_STOP_EMULATE_DISPLAY = "stop-emulate-display";
diff --git a/tests/src/com/android/launcher3/FakeInvariantDeviceProfileTest.kt b/tests/src/com/android/launcher3/FakeInvariantDeviceProfileTest.kt
index a421006..30b5663 100644
--- a/tests/src/com/android/launcher3/FakeInvariantDeviceProfileTest.kt
+++ b/tests/src/com/android/launcher3/FakeInvariantDeviceProfileTest.kt
@@ -121,8 +121,8 @@
listOf(PointF(16f, 16f), PointF(16f, 16f), PointF(16f, 16f), PointF(16f, 16f))
.toTypedArray()
- numFolderRows = 3
- numFolderColumns = 3
+ numFolderRows = intArrayOf(3, 3, 3, 3)
+ numFolderColumns = intArrayOf(3, 3, 3, 3)
folderStyle = R.style.FolderStyleDefault
inlineNavButtonsEndSpacing = R.dimen.taskbar_button_margin_split
@@ -204,8 +204,8 @@
listOf(PointF(16f, 64f), PointF(64f, 16f), PointF(16f, 64f), PointF(16f, 64f))
.toTypedArray()
- numFolderRows = 3
- numFolderColumns = 3
+ numFolderRows = intArrayOf(3, 3, 3, 3)
+ numFolderColumns = intArrayOf(3, 3, 3, 3)
folderStyle = R.style.FolderStyleDefault
inlineNavButtonsEndSpacing = R.dimen.taskbar_button_margin_6_5
@@ -288,8 +288,8 @@
listOf(PointF(16f, 16f), PointF(16f, 16f), PointF(16f, 20f), PointF(20f, 20f))
.toTypedArray()
- numFolderRows = 3
- numFolderColumns = 3
+ numFolderRows = intArrayOf(3, 3, 3, 3)
+ numFolderColumns = intArrayOf(3, 3, 3, 3)
folderStyle = R.style.FolderStyleDefault
inlineNavButtonsEndSpacing = R.dimen.taskbar_button_margin_split
diff --git a/tests/src/com/android/launcher3/allapps/TaplKeyboardFocusTest.java b/tests/src/com/android/launcher3/allapps/TaplKeyboardFocusTest.java
index d71bf84..ee32e97 100644
--- a/tests/src/com/android/launcher3/allapps/TaplKeyboardFocusTest.java
+++ b/tests/src/com/android/launcher3/allapps/TaplKeyboardFocusTest.java
@@ -15,7 +15,7 @@
*/
package com.android.launcher3.allapps;
-import static com.android.launcher3.ui.TaplTestsLauncher3.initialize;
+import static com.android.launcher3.ui.AbstractLauncherUiTest.initialize;
import static com.android.launcher3.util.rule.TestStabilityRule.LOCAL;
import static com.android.launcher3.util.rule.TestStabilityRule.PLATFORM_POSTSUBMIT;
@@ -23,8 +23,6 @@
import static org.junit.Assert.assertTrue;
import android.view.KeyEvent;
-import android.view.View;
-import android.view.WindowInsets;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;
@@ -33,6 +31,7 @@
import com.android.launcher3.tapl.HomeAllApps;
import com.android.launcher3.ui.AbstractLauncherUiTest;
import com.android.launcher3.util.rule.TestStabilityRule;
+import com.android.launcher3.views.ActivityContext;
import org.junit.Before;
import org.junit.Test;
@@ -102,11 +101,8 @@
executeOnLauncher(launcher -> launcher.getAppsView().getSearchUiManager().getEditText()
.hideKeyboard(/* clearFocus= */ false));
- waitForLauncherCondition("Keyboard still visible.", launcher -> {
- View root = launcher.getDragLayer();
- WindowInsets insets = root.getRootWindowInsets();
- return insets != null && !insets.isVisible(WindowInsets.Type.ime());
- });
+ waitForLauncherCondition("Keyboard still visible.",
+ ActivityContext::isSoftwareKeyboardHidden);
mLauncher.pressAndHoldKeyCode(KeyEvent.KEYCODE_DPAD_DOWN, 0);
mLauncher.unpressKeyCode(KeyEvent.KEYCODE_DPAD_DOWN, 0);
diff --git a/tests/src/com/android/launcher3/allapps/TaplOpenCloseAllApps.java b/tests/src/com/android/launcher3/allapps/TaplOpenCloseAllApps.java
index 39dbcb2..c7942c7 100644
--- a/tests/src/com/android/launcher3/allapps/TaplOpenCloseAllApps.java
+++ b/tests/src/com/android/launcher3/allapps/TaplOpenCloseAllApps.java
@@ -16,7 +16,7 @@
package com.android.launcher3.allapps;
import static com.android.launcher3.ui.TaplTestsLauncher3.expectFail;
-import static com.android.launcher3.ui.TaplTestsLauncher3.initialize;
+import static com.android.launcher3.ui.AbstractLauncherUiTest.initialize;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
@@ -217,4 +217,10 @@
mLauncher.getWorkspace();
waitForState("Launcher internal state didn't switch to Home", () -> LauncherState.NORMAL);
}
+
+ @Test
+ public void testDismissAllAppsWithEscKey() {
+ mLauncher.goHome().switchToAllApps().dismissByEscKey();
+ waitForState("Launcher internal state didn't switch to Home", () -> LauncherState.NORMAL);
+ }
}
diff --git a/tests/src/com/android/launcher3/allapps/TaplTestsAllAppsIconsWorking.java b/tests/src/com/android/launcher3/allapps/TaplTestsAllAppsIconsWorking.java
index fd4619e..9f6bbdf 100644
--- a/tests/src/com/android/launcher3/allapps/TaplTestsAllAppsIconsWorking.java
+++ b/tests/src/com/android/launcher3/allapps/TaplTestsAllAppsIconsWorking.java
@@ -15,7 +15,7 @@
*/
package com.android.launcher3.allapps;
-import static com.android.launcher3.ui.TaplTestsLauncher3.initialize;
+import static com.android.launcher3.ui.AbstractLauncherUiTest.initialize;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
diff --git a/tests/src/com/android/launcher3/appiconmenu/TaplAppIconMenuTest.java b/tests/src/com/android/launcher3/appiconmenu/TaplAppIconMenuTest.java
index 0f5d85b..a1f2cef 100644
--- a/tests/src/com/android/launcher3/appiconmenu/TaplAppIconMenuTest.java
+++ b/tests/src/com/android/launcher3/appiconmenu/TaplAppIconMenuTest.java
@@ -16,7 +16,7 @@
package com.android.launcher3.appiconmenu;
import static com.android.launcher3.util.TestConstants.AppNames.TEST_APP_NAME;
-import static com.android.launcher3.ui.TaplTestsLauncher3.initialize;
+import static com.android.launcher3.ui.AbstractLauncherUiTest.initialize;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
diff --git a/tests/src/com/android/launcher3/celllayout/CellLayoutTestUtils.java b/tests/src/com/android/launcher3/celllayout/CellLayoutTestUtils.java
index 86a7bd3..d8ae74b 100644
--- a/tests/src/com/android/launcher3/celllayout/CellLayoutTestUtils.java
+++ b/tests/src/com/android/launcher3/celllayout/CellLayoutTestUtils.java
@@ -21,6 +21,7 @@
import com.android.launcher3.CellLayout;
import com.android.launcher3.Launcher;
+import com.android.launcher3.celllayout.board.CellLayoutBoard;
import com.android.launcher3.views.DoubleShadowBubbleTextView;
import java.util.ArrayList;
@@ -60,9 +61,7 @@
}
public static CellLayoutBoard viewsToBoard(List<View> views, int width, int height) {
- CellLayoutBoard board = new CellLayoutBoard();
- board.mWidth = width;
- board.mHeight = height;
+ CellLayoutBoard board = new CellLayoutBoard(width, height);
for (View callView : views) {
CellLayoutLayoutParams params = (CellLayoutLayoutParams) callView.getLayoutParams();
diff --git a/tests/src/com/android/launcher3/celllayout/ReorderAlgorithmUnitTest.java b/tests/src/com/android/launcher3/celllayout/ReorderAlgorithmUnitTest.java
index 91a0634..bd52bda 100644
--- a/tests/src/com/android/launcher3/celllayout/ReorderAlgorithmUnitTest.java
+++ b/tests/src/com/android/launcher3/celllayout/ReorderAlgorithmUnitTest.java
@@ -22,7 +22,7 @@
import android.content.Context;
import android.graphics.Point;
-import android.graphics.Rect;
+import android.util.Log;
import android.view.View;
import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -31,6 +31,13 @@
import com.android.launcher3.CellLayout;
import com.android.launcher3.DeviceProfile;
import com.android.launcher3.InvariantDeviceProfile;
+import com.android.launcher3.MultipageCellLayout;
+import com.android.launcher3.celllayout.board.CellLayoutBoard;
+import com.android.launcher3.celllayout.board.IconPoint;
+import com.android.launcher3.celllayout.board.PermutedBoardComparator;
+import com.android.launcher3.celllayout.board.WidgetRect;
+import com.android.launcher3.celllayout.testgenerator.RandomBoardGenerator;
+import com.android.launcher3.celllayout.testgenerator.RandomMultiBoardGenerator;
import com.android.launcher3.util.ActivityContextWrapper;
import com.android.launcher3.views.DoubleShadowBubbleTextView;
@@ -50,10 +57,25 @@
@SmallTest
@RunWith(AndroidJUnit4.class)
public class ReorderAlgorithmUnitTest {
+
+ private static final String TAG = "ReorderAlgorithmUnitTest";
+ private static final char MAIN_WIDGET_TYPE = 'z';
+
+ // There is nothing special about this numbers, the random seed is just to be able to reproduce
+ // the test cases and the height and width is a random number similar to what users expect on
+ // their devices
+ private static final int SEED = 897;
+ private static final int MAX_BOARD_SIZE = 13;
+
+ private static final int TOTAL_OF_CASES_GENERATED = 300;
private Context mApplicationContext;
private int mPrevNumColumns, mPrevNumRows;
+ /**
+ * This test reads existing test cases and makes sure the CellLayout produces the same
+ * output for each of them for a given input.
+ */
@Test
public void testAllCases() throws IOException {
List<ReorderAlgorithmUnitTestCase> testCases = getTestCases(
@@ -62,7 +84,7 @@
List<Integer> failingCases = new ArrayList<>();
for (int i = 0; i < testCases.size(); i++) {
try {
- evaluateTestCase(testCases.get(i));
+ evaluateTestCase(testCases.get(i), false);
} catch (AssertionError e) {
e.printStackTrace();
failingCases.add(i);
@@ -72,6 +94,47 @@
failingCases.size());
}
+ /**
+ * This test generates random CellLayout configurations and then try to reorder it and makes
+ * sure the result is a valid board meaning it didn't remove any widget or icon.
+ */
+ @Test
+ public void generateValidTests() {
+ Random generator = new Random(SEED);
+ mApplicationContext = new ActivityContextWrapper(getApplicationContext());
+ for (int i = 0; i < TOTAL_OF_CASES_GENERATED; i++) {
+ // Using a new seed so that we can replicate the same test cases.
+ int seed = generator.nextInt();
+ Log.d(TAG, "Seed = " + seed);
+ ReorderAlgorithmUnitTestCase testCase = generateRandomTestCase(
+ new RandomBoardGenerator(new Random(seed))
+ );
+ Log.d(TAG, "testCase = " + testCase);
+ assertTrue("invalid case " + i,
+ validateIntegrity(testCase.startBoard, testCase.endBoard, testCase));
+ }
+ }
+
+ /**
+ * Same as above but testing the Multipage CellLayout.
+ */
+ @Test
+ public void generateValidTests_Multi() {
+ Random generator = new Random(SEED);
+ mApplicationContext = new ActivityContextWrapper(getApplicationContext());
+ for (int i = 0; i < TOTAL_OF_CASES_GENERATED; i++) {
+ // Using a new seed so that we can replicate the same test cases.
+ int seed = generator.nextInt();
+ Log.d(TAG, "Seed = " + seed);
+ ReorderAlgorithmUnitTestCase testCase = generateRandomTestCase(
+ new RandomMultiBoardGenerator(new Random(seed))
+ );
+ Log.d(TAG, "testCase = " + testCase);
+ assertTrue("invalid case " + i,
+ validateIntegrity(testCase.startBoard, testCase.endBoard, testCase));
+ }
+ }
+
private void addViewInCellLayout(CellLayout cellLayout, int cellX, int cellY, int spanX,
int spanY, boolean isWidget) {
View cell = isWidget ? new View(mApplicationContext) : new DoubleShadowBubbleTextView(
@@ -81,15 +144,16 @@
(CellLayoutLayoutParams) cell.getLayoutParams(), true);
}
- public CellLayout createCellLayout(int width, int height) {
+ public CellLayout createCellLayout(int width, int height, boolean isMulti) {
Context c = mApplicationContext;
DeviceProfile dp = InvariantDeviceProfile.INSTANCE.get(c).getDeviceProfile(c).copy(c);
// modify the device profile.
- dp.inv.numColumns = width;
+ dp.inv.numColumns = isMulti ? width / 2 : width;
dp.inv.numRows = height;
dp.cellLayoutBorderSpacePx = new Point(0, 0);
- CellLayout cl = new CellLayout(getWrappedContext(c, dp));
+ CellLayout cl = isMulti ? new MultipageCellLayout(getWrappedContext(c, dp))
+ : new CellLayout(getWrappedContext(c, dp));
// I put a very large number for width and height so that all the items can fit, it doesn't
// need to be exact, just bigger than the sum of cell border
cl.measure(View.MeasureSpec.makeMeasureSpec(10000, View.MeasureSpec.EXACTLY),
@@ -105,52 +169,66 @@
};
}
- public CellLayout.ItemConfiguration solve(CellLayoutBoard board, int x, int y, int spanX,
- int spanY, int minSpanX, int minSpanY) {
- CellLayout cl = createCellLayout(board.getWidth(), board.getHeight());
+ public ItemConfiguration solve(CellLayoutBoard board, int x, int y, int spanX,
+ int spanY, int minSpanX, int minSpanY, boolean isMulti) {
+ CellLayout cl = createCellLayout(board.getWidth(), board.getHeight(), isMulti);
// The views have to be sorted or the result can vary
board.getIcons()
.stream()
- .map(CellLayoutBoard.IconPoint::getCoord)
+ .map(IconPoint::getCoord)
.sorted(Comparator.comparing(p -> ((Point) p).x).thenComparing(p -> ((Point) p).y))
.forEach(p -> addViewInCellLayout(cl, p.x, p.y, 1, 1, false));
- board.getWidgets().stream()
- .sorted(Comparator.comparing(CellLayoutBoard.WidgetRect::getCellX)
- .thenComparing(CellLayoutBoard.WidgetRect::getCellY))
- .forEach(widget -> addViewInCellLayout(cl, widget.getCellX(), widget.getCellY(),
- widget.getSpanX(), widget.getSpanY(), true));
+ board.getWidgets()
+ .stream()
+ .sorted(Comparator
+ .comparing(WidgetRect::getCellX)
+ .thenComparing(WidgetRect::getCellY)
+ ).forEach(
+ widget -> addViewInCellLayout(cl, widget.getCellX(), widget.getCellY(),
+ widget.getSpanX(), widget.getSpanY(), true)
+ );
int[] testCaseXYinPixels = new int[2];
cl.regionToCenterPoint(x, y, spanX, spanY, testCaseXYinPixels);
- CellLayout.ItemConfiguration solution = cl.createReorderAlgorithm().calculateReorder(
+ ItemConfiguration solution = cl.createReorderAlgorithm().calculateReorder(
testCaseXYinPixels[0], testCaseXYinPixels[1], minSpanX, minSpanY, spanX, spanY,
null);
if (solution == null) {
- solution = new CellLayout.ItemConfiguration();
+ solution = new ItemConfiguration();
+ solution.isSolution = false;
+ }
+ if (!solution.isSolution) {
+ cl.copyCurrentStateToSolution(solution, false);
+ if (cl instanceof MultipageCellLayout) {
+ solution =
+ ((MultipageCellLayout) cl).createReorderAlgorithm().removeSeamFromSolution(
+ solution);
+ }
solution.isSolution = false;
}
return solution;
}
- public CellLayoutBoard boardFromSolution(CellLayout.ItemConfiguration solution, int width,
+ public CellLayoutBoard boardFromSolution(ItemConfiguration solution, int width,
int height) {
// Update the views with solution value
solution.map.forEach((key, val) -> key.setLayoutParams(
new CellLayoutLayoutParams(val.cellX, val.cellY, val.spanX, val.spanY)));
CellLayoutBoard board = CellLayoutTestUtils.viewsToBoard(
new ArrayList<>(solution.map.keySet()), width, height);
- board.addWidget(solution.cellX, solution.cellY, solution.spanX, solution.spanY,
- 'z');
+ if (solution.isSolution) {
+ board.addWidget(solution.cellX, solution.cellY, solution.spanX, solution.spanY,
+ MAIN_WIDGET_TYPE);
+ }
return board;
}
- public void evaluateTestCase(ReorderAlgorithmUnitTestCase testCase) {
- CellLayout.ItemConfiguration solution = solve(testCase.startBoard, testCase.x,
- testCase.y, testCase.spanX, testCase.spanY, testCase.minSpanX,
- testCase.minSpanY);
- assertEquals("should be a valid solution", solution.isSolution,
- testCase.isValidSolution);
+ public void evaluateTestCase(ReorderAlgorithmUnitTestCase testCase, boolean isMultiCellLayout) {
+ ItemConfiguration solution = solve(testCase.startBoard, testCase.x, testCase.y,
+ testCase.spanX, testCase.spanY, testCase.minSpanX, testCase.minSpanY,
+ isMultiCellLayout);
+ assertEquals("should be a valid solution", solution.isSolution, testCase.isValidSolution);
if (testCase.isValidSolution) {
CellLayoutBoard finishBoard = boardFromSolution(solution,
testCase.startBoard.getWidth(), testCase.startBoard.getHeight());
@@ -175,36 +253,35 @@
dp.inv.numRows = mPrevNumRows;
}
- @SuppressWarnings("UnusedMethod")
- /**
- * Utility function used to generate all the test cases
- */
- private ReorderAlgorithmUnitTestCase generateRandomTestCase() {
+ private ReorderAlgorithmUnitTestCase generateRandomTestCase(
+ RandomBoardGenerator boardGenerator) {
ReorderAlgorithmUnitTestCase testCase = new ReorderAlgorithmUnitTestCase();
- int width = getRandom(3, 8);
- int height = getRandom(3, 8);
+ boolean isMultiCellLayout = boardGenerator instanceof RandomMultiBoardGenerator;
- int targetWidth = getRandom(1, width - 2);
- int targetHeight = getRandom(1, height - 2);
+ int width = isMultiCellLayout
+ ? boardGenerator.getRandom(3, MAX_BOARD_SIZE / 2) * 2
+ : boardGenerator.getRandom(3, MAX_BOARD_SIZE);
+ int height = boardGenerator.getRandom(3, MAX_BOARD_SIZE);
- int minTargetWidth = getRandom(1, targetWidth);
- int minTargetHeight = getRandom(1, targetHeight);
+ int targetWidth = boardGenerator.getRandom(1, width - 2);
+ int targetHeight = boardGenerator.getRandom(1, height - 2);
- int x = getRandom(0, width - targetWidth);
- int y = getRandom(0, height - targetHeight);
+ int minTargetWidth = boardGenerator.getRandom(1, targetWidth);
+ int minTargetHeight = boardGenerator.getRandom(1, targetHeight);
- CellLayoutBoard board = generateBoard(new CellLayoutBoard(width, height),
- new Rect(0, 0, width, height), targetWidth * targetHeight);
+ int x = boardGenerator.getRandom(0, width - targetWidth);
+ int y = boardGenerator.getRandom(0, height - targetHeight);
- CellLayout.ItemConfiguration solution = solve(board, x, y, targetWidth, targetHeight,
- minTargetWidth, minTargetHeight);
+ CellLayoutBoard board = boardGenerator.generateBoard(width, height,
+ targetWidth * targetHeight);
- CellLayoutBoard finishBoard = solution.isSolution ? boardFromSolution(solution,
- board.getWidth(), board.getHeight()) : new CellLayoutBoard(board.getWidth(),
+ ItemConfiguration solution = solve(board, x, y, targetWidth, targetHeight,
+ minTargetWidth, minTargetHeight, isMultiCellLayout);
+
+ CellLayoutBoard finishBoard = boardFromSolution(solution, board.getWidth(),
board.getHeight());
-
testCase.startBoard = board;
testCase.endBoard = finishBoard;
testCase.isValidSolution = solution.isSolution;
@@ -219,39 +296,24 @@
return testCase;
}
- private int getRandom(int start, int end) {
- int random = end == 0 ? 0 : new Random().nextInt(end);
- return start + random;
- }
-
- private CellLayoutBoard generateBoard(CellLayoutBoard board, Rect area,
- int emptySpaces) {
- if (area.height() * area.width() <= 0) return board;
-
- int width = getRandom(1, area.width() - 1);
- int height = getRandom(1, area.height() - 1);
-
- int x = area.left + getRandom(0, area.width() - width);
- int y = area.top + getRandom(0, area.height() - height);
-
- if (emptySpaces > 0) {
- emptySpaces -= width * height;
- } else if (width * height > 1) {
- board.addWidget(x, y, width, height);
- } else {
- board.addIcon(x, y);
+ /**
+ * Makes sure the final solution has valid integrity meaning that the number and sizes of
+ * widgets is the expect and there are no missing widgets.
+ */
+ public boolean validateIntegrity(CellLayoutBoard startBoard, CellLayoutBoard finishBoard,
+ ReorderAlgorithmUnitTestCase testCase) {
+ if (!testCase.isValidSolution) {
+ // if we couldn't place the widget then the solution should be identical to the board
+ return startBoard.compareTo(finishBoard) == 0;
}
-
- generateBoard(board,
- new Rect(area.left, area.top, area.right, y), emptySpaces);
- generateBoard(board,
- new Rect(area.left, y, x, area.bottom), emptySpaces);
- generateBoard(board,
- new Rect(x, y + height, area.right, area.bottom), emptySpaces);
- generateBoard(board,
- new Rect(x + width, y, area.right, y + height), emptySpaces);
-
- return board;
+ WidgetRect addedWidget = finishBoard.getWidgetOfType(MAIN_WIDGET_TYPE);
+ finishBoard.removeItem(MAIN_WIDGET_TYPE);
+ Comparator<CellLayoutBoard> comparator = new PermutedBoardComparator();
+ if (comparator.compare(startBoard, finishBoard) != 0) {
+ return false;
+ }
+ return addedWidget.getSpanX() >= testCase.minSpanX
+ && addedWidget.getSpanY() >= testCase.minSpanY;
}
private static List<ReorderAlgorithmUnitTestCase> getTestCases(String testPath)
diff --git a/tests/src/com/android/launcher3/celllayout/ReorderAlgorithmUnitTestCase.java b/tests/src/com/android/launcher3/celllayout/ReorderAlgorithmUnitTestCase.java
index 4274130..3dc5030 100644
--- a/tests/src/com/android/launcher3/celllayout/ReorderAlgorithmUnitTestCase.java
+++ b/tests/src/com/android/launcher3/celllayout/ReorderAlgorithmUnitTestCase.java
@@ -15,6 +15,8 @@
*/
package com.android.launcher3.celllayout;
+import com.android.launcher3.celllayout.board.CellLayoutBoard;
+
import java.util.Iterator;
/**
diff --git a/tests/src/com/android/launcher3/celllayout/ReorderTestCase.java b/tests/src/com/android/launcher3/celllayout/ReorderTestCase.java
index ed84a60..0c1403f 100644
--- a/tests/src/com/android/launcher3/celllayout/ReorderTestCase.java
+++ b/tests/src/com/android/launcher3/celllayout/ReorderTestCase.java
@@ -17,6 +17,8 @@
import android.graphics.Point;
+import com.android.launcher3.celllayout.board.CellLayoutBoard;
+
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
diff --git a/tests/src/com/android/launcher3/celllayout/ReorderWidgets.java b/tests/src/com/android/launcher3/celllayout/ReorderWidgets.java
index 3d388d60..30bde0a 100644
--- a/tests/src/com/android/launcher3/celllayout/ReorderWidgets.java
+++ b/tests/src/com/android/launcher3/celllayout/ReorderWidgets.java
@@ -32,10 +32,12 @@
import com.android.launcher3.InvariantDeviceProfile;
import com.android.launcher3.LauncherAppState;
import com.android.launcher3.MultipageCellLayout;
+import com.android.launcher3.celllayout.board.CellLayoutBoard;
+import com.android.launcher3.celllayout.board.TestWorkspaceBuilder;
+import com.android.launcher3.celllayout.board.WidgetRect;
import com.android.launcher3.tapl.Widget;
import com.android.launcher3.tapl.WidgetResizeFrame;
import com.android.launcher3.ui.AbstractLauncherUiTest;
-import com.android.launcher3.ui.TaplTestsLauncher3;
import com.android.launcher3.util.ModelTestExtensions;
import com.android.launcher3.util.rule.ShellCommandRule;
@@ -70,7 +72,7 @@
@Before
public void setup() throws Throwable {
mWorkspaceBuilder = new TestWorkspaceBuilder(mTargetContext);
- TaplTestsLauncher3.initialize(this);
+ AbstractLauncherUiTest.initialize(this);
}
@After
@@ -118,12 +120,12 @@
return getFromLauncher(CellLayoutTestUtils::workspaceToBoards);
}
- private CellLayoutBoard.WidgetRect getWidgetClosestTo(Point point) {
+ private WidgetRect getWidgetClosestTo(Point point) {
ArrayList<CellLayoutBoard> workspaceBoards = workspaceToBoards();
int maxDistance = 9999;
- CellLayoutBoard.WidgetRect bestRect = null;
+ WidgetRect bestRect = null;
for (int i = 0; i < workspaceBoards.get(0).getWidgets().size(); i++) {
- CellLayoutBoard.WidgetRect widget = workspaceBoards.get(0).getWidgets().get(i);
+ WidgetRect widget = workspaceBoards.get(0).getWidgets().get(i);
if (widget.getCellX() == 0 && widget.getCellY() == 0) {
continue;
}
@@ -146,7 +148,7 @@
* underlying code does different things in that case
*/
private void triggerWidgetResize(ReorderTestCase testCase) {
- CellLayoutBoard.WidgetRect widgetRect = getWidgetClosestTo(testCase.moveMainTo);
+ WidgetRect widgetRect = getWidgetClosestTo(testCase.moveMainTo);
if (widgetRect == null) {
// Some test doesn't have a widget in the final position, in those cases we will ignore
// them
@@ -160,7 +162,7 @@
}
private void runTestCase(ReorderTestCase testCase) {
- CellLayoutBoard.WidgetRect mainWidgetCellPos = CellLayoutBoard.getMainFromList(
+ WidgetRect mainWidgetCellPos = CellLayoutBoard.getMainFromList(
testCase.mStart);
FavoriteItemsTransaction transaction =
diff --git a/tests/src/com/android/launcher3/celllayout/TestBoardWidget.java b/tests/src/com/android/launcher3/celllayout/TestBoardWidget.java
deleted file mode 100644
index 7f9aa95..0000000
--- a/tests/src/com/android/launcher3/celllayout/TestBoardWidget.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.launcher3.celllayout;
-
-import android.graphics.Rect;
-
-public class TestBoardWidget {
- public char mType;
- public Rect mBounds;
-
- TestBoardWidget(char type, Rect bounds) {
- this.mType = type;
- this.mBounds = bounds;
- }
-
- int getSpanX() {
- return mBounds.right - mBounds.left + 1;
- }
-
- int getSpanY() {
- return mBounds.top - mBounds.bottom + 1;
- }
-
- int getCellX() {
- return mBounds.left;
- }
-
- int getCellY() {
- return mBounds.bottom;
- }
-
- boolean shouldIgnore() {
- return this.mType == 'x';
- }
-}
diff --git a/tests/src/com/android/launcher3/celllayout/CellLayoutBoard.java b/tests/src/com/android/launcher3/celllayout/board/CellLayoutBoard.java
similarity index 69%
rename from tests/src/com/android/launcher3/celllayout/CellLayoutBoard.java
rename to tests/src/com/android/launcher3/celllayout/board/CellLayoutBoard.java
index ff667e6..dbbdcf5 100644
--- a/tests/src/com/android/launcher3/celllayout/CellLayoutBoard.java
+++ b/tests/src/com/android/launcher3/celllayout/board/CellLayoutBoard.java
@@ -13,13 +13,16 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.android.launcher3.celllayout;
+package com.android.launcher3.celllayout.board;
import android.graphics.Point;
import android.graphics.Rect;
+import androidx.annotation.NonNull;
+
import java.util.ArrayDeque;
import java.util.ArrayList;
+import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@@ -31,172 +34,13 @@
public class CellLayoutBoard implements Comparable<CellLayoutBoard> {
- private boolean intersects(Rect r1, Rect r2) {
- // If one rectangle is on left side of other
- if (r1.left > r2.right || r2.left > r1.right) {
- return false;
- }
-
- // If one rectangle is above other
- if (r1.bottom > r2.top || r2.bottom > r1.top) {
- return false;
- }
-
- return true;
- }
-
- private boolean overlapsWithIgnored(Set<Rect> ignoredRectangles, Rect rect) {
- for (Rect ignoredRect : ignoredRectangles) {
- // Using the built in intersects doesn't work because it doesn't account for area 0
- if (intersects(ignoredRect, rect)) {
- return true;
- }
- }
- return false;
- }
+ public static final Comparator<CellLayoutBoard> COMPARATOR = new IdenticalBoardComparator();
@Override
- public int compareTo(CellLayoutBoard cellLayoutBoard) {
- // to be equal they need to have the same number of widgets and the same dimensions
- // their order can be different
- Set<Rect> widgetsSet = new HashSet<>();
- Set<Rect> ignoredRectangles = new HashSet<>();
- for (WidgetRect rect : mWidgetsRects) {
- if (rect.shouldIgnore()) {
- ignoredRectangles.add(rect.mBounds);
- } else {
- widgetsSet.add(rect.mBounds);
- }
- }
- for (WidgetRect rect : cellLayoutBoard.mWidgetsRects) {
- // ignore rectangles overlapping with the area marked by x
- if (overlapsWithIgnored(ignoredRectangles, rect.mBounds)) {
- continue;
- }
- if (!widgetsSet.contains(rect.mBounds)) {
- return -1;
- }
- widgetsSet.remove(rect.mBounds);
- }
- if (!widgetsSet.isEmpty()) {
- return 1;
- }
-
- // to be equal they need to have the same number of icons their order can be different
- Set<Point> iconsSet = new HashSet<>();
- mIconPoints.forEach(icon -> iconsSet.add(icon.getCoord()));
- for (IconPoint icon : cellLayoutBoard.mIconPoints) {
- if (!iconsSet.contains(icon.getCoord())) {
- return -1;
- }
- iconsSet.remove(icon.getCoord());
- }
- if (!iconsSet.isEmpty()) {
- return 1;
- }
- return 0;
+ public int compareTo(@NonNull CellLayoutBoard cellLayoutBoard) {
+ return COMPARATOR.compare(this, cellLayoutBoard);
}
- public static class CellType {
- // The cells marked by this will be filled by 1x1 widgets and will be ignored when
- // validating
- public static final char IGNORE = 'x';
- // The cells marked by this will be filled by app icons
- public static final char ICON = 'i';
- // The cells marked by FOLDER will be filled by folders with 27 app icons inside
- public static final char FOLDER = 'Z';
- // Empty space
- public static final char EMPTY = '-';
- // Widget that will be saved as "main widget" for easier retrieval
- public static final char MAIN_WIDGET = 'm';
- // Everything else will be consider a widget
- }
-
- public static class WidgetRect {
- public char mType;
- public Rect mBounds;
-
- WidgetRect(char type, Rect bounds) {
- this.mType = type;
- this.mBounds = bounds;
- }
-
- int getSpanX() {
- return mBounds.right - mBounds.left + 1;
- }
-
- int getSpanY() {
- return mBounds.top - mBounds.bottom + 1;
- }
-
- int getCellX() {
- return mBounds.left;
- }
-
- int getCellY() {
- return mBounds.bottom;
- }
-
- boolean shouldIgnore() {
- return this.mType == CellType.IGNORE;
- }
-
- boolean contains(int x, int y) {
- return mBounds.contains(x, y);
- }
-
- @Override
- public String toString() {
- return "WidgetRect type = " + mType + " x = " + getCellX() + " | y " + getCellY()
- + " xs = " + getSpanX() + " ys = " + getSpanY();
- }
- }
-
- public static class IconPoint {
- public Point coord;
- public char mType;
-
- public IconPoint(Point coord, char type) {
- this.coord = coord;
- mType = type;
- }
-
- public char getType() {
- return mType;
- }
-
- public void setType(char type) {
- mType = type;
- }
-
- public Point getCoord() {
- return coord;
- }
-
- public void setCoord(Point coord) {
- this.coord = coord;
- }
- }
-
- public static class FolderPoint {
- public Point coord;
- public char mType;
-
- public FolderPoint(Point coord, char type) {
- this.coord = coord;
- mType = type;
- }
-
- /**
- * [A-Z]: Represents a folder and number of icons in the folder is represented by
- * the order of letter in the alphabet, A=2, B=3, C=4 ... etc.
- */
- public int getNumberIconsInside() {
- return (mType - 'A') + 2;
- }
- }
-
-
private HashSet<Character> mUsedWidgetTypes = new HashSet<>();
static final int INFINITE = 99999;
@@ -213,7 +57,7 @@
int mWidth, mHeight;
- CellLayoutBoard() {
+ public CellLayoutBoard() {
for (int x = 0; x < mWidget.length; x++) {
for (int y = 0; y < mWidget[0].length; y++) {
mWidget[x][y] = CellType.EMPTY;
@@ -221,8 +65,8 @@
}
}
- CellLayoutBoard(int width, int height) {
- mWidget = new char[width][height];
+ public CellLayoutBoard(int width, int height) {
+ mWidget = new char[width + 1][height + 1];
this.mWidth = width;
this.mHeight = height;
for (int x = 0; x < mWidget.length; x++) {
@@ -238,6 +82,15 @@
return isXInRect && isYInRect;
}
+ public WidgetRect getWidgetAt(Point p) {
+ return getWidgetAt(p.x, p.y);
+ }
+
+ public WidgetRect getWidgetOfType(char type) {
+ return mWidgetsRects.stream()
+ .filter(widgetRect -> widgetRect.mType == type).findFirst().orElse(null);
+ }
+
public WidgetRect getWidgetAt(int x, int y) {
return mWidgetsRects.stream()
.filter(widgetRect -> pointInsideRect(x, y, widgetRect)).findFirst().orElse(null);
@@ -264,8 +117,8 @@
}
private void removeWidgetFromBoard(WidgetRect widget) {
- for (int xi = widget.mBounds.left; xi < widget.mBounds.right; xi++) {
- for (int yi = widget.mBounds.top; yi < widget.mBounds.bottom; yi++) {
+ for (int xi = widget.mBounds.left; xi <= widget.mBounds.right; xi++) {
+ for (int yi = widget.mBounds.bottom; yi <= widget.mBounds.top; yi++) {
mWidget[xi][yi] = '-';
}
}
@@ -306,7 +159,7 @@
private void removeOverlappingItems(Point p) {
// Remove overlapping widgets and remove them from the board
mWidgetsRects = mWidgetsRects.stream().filter(widget -> {
- if (widget.mBounds.contains(p.x, p.y)) {
+ if (IdenticalBoardComparator.Companion.touchesPoint(widget.mBounds, p)) {
removeWidgetFromBoard(widget);
return false;
}
@@ -336,8 +189,9 @@
}
private char getNextWidgetType() {
- for (char type = 'a'; type <= 'z'; type++) {
- if (type == 'i') continue;
+ for (char type = 'a'; type < 'z'; type++) {
+ if (type == CellType.ICON) continue;
+ if (type == CellType.IGNORE) continue;
if (mUsedWidgetTypes.contains(type)) continue;
mUsedWidgetTypes.add(type);
return type;
@@ -357,6 +211,17 @@
}
}
+ public void removeItem(char type) {
+ mWidgetsRects.stream()
+ .filter(widgetRect -> widgetRect.mType == type)
+ .forEach(widgetRect -> removeOverlappingItems(
+ new Point(widgetRect.getCellX(), widgetRect.getCellY())));
+ }
+
+ public void removeItem(Point p) {
+ removeOverlappingItems(p);
+ }
+
public void addWidget(int x, int y, int spanX, int spanY) {
addWidget(x, y, spanX, spanY, getNextWidgetType());
}
@@ -506,8 +371,8 @@
s.append("\n");
maxX = Math.min(maxX, mWidget.length);
maxY = Math.min(maxY, mWidget[0].length);
- for (int y = 0; y < maxY; y++) {
- for (int x = 0; x < maxX; x++) {
+ for (int y = 0; y <= maxY; y++) {
+ for (int x = 0; x <= maxX; x++) {
s.append(mWidget[x][y]);
}
s.append('\n');
diff --git a/tests/src/com/android/launcher3/celllayout/board/CellType.java b/tests/src/com/android/launcher3/celllayout/board/CellType.java
new file mode 100644
index 0000000..49c146b
--- /dev/null
+++ b/tests/src/com/android/launcher3/celllayout/board/CellType.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.launcher3.celllayout.board;
+
+public class CellType {
+ // The cells marked by this will be filled by 1x1 widgets and will be ignored when
+ // validating
+ public static final char IGNORE = 'x';
+ // The cells marked by this will be filled by app icons
+ public static final char ICON = 'i';
+ // The cells marked by FOLDER will be filled by folders with 27 app icons inside
+ public static final char FOLDER = 'Z';
+ // Empty space
+ public static final char EMPTY = '-';
+ // Widget that will be saved as "main widget" for easier retrieval
+ public static final char MAIN_WIDGET = 'm';
+ // Everything else will be consider a widget
+}
diff --git a/tests/src/com/android/launcher3/celllayout/TestBoardAppIcon.java b/tests/src/com/android/launcher3/celllayout/board/FolderPoint.java
similarity index 62%
copy from tests/src/com/android/launcher3/celllayout/TestBoardAppIcon.java
copy to tests/src/com/android/launcher3/celllayout/board/FolderPoint.java
index 04604d7..39ba434 100644
--- a/tests/src/com/android/launcher3/celllayout/TestBoardAppIcon.java
+++ b/tests/src/com/android/launcher3/celllayout/board/FolderPoint.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2022 The Android Open Source Project
+ * Copyright (C) 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -13,32 +13,25 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.android.launcher3.celllayout;
+
+package com.android.launcher3.celllayout.board;
import android.graphics.Point;
-public class TestBoardAppIcon {
+public class FolderPoint {
public Point coord;
public char mType;
- public TestBoardAppIcon(Point coord, char type) {
+ public FolderPoint(Point coord, char type) {
this.coord = coord;
mType = type;
}
- public char getType() {
- return mType;
- }
-
- public void setType(char type) {
- mType = type;
- }
-
- public Point getCoord() {
- return coord;
- }
-
- public void setCoord(Point coord) {
- this.coord = coord;
+ /**
+ * [A-Z]: Represents a folder and number of icons in the folder is represented by
+ * the order of letter in the alphabet, A=2, B=3, C=4 ... etc.
+ */
+ public int getNumberIconsInside() {
+ return (mType - 'A') + 2;
}
}
diff --git a/tests/src/com/android/launcher3/celllayout/TestBoardAppIcon.java b/tests/src/com/android/launcher3/celllayout/board/IconPoint.java
similarity index 83%
rename from tests/src/com/android/launcher3/celllayout/TestBoardAppIcon.java
rename to tests/src/com/android/launcher3/celllayout/board/IconPoint.java
index 04604d7..d3d2970 100644
--- a/tests/src/com/android/launcher3/celllayout/TestBoardAppIcon.java
+++ b/tests/src/com/android/launcher3/celllayout/board/IconPoint.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2022 The Android Open Source Project
+ * Copyright (C) 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -13,15 +13,16 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.android.launcher3.celllayout;
+
+package com.android.launcher3.celllayout.board;
import android.graphics.Point;
-public class TestBoardAppIcon {
+public class IconPoint {
public Point coord;
public char mType;
- public TestBoardAppIcon(Point coord, char type) {
+ public IconPoint(Point coord, char type) {
this.coord = coord;
mType = type;
}
diff --git a/tests/src/com/android/launcher3/celllayout/board/IdenticalBoardComparator.kt b/tests/src/com/android/launcher3/celllayout/board/IdenticalBoardComparator.kt
new file mode 100644
index 0000000..a4a420c
--- /dev/null
+++ b/tests/src/com/android/launcher3/celllayout/board/IdenticalBoardComparator.kt
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.launcher3.celllayout.board
+
+import android.graphics.Point
+import android.graphics.Rect
+
+/**
+ * Compares two [CellLayoutBoard] and returns 0 if they are identical, meaning they have the same
+ * widget and icons in the same place, they can be different letters tough.
+ */
+class IdenticalBoardComparator : Comparator<CellLayoutBoard> {
+
+ /** Converts a list of WidgetRect into a map of the count of different widget.bounds */
+ private fun widgetsToBoundsMap(widgets: List<WidgetRect>) =
+ widgets.groupingBy { it.mBounds }.eachCount()
+
+ /** Converts a list of IconPoint into a map of the count of different icon.coord */
+ private fun iconsToPosCountMap(widgets: List<IconPoint>) =
+ widgets.groupingBy { it.getCoord() }.eachCount()
+
+ override fun compare(
+ cellLayoutBoard: CellLayoutBoard,
+ otherCellLayoutBoard: CellLayoutBoard
+ ): Int {
+ // to be equal they need to have the same number of widgets and the same dimensions
+ // their order can be different
+ val widgetsMap: Map<Rect, Int> =
+ widgetsToBoundsMap(cellLayoutBoard.widgets.filter { !it.shouldIgnore() })
+ val ignoredRectangles: Map<Rect, Int> =
+ widgetsToBoundsMap(cellLayoutBoard.widgets.filter { it.shouldIgnore() })
+
+ val otherWidgetMap: Map<Rect, Int> =
+ widgetsToBoundsMap(
+ otherCellLayoutBoard.widgets
+ .filter { !it.shouldIgnore() }
+ .filter { !overlapsWithIgnored(ignoredRectangles, it.mBounds) }
+ )
+
+ if (widgetsMap != otherWidgetMap) {
+ return -1
+ }
+
+ // to be equal they need to have the same number of icons their order can be different
+ return if (
+ iconsToPosCountMap(cellLayoutBoard.icons) ==
+ iconsToPosCountMap(otherCellLayoutBoard.icons)
+ ) {
+ 0
+ } else {
+ 1
+ }
+ }
+
+ private fun overlapsWithIgnored(ignoredRectangles: Map<Rect, Int>, rect: Rect): Boolean {
+ for (ignoredRect in ignoredRectangles.keys) {
+ // Using the built in intersects doesn't work because it doesn't account for area 0
+ if (touches(ignoredRect, rect)) {
+ return true
+ }
+ }
+ return false
+ }
+
+ companion object {
+ /**
+ * Similar function to {@link Rect#intersects} but this one returns true if the rectangles
+ * are intersecting or touching whereas {@link Rect#intersects} doesn't return true when
+ * they are touching.
+ */
+ fun touches(r1: Rect, r2: Rect): Boolean {
+ // If one rectangle is on left side of other
+ return if (r1.left > r2.right || r2.left > r1.right) {
+ false
+ } else r1.bottom <= r2.top && r2.bottom <= r1.top
+
+ // If one rectangle is above other
+ }
+
+ /**
+ * Similar function to {@link Rect#contains} but this one returns true if {link @Point} is
+ * intersecting or touching the {@link Rect}. Similar to {@link touches}.
+ */
+ fun touchesPoint(r1: Rect, p: Point): Boolean {
+ return r1.left <= p.x && p.x <= r1.right && r1.bottom <= p.y && p.y <= r1.top
+ }
+ }
+}
diff --git a/tests/src/com/android/launcher3/celllayout/board/PermutedBoardComparator.kt b/tests/src/com/android/launcher3/celllayout/board/PermutedBoardComparator.kt
new file mode 100644
index 0000000..c3d13a5
--- /dev/null
+++ b/tests/src/com/android/launcher3/celllayout/board/PermutedBoardComparator.kt
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.launcher3.celllayout.board
+
+import android.graphics.Point
+
+/**
+ * Compares two [CellLayoutBoard] and returns 0 if they contain the same widgets and icons even if
+ * they are in different positions i.e. in a different permutation.
+ */
+class PermutedBoardComparator : Comparator<CellLayoutBoard> {
+
+ /**
+ * The key for the set is the span since the widgets could change location but shouldn't change
+ * size
+ */
+ private fun boardToSpanCountMap(widgets: List<WidgetRect>) =
+ widgets.groupingBy { Point(it.spanX, it.spanY) }.eachCount()
+ override fun compare(
+ cellLayoutBoard: CellLayoutBoard,
+ otherCellLayoutBoard: CellLayoutBoard
+ ): Int {
+ return if (
+ boardToSpanCountMap(cellLayoutBoard.widgets) !=
+ boardToSpanCountMap(otherCellLayoutBoard.widgets)
+ ) {
+ 1
+ } else cellLayoutBoard.icons.size.compareTo(otherCellLayoutBoard.icons.size)
+ }
+}
diff --git a/tests/src/com/android/launcher3/celllayout/TestWorkspaceBuilder.java b/tests/src/com/android/launcher3/celllayout/board/TestWorkspaceBuilder.java
similarity index 89%
rename from tests/src/com/android/launcher3/celllayout/TestWorkspaceBuilder.java
rename to tests/src/com/android/launcher3/celllayout/board/TestWorkspaceBuilder.java
index 6489bc1..06a7db2 100644
--- a/tests/src/com/android/launcher3/celllayout/TestWorkspaceBuilder.java
+++ b/tests/src/com/android/launcher3/celllayout/board/TestWorkspaceBuilder.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2022 The Android Open Source Project
+ * Copyright (C) 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.android.launcher3.celllayout;
+package com.android.launcher3.celllayout.board;
import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
@@ -31,6 +31,12 @@
import com.android.launcher3.InvariantDeviceProfile;
import com.android.launcher3.LauncherSettings;
+import com.android.launcher3.celllayout.FavoriteItemsTransaction;
+import com.android.launcher3.celllayout.board.CellLayoutBoard;
+import com.android.launcher3.celllayout.board.CellType;
+import com.android.launcher3.celllayout.board.FolderPoint;
+import com.android.launcher3.celllayout.board.IconPoint;
+import com.android.launcher3.celllayout.board.WidgetRect;
import com.android.launcher3.model.data.AppInfo;
import com.android.launcher3.model.data.FolderInfo;
import com.android.launcher3.model.data.ItemInfo;
@@ -61,7 +67,7 @@
/**
* Fills the given rect in WidgetRect with 1x1 widgets. This is useful to equalize cases.
*/
- private FavoriteItemsTransaction fillWithWidgets(CellLayoutBoard.WidgetRect widgetRect,
+ private FavoriteItemsTransaction fillWithWidgets(WidgetRect widgetRect,
FavoriteItemsTransaction transaction, int screenId) {
int initX = widgetRect.getCellX();
int initY = widgetRect.getCellY();
@@ -70,7 +76,7 @@
try {
// this widgets are filling, we don't care if we can't place them
transaction.addItem(createWidgetInCell(
- new CellLayoutBoard.WidgetRect(CellLayoutBoard.CellType.IGNORE,
+ new WidgetRect(CellType.IGNORE,
new Rect(x, y, x, y)), screenId));
} catch (Exception e) {
Log.d(TAG, "Unable to place filling widget at " + x + "," + y);
@@ -97,7 +103,7 @@
);
}
- private void addCorrespondingWidgetRect(CellLayoutBoard.WidgetRect widgetRect,
+ private void addCorrespondingWidgetRect(WidgetRect widgetRect,
FavoriteItemsTransaction transaction, int screenId) {
if (widgetRect.mType == 'x') {
fillWithWidgets(widgetRect, transaction, screenId);
@@ -133,7 +139,7 @@
}
private Supplier<ItemInfo> createWidgetInCell(
- CellLayoutBoard.WidgetRect widgetRect, int screenId) {
+ WidgetRect widgetRect, int screenId) {
// Create the widget lazily since the appWidgetId can get lost during setup
return () -> {
LauncherAppWidgetProviderInfo info = findWidgetProvider(false);
@@ -147,7 +153,7 @@
};
}
- public FolderInfo createFolderInCell(CellLayoutBoard.FolderPoint folderPoint, int screenId) {
+ public FolderInfo createFolderInCell(FolderPoint folderPoint, int screenId) {
FolderInfo folderInfo = new FolderInfo();
folderInfo.screenId = screenId;
folderInfo.container = LauncherSettings.Favorites.CONTAINER_DESKTOP;
@@ -171,7 +177,7 @@
return item;
}
- private ItemInfo createIconInCell(CellLayoutBoard.IconPoint iconPoint, int screenId) {
+ private ItemInfo createIconInCell(IconPoint iconPoint, int screenId) {
WorkspaceItemInfo item = new WorkspaceItemInfo(getApp());
item.screenId = screenId;
item.cellX = iconPoint.getCoord().x;
diff --git a/tests/src/com/android/launcher3/celllayout/board/WidgetRect.java b/tests/src/com/android/launcher3/celllayout/board/WidgetRect.java
new file mode 100644
index 0000000..c90ce85
--- /dev/null
+++ b/tests/src/com/android/launcher3/celllayout/board/WidgetRect.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.launcher3.celllayout.board;
+
+import android.graphics.Rect;
+
+public class WidgetRect {
+ public char mType;
+ public Rect mBounds;
+
+ public WidgetRect(char type, Rect bounds) {
+ this.mType = type;
+ this.mBounds = bounds;
+ }
+
+ public int getSpanX() {
+ return mBounds.right - mBounds.left + 1;
+ }
+
+ public int getSpanY() {
+ return mBounds.top - mBounds.bottom + 1;
+ }
+
+ public int getCellX() {
+ return mBounds.left;
+ }
+
+ public int getCellY() {
+ return mBounds.bottom;
+ }
+
+ boolean shouldIgnore() {
+ return this.mType == CellType.IGNORE;
+ }
+
+ boolean contains(int x, int y) {
+ return mBounds.contains(x, y);
+ }
+
+ @Override
+ public String toString() {
+ return "WidgetRect type = " + mType + " x = " + getCellX() + " | y " + getCellY()
+ + " xs = " + getSpanX() + " ys = " + getSpanY();
+ }
+}
diff --git a/tests/src/com/android/launcher3/celllayout/testgenerator/DeterministicRandomGenerator.kt b/tests/src/com/android/launcher3/celllayout/testgenerator/DeterministicRandomGenerator.kt
new file mode 100644
index 0000000..e582973
--- /dev/null
+++ b/tests/src/com/android/launcher3/celllayout/testgenerator/DeterministicRandomGenerator.kt
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.launcher3.celllayout.testgenerator
+
+import java.util.Random
+
+abstract class DeterministicRandomGenerator(private val generator: Random) {
+ fun getRandom(start: Int, end: Int): Int = start + (if (end == 0) 0 else generator.nextInt(end))
+}
diff --git a/tests/src/com/android/launcher3/celllayout/testgenerator/RandomBoardGenerator.kt b/tests/src/com/android/launcher3/celllayout/testgenerator/RandomBoardGenerator.kt
new file mode 100644
index 0000000..770024f
--- /dev/null
+++ b/tests/src/com/android/launcher3/celllayout/testgenerator/RandomBoardGenerator.kt
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.launcher3.celllayout.testgenerator
+
+import android.graphics.Rect
+import com.android.launcher3.celllayout.board.CellLayoutBoard
+import java.util.Random
+
+/** Generates a random CellLayoutBoard. */
+open class RandomBoardGenerator(generator: Random) : DeterministicRandomGenerator(generator) {
+ /**
+ * @param remainingEmptySpaces the maximum number of spaces we will fill with icons and widgets
+ * meaning that if the number is 100 we will try to fill the board with at most 100 spaces
+ * usually less than 100.
+ * @return a randomly generated board filled with icons and widgets.
+ */
+ open fun generateBoard(width: Int, height: Int, remainingEmptySpaces: Int): CellLayoutBoard? {
+ val cellLayoutBoard = CellLayoutBoard(width, height)
+ return fillBoard(cellLayoutBoard, Rect(0, 0, width, height), remainingEmptySpaces)
+ }
+
+ protected fun fillBoard(
+ board: CellLayoutBoard,
+ area: Rect,
+ remainingEmptySpacesArg: Int
+ ): CellLayoutBoard {
+ var remainingEmptySpaces = remainingEmptySpacesArg
+ if (area.height() * area.width() <= 0) return board
+ val width = getRandom(1, area.width() - 1)
+ val height = getRandom(1, area.height() - 1)
+ val x = area.left + getRandom(0, area.width() - width)
+ val y = area.top + getRandom(0, area.height() - height)
+ if (remainingEmptySpaces > 0) {
+ remainingEmptySpaces -= width * height
+ } else if (board.widgets.size <= 22 && width * height > 1) {
+ board.addWidget(x, y, width, height)
+ } else {
+ board.addIcon(x, y)
+ }
+ fillBoard(board, Rect(area.left, area.top, area.right, y), remainingEmptySpaces)
+ fillBoard(board, Rect(area.left, y, x, area.bottom), remainingEmptySpaces)
+ fillBoard(board, Rect(x, y + height, area.right, area.bottom), remainingEmptySpaces)
+ fillBoard(board, Rect(x + width, y, area.right, y + height), remainingEmptySpaces)
+ return board
+ }
+}
diff --git a/tests/src/com/android/launcher3/celllayout/testgenerator/RandomMultiBoardGenerator.kt b/tests/src/com/android/launcher3/celllayout/testgenerator/RandomMultiBoardGenerator.kt
new file mode 100644
index 0000000..da4de7d
--- /dev/null
+++ b/tests/src/com/android/launcher3/celllayout/testgenerator/RandomMultiBoardGenerator.kt
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.launcher3.celllayout.testgenerator
+
+import android.graphics.Rect
+import com.android.launcher3.celllayout.board.CellLayoutBoard
+import java.util.Random
+
+class RandomMultiBoardGenerator(generator: Random) : RandomBoardGenerator(generator) {
+ override fun generateBoard(
+ width: Int,
+ height: Int,
+ remainingEmptySpaces: Int
+ ): CellLayoutBoard {
+ val cellLayoutBoard = CellLayoutBoard(width, height)
+ fillBoard(cellLayoutBoard, Rect(0, 0, width / 2, height), remainingEmptySpaces / 2)
+ return fillBoard(
+ cellLayoutBoard,
+ Rect(width / 2, 0, width, height),
+ remainingEmptySpaces / 2
+ )
+ }
+}
diff --git a/tests/src/com/android/launcher3/dragging/TaplDragTest.java b/tests/src/com/android/launcher3/dragging/TaplDragTest.java
index 7ec7826..e040367 100644
--- a/tests/src/com/android/launcher3/dragging/TaplDragTest.java
+++ b/tests/src/com/android/launcher3/dragging/TaplDragTest.java
@@ -19,7 +19,7 @@
import static com.android.launcher3.util.TestConstants.AppNames.GMAIL_APP_NAME;
import static com.android.launcher3.util.TestConstants.AppNames.MAPS_APP_NAME;
import static com.android.launcher3.util.TestConstants.AppNames.STORE_APP_NAME;
-import static com.android.launcher3.ui.TaplTestsLauncher3.initialize;
+import static com.android.launcher3.ui.AbstractLauncherUiTest.initialize;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
diff --git a/tests/src/com/android/launcher3/dragging/TaplUninstallRemove.java b/tests/src/com/android/launcher3/dragging/TaplUninstallRemove.java
index a690543..ed34307 100644
--- a/tests/src/com/android/launcher3/dragging/TaplUninstallRemove.java
+++ b/tests/src/com/android/launcher3/dragging/TaplUninstallRemove.java
@@ -16,12 +16,14 @@
package com.android.launcher3.dragging;
import static com.android.launcher3.testing.shared.TestProtocol.ICON_MISSING;
-import static com.android.launcher3.ui.TaplTestsLauncher3.initialize;
+import static com.android.launcher3.ui.AbstractLauncherUiTest.initialize;
import static com.android.launcher3.util.TestConstants.AppNames.DUMMY_APP_NAME;
import static com.android.launcher3.util.TestConstants.AppNames.GMAIL_APP_NAME;
import static com.android.launcher3.util.TestConstants.AppNames.MAPS_APP_NAME;
import static com.android.launcher3.util.TestConstants.AppNames.STORE_APP_NAME;
import static com.android.launcher3.util.TestConstants.AppNames.TEST_APP_NAME;
+import static com.android.launcher3.util.rule.TestStabilityRule.LOCAL;
+import static com.android.launcher3.util.rule.TestStabilityRule.PLATFORM_POSTSUBMIT;
import static com.google.common.truth.Truth.assertThat;
@@ -36,12 +38,13 @@
import com.android.launcher3.ui.PortraitLandscapeRunner.PortraitLandscape;
import com.android.launcher3.util.TestUtil;
import com.android.launcher3.util.Wait;
-import com.android.launcher3.util.rule.ScreenRecordRule;
+import com.android.launcher3.util.rule.TestStabilityRule;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
+import java.util.Arrays;
import java.util.Map;
/**
@@ -96,12 +99,11 @@
/**
* Makes sure you can uninstall an app from the Workspace.
- * @throws Exception
*/
@Test
@PortraitLandscape
@PlatinumTest(focusArea = "launcher")
- @ScreenRecordRule.ScreenRecord
+ @TestStabilityRule.Stability(flavors = LOCAL | PLATFORM_POSTSUBMIT) // b/311099513
public void testUninstallFromWorkspace() throws Exception {
installDummyAppAndWaitForUIUpdate();
try {
@@ -114,7 +116,6 @@
/**
* Makes sure you can uninstall an app from AllApps.
- * @throws Exception
*/
@Test
@PortraitLandscape
@@ -143,15 +144,23 @@
sb.append(p).append(", ");
}
Log.d(ICON_MISSING, "allGridPositions: " + sb);
- createShortcutIfNotExist(STORE_APP_NAME, gridPositions[0]);
- createShortcutIfNotExist(MAPS_APP_NAME, gridPositions[1]);
- installDummyAppAndWaitForUIUpdate();
try {
- createShortcutIfNotExist(DUMMY_APP_NAME, gridPositions[2]);
+ installDummyAppAndWaitForUIUpdate();
+
+ final String[] appNameCandidates = {DUMMY_APP_NAME, MAPS_APP_NAME, STORE_APP_NAME};
+
+ // List of test apps trimmed down to the length of grid positions.
+ final String[] appNames = Arrays.copyOfRange(
+ appNameCandidates,
+ 0, Math.min(gridPositions.length, appNameCandidates.length));
+
+ for (int i = 0; i < appNames.length; ++i) {
+ createShortcutIfNotExist(appNames[i], gridPositions[i]);
+ }
+
Map<String, Point> initialPositions =
mLauncher.getWorkspace().getWorkspaceIconsPositions();
- assertThat(initialPositions.keySet())
- .containsAtLeast(DUMMY_APP_NAME, MAPS_APP_NAME, STORE_APP_NAME);
+ assertThat(initialPositions.keySet()).containsAtLeastElementsIn(appNames);
mLauncher.getWorkspace().getWorkspaceAppIcon(DUMMY_APP_NAME).uninstall();
mLauncher.getWorkspace().verifyWorkspaceAppIconIsGone(
diff --git a/tests/src/com/android/launcher3/responsive/HotseatSpecsProviderTest.kt b/tests/src/com/android/launcher3/responsive/HotseatSpecsProviderTest.kt
index 32249e0..78cb1ac 100644
--- a/tests/src/com/android/launcher3/responsive/HotseatSpecsProviderTest.kt
+++ b/tests/src/com/android/launcher3/responsive/HotseatSpecsProviderTest.kt
@@ -110,4 +110,11 @@
TestResourceHelper(context, TestR.xml.invalid_hotseat_file_case_1)
)
}
+
+ @Test(expected = IllegalStateException::class)
+ fun parseInvalidFile_invalidFixedSize_throwsError() {
+ HotseatSpecsProvider.create(
+ TestResourceHelper(context, TestR.xml.invalid_hotseat_file_case_2)
+ )
+ }
}
diff --git a/tests/src/com/android/launcher3/responsive/ResponsiveCellSpecsProviderTest.kt b/tests/src/com/android/launcher3/responsive/ResponsiveCellSpecsProviderTest.kt
new file mode 100644
index 0000000..50cd358
--- /dev/null
+++ b/tests/src/com/android/launcher3/responsive/ResponsiveCellSpecsProviderTest.kt
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.launcher3.responsive
+
+import android.content.Context
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import androidx.test.platform.app.InstrumentationRegistry
+import com.android.launcher3.AbstractDeviceProfileTest
+import com.android.launcher3.responsive.ResponsiveSpec.Companion.ResponsiveSpecType
+import com.android.launcher3.tests.R as TestR
+import com.android.launcher3.util.TestResourceHelper
+import com.google.common.truth.Truth.assertThat
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class ResponsiveCellSpecsProviderTest : AbstractDeviceProfileTest() {
+ override val runningContext: Context = InstrumentationRegistry.getInstrumentation().context
+ val deviceSpec = deviceSpecs["phone"]!!
+ val aspectRatio = deviceSpec.naturalSize.first.toFloat() / deviceSpec.naturalSize.second
+
+ @Before
+ fun setup() {
+ initializeVarsForPhone(deviceSpec)
+ }
+
+ @Test
+ fun parseValidFile() {
+ val testResourceHelper = TestResourceHelper(context, TestR.xml.valid_cell_specs_file)
+ val provider = ResponsiveCellSpecsProvider.create(testResourceHelper)
+
+ // Validate Portrait
+ val aspectRatioPortrait = 1.0f
+ val expectedPortraitSpecs =
+ listOf(
+ CellSpec(
+ maxAvailableSize = 606.dpToPx(),
+ dimensionType = ResponsiveSpec.DimensionType.HEIGHT,
+ specType = ResponsiveSpecType.Cell,
+ iconSize = SizeSpec(48f.dpToPx()),
+ iconTextSize = SizeSpec(12f.dpToPx()),
+ iconDrawablePadding = SizeSpec(8f.dpToPx())
+ ),
+ CellSpec(
+ maxAvailableSize = 9999.dpToPx(),
+ dimensionType = ResponsiveSpec.DimensionType.HEIGHT,
+ specType = ResponsiveSpecType.Cell,
+ iconSize = SizeSpec(52f.dpToPx()),
+ iconTextSize = SizeSpec(12f.dpToPx()),
+ iconDrawablePadding = SizeSpec(11f.dpToPx())
+ )
+ )
+
+ val portraitSpecs = provider.getSpecsByAspectRatio(aspectRatioPortrait)
+
+ assertThat(portraitSpecs.aspectRatio).isAtLeast(aspectRatioPortrait)
+ assertThat(portraitSpecs.widthSpecs.size).isEqualTo(0)
+ assertThat(portraitSpecs.heightSpecs.size).isEqualTo(2)
+ assertThat(portraitSpecs.heightSpecs[0]).isEqualTo(expectedPortraitSpecs[0])
+ assertThat(portraitSpecs.heightSpecs[1]).isEqualTo(expectedPortraitSpecs[1])
+
+ // Validate Landscape
+ val aspectRatioLandscape = 1.051f
+ val expectedLandscapeSpec =
+ CellSpec(
+ maxAvailableSize = 9999.dpToPx(),
+ dimensionType = ResponsiveSpec.DimensionType.HEIGHT,
+ specType = ResponsiveSpecType.Cell,
+ iconSize = SizeSpec(52f.dpToPx()),
+ iconTextSize = SizeSpec(0f),
+ iconDrawablePadding = SizeSpec(0f)
+ )
+ val landscapeSpecs = provider.getSpecsByAspectRatio(aspectRatioLandscape)
+
+ assertThat(landscapeSpecs.aspectRatio).isAtLeast(aspectRatioLandscape)
+ assertThat(landscapeSpecs.widthSpecs.size).isEqualTo(0)
+ assertThat(landscapeSpecs.heightSpecs.size).isEqualTo(1)
+ assertThat(landscapeSpecs.heightSpecs[0]).isEqualTo(expectedLandscapeSpec)
+ }
+
+ @Test(expected = IllegalStateException::class)
+ fun parseInvalidFile_IsNotFixedSizeOrMatchWorkspace_throwsError() {
+ ResponsiveCellSpecsProvider.create(
+ TestResourceHelper(context, TestR.xml.invalid_cell_specs_1)
+ )
+ }
+
+ @Test(expected = IllegalStateException::class)
+ fun parseInvalidFile_dimensionTypeIsNotHeight_throwsError() {
+ ResponsiveCellSpecsProvider.create(
+ TestResourceHelper(context, TestR.xml.invalid_cell_specs_2)
+ )
+ }
+
+ @Test(expected = IllegalStateException::class)
+ fun parseInvalidFile_invalidFixedSize_throwsError() {
+ ResponsiveCellSpecsProvider.create(
+ TestResourceHelper(context, TestR.xml.invalid_cell_specs_3)
+ )
+ }
+}
diff --git a/tests/src/com/android/launcher3/responsive/ResponsiveSpecsProviderTest.kt b/tests/src/com/android/launcher3/responsive/ResponsiveSpecsProviderTest.kt
index 7af0823..9681ca8 100644
--- a/tests/src/com/android/launcher3/responsive/ResponsiveSpecsProviderTest.kt
+++ b/tests/src/com/android/launcher3/responsive/ResponsiveSpecsProviderTest.kt
@@ -134,6 +134,24 @@
ResponsiveSpecsProvider.create(resourceHelper, ResponsiveSpecType.Workspace)
}
+ @Test(expected = IllegalStateException::class)
+ fun parseInvalidFile_invalidRemainderSpace_throwsError() {
+ val resourceHelper = TestResourceHelper(context, R.xml.invalid_responsive_spec_4)
+ ResponsiveSpecsProvider.create(resourceHelper, ResponsiveSpecType.Workspace)
+ }
+
+ @Test(expected = IllegalStateException::class)
+ fun parseInvalidFile_invalidAvailableSpace_throwsError() {
+ val resourceHelper = TestResourceHelper(context, R.xml.invalid_responsive_spec_5)
+ ResponsiveSpecsProvider.create(resourceHelper, ResponsiveSpecType.Workspace)
+ }
+
+ @Test(expected = IllegalStateException::class)
+ fun parseInvalidFile_invalidFixedSize_throwsError() {
+ val resourceHelper = TestResourceHelper(context, R.xml.invalid_responsive_spec_6)
+ ResponsiveSpecsProvider.create(resourceHelper, ResponsiveSpecType.Workspace)
+ }
+
private fun validateSpecs(
specs: ResponsiveSpecGroup<ResponsiveSpec>,
expectedAspectRatio: Float,
diff --git a/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java b/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java
index cb1102e..5f536c7 100644
--- a/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java
+++ b/tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java
@@ -220,6 +220,23 @@
@Rule
public SetFlagsRule mSetFlagsRule = new SetFlagsRule(DEVICE_DEFAULT);
+ public static void initialize(AbstractLauncherUiTest test) throws Exception {
+ initialize(test, false);
+ }
+
+ public static void initialize(
+ AbstractLauncherUiTest test, boolean clearWorkspace) throws Exception {
+ test.reinitializeLauncherData(clearWorkspace);
+ test.mDevice.pressHome();
+ test.waitForLauncherCondition("Launcher didn't start", launcher -> launcher != null);
+ test.waitForState("Launcher internal state didn't switch to Home",
+ () -> LauncherState.NORMAL);
+ test.waitForResumed("Launcher internal state is still Background");
+ // Check that we switched to home.
+ test.mLauncher.getWorkspace();
+ AbstractLauncherUiTest.checkDetectedLeaks(test.mLauncher, true);
+ }
+
protected void clearPackageData(String pkg) throws IOException, InterruptedException {
final CountDownLatch count = new CountDownLatch(2);
final SimpleBroadcastReceiver broadcastReceiver =
diff --git a/tests/src/com/android/launcher3/ui/TaplTestsLauncher3.java b/tests/src/com/android/launcher3/ui/TaplTestsLauncher3.java
index f2cbd92..65d1f46 100644
--- a/tests/src/com/android/launcher3/ui/TaplTestsLauncher3.java
+++ b/tests/src/com/android/launcher3/ui/TaplTestsLauncher3.java
@@ -22,8 +22,6 @@
import androidx.test.filters.LargeTest;
import androidx.test.runner.AndroidJUnit4;
-import com.android.launcher3.LauncherState;
-
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -38,23 +36,6 @@
initialize(this);
}
- public static void initialize(AbstractLauncherUiTest test) throws Exception {
- initialize(test, false);
- }
-
- public static void initialize(
- AbstractLauncherUiTest test, boolean clearWorkspace) throws Exception {
- test.reinitializeLauncherData(clearWorkspace);
- test.mDevice.pressHome();
- test.waitForLauncherCondition("Launcher didn't start", launcher -> launcher != null);
- test.waitForState("Launcher internal state didn't switch to Home",
- () -> LauncherState.NORMAL);
- test.waitForResumed("Launcher internal state is still Background");
- // Check that we switched to home.
- test.mLauncher.getWorkspace();
- AbstractLauncherUiTest.checkDetectedLeaks(test.mLauncher, true);
- }
-
// Please don't add negative test cases for methods that fail only after a long wait.
public static void expectFail(String message, Runnable action) {
boolean failed = false;
diff --git a/tests/src/com/android/launcher3/ui/widget/RequestPinItemTest.java b/tests/src/com/android/launcher3/ui/widget/RequestPinItemTest.java
index 5c753f9..3c88f1d 100644
--- a/tests/src/com/android/launcher3/ui/widget/RequestPinItemTest.java
+++ b/tests/src/com/android/launcher3/ui/widget/RequestPinItemTest.java
@@ -18,8 +18,6 @@
import static android.app.PendingIntent.FLAG_MUTABLE;
import static android.app.PendingIntent.FLAG_ONE_SHOT;
-import static com.android.launcher3.ui.TaplTestsLauncher3.getAppPackageName;
-
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNotSame;
@@ -44,7 +42,6 @@
import com.android.launcher3.testcomponent.AppWidgetWithConfig;
import com.android.launcher3.testcomponent.RequestPinItemActivity;
import com.android.launcher3.ui.AbstractLauncherUiTest;
-import com.android.launcher3.ui.TaplTestsLauncher3;
import com.android.launcher3.util.LauncherBindableItemsContainer.ItemOperator;
import com.android.launcher3.util.Wait;
import com.android.launcher3.util.Wait.Condition;
@@ -77,7 +74,7 @@
super.setUp();
mCallbackAction = UUID.randomUUID().toString();
mShortcutId = UUID.randomUUID().toString();
- TaplTestsLauncher3.initialize(this);
+ AbstractLauncherUiTest.initialize(this);
}
@Test
diff --git a/tests/src/com/android/launcher3/ui/widget/TaplWidgetPickerTest.java b/tests/src/com/android/launcher3/ui/widget/TaplWidgetPickerTest.java
index a5e9868..465e9b4 100644
--- a/tests/src/com/android/launcher3/ui/widget/TaplWidgetPickerTest.java
+++ b/tests/src/com/android/launcher3/ui/widget/TaplWidgetPickerTest.java
@@ -15,7 +15,7 @@
*/
package com.android.launcher3.ui.widget;
-import static com.android.launcher3.ui.TaplTestsLauncher3.initialize;
+import static com.android.launcher3.ui.AbstractLauncherUiTest.initialize;
import static com.android.launcher3.util.rule.TestStabilityRule.LOCAL;
import static com.android.launcher3.util.rule.TestStabilityRule.PLATFORM_POSTSUBMIT;
@@ -23,6 +23,9 @@
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.MediumTest;
+
import com.android.launcher3.Launcher;
import com.android.launcher3.tapl.Widgets;
import com.android.launcher3.ui.AbstractLauncherUiTest;
@@ -34,11 +37,14 @@
import org.junit.Before;
import org.junit.Test;
+import org.junit.runner.RunWith;
/**
* This test run in both Out of process (Oop) and in-process (Ipc).
* Make sure the basic interactions with the WidgetPicker works.
*/
+@MediumTest
+@RunWith(AndroidJUnit4.class)
public class TaplWidgetPickerTest extends AbstractLauncherUiTest {
@Before
@@ -59,10 +65,12 @@
* Open Widget picker, make sure the widget picker can scroll and then go to home screen.
*/
@Test
- @Stability(flavors = LOCAL | PLATFORM_POSTSUBMIT) // b/293191790
+ @Stability(flavors = LOCAL | PLATFORM_POSTSUBMIT) // b/303263644
@ScreenRecord
@PortraitLandscape
public void testWidgets() {
+ // Testing if this will fix b/303263644
+ mLauncher.goHome();
// Test opening widgets.
executeOnLauncher(launcher ->
assertTrue("Widgets is initially opened", getWidgetsView(launcher) == null));
diff --git a/tests/src/com/android/launcher3/ui/workspace/TaplWorkspaceTest.java b/tests/src/com/android/launcher3/ui/workspace/TaplWorkspaceTest.java
index d776f21..59c82a7 100644
--- a/tests/src/com/android/launcher3/ui/workspace/TaplWorkspaceTest.java
+++ b/tests/src/com/android/launcher3/ui/workspace/TaplWorkspaceTest.java
@@ -15,7 +15,7 @@
*/
package com.android.launcher3.ui.workspace;
-import static com.android.launcher3.ui.TaplTestsLauncher3.initialize;
+import static com.android.launcher3.ui.AbstractLauncherUiTest.initialize;
import static com.android.launcher3.util.TestConstants.AppNames.CHROME_APP_NAME;
import static org.junit.Assert.assertEquals;
diff --git a/tests/src/com/android/launcher3/ui/workspace/ThemeIconsTest.java b/tests/src/com/android/launcher3/ui/workspace/ThemeIconsTest.java
index 34c7707..e21918f 100644
--- a/tests/src/com/android/launcher3/ui/workspace/ThemeIconsTest.java
+++ b/tests/src/com/android/launcher3/ui/workspace/ThemeIconsTest.java
@@ -36,7 +36,6 @@
import com.android.launcher3.tapl.HomeAppIcon;
import com.android.launcher3.tapl.HomeAppIconMenuItem;
import com.android.launcher3.ui.AbstractLauncherUiTest;
-import com.android.launcher3.ui.TaplTestsLauncher3;
import com.android.launcher3.util.Executors;
import org.junit.Test;
@@ -58,7 +57,7 @@
@Test
public void testIconWithoutTheme() throws Exception {
setThemeEnabled(false);
- TaplTestsLauncher3.initialize(this);
+ AbstractLauncherUiTest.initialize(this);
HomeAllApps allApps = mLauncher.getWorkspace().switchToAllApps();
allApps.freeze();
@@ -76,7 +75,7 @@
@Test
public void testShortcutIconWithoutTheme() throws Exception {
setThemeEnabled(false);
- TaplTestsLauncher3.initialize(this);
+ AbstractLauncherUiTest.initialize(this);
HomeAllApps allApps = mLauncher.getWorkspace().switchToAllApps();
allApps.freeze();
@@ -95,7 +94,7 @@
@Test
public void testIconWithTheme() throws Exception {
setThemeEnabled(true);
- TaplTestsLauncher3.initialize(this);
+ AbstractLauncherUiTest.initialize(this);
HomeAllApps allApps = mLauncher.getWorkspace().switchToAllApps();
allApps.freeze();
@@ -113,7 +112,7 @@
@Test
public void testShortcutIconWithTheme() throws Exception {
setThemeEnabled(true);
- TaplTestsLauncher3.initialize(this);
+ AbstractLauncherUiTest.initialize(this);
HomeAllApps allApps = mLauncher.getWorkspace().switchToAllApps();
allApps.freeze();
diff --git a/tests/src/com/android/launcher3/ui/workspace/TwoPanelWorkspaceTest.java b/tests/src/com/android/launcher3/ui/workspace/TwoPanelWorkspaceTest.java
index 35b4883..e7112d1 100644
--- a/tests/src/com/android/launcher3/ui/workspace/TwoPanelWorkspaceTest.java
+++ b/tests/src/com/android/launcher3/ui/workspace/TwoPanelWorkspaceTest.java
@@ -35,7 +35,6 @@
import com.android.launcher3.tapl.Workspace;
import com.android.launcher3.ui.AbstractLauncherUiTest;
import com.android.launcher3.ui.PortraitLandscapeRunner.PortraitLandscape;
-import com.android.launcher3.ui.TaplTestsLauncher3;
import com.android.launcher3.util.LauncherLayoutBuilder;
import com.android.launcher3.util.TestUtil;
@@ -74,7 +73,7 @@
.atWorkspace(3, -1, 0).putApp(
"com.android.vending", "com.android.vending.AssetBrowserActivity");
mLauncherLayout = TestUtil.setLauncherDefaultLayout(mTargetContext, builder);
- TaplTestsLauncher3.initialize(this);
+ AbstractLauncherUiTest.initialize(this);
assumeTrue(mLauncher.isTwoPanels());
// Pre verifying the screens
diff --git a/tests/src/com/android/launcher3/util/TestUtil.java b/tests/src/com/android/launcher3/util/TestUtil.java
index 957bf95..2786f02 100644
--- a/tests/src/com/android/launcher3/util/TestUtil.java
+++ b/tests/src/com/android/launcher3/util/TestUtil.java
@@ -49,6 +49,7 @@
import com.android.launcher3.config.FeatureFlags.IntFlag;
import com.android.launcher3.tapl.LauncherInstrumentation;
import com.android.launcher3.tapl.Workspace;
+import com.android.launcher3.util.rule.TestStabilityRule;
import org.junit.Assert;
@@ -133,13 +134,20 @@
*/
public static Point[] getCornersAndCenterPositions(LauncherInstrumentation launcher) {
final Point dimensions = launcher.getWorkspace().getIconGridDimensions();
- return new Point[]{
- new Point(0, 1),
- new Point(0, dimensions.y - 2),
- new Point(dimensions.x - 1, 1),
- new Point(dimensions.x - 1, dimensions.y - 2),
- new Point(dimensions.x / 2, dimensions.y / 2)
- };
+ if (TestStabilityRule.isPresubmit()) {
+ // Return only center in presubmit to fit under the presubmit SLO.
+ return new Point[]{
+ new Point(dimensions.x / 2, dimensions.y / 2)
+ };
+ } else {
+ return new Point[]{
+ new Point(0, 1),
+ new Point(0, dimensions.y - 2),
+ new Point(dimensions.x - 1, 1),
+ new Point(dimensions.x - 1, dimensions.y - 2),
+ new Point(dimensions.x / 2, dimensions.y / 2)
+ };
+ }
}
/**
diff --git a/tests/tapl/com/android/launcher3/tapl/AllApps.java b/tests/tapl/com/android/launcher3/tapl/AllApps.java
index dbb3cc3..7d25121 100644
--- a/tests/tapl/com/android/launcher3/tapl/AllApps.java
+++ b/tests/tapl/com/android/launcher3/tapl/AllApps.java
@@ -16,6 +16,7 @@
package com.android.launcher3.tapl;
+import static android.view.KeyEvent.KEYCODE_ESCAPE;
import static android.view.KeyEvent.KEYCODE_META_RIGHT;
import static com.android.launcher3.tapl.LauncherInstrumentation.DEFAULT_POLL_INTERVAL;
@@ -39,6 +40,7 @@
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
+import java.util.regex.Pattern;
import java.util.stream.Collectors;
/**
@@ -53,6 +55,11 @@
private static final String BOTTOM_SHEET_RES_ID = "bottom_sheet_background";
+ private static final Pattern EVENT_ALT_ESC_DOWN = Pattern.compile(
+ "Key event: KeyEvent.*?action=ACTION_DOWN.*?keyCode=KEYCODE_ESCAPE.*?metaState=0");
+ private static final Pattern EVENT_ALT_ESC_UP = Pattern.compile(
+ "Key event: KeyEvent.*?action=ACTION_UP.*?keyCode=KEYCODE_ESCAPE.*?metaState=0");
+
private final int mHeight;
private final int mIconHeight;
@@ -383,6 +390,19 @@
}
}
+ /** Presses the esc key to dismiss AllApps. */
+ public void dismissByEscKey() {
+ try (LauncherInstrumentation.Closable e = mLauncher.eventsCheck()) {
+ mLauncher.expectEvent(TestProtocol.SEQUENCE_MAIN, EVENT_ALT_ESC_DOWN);
+ mLauncher.expectEvent(TestProtocol.SEQUENCE_MAIN, EVENT_ALT_ESC_UP);
+ mLauncher.getDevice().pressKeyCode(KEYCODE_ESCAPE);
+ try (LauncherInstrumentation.Closable c = mLauncher.addContextLayer(
+ "pressed esc key")) {
+ verifyVisibleContainerOnDismiss();
+ }
+ }
+ }
+
protected abstract void verifyVisibleContainerOnDismiss();
/**