diff --git a/quickstep/res/values-af/strings.xml b/quickstep/res/values-af/strings.xml
index dd6ad484d0..ac10cc8d92 100644
--- a/quickstep/res/values-af/strings.xml
+++ b/quickstep/res/values-af/strings.xml
@@ -25,8 +25,7 @@
"Programgebruikinstellings"
"Vee alles uit"
"Onlangse programme"
-
-
+ "Taak is toegemaak"
"%1$s, %2$s"
"< 1 minuut"
"%1$s oor vandag"
@@ -103,6 +102,8 @@
"Terug"
"IME-wisselaar"
"Onlangs"
+ "Kennisgewings"
+ "Kitsinstellings"
"Skuif na links bo"
"Skuif na regs onder"
diff --git a/quickstep/res/values-am/strings.xml b/quickstep/res/values-am/strings.xml
index 1577335d9c..dfa8532870 100644
--- a/quickstep/res/values-am/strings.xml
+++ b/quickstep/res/values-am/strings.xml
@@ -25,8 +25,7 @@
"የመተግበሪያ አጠቃቀም ቅንብሮች"
"ሁሉንም አጽዳ"
"የቅርብ ጊዜ መተግበሪያዎች"
-
-
+ "ተግባር ተዘግቷል"
"%1$s፣ %2$s"
"< 1 ደቂቃ"
"ዛሬ %1$s ቀርቷል"
@@ -103,6 +102,8 @@
"ተመለስ"
"አይኤምኢ መቀየሪያ"
"የቅርብ ጊዜዎቹ"
+ "ማሳወቂያዎች"
+ "ፈጣን ቅንብሮች"
"ወደ ላይ/ግራ ይውሰዱ"
"ወደ ታች/ቀኝ ይውሰዱ"
diff --git a/quickstep/res/values-ar/strings.xml b/quickstep/res/values-ar/strings.xml
index 602b3e110c..58b26d1cd3 100644
--- a/quickstep/res/values-ar/strings.xml
+++ b/quickstep/res/values-ar/strings.xml
@@ -25,8 +25,7 @@
"إعدادات استخدام التطبيق"
"محو الكل"
"التطبيقات المستخدمة مؤخرًا"
-
-
+ "تم إغلاق المهمة."
"%1$s، %2$s"
"أقل من دقيقة"
"يتبقى اليوم %1$s."
@@ -103,6 +102,10 @@
"رجوع"
"مفتاح التبديل إلى IME"
"الأحدث"
+
+
+
+
"الانتقال إلى يمين الشاشة أو أعلاها"
"الانتقال إلى يسار الشاشة أو أسفلها"
diff --git a/quickstep/res/values-as/strings.xml b/quickstep/res/values-as/strings.xml
index adb4bae497..38a506f265 100644
--- a/quickstep/res/values-as/strings.xml
+++ b/quickstep/res/values-as/strings.xml
@@ -25,8 +25,7 @@
"এপে ব্যৱহাৰ কৰা ডেটাৰ ছেটিং"
"আটাইবোৰ মচক"
"শেহতীয়া এপসমূহ"
-
-
+ "কাৰ্য বন্ধ কৰা হ’ল"
"%1$s, %2$s"
"< ১ মিনিট"
"আজি %1$s বাকী আছ"
@@ -103,6 +102,10 @@
"উভতি যাওক"
"IME ছুইচ্চাৰ"
"শেহতীয়া"
+
+
+
+
"ওপৰৰ বাঁওফাললৈ নিয়ক"
"তলৰ সোঁফাললৈ নিয়ক"
diff --git a/quickstep/res/values-az/strings.xml b/quickstep/res/values-az/strings.xml
index a2050f3acc..74fcb63faf 100644
--- a/quickstep/res/values-az/strings.xml
+++ b/quickstep/res/values-az/strings.xml
@@ -25,8 +25,7 @@
"Tətbiq istifadə ayarları"
"Hamısını silin"
"Son tətbiqlər"
-
-
+ "Tapşırıq bağlanıb"
"%1$s, %2$s"
"< 1 dəq"
"Bu gün %1$s qaldı"
@@ -103,6 +102,10 @@
"Geriyə"
"IME keçiricisi"
"Sonuncular"
+
+
+
+
"Yuxarı/sola köçürün"
"Aşağı/sağa köçürün"
diff --git a/quickstep/res/values-b+sr+Latn/strings.xml b/quickstep/res/values-b+sr+Latn/strings.xml
index b064af96e0..f495b00cbe 100644
--- a/quickstep/res/values-b+sr+Latn/strings.xml
+++ b/quickstep/res/values-b+sr+Latn/strings.xml
@@ -25,8 +25,7 @@
"Podešavanja korišćenja aplikacije"
"Obriši sve"
"Nedavne aplikacije"
-
-
+ "Zadatak je zatvoren"
"%1$s, %2$s"
"< 1 min"
"Još %1$s danas"
@@ -103,6 +102,8 @@
"Nazad"
"IME prebacivač"
"Nedavno"
+ "Obaveštenja"
+ "Brza podešavanja"
"Premesti gore levo"
"Premesti dole desno"
diff --git a/quickstep/res/values-be/strings.xml b/quickstep/res/values-be/strings.xml
index 672e901126..4872f7d61b 100644
--- a/quickstep/res/values-be/strings.xml
+++ b/quickstep/res/values-be/strings.xml
@@ -25,8 +25,7 @@
"Налады выкарыстання праграмы"
"Ачысціць усё"
"Нядаўнія праграмы"
-
-
+ "Задача закрыта"
"%1$s, %2$s"
"< 1 хв"
"Сёння засталося %1$s"
@@ -103,6 +102,10 @@
"Назад"
"Выключальнік IME"
"Нядаўнія"
+
+
+
+
"Перамясціць уверх/улева"
"Перамясціць уніз/управа"
diff --git a/quickstep/res/values-bg/strings.xml b/quickstep/res/values-bg/strings.xml
index 65a1f07243..3fea5ee55e 100644
--- a/quickstep/res/values-bg/strings.xml
+++ b/quickstep/res/values-bg/strings.xml
@@ -25,8 +25,7 @@
"Настройки за използването на приложенията"
"Изчистване на всички"
"Скорошни приложения"
-
-
+ "Задачата е затворена"
"%1$s, %2$s"
"< 1 мин"
"Оставащо време днес: %1$s"
@@ -103,6 +102,10 @@
"Назад"
"Редактор за метода на въвежд.: Превключвател"
"Скорошни"
+
+
+
+
"Преместване горе/вляво"
"Преместване долу/вдясно"
diff --git a/quickstep/res/values-bn/strings.xml b/quickstep/res/values-bn/strings.xml
index 5f05f4edc0..ddd0edd77e 100644
--- a/quickstep/res/values-bn/strings.xml
+++ b/quickstep/res/values-bn/strings.xml
@@ -25,8 +25,7 @@
"অ্যাপ ব্যবহারের সেটিংস"
"সবকিছু খালি করুন"
"সম্প্রতি ব্যবহৃত অ্যাপ"
-
-
+ "টাস্ক বন্ধ করা হয়েছে"
"%1$s, %2$s"
"< ১ মি."
"আজকে %1$s বাকি আছে"
@@ -103,6 +102,8 @@
"ফিরে যান"
"IME সুইচার"
"সম্প্রতি"
+ "বিজ্ঞপ্তি"
+ "দ্রুত সেটিংস"
"উপরে/বাঁদিকে সরান"
"নিচে/ডানদিকে সরান"
diff --git a/quickstep/res/values-bs/strings.xml b/quickstep/res/values-bs/strings.xml
index 7de9d91c59..2cf2ef4878 100644
--- a/quickstep/res/values-bs/strings.xml
+++ b/quickstep/res/values-bs/strings.xml
@@ -25,8 +25,7 @@
"Postavke korištenja aplikacije"
"Obriši sve"
"Nedavne aplikacije"
-
-
+ "Zadatak je zatvoren"
"%1$s, %2$s"
"< 1 min"
"Preostalo vrijeme: %1$s"
@@ -103,6 +102,8 @@
"Nazad"
"IME prebacivač"
"Nedavno"
+ "Obavještenja"
+ "Brze postavke"
"Premjesti gore lijevo"
"Premjesti dolje desno"
diff --git a/quickstep/res/values-ca/strings.xml b/quickstep/res/values-ca/strings.xml
index a83c8d900e..0f6c4862dd 100644
--- a/quickstep/res/values-ca/strings.xml
+++ b/quickstep/res/values-ca/strings.xml
@@ -25,8 +25,7 @@
"Configuració d\'ús d\'aplicacions"
"Esborra-ho tot"
"Aplicacions recents"
-
-
+ "Tasca tancada"
"%1$s; %2$s"
"< 1 minut"
"temps restant avui: %1$s"
@@ -103,6 +102,10 @@
"Enrere"
"Selector d\'IME"
"Recents"
+
+
+
+
"Mou a la part superior o a l\'esquerra"
"Mou a la part inferior o a la dreta"
diff --git a/quickstep/res/values-cs/strings.xml b/quickstep/res/values-cs/strings.xml
index 92f8cc4fa4..6aef1a48e5 100644
--- a/quickstep/res/values-cs/strings.xml
+++ b/quickstep/res/values-cs/strings.xml
@@ -25,8 +25,7 @@
"Nastavení využití aplikací"
"Vymazat vše"
"Poslední aplikace"
-
-
+ "Úkol byl zavřen"
"%1$s, %2$s"
"< 1 minuta"
"dnes zbývá: %1$s"
@@ -103,6 +102,10 @@
"Zpět"
"Přepínač IME"
"Poslední"
+
+
+
+
"Přesunout doleva nahoru"
"Přesunout doprava dolů"
diff --git a/quickstep/res/values-da/strings.xml b/quickstep/res/values-da/strings.xml
index 9f2af7f133..c2e66812cb 100644
--- a/quickstep/res/values-da/strings.xml
+++ b/quickstep/res/values-da/strings.xml
@@ -25,8 +25,7 @@
"Indstillinger for appforbrug"
"Ryd alt"
"Seneste apps"
-
-
+ "Opgaven er lukket"
"%1$s, %2$s"
"< 1 min"
"%1$s tilbage i dag"
@@ -103,6 +102,10 @@
"Tilbage"
"IME-vælger"
"Seneste"
+
+
+
+
"Flyt til toppen eller venstre side"
"Flyt til bunden eller højre side"
diff --git a/quickstep/res/values-de/strings.xml b/quickstep/res/values-de/strings.xml
index 75fee4b49e..8d5aa7a07d 100644
--- a/quickstep/res/values-de/strings.xml
+++ b/quickstep/res/values-de/strings.xml
@@ -25,8 +25,7 @@
"Einstellungen zur App-Nutzung"
"Alle Apps schließen"
"Kürzlich geöffnete Apps"
-
-
+ "Aufgabe geschlossen"
"%1$s, %2$s"
"< 1 Min."
"Heute noch %1$s"
@@ -103,6 +102,8 @@
"Zurück"
"IME-Wechsler"
"Letzte Apps"
+ "Benachrichtigungen"
+ "Schnelleinstellungen"
"Nach oben / Nach links verschieben"
"Nach unten / Nach rechts verschieben"
diff --git a/quickstep/res/values-el/strings.xml b/quickstep/res/values-el/strings.xml
index 9f49b99279..10c39b40d9 100644
--- a/quickstep/res/values-el/strings.xml
+++ b/quickstep/res/values-el/strings.xml
@@ -25,8 +25,7 @@
"Ρυθμίσεις χρήσης εφαρμογής"
"Διαγραφή όλων"
"Πρόσφατες εφαρμογές"
-
-
+ "Η εργασία έκλεισε"
"%1$s, %2$s"
"< 1 λ."
"Απομένουν %1$s σήμερα"
@@ -103,6 +102,8 @@
"Πίσω"
"Εναλλαγή IME"
"Πρόσφατα"
+ "Ειδοποιήσεις"
+ "Γρήγορες ρυθμ."
"Μετακίνηση επάνω/αριστερά"
"Μετακίνηση κάτω/δεξιά"
diff --git a/quickstep/res/values-en-rAU/strings.xml b/quickstep/res/values-en-rAU/strings.xml
index 9acc708ffa..c67f4c92a7 100644
--- a/quickstep/res/values-en-rAU/strings.xml
+++ b/quickstep/res/values-en-rAU/strings.xml
@@ -25,8 +25,7 @@
"App usage settings"
"Clear all"
"Recent apps"
-
-
+ "Task closed"
"%1$s, %2$s"
"< 1 minute"
"%1$s left today"
@@ -103,6 +102,8 @@
"Back"
"IME switcher"
"Recents"
+ "Notifications"
+ "Quick Settings"
"Move to top/left"
"Move to bottom/right"
diff --git a/quickstep/res/values-en-rCA/strings.xml b/quickstep/res/values-en-rCA/strings.xml
index 9acc708ffa..c67f4c92a7 100644
--- a/quickstep/res/values-en-rCA/strings.xml
+++ b/quickstep/res/values-en-rCA/strings.xml
@@ -25,8 +25,7 @@
"App usage settings"
"Clear all"
"Recent apps"
-
-
+ "Task closed"
"%1$s, %2$s"
"< 1 minute"
"%1$s left today"
@@ -103,6 +102,8 @@
"Back"
"IME switcher"
"Recents"
+ "Notifications"
+ "Quick Settings"
"Move to top/left"
"Move to bottom/right"
diff --git a/quickstep/res/values-en-rGB/strings.xml b/quickstep/res/values-en-rGB/strings.xml
index 9acc708ffa..c67f4c92a7 100644
--- a/quickstep/res/values-en-rGB/strings.xml
+++ b/quickstep/res/values-en-rGB/strings.xml
@@ -25,8 +25,7 @@
"App usage settings"
"Clear all"
"Recent apps"
-
-
+ "Task closed"
"%1$s, %2$s"
"< 1 minute"
"%1$s left today"
@@ -103,6 +102,8 @@
"Back"
"IME switcher"
"Recents"
+ "Notifications"
+ "Quick Settings"
"Move to top/left"
"Move to bottom/right"
diff --git a/quickstep/res/values-en-rIN/strings.xml b/quickstep/res/values-en-rIN/strings.xml
index 9acc708ffa..c67f4c92a7 100644
--- a/quickstep/res/values-en-rIN/strings.xml
+++ b/quickstep/res/values-en-rIN/strings.xml
@@ -25,8 +25,7 @@
"App usage settings"
"Clear all"
"Recent apps"
-
-
+ "Task closed"
"%1$s, %2$s"
"< 1 minute"
"%1$s left today"
@@ -103,6 +102,8 @@
"Back"
"IME switcher"
"Recents"
+ "Notifications"
+ "Quick Settings"
"Move to top/left"
"Move to bottom/right"
diff --git a/quickstep/res/values-en-rXC/strings.xml b/quickstep/res/values-en-rXC/strings.xml
index 9f1cfe2fa3..c3007f04e0 100644
--- a/quickstep/res/values-en-rXC/strings.xml
+++ b/quickstep/res/values-en-rXC/strings.xml
@@ -102,6 +102,8 @@
"Back"
"IME switcher"
"Recents"
+ "Notifications"
+ "Quick Settings"
"Move to top/left"
"Move to bottom/right"
diff --git a/quickstep/res/values-es-rUS/strings.xml b/quickstep/res/values-es-rUS/strings.xml
index 0fe634c421..69b6015a2a 100644
--- a/quickstep/res/values-es-rUS/strings.xml
+++ b/quickstep/res/values-es-rUS/strings.xml
@@ -25,8 +25,7 @@
"Configuración de uso de la app"
"Borrar todo"
"Apps recientes"
-
-
+ "Se cerró la tarea"
"%1$s (%2$s)"
"< 1 minuto"
"Tiempo restante: %1$s"
@@ -103,6 +102,8 @@
"Atrás"
"Botón de IME"
"Recientes"
+ "Notificaciones"
+ "Config. rápida"
"Mover a la parte superior o izquierda"
"Mover a la parte inferior o derecha"
diff --git a/quickstep/res/values-es/strings.xml b/quickstep/res/values-es/strings.xml
index 667dd9973e..b5dc6e610d 100644
--- a/quickstep/res/values-es/strings.xml
+++ b/quickstep/res/values-es/strings.xml
@@ -25,8 +25,7 @@
"Ajustes de uso de la aplicación"
"Borrar todo"
"Aplicaciones recientes"
-
-
+ "Tarea cerrada"
"%1$s (%2$s)"
"<1 minuto"
"tiempo restante: %1$s"
@@ -103,6 +102,10 @@
"Atrás"
"Interruptor IME"
"Recientes"
+
+
+
+
"Mover arriba/a la izquierda"
"Mover abajo/a la derecha"
diff --git a/quickstep/res/values-et/strings.xml b/quickstep/res/values-et/strings.xml
index 212976c813..950263f263 100644
--- a/quickstep/res/values-et/strings.xml
+++ b/quickstep/res/values-et/strings.xml
@@ -25,8 +25,7 @@
"Rakenduse kasutuse seaded"
"Sule kõik"
"Hiljutised rakendused"
-
-
+ "Ülesanne suleti"
"%1$s %2$s"
"< 1 minut"
"Tääna jäänud %1$s"
@@ -103,6 +102,10 @@
"Tagasi"
"IME vahetaja"
"Hiljutised"
+
+
+
+
"Teisalda üles/vasakule"
"Teisalda alla/paremale"
diff --git a/quickstep/res/values-eu/strings.xml b/quickstep/res/values-eu/strings.xml
index c6b0688ce6..6193e359fd 100644
--- a/quickstep/res/values-eu/strings.xml
+++ b/quickstep/res/values-eu/strings.xml
@@ -25,8 +25,7 @@
"Aplikazioen erabileraren ezarpenak"
"Garbitu guztiak"
"Azken aplikazioak"
-
-
+ "Itxi da zeregina"
"%1$s (%2$s)"
"< 1 min"
"%1$s gelditzen dira gaur"
@@ -103,6 +102,8 @@
"Atzera"
"IMEaren etengailua"
"Azkenak"
+ "Jakinarazpenak"
+ "Ezarpen bizkorrak"
"Eraman gora, ezkerretara"
"Eraman behera, eskuinetara"
diff --git a/quickstep/res/values-fa/strings.xml b/quickstep/res/values-fa/strings.xml
index 5f6b2785e6..2323b3b657 100644
--- a/quickstep/res/values-fa/strings.xml
+++ b/quickstep/res/values-fa/strings.xml
@@ -25,8 +25,7 @@
"تنظیمات استفاده از برنامه"
"پاک کردن همه"
"برنامههای اخیر"
-
-
+ "تکلیف بسته شد"
"%1$s، %2$s"
"< ۱ دقیقه"
"%1$s باقیمانده برای امروز"
@@ -103,6 +102,8 @@
"برگشت"
"تعویضکننده IME"
"موارد اخیر"
+ "اعلانها"
+ "تنظیمات فوری"
"انتقال به بالا/ چپ"
"انتقال به پایین/ راست"
diff --git a/quickstep/res/values-fi/strings.xml b/quickstep/res/values-fi/strings.xml
index 866e2d0906..9505039bf0 100644
--- a/quickstep/res/values-fi/strings.xml
+++ b/quickstep/res/values-fi/strings.xml
@@ -25,8 +25,7 @@
"Sovelluksen käyttöasetukset"
"Poista kaikki"
"Viimeisimmät sovellukset"
-
-
+ "Tehtävä suljettu"
"%1$s, %2$s"
"< 1 min"
"%1$s jäljellä tänään"
@@ -103,6 +102,10 @@
"Takaisin"
"IME-vaihtopalvelu"
"Viimeaikaiset"
+
+
+
+
"Siirrä ylös tai vasemmalle"
"Siirrä alas tai oikealle"
diff --git a/quickstep/res/values-fr-rCA/strings.xml b/quickstep/res/values-fr-rCA/strings.xml
index 27b22ee43c..e34cb5d328 100644
--- a/quickstep/res/values-fr-rCA/strings.xml
+++ b/quickstep/res/values-fr-rCA/strings.xml
@@ -25,8 +25,7 @@
"Paramètres d\'utilisation de l\'application"
"Tout effacer"
"Applications récentes"
-
-
+ "Tâche fermée"
"%1$s : %2$s"
"< 1 min"
"Il reste %1$s aujourd\'hui"
@@ -103,6 +102,10 @@
"Retour"
"Sélecteur IME"
"Récents"
+
+
+
+
"Déplacer vers le coin supérieur gauche de l\'écran"
"Déplacer vers le coin inférieur droit de l\'écran"
diff --git a/quickstep/res/values-fr/strings.xml b/quickstep/res/values-fr/strings.xml
index fdfb9f2770..3c28c4649e 100644
--- a/quickstep/res/values-fr/strings.xml
+++ b/quickstep/res/values-fr/strings.xml
@@ -25,8 +25,7 @@
"Paramètres de consommation de l\'application"
"Tout effacer"
"Applications récentes"
-
-
+ "Tâche fermée"
"%1$s, %2$s"
"< 1 min"
"Encore %1$s aujourd\'hui"
@@ -103,6 +102,10 @@
"Retour"
"Sélecteur IME"
"Récents"
+
+
+
+
"Déplacer en haut ou à gauche"
"Déplacer en bas ou à droite"
diff --git a/quickstep/res/values-gl/strings.xml b/quickstep/res/values-gl/strings.xml
index ab3382fa57..4095f7d52c 100644
--- a/quickstep/res/values-gl/strings.xml
+++ b/quickstep/res/values-gl/strings.xml
@@ -25,8 +25,7 @@
"Configuración do uso de aplicacións"
"Borrar todo"
"Apps recentes"
-
-
+ "Tarefa pechada"
"%1$s (%2$s)"
"<1 min"
"Tempo restante hoxe %1$s"
@@ -103,6 +102,10 @@
"Atrás"
"Selector do IME"
"Recentes"
+
+
+
+
"Mover á parte superior ou á esquerda"
"Mover á parte inferior ou á dereita"
diff --git a/quickstep/res/values-gu/strings.xml b/quickstep/res/values-gu/strings.xml
index d965ff8ff5..6bb100a060 100644
--- a/quickstep/res/values-gu/strings.xml
+++ b/quickstep/res/values-gu/strings.xml
@@ -25,8 +25,7 @@
"ઍપ વપરાશનું સેટિંગ"
"બધું સાફ કરો"
"તાજેતરની ઍપ"
-
-
+ "કાર્ય બંધ કર્યું"
"%1$s, %2$s"
"< 1 મિનિટ"
"%1$s આજે બાકી"
@@ -103,6 +102,8 @@
"પાછળ"
"IME સ્વિચર"
"તાજેતરના"
+ "નોટિફિકેશન"
+ "ઝડપી સેટિંગ"
"સૌથી ઉપર ડાબી બાજુએ ખસેડો"
"સૌથી નીચે જમણી બાજુએ ખસેડો"
diff --git a/quickstep/res/values-hi/strings.xml b/quickstep/res/values-hi/strings.xml
index b79cb027cb..957125a54c 100644
--- a/quickstep/res/values-hi/strings.xml
+++ b/quickstep/res/values-hi/strings.xml
@@ -25,8 +25,7 @@
"ऐप्लिकेशन इस्तेमाल की सेटिंग"
"सभी ऐप्लिकेशन बंद करें"
"हाल ही में इस्तेमाल किए गए ऐप्लिकेशन"
-
-
+ "टास्क बंद किया गया"
"%1$s, %2$s"
"<1 मिनट"
"आज %1$s और चलेगा"
@@ -103,6 +102,8 @@
"वापस जाएं"
"IME स्विचर"
"हाल ही के"
+ "सूचनाएं"
+ "फटाफट सेटिंग"
"ऊपर/बाईं तरफ़ ले जाएं"
"नीचे/दाईं तरफ़ ले जाएं"
diff --git a/quickstep/res/values-hr/strings.xml b/quickstep/res/values-hr/strings.xml
index 1767c8fb9c..6c29822c69 100644
--- a/quickstep/res/values-hr/strings.xml
+++ b/quickstep/res/values-hr/strings.xml
@@ -25,8 +25,7 @@
"Postavke upotrebe aplikacija"
"Izbriši sve"
"Nedavne aplikacije"
-
-
+ "Zadatak je zatvoren"
"%1$s, %2$s"
"< 1 min"
"Još %1$s danas"
@@ -103,6 +102,8 @@
"Natrag"
"IME prekidač"
"Najnovije"
+ "Obavijesti"
+ "Brze postavke"
"Premjesti gore/lijevo"
"Premjesti dolje/desno"
diff --git a/quickstep/res/values-hu/strings.xml b/quickstep/res/values-hu/strings.xml
index 3ac0128543..5b1aff9896 100644
--- a/quickstep/res/values-hu/strings.xml
+++ b/quickstep/res/values-hu/strings.xml
@@ -25,8 +25,7 @@
"Alkalmazáshasználati beállítások"
"Összes törlése"
"Legutóbbi alkalmazások"
-
-
+ "A feladat bezárult"
"%1$s, %2$s"
"< 1 perc"
"Ma még %1$s van hátra"
@@ -103,6 +102,10 @@
"Vissza"
"IME-váltó"
"Legutóbbiak"
+
+
+
+
"Mozgatás felülre vagy a bal oldalra"
"Mozgatás alulra vagy a jobb oldalra"
diff --git a/quickstep/res/values-hy/strings.xml b/quickstep/res/values-hy/strings.xml
index b478137199..df7307834a 100644
--- a/quickstep/res/values-hy/strings.xml
+++ b/quickstep/res/values-hy/strings.xml
@@ -25,8 +25,7 @@
"Հավելվածի օգտագործման կարգավորումներ"
"Փակել բոլորը"
"Վերջին օգտագործած հավելվածները"
-
-
+ "Առաջադրանքը փակված է"
"%1$s, %2$s"
"< 1 ր"
"Այսօր մնացել է՝ %1$s"
@@ -103,6 +102,8 @@
"Հետ"
"IME փոխանջատիչ"
"Վերջինները"
+ "Ծանուցումներ"
+ "Արագ կարգավորումներ"
"Տեղափոխել վերևի ձախ անկյուն"
"Տեղափոխել ներքևի աջ անկյուն"
diff --git a/quickstep/res/values-in/strings.xml b/quickstep/res/values-in/strings.xml
index 1ac69c1e2f..61bdf31432 100644
--- a/quickstep/res/values-in/strings.xml
+++ b/quickstep/res/values-in/strings.xml
@@ -25,8 +25,7 @@
"Setelan penggunaan aplikasi"
"Hapus semua"
"Aplikasi terbaru"
-
-
+ "Tugas Ditutup"
"%1$s, %2$s"
"< 1 menit"
"%1$s tersisa hari ini"
@@ -103,6 +102,8 @@
"Kembali"
"Pengalih IME"
"Terbaru"
+ "Notifikasi"
+ "Setelan Cepat"
"Pindahkan ke atas/kiri"
"Pindahkan ke bawah/kanan"
diff --git a/quickstep/res/values-is/strings.xml b/quickstep/res/values-is/strings.xml
index 3ef2f3146b..13275522a1 100644
--- a/quickstep/res/values-is/strings.xml
+++ b/quickstep/res/values-is/strings.xml
@@ -25,8 +25,7 @@
"Notkunarstillingar forrits"
"Hreinsa allt"
"Nýleg forrit"
-
-
+ "Verkefni lokað"
"%1$s, %2$s"
"< 1 mín."
"%1$s eftir í dag"
@@ -103,6 +102,10 @@
"Til baka"
"Breyta innsláttaraðferð"
"Nýlegt"
+
+
+
+
"Færa efst/til vinstri"
"Færa neðst/til hægri"
diff --git a/quickstep/res/values-it/strings.xml b/quickstep/res/values-it/strings.xml
index e44175dc89..a555636db1 100644
--- a/quickstep/res/values-it/strings.xml
+++ b/quickstep/res/values-it/strings.xml
@@ -25,8 +25,7 @@
"Impostazioni di utilizzo delle app"
"Cancella tutto"
"App recenti"
-
-
+ "Attività chiusa"
"%1$s, %2$s"
"< 1 min"
"Rimanente oggi: %1$s"
@@ -103,6 +102,10 @@
"Indietro"
"Selettore IME"
"Recenti"
+
+
+
+
"Sposta in alto/a sinistra"
"Sposta in basso/a destra"
diff --git a/quickstep/res/values-iw/strings.xml b/quickstep/res/values-iw/strings.xml
index 5313280c42..cd97903de4 100644
--- a/quickstep/res/values-iw/strings.xml
+++ b/quickstep/res/values-iw/strings.xml
@@ -25,8 +25,7 @@
"הגדרות שימוש באפליקציה"
"ניקוי הכול"
"אפליקציות אחרונות"
-
-
+ "המשימה סגורה"
"%1$s, %2$s"
"< דקה"
"הזמן שנותר להיום: %1$s"
@@ -103,6 +102,10 @@
"חזרה"
"כלי להחלפת IME"
"לאחרונה"
+
+
+
+
"העברה לפינה השמאלית/העליונה"
"העברה לפינה הימנית/התחתונה"
diff --git a/quickstep/res/values-ja/strings.xml b/quickstep/res/values-ja/strings.xml
index 3d91d0575d..9a4ce01544 100644
--- a/quickstep/res/values-ja/strings.xml
+++ b/quickstep/res/values-ja/strings.xml
@@ -25,8 +25,7 @@
"アプリの使用状況の設定"
"すべてクリア"
"最近使ったアプリ"
-
-
+ "タスクを閉じました"
"%1$s、%2$s"
"1 分未満"
"今日はあと %1$sです"
@@ -103,6 +102,8 @@
"戻る"
"IME の切り替え"
"最近"
+ "通知"
+ "クイック設定"
"上 / 左に移動"
"下 / 右に移動"
diff --git a/quickstep/res/values-ka/strings.xml b/quickstep/res/values-ka/strings.xml
index eb2dc94088..250148911f 100644
--- a/quickstep/res/values-ka/strings.xml
+++ b/quickstep/res/values-ka/strings.xml
@@ -25,8 +25,7 @@
"აპების გამოყენების პარამეტრები"
"ყველას გასუფთავება"
"ბოლოდროინდელი აპები"
-
-
+ "ამოცანა დაიხურა"
"%1$s, %2$s"
"< 1 წუთი"
"დღეს დარჩენილია %1$s"
@@ -103,6 +102,8 @@
"უკან"
"IME გადამრთველი"
"ბოლოდროინდელი"
+ "შეტყობინებები"
+ "სწრაფი პარამეტრები"
"ზემოთ/მარცხნივ გადატანა"
"ქვემოთ/მარჯვნივ გადატანა"
diff --git a/quickstep/res/values-kk/strings.xml b/quickstep/res/values-kk/strings.xml
index 538fb59bb4..9d3ca2d17a 100644
--- a/quickstep/res/values-kk/strings.xml
+++ b/quickstep/res/values-kk/strings.xml
@@ -25,8 +25,7 @@
"Қолданбаны пайдалану параметрлері"
"Барлығын өшіру"
"Соңғы пайдаланылған қолданбалар"
-
-
+ "Тапсырма жабылды."
"%1$s, %2$s"
"< 1 мин"
"Бүгін %1$s қалды"
@@ -103,6 +102,8 @@
"Артқа"
"IME ауыстырғышы"
"Соңғылары"
+ "Хабарландырулар"
+ "Жылдам параметрлер"
"Жоғары/солға жылжыту"
"Төмен/оңға жылжыту"
diff --git a/quickstep/res/values-km/strings.xml b/quickstep/res/values-km/strings.xml
index 740277621d..3295a636ef 100644
--- a/quickstep/res/values-km/strings.xml
+++ b/quickstep/res/values-km/strings.xml
@@ -25,8 +25,7 @@
"ការកំណត់ការប្រើប្រាស់កម្មវិធី"
"សម្អាតទាំងអស់"
"កម្មវិធីថ្មីៗ"
-
-
+ "បានបិទកិច្ចការ"
"%1$s, %2$s"
"< 1 នាទី"
"នៅសល់ %1$s ទៀតនៅថ្ងៃនេះ"
@@ -103,6 +102,10 @@
"ថយក្រោយ"
"ប៊ូតុងប្ដូរ IME"
"ថ្មីៗ"
+
+
+
+
"ផ្លាស់ទីទៅខាងលើ/ឆ្វេង"
"ផ្លាស់ទីទៅខាងក្រោម/ស្ដាំ"
diff --git a/quickstep/res/values-kn/strings.xml b/quickstep/res/values-kn/strings.xml
index 5ec6df7916..01c7dd5bbb 100644
--- a/quickstep/res/values-kn/strings.xml
+++ b/quickstep/res/values-kn/strings.xml
@@ -25,8 +25,7 @@
"ಆ್ಯಪ್ ಬಳಕೆಯ ಸೆಟ್ಟಿಂಗ್ಗಳು"
"ಎಲ್ಲವನ್ನೂ ತೆರವುಗೊಳಿಸಿ"
"ಇತ್ತೀಚಿನ ಅಪ್ಲಿಕೇಶನ್ಗಳು"
-
-
+ "ಕಾರ್ಯವನ್ನು ಮುಚ್ಚಲಾಗಿದೆ"
"%1$s, %2$s"
"< 1 ನಿ"
"ಇಂದು %1$s ಸಮಯ ಉಳಿದಿದೆ"
@@ -103,6 +102,8 @@
"ಹಿಂದೆ"
"IME ಪರಿವರ್ತಕ"
"ಇತ್ತೀಚಿನವು"
+ "ಅಧಿಸೂಚನೆಗಳು"
+ "ತ್ವರಿತ ಸೆಟ್ಟಿಂಗ್ಗಳು"
"ಮೇಲಿನ/ಎಡಭಾಗಕ್ಕೆ ಸರಿಸಿ"
"ಕೆಳಗಿನ/ಬಲಭಾಗಕ್ಕೆ ಸರಿಸಿ"
diff --git a/quickstep/res/values-ko/strings.xml b/quickstep/res/values-ko/strings.xml
index 45643e75cb..08e5642068 100644
--- a/quickstep/res/values-ko/strings.xml
+++ b/quickstep/res/values-ko/strings.xml
@@ -25,8 +25,7 @@
"앱 사용 설정"
"모두 삭제"
"최근 앱"
-
-
+ "작업 종료됨"
"%1$s, %2$s"
"< 1분"
"오늘 %1$s 남음"
@@ -103,6 +102,10 @@
"뒤로"
"IME 전환기"
"최근 항목"
+
+
+
+
"상단/왼쪽으로 이동"
"하단/오른쪽으로 이동"
diff --git a/quickstep/res/values-ky/strings.xml b/quickstep/res/values-ky/strings.xml
index e562f93317..c1ca8b3cc6 100644
--- a/quickstep/res/values-ky/strings.xml
+++ b/quickstep/res/values-ky/strings.xml
@@ -25,8 +25,7 @@
"Колдонмону пайдалануу жөндөөлөрү"
"Баарын тазалоо"
"Акыркы колдонмолор"
-
-
+ "Тапшырма жабылды"
"%1$s, %2$s"
"< 1 мүнөт"
"Бүгүн %1$s мүнөт калды"
@@ -103,6 +102,8 @@
"Артка"
"IME которгучу"
"Акыркылар"
+ "Билдирмелер"
+ "Ыкчам жөндөөлөр"
"Жогорку/сол бурчка жылдыруу"
"Төмөнкү/оң бурчка жылдыруу"
diff --git a/quickstep/res/values-lo/strings.xml b/quickstep/res/values-lo/strings.xml
index 04939fcd6f..4c1791f112 100644
--- a/quickstep/res/values-lo/strings.xml
+++ b/quickstep/res/values-lo/strings.xml
@@ -25,8 +25,7 @@
"ການຕັ້ງຄ່າການນຳໃຊ້ແອັບ"
"ລຶບລ້າງທັງໝົດ"
"ແອັບຫຼ້າສຸດ"
-
-
+ "ປິດໜ້າວຽກແລ້ວ"
"%1$s, %2$s"
"< 1 ນາທີ"
"ເຫຼືອ %1$s ມື້ນີ້"
@@ -103,6 +102,10 @@
"ກັບຄືນ"
"ຕົວສະຫຼັບ IME"
"ຫຼ້າສຸດ"
+
+
+
+
"ຍ້າຍໄປຊ້າຍ/ເທິງ"
"ຍ້າຍໄປຂວາ/ລຸ່ມ"
diff --git a/quickstep/res/values-lt/strings.xml b/quickstep/res/values-lt/strings.xml
index c9b0919ce4..95a7e86a9a 100644
--- a/quickstep/res/values-lt/strings.xml
+++ b/quickstep/res/values-lt/strings.xml
@@ -25,8 +25,7 @@
"Programos naudojimo nustatymai"
"Išvalyti viską"
"Naujausios programos"
-
-
+ "Užduotis uždaryta"
"%1$s, %2$s"
"< 1 min."
"Šiandien liko: %1$s"
@@ -103,6 +102,10 @@
"Atgal"
"IMRP perjungiklis"
"Naujausi"
+
+
+
+
"Perkelti aukštyn, kairėn"
"Perkelti žemyn, dešinėn"
diff --git a/quickstep/res/values-lv/strings.xml b/quickstep/res/values-lv/strings.xml
index 6bd8f5e1b1..f3de0b7f5c 100644
--- a/quickstep/res/values-lv/strings.xml
+++ b/quickstep/res/values-lv/strings.xml
@@ -25,8 +25,7 @@
"Lietotņu izmantošanas iestatījumi"
"Notīrīt visu"
"Pēdējās izmantotās lietotnes"
-
-
+ "Uzdevums ir aizvērts"
"%1$s, %2$s"
"<1 minūte"
"Šodien atlicis: %1$s"
@@ -103,6 +102,10 @@
"Atpakaļ"
"IME pārslēdzējs"
"Nesenie"
+
+
+
+
"Pārvietot uz augšējo/kreiso stūri"
"Pārvietot uz apakšējo/labo stūri"
diff --git a/quickstep/res/values-mk/strings.xml b/quickstep/res/values-mk/strings.xml
index 250c11c8ce..dc0732f24c 100644
--- a/quickstep/res/values-mk/strings.xml
+++ b/quickstep/res/values-mk/strings.xml
@@ -25,8 +25,7 @@
"Поставки за користење на апликациите"
"Избриши ги сите"
"Неодамнешни апликации"
-
-
+ "Задачата е затворена"
"%1$s, %2$s"
"< 1 минута"
"Уште %1$s за денес"
@@ -103,6 +102,8 @@
"Назад"
"IME менувач"
"Неодамнешни"
+ "Известувања"
+ "Брзи поставки"
"Премести горе лево"
"Премести долу десно"
diff --git a/quickstep/res/values-ml/strings.xml b/quickstep/res/values-ml/strings.xml
index 19c398570d..4ac251c97d 100644
--- a/quickstep/res/values-ml/strings.xml
+++ b/quickstep/res/values-ml/strings.xml
@@ -25,8 +25,7 @@
"ആപ്പ് ഉപയോഗ ക്രമീകരണം"
"എല്ലാം മായ്ക്കുക"
"സമീപകാല ആപ്പുകൾ"
-
-
+ "ടാസ്ക്ക് അടച്ചു"
"%1$s, %2$s"
"< 1 മിനിറ്റ്"
"ഇന്ന് %1$s ശേഷിക്കുന്നു"
@@ -103,6 +102,8 @@
"മടങ്ങുക"
"IME സ്വിച്ചർ"
"അടുത്തിടെയുള്ളവ"
+ "അറിയിപ്പുകൾ"
+ "ദ്രുത ക്രമീകരണം"
"മുകളിലേക്കോ ഇടത്തേക്കോ നീക്കുക"
"താഴേക്കോ വലത്തേക്കോ നീക്കുക"
diff --git a/quickstep/res/values-mn/strings.xml b/quickstep/res/values-mn/strings.xml
index 4ac7c170e2..6d918f6eef 100644
--- a/quickstep/res/values-mn/strings.xml
+++ b/quickstep/res/values-mn/strings.xml
@@ -25,8 +25,7 @@
"Апп ашиглалтын тохиргоо"
"Бүгдийг устгах"
"Саяхны аппууд"
-
-
+ "Ажлыг хаасан"
"%1$s, %2$s"
"< 1 минут"
"Өнөөдөр %1$s үлдсэн"
@@ -103,6 +102,8 @@
"Буцах"
"IME сэлгэгч"
"Саяхны"
+ "Мэдэгдэл"
+ "Шуурхай тохиргоо"
"Зүүн дээд хэсэг рүү зөөх"
"Баруун доод хэсэг рүү зөөх"
diff --git a/quickstep/res/values-mr/strings.xml b/quickstep/res/values-mr/strings.xml
index 8b505dd4e5..aa374b4fc5 100644
--- a/quickstep/res/values-mr/strings.xml
+++ b/quickstep/res/values-mr/strings.xml
@@ -25,8 +25,7 @@
"अॅप वापर सेटिंग्ज"
"सर्व साफ करा"
"अलीकडील अॅप्स"
-
-
+ "टास्क बंद केली"
"%1$s, %2$s"
"१मिहून कमी"
"आज %1$sशिल्लक आहे"
@@ -103,6 +102,8 @@
"मागे जा"
"IME स्विचर"
"अलीकडील"
+ "सूचना"
+ "क्विक सेटिंग्ज"
"सर्वात वरती/डावीकडे हलवा"
"तळाशी/उजवीकडे हलवा"
diff --git a/quickstep/res/values-ms/strings.xml b/quickstep/res/values-ms/strings.xml
index da813820bd..8b9165dea6 100644
--- a/quickstep/res/values-ms/strings.xml
+++ b/quickstep/res/values-ms/strings.xml
@@ -25,8 +25,7 @@
"Tetapan penggunaan apl"
"Kosongkan semua"
"Apl terbaharu"
-
-
+ "Tugas Ditutup"
"%1$s, %2$s"
"< 1 minit"
"%1$s lagi hari ini"
@@ -103,6 +102,8 @@
"Kembali"
"Penukar IME"
"Terbaharu"
+ "Pemberitahuan"
+ "Tetapan Pantas"
"Alihkan ke atas/kiri"
"Alihkan ke bawah/kanan"
diff --git a/quickstep/res/values-my/strings.xml b/quickstep/res/values-my/strings.xml
index 675a53e7bb..d09165aa02 100644
--- a/quickstep/res/values-my/strings.xml
+++ b/quickstep/res/values-my/strings.xml
@@ -25,8 +25,7 @@
"အက်ပ်အသုံးပြုမှု ဆက်တင်များ"
"အားလုံးရှင်းရန်"
"လတ်တလောသုံး အက်ပ်များ"
-
-
+ "လုပ်ဆောင်စရာ ပိတ်ထားသည်"
"%1$s၊ %2$s"
"< ၁ မိနစ်"
"ယနေ့ %1$s ခု ကျန်သည်"
@@ -103,6 +102,10 @@
"နောက်သို့"
"IME ပြောင်းစနစ်"
"လတ်တလောများ"
+
+
+
+
"အပေါ်/ဘယ်ဘက်သို့ ရွှေ့ရန်"
"အောက်ခြေ/ညာဘက်သို့ ရွှေ့ရန်"
diff --git a/quickstep/res/values-nb/strings.xml b/quickstep/res/values-nb/strings.xml
index 8a789e13d4..6d143bdc7f 100644
--- a/quickstep/res/values-nb/strings.xml
+++ b/quickstep/res/values-nb/strings.xml
@@ -25,8 +25,7 @@
"Innstillinger for appbruk"
"Fjern alt"
"Nylige apper"
-
-
+ "Oppgaven er lukket"
"%1$s, %2$s"
"< 1 minutt"
"%1$s gjenstår i dag"
@@ -103,6 +102,10 @@
"Tilbake"
"IME-veksler"
"Nylige"
+
+
+
+
"Flytt til øverst/venstre"
"Flytt til nederst/høyre"
diff --git a/quickstep/res/values-ne/strings.xml b/quickstep/res/values-ne/strings.xml
index 6e7e6e8bdd..cd3383b5fe 100644
--- a/quickstep/res/values-ne/strings.xml
+++ b/quickstep/res/values-ne/strings.xml
@@ -25,8 +25,7 @@
"एपको उपयोगका सेटिङहरू"
"सबै मेटाउनुहोस्"
"हालसालैका एपहरू"
-
-
+ "कार्य बन्द गरियो"
"%1$s, %2$s"
"< १ मिनेट"
"आज: %1$s बाँकी"
@@ -103,6 +102,10 @@
"पछाडि जानुहोस्"
"IME स्विचर"
"हालसालैका बटनहरू"
+
+
+
+
"सिरान/बायाँतिर सार्नुहोस्"
"फेद/दायाँतिर सार्नुहोस्"
diff --git a/quickstep/res/values-nl/strings.xml b/quickstep/res/values-nl/strings.xml
index e7af211a13..7772aae71c 100644
--- a/quickstep/res/values-nl/strings.xml
+++ b/quickstep/res/values-nl/strings.xml
@@ -25,8 +25,7 @@
"Instellingen voor app-gebruik"
"Alles wissen"
"Recente apps"
-
-
+ "Taak gesloten"
"%1$s, %2$s"
"< 1 minuut"
"Nog %1$s vandaag"
@@ -103,6 +102,8 @@
"Terug"
"IME-schakelaar"
"Recent"
+ "Meldingen"
+ "Snelle instellingen"
"Naar boven/links verplaatsen"
"Naar beneden/rechts verplaatsen"
diff --git a/quickstep/res/values-or/strings.xml b/quickstep/res/values-or/strings.xml
index e3f1f77963..77407833f3 100644
--- a/quickstep/res/values-or/strings.xml
+++ b/quickstep/res/values-or/strings.xml
@@ -25,8 +25,7 @@
"ଆପ୍ ବ୍ୟବହାର ସେଟିଂସ୍"
"ସବୁ ଖାଲି କରନ୍ତୁ"
"ବର୍ତ୍ତମାନର ଆପ୍"
-
-
+ "ଟାସ୍କ ବନ୍ଦ ହୋଇଯାଇଛି"
"%1$s %2$s"
"< 1 ମିନିଟ୍"
"ଆଜି %1$s ବାକି ଅଛି"
@@ -103,6 +102,10 @@
"ପଛକୁ ଫେରନ୍ତୁ"
"IME ସ୍ୱିଚର"
"ବର୍ତ୍ତମାନର"
+
+
+
+
"ଶୀର୍ଷ/ବାମକୁ ମୁଭ କରନ୍ତୁ"
"ନିମ୍ନ/ଡାହାଣକୁ ମୁଭ କରନ୍ତୁ"
diff --git a/quickstep/res/values-pa/strings.xml b/quickstep/res/values-pa/strings.xml
index 48098a5723..0173ee2f5e 100644
--- a/quickstep/res/values-pa/strings.xml
+++ b/quickstep/res/values-pa/strings.xml
@@ -25,8 +25,7 @@
"ਐਪ ਵਰਤੋਂ ਦੀਆਂ ਸੈਟਿੰਗਾਂ"
"ਸਭ ਕਲੀਅਰ ਕਰੋ"
"ਹਾਲੀਆ ਐਪਾਂ"
-
-
+ "ਕਾਰਜ ਬੰਦ"
"%1$s, %2$s"
"< 1 ਮਿੰਟ"
"ਅੱਜ %1$s ਬਾਕੀ"
@@ -103,6 +102,8 @@
"ਪਿੱਛੇ"
"IME ਸਵਿੱਚਰ"
"ਹਾਲੀਆ"
+ "ਸੂਚਨਾਵਾਂ"
+ "ਤਤਕਾਲ ਸੈਟਿੰਗਾਂ"
"ਸਿਖਰਲੇ/ਖੱਬੇ ਪਾਸੇ ਲੈ ਕੇ ਜਾਓ"
"ਹੇਠਾਂ/ਸੱਜੇ ਪਾਸੇ ਲੈ ਕੇ ਜਾਓ"
diff --git a/quickstep/res/values-pl/strings.xml b/quickstep/res/values-pl/strings.xml
index f0b9566a84..19b666a704 100644
--- a/quickstep/res/values-pl/strings.xml
+++ b/quickstep/res/values-pl/strings.xml
@@ -25,8 +25,7 @@
"Ustawienia użycia aplikacji"
"Wyczyść wszystko"
"Ostatnie aplikacje"
-
-
+ "Zadanie zamknięte"
"%1$s, %2$s"
"> 1 min"
"Na dziś zostało %1$s"
@@ -103,6 +102,8 @@
"Wstecz"
"Przełącznik IME"
"Ostatnie"
+ "Powiadomienia"
+ "Szybkie ustawienia"
"Przesuń w górny lewy róg"
"Przesuń w dolny prawy róg"
diff --git a/quickstep/res/values-pt-rPT/strings.xml b/quickstep/res/values-pt-rPT/strings.xml
index 407edb7d15..4e7b7a6351 100644
--- a/quickstep/res/values-pt-rPT/strings.xml
+++ b/quickstep/res/values-pt-rPT/strings.xml
@@ -25,8 +25,7 @@
"Definições de utilização de aplicações"
"Limpar tudo"
"Apps recentes"
-
-
+ "Tarefa fechada"
"%1$s, %2$s"
"< 1 minuto"
"Resta(m) %1$s hoje."
@@ -103,6 +102,8 @@
"Voltar"
"Comutador IME"
"Recentes"
+ "Notificações"
+ "Definiç. rápidas"
"Mover para a parte superior esquerda"
"Mover para a part superior direita"
diff --git a/quickstep/res/values-pt/strings.xml b/quickstep/res/values-pt/strings.xml
index eb9e79405a..d4a56acb20 100644
--- a/quickstep/res/values-pt/strings.xml
+++ b/quickstep/res/values-pt/strings.xml
@@ -25,8 +25,7 @@
"Configurações de uso do app"
"Limpar tudo"
"Apps recentes"
-
-
+ "Tarefa encerrada"
"%1$s, %2$s"
"< 1 min"
"%1$s restante(s) hoje"
@@ -103,6 +102,8 @@
"Voltar"
"Alternador do IME"
"Recentes"
+ "Notificações"
+ "Config. rápidas"
"Mover para cima/para a esquerda"
"Mover para baixo/para a direita"
diff --git a/quickstep/res/values-ro/strings.xml b/quickstep/res/values-ro/strings.xml
index 89589a1c0c..38d596cd4b 100644
--- a/quickstep/res/values-ro/strings.xml
+++ b/quickstep/res/values-ro/strings.xml
@@ -25,8 +25,7 @@
"Setări de utilizare a aplicației"
"Ștergeți tot"
"Aplicații recente"
-
-
+ "Activitatea s-a încheiat"
"%1$s, %2$s"
"< 1 minut"
"Au mai rămas %1$s astăzi"
@@ -103,6 +102,8 @@
"Înapoi"
"Comutator IME"
"Recente"
+ "Notificări"
+ "Setări rapide"
"Mutați în stânga sus"
"Mutați în dreapta jos"
diff --git a/quickstep/res/values-ru/strings.xml b/quickstep/res/values-ru/strings.xml
index 0baa02c9c5..7d27436abf 100644
--- a/quickstep/res/values-ru/strings.xml
+++ b/quickstep/res/values-ru/strings.xml
@@ -25,8 +25,7 @@
"Настройки использования приложения"
"Очистить все"
"Недавние приложения"
-
-
+ "Задача закрыта"
"%1$s: %2$s"
"< 1 мин."
"Осталось сегодня: %1$s"
@@ -103,6 +102,8 @@
"Назад"
"Переключат. IME"
"Недавние"
+ "Уведомления"
+ "Быстрые настройки"
"Переместить вверх или влево"
"Переместить вниз или вправо"
diff --git a/quickstep/res/values-si/strings.xml b/quickstep/res/values-si/strings.xml
index b72aca4a94..990017e0ce 100644
--- a/quickstep/res/values-si/strings.xml
+++ b/quickstep/res/values-si/strings.xml
@@ -25,8 +25,7 @@
"යෙදුම් භාවිත සැකසීම්"
"සියල්ල හිස් කරන්න"
"මෑත යෙදුම්"
-
-
+ "කාර්යය අවසන් කරන ලදි"
"%1$s, %2$s"
"< 1 විනාඩියක්"
"අද %1$sක් ඉතුරුයි"
@@ -103,6 +102,10 @@
"ආපසු"
"IME මාරුව"
"මෑත"
+
+
+
+
"ඉහළ/වම වෙත ගෙන යන්න"
"පහළ/දකුණ වෙත ගෙන යන්න"
diff --git a/quickstep/res/values-sk/strings.xml b/quickstep/res/values-sk/strings.xml
index c03ffd52bc..a18f72ca6d 100644
--- a/quickstep/res/values-sk/strings.xml
+++ b/quickstep/res/values-sk/strings.xml
@@ -25,8 +25,7 @@
"Nastavenia využívania aplikácie"
"Vymazať všetko"
"Nedávne aplikácie"
-
-
+ "Úloha bola zavretá"
"%1$s, %2$s"
"Menej ako 1 minúta"
"Dnes ešte zostáva: %1$s"
@@ -103,6 +102,10 @@
"Späť"
"Prepínač IME"
"Nedávne"
+
+
+
+
"Presunúť hore alebo doľava"
"Presunúť dole alebo doprava"
diff --git a/quickstep/res/values-sl/strings.xml b/quickstep/res/values-sl/strings.xml
index 61368f571f..82035280b6 100644
--- a/quickstep/res/values-sl/strings.xml
+++ b/quickstep/res/values-sl/strings.xml
@@ -25,8 +25,7 @@
"Nastavitve uporabe aplikacij"
"Počisti vse"
"Nedavne aplikacije"
-
-
+ "Opravilo je zaprto"
"%1$s, %2$s"
"< 1 min"
"Danes je ostalo še %1$s"
@@ -103,6 +102,8 @@
"Nazaj"
"Menjava UNV"
"Nedavno"
+ "Obvestila"
+ "Hitre nastavitve"
"Premakni na vrh/levo"
"Premakni na dno/desno"
diff --git a/quickstep/res/values-sq/strings.xml b/quickstep/res/values-sq/strings.xml
index 6dbf712657..f2b2fa8520 100644
--- a/quickstep/res/values-sq/strings.xml
+++ b/quickstep/res/values-sq/strings.xml
@@ -25,8 +25,7 @@
"Cilësimet e përdorimit të aplikacionit"
"Pastroji të gjitha"
"Aplikacionet e fundit"
-
-
+ "Detyra u mbyll"
"%1$s, %2$s"
"< 1 minutë"
"%1$s të mbetura sot"
@@ -103,6 +102,10 @@
"Pas"
"Çelësi IME"
"Të fundit"
+
+
+
+
"Lëviz në krye/majtas"
"Lëviz në fund/djathtas"
diff --git a/quickstep/res/values-sr/strings.xml b/quickstep/res/values-sr/strings.xml
index db6c2b42b5..309aaeb75a 100644
--- a/quickstep/res/values-sr/strings.xml
+++ b/quickstep/res/values-sr/strings.xml
@@ -25,8 +25,7 @@
"Подешавања коришћења апликације"
"Обриши све"
"Недавне апликације"
-
-
+ "Задатак је затворен"
"%1$s, %2$s"
"< 1 мин"
"Још %1$s данас"
@@ -103,6 +102,8 @@
"Назад"
"IME пребацивач"
"Недавно"
+ "Обавештења"
+ "Брза подешавања"
"Премести горе лево"
"Премести доле десно"
diff --git a/quickstep/res/values-sv/strings.xml b/quickstep/res/values-sv/strings.xml
index 0ae3ca0790..2f1b75af4e 100644
--- a/quickstep/res/values-sv/strings.xml
+++ b/quickstep/res/values-sv/strings.xml
@@ -25,8 +25,7 @@
"Inställningar för appanvändning"
"Rensa alla"
"Senaste apparna"
-
-
+ "Uppgiften har stängts"
"%1$s, %2$s"
"< 1 min"
"%1$s kvar i dag"
@@ -103,6 +102,10 @@
"Tillbaka"
"IME-väljare"
"Senaste"
+
+
+
+
"Flytta högst upp/till vänster"
"Flytta längst ned/till höger"
diff --git a/quickstep/res/values-sw/strings.xml b/quickstep/res/values-sw/strings.xml
index 287635a0f4..e10d447a38 100644
--- a/quickstep/res/values-sw/strings.xml
+++ b/quickstep/res/values-sw/strings.xml
@@ -25,8 +25,7 @@
"Mipangilio ya matumizi ya programu"
"Ondoa zote"
"Programu za hivi karibuni"
-
-
+ "Jukumu Limefungwa"
"%1$s, %2$s"
"< dak 1"
"Umebakisha %1$s leo"
@@ -103,6 +102,8 @@
"Nyuma"
"Kibadilishaji cha IME"
"Vilivyotumika majuzi"
+ "Arifa"
+ "Mipangilio ya Haraka"
"Sogeza juu/kushoto"
"Sogeza chini/kulia"
diff --git a/quickstep/res/values-sw600dp-land/dimens.xml b/quickstep/res/values-sw600dp-land/dimens.xml
new file mode 100644
index 0000000000..4e3c02cd77
--- /dev/null
+++ b/quickstep/res/values-sw600dp-land/dimens.xml
@@ -0,0 +1,22 @@
+
+
+ 19.1dp
+ 10dp
+ 52dp
+ 38dp
+
diff --git a/quickstep/res/values-sw600dp/dimens.xml b/quickstep/res/values-sw600dp/dimens.xml
index 5d9e0596b5..223a5e994d 100644
--- a/quickstep/res/values-sw600dp/dimens.xml
+++ b/quickstep/res/values-sw600dp/dimens.xml
@@ -16,4 +16,14 @@
-->
25dp
+
+ 12dp
+ 4dp
+ 36dp
+ 19.37dp
+ 22dp
+ 60dp
+ 36dp
+ 36dp
+ 32dp
diff --git a/quickstep/res/values-sw720dp/dimens.xml b/quickstep/res/values-sw720dp/dimens.xml
index 2831a6f7f5..05e269b17d 100644
--- a/quickstep/res/values-sw720dp/dimens.xml
+++ b/quickstep/res/values-sw720dp/dimens.xml
@@ -16,6 +16,5 @@
-->
44dp
- 44dp
- 44dp
+ 44dp
diff --git a/quickstep/res/values-ta/strings.xml b/quickstep/res/values-ta/strings.xml
index c67b6b7da7..ebf5eb2627 100644
--- a/quickstep/res/values-ta/strings.xml
+++ b/quickstep/res/values-ta/strings.xml
@@ -25,8 +25,7 @@
"ஆப்ஸ் உபயோக அமைப்புகள்"
"எல்லாம் அழி"
"சமீபத்திய ஆப்ஸ்"
-
-
+ "பணி முடிந்தது"
"%1$s, %2$s"
"< 1 நி"
"இன்று %1$s மீதமுள்ளது"
@@ -103,6 +102,8 @@
"பின்செல்லும்"
"IME சுவிட்ச்சர்"
"சமீபத்தியவை"
+ "அறிவிப்புகள்"
+ "விரைவு அமைப்புகள்"
"மேலே/இடதுபுறம் நகர்த்தும்"
"கீழே/வலதுபுறம் நகர்த்தும்"
diff --git a/quickstep/res/values-te/strings.xml b/quickstep/res/values-te/strings.xml
index 19236e9129..8f43b3c385 100644
--- a/quickstep/res/values-te/strings.xml
+++ b/quickstep/res/values-te/strings.xml
@@ -25,8 +25,7 @@
"యాప్ వినియోగ సెట్టింగ్లు"
"అన్నీ తీసివేయండి"
"ఇటీవలి యాప్లు"
-
-
+ "టాస్క్ మూసివేయబడింది"
"%1$s, %2$s"
"< 1 నిమిషం"
"నేటికి %1$s మిగిలి ఉంది"
@@ -103,6 +102,8 @@
"వెనుకకు"
"IME స్విచ్చర్"
"ఇటీవలివి"
+ "నోటిఫికేషన్లు"
+ "క్విక్ సెట్టింగ్లు"
"ఎగువ/ఎడమ వైపునకు తరలించండి"
"దిగువ/కుడి వైపునకు తరలించండి"
diff --git a/quickstep/res/values-th/strings.xml b/quickstep/res/values-th/strings.xml
index d91c016e29..62ab2d2c6c 100644
--- a/quickstep/res/values-th/strings.xml
+++ b/quickstep/res/values-th/strings.xml
@@ -25,8 +25,7 @@
"การตั้งค่าการใช้แอป"
"ล้างทั้งหมด"
"แอปล่าสุด"
-
-
+ "ปิดงานแล้ว"
"%1$s %2$s"
"<1 นาที"
"วันนี้เหลืออีก %1$s"
@@ -103,6 +102,8 @@
"กลับ"
"ตัวเปลี่ยน IME"
"ล่าสุด"
+ "การแจ้งเตือน"
+ "การตั้งค่าด่วน"
"ย้ายไปที่ด้านบนหรือด้านซ้าย"
"ย้ายไปที่ด้านล่างหรือด้านขวา"
diff --git a/quickstep/res/values-tl/strings.xml b/quickstep/res/values-tl/strings.xml
index cc457c0cfb..3ecae96b30 100644
--- a/quickstep/res/values-tl/strings.xml
+++ b/quickstep/res/values-tl/strings.xml
@@ -25,8 +25,7 @@
"Mga setting ng paggamit ng app"
"I-clear lahat"
"Mga kamakailang app"
-
-
+ "Isinara ang Gawain"
"%1$s, %2$s"
"< 1 min"
"%1$s na lang ngayon"
@@ -103,6 +102,10 @@
"Bumalik"
"IME switcher"
"Mga Kamakailan"
+
+
+
+
"Ilipat sa itaas/kaliwa"
"Ilipat sa ibaba/kanan"
diff --git a/quickstep/res/values-tr/strings.xml b/quickstep/res/values-tr/strings.xml
index e0ef9b72f7..19ced47d01 100644
--- a/quickstep/res/values-tr/strings.xml
+++ b/quickstep/res/values-tr/strings.xml
@@ -25,8 +25,7 @@
"Uygulama kullanım ayarları"
"Tümünü temizle"
"Son uygulamalar"
-
-
+ "Görev Kapatıldı"
"%1$s, %2$s"
"< 1 dk."
"Bugün %1$s kaldı"
@@ -103,6 +102,10 @@
"Geri"
"IME değiştirici"
"Son Kullanılanlar"
+
+
+
+
"Sol üste taşı"
"Sağ alta taşı"
diff --git a/quickstep/res/values-uk/strings.xml b/quickstep/res/values-uk/strings.xml
index e376938780..231d128aca 100644
--- a/quickstep/res/values-uk/strings.xml
+++ b/quickstep/res/values-uk/strings.xml
@@ -25,8 +25,7 @@
"Налаштування використання додатка"
"Очистити все"
"Нещодавні додатки"
-
-
+ "Завдання закрито"
"%1$s, %2$s"
"< 1 хв"
"Сьогодні залишилося %1$s"
@@ -103,6 +102,10 @@
"Назад"
"Перемикач IME"
"Нещодавні"
+
+
+
+
"Перемістити вгору або вліво"
"Перемістити вниз або вправо"
diff --git a/quickstep/res/values-ur/strings.xml b/quickstep/res/values-ur/strings.xml
index 380d470b31..2b055acf02 100644
--- a/quickstep/res/values-ur/strings.xml
+++ b/quickstep/res/values-ur/strings.xml
@@ -25,8 +25,7 @@
"ایپ کے استعمال کی ترتیبات"
"سبھی کو صاف کریں"
"حالیہ ایپس"
-
-
+ "ٹاسک بند ہے"
"%1$s،%2$s"
"< 1 منٹ"
"آج %1$s بچا ہے"
@@ -103,6 +102,8 @@
"پیچھے"
"IME سوئچر"
"حالیہ"
+ "اطلاعات"
+ "فوری ترتیبات"
"اوپر/بائیں طرف منتقل کریں"
"نیچے/دائیں طرف منتقل کریں"
diff --git a/quickstep/res/values-uz/strings.xml b/quickstep/res/values-uz/strings.xml
index 9374fc75f3..3b9853f787 100644
--- a/quickstep/res/values-uz/strings.xml
+++ b/quickstep/res/values-uz/strings.xml
@@ -25,8 +25,7 @@
"Ilovadan foydalanish sozlamalari"
"Hammasini tozalash"
"Yaqinda ishlatilgan ilovalar"
-
-
+ "Vazifalar yopildi"
"%1$s, %2$s"
"< 1 daqiqa"
"Bugun %1$s qoldi"
@@ -103,6 +102,8 @@
"Orqaga"
"IME tugmasi"
"Oxirgilar"
+ "Bildirishnomalar"
+ "Tezkor sozlamalar"
"Yuqoriga yoki chapga oʻtkazish"
"Pastga yoki oʻngga oʻtkazish"
diff --git a/quickstep/res/values-vi/strings.xml b/quickstep/res/values-vi/strings.xml
index 12cf3cbaa7..1072c3a17a 100644
--- a/quickstep/res/values-vi/strings.xml
+++ b/quickstep/res/values-vi/strings.xml
@@ -25,8 +25,7 @@
"Cài đặt mức sử dụng ứng dụng"
"Xóa tất cả"
"Ứng dụng gần đây"
-
-
+ "Đã đóng tác vụ"
"%1$s, %2$s"
"< 1 phút"
"Hôm nay còn %1$s"
@@ -103,6 +102,10 @@
"Quay lại"
"Trình chuyển đổi IME"
"Gần đây"
+
+
+
+
"Chuyển lên trên cùng/sang bên trái"
"Chuyển xuống dưới cùng/sang bên phải"
diff --git a/quickstep/res/values-zh-rCN/strings.xml b/quickstep/res/values-zh-rCN/strings.xml
index 8c0549924f..4587d58778 100644
--- a/quickstep/res/values-zh-rCN/strings.xml
+++ b/quickstep/res/values-zh-rCN/strings.xml
@@ -25,8 +25,7 @@
"应用使用设置"
"全部清除"
"最近用过的应用"
-
-
+ "任务已关闭"
"%1$s(%2$s)"
"不到 1 分钟"
"今天还可使用 %1$s"
@@ -103,6 +102,10 @@
"返回"
"IME 切换器"
"最近用过"
+
+
+
+
"移到顶部/左侧"
"移到底部/右侧"
diff --git a/quickstep/res/values-zh-rHK/strings.xml b/quickstep/res/values-zh-rHK/strings.xml
index a0d95c9f65..2810771d2f 100644
--- a/quickstep/res/values-zh-rHK/strings.xml
+++ b/quickstep/res/values-zh-rHK/strings.xml
@@ -25,8 +25,7 @@
"應用程式使用情況設定"
"全部清除"
"最近使用的應用程式"
-
-
+ "閂咗工作"
"%1$s,%2$s"
"少於 1 分鐘"
"今天剩餘時間:%1$s"
@@ -103,6 +102,10 @@
"返回"
"輸入法編輯器切換工具"
"最近"
+
+
+
+
"移至上方/左側"
"移至底部/右側"
diff --git a/quickstep/res/values-zh-rTW/strings.xml b/quickstep/res/values-zh-rTW/strings.xml
index 45e2f75631..847cb91507 100644
--- a/quickstep/res/values-zh-rTW/strings.xml
+++ b/quickstep/res/values-zh-rTW/strings.xml
@@ -25,8 +25,7 @@
"應用程式使用情況設定"
"全部清除"
"最近使用的應用程式"
-
-
+ "工作已關閉"
"%1$s (%2$s)"
"< 1 分鐘"
"今天還能使用 %1$s"
@@ -103,6 +102,10 @@
"返回"
"輸入法編輯器切換器"
"最近使用"
+
+
+
+
"移到上方/左側"
"移到底部/右側"
diff --git a/quickstep/res/values-zu/strings.xml b/quickstep/res/values-zu/strings.xml
index 85c43ede80..98ea6d7b96 100644
--- a/quickstep/res/values-zu/strings.xml
+++ b/quickstep/res/values-zu/strings.xml
@@ -25,8 +25,7 @@
"Izilungiselelo zokusetshenziswa kohlelo lokusebenza"
"Sula konke"
"Izinhlelo zokusebenza zakamuva"
-
-
+ "Umsebenzi Uvaliwe"
"%1$s, %2$s"
"< 1 iminithi"
"%1$s esele namhlanje"
@@ -103,6 +102,8 @@
"Emuva"
"Isishintshi se-IME"
"Okwakamuva"
+ "Izaziso"
+ "Amasethingi Asheshayo"
"Hamba phezulu/kwesokunxele"
"Hamba phansi/kwesokudla"
diff --git a/quickstep/res/values/dimens.xml b/quickstep/res/values/dimens.xml
index a52e480476..926e10c8b7 100644
--- a/quickstep/res/values/dimens.xml
+++ b/quickstep/res/values/dimens.xml
@@ -17,7 +17,6 @@
48dp
48dp
- 32dp
2dp
@@ -34,28 +33,18 @@
50dp
16dp
- 12dp
- 4dp
+ 0dp
- 0.7
48dp
32dp
- 36dp
- 28dp
- 19.37dp
- 22dp
- 19.1dp
- 10dp
+ 28dp
+ 28dp
8dp
16dp
- 60dp
- 52dp
- 36dp
16dp
- 36dp
- 38dp
2.25dp
diff --git a/quickstep/src/com/android/launcher3/model/QuickstepModelDelegate.java b/quickstep/src/com/android/launcher3/model/QuickstepModelDelegate.java
index 0e534f4ea9..8424564459 100644
--- a/quickstep/src/com/android/launcher3/model/QuickstepModelDelegate.java
+++ b/quickstep/src/com/android/launcher3/model/QuickstepModelDelegate.java
@@ -15,6 +15,20 @@
*/
package com.android.launcher3.model;
+import static android.app.admin.DevicePolicyResources.Strings.Launcher.ALL_APPS_PERSONAL_TAB;
+import static android.app.admin.DevicePolicyResources.Strings.Launcher.ALL_APPS_PERSONAL_TAB_ACCESSIBILITY;
+import static android.app.admin.DevicePolicyResources.Strings.Launcher.ALL_APPS_WORK_TAB;
+import static android.app.admin.DevicePolicyResources.Strings.Launcher.ALL_APPS_WORK_TAB_ACCESSIBILITY;
+import static android.app.admin.DevicePolicyResources.Strings.Launcher.DISABLED_BY_ADMIN_MESSAGE;
+import static android.app.admin.DevicePolicyResources.Strings.Launcher.WIDGETS_PERSONAL_TAB;
+import static android.app.admin.DevicePolicyResources.Strings.Launcher.WIDGETS_WORK_TAB;
+import static android.app.admin.DevicePolicyResources.Strings.Launcher.WORK_FOLDER_NAME;
+import static android.app.admin.DevicePolicyResources.Strings.Launcher.WORK_PROFILE_EDU;
+import static android.app.admin.DevicePolicyResources.Strings.Launcher.WORK_PROFILE_EDU_ACCEPT;
+import static android.app.admin.DevicePolicyResources.Strings.Launcher.WORK_PROFILE_ENABLE_BUTTON;
+import static android.app.admin.DevicePolicyResources.Strings.Launcher.WORK_PROFILE_PAUSED_DESCRIPTION;
+import static android.app.admin.DevicePolicyResources.Strings.Launcher.WORK_PROFILE_PAUSED_TITLE;
+import static android.app.admin.DevicePolicyResources.Strings.Launcher.WORK_PROFILE_PAUSE_BUTTON;
import static android.text.format.DateUtils.DAY_IN_MILLIS;
import static android.text.format.DateUtils.formatElapsedTime;
@@ -32,6 +46,7 @@ import static com.android.launcher3.util.Executors.MODEL_EXECUTOR;
import static java.util.stream.Collectors.toCollection;
import android.app.StatsManager;
+import android.app.admin.DevicePolicyManager;
import android.app.prediction.AppPredictionContext;
import android.app.prediction.AppPredictionManager;
import android.app.prediction.AppPredictor;
@@ -135,6 +150,42 @@ public class QuickstepModelDelegate extends ModelDelegate {
mActive = true;
}
+ @Override
+ @WorkerThread
+ public void loadStringCache(StringCache cache) {
+ cache.loadDefaultStrings(mContext);
+
+ cache.workProfileEdu = getEnterpriseString(WORK_PROFILE_EDU, cache.workProfileEdu);
+ cache.workProfileEduAccept = getEnterpriseString(
+ WORK_PROFILE_EDU_ACCEPT, cache.workProfileEduAccept);
+ cache.workProfilePausedTitle = getEnterpriseString(
+ WORK_PROFILE_PAUSED_TITLE, cache.workProfilePausedTitle);
+ cache.workProfilePausedDescription = getEnterpriseString(
+ WORK_PROFILE_PAUSED_DESCRIPTION, cache.workProfilePausedDescription);
+ cache.workProfilePauseButton = getEnterpriseString(
+ WORK_PROFILE_PAUSE_BUTTON, cache.workProfilePauseButton);
+ cache.workProfileEnableButton = getEnterpriseString(
+ WORK_PROFILE_ENABLE_BUTTON, cache.workProfileEnableButton);
+ cache.allAppsWorkTab = getEnterpriseString(ALL_APPS_WORK_TAB, cache.allAppsWorkTab);
+ cache.allAppsPersonalTab = getEnterpriseString(
+ ALL_APPS_PERSONAL_TAB, cache.allAppsPersonalTab);
+ cache.allAppsWorkTabAccessibility = getEnterpriseString(
+ ALL_APPS_WORK_TAB_ACCESSIBILITY, cache.allAppsWorkTabAccessibility);
+ cache.allAppsPersonalTabAccessibility = getEnterpriseString(
+ ALL_APPS_PERSONAL_TAB_ACCESSIBILITY, cache.allAppsPersonalTabAccessibility);
+ cache.workFolderName = getEnterpriseString(WORK_FOLDER_NAME, cache.workFolderName);
+ cache.widgetsWorkTab = getEnterpriseString(WIDGETS_WORK_TAB, cache.widgetsWorkTab);
+ cache.widgetsPersonalTab = getEnterpriseString(
+ WIDGETS_PERSONAL_TAB, cache.widgetsPersonalTab);
+ cache.disabledByAdminMessage = getEnterpriseString(
+ DISABLED_BY_ADMIN_MESSAGE, cache.disabledByAdminMessage);
+ }
+
+ private String getEnterpriseString(String updatableStringId, String defaultString) {
+ DevicePolicyManager dpm = mContext.getSystemService(DevicePolicyManager.class);
+ return dpm.getString(updatableStringId, () -> defaultString);
+ }
+
@Override
public void workspaceLoadComplete() {
super.workspaceLoadComplete();
diff --git a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java
index 224c05e89e..650d4ce376 100644
--- a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java
@@ -106,6 +106,10 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT
private static final String NAV_BUTTONS_SEPARATE_WINDOW_TITLE = "Taskbar Nav Buttons";
+ public static final int ALPHA_INDEX_IMMERSIVE_MODE = 0;
+ public static final int ALPHA_INDEX_KEYGUARD_OR_DISABLE = 1;
+ private static final int NUM_ALPHA_CHANNELS = 2;
+
private final ArrayList mPropertyHolders = new ArrayList<>();
private final ArrayList mAllButtons = new ArrayList<>();
private int mState;
@@ -136,10 +140,13 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT
// Initialized in init.
private TaskbarControllers mControllers;
+ private boolean mIsImeRenderingNavButtons;
private View mA11yButton;
private int mSysuiStateFlags;
private View mBackButton;
private View mHomeButton;
+ private MultiValueAlpha mBackButtonAlpha;
+ private MultiValueAlpha mHomeButtonAlpha;
private FloatingRotationButton mFloatingRotationButton;
// Variables for moving nav buttons to a separate window above IME
@@ -168,20 +175,23 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT
mNavButtonTranslationYMultiplier.value = 1;
boolean isThreeButtonNav = mContext.isThreeButtonNav();
- // IME switcher
- View imeSwitcherButton = addButton(R.drawable.ic_ime_switcher, BUTTON_IME_SWITCH,
- isThreeButtonNav ? mStartContextualContainer : mEndContextualContainer,
- mControllers.navButtonController, R.id.ime_switcher);
- mPropertyHolders.add(new StatePropertyHolder(imeSwitcherButton,
- flags -> ((flags & MASK_IME_SWITCHER_VISIBLE) == MASK_IME_SWITCHER_VISIBLE)
- && ((flags & FLAG_ROTATION_BUTTON_VISIBLE) == 0)));
+ mIsImeRenderingNavButtons =
+ InputMethodService.canImeRenderGesturalNavButtons() && mContext.isGestureNav();
+ if (!mIsImeRenderingNavButtons) {
+ // IME switcher
+ View imeSwitcherButton = addButton(R.drawable.ic_ime_switcher, BUTTON_IME_SWITCH,
+ isThreeButtonNav ? mStartContextualContainer : mEndContextualContainer,
+ mControllers.navButtonController, R.id.ime_switcher);
+ mPropertyHolders.add(new StatePropertyHolder(imeSwitcherButton,
+ flags -> ((flags & MASK_IME_SWITCHER_VISIBLE) == MASK_IME_SWITCHER_VISIBLE)
+ && ((flags & FLAG_ROTATION_BUTTON_VISIBLE) == 0)));
+ }
mPropertyHolders.add(new StatePropertyHolder(
mControllers.taskbarViewController.getTaskbarIconAlpha()
.getProperty(ALPHA_INDEX_KEYGUARD),
flags -> (flags & FLAG_KEYGUARD_VISIBLE) == 0
- && (flags & FLAG_SCREEN_PINNING_ACTIVE) == 0,
- MultiValueAlpha.VALUE, 1, 0));
+ && (flags & FLAG_SCREEN_PINNING_ACTIVE) == 0));
mPropertyHolders.add(new StatePropertyHolder(mControllers.taskbarDragLayerController
.getKeyguardBgTaskbar(),
@@ -204,8 +214,8 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT
// For gesture nav, nav buttons only show for IME anyway so keep them translated down.
float defaultButtonTransY = alwaysShowButtons ? 0 : transForIme;
mPropertyHolders.add(new StatePropertyHolder(mTaskbarNavButtonTranslationYForIme,
- flags -> (flags & FLAG_IME_VISIBLE) != 0, AnimatedFloat.VALUE, transForIme,
- defaultButtonTransY));
+ flags -> (flags & FLAG_IME_VISIBLE) != 0 && !isInKidsMode, AnimatedFloat.VALUE,
+ transForIme, defaultButtonTransY));
if (alwaysShowButtons) {
initButtons(mNavButtonContainer, mEndContextualContainer,
@@ -314,12 +324,14 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT
mControllers.rotationButtonController.setRotationButton(mFloatingRotationButton,
mRotationButtonListener);
- View imeDownButton = addButton(R.drawable.ic_sysbar_back, BUTTON_BACK,
- mStartContextualContainer, mControllers.navButtonController, R.id.back);
- imeDownButton.setRotation(Utilities.isRtl(mContext.getResources()) ? 90 : -90);
- // Rotate when Ime visible
- mPropertyHolders.add(new StatePropertyHolder(imeDownButton,
- flags -> (flags & FLAG_IME_VISIBLE) != 0));
+ if (!mIsImeRenderingNavButtons) {
+ View imeDownButton = addButton(R.drawable.ic_sysbar_back, BUTTON_BACK,
+ mStartContextualContainer, mControllers.navButtonController, R.id.back);
+ imeDownButton.setRotation(Utilities.isRtl(mContext.getResources()) ? 90 : -90);
+ // Only show when IME is visible.
+ mPropertyHolders.add(new StatePropertyHolder(imeDownButton,
+ flags -> (flags & FLAG_IME_VISIBLE) != 0));
+ }
}
applyState();
@@ -347,7 +359,10 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT
mBackButton = addButton(R.drawable.ic_sysbar_back, BUTTON_BACK,
mNavButtonContainer, mControllers.navButtonController, R.id.back);
- mPropertyHolders.add(new StatePropertyHolder(mBackButton,
+ mBackButtonAlpha = new MultiValueAlpha(mBackButton, NUM_ALPHA_CHANNELS);
+ mBackButtonAlpha.setUpdateVisibility(true);
+ mPropertyHolders.add(new StatePropertyHolder(
+ mBackButtonAlpha.getProperty(ALPHA_INDEX_KEYGUARD_OR_DISABLE),
flags -> {
// Show only if not disabled, and if not on the keyguard or otherwise only when
// the bouncer or a lockscreen app is showing above the keyguard
@@ -373,7 +388,11 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT
// home and recents buttons
mHomeButton = addButton(R.drawable.ic_sysbar_home, BUTTON_HOME, navContainer,
navButtonController, R.id.home);
- mPropertyHolders.add(new StatePropertyHolder(mHomeButton,
+ mHomeButtonAlpha = new MultiValueAlpha(mHomeButton, NUM_ALPHA_CHANNELS);
+ mHomeButtonAlpha.setUpdateVisibility(true);
+ mPropertyHolders.add(
+ new StatePropertyHolder(mHomeButtonAlpha.getProperty(
+ ALPHA_INDEX_KEYGUARD_OR_DISABLE),
flags -> (flags & FLAG_KEYGUARD_VISIBLE) == 0 &&
(flags & FLAG_DISABLE_HOME) == 0));
View recentsButton = addButton(R.drawable.ic_sysbar_recent, BUTTON_RECENTS,
@@ -486,6 +505,20 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT
}
}
+ /**
+ * Returns multi-value alpha controller for back button.
+ */
+ public MultiValueAlpha getBackButtonAlpha() {
+ return mBackButtonAlpha;
+ }
+
+ /**
+ * Returns multi-value alpha controller for home button.
+ */
+ public MultiValueAlpha getHomeButtonAlpha() {
+ return mHomeButtonAlpha;
+ }
+
/** Use to set the translationY for the all nav+contextual buttons */
public AnimatedFloat getTaskbarNavButtonTranslationY() {
return mTaskbarNavButtonTranslationY;
@@ -592,7 +625,7 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT
return;
}
- if (InputMethodService.canImeRenderGesturalNavButtons() && mContext.isGestureNav()) {
+ if (mIsImeRenderingNavButtons) {
// IME is rendering the nav buttons, so we don't need to create a new layer for them.
return;
}
@@ -778,6 +811,11 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT
mAnimator.addListener(new AlphaUpdateListener(view));
}
+ StatePropertyHolder(MultiValueAlpha.AlphaProperty alphaProperty,
+ IntPredicate enableCondition) {
+ this(alphaProperty, enableCondition, MultiValueAlpha.VALUE, 1, 0);
+ }
+
StatePropertyHolder(T target, IntPredicate enabledCondition,
Property property, float enabledValue, float disabledValue) {
mEnableCondition = enabledCondition;
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
index e37bd21a68..6a59bc2a2d 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
@@ -188,7 +188,8 @@ public class TaskbarActivityContext extends ContextThemeWrapper implements Activ
new TaskbarStashController(this),
new TaskbarEduController(this),
new TaskbarAutohideSuspendController(this),
- new TaskbarPopupController(this));
+ new TaskbarPopupController(this),
+ new TaskbarForceVisibleImmersiveController(this));
}
public void init(TaskbarSharedState sharedState) {
@@ -417,6 +418,7 @@ public class TaskbarActivityContext extends ContextThemeWrapper implements Activ
mControllers.taskbarScrimViewController.updateStateForSysuiFlags(systemUiStateFlags,
fromInit);
mControllers.navButtonController.updateSysuiFlags(systemUiStateFlags);
+ mControllers.taskbarForceVisibleImmersiveController.updateSysuiFlags(systemUiStateFlags);
}
/**
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java
index f4916698d9..8364137a82 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java
@@ -47,6 +47,7 @@ public class TaskbarControllers {
public final TaskbarEduController taskbarEduController;
public final TaskbarAutohideSuspendController taskbarAutohideSuspendController;
public final TaskbarPopupController taskbarPopupController;
+ public final TaskbarForceVisibleImmersiveController taskbarForceVisibleImmersiveController;
@Nullable private LoggableTaskbarController[] mControllersToLog = null;
@@ -70,7 +71,8 @@ public class TaskbarControllers {
TaskbarStashController taskbarStashController,
TaskbarEduController taskbarEduController,
TaskbarAutohideSuspendController taskbarAutoHideSuspendController,
- TaskbarPopupController taskbarPopupController) {
+ TaskbarPopupController taskbarPopupController,
+ TaskbarForceVisibleImmersiveController taskbarForceVisibleImmersiveController) {
this.taskbarActivityContext = taskbarActivityContext;
this.taskbarDragController = taskbarDragController;
this.navButtonController = navButtonController;
@@ -86,6 +88,7 @@ public class TaskbarControllers {
this.taskbarEduController = taskbarEduController;
this.taskbarAutohideSuspendController = taskbarAutoHideSuspendController;
this.taskbarPopupController = taskbarPopupController;
+ this.taskbarForceVisibleImmersiveController = taskbarForceVisibleImmersiveController;
}
/**
@@ -108,6 +111,7 @@ public class TaskbarControllers {
taskbarStashController.init(this, sharedState);
taskbarEduController.init(this);
taskbarPopupController.init(this);
+ taskbarForceVisibleImmersiveController.init(this);
mControllersToLog = new LoggableTaskbarController[] {
taskbarDragController, navButtonController, navbarButtonsViewController,
@@ -142,6 +146,7 @@ public class TaskbarControllers {
stashedHandleViewController.onDestroy();
taskbarAutohideSuspendController.onDestroy();
taskbarPopupController.onDestroy();
+ taskbarForceVisibleImmersiveController.onDestroy();
mControllersToLog = null;
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayer.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayer.java
index df004ef6e4..4a806650a5 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayer.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayer.java
@@ -34,7 +34,6 @@ import com.android.launcher3.AbstractFloatingView;
import com.android.launcher3.R;
import com.android.launcher3.testing.TestLogging;
import com.android.launcher3.testing.TestProtocol;
-import com.android.launcher3.util.TouchController;
import com.android.launcher3.views.BaseDragLayer;
import com.android.systemui.shared.system.ViewTreeObserverWrapper;
import com.android.systemui.shared.system.ViewTreeObserverWrapper.InsetsInfo;
@@ -105,7 +104,7 @@ public class TaskbarDragLayer extends BaseDragLayer {
@Override
public void recreateControllers() {
- mControllers = new TouchController[] {mActivity.getDragController()};
+ mControllers = mControllerCallbacks.getTouchControllers();
}
private void onComputeTaskbarInsets(InsetsInfo insetsInfo) {
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayerController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayerController.java
index fa409923c4..1bd76b99bb 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayerController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayerController.java
@@ -26,6 +26,7 @@ import android.graphics.Rect;
import com.android.launcher3.AbstractFloatingView;
import com.android.launcher3.R;
import com.android.launcher3.anim.AlphaUpdateListener;
+import com.android.launcher3.util.TouchController;
import com.android.quickstep.AnimatedFloat;
import com.android.systemui.shared.system.ViewTreeObserverWrapper.InsetsInfo;
@@ -181,7 +182,8 @@ public class TaskbarDragLayerController implements TaskbarControllers.LoggableTa
// Let touches pass through us.
insetsInfo.setTouchableInsets(TOUCHABLE_INSETS_REGION);
} else if (mControllers.taskbarViewController.areIconsVisible()
- || AbstractFloatingView.getOpenView(mActivity, TYPE_ALL) != null) {
+ || AbstractFloatingView.getOpenView(mActivity, TYPE_ALL) != null
+ || mActivity.isNavBarKidsModeActive()) {
// Taskbar has some touchable elements, take over the full taskbar area
insetsInfo.setTouchableInsets(mActivity.isTaskbarWindowFullscreen()
? TOUCHABLE_INSETS_FRAME : TOUCHABLE_INSETS_CONTENT);
@@ -217,5 +219,13 @@ public class TaskbarDragLayerController implements TaskbarControllers.LoggableTa
public int getTaskbarBackgroundHeight() {
return mActivity.getDeviceProfile().taskbarSize;
}
+
+ /**
+ * Returns touch controllers.
+ */
+ public TouchController[] getTouchControllers() {
+ return new TouchController[]{mActivity.getDragController(),
+ mControllers.taskbarForceVisibleImmersiveController};
+ }
}
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarForceVisibleImmersiveController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarForceVisibleImmersiveController.java
new file mode 100644
index 0000000000..66a927fdcc
--- /dev/null
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarForceVisibleImmersiveController.java
@@ -0,0 +1,153 @@
+/*
+ * 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.taskbar;
+
+import static com.android.launcher3.taskbar.NavbarButtonsViewController.ALPHA_INDEX_IMMERSIVE_MODE;
+import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_IMMERSIVE_MODE;
+
+import android.os.Handler;
+import android.os.Looper;
+import android.view.MotionEvent;
+
+import com.android.launcher3.util.MultiValueAlpha;
+import com.android.launcher3.util.TouchController;
+import com.android.quickstep.AnimatedFloat;
+
+import java.util.Optional;
+import java.util.function.Consumer;
+
+/**
+ * Controller for taskbar when force visible in immersive mode is set.
+ */
+public class TaskbarForceVisibleImmersiveController implements TouchController {
+ private static final int NAV_BAR_ICONS_DIM_ANIMATION_START_DELAY_MS = 4500;
+ private static final int NAV_BAR_ICONS_DIM_ANIMATION_DURATION_MS = 500;
+ private static final int NAV_BAR_ICONS_UNDIM_ANIMATION_DURATION_MS = 250;
+ private static final float NAV_BAR_ICONS_DIM_PCT = 0.15f;
+ private static final float NAV_BAR_ICONS_UNDIM_PCT = 1f;
+
+ private final TaskbarActivityContext mContext;
+ private final Handler mHandler = new Handler(Looper.getMainLooper());
+ private final Runnable mDimmingRunnable = this::dimIcons;
+ private final Runnable mUndimmingRunnable = this::undimIcons;
+ private final AnimatedFloat mIconAlphaForDimming = new AnimatedFloat(
+ this::updateIconDimmingAlpha);
+ private final Consumer mImmersiveModeAlphaUpdater = alpha -> alpha.getProperty(
+ ALPHA_INDEX_IMMERSIVE_MODE).setValue(mIconAlphaForDimming.value);
+
+ // Initialized in init.
+ private TaskbarControllers mControllers;
+ private boolean mIsImmersiveMode;
+
+ public TaskbarForceVisibleImmersiveController(TaskbarActivityContext context) {
+ mContext = context;
+ }
+
+ /**
+ * Initialize controllers.
+ */
+ public void init(TaskbarControllers controllers) {
+ mControllers = controllers;
+ }
+
+ /** Update values tracked via sysui flags. */
+ public void updateSysuiFlags(int sysuiFlags) {
+ mIsImmersiveMode = (sysuiFlags & SYSUI_STATE_IMMERSIVE_MODE) != 0;
+ if (mContext.isNavBarKidsModeActive()) {
+ if (mIsImmersiveMode) {
+ startIconDimming();
+ } else {
+ startIconUndimming();
+ }
+ }
+ }
+
+ /** Clean up animations. */
+ public void onDestroy() {
+ startIconUndimming();
+ }
+
+ private void startIconUndimming() {
+ mHandler.removeCallbacks(mDimmingRunnable);
+ mHandler.removeCallbacks(mUndimmingRunnable);
+ mHandler.post(mUndimmingRunnable);
+ }
+
+ private void undimIcons() {
+ mIconAlphaForDimming.animateToValue(NAV_BAR_ICONS_UNDIM_PCT).setDuration(
+ NAV_BAR_ICONS_UNDIM_ANIMATION_DURATION_MS).start();
+ }
+
+ private void startIconDimming() {
+ mHandler.removeCallbacks(mDimmingRunnable);
+ mHandler.postDelayed(mDimmingRunnable, NAV_BAR_ICONS_DIM_ANIMATION_START_DELAY_MS);
+ }
+
+ private void dimIcons() {
+ mIconAlphaForDimming.animateToValue(NAV_BAR_ICONS_DIM_PCT).setDuration(
+ NAV_BAR_ICONS_DIM_ANIMATION_DURATION_MS).start();
+ }
+
+ /**
+ * Returns whether the taskbar is always visible in immersive mode.
+ */
+ private boolean isNavbarShownInImmersiveMode() {
+ return mIsImmersiveMode && mContext.isNavBarKidsModeActive();
+ }
+
+ private void updateIconDimmingAlpha() {
+ getBackButtonAlphaOptional().ifPresent(mImmersiveModeAlphaUpdater);
+ getHomeButtonAlphaOptional().ifPresent(mImmersiveModeAlphaUpdater);
+ }
+
+ private Optional getBackButtonAlphaOptional() {
+ if (mControllers == null || mControllers.navbarButtonsViewController == null) {
+ return Optional.empty();
+ }
+ return Optional.ofNullable(mControllers.navbarButtonsViewController.getBackButtonAlpha());
+ }
+
+ private Optional getHomeButtonAlphaOptional() {
+ if (mControllers == null || mControllers.navbarButtonsViewController == null) {
+ return Optional.empty();
+ }
+ return Optional.ofNullable(mControllers.navbarButtonsViewController.getHomeButtonAlpha());
+ }
+
+ @Override
+ public boolean onControllerInterceptTouchEvent(MotionEvent ev) {
+ if (!isNavbarShownInImmersiveMode()
+ || mControllers.taskbarStashController.supportsManualStashing()) {
+ return false;
+ }
+ return onControllerTouchEvent(ev);
+ }
+
+ @Override
+ public boolean onControllerTouchEvent(MotionEvent ev) {
+ switch (ev.getAction()) {
+ case MotionEvent.ACTION_DOWN:
+ startIconUndimming();
+ break;
+ case MotionEvent.ACTION_UP:
+ case MotionEvent.ACTION_CANCEL:
+ startIconDimming();
+ break;
+ }
+ return false;
+ }
+}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java
index 748557baeb..014e1727cf 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java
@@ -197,7 +197,7 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba
/**
* Returns whether the user can manually stash the taskbar based on the current device state.
*/
- private boolean supportsManualStashing() {
+ protected boolean supportsManualStashing() {
return supportsVisualStashing()
&& (!Utilities.IS_RUNNING_IN_TEST_HARNESS || supportsStashingForTests());
}
diff --git a/quickstep/src/com/android/launcher3/uioverrides/states/OverviewState.java b/quickstep/src/com/android/launcher3/uioverrides/states/OverviewState.java
index 08d0a80f03..bb133293dd 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/states/OverviewState.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/states/OverviewState.java
@@ -103,7 +103,7 @@ public class OverviewState extends LauncherState {
@Override
public boolean displayOverviewTasksAsGrid(DeviceProfile deviceProfile) {
- return deviceProfile.overviewShowAsGrid;
+ return deviceProfile.isTablet;
}
@Override
diff --git a/quickstep/src/com/android/quickstep/AnimatedFloat.java b/quickstep/src/com/android/quickstep/AnimatedFloat.java
index 6a7d066cd8..6c7a885a1f 100644
--- a/quickstep/src/com/android/quickstep/AnimatedFloat.java
+++ b/quickstep/src/com/android/quickstep/AnimatedFloat.java
@@ -98,6 +98,15 @@ public class AnimatedFloat {
}
}
+ /**
+ * Starts the animation.
+ */
+ public void startAnimation() {
+ if (mValueAnimator != null) {
+ mValueAnimator.start();
+ }
+ }
+
public void cancelAnimation() {
if (mValueAnimator != null) {
mValueAnimator.cancel();
diff --git a/quickstep/src/com/android/quickstep/BaseActivityInterface.java b/quickstep/src/com/android/quickstep/BaseActivityInterface.java
index 0cf9b4c6e2..0f707c0223 100644
--- a/quickstep/src/com/android/quickstep/BaseActivityInterface.java
+++ b/quickstep/src/com/android/quickstep/BaseActivityInterface.java
@@ -215,7 +215,7 @@ public abstract class BaseActivityInterface mGestureBlockedActivities;
+ // Cache for better performance since it doesn't change at runtime.
+ private final boolean mCanImeRenderGesturalNavButtons =
+ InputMethodService.canImeRenderGesturalNavButtons();
private final ArrayList mOnDestroyActions = new ArrayList<>();
@@ -596,7 +599,7 @@ public class RecentsAnimationDeviceState implements
/** Returns whether IME is rendering nav buttons, and IME is currently showing. */
public boolean isImeRenderingNavButtons() {
- return InputMethodService.canImeRenderGesturalNavButtons() && mMode == NO_BUTTON
+ return mCanImeRenderGesturalNavButtons && mMode == NO_BUTTON
&& ((mSystemUiStateFlags & SYSUI_STATE_IME_SHOWING) != 0);
}
diff --git a/quickstep/src/com/android/quickstep/TaskOverlayFactory.java b/quickstep/src/com/android/quickstep/TaskOverlayFactory.java
index 276e1c2a6f..2d1f17c924 100644
--- a/quickstep/src/com/android/quickstep/TaskOverlayFactory.java
+++ b/quickstep/src/com/android/quickstep/TaskOverlayFactory.java
@@ -55,7 +55,6 @@ import com.android.quickstep.views.TaskView;
import com.android.quickstep.views.TaskView.TaskIdAttributeContainer;
import com.android.systemui.shared.recents.model.Task;
import com.android.systemui.shared.recents.model.ThumbnailData;
-import com.android.systemui.shared.system.ActivityManagerWrapper;
import java.util.ArrayList;
import java.util.List;
@@ -130,7 +129,7 @@ public class TaskOverlayFactory implements ResourceBasedOverride {
boolean taskViewHasMultipleTasks = taskViewTaskIds[0] != -1 &&
taskViewTaskIds[1] != -1;
boolean notEnoughTasksToSplit = recentsView.getTaskViewCount() < 2;
- boolean isFocusedTask = deviceProfile.overviewShowAsGrid && taskView.isFocusedTask();
+ boolean isFocusedTask = deviceProfile.isTablet && taskView.isFocusedTask();
boolean isTaskInExpectedScrollPosition =
recentsView.isTaskInExpectedScrollPosition(recentsView.indexOfChild(taskView));
ActivityManager activityManager =
diff --git a/quickstep/src/com/android/quickstep/TaskViewUtils.java b/quickstep/src/com/android/quickstep/TaskViewUtils.java
index db1d7e7ea9..5afcdcb41c 100644
--- a/quickstep/src/com/android/quickstep/TaskViewUtils.java
+++ b/quickstep/src/com/android/quickstep/TaskViewUtils.java
@@ -196,7 +196,7 @@ public final class TaskViewUtils {
int taskIndex = recentsView.indexOfChild(v);
Context context = v.getContext();
DeviceProfile dp = BaseActivity.fromContext(context).getDeviceProfile();
- boolean showAsGrid = dp.overviewShowAsGrid;
+ boolean showAsGrid = dp.isTablet;
boolean parallaxCenterAndAdjacentTask =
taskIndex != recentsView.getCurrentPage() && !showAsGrid;
int taskRectTranslationPrimary = recentsView.getScrollOffset(taskIndex);
@@ -551,7 +551,7 @@ public final class TaskViewUtils {
if (launcherClosing) {
Context context = v.getContext();
DeviceProfile dp = BaseActivity.fromContext(context).getDeviceProfile();
- launcherAnim = dp.overviewShowAsGrid
+ launcherAnim = dp.isTablet
? ObjectAnimator.ofFloat(recentsView, RecentsView.CONTENT_ALPHA, 0)
: recentsView.createAdjacentPageAnimForTaskLaunch(taskView);
launcherAnim.setInterpolator(Interpolators.TOUCH_RESPONSE_INTERPOLATOR);
diff --git a/quickstep/src/com/android/quickstep/fallback/RecentsState.java b/quickstep/src/com/android/quickstep/fallback/RecentsState.java
index 15feb18367..9705bb6fd5 100644
--- a/quickstep/src/com/android/quickstep/fallback/RecentsState.java
+++ b/quickstep/src/com/android/quickstep/fallback/RecentsState.java
@@ -135,7 +135,7 @@ public class RecentsState implements BaseState {
* For this state, whether tasks should layout as a grid rather than a list.
*/
public boolean displayOverviewTasksAsGrid(DeviceProfile deviceProfile) {
- return hasFlag(FLAG_SHOW_AS_GRID) && deviceProfile.overviewShowAsGrid;
+ return hasFlag(FLAG_SHOW_AS_GRID) && deviceProfile.isTablet;
}
/**
diff --git a/quickstep/src/com/android/quickstep/views/ClearAllButton.java b/quickstep/src/com/android/quickstep/views/ClearAllButton.java
index 4f2ed4cd82..332cbeb397 100644
--- a/quickstep/src/com/android/quickstep/views/ClearAllButton.java
+++ b/quickstep/src/com/android/quickstep/views/ClearAllButton.java
@@ -247,7 +247,7 @@ public class ClearAllButton extends Button {
*/
private float getOriginalTranslationY() {
DeviceProfile deviceProfile = mActivity.getDeviceProfile();
- return deviceProfile.overviewShowAsGrid
+ return deviceProfile.isTablet
? deviceProfile.overviewRowSpacing
: deviceProfile.overviewTaskThumbnailTopMarginPx / 2.0f;
}
diff --git a/quickstep/src/com/android/quickstep/views/DigitalWellBeingToast.java b/quickstep/src/com/android/quickstep/views/DigitalWellBeingToast.java
index e4f616025f..3757cd9a92 100644
--- a/quickstep/src/com/android/quickstep/views/DigitalWellBeingToast.java
+++ b/quickstep/src/com/android/quickstep/views/DigitalWellBeingToast.java
@@ -17,9 +17,6 @@
package com.android.quickstep.views;
import static android.provider.Settings.ACTION_APP_USAGE_SETTINGS;
-import static android.view.Gravity.BOTTOM;
-import static android.view.Gravity.CENTER_HORIZONTAL;
-import static android.view.Gravity.START;
import static com.android.launcher3.Utilities.prefixTextWithIcon;
import static com.android.launcher3.util.Executors.THREAD_POOL_EXECUTOR;
@@ -170,9 +167,9 @@ public final class DigitalWellBeingToast {
public void setSplitConfiguration(StagedSplitBounds stagedSplitBounds) {
mStagedSplitBounds = stagedSplitBounds;
- if (mStagedSplitBounds == null ||
- !mActivity.getDeviceProfile().overviewShowAsGrid ||
- mTaskView.isFocusedTask()) {
+ if (mStagedSplitBounds == null
+ || !mActivity.getDeviceProfile().isTablet
+ || mTaskView.isFocusedTask()) {
mSplitBannerConfig = SPLIT_BANNER_FULLSCREEN;
return;
}
diff --git a/quickstep/src/com/android/quickstep/views/GroupedTaskView.java b/quickstep/src/com/android/quickstep/views/GroupedTaskView.java
index 7e4f9d0abc..718effe39f 100644
--- a/quickstep/src/com/android/quickstep/views/GroupedTaskView.java
+++ b/quickstep/src/com/android/quickstep/views/GroupedTaskView.java
@@ -236,7 +236,7 @@ public class GroupedTaskView extends TaskView {
public void setOrientationState(RecentsOrientedState orientationState) {
super.setOrientationState(orientationState);
DeviceProfile deviceProfile = mActivity.getDeviceProfile();
- boolean isGridTask = deviceProfile.overviewShowAsGrid && !isFocusedTask();
+ boolean isGridTask = deviceProfile.isTablet && !isFocusedTask();
int iconDrawableSize = isGridTask ? deviceProfile.overviewTaskIconDrawableSizeGridPx
: deviceProfile.overviewTaskIconDrawableSizePx;
mIconView2.setDrawableSize(iconDrawableSize, iconDrawableSize);
diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java
index 13a2bda048..aadf67c60b 100644
--- a/quickstep/src/com/android/quickstep/views/RecentsView.java
+++ b/quickstep/src/com/android/quickstep/views/RecentsView.java
@@ -1322,7 +1322,7 @@ public abstract class RecentsView 1);
+ mActivity.getDeviceProfile().isTablet && getTaskViewCount() > 1);
}
/**
@@ -3986,7 +3986,7 @@ public abstract class RecentsView
32dp
+
+
+ 75dp
+ 62dp
+ 13dp
+ 32dp
+
+
+ 7dp
+
+
+ 0dp
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index e215db99bf..a6c5ed8d75 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -340,22 +340,15 @@
0dp
0dp
0dp
- 0dp
0dp
0dp
- 0dp
0dp
- 0dp
- 0dp
- 0dp
- 0dp
+ 0dp
+ 0dp
0dp
- 0dp
- 0dp
+ 0dp
0dp
0dp
- 0dp
- 0dp
110dp
200dp
diff --git a/src/com/android/launcher3/BubbleTextView.java b/src/com/android/launcher3/BubbleTextView.java
index 5d41741d6c..041bee95a2 100644
--- a/src/com/android/launcher3/BubbleTextView.java
+++ b/src/com/android/launcher3/BubbleTextView.java
@@ -37,6 +37,7 @@ import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.icu.text.MessageFormat;
import android.text.TextPaint;
+import android.text.TextUtils;
import android.text.TextUtils.TruncateAt;
import android.util.AttributeSet;
import android.util.Property;
@@ -805,7 +806,7 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver,
invalidate();
}
}
- if (itemInfo.contentDescription != null) {
+ if (!TextUtils.isEmpty(itemInfo.contentDescription)) {
if (itemInfo.isDisabled()) {
setContentDescription(getContext().getString(R.string.disabled_app_label,
itemInfo.contentDescription));
diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java
index d3486027dd..572b3c2d97 100644
--- a/src/com/android/launcher3/DeviceProfile.java
+++ b/src/com/android/launcher3/DeviceProfile.java
@@ -181,7 +181,6 @@ public class DeviceProfile {
public float allAppsIconTextSizePx;
// Overview
- public final boolean overviewShowAsGrid;
public int overviewTaskMarginPx;
public int overviewTaskMarginGridPx;
public int overviewTaskIconSizePx;
@@ -247,7 +246,7 @@ public class DeviceProfile {
&& FeatureFlags.ENABLE_TASKBAR.get();
// Some more constants.
- context = getContext(context, info, isVerticalBarLayout()
+ context = getContext(context, info, isVerticalBarLayout() || (isTablet && isLandscape)
? Configuration.ORIENTATION_LANDSCAPE
: Configuration.ORIENTATION_PORTRAIT);
final Resources res = context.getResources();
@@ -376,10 +375,7 @@ public class DeviceProfile {
? res.getDimensionPixelSize(R.dimen.scalable_grid_qsb_bottom_margin)
: 0;
- overviewShowAsGrid = isTablet && FeatureFlags.ENABLE_OVERVIEW_GRID.get();
- overviewTaskMarginPx = overviewShowAsGrid
- ? res.getDimensionPixelSize(R.dimen.overview_task_margin_focused)
- : res.getDimensionPixelSize(R.dimen.overview_task_margin);
+ overviewTaskMarginPx = res.getDimensionPixelSize(R.dimen.overview_task_margin);
overviewTaskMarginGridPx = res.getDimensionPixelSize(R.dimen.overview_task_margin_grid);
overviewTaskIconSizePx = res.getDimensionPixelSize(R.dimen.task_thumbnail_icon_size);
overviewTaskIconDrawableSizePx =
@@ -387,32 +383,13 @@ public class DeviceProfile {
overviewTaskIconDrawableSizeGridPx =
res.getDimensionPixelSize(R.dimen.task_thumbnail_icon_drawable_size_grid);
overviewTaskThumbnailTopMarginPx = overviewTaskIconSizePx + overviewTaskMarginPx * 2;
- if (overviewShowAsGrid) {
- if (isLandscape) {
- overviewActionsTopMarginGesturePx = res.getDimensionPixelSize(
- R.dimen.overview_actions_top_margin_gesture_grid_landscape);
- overviewActionsBottomMarginGesturePx = res.getDimensionPixelSize(
- R.dimen.overview_actions_bottom_margin_gesture_grid_landscape);
- overviewPageSpacing = res.getDimensionPixelSize(
- R.dimen.overview_page_spacing_grid_landscape);
- } else {
- overviewActionsTopMarginGesturePx = res.getDimensionPixelSize(
- R.dimen.overview_actions_top_margin_gesture_grid_portrait);
- overviewActionsBottomMarginGesturePx = res.getDimensionPixelSize(
- R.dimen.overview_actions_bottom_margin_gesture_grid_portrait);
- overviewPageSpacing = res.getDimensionPixelSize(
- R.dimen.overview_page_spacing_grid_portrait);
- }
- overviewActionsButtonSpacing = res.getDimensionPixelSize(
- R.dimen.overview_actions_button_spacing_grid);
- } else {
- overviewActionsTopMarginGesturePx = res.getDimensionPixelSize(
- R.dimen.overview_actions_margin_gesture);
- overviewActionsBottomMarginGesturePx = overviewActionsTopMarginGesturePx;
- overviewPageSpacing = res.getDimensionPixelSize(R.dimen.overview_page_spacing);
- overviewActionsButtonSpacing = res.getDimensionPixelSize(
- R.dimen.overview_actions_button_spacing);
- }
+ overviewActionsTopMarginGesturePx = res.getDimensionPixelSize(
+ R.dimen.overview_actions_top_margin_gesture);
+ overviewActionsBottomMarginGesturePx = res.getDimensionPixelSize(
+ R.dimen.overview_actions_bottom_margin_gesture);
+ overviewPageSpacing = res.getDimensionPixelSize(R.dimen.overview_page_spacing);
+ overviewActionsButtonSpacing = res.getDimensionPixelSize(
+ R.dimen.overview_actions_button_spacing);
overviewActionsMarginThreeButtonPx = res.getDimensionPixelSize(
R.dimen.overview_actions_margin_three_button);
// Grid task's top margin is only overviewTaskIconSizePx + overviewTaskMarginGridPx, but
@@ -422,9 +399,7 @@ public class DeviceProfile {
- overviewTaskMarginGridPx;
overviewRowSpacing = res.getDimensionPixelSize(R.dimen.overview_grid_row_spacing)
- extraTopMargin;
- overviewGridSideMargin = isLandscape
- ? res.getDimensionPixelSize(R.dimen.overview_grid_side_margin_landscape)
- : res.getDimensionPixelSize(R.dimen.overview_grid_side_margin_portrait);
+ overviewGridSideMargin = res.getDimensionPixelSize(R.dimen.overview_grid_side_margin);
// Calculate all of the remaining variables.
extraSpace = updateAvailableDimensions(res);
@@ -1196,6 +1171,27 @@ public class DeviceProfile {
writer.println(prefix + pxToDpStr("workspaceTopPadding", workspaceTopPadding));
writer.println(prefix + pxToDpStr("workspaceBottomPadding", workspaceBottomPadding));
writer.println(prefix + pxToDpStr("extraHotseatBottomPadding", extraHotseatBottomPadding));
+
+ writer.println(prefix + pxToDpStr("overviewTaskMarginPx", overviewTaskMarginPx));
+ writer.println(prefix + pxToDpStr("overviewTaskMarginGridPx", overviewTaskMarginGridPx));
+ writer.println(prefix + pxToDpStr("overviewTaskIconSizePx", overviewTaskIconSizePx));
+ writer.println(prefix + pxToDpStr("overviewTaskIconDrawableSizePx",
+ overviewTaskIconDrawableSizePx));
+ writer.println(prefix + pxToDpStr("overviewTaskIconDrawableSizeGridPx",
+ overviewTaskIconDrawableSizeGridPx));
+ writer.println(prefix + pxToDpStr("overviewTaskThumbnailTopMarginPx",
+ overviewTaskThumbnailTopMarginPx));
+ writer.println(prefix + pxToDpStr("overviewActionsMarginThreeButtonPx",
+ overviewActionsMarginThreeButtonPx));
+ writer.println(prefix + pxToDpStr("overviewActionsTopMarginGesturePx",
+ overviewActionsTopMarginGesturePx));
+ writer.println(prefix + pxToDpStr("overviewActionsBottomMarginGesturePx",
+ overviewActionsBottomMarginGesturePx));
+ writer.println(prefix + pxToDpStr("overviewActionsButtonSpacing",
+ overviewActionsButtonSpacing));
+ writer.println(prefix + pxToDpStr("overviewPageSpacing", overviewPageSpacing));
+ writer.println(prefix + pxToDpStr("overviewRowSpacing", overviewRowSpacing));
+ writer.println(prefix + pxToDpStr("overviewGridSideMargin", overviewGridSideMargin));
}
private static Context getContext(Context c, Info info, int orientation) {
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index 84c4783060..59c40ccbe3 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -149,6 +149,7 @@ import com.android.launcher3.model.BgDataModel.Callbacks;
import com.android.launcher3.model.ItemInstallQueue;
import com.android.launcher3.model.ModelUtils;
import com.android.launcher3.model.ModelWriter;
+import com.android.launcher3.model.StringCache;
import com.android.launcher3.model.WidgetsModel;
import com.android.launcher3.model.data.AppInfo;
import com.android.launcher3.model.data.FolderInfo;
@@ -379,6 +380,8 @@ public class Launcher extends StatefulActivity implements Launche
protected InstanceId mAllAppsSessionLogId;
private LauncherState mPrevLauncherState;
+ private StringCache mStringCache;
+
@Override
@TargetApi(Build.VERSION_CODES.S)
protected void onCreate(Bundle savedInstanceState) {
@@ -2872,6 +2875,16 @@ public class Launcher extends StatefulActivity implements Launche
mPopupDataProvider.setAllWidgets(allWidgets);
}
+ @Override
+ public void bindStringCache(StringCache cache) {
+ mStringCache = cache;
+ }
+
+ @Override
+ public StringCache getStringCache() {
+ return mStringCache;
+ }
+
/**
* @param packageUser if null, refreshes all widgets and shortcuts, otherwise only
* refreshes the widgets and shortcuts associated with the given package/user
diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java
index 225460dc98..cbc21eb352 100644
--- a/src/com/android/launcher3/Utilities.java
+++ b/src/com/android/launcher3/Utilities.java
@@ -458,9 +458,10 @@ public final class Utilities {
* Trims the string, removing all whitespace at the beginning and end of the string.
* Non-breaking whitespaces are also removed.
*/
+ @NonNull
public static String trim(CharSequence s) {
if (s == null) {
- return null;
+ return "";
}
// Just strip any sequence of whitespace or java space characters from the beginning and end
diff --git a/src/com/android/launcher3/allapps/BaseAllAppsContainerView.java b/src/com/android/launcher3/allapps/BaseAllAppsContainerView.java
index c1f0e068eb..1253863893 100644
--- a/src/com/android/launcher3/allapps/BaseAllAppsContainerView.java
+++ b/src/com/android/launcher3/allapps/BaseAllAppsContainerView.java
@@ -38,10 +38,10 @@ import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowInsets;
+import android.widget.Button;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import androidx.annotation.StringRes;
import androidx.annotation.VisibleForTesting;
import androidx.core.graphics.ColorUtils;
import androidx.recyclerview.widget.LinearLayoutManager;
@@ -57,6 +57,7 @@ import com.android.launcher3.R;
import com.android.launcher3.Utilities;
import com.android.launcher3.allapps.search.SearchAdapterProvider;
import com.android.launcher3.keyboard.FocusedItemDecorator;
+import com.android.launcher3.model.StringCache;
import com.android.launcher3.model.data.AppInfo;
import com.android.launcher3.util.ItemInfoMatcher;
import com.android.launcher3.util.Themes;
@@ -298,27 +299,34 @@ public abstract class BaseAllAppsContainerView users = workspaceItemInfos.stream().map(w -> w.user)
.collect(Collectors.toSet());
if (users.size() == 1 && !users.contains(Process.myUserHandle())) {
- setAsLastSuggestion(nameInfos,
- context.getResources().getString(R.string.work_folder_name));
+ StringCache cache = ActivityContext.lookupContext(context).getStringCache();
+ String workFolderName = cache != null
+ ? cache.workFolderName : context.getString(R.string.work_folder_name);
+ setAsLastSuggestion(nameInfos, workFolderName);
}
// If all the icons are from same package (e.g., main icon, shortcut, shortcut)
diff --git a/src/com/android/launcher3/model/BaseLoaderResults.java b/src/com/android/launcher3/model/BaseLoaderResults.java
index d270cc56a1..5b278ab4cf 100644
--- a/src/com/android/launcher3/model/BaseLoaderResults.java
+++ b/src/com/android/launcher3/model/BaseLoaderResults.java
@@ -226,6 +226,8 @@ public abstract class BaseLoaderResults {
MODEL_EXECUTOR.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
c.onInitialBindComplete(currentScreenIds, pendingTasks);
}, mUiExecutor);
+
+ mCallbacks.bindStringCache(mBgDataModel.stringCache.clone());
}
private void bindWorkspaceItems(
diff --git a/src/com/android/launcher3/model/BgDataModel.java b/src/com/android/launcher3/model/BgDataModel.java
index 84612def6c..866d18a86b 100644
--- a/src/com/android/launcher3/model/BgDataModel.java
+++ b/src/com/android/launcher3/model/BgDataModel.java
@@ -113,6 +113,11 @@ public class BgDataModel {
*/
public final WidgetsModel widgetsModel = new WidgetsModel();
+ /**
+ * Cache for strings used in launcher
+ */
+ public final StringCache stringCache = new StringCache();
+
/**
* Id when the model was last bound
*/
@@ -505,5 +510,10 @@ public class BgDataModel {
default void bindExtraContainerItems(FixedContainerItems item) { }
default void bindAllApplications(AppInfo[] apps, int flags) { }
+
+ /**
+ * Binds the cache of string resources
+ */
+ default void bindStringCache(StringCache cache) { }
}
}
diff --git a/src/com/android/launcher3/model/LoaderCursor.java b/src/com/android/launcher3/model/LoaderCursor.java
index 739a64ac04..ae5b66ad88 100644
--- a/src/com/android/launcher3/model/LoaderCursor.java
+++ b/src/com/android/launcher3/model/LoaderCursor.java
@@ -202,8 +202,7 @@ public class LoaderCursor extends CursorWrapper {
* Returns the title or empty string
*/
private String getTitle() {
- String title = getString(titleIndex);
- return TextUtils.isEmpty(title) ? "" : Utilities.trim(title);
+ return Utilities.trim(getString(titleIndex));
}
/**
diff --git a/src/com/android/launcher3/model/LoaderTask.java b/src/com/android/launcher3/model/LoaderTask.java
index 2a0f9a6f67..b9fa21d10d 100644
--- a/src/com/android/launcher3/model/LoaderTask.java
+++ b/src/com/android/launcher3/model/LoaderTask.java
@@ -857,6 +857,9 @@ public class LoaderTask implements Runnable {
// Load delegate items
mModelDelegate.loadItems(mUserManagerState, shortcutKeyToPinnedShortcuts);
+ // Load string cache
+ mModelDelegate.loadStringCache(mBgDataModel.stringCache);
+
// Break early if we've stopped loading
if (mStopped) {
mBgDataModel.clear();
diff --git a/src/com/android/launcher3/model/ModelDelegate.java b/src/com/android/launcher3/model/ModelDelegate.java
index 765141a0e2..60ca63bba7 100644
--- a/src/com/android/launcher3/model/ModelDelegate.java
+++ b/src/com/android/launcher3/model/ModelDelegate.java
@@ -48,9 +48,11 @@ public class ModelDelegate implements ResourceBasedOverride {
delegate.mAppsList = appsList;
delegate.mDataModel = dataModel;
delegate.mIsPrimaryInstance = isPrimaryInstance;
+ delegate.mContext = context;
return delegate;
}
+ protected Context mContext;
protected LauncherAppState mApp;
protected AllAppsList mAppsList;
protected BgDataModel mDataModel;
@@ -75,6 +77,15 @@ public class ModelDelegate implements ResourceBasedOverride {
@WorkerThread
public void loadItems(UserManagerState ums, Map pinnedShortcuts) { }
+ /**
+ * Load String cache
+ */
+ @WorkerThread
+ public void loadStringCache(StringCache cache) {
+ cache.loadDefaultStrings(mContext);
+ }
+
+
/**
* Called during loader after workspace loading is complete
*/
diff --git a/src/com/android/launcher3/model/StringCache.java b/src/com/android/launcher3/model/StringCache.java
new file mode 100644
index 0000000000..11d3e70f5f
--- /dev/null
+++ b/src/com/android/launcher3/model/StringCache.java
@@ -0,0 +1,139 @@
+/*
+ * 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.model;
+
+import android.content.Context;
+
+import com.android.launcher3.R;
+
+/**
+ *
+ * Cache for some of the string used in Launcher.
+ */
+public class StringCache {
+
+ /**
+ * User on-boarding title for work profile apps.
+ */
+ public String workProfileEdu;
+
+ /**
+ * Action label to finish work profile edu.
+ */
+ public String workProfileEduAccept;
+
+ /**
+ * Title shown when user opens work apps tab while work profile is paused.
+ */
+ public String workProfilePausedTitle;
+
+ /**
+ * Description shown when user opens work apps tab while work profile is paused.
+ */
+ public String workProfilePausedDescription;
+
+ /**
+ * Shown on the button to pause work profile.
+ */
+ public String workProfilePauseButton;
+
+ /**
+ * Shown on the button to enable work profile.
+ */
+ public String workProfileEnableButton;
+
+ /**
+ * Label on launcher tab to indicate work apps.
+ */
+ public String allAppsWorkTab;
+
+ /**
+ * Label on launcher tab to indicate personal apps.
+ */
+ public String allAppsPersonalTab;
+
+ /**
+ * Accessibility description for launcher tab to indicate work apps.
+ */
+ public String allAppsWorkTabAccessibility;
+
+ /**
+ * Accessibility description for launcher tab to indicate personal apps.
+ */
+ public String allAppsPersonalTabAccessibility;
+
+ /**
+ * Work folder name.
+ */
+ public String workFolderName;
+
+ /**
+ * Label on widget tab to indicate work app widgets.
+ */
+ public String widgetsWorkTab;
+
+ /**
+ * Label on widget tab to indicate personal app widgets.
+ */
+ public String widgetsPersonalTab;
+
+ /**
+ * Message shown when a feature is disabled by the admin (e.g. changing wallpaper).
+ */
+ public String disabledByAdminMessage;
+
+ /**
+ * Sets the default values for the strings.
+ */
+ public void loadDefaultStrings(Context context) {
+ workProfileEdu = context.getString(R.string.work_profile_edu_work_apps);
+ workProfileEduAccept = context.getString(R.string.work_profile_edu_accept);
+ workProfilePausedTitle = context.getString(R.string.work_apps_paused_title);
+ workProfilePausedDescription = context.getString(R.string.work_apps_paused_body);
+ workProfilePauseButton = context.getString(R.string.work_apps_pause_btn_text);
+ workProfileEnableButton = context.getString(R.string.work_apps_enable_btn_text);
+ allAppsWorkTab = context.getString(R.string.all_apps_work_tab);
+ allAppsPersonalTab = context.getString(R.string.all_apps_personal_tab);
+ allAppsWorkTabAccessibility = context.getString(R.string.all_apps_button_work_label);
+ allAppsPersonalTabAccessibility = context.getString(
+ R.string.all_apps_button_personal_label);
+ workFolderName = context.getString(R.string.work_folder_name);
+ widgetsWorkTab = context.getString(R.string.widgets_full_sheet_work_tab);
+ widgetsPersonalTab = context.getString(R.string.widgets_full_sheet_personal_tab);
+ disabledByAdminMessage = context.getString(R.string.msg_disabled_by_admin);
+ }
+
+ @Override
+ public StringCache clone() {
+ StringCache clone = new StringCache();
+ clone.workProfileEdu = this.workProfileEdu;
+ clone.workProfileEduAccept = this.workProfileEduAccept;
+ clone.workProfilePausedTitle = this.workProfilePausedTitle;
+ clone.workProfilePausedDescription = this.workProfilePausedDescription;
+ clone.workProfilePauseButton = this.workProfilePauseButton;
+ clone.workProfileEnableButton = this.workProfileEnableButton;
+ clone.allAppsWorkTab = this.allAppsWorkTab;
+ clone.allAppsPersonalTab = this.allAppsPersonalTab;
+ clone.allAppsWorkTabAccessibility = this.allAppsWorkTabAccessibility;
+ clone.allAppsPersonalTabAccessibility = this.allAppsPersonalTabAccessibility;
+ clone.workFolderName = this.workFolderName;
+ clone.widgetsWorkTab = this.widgetsWorkTab;
+ clone.widgetsPersonalTab = this.widgetsPersonalTab;
+ clone.disabledByAdminMessage = this.disabledByAdminMessage;
+ return clone;
+ }
+}
diff --git a/src/com/android/launcher3/secondarydisplay/SecondaryDisplayLauncher.java b/src/com/android/launcher3/secondarydisplay/SecondaryDisplayLauncher.java
index cba0655b24..73aa296001 100644
--- a/src/com/android/launcher3/secondarydisplay/SecondaryDisplayLauncher.java
+++ b/src/com/android/launcher3/secondarydisplay/SecondaryDisplayLauncher.java
@@ -32,6 +32,7 @@ import com.android.launcher3.LauncherModel;
import com.android.launcher3.R;
import com.android.launcher3.allapps.ActivityAllAppsContainerView;
import com.android.launcher3.model.BgDataModel;
+import com.android.launcher3.model.StringCache;
import com.android.launcher3.model.data.AppInfo;
import com.android.launcher3.model.data.ItemInfo;
import com.android.launcher3.model.data.ItemInfoWithIcon;
@@ -60,6 +61,8 @@ public class SecondaryDisplayLauncher extends BaseDraggingActivity
private boolean mAppDrawerShown = false;
+ private StringCache mStringCache;
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -227,6 +230,16 @@ public class SecondaryDisplayLauncher extends BaseDraggingActivity
PopupContainerWithArrow.dismissInvalidPopup(this);
}
+ @Override
+ public StringCache getStringCache() {
+ return mStringCache;
+ }
+
+ @Override
+ public void bindStringCache(StringCache cache) {
+ mStringCache = cache;
+ }
+
public PopupDataProvider getPopupDataProvider() {
return mPopupDataProvider;
}
diff --git a/src/com/android/launcher3/touch/PortraitPagedViewHandler.java b/src/com/android/launcher3/touch/PortraitPagedViewHandler.java
index 627aa11a3a..01aea05366 100644
--- a/src/com/android/launcher3/touch/PortraitPagedViewHandler.java
+++ b/src/com/android/launcher3/touch/PortraitPagedViewHandler.java
@@ -289,9 +289,9 @@ public class PortraitPagedViewHandler implements PagedOrientationHandler {
@Override
public int getTaskMenuWidth(View view, DeviceProfile deviceProfile) {
- return deviceProfile.isLandscape && !deviceProfile.overviewShowAsGrid ?
- view.getMeasuredHeight() :
- view.getMeasuredWidth();
+ return deviceProfile.isLandscape && !deviceProfile.isTablet
+ ? view.getMeasuredHeight()
+ : view.getMeasuredWidth();
}
@Override
diff --git a/src/com/android/launcher3/touch/WorkspaceTouchListener.java b/src/com/android/launcher3/touch/WorkspaceTouchListener.java
index 20d2ad36a5..93387adb13 100644
--- a/src/com/android/launcher3/touch/WorkspaceTouchListener.java
+++ b/src/com/android/launcher3/touch/WorkspaceTouchListener.java
@@ -21,6 +21,7 @@ import static android.view.MotionEvent.ACTION_MOVE;
import static android.view.MotionEvent.ACTION_POINTER_UP;
import static android.view.MotionEvent.ACTION_UP;
+import static com.android.launcher3.LauncherState.ALL_APPS;
import static com.android.launcher3.LauncherState.NORMAL;
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_WORKSPACE_LONGPRESS;
@@ -150,6 +151,11 @@ public class WorkspaceTouchListener extends GestureDetector.SimpleOnGestureListe
if (action == ACTION_UP || action == ACTION_CANCEL) {
cancelLongPress();
}
+ if (action == ACTION_UP
+ && mLauncher.isInState(ALL_APPS)
+ && mLauncher.getDeviceProfile().isTablet) {
+ mLauncher.getStateManager().goToState(NORMAL);
+ }
return result;
}
diff --git a/src/com/android/launcher3/views/ActivityContext.java b/src/com/android/launcher3/views/ActivityContext.java
index 8b48baeab7..a318363af3 100644
--- a/src/com/android/launcher3/views/ActivityContext.java
+++ b/src/com/android/launcher3/views/ActivityContext.java
@@ -31,6 +31,7 @@ import com.android.launcher3.dragndrop.DragController;
import com.android.launcher3.folder.FolderIcon;
import com.android.launcher3.logger.LauncherAtom;
import com.android.launcher3.logging.StatsLogManager;
+import com.android.launcher3.model.StringCache;
import com.android.launcher3.model.data.ItemInfo;
import com.android.launcher3.popup.PopupDataProvider;
import com.android.launcher3.util.ViewCache;
@@ -173,4 +174,9 @@ public interface ActivityContext {
default PopupDataProvider getPopupDataProvider() {
return null;
}
+
+ @Nullable
+ default StringCache getStringCache() {
+ return null;
+ }
}
diff --git a/src/com/android/launcher3/views/OptionsPopupView.java b/src/com/android/launcher3/views/OptionsPopupView.java
index fc8b4b7edb..95bce31796 100644
--- a/src/com/android/launcher3/views/OptionsPopupView.java
+++ b/src/com/android/launcher3/views/OptionsPopupView.java
@@ -240,7 +240,10 @@ public class OptionsPopupView extends ArrowPopup
private static boolean startWallpaperPicker(View v) {
Launcher launcher = Launcher.getLauncher(v.getContext());
if (!Utilities.isWallpaperAllowed(launcher)) {
- Toast.makeText(launcher, R.string.msg_disabled_by_admin, Toast.LENGTH_SHORT).show();
+ String message = launcher.getStringCache() != null
+ ? launcher.getStringCache().disabledByAdminMessage
+ : launcher.getString(R.string.msg_disabled_by_admin);
+ Toast.makeText(launcher, message, Toast.LENGTH_SHORT).show();
return false;
}
Intent intent = new Intent(Intent.ACTION_SET_WALLPAPER)
diff --git a/src/com/android/launcher3/widget/picker/WidgetsFullSheet.java b/src/com/android/launcher3/widget/picker/WidgetsFullSheet.java
index 894c4c9cd3..daa8fb7889 100644
--- a/src/com/android/launcher3/widget/picker/WidgetsFullSheet.java
+++ b/src/com/android/launcher3/widget/picker/WidgetsFullSheet.java
@@ -41,6 +41,7 @@ import android.view.ViewGroup;
import android.view.WindowInsets;
import android.view.animation.AnimationUtils;
import android.view.animation.Interpolator;
+import android.widget.Button;
import android.widget.TextView;
import androidx.annotation.Nullable;
@@ -199,6 +200,7 @@ public class WidgetsFullSheet extends BaseWidgetSheet
findViewById(R.id.tab_work)
.setOnClickListener((View view) -> mViewPager.snapToPage(1));
mAdapters.get(AdapterHolder.WORK).setup(findViewById(R.id.work_widgets_list_view));
+ setDeviceManagementResources();
} else {
mViewPager = null;
}
@@ -220,6 +222,16 @@ public class WidgetsFullSheet extends BaseWidgetSheet
setUpEducationViewsIfNeeded();
}
+ private void setDeviceManagementResources() {
+ if (mActivityContext.getStringCache() != null) {
+ Button personalTab = findViewById(R.id.tab_personal);
+ personalTab.setText(mActivityContext.getStringCache().widgetsPersonalTab);
+
+ Button workTab = findViewById(R.id.tab_work);
+ workTab.setText(mActivityContext.getStringCache().widgetsWorkTab);
+ }
+ }
+
@Override
public void onActivePageChanged(int currentActivePage) {
AdapterHolder currentAdapterHolder = mAdapters.get(currentActivePage);
diff --git a/tests/src/com/android/launcher3/folder/FolderNameProviderTest.java b/tests/src/com/android/launcher3/folder/FolderNameProviderTest.java
index 23e62356c4..9c15309f82 100644
--- a/tests/src/com/android/launcher3/folder/FolderNameProviderTest.java
+++ b/tests/src/com/android/launcher3/folder/FolderNameProviderTest.java
@@ -30,6 +30,7 @@ import androidx.test.filters.SmallTest;
import com.android.launcher3.model.data.AppInfo;
import com.android.launcher3.model.data.WorkspaceItemInfo;
+import com.android.launcher3.util.ActivityContextWrapper;
import com.android.launcher3.util.Executors;
import org.junit.Before;
@@ -47,7 +48,7 @@ public final class FolderNameProviderTest {
@Before
public void setUp() {
- mContext = getApplicationContext();
+ mContext = new ActivityContextWrapper(getApplicationContext());
mItem1 = new WorkspaceItemInfo(new AppInfo(
new ComponentName("a.b.c", "a.b.c/a.b.c.d"),
"title1",
diff --git a/tests/src/com/android/launcher3/ui/widget/AddConfigWidgetTest.java b/tests/src/com/android/launcher3/ui/widget/AddConfigWidgetTest.java
index 4740097f36..2c9785c93d 100644
--- a/tests/src/com/android/launcher3/ui/widget/AddConfigWidgetTest.java
+++ b/tests/src/com/android/launcher3/ui/widget/AddConfigWidgetTest.java
@@ -33,7 +33,6 @@ import com.android.launcher3.tapl.Widgets;
import com.android.launcher3.testcomponent.WidgetConfigActivity;
import com.android.launcher3.ui.AbstractLauncherUiTest;
import com.android.launcher3.ui.TestViewHelpers;
-import com.android.launcher3.util.rule.ScreenRecordRule.ScreenRecord;
import com.android.launcher3.util.rule.ShellCommandRule;
import com.android.launcher3.widget.LauncherAppWidgetProviderInfo;
@@ -73,7 +72,6 @@ public class AddConfigWidgetTest extends AbstractLauncherUiTest {
@Test
@PortraitLandscape
- @ScreenRecord // b/215672979
public void testConfigCancelled() throws Throwable {
runTest(false);
}