Merge "Fix typo." into main
diff --git a/quickstep/res/values-af/strings.xml b/quickstep/res/values-af/strings.xml
index c71308f..c922238 100644
--- a/quickstep/res/values-af/strings.xml
+++ b/quickstep/res/values-af/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"Vormvry"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"Rekenaar"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"Skuif na eksterne skerm"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"Maak toe"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"Werkskerm"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"Geen onlangse items nie"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"Programgebruikinstellings"</string>
diff --git a/quickstep/res/values-am/strings.xml b/quickstep/res/values-am/strings.xml
index a7b9957..97b0ac7 100644
--- a/quickstep/res/values-am/strings.xml
+++ b/quickstep/res/values-am/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"ነፃ ቅጽ"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"ዴስክቶፕ"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"ወደ ውጫዊ ማሳያ አንቀሳቅስ"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"ዝጋ"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"ዴስክቶፕ"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"ምንም የቅርብ ጊዜ ንጥሎች የሉም"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"የመተግበሪያ አጠቃቀም ቅንብሮች"</string>
diff --git a/quickstep/res/values-az/strings.xml b/quickstep/res/values-az/strings.xml
index ab57177..dab4070 100644
--- a/quickstep/res/values-az/strings.xml
+++ b/quickstep/res/values-az/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"Sərbəst rejim"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"Masaüstü"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"Xarici displeyə köçürün"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"Bağlayın"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"Masaüstü"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"Son elementlər yoxdur"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"Tətbiq istifadə ayarları"</string>
diff --git a/quickstep/res/values-be/strings.xml b/quickstep/res/values-be/strings.xml
index 08d855c..5ea5761 100644
--- a/quickstep/res/values-be/strings.xml
+++ b/quickstep/res/values-be/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"Адвольная форма"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"Працоўны стол"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"Перамясціць на знешні дысплэй"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"Закрыць"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"Працоўны стол"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"Няма новых элементаў"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"Налады выкарыстання праграмы"</string>
diff --git a/quickstep/res/values-bg/strings.xml b/quickstep/res/values-bg/strings.xml
index f67e8e4..5c01d29 100644
--- a/quickstep/res/values-bg/strings.xml
+++ b/quickstep/res/values-bg/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"Свободна форма"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"За компютър"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"Преместване към външния екран"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"Затваряне"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"Настолен компютър"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"Няма скорошни елементи"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"Настройки за използването на приложенията"</string>
diff --git a/quickstep/res/values-bn/strings.xml b/quickstep/res/values-bn/strings.xml
index 8ff5d76..01954cf 100644
--- a/quickstep/res/values-bn/strings.xml
+++ b/quickstep/res/values-bn/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"ফ্রি-ফর্ম"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"ডেস্কটপ"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"এক্সটার্নাল ডিসপ্লেতে সরিয়ে নিয়ে যান"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"বন্ধ করুন"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"ডেস্কটপ"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"কোনও সাম্প্রতিক আইটেম নেই"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"অ্যাপ ব্যবহারের সেটিংস"</string>
diff --git a/quickstep/res/values-bs/strings.xml b/quickstep/res/values-bs/strings.xml
index 9553e28..18c178b 100644
--- a/quickstep/res/values-bs/strings.xml
+++ b/quickstep/res/values-bs/strings.xml
@@ -23,7 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"Slobodan oblik"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"Radna površina"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"Premještanje na vanjski ekran"</string>
- <string name="recent_task_option_close" msgid="942942499021777264">"Zatvori"</string>
+ <string name="recent_task_option_close" msgid="942942499021777264">"Zatvaranje"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"Radna površina"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"Nema nedavnih stavki"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"Postavke korištenja aplikacije"</string>
diff --git a/quickstep/res/values-ca/strings.xml b/quickstep/res/values-ca/strings.xml
index 44ef6c3..23cd439 100644
--- a/quickstep/res/values-ca/strings.xml
+++ b/quickstep/res/values-ca/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"Format lliure"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"Escriptori"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"Mou a la pantalla externa"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"Tanca"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"Escriptori"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"No hi ha cap element recent"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"Configuració d\'ús d\'aplicacions"</string>
diff --git a/quickstep/res/values-da/strings.xml b/quickstep/res/values-da/strings.xml
index 224ac11..4bae930 100644
--- a/quickstep/res/values-da/strings.xml
+++ b/quickstep/res/values-da/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"Frit format"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"Computertilstand"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"Flyt til ekstern skærm"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"Luk"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"Computertilstand"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"Ingen nye elementer"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"Indstillinger for appforbrug"</string>
diff --git a/quickstep/res/values-de/strings.xml b/quickstep/res/values-de/strings.xml
index 40c1cce..e937410 100644
--- a/quickstep/res/values-de/strings.xml
+++ b/quickstep/res/values-de/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"Freeform-Modus"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"Desktopmodus"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"Auf externes Display verschieben"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"Schließen"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"Desktopmodus"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"Keine kürzlich verwendeten Elemente"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"Einstellungen zur App-Nutzung"</string>
diff --git a/quickstep/res/values-el/strings.xml b/quickstep/res/values-el/strings.xml
index 046e047..438dcf8 100644
--- a/quickstep/res/values-el/strings.xml
+++ b/quickstep/res/values-el/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"Ελεύθερη μορφή"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"Υπολογιστής"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"Μετακίνηση σε εξωτερική οθόνη"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"Κλείσιμο"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"Υπολογιστής"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"Δεν υπάρχουν πρόσφατα στοιχεία"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"Ρυθμίσεις χρήσης εφαρμογής"</string>
diff --git a/quickstep/res/values-en-rAU/strings.xml b/quickstep/res/values-en-rAU/strings.xml
index 0c8384c..954db96 100644
--- a/quickstep/res/values-en-rAU/strings.xml
+++ b/quickstep/res/values-en-rAU/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"Freeform"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"Desktop"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"Move to external display"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"Close"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"Desktop"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"No recent items"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"App usage settings"</string>
diff --git a/quickstep/res/values-en-rGB/strings.xml b/quickstep/res/values-en-rGB/strings.xml
index 0c8384c..954db96 100644
--- a/quickstep/res/values-en-rGB/strings.xml
+++ b/quickstep/res/values-en-rGB/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"Freeform"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"Desktop"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"Move to external display"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"Close"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"Desktop"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"No recent items"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"App usage settings"</string>
diff --git a/quickstep/res/values-en-rIN/strings.xml b/quickstep/res/values-en-rIN/strings.xml
index 0c8384c..954db96 100644
--- a/quickstep/res/values-en-rIN/strings.xml
+++ b/quickstep/res/values-en-rIN/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"Freeform"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"Desktop"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"Move to external display"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"Close"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"Desktop"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"No recent items"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"App usage settings"</string>
diff --git a/quickstep/res/values-es/strings.xml b/quickstep/res/values-es/strings.xml
index 6c412f7..7f7b433 100644
--- a/quickstep/res/values-es/strings.xml
+++ b/quickstep/res/values-es/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"Formato libre"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"Escritorio"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"Mover a pantalla externa"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"Cerrar"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"Ordenador"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"No hay nada reciente"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"Ajustes de uso de la aplicación"</string>
diff --git a/quickstep/res/values-eu/strings.xml b/quickstep/res/values-eu/strings.xml
index 892089d..0a912d8 100644
--- a/quickstep/res/values-eu/strings.xml
+++ b/quickstep/res/values-eu/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"Modu librea"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"Ordenagailua"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"Eraman kanpoko pantailara"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"Itxi"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"Mahaigaina"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"Ez dago azkenaldi honetako ezer"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"Aplikazioen erabileraren ezarpenak"</string>
diff --git a/quickstep/res/values-fi/strings.xml b/quickstep/res/values-fi/strings.xml
index 0e360d0..adeaa34 100644
--- a/quickstep/res/values-fi/strings.xml
+++ b/quickstep/res/values-fi/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"Vapaamuotoinen"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"Tietokone"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"Siirrä ulkoiselle näytölle"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"Sulje"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"Tietokone"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"Ei viimeaikaisia kohteita"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"Sovelluksen käyttöasetukset"</string>
diff --git a/quickstep/res/values-gl/strings.xml b/quickstep/res/values-gl/strings.xml
index f4260f3..edd55d5 100644
--- a/quickstep/res/values-gl/strings.xml
+++ b/quickstep/res/values-gl/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"Forma libre"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"Escritorio"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"Mover á pantalla externa"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"Pechar"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"Ordenador"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"Non hai elementos recentes"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"Configuración do uso de aplicacións"</string>
diff --git a/quickstep/res/values-gu/strings.xml b/quickstep/res/values-gu/strings.xml
index 2797f82..7145c6c9 100644
--- a/quickstep/res/values-gu/strings.xml
+++ b/quickstep/res/values-gu/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"ફ્રિફોર્મ"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"ડેસ્કટૉપ"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"બાહ્ય ડિસ્પ્લે પર ખસેડો"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"બંધ કરો"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"ડેસ્કટૉપ"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"તાજેતરની કોઈ આઇટમ નથી"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"ઍપ વપરાશનું સેટિંગ"</string>
diff --git a/quickstep/res/values-hi/strings.xml b/quickstep/res/values-hi/strings.xml
index 5ed6ef5..99b7b71 100644
--- a/quickstep/res/values-hi/strings.xml
+++ b/quickstep/res/values-hi/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"फ़्रीफ़ॉर्म"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"डेस्कटॉप"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"बाहरी डिसप्ले पर जाएं"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"बंद करें"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"डेस्कटॉप"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"हाल ही का कोई आइटम नहीं है"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"ऐप्लिकेशन इस्तेमाल की सेटिंग"</string>
diff --git a/quickstep/res/values-hu/strings.xml b/quickstep/res/values-hu/strings.xml
index 4f15c7d..f825032 100644
--- a/quickstep/res/values-hu/strings.xml
+++ b/quickstep/res/values-hu/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"Szabad forma"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"Asztali"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"Áthelyezés külső kijelzőre"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"Bezárás"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"Asztali"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"Nincsenek mostanában használt elemek"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"Alkalmazáshasználati beállítások"</string>
diff --git a/quickstep/res/values-hy/strings.xml b/quickstep/res/values-hy/strings.xml
index edaa5bd..6a7653f 100644
--- a/quickstep/res/values-hy/strings.xml
+++ b/quickstep/res/values-hy/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"Կամայական ձև"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"Համակարգիչ"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"Տեղափոխել արտաքին էկրան"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"Փակել"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"Համակարգիչ"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"Այստեղ դեռ ոչինչ չկա"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"Հավելվածի օգտագործման կարգավորումներ"</string>
diff --git a/quickstep/res/values-in/strings.xml b/quickstep/res/values-in/strings.xml
index 4b2ffd7..5b5796c 100644
--- a/quickstep/res/values-in/strings.xml
+++ b/quickstep/res/values-in/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"Format bebas"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"Desktop"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"Pindahkan ke layar eksternal"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"Tutup"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"Desktop"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"Tidak ada item yang baru dibuka"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"Setelan penggunaan aplikasi"</string>
diff --git a/quickstep/res/values-is/strings.xml b/quickstep/res/values-is/strings.xml
index 3619a2d..12541f7 100644
--- a/quickstep/res/values-is/strings.xml
+++ b/quickstep/res/values-is/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"Frjálst snið"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"Tölva"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"Færa í annað tæki"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"Loka"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"Tölva"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"Engin nýleg atriði"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"Notkunarstillingar forrits"</string>
diff --git a/quickstep/res/values-it/strings.xml b/quickstep/res/values-it/strings.xml
index 17aefa4..731184b 100644
--- a/quickstep/res/values-it/strings.xml
+++ b/quickstep/res/values-it/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"Forma libera"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"Desktop"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"Sposta sul display esterno"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"Chiudi"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"Desktop"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"Nessun elemento recente"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"Impostazioni di utilizzo delle app"</string>
diff --git a/quickstep/res/values-iw/strings.xml b/quickstep/res/values-iw/strings.xml
index 1cba30f..0fff001 100644
--- a/quickstep/res/values-iw/strings.xml
+++ b/quickstep/res/values-iw/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"מצב חופשי"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"במחשב"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"העברה למסך חיצוני"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"סגירה"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"מחשב"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"אין פריטים אחרונים"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"הגדרות שימוש באפליקציה"</string>
diff --git a/quickstep/res/values-kk/strings.xml b/quickstep/res/values-kk/strings.xml
index b95e708..76a6199 100644
--- a/quickstep/res/values-kk/strings.xml
+++ b/quickstep/res/values-kk/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"Еркін форма"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"Компьютер"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"Сыртқы дисплейге ауыстыру"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"Жабу"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"Жұмыс үстелі"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"Соңғы элементтер жоқ"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"Қолданбаны пайдалану параметрлері"</string>
diff --git a/quickstep/res/values-kn/strings.xml b/quickstep/res/values-kn/strings.xml
index 19d3ec9..c43a3d1 100644
--- a/quickstep/res/values-kn/strings.xml
+++ b/quickstep/res/values-kn/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"ಮುಕ್ತಸ್ವರೂಪ"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"ಡೆಸ್ಕ್ಟಾಪ್"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"ಬಾಹ್ಯ ಡಿಸ್ಪ್ಲೇಗೆ ಸರಿಸಿ"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"ಮುಚ್ಚಿರಿ"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"ಡೆಸ್ಕ್ಟಾಪ್"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"ಯಾವುದೇ ಇತ್ತೀಚಿನ ಐಟಂಗಳಿಲ್ಲ"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"ಆ್ಯಪ್ ಬಳಕೆಯ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
diff --git a/quickstep/res/values-ko/strings.xml b/quickstep/res/values-ko/strings.xml
index 2e89174..4105f97 100644
--- a/quickstep/res/values-ko/strings.xml
+++ b/quickstep/res/values-ko/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"자유 형식"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"데스크톱"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"외부 디스플레이로 이동"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"닫기"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"데스크톱"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"최근 항목이 없습니다."</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"앱 사용 설정"</string>
diff --git a/quickstep/res/values-ky/strings.xml b/quickstep/res/values-ky/strings.xml
index ac2b06d..3109069 100644
--- a/quickstep/res/values-ky/strings.xml
+++ b/quickstep/res/values-ky/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"Эркин форма режими"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"Компьютер"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"Тышкы экранга жылдыруу"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"Жабуу"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"Компьютер"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"Акыркы колдонмолор жок"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"Колдонмону пайдалануу параметрлери"</string>
diff --git a/quickstep/res/values-lo/strings.xml b/quickstep/res/values-lo/strings.xml
index 2ebaa7a..3df475f 100644
--- a/quickstep/res/values-lo/strings.xml
+++ b/quickstep/res/values-lo/strings.xml
@@ -90,7 +90,7 @@
<string name="allset_title" msgid="5021126669778966707">"ຮຽບຮ້ອຍໝົດແລ້ວ!"</string>
<string name="allset_hint" msgid="459504134589971527">"ປັດຂຶ້ນເພື່ອໄປຫາໜ້າຫຼັກ"</string>
<string name="allset_button_hint" msgid="2395219947744706291">"ແຕະປຸ່ມໜ້າທຳອິດເພື່ອໄປຫາໂຮມສະກຣີນຂອງທ່ານ"</string>
- <string name="allset_description_generic" msgid="5385500062202019855">"ທ່ານເລີ່ມໃຊ້ແທັບເລັດ <xliff:g id="DEVICE">%1$s</xliff:g> ຂອງທ່ານໄດ້ແລ້ວ"</string>
+ <string name="allset_description_generic" msgid="5385500062202019855">"ທ່ານເລີ່ມໃຊ້<xliff:g id="DEVICE">%1$s</xliff:g>ຂອງທ່ານໄດ້ແລ້ວ"</string>
<string name="default_device_name" msgid="6660656727127422487">"ອຸປະກອນ"</string>
<string name="allset_navigation_settings" msgid="4713404605961476027"><annotation id="link">"ການຕັ້ງຄ່າການນຳທາງລະບົບ"</annotation></string>
<string name="action_share" msgid="2648470652637092375">"ແບ່ງປັນ"</string>
diff --git a/quickstep/res/values-lt/strings.xml b/quickstep/res/values-lt/strings.xml
index b57fee4..ec16b11 100644
--- a/quickstep/res/values-lt/strings.xml
+++ b/quickstep/res/values-lt/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"Laisva forma"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"Stalinis kompiuteris"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"Perkelkite į išorinį ekraną"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"Uždaryti"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"Stalinis kompiuteris"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"Nėra jokių naujausių elementų"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"Programos naudojimo nustatymai"</string>
diff --git a/quickstep/res/values-lv/strings.xml b/quickstep/res/values-lv/strings.xml
index 07e9e1a..0f15a23 100644
--- a/quickstep/res/values-lv/strings.xml
+++ b/quickstep/res/values-lv/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"Brīva forma"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"Dators"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"Pārvietošana uz ārējo displeju"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"Aizvērt"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"Darbvirsma"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"Nav nesenu vienumu."</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"Lietotņu izmantošanas iestatījumi"</string>
diff --git a/quickstep/res/values-mk/strings.xml b/quickstep/res/values-mk/strings.xml
index 0a133a3..8fd0cc5 100644
--- a/quickstep/res/values-mk/strings.xml
+++ b/quickstep/res/values-mk/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"Freeform"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"Работна површина"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"Префрлете се на надворешниот екран"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"Затвори"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"За компјутер"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"Нема неодамнешни ставки"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"Поставки за користење на апликациите"</string>
diff --git a/quickstep/res/values-mn/strings.xml b/quickstep/res/values-mn/strings.xml
index c50e87a..f086314 100644
--- a/quickstep/res/values-mn/strings.xml
+++ b/quickstep/res/values-mn/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"Чөлөөтэй хувьсах"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"Компьютер"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"Гадаад дэлгэц рүү зөөх"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"Хаах"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"Дэлгэц"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"Сүүлийн үеийн зүйл алга"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"Апп ашиглалтын тохиргоо"</string>
diff --git a/quickstep/res/values-mr/strings.xml b/quickstep/res/values-mr/strings.xml
index 63f4317..75c42ad 100644
--- a/quickstep/res/values-mr/strings.xml
+++ b/quickstep/res/values-mr/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"फ्रीफॉर्म"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"डेस्कटॉप"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"बाह्य डिस्प्लेवर हलवा"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"बंद करा"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"डेस्कटॉप"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"कोणतेही अलीकडील आयटम नाहीत"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"अॅप वापर सेटिंग्ज"</string>
diff --git a/quickstep/res/values-my/strings.xml b/quickstep/res/values-my/strings.xml
index 9df3d66..81a10b5 100644
--- a/quickstep/res/values-my/strings.xml
+++ b/quickstep/res/values-my/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"အလွတ်ပုံစံ"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"ဒက်စ်တော့"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"ပြင်ပဖန်သားပြင်သို့ ရွှေ့ရန်"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"ပိတ်ရန်"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"ဒက်စ်တော့"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"မကြာမီကဖွင့်ထားသည်များ မရှိပါ"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"အက်ပ်အသုံးပြုမှု ဆက်တင်များ"</string>
diff --git a/quickstep/res/values-nb/strings.xml b/quickstep/res/values-nb/strings.xml
index d05884f..4c1aaaa 100644
--- a/quickstep/res/values-nb/strings.xml
+++ b/quickstep/res/values-nb/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"Fritt format"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"Skrivebord"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"Flytt til ekstern skjerm"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"Lukk"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"Skrivebord"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"Ingen nylige elementer"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"Innstillinger for appbruk"</string>
diff --git a/quickstep/res/values-ne/strings.xml b/quickstep/res/values-ne/strings.xml
index 6efdca9..47b2532 100644
--- a/quickstep/res/values-ne/strings.xml
+++ b/quickstep/res/values-ne/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"फ्रिफर्म"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"डेस्कटप"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"सारेर बाह्य डिस्प्लेमा लैजानुहोस्"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"बन्द गर्नुहोस्"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"डेस्कटप"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"हालसालैको कुनै पनि सामग्री छैन"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"एपको उपयोगका सेटिङहरू"</string>
diff --git a/quickstep/res/values-or/strings.xml b/quickstep/res/values-or/strings.xml
index 66cbcdd..248d4cc 100644
--- a/quickstep/res/values-or/strings.xml
+++ b/quickstep/res/values-or/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"ଫ୍ରିଫର୍ମ"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"ଡେସ୍କଟପ"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"ଏକ୍ସଟର୍ନଲ ଡିସପ୍ଲେକୁ ମୁଭ କରନ୍ତୁ"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"ବନ୍ଦ କରନ୍ତୁ"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"ଡେସ୍କଟପ"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"ବର୍ତ୍ତମାନର କୌଣସି ଆଇଟମ ନାହିଁ"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"ଆପ ବ୍ୟବହାର ସେଟିଂସ"</string>
diff --git a/quickstep/res/values-pl/strings.xml b/quickstep/res/values-pl/strings.xml
index b571ba2..5c76187 100644
--- a/quickstep/res/values-pl/strings.xml
+++ b/quickstep/res/values-pl/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"Tryb dowolny"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"Pulpit"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"Przenieś na wyświetlacz zewnętrzny"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"Zamknij"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"Pulpit"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"Brak ostatnich elementów"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"Ustawienia użycia aplikacji"</string>
diff --git a/quickstep/res/values-pt/strings.xml b/quickstep/res/values-pt/strings.xml
index bb7d97d..ede50cc 100644
--- a/quickstep/res/values-pt/strings.xml
+++ b/quickstep/res/values-pt/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"Forma livre"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"Modo área de trabalho"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"Mover para a tela externa"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"Fechar"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"Computador"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"Nenhum item recente"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"Configurações de uso do app"</string>
@@ -91,7 +90,7 @@
<string name="allset_title" msgid="5021126669778966707">"Tudo pronto!"</string>
<string name="allset_hint" msgid="459504134589971527">"Deslize para cima para acessar a tela inicial"</string>
<string name="allset_button_hint" msgid="2395219947744706291">"Toque no botão home para acessar a tela inicial"</string>
- <string name="allset_description_generic" msgid="5385500062202019855">"Você já pode começar a usar seu <xliff:g id="DEVICE">%1$s</xliff:g>"</string>
+ <string name="allset_description_generic" msgid="5385500062202019855">"O <xliff:g id="DEVICE">%1$s</xliff:g> já pode ser usado"</string>
<string name="default_device_name" msgid="6660656727127422487">"dispositivo"</string>
<string name="allset_navigation_settings" msgid="4713404605961476027"><annotation id="link">"Configurações de navegação do sistema"</annotation></string>
<string name="action_share" msgid="2648470652637092375">"Compartilhar"</string>
diff --git a/quickstep/res/values-ro/strings.xml b/quickstep/res/values-ro/strings.xml
index 856bef7..a89ccdc 100644
--- a/quickstep/res/values-ro/strings.xml
+++ b/quickstep/res/values-ro/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"Formă liberă"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"Desktop"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"Mută pe ecranul extern"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"Închide"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"Computer"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"Niciun element recent"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"Setări de utilizare a aplicației"</string>
diff --git a/quickstep/res/values-si/strings.xml b/quickstep/res/values-si/strings.xml
index 3b1cada..de23b6e 100644
--- a/quickstep/res/values-si/strings.xml
+++ b/quickstep/res/values-si/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"Freeform"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"ඩෙස්ක්ටොපය"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"බාහිර සංදර්ශකය වෙත ගෙන යන්න"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"වසන්න"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"ඩෙස්ක්ටොපය"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"මෑත අයිතම නැත"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"යෙදුම් භාවිත සැකසීම්"</string>
diff --git a/quickstep/res/values-sq/strings.xml b/quickstep/res/values-sq/strings.xml
index 8f39f65..9aedee5 100644
--- a/quickstep/res/values-sq/strings.xml
+++ b/quickstep/res/values-sq/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"Formë e lirë"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"Desktopi"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"Zhvendose tek ekrani i jashtëm"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"Mbyll"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"Desktopi"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"Nuk ka asnjë artikull të fundit"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"Cilësimet e përdorimit të aplikacionit"</string>
diff --git a/quickstep/res/values-sv/strings.xml b/quickstep/res/values-sv/strings.xml
index c33de8a..ab9f10e 100644
--- a/quickstep/res/values-sv/strings.xml
+++ b/quickstep/res/values-sv/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"Fritt format"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"Skrivbordsläge"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"Flytta till extern skärm"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"Stäng"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"Skrivbordsläge"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"Listan är tom"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"Inställningar för appanvändning"</string>
diff --git a/quickstep/res/values-sw/strings.xml b/quickstep/res/values-sw/strings.xml
index 543663f..5f696c5 100644
--- a/quickstep/res/values-sw/strings.xml
+++ b/quickstep/res/values-sw/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"Muundo huru"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"Kompyuta ya mezani"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"Hamishia programu kwenye skrini ya nje"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"Funga"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"Kompyuta ya Mezani"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"Hakuna vipengee vya hivi karibuni"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"Mipangilio ya matumizi ya programu"</string>
diff --git a/quickstep/res/values-ta/strings.xml b/quickstep/res/values-ta/strings.xml
index 1e6cb9b..4f22a04 100644
--- a/quickstep/res/values-ta/strings.xml
+++ b/quickstep/res/values-ta/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"குறிப்பிட்ட வடிவமில்லாத பயன்முறை"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"டெஸ்க்டாப்"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"வெளிப்புற டிஸ்ப்ளேவிற்கு நகர்த்துதல்"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"மூடு"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"டெஸ்க்டாப்"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"சமீபத்தியவை எதுவுமில்லை"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"ஆப்ஸ் உபயோக அமைப்புகள்"</string>
diff --git a/quickstep/res/values-te/strings.xml b/quickstep/res/values-te/strings.xml
index 74e59ba..429d2d4 100644
--- a/quickstep/res/values-te/strings.xml
+++ b/quickstep/res/values-te/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"సంప్రదాయేతర"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"డెస్క్టాప్"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"ఎక్స్టర్నల్ డిస్ప్లేకు తరలించండి"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"మూసివేయండి"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"డెస్క్టాప్"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"ఇటీవలి ఐటెమ్లు ఏవీ లేవు"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"యాప్ వినియోగ సెట్టింగ్లు"</string>
diff --git a/quickstep/res/values-tr/strings.xml b/quickstep/res/values-tr/strings.xml
index ac06369..e213b40 100644
--- a/quickstep/res/values-tr/strings.xml
+++ b/quickstep/res/values-tr/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"Serbest çalışma"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"Masaüstü"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"Harici ekrana taşı"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"Kapat"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"Masaüstü"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"Yeni öğe yok"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"Uygulama kullanım ayarları"</string>
@@ -91,7 +90,7 @@
<string name="allset_title" msgid="5021126669778966707">"Kurulum tamamlandı"</string>
<string name="allset_hint" msgid="459504134589971527">"Ana ekrana gitmek için yukarı kaydırın"</string>
<string name="allset_button_hint" msgid="2395219947744706291">"Ana ekranınıza gitmek için ana sayfa düğmesine dokunun"</string>
- <string name="allset_description_generic" msgid="5385500062202019855">"<xliff:g id="DEVICE">%1$s</xliff:g> adlı cihazınızı kullanmaya hazırsınız"</string>
+ <string name="allset_description_generic" msgid="5385500062202019855">"Artık <xliff:g id="DEVICE">%1$s</xliff:g> kullanılmak için hazır"</string>
<string name="default_device_name" msgid="6660656727127422487">"cihaz"</string>
<string name="allset_navigation_settings" msgid="4713404605961476027"><annotation id="link">"Sistem gezinme ayarları"</annotation></string>
<string name="action_share" msgid="2648470652637092375">"Paylaş"</string>
diff --git a/quickstep/res/values-uk/strings.xml b/quickstep/res/values-uk/strings.xml
index 2d27bb9..dab58d7 100644
--- a/quickstep/res/values-uk/strings.xml
+++ b/quickstep/res/values-uk/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"Довільна форма"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"Робочий стіл"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"Перемістити на зовнішній екран"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"Закрити"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"Комп’ютер"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"Немає нещодавніх додатків"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"Налаштування використання додатка"</string>
diff --git a/quickstep/res/values-vi/strings.xml b/quickstep/res/values-vi/strings.xml
index e49f7e3..bf50e05 100644
--- a/quickstep/res/values-vi/strings.xml
+++ b/quickstep/res/values-vi/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"Dạng tự do"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"Máy tính"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"Chuyển sang màn hình ngoài"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"Đóng"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"Máy tính"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"Không có mục gần đây nào"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"Cài đặt mức sử dụng ứng dụng"</string>
diff --git a/quickstep/res/values-zh-rCN/strings.xml b/quickstep/res/values-zh-rCN/strings.xml
index c1cf2fe..374a4b6 100644
--- a/quickstep/res/values-zh-rCN/strings.xml
+++ b/quickstep/res/values-zh-rCN/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"自由窗口"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"桌面"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"移至外接显示屏"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"关闭"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"桌面设备"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"近期没有任何内容"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"应用使用设置"</string>
diff --git a/quickstep/res/values-zh-rHK/strings.xml b/quickstep/res/values-zh-rHK/strings.xml
index 393565a..42e2e37 100644
--- a/quickstep/res/values-zh-rHK/strings.xml
+++ b/quickstep/res/values-zh-rHK/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"自由形式"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"桌面"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"移至外部顯示屏"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"關閉"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"桌面"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"最近沒有任何項目"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"應用程式使用情況設定"</string>
diff --git a/quickstep/res/values-zh-rTW/strings.xml b/quickstep/res/values-zh-rTW/strings.xml
index fbd465d..d9d1fb5 100644
--- a/quickstep/res/values-zh-rTW/strings.xml
+++ b/quickstep/res/values-zh-rTW/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"自由形式"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"電腦模式"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"移至外接螢幕"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"關閉"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"電腦模式"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"最近沒有任何項目"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"應用程式使用情況設定"</string>
diff --git a/quickstep/res/values-zu/strings.xml b/quickstep/res/values-zu/strings.xml
index 39b4873..660ef3e 100644
--- a/quickstep/res/values-zu/strings.xml
+++ b/quickstep/res/values-zu/strings.xml
@@ -23,8 +23,7 @@
<string name="recent_task_option_freeform" msgid="48863056265284071">"I-Freeform"</string>
<string name="recent_task_option_desktop" msgid="8280879717125435668">"Ideskithophu"</string>
<string name="recent_task_option_external_display" msgid="4533840664313389484">"Hambisa esibonisini sangaphandle"</string>
- <!-- no translation found for recent_task_option_close (942942499021777264) -->
- <skip />
+ <string name="recent_task_option_close" msgid="942942499021777264">"Vala"</string>
<string name="recent_task_desktop" msgid="8081113562549637334">"Ideskithophu"</string>
<string name="recents_empty_message" msgid="7040467240571714191">"Azikho izinto zakamuva"</string>
<string name="accessibility_app_usage_settings" msgid="6312864233673544149">"Izilungiselelo zokusetshenziswa kohlelo lokusebenza"</string>
diff --git a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java
index 4ba4e2b..c748385 100644
--- a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java
+++ b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java
@@ -411,7 +411,8 @@
@NonNull RemoteAnimationTarget[] nonAppTargets, boolean launcherClosing) {
TaskViewUtils.composeRecentsLaunchAnimator(anim, v, appTargets, wallpaperTargets,
nonAppTargets, launcherClosing, mLauncher.getStateManager(),
- mLauncher.getOverviewPanel(), mLauncher.getDepthController());
+ mLauncher.getOverviewPanel(), mLauncher.getDepthController(),
+ /* transitionInfo= */ null);
}
private boolean areAllTargetsTranslucent(@NonNull RemoteAnimationTarget[] targets) {
diff --git a/quickstep/src/com/android/launcher3/model/WellbeingModel.java b/quickstep/src/com/android/launcher3/model/WellbeingModel.java
index 0f3aaa6..09433c5 100644
--- a/quickstep/src/com/android/launcher3/model/WellbeingModel.java
+++ b/quickstep/src/com/android/launcher3/model/WellbeingModel.java
@@ -109,9 +109,9 @@
? Executors.UI_HELPER_EXECUTOR.getLooper()
: Executors.getPackageExecutor(mWellbeingProviderPkg).getLooper());
mWellbeingAppChangeReceiver =
- new SimpleBroadcastReceiver(mWorkerHandler, t -> restartObserver());
+ new SimpleBroadcastReceiver(context, mWorkerHandler, t -> restartObserver());
mAppAddRemoveReceiver =
- new SimpleBroadcastReceiver(mWorkerHandler, this::onAppPackageChanged);
+ new SimpleBroadcastReceiver(context, mWorkerHandler, this::onAppPackageChanged);
mContentObserver = new ContentObserver(mWorkerHandler) {
@@ -148,8 +148,8 @@
public void close() {
if (!TextUtils.isEmpty(mWellbeingProviderPkg)) {
mWorkerHandler.post(() -> {
- mWellbeingAppChangeReceiver.unregisterReceiverSafely(mContext);
- mAppAddRemoveReceiver.unregisterReceiverSafely(mContext);
+ mWellbeingAppChangeReceiver.unregisterReceiverSafely();
+ mAppAddRemoveReceiver.unregisterReceiverSafely();
mContext.getContentResolver().unregisterContentObserver(mContentObserver);
});
}
diff --git a/quickstep/src/com/android/launcher3/statehandlers/DesktopVisibilityController.kt b/quickstep/src/com/android/launcher3/statehandlers/DesktopVisibilityController.kt
index 03f5d96..3773d02 100644
--- a/quickstep/src/com/android/launcher3/statehandlers/DesktopVisibilityController.kt
+++ b/quickstep/src/com/android/launcher3/statehandlers/DesktopVisibilityController.kt
@@ -19,7 +19,9 @@
import android.os.Debug
import android.util.Log
import android.util.SparseArray
+import android.view.Display.DEFAULT_DISPLAY
import android.window.DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY
+import androidx.core.util.forEach
import com.android.launcher3.LauncherState
import com.android.launcher3.dagger.ApplicationContext
import com.android.launcher3.dagger.LauncherAppComponent
@@ -62,14 +64,14 @@
* @property canCreateDesks true if it's possible to create new desks on the display represented
* by this object.
* @property activeDeskId The ID of the active desk on the associated display (if any). It has a
- * value of `-1` if there are no active desks. Note that there can only be at most one active
- * desk on each display.
+ * value of `INACTIVE_DESK_ID` (-1) if there are no active desks. Note that there can only be
+ * at most one active desk on each display.
* @property deskIds a set containing the IDs of the desks on the associated display.
*/
private data class DisplayDeskConfig(
val displayId: Int,
var canCreateDesks: Boolean,
- var activeDeskId: Int = -1,
+ var activeDeskId: Int = INACTIVE_DESK_ID,
val deskIds: MutableSet<Int>,
)
@@ -79,6 +81,8 @@
private val desktopVisibilityListeners: MutableSet<DesktopVisibilityListener> = HashSet()
private val taskbarDesktopModeListeners: MutableSet<TaskbarDesktopModeListener> = HashSet()
+ // TODO: b/394387739 - Deprecate this and replace it with something that tracks the count per
+ // desk.
/** Number of visible desktop windows in desktop mode. */
var visibleDesktopTasksCount: Int = 0
/**
@@ -103,7 +107,7 @@
field = visibleTasksCount
val areDesktopTasksVisibleNow = areDesktopTasksVisibleAndNotInOverview()
if (wereDesktopTasksVisibleBefore != areDesktopTasksVisibleNow) {
- notifyDesktopVisibilityListeners(areDesktopTasksVisibleNow)
+ notifyIsInDesktopModeChanged(DEFAULT_DISPLAY, areDesktopTasksVisibleNow)
}
if (
@@ -142,8 +146,36 @@
}
}
+ /** Returns whether a desk is currently active on the display with the given [displayId]. */
+ fun isInDesktopMode(displayId: Int): Boolean {
+ if (!DesktopModeStatus.enableMultipleDesktops(context)) {
+ return areDesktopTasksVisible()
+ }
+
+ val isInDesktopMode = displaysDesksConfigsMap[displayId].activeDeskId != INACTIVE_DESK_ID
+ if (DEBUG) {
+ Log.d(TAG, "isInDesktopMode: $isInDesktopMode")
+ }
+ return isInDesktopMode
+ }
+
+ /**
+ * Returns whether a desk is currently active on the display with the given [displayId] and
+ * Overview is not active.
+ */
+ fun isInDesktopModeAndNotInOverview(displayId: Int): Boolean {
+ if (!DesktopModeStatus.enableMultipleDesktops(context)) {
+ return areDesktopTasksVisibleAndNotInOverview()
+ }
+
+ if (DEBUG) {
+ Log.d(TAG, "isInDesktopModeAndNotInOverview: overview=$inOverviewState")
+ }
+ return isInDesktopMode(displayId) && !inOverviewState
+ }
+
/** Whether desktop tasks are visible in desktop mode. */
- fun areDesktopTasksVisible(): Boolean {
+ private fun areDesktopTasksVisible(): Boolean {
val desktopTasksVisible: Boolean = visibleDesktopTasksCount > 0
if (DEBUG) {
Log.d(TAG, "areDesktopTasksVisible: desktopVisible=$desktopTasksVisible")
@@ -152,7 +184,7 @@
}
/** Whether desktop tasks are visible in desktop mode. */
- fun areDesktopTasksVisibleAndNotInOverview(): Boolean {
+ private fun areDesktopTasksVisibleAndNotInOverview(): Boolean {
val desktopTasksVisible: Boolean = visibleDesktopTasksCount > 0
if (DEBUG) {
Log.d(
@@ -220,8 +252,23 @@
val wereDesktopTasksVisibleBefore = areDesktopTasksVisibleAndNotInOverview()
inOverviewState = overviewStateEnabled
val areDesktopTasksVisibleNow = areDesktopTasksVisibleAndNotInOverview()
- if (wereDesktopTasksVisibleBefore != areDesktopTasksVisibleNow) {
- notifyDesktopVisibilityListeners(areDesktopTasksVisibleNow)
+
+ if (!DesktopModeStatus.enableMultipleDesktops(context)) {
+ if (wereDesktopTasksVisibleBefore != areDesktopTasksVisibleNow) {
+ notifyIsInDesktopModeChanged(DEFAULT_DISPLAY, areDesktopTasksVisibleNow)
+ }
+ } else {
+ // When overview state changes, it changes together on all displays.
+ displaysDesksConfigsMap.forEach { displayId, deskConfig ->
+ // Overview affects the state of desks only if desktop mode is active on this
+ // display.
+ if (isInDesktopMode(displayId)) {
+ notifyIsInDesktopModeChanged(
+ displayId,
+ isInDesktopModeAndNotInOverview(displayId),
+ )
+ }
+ }
}
if (ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY.isTrue) {
@@ -249,12 +296,19 @@
desktopVisibilityListeners.remove(listener)
}
- private fun notifyDesktopVisibilityListeners(areDesktopTasksVisible: Boolean) {
+ private fun notifyIsInDesktopModeChanged(
+ displayId: Int,
+ isInDesktopModeAndNotInOverview: Boolean,
+ ) {
if (DEBUG) {
- Log.d(TAG, "notifyDesktopVisibilityListeners: visible=$areDesktopTasksVisible")
+ Log.d(
+ TAG,
+ "notifyIsInDesktopModeChanged: displayId=$displayId, isInDesktopModeAndNotInOverview=$isInDesktopModeAndNotInOverview",
+ )
}
+
for (listener in desktopVisibilityListeners) {
- listener.onDesktopVisibilityChanged(areDesktopTasksVisible)
+ listener.onIsInDesktopModeChanged(displayId, isInDesktopModeAndNotInOverview)
}
}
@@ -391,7 +445,7 @@
"Removing non-existing desk Id: $deskId on display: $displayId"
}
if (it.activeDeskId == deskId) {
- it.activeDeskId = -1
+ it.activeDeskId = INACTIVE_DESK_ID
}
}
}
@@ -401,6 +455,8 @@
return
}
+ val wasInDesktopMode = isInDesktopModeAndNotInOverview(displayId)
+
getDisplayDeskConfig(displayId).also {
check(oldActiveDesk == it.activeDeskId) {
"Mismatch between the Shell's oldActiveDesk: $oldActiveDesk, and Launcher's: ${it.activeDeskId}"
@@ -410,6 +466,10 @@
}
it.activeDeskId = newActiveDesk
}
+
+ if (wasInDesktopMode != isInDesktopModeAndNotInOverview(displayId)) {
+ notifyIsInDesktopModeChanged(displayId, !wasInDesktopMode)
+ }
}
/** TODO: b/333533253 - Remove after flag rollout */
@@ -542,5 +602,7 @@
private const val TAG = "DesktopVisController"
private const val DEBUG = false
+
+ private const val INACTIVE_DESK_ID = -1
}
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java
index 4143157..3f3700b 100644
--- a/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java
@@ -246,7 +246,7 @@
if (!ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY.isTrue()
&& mControllers.taskbarDesktopModeController
- .getAreDesktopTasksVisibleAndNotInOverview()) {
+ .isInDesktopModeAndNotInOverview(mLauncher.getDisplayId())) {
// TODO: b/333533253 - Remove after flag rollout
isVisible = false;
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
index a6d3cde..b9d1275 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
@@ -47,6 +47,7 @@
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NOTIFICATION_PANEL_VISIBLE;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_VOICE_INTERACTION_WINDOW_SHOWING;
import static com.android.window.flags.Flags.enableStartLaunchTransitionFromTaskbarBugfix;
+import static com.android.window.flags.Flags.enableTaskbarConnectedDisplays;
import static com.android.wm.shell.Flags.enableTinyTaskbar;
import static java.lang.invoke.MethodHandles.Lookup.PROTECTED;
@@ -433,7 +434,9 @@
.setIsTransientTaskbar(true)
.build();
}
- mNavMode = DisplayController.getNavigationMode(this);
+ mNavMode = (enableTaskbarConnectedDisplays() && !mIsPrimaryDisplay)
+ ? NavigationMode.THREE_BUTTONS : DisplayController.getNavigationMode(this);
+
}
/** Called when the visibility of the bubble bar changed. */
@@ -1288,7 +1291,7 @@
boolean areDesktopTasksVisible() {
return mControllers != null
- && mControllers.taskbarDesktopModeController.getAreDesktopTasksVisible();
+ && mControllers.taskbarDesktopModeController.isInDesktopMode(getDisplayId());
}
protected void onTaskbarIconClicked(View view) {
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java
index af60f10..b244be9 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java
@@ -194,7 +194,8 @@
voiceInteractionWindowController
};
- if (taskbarDesktopModeController.getAreDesktopTasksVisibleAndNotInOverview()) {
+ if (taskbarDesktopModeController.isInDesktopModeAndNotInOverview(
+ taskbarActivityContext.getDisplayId())) {
mCornerRoundness.value = taskbarDesktopModeController.getTaskbarCornerRoundness(
mSharedState.showCornerRadiusInDesktopMode);
} else {
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarDesktopModeController.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarDesktopModeController.kt
index cb399e8..f71dea9 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarDesktopModeController.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarDesktopModeController.kt
@@ -30,18 +30,17 @@
private lateinit var taskbarControllers: TaskbarControllers
private lateinit var taskbarSharedState: TaskbarSharedState
- val areDesktopTasksVisibleAndNotInOverview: Boolean
- get() = desktopVisibilityController.areDesktopTasksVisibleAndNotInOverview()
-
- val areDesktopTasksVisible: Boolean
- get() = desktopVisibilityController.areDesktopTasksVisible()
-
fun init(controllers: TaskbarControllers, sharedState: TaskbarSharedState) {
taskbarControllers = controllers
taskbarSharedState = sharedState
desktopVisibilityController.registerTaskbarDesktopModeListener(this)
}
+ fun isInDesktopMode(displayId: Int) = desktopVisibilityController.isInDesktopMode(displayId)
+
+ fun isInDesktopModeAndNotInOverview(displayId: Int) =
+ desktopVisibilityController.isInDesktopModeAndNotInOverview(displayId)
+
override fun onTaskbarCornerRoundingUpdate(doesAnyTaskRequireTaskbarRounding: Boolean) {
taskbarSharedState.showCornerRadiusInDesktopMode = doesAnyTaskRequireTaskbarRounding
val cornerRadius = getTaskbarCornerRoundness(doesAnyTaskRequireTaskbarRounding)
@@ -49,7 +48,7 @@
}
fun shouldShowDesktopTasksInTaskbar(): Boolean {
- return desktopVisibilityController.areDesktopTasksVisible() ||
+ return isInDesktopMode(context.displayId) ||
DisplayController.showDesktopTaskbarForFreeformDisplay(context) ||
(DisplayController.showLockedTaskbarOnHome(context) &&
taskbarControllers.taskbarStashController.isOnHome)
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java
index f36c481..b91f512 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java
@@ -347,7 +347,7 @@
// Pre-drag has ended, start the global system drag.
if (mDisallowGlobalDrag
|| mControllers.taskbarDesktopModeController
- .getAreDesktopTasksVisibleAndNotInOverview()) {
+ .isInDesktopModeAndNotInOverview(mActivity.getDisplayId())) {
AbstractFloatingView.closeAllOpenViewsExcept(mActivity, TYPE_TASKBAR_ALL_APPS);
return;
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java
index cada5a3..dd9f61e 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java
@@ -631,7 +631,8 @@
float cornerRoundness = isInLauncher ? 0 : 1;
- if (mControllers.taskbarDesktopModeController.getAreDesktopTasksVisibleAndNotInOverview()
+ if (mControllers.taskbarDesktopModeController.isInDesktopModeAndNotInOverview(
+ mControllers.taskbarActivityContext.getDisplayId())
&& mControllers.getSharedState() != null) {
cornerRoundness =
mControllers.taskbarDesktopModeController.getTaskbarCornerRoundness(
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
index 66f19eb..96bcffd 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
@@ -71,7 +71,6 @@
import com.android.launcher3.util.SimpleBroadcastReceiver;
import com.android.quickstep.AllAppsActionManager;
import com.android.quickstep.RecentsActivity;
-import com.android.quickstep.RecentsAnimationDeviceState;
import com.android.quickstep.SystemUiProxy;
import com.android.quickstep.fallback.window.RecentsDisplayModel;
import com.android.quickstep.fallback.window.RecentsWindowManager;
@@ -85,7 +84,6 @@
import java.io.PrintWriter;
import java.util.StringJoiner;
-import java.util.function.LongConsumer;
/**
* Class to manage taskbar lifecycle
@@ -126,8 +124,7 @@
private final TaskbarNavButtonController mDefaultNavButtonController;
private final ComponentCallbacks mDefaultComponentCallbacks;
- private final SimpleBroadcastReceiver mShutdownReceiver =
- new SimpleBroadcastReceiver(UI_HELPER_EXECUTOR, i -> destroyAllTaskbars());
+ private final SimpleBroadcastReceiver mShutdownReceiver;
// The source for this provider is set when Launcher is available
// We use 'non-destroyable' version here so the original provider won't be destroyed
@@ -185,8 +182,7 @@
private boolean mUserUnlocked = false;
- private final SimpleBroadcastReceiver mTaskbarBroadcastReceiver =
- new SimpleBroadcastReceiver(UI_HELPER_EXECUTOR, this::showTaskbarFromBroadcast);
+ private final SimpleBroadcastReceiver mTaskbarBroadcastReceiver;
private final AllAppsActionManager mAllAppsActionManager;
private final RecentsDisplayModel mRecentsDisplayModel;
@@ -246,8 +242,6 @@
}
};
- private final LongConsumer mSysUiFlagChangeReceiver = this::onSystemUiFlagsChanged;
-
@SuppressLint("WrongConstant")
public TaskbarManager(
Context context,
@@ -270,7 +264,13 @@
.register(NAV_BAR_KIDS_MODE, mOnSettingsChangeListener);
Log.d(TASKBAR_NOT_DESTROYED_TAG, "registering component callbacks from constructor.");
mPrimaryWindowContext.registerComponentCallbacks(mDefaultComponentCallbacks);
- mShutdownReceiver.register(mPrimaryWindowContext, Intent.ACTION_SHUTDOWN);
+ mShutdownReceiver =
+ new SimpleBroadcastReceiver(
+ mPrimaryWindowContext, UI_HELPER_EXECUTOR, i -> destroyAllTaskbars());
+ mTaskbarBroadcastReceiver =
+ new SimpleBroadcastReceiver(mPrimaryWindowContext,
+ UI_HELPER_EXECUTOR, this::showTaskbarFromBroadcast);
+ mShutdownReceiver.register(Intent.ACTION_SHUTDOWN);
UI_HELPER_EXECUTOR.execute(() -> {
mSharedState.taskbarSystemActionPendingIntent = PendingIntent.getBroadcast(
mPrimaryWindowContext,
@@ -278,14 +278,9 @@
new Intent(ACTION_SHOW_TASKBAR).setPackage(
mPrimaryWindowContext.getPackageName()),
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
- mTaskbarBroadcastReceiver.register(
- mPrimaryWindowContext, RECEIVER_NOT_EXPORTED, ACTION_SHOW_TASKBAR);
+ mTaskbarBroadcastReceiver.register(RECEIVER_NOT_EXPORTED, ACTION_SHOW_TASKBAR);
});
- RecentsAnimationDeviceState deviceState = RecentsAnimationDeviceState.INSTANCE.get(context);
- onSystemUiFlagsChanged(deviceState.getSystemUiStateFlags());
- deviceState.addSysUiFlagChangeCallback(mSysUiFlagChangeReceiver);
-
debugWhyTaskbarNotDestroyed("TaskbarManager created");
recreateTaskbar();
}
@@ -614,7 +609,7 @@
}
}
- private void onSystemUiFlagsChanged(@SystemUiStateFlags long systemUiStateFlags) {
+ public void onSystemUiFlagsChanged(@SystemUiStateFlags long systemUiStateFlags) {
if (DEBUG) {
Log.d(TAG, "SysUI flags changed: " + formatFlagChange(systemUiStateFlags,
mSharedState.sysuiStateFlags, QuickStepContract::getSystemUiStateString));
@@ -637,6 +632,7 @@
*/
public void setSetupUIVisible(boolean isVisible) {
mSharedState.setupUIVisible = isVisible;
+ mAllAppsActionManager.setSetupUiVisible(isVisible);
TaskbarActivityContext taskbar = getTaskbarForDisplay(getDefaultDisplayId());
if (taskbar != null) {
taskbar.setSetupUIVisible(isVisible);
@@ -802,7 +798,7 @@
mRecentsViewContainer = null;
debugWhyTaskbarNotDestroyed("TaskbarManager#destroy()");
removeActivityCallbacksAndListeners();
- mTaskbarBroadcastReceiver.unregisterReceiverSafely(mPrimaryWindowContext);
+ mTaskbarBroadcastReceiver.unregisterReceiverSafely();
if (mUserUnlocked) {
DisplayController.INSTANCE.get(mPrimaryWindowContext).removeChangeListener(
@@ -812,11 +808,9 @@
.unregister(USER_SETUP_COMPLETE_URI, mOnSettingsChangeListener);
SettingsCache.INSTANCE.get(mPrimaryWindowContext)
.unregister(NAV_BAR_KIDS_MODE, mOnSettingsChangeListener);
- RecentsAnimationDeviceState.INSTANCE.get(getPrimaryWindowContext())
- .removeSysUiFlagChangeCallback(mSysUiFlagChangeReceiver);
Log.d(TASKBAR_NOT_DESTROYED_TAG, "unregistering component callbacks from destroy().");
mPrimaryWindowContext.unregisterComponentCallbacks(mDefaultComponentCallbacks);
- mShutdownReceiver.unregisterReceiverSafely(mPrimaryWindowContext);
+ mShutdownReceiver.unregisterReceiverSafely();
destroyAllTaskbars();
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarPinningController.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarPinningController.kt
index 23c5070..7141bb8 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarPinningController.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarPinningController.kt
@@ -58,8 +58,9 @@
}
val shouldPinTaskbar =
if (
- controllers.taskbarDesktopModeController
- .areDesktopTasksVisibleAndNotInOverview
+ controllers.taskbarDesktopModeController.isInDesktopModeAndNotInOverview(
+ context.displayId
+ )
) {
!launcherPrefs.get(TASKBAR_PINNING_IN_DESKTOP_MODE)
} else {
@@ -140,7 +141,11 @@
@VisibleForTesting
fun recreateTaskbarAndUpdatePinningValue() {
updateIsAnimatingTaskbarPinningAndNotifyTaskbarDragLayer(false)
- if (controllers.taskbarDesktopModeController.areDesktopTasksVisibleAndNotInOverview) {
+ if (
+ controllers.taskbarDesktopModeController.isInDesktopModeAndNotInOverview(
+ context.displayId
+ )
+ ) {
launcherPrefs.put(
TASKBAR_PINNING_IN_DESKTOP_MODE,
!launcherPrefs.get(TASKBAR_PINNING_IN_DESKTOP_MODE),
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java
index feb9b33..5d8b821 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java
@@ -217,7 +217,7 @@
}
shortcuts.add(APP_INFO);
if (!mControllers.taskbarDesktopModeController
- .getAreDesktopTasksVisibleAndNotInOverview()) {
+ .isInDesktopModeAndNotInOverview(mContext.getDisplayId())) {
shortcuts.addAll(mControllers.uiController.getSplitMenuOptions().toList());
}
if (BubbleAnythingFlagHelper.enableCreateAnyBubble()) {
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java
index 2ded1bf..6016394 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java
@@ -1189,7 +1189,7 @@
if (mActivity.isHardwareKeyboard()
&& mActivity.isThreeButtonNav()
&& mControllers.taskbarDesktopModeController
- .getAreDesktopTasksVisibleAndNotInOverview()) {
+ .isInDesktopModeAndNotInOverview(mActivity.getDisplayId())) {
return false;
}
diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
index 6eec7d5..bb57d6e 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
@@ -172,12 +172,10 @@
import com.android.quickstep.OverviewCommandHelper;
import com.android.quickstep.OverviewComponentObserver;
import com.android.quickstep.OverviewComponentObserver.OverviewChangeListener;
-import com.android.quickstep.RecentsAnimationDeviceState;
-import com.android.quickstep.RecentsAnimationDeviceState.AssistantVisibilityChangeListener;
import com.android.quickstep.RecentsModel;
import com.android.quickstep.SystemUiProxy;
-import com.android.quickstep.TISBinder;
import com.android.quickstep.TaskUtils;
+import com.android.quickstep.TouchInteractionService.TISBinder;
import com.android.quickstep.util.ActiveGestureProtoLogProxy;
import com.android.quickstep.util.AsyncClockEventDelegate;
import com.android.quickstep.util.LauncherUnfoldAnimationController;
@@ -224,7 +222,7 @@
import java.util.stream.Stream;
public class QuickstepLauncher extends Launcher implements RecentsViewContainer,
- SystemShortcut.BubbleActivityStarter, AssistantVisibilityChangeListener {
+ SystemShortcut.BubbleActivityStarter {
private static final boolean TRACE_LAYOUTS =
SystemProperties.getBoolean("persist.debug.trace_layouts", false);
private static final String TRACE_RELAYOUT_CLASS =
@@ -595,8 +593,6 @@
mHotseatPredictionController.destroy();
if (mViewCapture != null) mViewCapture.close();
removeBackAnimationCallback(mSplitSelectStateController.getSplitBackHandler());
- RecentsAnimationDeviceState.INSTANCE.get(this)
- .removeAssistantVisibilityChangeListener(this);
}
@Override
@@ -730,7 +726,6 @@
View.setTracedRequestLayoutClassClass(TRACE_RELAYOUT_CLASS);
OverviewComponentObserver.INSTANCE.get(this)
.addOverviewChangeListener(mOverviewChangeListener);
- RecentsAnimationDeviceState.INSTANCE.get(this).addAssistantVisibilityChangeListener(this);
}
@Override
@@ -1052,7 +1047,7 @@
DesktopVisibilityController desktopVisibilityController =
DesktopVisibilityController.INSTANCE.get(this);
if (!ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY.isTrue()
- && desktopVisibilityController.areDesktopTasksVisibleAndNotInOverview()
+ && desktopVisibilityController.isInDesktopModeAndNotInOverview(getDisplayId())
&& !desktopVisibilityController.isRecentsGestureInProgress()) {
// Return early to skip setting activity to appear as resumed
// TODO: b/333533253 - Remove after flag rollout
@@ -1090,6 +1085,7 @@
if (taskbarManager != null) {
taskbarManager.setActivity(this);
}
+ mTISBindHelper.setPredictiveBackToHomeInProgress(mIsPredictiveBackToHomeInProgress);
}
@Override
@@ -1363,8 +1359,7 @@
*/
public void setPredictiveBackToHomeInProgress(boolean isInProgress) {
mIsPredictiveBackToHomeInProgress = isInProgress;
- RecentsAnimationDeviceState.INSTANCE.get(this)
- .setPredictiveBackToHomeInProgress(isInProgress);
+ mTISBindHelper.setPredictiveBackToHomeInProgress(isInProgress);
}
public boolean getPredictiveBackToHomeInProgress() {
@@ -1374,7 +1369,7 @@
@Override
public boolean areDesktopTasksVisible() {
return DesktopVisibilityController.INSTANCE.get(this)
- .areDesktopTasksVisibleAndNotInOverview();
+ .isInDesktopModeAndNotInOverview(getDisplayId());
}
@Override
@@ -1506,11 +1501,6 @@
return getStateManager().getState().isRecentsViewVisible;
}
- @Override
- public void onAssistantVisibilityChanged(float visibility) {
- mHotseat.getQsb().setAlpha(1f - visibility);
- }
-
public boolean isCanShowAllAppsEducationView() {
return mCanShowAllAppsEducationView;
}
diff --git a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonNavbarToOverviewTouchController.java b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonNavbarToOverviewTouchController.java
index 865e16b..ff726e6 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonNavbarToOverviewTouchController.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonNavbarToOverviewTouchController.java
@@ -28,6 +28,8 @@
import static com.android.launcher3.anim.AnimatorListeners.forSuccessCallback;
import static com.android.launcher3.util.NavigationMode.THREE_BUTTONS;
import static com.android.launcher3.util.VibratorWrapper.OVERVIEW_HAPTIC;
+import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_ONE_HANDED_ACTIVE;
+import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_OVERVIEW_DISABLED;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
@@ -45,7 +47,7 @@
import com.android.launcher3.uioverrides.QuickstepLauncher;
import com.android.launcher3.util.DisplayController;
import com.android.launcher3.util.VibratorWrapper;
-import com.android.quickstep.RecentsAnimationDeviceState;
+import com.android.quickstep.SystemUiProxy;
import com.android.quickstep.util.AnimatorControllerWithResistance;
import com.android.quickstep.util.MotionPauseDetector;
import com.android.quickstep.util.OverviewToHomeAnim;
@@ -111,8 +113,8 @@
return false;
}
mDidTouchStartInNavBar = (ev.getEdgeFlags() & EDGE_NAV_BAR) != 0;
- boolean isOneHandedModeActive =
- RecentsAnimationDeviceState.INSTANCE.get(mLauncher).isOneHandedModeActive();
+ boolean isOneHandedModeActive = (SystemUiProxy.INSTANCE.get(mLauncher)
+ .getLastSystemUiStateFlags() & SYSUI_STATE_ONE_HANDED_ACTIVE) != 0;
// Reset touch slop multiplier to default 1.0f if one-handed-mode is not active
mDetector.setTouchSlopMultiplier(
isOneHandedModeActive ? ONE_HANDED_ACTIVATED_SLOP_MULTIPLIER : 1f /* default */);
@@ -248,8 +250,9 @@
}
private boolean handlingOverviewAnim() {
+ long stateFlags = SystemUiProxy.INSTANCE.get(mLauncher).getLastSystemUiStateFlags();
return mDidTouchStartInNavBar && mStartState == NORMAL
- && !RecentsAnimationDeviceState.INSTANCE.get(mLauncher).isOverviewDisabled();
+ && (stateFlags & SYSUI_STATE_OVERVIEW_DISABLED) == 0;
}
@Override
diff --git a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonQuickSwitchTouchController.java b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonQuickSwitchTouchController.java
index 6bca4c7..05d12c3 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonQuickSwitchTouchController.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/NoButtonQuickSwitchTouchController.java
@@ -55,6 +55,7 @@
import static com.android.quickstep.views.RecentsView.RECENTS_SCALE_PROPERTY;
import static com.android.quickstep.views.RecentsView.TASK_SECONDARY_TRANSLATION;
import static com.android.quickstep.views.RecentsView.TASK_THUMBNAIL_SPLASH_ALPHA;
+import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_OVERVIEW_DISABLED;
import android.animation.Animator;
import android.animation.Animator.AnimatorListener;
@@ -78,7 +79,7 @@
import com.android.launcher3.util.DisplayController;
import com.android.launcher3.util.TouchController;
import com.android.launcher3.util.VibratorWrapper;
-import com.android.quickstep.RecentsAnimationDeviceState;
+import com.android.quickstep.SystemUiProxy;
import com.android.quickstep.util.AnimatorControllerWithResistance;
import com.android.quickstep.util.LayoutUtils;
import com.android.quickstep.util.MotionPauseDetector;
@@ -177,7 +178,8 @@
if ((ev.getEdgeFlags() & Utilities.EDGE_NAV_BAR) == 0) {
return false;
}
- if (RecentsAnimationDeviceState.INSTANCE.get(mLauncher).isOverviewDisabled()) {
+ long stateFlags = SystemUiProxy.INSTANCE.get(mLauncher).getLastSystemUiStateFlags();
+ if ((stateFlags & SYSUI_STATE_OVERVIEW_DISABLED) != 0) {
return false;
}
if (isTrackpadMultiFingerSwipe(ev)) {
diff --git a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/QuickSwitchTouchController.java b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/QuickSwitchTouchController.java
index 7547f15..f582324 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/QuickSwitchTouchController.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/QuickSwitchTouchController.java
@@ -34,6 +34,7 @@
import static com.android.quickstep.views.RecentsView.RECENTS_SCALE_PROPERTY;
import static com.android.quickstep.views.RecentsView.UPDATE_SYSUI_FLAGS_THRESHOLD;
import static com.android.systemui.shared.system.ActivityManagerWrapper.CLOSE_SYSTEM_WINDOWS_REASON_RECENTS;
+import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_OVERVIEW_DISABLED;
import android.view.MotionEvent;
@@ -45,7 +46,7 @@
import com.android.launcher3.uioverrides.QuickstepLauncher;
import com.android.launcher3.util.DisplayController;
import com.android.launcher3.util.NavigationMode;
-import com.android.quickstep.RecentsAnimationDeviceState;
+import com.android.quickstep.SystemUiProxy;
import com.android.quickstep.TaskUtils;
import com.android.quickstep.views.RecentsView;
import com.android.quickstep.views.TaskView;
@@ -83,7 +84,8 @@
@Override
protected LauncherState getTargetState(LauncherState fromState, boolean isDragTowardPositive) {
- if (RecentsAnimationDeviceState.INSTANCE.get(mLauncher).isOverviewDisabled()) {
+ long stateFlags = SystemUiProxy.INSTANCE.get(mLauncher).getLastSystemUiStateFlags();
+ if ((stateFlags & SYSUI_STATE_OVERVIEW_DISABLED) != 0) {
return NORMAL;
}
return isDragTowardPositive ? QUICK_SWITCH_FROM_HOME : NORMAL;
diff --git a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewDismissTouchController.kt b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewDismissTouchController.kt
index 77a05c1..98737a5 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewDismissTouchController.kt
+++ b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewDismissTouchController.kt
@@ -26,10 +26,12 @@
import com.android.launcher3.Utilities.isRtl
import com.android.launcher3.Utilities.mapToRange
import com.android.launcher3.touch.SingleAxisSwipeDetector
+import com.android.launcher3.util.MSDLPlayerWrapper
import com.android.launcher3.util.TouchController
import com.android.quickstep.views.RecentsView
import com.android.quickstep.views.RecentsViewContainer
import com.android.quickstep.views.TaskView
+import com.google.android.msdl.data.model.MSDLToken
import kotlin.math.abs
import kotlin.math.sign
@@ -53,6 +55,7 @@
private var springAnimation: SpringAnimation? = null
private var dismissLength: Int = 0
private var verticalFactor: Int = 0
+ private var hasDismissThresholdHapticRun = false
private var initialDisplacement: Float = 0f
private fun canInterceptTouch(ev: MotionEvent): Boolean =
@@ -159,9 +162,30 @@
}
recentsView.redrawLiveTile()
}
+ playDismissThresholdHaptic(displacement)
return true
}
+ /**
+ * Play a haptic to alert the user they have passed the dismiss threshold.
+ *
+ * <p>Check within a range of the threshold value, as the drag event does not necessarily happen
+ * at the exact threshold's displacement.
+ */
+ private fun playDismissThresholdHaptic(displacement: Float) {
+ val dismissThreshold = (DISMISS_THRESHOLD_FRACTION * dismissLength * verticalFactor)
+ val inHapticRange =
+ displacement >= (dismissThreshold - DISMISS_THRESHOLD_HAPTIC_RANGE) &&
+ displacement <= (dismissThreshold + DISMISS_THRESHOLD_HAPTIC_RANGE)
+ if (!inHapticRange) {
+ hasDismissThresholdHapticRun = false
+ } else if (!hasDismissThresholdHapticRun) {
+ MSDLPlayerWrapper.INSTANCE.get(recentsView.context)
+ .playToken(MSDLToken.SWIPE_THRESHOLD_INDICATOR)
+ hasDismissThresholdHapticRun = true
+ }
+ }
+
override fun onDragEnd(velocity: Float) {
val taskBeingDragged = taskBeingDragged ?: return
@@ -208,5 +232,6 @@
companion object {
private const val DISMISS_THRESHOLD_FRACTION = 0.5f
+ private const val DISMISS_THRESHOLD_HAPTIC_RANGE = 10f
}
}
diff --git a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
index f46f9ae..b43c3ac 100644
--- a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
+++ b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
@@ -2453,7 +2453,8 @@
}
@Override
- public void onTasksAppeared(@NonNull RemoteAnimationTarget[] appearedTaskTargets) {
+ public void onTasksAppeared(@NonNull RemoteAnimationTarget[] appearedTaskTargets,
+ @Nullable TransitionInfo transitionInfo) {
if (mRecentsAnimationController == null) {
return;
}
diff --git a/quickstep/src/com/android/quickstep/AllAppsActionManager.kt b/quickstep/src/com/android/quickstep/AllAppsActionManager.kt
index 6fd68d5..b807a4b 100644
--- a/quickstep/src/com/android/quickstep/AllAppsActionManager.kt
+++ b/quickstep/src/com/android/quickstep/AllAppsActionManager.kt
@@ -21,10 +21,16 @@
import android.app.RemoteAction
import android.content.Context
import android.graphics.drawable.Icon
+import android.provider.Settings
+import android.provider.Settings.Secure.USER_SETUP_COMPLETE
import android.view.accessibility.AccessibilityManager
import com.android.launcher3.R
+import com.android.launcher3.util.SettingsCache
+import com.android.launcher3.util.SettingsCache.OnChangeListener
import java.util.concurrent.Executor
+private val USER_SETUP_COMPLETE_URI = Settings.Secure.getUriFor(USER_SETUP_COMPLETE)
+
/**
* Registers a [RemoteAction] for toggling All Apps if needed.
*
@@ -38,6 +44,12 @@
private val createAllAppsPendingIntent: () -> PendingIntent,
) {
+ private val onSettingsChangeListener = OnChangeListener { v -> isUserSetupComplete = v }
+
+ init {
+ SettingsCache.INSTANCE[context].register(USER_SETUP_COMPLETE_URI, onSettingsChangeListener)
+ }
+
/** `true` if home and overview are the same Activity. */
var isHomeAndOverviewSame = false
set(value) {
@@ -52,12 +64,27 @@
updateSystemAction()
}
+ /** `true` if the setup UI is visible. */
+ var isSetupUiVisible = false
+ set(value) {
+ field = value
+ updateSystemAction()
+ }
+
+ private var isUserSetupComplete =
+ SettingsCache.INSTANCE[context].getValue(USER_SETUP_COMPLETE_URI, 0)
+ set(value) {
+ field = value
+ updateSystemAction()
+ }
+
/** `true` if the action should be registered. */
var isActionRegistered = false
private set
private fun updateSystemAction() {
- val shouldRegisterAction = isHomeAndOverviewSame || isTaskbarPresent
+ val isInSetupFlow = isSetupUiVisible || !isUserSetupComplete
+ val shouldRegisterAction = (isHomeAndOverviewSame || isTaskbarPresent) && !isInSetupFlow
if (isActionRegistered == shouldRegisterAction) return
isActionRegistered = shouldRegisterAction
@@ -84,8 +111,10 @@
isActionRegistered = false
context
.getSystemService(AccessibilityManager::class.java)
- ?.unregisterSystemAction(
- GLOBAL_ACTION_ACCESSIBILITY_ALL_APPS,
- )
+ ?.unregisterSystemAction(GLOBAL_ACTION_ACCESSIBILITY_ALL_APPS)
+ SettingsCache.INSTANCE[context].unregister(
+ USER_SETUP_COMPLETE_URI,
+ onSettingsChangeListener,
+ )
}
}
diff --git a/quickstep/src/com/android/quickstep/BaseActivityInterface.java b/quickstep/src/com/android/quickstep/BaseActivityInterface.java
index 7cab751..549c2f8 100644
--- a/quickstep/src/com/android/quickstep/BaseActivityInterface.java
+++ b/quickstep/src/com/android/quickstep/BaseActivityInterface.java
@@ -87,7 +87,7 @@
// We were on our way to this state when we got canceled, end there instead.
startState = stateFromGestureEndTarget(endTarget);
if (DesktopVisibilityController.INSTANCE.get(activity)
- .areDesktopTasksVisibleAndNotInOverview()
+ .isInDesktopModeAndNotInOverview(activity.getDisplayId())
&& endTarget == LAST_TASK) {
// When we are cancelling the transition and going back to last task, move to
// rest state instead when desktop tasks are visible.
diff --git a/quickstep/src/com/android/quickstep/BaseContainerInterface.java b/quickstep/src/com/android/quickstep/BaseContainerInterface.java
index 82fbaa6..c64067a 100644
--- a/quickstep/src/com/android/quickstep/BaseContainerInterface.java
+++ b/quickstep/src/com/android/quickstep/BaseContainerInterface.java
@@ -83,6 +83,8 @@
public abstract boolean isInLiveTileMode();
+ public abstract void onAssistantVisibilityChanged(float assistantVisibility);
+
public abstract boolean isResumed();
public abstract boolean isStarted();
@@ -231,8 +233,10 @@
if (endTarget != null) {
// We were on our way to this state when we got canceled, end there instead.
startState = stateFromGestureEndTarget(endTarget);
- if (DesktopVisibilityController.INSTANCE.get(recentsView.getContext())
- .areDesktopTasksVisibleAndNotInOverview() && endTarget == LAST_TASK) {
+ final var context = recentsView.getContext();
+ if (DesktopVisibilityController.INSTANCE.get(context)
+ .isInDesktopModeAndNotInOverview(context.getDisplayId())
+ && endTarget == LAST_TASK) {
// When we are cancelling the transition and going back to last task, move to
// rest state instead when desktop tasks are visible.
// If a fullscreen task is visible, launcher goes to normal state when the
diff --git a/quickstep/src/com/android/quickstep/FallbackActivityInterface.java b/quickstep/src/com/android/quickstep/FallbackActivityInterface.java
index d122d24..d8e0296 100644
--- a/quickstep/src/com/android/quickstep/FallbackActivityInterface.java
+++ b/quickstep/src/com/android/quickstep/FallbackActivityInterface.java
@@ -69,6 +69,14 @@
}
}
+ /** 5 */
+ @Override
+ public void onAssistantVisibilityChanged(float visibility) {
+ // This class becomes active when the screen is locked.
+ // Rather than having it handle assistant visibility changes, the assistant visibility is
+ // set to zero prior to this class becoming active.
+ }
+
/** 6 */
@Override
public AnimationFactory prepareRecentsUI(
diff --git a/quickstep/src/com/android/quickstep/FallbackSwipeHandler.java b/quickstep/src/com/android/quickstep/FallbackSwipeHandler.java
index 331580c..7d8a53d 100644
--- a/quickstep/src/com/android/quickstep/FallbackSwipeHandler.java
+++ b/quickstep/src/com/android/quickstep/FallbackSwipeHandler.java
@@ -50,6 +50,7 @@
import android.view.Surface;
import android.view.SurfaceControl;
import android.view.SurfaceControl.Transaction;
+import android.window.TransitionInfo;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -172,14 +173,15 @@
}
@Override
- public void onTasksAppeared(@NonNull RemoteAnimationTarget[] appearedTaskTargets) {
+ public void onTasksAppeared(@NonNull RemoteAnimationTarget[] appearedTaskTargets,
+ @Nullable TransitionInfo transitionInfo) {
if (mActiveAnimationFactory != null && mActiveAnimationFactory.handleHomeTaskAppeared(
appearedTaskTargets)) {
mActiveAnimationFactory = null;
return;
}
- super.onTasksAppeared(appearedTaskTargets);
+ super.onTasksAppeared(appearedTaskTargets, transitionInfo);
}
@Override
diff --git a/quickstep/src/com/android/quickstep/FallbackWindowInterface.java b/quickstep/src/com/android/quickstep/FallbackWindowInterface.java
index 33fe02e..35630ef 100644
--- a/quickstep/src/com/android/quickstep/FallbackWindowInterface.java
+++ b/quickstep/src/com/android/quickstep/FallbackWindowInterface.java
@@ -70,6 +70,14 @@
}
}
+ /** 5 */
+ @Override
+ public void onAssistantVisibilityChanged(float visibility) {
+ // This class becomes active when the screen is locked.
+ // Rather than having it handle assistant visibility changes, the assistant visibility is
+ // set to zero prior to this class becoming active.
+ }
+
/** 6 */
@Override
public BaseWindowInterface.AnimationFactory prepareRecentsUI(boolean activityVisible,
diff --git a/quickstep/src/com/android/quickstep/InputConsumerUtils.kt b/quickstep/src/com/android/quickstep/InputConsumerUtils.kt
index 1a82d3b..c340c92 100644
--- a/quickstep/src/com/android/quickstep/InputConsumerUtils.kt
+++ b/quickstep/src/com/android/quickstep/InputConsumerUtils.kt
@@ -18,6 +18,7 @@
import android.content.Context
import android.view.MotionEvent
import androidx.annotation.VisibleForTesting
+import com.android.launcher3.anim.AnimatedFloat
import com.android.launcher3.statemanager.BaseState
import com.android.launcher3.statemanager.StatefulContainer
import com.android.launcher3.taskbar.TaskbarManager
@@ -46,6 +47,7 @@
import com.android.systemui.shared.system.InputMonitorCompat
import com.android.wm.shell.Flags
import java.util.function.Consumer
+import java.util.function.Function
/** Utility class for creating input consumers. */
object InputConsumerUtils {
@@ -66,6 +68,7 @@
onCompleteCallback: Consumer<OtherActivityInputConsumer>,
inputEventReceiver: InputChannelCompat.InputEventReceiver,
taskbarManager: TaskbarManager,
+ swipeUpProxyProvider: Function<GestureState?, AnimatedFloat?>,
overviewCommandHelper: OverviewCommandHelper,
event: MotionEvent,
): InputConsumer where T : RecentsViewContainer, T : StatefulContainer<S> {
@@ -80,7 +83,7 @@
)
return consumer
}
- val progressProxy = deviceState.getSwipeUpProxy(gestureState)
+ val progressProxy = swipeUpProxyProvider.apply(gestureState)
if (progressProxy != null) {
val consumer: InputConsumer =
ProgressDelegateInputConsumer(
diff --git a/quickstep/src/com/android/quickstep/LauncherActivityInterface.java b/quickstep/src/com/android/quickstep/LauncherActivityInterface.java
index 2c37470..ac0aa76 100644
--- a/quickstep/src/com/android/quickstep/LauncherActivityInterface.java
+++ b/quickstep/src/com/android/quickstep/LauncherActivityInterface.java
@@ -97,6 +97,15 @@
}
@Override
+ public void onAssistantVisibilityChanged(float visibility) {
+ QuickstepLauncher launcher = getCreatedContainer();
+ if (launcher == null) {
+ return;
+ }
+ launcher.onAssistantVisibilityChanged(visibility);
+ }
+
+ @Override
public AnimationFactory prepareRecentsUI(
boolean activityVisible, Consumer<AnimatorControllerWithResistance> callback) {
notifyRecentsOfOrientation();
diff --git a/quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java b/quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java
index e1e9c99..0a77688 100644
--- a/quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java
+++ b/quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java
@@ -107,7 +107,7 @@
&& workspaceView.isAttachedToWindow()
&& workspaceView.getHeight() > 0
&& !DesktopVisibilityController.INSTANCE.get(mContainer)
- .areDesktopTasksVisibleAndNotInOverview();
+ .isInDesktopModeAndNotInOverview(mContainer.getDisplayId());
mContainer.getRootView().setForceHideBackArrow(true);
diff --git a/quickstep/src/com/android/quickstep/OverviewComponentObserver.java b/quickstep/src/com/android/quickstep/OverviewComponentObserver.java
index a34b239..bc3de41 100644
--- a/quickstep/src/com/android/quickstep/OverviewComponentObserver.java
+++ b/quickstep/src/com/android/quickstep/OverviewComponentObserver.java
@@ -57,7 +57,6 @@
import java.util.List;
import java.util.Objects;
import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.function.LongConsumer;
import javax.inject.Inject;
@@ -73,14 +72,10 @@
new DaggerSingletonObject<>(LauncherAppComponent::getOverviewComponentObserver);
// We register broadcast receivers on main thread to avoid missing updates.
- private final SimpleBroadcastReceiver mUserPreferenceChangeReceiver =
- new SimpleBroadcastReceiver(MAIN_EXECUTOR, this::updateOverviewTargets);
- private final SimpleBroadcastReceiver mOtherHomeAppUpdateReceiver =
- new SimpleBroadcastReceiver(MAIN_EXECUTOR, this::updateOverviewTargets);
+ private final SimpleBroadcastReceiver mUserPreferenceChangeReceiver;
+ private final SimpleBroadcastReceiver mOtherHomeAppUpdateReceiver;
- private final Context mContext;
private final RecentsDisplayModel mRecentsDisplayModel;
- private final RecentsAnimationDeviceState mDeviceState;
private final Intent mCurrentHomeIntent;
private final Intent mMyHomeIntent;
@@ -102,13 +97,14 @@
public OverviewComponentObserver(
@ApplicationContext Context context,
RecentsDisplayModel recentsDisplayModel,
- RecentsAnimationDeviceState deviceState,
DaggerSingletonTracker lifecycleTracker) {
- mContext = context;
+ mUserPreferenceChangeReceiver =
+ new SimpleBroadcastReceiver(context, MAIN_EXECUTOR, this::updateOverviewTargets);
+ mOtherHomeAppUpdateReceiver =
+ new SimpleBroadcastReceiver(context, MAIN_EXECUTOR, this::updateOverviewTargets);
mRecentsDisplayModel = recentsDisplayModel;
- mDeviceState = deviceState;
mCurrentHomeIntent = createHomeIntent();
- mMyHomeIntent = new Intent(mCurrentHomeIntent).setPackage(mContext.getPackageName());
+ mMyHomeIntent = new Intent(mCurrentHomeIntent).setPackage(context.getPackageName());
ResolveInfo info = context.getPackageManager().resolveActivity(mMyHomeIntent, 0);
ComponentName myHomeComponent =
new ComponentName(context.getPackageName(), info.activityInfo.name);
@@ -116,7 +112,7 @@
mConfigChangesMap.append(myHomeComponent.hashCode(), info.activityInfo.configChanges);
mSetupWizardPkg = context.getString(R.string.setup_wizard_pkg);
- ComponentName fallbackComponent = new ComponentName(mContext, RecentsActivity.class);
+ ComponentName fallbackComponent = new ComponentName(context, RecentsActivity.class);
mFallbackIntent = new Intent(Intent.ACTION_MAIN)
.addCategory(Intent.CATEGORY_DEFAULT)
.setComponent(fallbackComponent)
@@ -128,16 +124,10 @@
mConfigChangesMap.append(fallbackComponent.hashCode(), fallbackInfo.configChanges);
} catch (PackageManager.NameNotFoundException ignored) { /* Impossible */ }
- mUserPreferenceChangeReceiver.register(mContext, ACTION_PREFERRED_ACTIVITY_CHANGED);
+ mUserPreferenceChangeReceiver.register(ACTION_PREFERRED_ACTIVITY_CHANGED);
updateOverviewTargets();
lifecycleTracker.addCloseable(this::onDestroy);
-
- setHomeDisabled(deviceState.isHomeDisabled());
- LongConsumer flagChangeCallback = l -> setHomeDisabled(deviceState.isHomeDisabled());
- deviceState.addSysUiFlagChangeCallback(flagChangeCallback);
- lifecycleTracker.addCloseable(
- () -> deviceState.removeSysUiFlagChangeCallback(flagChangeCallback));
}
/** Adds a listener for changes in {@link #isHomeAndOverviewSame()} */
@@ -150,7 +140,11 @@
mOverviewChangeListeners.remove(overviewChangeListener);
}
- private void setHomeDisabled(boolean isHomeDisabled) {
+ /**
+ * Called to set home enabled/disabled state via systemUI
+ * @param isHomeDisabled
+ */
+ public void setHomeDisabled(boolean isHomeDisabled) {
if (isHomeDisabled != mIsHomeDisabled) {
mIsHomeDisabled = isHomeDisabled;
updateOverviewTargets();
@@ -181,7 +175,9 @@
// Set assistant visibility to 0 from launcher's perspective, ensures any elements that
// launcher made invisible become visible again before the new activity control helper
// becomes active.
- mDeviceState.setAssistantVisibility(0f);
+ if (mContainerInterface != null) {
+ mContainerInterface.onAssistantVisibilityChanged(0.f);
+ }
if (SEPARATE_RECENTS_ACTIVITY.get() || Flags.enableLauncherOverviewInWindow()) {
mIsDefaultHome = false;
@@ -228,7 +224,7 @@
mUpdateRegisteredPackage = defaultHome.getPackageName();
mOtherHomeAppUpdateReceiver.registerPkgActions(
- mContext, mUpdateRegisteredPackage, ACTION_PACKAGE_ADDED,
+ mUpdateRegisteredPackage, ACTION_PACKAGE_ADDED,
ACTION_PACKAGE_CHANGED, ACTION_PACKAGE_REMOVED);
}
}
@@ -239,13 +235,13 @@
* Clean up any registered receivers.
*/
private void onDestroy() {
- mUserPreferenceChangeReceiver.unregisterReceiverSafely(mContext);
+ mUserPreferenceChangeReceiver.unregisterReceiverSafely();
unregisterOtherHomeAppUpdateReceiver();
}
private void unregisterOtherHomeAppUpdateReceiver() {
if (mUpdateRegisteredPackage != null) {
- mOtherHomeAppUpdateReceiver.unregisterReceiverSafely(mContext);
+ mOtherHomeAppUpdateReceiver.unregisterReceiverSafely();
mUpdateRegisteredPackage = null;
}
}
diff --git a/quickstep/src/com/android/quickstep/QuickstepTestInformationHandler.java b/quickstep/src/com/android/quickstep/QuickstepTestInformationHandler.java
index 90221f3..9b0e75c 100644
--- a/quickstep/src/com/android/quickstep/QuickstepTestInformationHandler.java
+++ b/quickstep/src/com/android/quickstep/QuickstepTestInformationHandler.java
@@ -172,7 +172,7 @@
return response;
case TestProtocol.REQUEST_REFRESH_OVERVIEW_TARGET:
- runOnTISBinder(TISBinder::refreshOverviewTarget);
+ runOnTISBinder(TouchInteractionService.TISBinder::refreshOverviewTarget);
return response;
case TestProtocol.REQUEST_RECREATE_TASKBAR:
@@ -220,7 +220,7 @@
}
private void enableBlockingTimeout(
- TISBinder tisBinder, boolean enable) {
+ TouchInteractionService.TISBinder tisBinder, boolean enable) {
TaskbarActivityContext context = tisBinder.getTaskbarManager().getCurrentActivityContext();
if (context == null) {
return;
@@ -236,7 +236,7 @@
* Runs the given command on the UI thread, after ensuring we are connected to
* TouchInteractionService.
*/
- protected void runOnTISBinder(Consumer<TISBinder> connectionCallback) {
+ protected void runOnTISBinder(Consumer<TouchInteractionService.TISBinder> connectionCallback) {
try {
CountDownLatch countDownLatch = new CountDownLatch(1);
TISBindHelper helper = MAIN_EXECUTOR.submit(() ->
@@ -252,7 +252,7 @@
}
private <T> Bundle getTISBinderUIProperty(
- BundleSetter<T> bundleSetter, Function<TISBinder, T> provider) {
+ BundleSetter<T> bundleSetter, Function<TouchInteractionService.TISBinder, T> provider) {
Bundle response = new Bundle();
runOnTISBinder(tisBinder -> bundleSetter.set(
diff --git a/quickstep/src/com/android/quickstep/RecentsActivity.java b/quickstep/src/com/android/quickstep/RecentsActivity.java
index 760130e..3d12fdf 100644
--- a/quickstep/src/com/android/quickstep/RecentsActivity.java
+++ b/quickstep/src/com/android/quickstep/RecentsActivity.java
@@ -165,7 +165,7 @@
mTISBindHelper = new TISBindHelper(this, this::onTISConnected);
}
- private void onTISConnected(TISBinder binder) {
+ private void onTISConnected(TouchInteractionService.TISBinder binder) {
TaskbarManager taskbarManager = binder.getTaskbarManager();
if (taskbarManager != null) {
taskbarManager.setActivity(this);
@@ -319,7 +319,7 @@
/**
* Composes the animations for a launch from the recents list if possible.
*/
- private AnimatorSet composeRecentsLaunchAnimator(
+ private AnimatorSet composeRecentsLaunchAnimator(
@NonNull RecentsView recentsView,
@NonNull TaskView taskView,
RemoteAnimationTarget[] appTargets,
@@ -329,7 +329,8 @@
boolean activityClosing = taskIsATargetWithMode(appTargets, getTaskId(), MODE_CLOSING);
PendingAnimation pa = new PendingAnimation(RECENTS_LAUNCH_DURATION);
createRecentsWindowAnimator(recentsView, taskView, !activityClosing, appTargets,
- wallpaperTargets, nonAppTargets, null /* depthController */, pa);
+ wallpaperTargets, nonAppTargets, /* depthController= */ null ,
+ /* transitionInfo= */ null, pa);
target.play(pa.buildAnim());
// Found a visible recents task that matches the opening app, lets launch the app from there
diff --git a/quickstep/src/com/android/quickstep/RecentsAnimationCallbacks.java b/quickstep/src/com/android/quickstep/RecentsAnimationCallbacks.java
index c6b858b..c276447 100644
--- a/quickstep/src/com/android/quickstep/RecentsAnimationCallbacks.java
+++ b/quickstep/src/com/android/quickstep/RecentsAnimationCallbacks.java
@@ -163,11 +163,12 @@
@BinderThread
@Override
- public void onTasksAppeared(RemoteAnimationTarget[] apps) {
+ public void onTasksAppeared(
+ RemoteAnimationTarget[] apps, @Nullable TransitionInfo transitionInfo) {
Utilities.postAsyncCallback(MAIN_EXECUTOR.getHandler(), () -> {
ActiveGestureProtoLogProxy.logRecentsAnimationCallbacksOnTasksAppeared();
for (RecentsAnimationListener listener : getListeners()) {
- listener.onTasksAppeared(apps);
+ listener.onTasksAppeared(apps, transitionInfo);
}
});
}
@@ -225,6 +226,7 @@
/**
* Callback made when a task started from the recents is ready for an app transition.
*/
- default void onTasksAppeared(@NonNull RemoteAnimationTarget[] appearedTaskTarget) {}
+ default void onTasksAppeared(@NonNull RemoteAnimationTarget[] appearedTaskTarget,
+ @Nullable TransitionInfo transitionInfo) {}
}
}
diff --git a/quickstep/src/com/android/quickstep/RecentsAnimationDeviceState.java b/quickstep/src/com/android/quickstep/RecentsAnimationDeviceState.java
index 322e7c4..090ccdc 100644
--- a/quickstep/src/com/android/quickstep/RecentsAnimationDeviceState.java
+++ b/quickstep/src/com/android/quickstep/RecentsAnimationDeviceState.java
@@ -64,7 +64,6 @@
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
-import com.android.launcher3.anim.AnimatedFloat;
import com.android.launcher3.dagger.ApplicationContext;
import com.android.launcher3.dagger.LauncherAppComponent;
import com.android.launcher3.dagger.LauncherAppSingleton;
@@ -89,10 +88,6 @@
import com.android.systemui.shared.system.TaskStackChangeListeners;
import java.io.PrintWriter;
-import java.util.List;
-import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.function.Function;
-import java.util.function.LongConsumer;
import javax.inject.Inject;
@@ -123,16 +118,12 @@
private final boolean mCanImeRenderGesturalNavButtons =
InputMethodService.canImeRenderGesturalNavButtons();
- private final List<LongConsumer> mFlagChangeCallbacks = new CopyOnWriteArrayList<>();
private @SystemUiStateFlags long mSystemUiStateFlags = QuickStepContract.SYSUI_STATE_AWAKE;
private NavigationMode mMode = THREE_BUTTONS;
private NavBarPosition mNavBarPosition;
private final Region mDeferredGestureRegion = new Region();
private boolean mAssistantAvailable;
-
- private final List<AssistantVisibilityChangeListener> mAssistantVisibilityChangeListeners =
- new CopyOnWriteArrayList<>();
private float mAssistantVisibility;
private boolean mIsUserSetupComplete;
private boolean mIsOneHandedModeEnabled;
@@ -145,8 +136,6 @@
private @NonNull Region mExclusionRegion = GestureExclusionManager.EMPTY_REGION;
private boolean mExclusionListenerRegistered;
- private Function<GestureState, AnimatedFloat> mSwipeUpProxyProvider = null;
-
@VisibleForTesting
@Inject
RecentsAnimationDeviceState(
@@ -366,9 +355,8 @@
/**
* Updates the system ui state flags from SystemUI.
*/
- public void setSystemUiStateFlags(@SystemUiStateFlags long stateFlags) {
+ public void setSystemUiFlags(@SystemUiStateFlags long stateFlags) {
mSystemUiStateFlags = stateFlags;
- mFlagChangeCallbacks.forEach(c -> c.accept(stateFlags));
}
/**
@@ -381,20 +369,6 @@
}
/**
- * Adds a callback to receiver sysui flag changes
- */
- public void addSysUiFlagChangeCallback(LongConsumer callback) {
- mFlagChangeCallbacks.add(callback);
- }
-
- /**
- * Removes a previously added sysui flag change callback
- */
- public void removeSysUiFlagChangeCallback(LongConsumer callback) {
- mFlagChangeCallbacks.remove(callback);
- }
-
- /**
* Sets the flag that indicates whether a predictive back-to-home animation is in progress
*/
public void setPredictiveBackToHomeInProgress(boolean isInProgress) {
@@ -409,22 +383,6 @@
}
/**
- * Sets or clears a function to proxy swipe up transition behavior
- */
- public void setSwipeUpProxyProvider(
- @Nullable Function<GestureState, AnimatedFloat> swipeUpProxyProvider) {
- mSwipeUpProxyProvider = swipeUpProxyProvider;
- }
-
- /**
- * Returns a proxy animation for swipe up transition if a proxy function was previously set
- */
- public AnimatedFloat getSwipeUpProxy(GestureState state) {
- Function<GestureState, AnimatedFloat> provider = mSwipeUpProxyProvider;
- return provider != null ? provider.apply(state) : null;
- }
-
- /**
* @return whether SystemUI is in a state where we can start a system gesture.
*/
public boolean canStartSystemGesture() {
@@ -577,8 +535,6 @@
*/
public void setAssistantVisibility(float visibility) {
mAssistantVisibility = visibility;
- mAssistantVisibilityChangeListeners.forEach(
- l -> l.onAssistantVisibilityChanged(visibility));
}
/**
@@ -588,16 +544,6 @@
return mAssistantVisibility;
}
- /** Add a listener for assistant visibility changes */
- public void addAssistantVisibilityChangeListener(AssistantVisibilityChangeListener l) {
- mAssistantVisibilityChangeListeners.add(l);
- }
-
- /** Removes a previously added visibility change listener */
- public void removeAssistantVisibilityChangeListener(AssistantVisibilityChangeListener l) {
- mAssistantVisibilityChangeListeners.remove(l);
- }
-
/**
* @return whether the Assistant gesture can be used in 3 button navigation mode.
*/
@@ -687,13 +633,6 @@
return QuickStepContract.getSystemUiStateString(mSystemUiStateFlags);
}
- /** Interface for listening assistant visibility change */
- @FunctionalInterface
- public interface AssistantVisibilityChangeListener {
- /** Called when assistant visibility changes */
- void onAssistantVisibilityChanged(float visibility);
- }
-
public void dump(PrintWriter pw) {
pw.println("DeviceState:");
pw.println(" canStartSystemGesture=" + canStartSystemGesture());
diff --git a/quickstep/src/com/android/quickstep/SystemUiProxy.kt b/quickstep/src/com/android/quickstep/SystemUiProxy.kt
index 32bdcdb..1f3eb2a 100644
--- a/quickstep/src/com/android/quickstep/SystemUiProxy.kt
+++ b/quickstep/src/com/android/quickstep/SystemUiProxy.kt
@@ -65,6 +65,7 @@
import com.android.systemui.shared.recents.ISystemUiProxy
import com.android.systemui.shared.recents.model.ThumbnailData.Companion.wrap
import com.android.systemui.shared.system.QuickStepContract
+import com.android.systemui.shared.system.QuickStepContract.SystemUiStateFlags
import com.android.systemui.shared.system.RecentsAnimationControllerCompat
import com.android.systemui.shared.system.RecentsAnimationListener
import com.android.systemui.shared.system.smartspace.ILauncherUnlockAnimationController
@@ -161,6 +162,9 @@
private val asyncHandler =
Handler(Executors.UI_HELPER_EXECUTOR.looper) { handleMessageAsync(it) }
+ // TODO(141886704): Find a way to remove this
+ @SystemUiStateFlags var lastSystemUiStateFlags: Long = 0
+
/**
* This is a singleton pending intent that is used to start recents via Shell (which is a
* different process). It is bare-bones, so it's expected that the component and options will be
@@ -190,7 +194,7 @@
private inline fun executeWithErrorLog(
errorMsg: () -> String,
tag: String = TAG,
- callback: () -> Unit,
+ callback: () -> Any?,
) {
try {
callback.invoke()
@@ -228,30 +232,36 @@
* Sets proxy state, including death linkage, various listeners, and other configuration objects
*/
@MainThread
- fun setProxy(bundle: Bundle) {
+ fun setProxy(
+ proxy: ISystemUiProxy?,
+ pip: IPip?,
+ bubbles: IBubbles?,
+ splitScreen: ISplitScreen?,
+ oneHanded: IOneHanded?,
+ shellTransitions: IShellTransitions?,
+ startingWindow: IStartingWindow?,
+ recentTasks: IRecentTasks?,
+ sysuiUnlockAnimationController: ISysuiUnlockAnimationController?,
+ backAnimation: IBackAnimation?,
+ desktopMode: IDesktopMode?,
+ unfoldAnimation: IUnfoldAnimation?,
+ dragAndDrop: IDragAndDrop?,
+ ) {
Preconditions.assertUIThread()
unlinkToDeath()
- systemUiProxy = ISystemUiProxy.Stub.asInterface(bundle.getBinder(ISystemUiProxy.DESCRIPTOR))
- pip = IPip.Stub.asInterface(bundle.getBinder(IPip.DESCRIPTOR))
- bubbles = IBubbles.Stub.asInterface(bundle.getBinder(IBubbles.DESCRIPTOR))
- splitScreen = ISplitScreen.Stub.asInterface(bundle.getBinder(ISplitScreen.DESCRIPTOR))
- oneHanded = IOneHanded.Stub.asInterface(bundle.getBinder(IOneHanded.DESCRIPTOR))
- shellTransitions =
- IShellTransitions.Stub.asInterface(bundle.getBinder(IShellTransitions.DESCRIPTOR))
- startingWindow =
- IStartingWindow.Stub.asInterface(bundle.getBinder(IStartingWindow.DESCRIPTOR))
- sysuiUnlockAnimationController =
- ISysuiUnlockAnimationController.Stub.asInterface(
- bundle.getBinder(ISysuiUnlockAnimationController.DESCRIPTOR)
- )
- recentTasks = IRecentTasks.Stub.asInterface(bundle.getBinder(IRecentTasks.DESCRIPTOR))
- backAnimation = IBackAnimation.Stub.asInterface(bundle.getBinder(IBackAnimation.DESCRIPTOR))
- desktopMode = IDesktopMode.Stub.asInterface(bundle.getBinder(IDesktopMode.DESCRIPTOR))
- unfoldAnimation =
- if (Flags.enableUnfoldStateAnimation()) null
- else IUnfoldAnimation.Stub.asInterface(bundle.getBinder(IUnfoldAnimation.DESCRIPTOR))
- dragAndDrop = IDragAndDrop.Stub.asInterface(bundle.getBinder(IDragAndDrop.DESCRIPTOR))
-
+ systemUiProxy = proxy
+ this.pip = pip
+ this.bubbles = bubbles
+ this.splitScreen = splitScreen
+ this.oneHanded = oneHanded
+ this.shellTransitions = shellTransitions
+ this.startingWindow = startingWindow
+ this.sysuiUnlockAnimationController = sysuiUnlockAnimationController
+ this.recentTasks = recentTasks
+ this.backAnimation = backAnimation
+ this.desktopMode = desktopMode
+ this.unfoldAnimation = if (Flags.enableUnfoldStateAnimation()) null else unfoldAnimation
+ this.dragAndDrop = dragAndDrop
linkToDeath()
// re-attach the listeners once missing due to setProxy has not been initialized yet.
setPipAnimationListener(pipAnimationListener)
@@ -279,12 +289,15 @@
stateChangeCallbacks.forEach { it.run() }
if (unfoldTransitionProvider != null) {
- unfoldTransitionProvider.isActive = false
- executeWithErrorLog({ "Failed to set unfold anim listener" }) {
- unfoldAnimation?.apply {
- setListener(unfoldTransitionProvider)
+ if (unfoldAnimation != null) {
+ try {
+ unfoldAnimation.setListener(unfoldTransitionProvider)
unfoldTransitionProvider.isActive = true
+ } catch (e: RemoteException) {
+ // Ignore
}
+ } else {
+ unfoldTransitionProvider.isActive = false
}
}
}
@@ -292,7 +305,9 @@
/**
* Clear the proxy to release held resources and turn the majority of its operations into no-ops
*/
- @MainThread fun clearProxy() = setProxy(Bundle.EMPTY)
+ @MainThread
+ fun clearProxy() =
+ setProxy(null, null, null, null, null, null, null, null, null, null, null, null, null)
/** Adds a callback to be notified whenever the active state changes */
fun addOnStateChangeListener(callback: Runnable) = stateChangeCallbacks.add(callback)
@@ -1203,8 +1218,12 @@
override fun onAnimationCanceled(taskIds: IntArray?, taskSnapshots: Array<TaskSnapshot>?) =
listener.onAnimationCanceled(wrap(taskIds, taskSnapshots))
- override fun onTasksAppeared(apps: Array<RemoteAnimationTarget>?) =
- listener.onTasksAppeared(apps)
+ override fun onTasksAppeared(
+ apps: Array<RemoteAnimationTarget>?,
+ transitionInfo: TransitionInfo?,
+ ) {
+ listener.onTasksAppeared(apps, transitionInfo)
+ }
}
//
diff --git a/quickstep/src/com/android/quickstep/TISBinder.kt b/quickstep/src/com/android/quickstep/TISBinder.kt
deleted file mode 100644
index 683012c..0000000
--- a/quickstep/src/com/android/quickstep/TISBinder.kt
+++ /dev/null
@@ -1,249 +0,0 @@
-/*
- * Copyright (C) 2025 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.quickstep
-
-import android.graphics.Region
-import android.os.Bundle
-import android.os.IRemoteCallback
-import android.os.RemoteException
-import android.util.Log
-import androidx.annotation.BinderThread
-import androidx.annotation.VisibleForTesting
-import com.android.launcher3.taskbar.TaskbarManager
-import com.android.launcher3.testing.TestLogging
-import com.android.launcher3.testing.shared.TestProtocol
-import com.android.launcher3.util.Executors
-import com.android.quickstep.OverviewCommandHelper.CommandType.HIDE
-import com.android.quickstep.OverviewCommandHelper.CommandType.KEYBOARD_INPUT
-import com.android.quickstep.OverviewCommandHelper.CommandType.SHOW
-import com.android.quickstep.OverviewCommandHelper.CommandType.TOGGLE
-import com.android.quickstep.util.ActivityPreloadUtil.preloadOverviewForTIS
-import com.android.quickstep.util.ContextualSearchInvoker
-import com.android.systemui.shared.recents.ILauncherProxy
-import com.android.systemui.shared.statusbar.phone.BarTransitions.TransitionMode
-import com.android.systemui.shared.system.ActivityManagerWrapper.CLOSE_SYSTEM_WINDOWS_REASON_RECENTS
-import com.android.systemui.shared.system.QuickStepContract.SystemUiStateFlags
-import java.lang.ref.WeakReference
-
-/** Local ILauncherProxy implementation with some methods for local components */
-private const val TAG = "TISBinder"
-
-class TISBinder internal constructor(tis: TouchInteractionService) : ILauncherProxy.Stub() {
-
- private val mTis = WeakReference(tis)
-
- /** Returns the [TaskbarManager] or `null` if TouchInteractionService is not connected */
- val taskbarManager: TaskbarManager?
- get() = mTis.get()?.taskbarManager
-
- /** Returns the [OverviewCommandHelper] or `null` if TouchInteractionService is not connected */
- val overviewCommandHelper: OverviewCommandHelper?
- get() = mTis.get()?.overviewCommandHelper
-
- private val deviceState: RecentsAnimationDeviceState?
- get() = mTis.get()?.let { RecentsAnimationDeviceState.INSTANCE[it] }
-
- private inline fun executeForTaskbarManagerOnMain(
- crossinline callback: TaskbarManager.() -> Unit
- ) {
- Executors.MAIN_EXECUTOR.execute { taskbarManager?.let { callback.invoke(it) } }
- }
-
- @BinderThread
- override fun onInitialize(bundle: Bundle) {
- Executors.MAIN_EXECUTOR.execute {
- mTis.get()?.let {
- SystemUiProxy.INSTANCE[it].setProxy(bundle)
- preloadOverviewForTIS(it, true /* fromInit */)
- }
- }
- }
-
- @BinderThread
- override fun onTaskbarToggled() {
- executeForTaskbarManagerOnMain { currentActivityContext?.toggleTaskbarStash() }
- }
-
- @BinderThread
- override fun onOverviewToggle() {
- TestLogging.recordEvent(TestProtocol.SEQUENCE_MAIN, "onOverviewToggle")
- mTis.get()?.let { tis ->
- // If currently screen pinning, do not enter overview
- if (RecentsAnimationDeviceState.INSTANCE[tis].isScreenPinningActive) {
- return@let
- }
- TaskUtils.closeSystemWindowsAsync(CLOSE_SYSTEM_WINDOWS_REASON_RECENTS)
- tis.overviewCommandHelper.addCommand(TOGGLE)
- }
- }
-
- @BinderThread
- override fun onOverviewShown(triggeredFromAltTab: Boolean) {
- overviewCommandHelper?.apply {
- if (triggeredFromAltTab) {
- TaskUtils.closeSystemWindowsAsync(CLOSE_SYSTEM_WINDOWS_REASON_RECENTS)
- addCommand(KEYBOARD_INPUT)
- } else {
- addCommand(SHOW)
- }
- }
- }
-
- @BinderThread
- override fun onOverviewHidden(triggeredFromAltTab: Boolean, triggeredFromHomeKey: Boolean) {
- overviewCommandHelper?.apply {
- if (triggeredFromAltTab && !triggeredFromHomeKey) {
- // onOverviewShownFromAltTab hides the overview and ends at the target app
- addCommand(HIDE)
- }
- }
- }
-
- @BinderThread
- override fun onAssistantAvailable(available: Boolean, longPressHomeEnabled: Boolean) {
- Executors.MAIN_EXECUTOR.execute {
- deviceState?.setAssistantAvailable(available)
- taskbarManager?.onLongPressHomeEnabled(longPressHomeEnabled)
- }
- }
-
- @BinderThread
- override fun onAssistantVisibilityChanged(visibility: Float) {
- Executors.MAIN_EXECUTOR.execute { deviceState?.assistantVisibility = visibility }
- }
-
- /**
- * Sent when the assistant has been invoked with the given type (defined in AssistManager) and
- * should be shown. This method is used if SystemUiProxy#setAssistantOverridesRequested was
- * previously called including this invocation type.
- */
- override fun onAssistantOverrideInvoked(invocationType: Int) {
- mTis.get()?.let { tis ->
- if (!ContextualSearchInvoker(tis).tryStartAssistOverride(invocationType)) {
- Log.w(TAG, "Failed to invoke Assist override")
- }
- }
- }
-
- @BinderThread
- override fun onSystemUiStateChanged(@SystemUiStateFlags stateFlags: Long) {
- Executors.MAIN_EXECUTOR.execute { deviceState?.systemUiStateFlags = stateFlags }
- }
-
- @BinderThread
- override fun onActiveNavBarRegionChanges(region: Region) {
- Executors.MAIN_EXECUTOR.execute { deviceState?.setDeferredGestureRegion(region) }
- }
-
- @BinderThread
- override fun enterStageSplitFromRunningApp(leftOrTop: Boolean) {
- mTis.get()?.let { tis ->
- OverviewComponentObserver.INSTANCE[tis]
- .containerInterface
- .createdContainer
- ?.enterStageSplitFromRunningApp(leftOrTop)
- }
- }
-
- @BinderThread
- override fun onDisplayAddSystemDecorations(displayId: Int) {
- executeForTaskbarManagerOnMain { onDisplayAddSystemDecorations(displayId) }
- }
-
- @BinderThread
- override fun onDisplayRemoved(displayId: Int) {
- executeForTaskbarManagerOnMain { onDisplayRemoved(displayId) }
- }
-
- @BinderThread
- override fun onDisplayRemoveSystemDecorations(displayId: Int) {
- executeForTaskbarManagerOnMain { onDisplayRemoveSystemDecorations(displayId) }
- }
-
- @BinderThread
- override fun updateWallpaperVisibility(displayId: Int, visible: Boolean) {
- executeForTaskbarManagerOnMain { setWallpaperVisible(displayId, visible) }
- }
-
- @BinderThread
- override fun checkNavBarModes(displayId: Int) {
- executeForTaskbarManagerOnMain { checkNavBarModes(displayId) }
- }
-
- @BinderThread
- override fun finishBarAnimations(displayId: Int) {
- executeForTaskbarManagerOnMain { finishBarAnimations(displayId) }
- }
-
- @BinderThread
- override fun touchAutoDim(displayId: Int, reset: Boolean) {
- executeForTaskbarManagerOnMain { touchAutoDim(displayId, reset) }
- }
-
- @BinderThread
- override fun transitionTo(displayId: Int, @TransitionMode barMode: Int, animate: Boolean) {
- executeForTaskbarManagerOnMain { transitionTo(displayId, barMode, animate) }
- }
-
- @BinderThread
- override fun appTransitionPending(pending: Boolean) {
- executeForTaskbarManagerOnMain { appTransitionPending(pending) }
- }
-
- override fun onRotationProposal(rotation: Int, isValid: Boolean) {
- executeForTaskbarManagerOnMain { onRotationProposal(rotation, isValid) }
- }
-
- override fun disable(displayId: Int, state1: Int, state2: Int, animate: Boolean) {
- executeForTaskbarManagerOnMain { disableNavBarElements(displayId, state1, state2, animate) }
- }
-
- override fun onSystemBarAttributesChanged(displayId: Int, behavior: Int) {
- executeForTaskbarManagerOnMain { onSystemBarAttributesChanged(displayId, behavior) }
- }
-
- override fun onTransitionModeUpdated(barMode: Int, checkBarModes: Boolean) {
- executeForTaskbarManagerOnMain { onTransitionModeUpdated(barMode, checkBarModes) }
- }
-
- override fun onNavButtonsDarkIntensityChanged(darkIntensity: Float) {
- executeForTaskbarManagerOnMain { onNavButtonsDarkIntensityChanged(darkIntensity) }
- }
-
- override fun onNavigationBarLumaSamplingEnabled(displayId: Int, enable: Boolean) {
- executeForTaskbarManagerOnMain { onNavigationBarLumaSamplingEnabled(displayId, enable) }
- }
-
- override fun onUnbind(reply: IRemoteCallback) {
- // Run everything in the same main thread block to ensure the cleanup happens before
- // sending the reply.
- Executors.MAIN_EXECUTOR.execute {
- taskbarManager?.destroy()
- try {
- reply.sendResult(null)
- } catch (e: RemoteException) {
- Log.w(TAG, "onUnbind: Failed to reply to LauncherProxyService", e)
- }
- }
- }
-
- @VisibleForTesting
- fun injectFakeTrackpadForTesting() = mTis.get()?.injectFakeTrackpadForTesting()
-
- @VisibleForTesting fun ejectFakeTrackpadForTesting() = mTis.get()?.ejectFakeTrackpadForTesting()
-
- @VisibleForTesting fun refreshOverviewTarget() = mTis.get()?.refreshOverviewTarget()
-}
diff --git a/quickstep/src/com/android/quickstep/TaskAnimationManager.java b/quickstep/src/com/android/quickstep/TaskAnimationManager.java
index e449048..9810308 100644
--- a/quickstep/src/com/android/quickstep/TaskAnimationManager.java
+++ b/quickstep/src/com/android/quickstep/TaskAnimationManager.java
@@ -54,25 +54,22 @@
import com.android.quickstep.views.RecentsView;
import com.android.systemui.shared.recents.model.ThumbnailData;
import com.android.systemui.shared.system.QuickStepContract;
-import com.android.systemui.shared.system.QuickStepContract.SystemUiStateFlags;
import com.android.systemui.shared.system.TaskStackChangeListener;
import com.android.systemui.shared.system.TaskStackChangeListeners;
import java.io.PrintWriter;
import java.util.HashMap;
-import java.util.function.LongConsumer;
public class TaskAnimationManager implements RecentsAnimationCallbacks.RecentsAnimationListener {
public static final boolean SHELL_TRANSITIONS_ROTATION =
SystemProperties.getBoolean("persist.wm.debug.shell_transit_rotate", false);
private final Context mCtx;
- private final RecentsAnimationDeviceState mDeviceState;
- private final SystemUiProxy mSystemUiProxy;
private RecentsAnimationController mController;
private RecentsAnimationCallbacks mCallbacks;
private RecentsAnimationTargets mTargets;
private TransitionInfo mTransitionInfo;
+ private RecentsAnimationDeviceState mDeviceState;
// Temporary until we can hook into gesture state events
private GestureState mLastGestureState;
@@ -105,22 +102,12 @@
}
};
-
- private @SystemUiStateFlags long mLastSysuiFlags;
- private final LongConsumer mSysUiFlagChangeCallback = this::onSystemUiFlagsChanged;
-
TaskAnimationManager(Context ctx, RecentsAnimationDeviceState deviceState) {
- this(ctx, deviceState, SystemUiProxy.INSTANCE.get(ctx));
- }
-
- TaskAnimationManager(Context ctx, RecentsAnimationDeviceState deviceState,
- SystemUiProxy systemUiProxy) {
mCtx = ctx;
mDeviceState = deviceState;
- mSystemUiProxy = systemUiProxy;
- mLastSysuiFlags = QuickStepContract.SYSUI_STATE_AWAKE;
- mDeviceState.addSysUiFlagChangeCallback(mSysUiFlagChangeCallback);
- onSystemUiFlagsChanged(mDeviceState.getSystemUiStateFlags());
+ }
+ SystemUiProxy getSystemUiProxy() {
+ return SystemUiProxy.INSTANCE.get(mCtx);
}
boolean shouldIgnoreMotionEvents() {
@@ -164,7 +151,7 @@
final BaseContainerInterface containerInterface = gestureState.getContainerInterface();
mLastGestureState = gestureState;
- RecentsAnimationCallbacks newCallbacks = new RecentsAnimationCallbacks(mSystemUiProxy);
+ RecentsAnimationCallbacks newCallbacks = new RecentsAnimationCallbacks(getSystemUiProxy());
mCallbacks = newCallbacks;
mCallbacks.addListener(new RecentsAnimationCallbacks.RecentsAnimationListener() {
@Override
@@ -244,7 +231,8 @@
}
@Override
- public void onTasksAppeared(RemoteAnimationTarget[] appearedTaskTargets) {
+ public void onTasksAppeared(RemoteAnimationTarget[] appearedTaskTargets,
+ @Nullable TransitionInfo transitionInfo) {
RemoteAnimationTarget appearedTaskTarget = appearedTaskTargets[0];
BaseContainerInterface containerInterface =
mLastGestureState.getContainerInterface();
@@ -277,7 +265,8 @@
recentsView.launchSideTaskInLiveTileMode(appearedTaskTarget.taskId,
appearedTaskTargets,
new RemoteAnimationTarget[0] /* wallpaper */,
- nonAppTargets /* nonApps */);
+ nonAppTargets /* nonApps */,
+ transitionInfo);
return;
} else {
ActiveGestureProtoLogProxy.logLaunchingSideTaskFailed();
@@ -302,7 +291,7 @@
if(containerInterface.getCreatedContainer() instanceof RecentsWindowManager
&& (Flags.enableFallbackOverviewInWindow()
|| Flags.enableLauncherOverviewInWindow())) {
- mRecentsAnimationStartPending = mSystemUiProxy.startRecentsActivity(intent, options,
+ mRecentsAnimationStartPending = getSystemUiProxy().startRecentsActivity(intent, options,
mCallbacks, gestureState.useSyntheticRecentsTransition());
RecentsDisplayModel.getINSTANCE().get(mCtx)
.getRecentsWindowManager(mDeviceState.getDisplayId())
@@ -334,7 +323,7 @@
});
}
- mRecentsAnimationStartPending = mSystemUiProxy.startRecentsActivity(intent,
+ mRecentsAnimationStartPending = getSystemUiProxy().startRecentsActivity(intent,
options, mCallbacks, false /* useSyntheticRecentsTransition */);
}
@@ -360,13 +349,8 @@
return mCallbacks;
}
- private void onSystemUiFlagsChanged(@SystemUiStateFlags long newSysUIFlags) {
- onSystemUiFlagsChanged(mLastSysuiFlags, newSysUIFlags);
- mLastSysuiFlags = newSysUIFlags;
- }
-
- private void onSystemUiFlagsChanged(@SystemUiStateFlags long lastSysUIFlags,
- @SystemUiStateFlags long newSysUIFlags) {
+ public void onSystemUiFlagsChanged(@QuickStepContract.SystemUiStateFlags long lastSysUIFlags,
+ @QuickStepContract.SystemUiStateFlags long newSysUIFlags) {
long isShadeExpandedFlagMask =
SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED | SYSUI_STATE_QUICK_SETTINGS_EXPANDED;
boolean wasExpanded = hasAnyFlag(lastSysUIFlags, isShadeExpandedFlagMask);
@@ -527,8 +511,4 @@
mLastGestureState.dump(prefix + '\t', pw);
}
}
-
- public void onDestroy() {
- mDeviceState.removeSysUiFlagChangeCallback(mSysUiFlagChangeCallback);
- }
}
diff --git a/quickstep/src/com/android/quickstep/TaskViewUtils.java b/quickstep/src/com/android/quickstep/TaskViewUtils.java
index e47223b..37841e8 100644
--- a/quickstep/src/com/android/quickstep/TaskViewUtils.java
+++ b/quickstep/src/com/android/quickstep/TaskViewUtils.java
@@ -169,6 +169,7 @@
@NonNull RemoteAnimationTarget[] wallpaperTargets,
@NonNull RemoteAnimationTarget[] nonAppTargets,
@Nullable DepthController depthController,
+ @Nullable TransitionInfo transitionInfo,
PendingAnimation out) {
boolean isQuickSwitch = v.isEndQuickSwitchCuj();
v.setEndQuickSwitchCuj(false);
@@ -191,8 +192,7 @@
RemoteTargetGluer gluer = new RemoteTargetGluer(v.getContext(),
recentsView.getSizeStrategy(), targets, forDesktop);
if (forDesktop) {
- remoteTargetHandles =
- gluer.assignTargetsForDesktop(targets, /* transitionInfo=*/ null);
+ remoteTargetHandles = gluer.assignTargetsForDesktop(targets, transitionInfo);
} else if (v.containsMultipleTasks()) {
remoteTargetHandles = gluer.assignTargetsForSplitScreen(targets,
((GroupedTaskView) v).getSplitBoundsConfig());
@@ -462,7 +462,7 @@
final RecentsView recentsView = launchingTaskView.getRecentsView();
composeRecentsLaunchAnimator(animatorSet, launchingTaskView, appTargets, wallpaperTargets,
nonAppTargets, /* launcherClosing */ true, stateManager, recentsView,
- depthController);
+ depthController, /* transitionInfo= */ null);
t.apply();
animatorSet.start();
@@ -501,7 +501,7 @@
composeRecentsLaunchAnimator(animatorSet, launchingTaskView,
appTargets, wallpaperTargets, nonAppTargets,
true, stateManager,
- recentsView, depthController);
+ recentsView, depthController, /* transitionInfo= */ null);
animatorSet.start();
return;
}
@@ -593,7 +593,7 @@
composeRecentsLaunchAnimator(animatorSet, launchingTaskView, apps, wallpaper, nonApps,
true /* launcherClosing */, stateManager, launchingTaskView.getRecentsView(),
- depthController);
+ depthController, transitionInfo);
return animatorSet;
}
@@ -603,13 +603,13 @@
@NonNull RemoteAnimationTarget[] wallpaperTargets,
@NonNull RemoteAnimationTarget[] nonAppTargets, boolean launcherClosing,
@NonNull StateManager stateManager, @NonNull RecentsView recentsView,
- @Nullable DepthController depthController) {
+ @Nullable DepthController depthController, @Nullable TransitionInfo transitionInfo) {
boolean skipLauncherChanges = !launcherClosing;
TaskView taskView = findTaskViewToLaunch(recentsView, v, appTargets);
PendingAnimation pa = new PendingAnimation(RECENTS_LAUNCH_DURATION);
createRecentsWindowAnimator(recentsView, taskView, skipLauncherChanges, appTargets,
- wallpaperTargets, nonAppTargets, depthController, pa);
+ wallpaperTargets, nonAppTargets, depthController, transitionInfo, pa);
if (launcherClosing) {
// TODO(b/182592057): differentiate between "restore split" vs "launch fullscreen app"
TaskViewUtils.createSplitAuxiliarySurfacesAnimator(nonAppTargets, true /*shown*/,
diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java
index 22fc2ea..ba4c65a 100644
--- a/quickstep/src/com/android/quickstep/TouchInteractionService.java
+++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java
@@ -36,6 +36,7 @@
import static com.android.quickstep.InputConsumer.TYPE_CURSOR_HOVER;
import static com.android.quickstep.InputConsumerUtils.newConsumer;
import static com.android.quickstep.InputConsumerUtils.tryCreateAssistantInputConsumer;
+import static com.android.systemui.shared.system.ActivityManagerWrapper.CLOSE_SYSTEM_WINDOWS_REASON_RECENTS;
import android.app.PendingIntent;
import android.app.Service;
@@ -43,9 +44,12 @@
import android.content.IIntentSender;
import android.content.Intent;
import android.content.res.Configuration;
+import android.graphics.Region;
import android.os.Bundle;
import android.os.IBinder;
+import android.os.IRemoteCallback;
import android.os.Looper;
+import android.os.RemoteException;
import android.os.SystemClock;
import android.util.Log;
import android.view.Choreographer;
@@ -53,6 +57,7 @@
import android.view.InputEvent;
import android.view.MotionEvent;
+import androidx.annotation.BinderThread;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.UiThread;
@@ -62,6 +67,7 @@
import com.android.launcher3.EncryptionType;
import com.android.launcher3.Flags;
import com.android.launcher3.LauncherPrefs;
+import com.android.launcher3.anim.AnimatedFloat;
import com.android.launcher3.desktop.DesktopAppLaunchTransitionManager;
import com.android.launcher3.statehandlers.DesktopVisibilityController;
import com.android.launcher3.statemanager.StatefulActivity;
@@ -92,14 +98,34 @@
import com.android.quickstep.util.ActiveGestureProtoLogProxy;
import com.android.quickstep.util.ActiveTrackpadList;
import com.android.quickstep.util.ActivityPreloadUtil;
+import com.android.quickstep.util.ContextualSearchInvoker;
import com.android.quickstep.util.ContextualSearchStateManager;
import com.android.quickstep.views.RecentsViewContainer;
+import com.android.systemui.shared.recents.ILauncherProxy;
+import com.android.systemui.shared.recents.ISystemUiProxy;
+import com.android.systemui.shared.statusbar.phone.BarTransitions;
import com.android.systemui.shared.system.InputChannelCompat.InputEventReceiver;
import com.android.systemui.shared.system.InputConsumerController;
import com.android.systemui.shared.system.InputMonitorCompat;
+import com.android.systemui.shared.system.QuickStepContract.SystemUiStateFlags;
+import com.android.systemui.shared.system.smartspace.ISysuiUnlockAnimationController;
+import com.android.systemui.unfold.progress.IUnfoldAnimation;
+import com.android.wm.shell.back.IBackAnimation;
+import com.android.wm.shell.bubbles.IBubbles;
+import com.android.wm.shell.common.pip.IPip;
+import com.android.wm.shell.desktopmode.IDesktopMode;
+import com.android.wm.shell.draganddrop.IDragAndDrop;
+import com.android.wm.shell.onehanded.IOneHanded;
+import com.android.wm.shell.recents.IRecentTasks;
+import com.android.wm.shell.shared.IShellTransitions;
+import com.android.wm.shell.splitscreen.ISplitScreen;
+import com.android.wm.shell.startingsurface.IStartingWindow;
import java.io.FileDescriptor;
import java.io.PrintWriter;
+import java.lang.ref.WeakReference;
+import java.util.function.Consumer;
+import java.util.function.Function;
/**
* Service connected by system-UI for handling touch interaction.
@@ -115,6 +141,371 @@
private final TISBinder mTISBinder = new TISBinder(this);
+ /**
+ * Local ILauncherProxy implementation with some methods for local components
+ */
+ public static class TISBinder extends ILauncherProxy.Stub {
+
+ private final WeakReference<TouchInteractionService> mTis;
+
+ private TISBinder(TouchInteractionService tis) {
+ mTis = new WeakReference<>(tis);
+ }
+
+ @BinderThread
+ public void onInitialize(Bundle bundle) {
+ ISystemUiProxy proxy = ISystemUiProxy.Stub.asInterface(
+ bundle.getBinder(ISystemUiProxy.DESCRIPTOR));
+ IPip pip = IPip.Stub.asInterface(bundle.getBinder(IPip.DESCRIPTOR));
+ IBubbles bubbles = IBubbles.Stub.asInterface(bundle.getBinder(IBubbles.DESCRIPTOR));
+ ISplitScreen splitscreen = ISplitScreen.Stub.asInterface(bundle.getBinder(
+ ISplitScreen.DESCRIPTOR));
+ IOneHanded onehanded = IOneHanded.Stub.asInterface(
+ bundle.getBinder(IOneHanded.DESCRIPTOR));
+ IShellTransitions shellTransitions = IShellTransitions.Stub.asInterface(
+ bundle.getBinder(IShellTransitions.DESCRIPTOR));
+ IStartingWindow startingWindow = IStartingWindow.Stub.asInterface(
+ bundle.getBinder(IStartingWindow.DESCRIPTOR));
+ ISysuiUnlockAnimationController launcherUnlockAnimationController =
+ ISysuiUnlockAnimationController.Stub.asInterface(
+ bundle.getBinder(ISysuiUnlockAnimationController.DESCRIPTOR));
+ IRecentTasks recentTasks = IRecentTasks.Stub.asInterface(
+ bundle.getBinder(IRecentTasks.DESCRIPTOR));
+ IBackAnimation backAnimation = IBackAnimation.Stub.asInterface(
+ bundle.getBinder(IBackAnimation.DESCRIPTOR));
+ IDesktopMode desktopMode = IDesktopMode.Stub.asInterface(
+ bundle.getBinder(IDesktopMode.DESCRIPTOR));
+ IUnfoldAnimation unfoldTransition = IUnfoldAnimation.Stub.asInterface(
+ bundle.getBinder(IUnfoldAnimation.DESCRIPTOR));
+ IDragAndDrop dragAndDrop = IDragAndDrop.Stub.asInterface(
+ bundle.getBinder(IDragAndDrop.DESCRIPTOR));
+ MAIN_EXECUTOR.execute(() -> executeForTouchInteractionService(tis -> {
+ SystemUiProxy.INSTANCE.get(tis).setProxy(proxy, pip,
+ bubbles, splitscreen, onehanded, shellTransitions, startingWindow,
+ recentTasks, launcherUnlockAnimationController, backAnimation, desktopMode,
+ unfoldTransition, dragAndDrop);
+ tis.initInputMonitor("TISBinder#onInitialize()");
+ ActivityPreloadUtil.preloadOverviewForTIS(tis, true /* fromInit */);
+ }));
+ }
+
+ @BinderThread
+ @Override
+ public void onTaskbarToggled() {
+ MAIN_EXECUTOR.execute(() -> executeForTouchInteractionService(tis -> {
+ TaskbarActivityContext activityContext =
+ tis.mTaskbarManager.getCurrentActivityContext();
+
+ if (activityContext != null) {
+ activityContext.toggleTaskbarStash();
+ }
+ }));
+ }
+
+ @BinderThread
+ public void onOverviewToggle() {
+ TestLogging.recordEvent(TestProtocol.SEQUENCE_MAIN, "onOverviewToggle");
+ executeForTouchInteractionService(tis -> {
+ // If currently screen pinning, do not enter overview
+ if (tis.mDeviceState.isScreenPinningActive()) {
+ return;
+ }
+ TaskUtils.closeSystemWindowsAsync(CLOSE_SYSTEM_WINDOWS_REASON_RECENTS);
+ tis.mOverviewCommandHelper.addCommand(CommandType.TOGGLE);
+ });
+ }
+
+ @BinderThread
+ @Override
+ public void onOverviewShown(boolean triggeredFromAltTab) {
+ executeForTouchInteractionService(tis -> {
+ if (triggeredFromAltTab) {
+ TaskUtils.closeSystemWindowsAsync(CLOSE_SYSTEM_WINDOWS_REASON_RECENTS);
+ tis.mOverviewCommandHelper.addCommand(CommandType.KEYBOARD_INPUT);
+ } else {
+ tis.mOverviewCommandHelper.addCommand(CommandType.SHOW);
+ }
+ });
+ }
+
+ @BinderThread
+ @Override
+ public void onOverviewHidden(boolean triggeredFromAltTab, boolean triggeredFromHomeKey) {
+ executeForTouchInteractionService(tis -> {
+ if (triggeredFromAltTab && !triggeredFromHomeKey) {
+ // onOverviewShownFromAltTab hides the overview and ends at the target app
+ tis.mOverviewCommandHelper.addCommand(CommandType.HIDE);
+ }
+ });
+ }
+
+ @BinderThread
+ @Override
+ public void onAssistantAvailable(boolean available, boolean longPressHomeEnabled) {
+ MAIN_EXECUTOR.execute(() -> executeForTouchInteractionService(tis -> {
+ tis.mDeviceState.setAssistantAvailable(available);
+ tis.onAssistantVisibilityChanged();
+ executeForTaskbarManager(taskbarManager -> taskbarManager
+ .onLongPressHomeEnabled(longPressHomeEnabled));
+ }));
+ }
+
+ @BinderThread
+ @Override
+ public void onAssistantVisibilityChanged(float visibility) {
+ MAIN_EXECUTOR.execute(() -> executeForTouchInteractionService(tis -> {
+ tis.mDeviceState.setAssistantVisibility(visibility);
+ tis.onAssistantVisibilityChanged();
+ }));
+ }
+
+ /**
+ * Sent when the assistant has been invoked with the given type (defined in AssistManager)
+ * and should be shown. This method is used if SystemUiProxy#setAssistantOverridesRequested
+ * was previously called including this invocation type.
+ */
+ @Override
+ public void onAssistantOverrideInvoked(int invocationType) {
+ executeForTouchInteractionService(tis -> {
+ if (!new ContextualSearchInvoker(tis).tryStartAssistOverride(invocationType)) {
+ Log.w(TAG, "Failed to invoke Assist override");
+ }
+ });
+ }
+
+ @BinderThread
+ public void onSystemUiStateChanged(@SystemUiStateFlags long stateFlags) {
+ MAIN_EXECUTOR.execute(() -> executeForTouchInteractionService(tis -> {
+ long lastFlags = tis.mDeviceState.getSystemUiStateFlags();
+ tis.mDeviceState.setSystemUiFlags(stateFlags);
+ tis.onSystemUiFlagsChanged(lastFlags);
+ }));
+ }
+
+ @BinderThread
+ public void onActiveNavBarRegionChanges(Region region) {
+ MAIN_EXECUTOR.execute(() -> executeForTouchInteractionService(
+ tis -> tis.mDeviceState.setDeferredGestureRegion(region)));
+ }
+
+ @BinderThread
+ @Override
+ public void enterStageSplitFromRunningApp(boolean leftOrTop) {
+ executeForTouchInteractionService(tis -> {
+ RecentsViewContainer container = tis.mOverviewComponentObserver
+ .getContainerInterface().getCreatedContainer();
+ if (container != null) {
+ container.enterStageSplitFromRunningApp(leftOrTop);
+ }
+ });
+ }
+
+ @BinderThread
+ @Override
+ public void onDisplayAddSystemDecorations(int displayId) {
+ executeForTaskbarManager(taskbarManager ->
+ taskbarManager.onDisplayAddSystemDecorations(displayId));
+ }
+
+ @BinderThread
+ @Override
+ public void onDisplayRemoved(int displayId) {
+ executeForTaskbarManager(taskbarManager ->
+ taskbarManager.onDisplayRemoved(displayId));
+ }
+
+ @BinderThread
+ @Override
+ public void onDisplayRemoveSystemDecorations(int displayId) {
+ executeForTaskbarManager(taskbarManager ->
+ taskbarManager.onDisplayRemoveSystemDecorations(displayId));
+ }
+
+ @BinderThread
+ @Override
+ public void updateWallpaperVisibility(int displayId, boolean visible) {
+ executeForTaskbarManager(taskbarManager ->
+ taskbarManager.setWallpaperVisible(displayId, visible));
+ }
+
+ @BinderThread
+ @Override
+ public void checkNavBarModes(int displayId) {
+ executeForTaskbarManager(taskbarManager ->
+ taskbarManager.checkNavBarModes(displayId));
+ }
+
+ @BinderThread
+ @Override
+ public void finishBarAnimations(int displayId) {
+ executeForTaskbarManager(taskbarManager ->
+ taskbarManager.finishBarAnimations(displayId));
+ }
+
+ @BinderThread
+ @Override
+ public void touchAutoDim(int displayId, boolean reset) {
+ executeForTaskbarManager(taskbarManager ->
+ taskbarManager.touchAutoDim(displayId, reset));
+ }
+
+ @BinderThread
+ @Override
+ public void transitionTo(int displayId, @BarTransitions.TransitionMode int barMode,
+ boolean animate) {
+ executeForTaskbarManager(taskbarManager ->
+ taskbarManager.transitionTo(displayId, barMode, animate));
+ }
+
+ @BinderThread
+ @Override
+ public void appTransitionPending(boolean pending) {
+ executeForTaskbarManager(taskbarManager ->
+ taskbarManager.appTransitionPending(pending));
+ }
+
+ @Override
+ public void onRotationProposal(int rotation, boolean isValid) {
+ executeForTaskbarManager(taskbarManager ->
+ taskbarManager.onRotationProposal(rotation, isValid));
+ }
+
+ @Override
+ public void disable(int displayId, int state1, int state2, boolean animate) {
+ executeForTaskbarManager(taskbarManager ->
+ taskbarManager.disableNavBarElements(displayId, state1, state2, animate));
+ }
+
+ @Override
+ public void onSystemBarAttributesChanged(int displayId, int behavior) {
+ executeForTaskbarManager(taskbarManager ->
+ taskbarManager.onSystemBarAttributesChanged(displayId, behavior));
+ }
+
+ @Override
+ public void onTransitionModeUpdated(int barMode, boolean checkBarModes) {
+ executeForTaskbarManager(taskbarManager ->
+ taskbarManager.onTransitionModeUpdated(barMode, checkBarModes));
+ }
+
+ @Override
+ public void onNavButtonsDarkIntensityChanged(float darkIntensity) {
+ executeForTaskbarManager(taskbarManager ->
+ taskbarManager.onNavButtonsDarkIntensityChanged(darkIntensity));
+ }
+
+ @Override
+ public void onNavigationBarLumaSamplingEnabled(int displayId, boolean enable) {
+ executeForTaskbarManager(taskbarManager ->
+ taskbarManager.onNavigationBarLumaSamplingEnabled(displayId, enable));
+ }
+
+ @Override
+ public void onUnbind(IRemoteCallback reply) {
+ // Run everything in the same main thread block to ensure the cleanup happens before
+ // sending the reply.
+ MAIN_EXECUTOR.execute(() -> {
+ executeForTaskbarManager(TaskbarManager::destroy);
+ try {
+ reply.sendResult(null);
+ } catch (RemoteException e) {
+ Log.w(TAG, "onUnbind: Failed to reply to LauncherProxyService", e);
+ }
+ });
+ }
+
+ private void executeForTouchInteractionService(
+ @NonNull Consumer<TouchInteractionService> tisConsumer) {
+ TouchInteractionService tis = mTis.get();
+ if (tis == null) return;
+ tisConsumer.accept(tis);
+ }
+
+ private void executeForTaskbarManager(
+ @NonNull Consumer<TaskbarManager> taskbarManagerConsumer) {
+ MAIN_EXECUTOR.execute(() -> executeForTouchInteractionService(tis -> {
+ TaskbarManager taskbarManager = tis.mTaskbarManager;
+ if (taskbarManager == null) return;
+ taskbarManagerConsumer.accept(taskbarManager);
+ }));
+ }
+
+ /**
+ * Returns the {@link TaskbarManager}.
+ * <p>
+ * Returns {@code null} if TouchInteractionService is not connected
+ */
+ @Nullable
+ public TaskbarManager getTaskbarManager() {
+ TouchInteractionService tis = mTis.get();
+ if (tis == null) return null;
+ return tis.mTaskbarManager;
+ }
+
+ @VisibleForTesting
+ public void injectFakeTrackpadForTesting() {
+ TouchInteractionService tis = mTis.get();
+ if (tis == null) return;
+ tis.mTrackpadsConnected.add(1000);
+ tis.initInputMonitor("tapl testing");
+ }
+
+ @VisibleForTesting
+ public void ejectFakeTrackpadForTesting() {
+ TouchInteractionService tis = mTis.get();
+ if (tis == null) return;
+ tis.mTrackpadsConnected.clear();
+ // This method destroys the current input monitor if set up, and only init a new one
+ // in 3-button mode if {@code mTrackpadsConnected} is not empty. So in other words,
+ // it will destroy the input monitor.
+ tis.initInputMonitor("tapl testing");
+ }
+
+ /**
+ * Sets whether a predictive back-to-home animation is in progress in the device state
+ */
+ public void setPredictiveBackToHomeInProgress(boolean isInProgress) {
+ executeForTouchInteractionService(tis ->
+ tis.mDeviceState.setPredictiveBackToHomeInProgress(isInProgress));
+ }
+
+ /**
+ * Returns the {@link OverviewCommandHelper}.
+ * <p>
+ * Returns {@code null} if TouchInteractionService is not connected
+ */
+ @Nullable
+ public OverviewCommandHelper getOverviewCommandHelper() {
+ TouchInteractionService tis = mTis.get();
+ if (tis == null) return null;
+ return tis.mOverviewCommandHelper;
+ }
+
+ /**
+ * Sets a proxy to bypass swipe up behavior
+ */
+ public void setSwipeUpProxy(Function<GestureState, AnimatedFloat> proxy) {
+ executeForTouchInteractionService(
+ tis -> tis.mSwipeUpProxyProvider = proxy != null ? proxy : (i -> null));
+ }
+
+ /**
+ * Sets the task id where gestures should be blocked
+ */
+ public void setGestureBlockedTaskId(int taskId) {
+ executeForTouchInteractionService(
+ tis -> tis.mDeviceState.setGestureBlockingTaskId(taskId));
+ }
+
+ /** Refreshes the current overview target. */
+ public void refreshOverviewTarget() {
+ executeForTouchInteractionService(tis -> {
+ tis.mAllAppsActionManager.onDestroy();
+ tis.onOverviewTargetChanged(tis.mOverviewComponentObserver.isHomeAndOverviewSame());
+ });
+ }
+ }
+
private RotationTouchHelper mRotationTouchHelper;
private final AbsSwipeUpHandler.Factory mLauncherSwipeHandlerFactory =
@@ -130,13 +521,6 @@
private final ScreenOnTracker.ScreenOnListener mScreenOnListener = this::onScreenOnChanged;
private final OverviewChangeListener mOverviewChangeListener = this::onOverviewTargetChanged;
- private final Runnable mSysUiProxyStateChangeCallback =
- () -> {
- if (SystemUiProxy.INSTANCE.get(this).isActive()) {
- initInputMonitor("TISBinder#onInitialize()");
- }
- };
-
private final TaskbarNavButtonCallbacks mNavCallbacks = new TaskbarNavButtonCallbacks() {
@Override
public void onNavigateHome() {
@@ -170,6 +554,7 @@
private InputEventReceiver mInputEventReceiver;
private TaskbarManager mTaskbarManager;
+ private Function<GestureState, AnimatedFloat> mSwipeUpProxyProvider = i -> null;
private AllAppsActionManager mAllAppsActionManager;
private ActiveTrackpadList mTrackpadsConnected;
@@ -212,7 +597,6 @@
mDisplayInfoChangeListener =
mDeviceState.addNavigationModeChangedCallback(this::onNavigationModeChanged);
ScreenOnTracker.INSTANCE.get(this).addListener(mScreenOnListener);
- SystemUiProxy.INSTANCE.get(this).addOnStateChangeListener(mSysUiProxyStateChangeCallback);
}
private void disposeEventHandlers(String reason) {
@@ -265,6 +649,8 @@
mResetGestureInputConsumer = new ResetGestureInputConsumer(
mTaskAnimationManager, mTaskbarManager::getCurrentActivityContext);
mInputConsumer.registerInputConsumer();
+ onSystemUiFlagsChanged(mDeviceState.getSystemUiStateFlags());
+ onAssistantVisibilityChanged();
// Initialize the task tracker
TopTaskTracker.INSTANCE.get(this);
@@ -283,10 +669,6 @@
return mOverviewCommandHelper;
}
- public TaskbarManager getTaskbarManager() {
- return mTaskbarManager;
- }
-
private void resetHomeBounceSeenOnQuickstepEnabledFirstTime() {
if (!LockedUserState.get(this).isUserUnlocked() || mDeviceState.isButtonNavMode()) {
// Skip if not yet unlocked (can't read user shared prefs) or if the current navigation
@@ -328,18 +710,34 @@
});
}
+ @UiThread
+ private void onSystemUiFlagsChanged(@SystemUiStateFlags long lastSysUIFlags) {
+ if (LockedUserState.get(this).isUserUnlocked()) {
+ long systemUiStateFlags = mDeviceState.getSystemUiStateFlags();
+ SystemUiProxy.INSTANCE.get(this).setLastSystemUiStateFlags(systemUiStateFlags);
+ mOverviewComponentObserver.setHomeDisabled(mDeviceState.isHomeDisabled());
+ mTaskbarManager.onSystemUiFlagsChanged(systemUiStateFlags);
+ mTaskAnimationManager.onSystemUiFlagsChanged(lastSysUIFlags, systemUiStateFlags);
+ }
+ }
+
+ @UiThread
+ private void onAssistantVisibilityChanged() {
+ if (LockedUserState.get(this).isUserUnlocked()) {
+ mOverviewComponentObserver.getContainerInterface().onAssistantVisibilityChanged(
+ mDeviceState.getAssistantVisibility());
+ }
+ }
+
@Override
public void onDestroy() {
Log.d(TAG, "onDestroy: user=" + getUserId()
+ " instance=" + System.identityHashCode(this));
if (LockedUserState.get(this).isUserUnlocked()) {
mInputConsumer.unregisterInputConsumer();
+ mOverviewComponentObserver.setHomeDisabled(false);
mOverviewComponentObserver.removeOverviewChangeListener(mOverviewChangeListener);
}
- if (mTaskAnimationManager != null) {
- mTaskAnimationManager.onDestroy();
- }
-
disposeEventHandlers("TouchInteractionService onDestroy()");
SystemUiProxy.INSTANCE.get(this).clearProxy();
@@ -354,8 +752,6 @@
mDeviceState.removeDisplayInfoChangeListener(mDisplayInfoChangeListener);
LockedUserState.get(this).removeOnUserUnlockedRunnable(mUserUnlockedRunnable);
ScreenOnTracker.INSTANCE.get(this).removeListener(mScreenOnListener);
- SystemUiProxy.INSTANCE.get(this)
- .removeOnStateChangeListener(mSysUiProxyStateChangeCallback);
super.onDestroy();
}
@@ -483,6 +879,7 @@
this::onConsumerInactive,
mInputEventReceiver,
mTaskbarManager,
+ mSwipeUpProxyProvider,
mOverviewCommandHelper,
event);
mUncheckedConsumer = mConsumer;
@@ -761,26 +1158,4 @@
gestureState, touchTimeMs, mTaskAnimationManager.isRecentsAnimationRunning(),
mInputConsumer, MSDLPlayerWrapper.INSTANCE.get(this));
}
-
- @VisibleForTesting
- public void injectFakeTrackpadForTesting() {
- mTrackpadsConnected.add(1000);
- initInputMonitor("tapl testing");
- }
-
- @VisibleForTesting
- public void ejectFakeTrackpadForTesting() {
- mTrackpadsConnected.clear();
- // This method destroys the current input monitor if set up, and only init a new one
- // in 3-button mode if {@code mTrackpadsConnected} is not empty. So in other words,
- // it will destroy the input monitor.
- initInputMonitor("tapl testing");
- }
-
- /** Refreshes the current overview target. */
- @VisibleForTesting
- public void refreshOverviewTarget() {
- mAllAppsActionManager.onDestroy();
- onOverviewTargetChanged(mOverviewComponentObserver.isHomeAndOverviewSame());
- }
}
diff --git a/quickstep/src/com/android/quickstep/interaction/AllSetActivity.java b/quickstep/src/com/android/quickstep/interaction/AllSetActivity.java
index 39a9dff..c986b88 100644
--- a/quickstep/src/com/android/quickstep/interaction/AllSetActivity.java
+++ b/quickstep/src/com/android/quickstep/interaction/AllSetActivity.java
@@ -72,8 +72,7 @@
import com.android.quickstep.GestureState;
import com.android.quickstep.OverviewComponentObserver;
import com.android.quickstep.OverviewComponentObserver.OverviewChangeListener;
-import com.android.quickstep.RecentsAnimationDeviceState;
-import com.android.quickstep.TISBinder;
+import com.android.quickstep.TouchInteractionService.TISBinder;
import com.android.quickstep.util.ActivityPreloadUtil;
import com.android.quickstep.util.LottieAnimationColorUtils;
import com.android.quickstep.util.TISBindHelper;
@@ -284,13 +283,16 @@
protected void onResume() {
super.onResume();
maybeResumeOrPauseBackgroundAnimation();
- RecentsAnimationDeviceState.INSTANCE.get(this)
- .setSwipeUpProxyProvider(this::createSwipeUpProxy);
- setSetupUIVisible(true);
+ TISBinder binder = mTISBindHelper.getBinder();
+ if (binder != null) {
+ setSetupUIVisible(true);
+ binder.setSwipeUpProxy(this::createSwipeUpProxy);
+ }
}
private void onTISConnected(TISBinder binder) {
setSetupUIVisible(isResumed());
+ binder.setSwipeUpProxy(isResumed() ? this::createSwipeUpProxy : null);
TaskbarManager taskbarManager = binder.getTaskbarManager();
if (taskbarManager != null) {
mLauncherStartAnim = taskbarManager.createLauncherStartFromSuwAnim(MAX_SWIPE_DURATION);
@@ -304,8 +306,7 @@
@Override
protected void onPause() {
super.onPause();
- setSetupUIVisible(false);
- RecentsAnimationDeviceState.INSTANCE.get(this).setSwipeUpProxyProvider(null);
+ clearBinderOverride();
maybeResumeOrPauseBackgroundAnimation();
if (mSwipeProgress.value >= 1) {
finishAndRemoveTask();
@@ -313,6 +314,14 @@
}
}
+ private void clearBinderOverride() {
+ TISBinder binder = mTISBindHelper.getBinder();
+ if (binder != null) {
+ setSetupUIVisible(false);
+ binder.setSwipeUpProxy(null);
+ }
+ }
+
/**
* Should be called when we have successfully reached Launcher, so we dispatch to animation
* listeners to ensure the state matches the visual animation that just occurred.
@@ -329,9 +338,8 @@
protected void onDestroy() {
super.onDestroy();
getIDP().removeOnChangeListener(mOnIDPChangeListener);
- // In case bindHelper was not connected during onPause, clear UIVisible flag again
- setSetupUIVisible(false);
mTISBindHelper.onDestroy();
+ clearBinderOverride();
if (mBackgroundAnimatorListener != null) {
mAnimatedBackground.removeAnimatorListener(mBackgroundAnimatorListener);
}
diff --git a/quickstep/src/com/android/quickstep/interaction/GestureSandboxActivity.java b/quickstep/src/com/android/quickstep/interaction/GestureSandboxActivity.java
index 2114c30..0365f89 100644
--- a/quickstep/src/com/android/quickstep/interaction/GestureSandboxActivity.java
+++ b/quickstep/src/com/android/quickstep/interaction/GestureSandboxActivity.java
@@ -38,9 +38,10 @@
import com.android.launcher3.LauncherPrefs;
import com.android.launcher3.R;
import com.android.launcher3.logging.StatsLogManager;
-import com.android.quickstep.RecentsAnimationDeviceState;
+import com.android.quickstep.TouchInteractionService.TISBinder;
import com.android.quickstep.interaction.TutorialController.TutorialType;
import com.android.quickstep.util.LayoutUtils;
+import com.android.quickstep.util.TISBindHelper;
import java.util.ArrayList;
import java.util.Arrays;
@@ -63,6 +64,7 @@
private SharedPreferences mSharedPrefs;
private StatsLogManager mStatsLogManager;
+ private TISBindHelper mTISBindHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -97,6 +99,7 @@
.commit();
correctUserOrientation();
+ mTISBindHelper = new TISBindHelper(this, this::onTISConnected);
initWindowInsets();
}
@@ -346,6 +349,10 @@
updateServiceState(true);
}
+ private void onTISConnected(TISBinder binder) {
+ updateServiceState(isResumed());
+ }
+
@Override
protected void onPause() {
super.onPause();
@@ -353,13 +360,16 @@
}
private void updateServiceState(boolean isEnabled) {
- RecentsAnimationDeviceState.INSTANCE.get(this)
- .setGestureBlockingTaskId(isEnabled ? getTaskId() : -1);
+ TISBinder binder = mTISBindHelper.getBinder();
+ if (binder != null) {
+ binder.setGestureBlockedTaskId(isEnabled ? getTaskId() : -1);
+ }
}
@Override
protected void onDestroy() {
super.onDestroy();
+ mTISBindHelper.onDestroy();
updateServiceState(false);
}
}
diff --git a/quickstep/src/com/android/quickstep/util/AsyncClockEventDelegate.java b/quickstep/src/com/android/quickstep/util/AsyncClockEventDelegate.java
index 54f6443..207e482 100644
--- a/quickstep/src/com/android/quickstep/util/AsyncClockEventDelegate.java
+++ b/quickstep/src/com/android/quickstep/util/AsyncClockEventDelegate.java
@@ -59,8 +59,7 @@
private final Context mContext;
private final SettingsCache mSettingsCache;
- private final SimpleBroadcastReceiver mReceiver =
- new SimpleBroadcastReceiver(UI_HELPER_EXECUTOR, this::onClockEventReceived);
+ private final SimpleBroadcastReceiver mReceiver;
private final ArrayMap<BroadcastReceiver, Handler> mTimeEventReceivers = new ArrayMap<>();
private final List<ContentObserver> mFormatObservers = new ArrayList<>();
@@ -76,7 +75,9 @@
super(context);
mContext = context;
mSettingsCache = settingsCache;
- mReceiver.register(mContext, ACTION_TIME_CHANGED, ACTION_TIMEZONE_CHANGED);
+ mReceiver = new SimpleBroadcastReceiver(
+ context, UI_HELPER_EXECUTOR, this::onClockEventReceived);
+ mReceiver.register(ACTION_TIME_CHANGED, ACTION_TIMEZONE_CHANGED);
tracker.addCloseable(this);
}
@@ -138,6 +139,6 @@
public void close() {
mDestroyed = true;
mSettingsCache.unregister(mFormatUri, this);
- mReceiver.unregisterReceiverSafely(mContext);
+ mReceiver.unregisterReceiverSafely();
}
}
diff --git a/quickstep/src/com/android/quickstep/util/ContextualSearchInvoker.kt b/quickstep/src/com/android/quickstep/util/ContextualSearchInvoker.kt
index 969aa0f..d00a39c 100644
--- a/quickstep/src/com/android/quickstep/util/ContextualSearchInvoker.kt
+++ b/quickstep/src/com/android/quickstep/util/ContextualSearchInvoker.kt
@@ -21,6 +21,7 @@
import android.app.contextualsearch.ContextualSearchManager.FEATURE_CONTEXTUAL_SEARCH
import android.content.Context
import android.util.Log
+import androidx.annotation.VisibleForTesting
import com.android.internal.app.AssistUtils
import com.android.launcher3.logging.StatsLogManager
import com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_LAUNCH_ASSISTANT_FAILED_SERVICE_ERROR
@@ -33,7 +34,7 @@
import com.android.quickstep.BaseContainerInterface
import com.android.quickstep.DeviceConfigWrapper
import com.android.quickstep.OverviewComponentObserver
-import com.android.quickstep.RecentsAnimationDeviceState
+import com.android.quickstep.SystemUiProxy
import com.android.quickstep.TopTaskTracker
import com.android.quickstep.views.RecentsView
import com.android.systemui.shared.system.QuickStepContract
@@ -44,10 +45,9 @@
private val context: Context,
private val contextualSearchStateManager: ContextualSearchStateManager,
private val topTaskTracker: TopTaskTracker,
- private val deviceState: RecentsAnimationDeviceState,
+ private val systemUiProxy: SystemUiProxy,
private val statsLogManager: StatsLogManager,
private val contextualSearchHapticManager: ContextualSearchHapticManager,
- private val overviewComponentObserver: OverviewComponentObserver,
private val contextualSearchManager: ContextualSearchManager?,
) {
constructor(
@@ -56,10 +56,9 @@
context,
ContextualSearchStateManager.INSTANCE[context],
TopTaskTracker.INSTANCE[context],
- RecentsAnimationDeviceState.INSTANCE[context],
+ SystemUiProxy.INSTANCE[context],
StatsLogManager.newInstance(context),
ContextualSearchHapticManager.INSTANCE[context],
- OverviewComponentObserver.INSTANCE[context],
context.getSystemService(ContextualSearchManager::class.java),
)
@@ -190,7 +189,7 @@
if (contextualSearchManager == null) {
return false
}
- val recentsContainerInterface = overviewComponentObserver.containerInterface
+ val recentsContainerInterface = getRecentsContainerInterface()
if (recentsContainerInterface?.isInLiveTileMode() == true) {
Log.i(TAG, "Contextual Search invocation attempted: live tile")
endLiveTileMode(recentsContainerInterface) {
@@ -203,20 +202,27 @@
}
private fun isFakeLandscape(): Boolean =
- overviewComponentObserver.containerInterface
- ?.createdContainer
+ getRecentsContainerInterface()
+ ?.getCreatedContainer()
?.getOverviewPanel<RecentsView<*, *>>()
- ?.pagedOrientationHandler
+ ?.getPagedOrientationHandler()
?.isLayoutNaturalToLauncher == false
- private fun isInSplitscreen(): Boolean = topTaskTracker.runningSplitTaskIds.isNotEmpty()
+ private fun isInSplitscreen(): Boolean {
+ return topTaskTracker.getRunningSplitTaskIds().isNotEmpty()
+ }
private fun isNotificationShadeShowing(): Boolean {
- return deviceState.systemUiStateFlags and SHADE_EXPANDED_SYSUI_FLAGS != 0L
+ return systemUiProxy.lastSystemUiStateFlags and SHADE_EXPANDED_SYSUI_FLAGS != 0L
}
private fun isKeyguardShowing(): Boolean {
- return deviceState.systemUiStateFlags and KEYGUARD_SHOWING_SYSUI_FLAGS != 0L
+ return systemUiProxy.lastSystemUiStateFlags and KEYGUARD_SHOWING_SYSUI_FLAGS != 0L
+ }
+
+ @VisibleForTesting
+ fun getRecentsContainerInterface(): BaseContainerInterface<*, *>? {
+ return OverviewComponentObserver.INSTANCE.get(context).containerInterface
}
/**
diff --git a/quickstep/src/com/android/quickstep/util/ContextualSearchStateManager.java b/quickstep/src/com/android/quickstep/util/ContextualSearchStateManager.java
index ed96399..a8d3c6d 100644
--- a/quickstep/src/com/android/quickstep/util/ContextualSearchStateManager.java
+++ b/quickstep/src/com/android/quickstep/util/ContextualSearchStateManager.java
@@ -74,8 +74,7 @@
Settings.Secure.getUriFor(Settings.Secure.SEARCH_ALL_ENTRYPOINTS_ENABLED);
private final Runnable mSysUiStateChangeListener = this::updateOverridesToSysUi;
- private final SimpleBroadcastReceiver mContextualSearchPackageReceiver =
- new SimpleBroadcastReceiver(UI_HELPER_EXECUTOR, (unused) -> requestUpdateProperties());
+ private final SimpleBroadcastReceiver mContextualSearchPackageReceiver;
protected final EventLogArray mEventLogArray = new EventLogArray(TAG, MAX_DEBUG_EVENT_SIZE);
// Cached value whether the ContextualSearch intent filter matched any enabled components.
@@ -95,6 +94,9 @@
TopTaskTracker topTaskTracker,
DaggerSingletonTracker lifeCycle) {
mContext = context;
+ mContextualSearchPackageReceiver =
+ new SimpleBroadcastReceiver(context, UI_HELPER_EXECUTOR,
+ (unused) -> requestUpdateProperties());
mContextualSearchPackage = mContext.getResources().getString(
com.android.internal.R.string.config_defaultContextualSearchPackageName);
mSystemUiProxy = systemUiProxy;
@@ -112,7 +114,7 @@
requestUpdateProperties();
registerSearchScreenSystemAction();
mContextualSearchPackageReceiver.registerPkgActions(
- context, mContextualSearchPackage, Intent.ACTION_PACKAGE_ADDED,
+ mContextualSearchPackage, Intent.ACTION_PACKAGE_ADDED,
Intent.ACTION_PACKAGE_CHANGED, Intent.ACTION_PACKAGE_REMOVED);
SettingsCache.OnChangeListener settingChangedListener =
@@ -124,7 +126,7 @@
systemUiProxy.addOnStateChangeListener(mSysUiStateChangeListener);
lifeCycle.addCloseable(() -> {
- mContextualSearchPackageReceiver.unregisterReceiverSafely(mContext);
+ mContextualSearchPackageReceiver.unregisterReceiverSafely();
unregisterSearchScreenSystemAction();
settingsCache.unregister(SEARCH_ALL_ENTRYPOINTS_ENABLED_URI, settingChangedListener);
systemUiProxy.removeOnStateChangeListener(mSysUiStateChangeListener);
diff --git a/quickstep/src/com/android/quickstep/util/SplitAnimationController.kt b/quickstep/src/com/android/quickstep/util/SplitAnimationController.kt
index 3c0a63a..88d14b7 100644
--- a/quickstep/src/com/android/quickstep/util/SplitAnimationController.kt
+++ b/quickstep/src/com/android/quickstep/util/SplitAnimationController.kt
@@ -985,6 +985,12 @@
val splitTree: Pair<Change, List<Change>>? = extractTopParentAndChildren(transitionInfo)
check(splitTree != null) { "Could not find a split root candidate" }
val rootCandidate = splitTree.first
+ val stageRootTaskIds: Set<Int> = splitTree.second
+ .map { it.taskInfo!!.taskId }
+ .toSet()
+ val leafTasks: List<Change> = transitionInfo.changes
+ .filter { it.taskInfo != null && it.taskInfo!!.parentTaskId in stageRootTaskIds}
+ .toList()
// Starting position is a 34% size tile centered in the middle of the screen.
// Ending position is the full device screen.
@@ -1018,6 +1024,29 @@
override fun onAnimationEnd(animation: Animator) {
finishCallback.run()
}
+
+ override fun onAnimationStart(animation: Animator) {
+ // Reset leaf and stage root tasks, animation can begin from freeform windows
+ for (leaf in leafTasks) {
+ val endAbsBounds = leaf.endAbsBounds
+
+ t.setAlpha(leaf.leash, 1f)
+ t.setCrop(leaf.leash, 0f, 0f,
+ endAbsBounds.width().toFloat(), endAbsBounds.height().toFloat())
+ t.setPosition(leaf.leash, 0f, 0f)
+ }
+
+ for (stageRoot in splitTree.second) {
+ val endAbsBounds = stageRoot.endAbsBounds
+
+ t.setAlpha(stageRoot.leash, 1f)
+ t.setCrop(stageRoot.leash, 0f, 0f,
+ endAbsBounds.width().toFloat(), endAbsBounds.height().toFloat())
+ t.setPosition(stageRoot.leash, endAbsBounds.left.toFloat(),
+ endAbsBounds.top.toFloat())
+ }
+ t.apply()
+ }
}
)
diff --git a/quickstep/src/com/android/quickstep/util/SystemWindowManagerProxy.java b/quickstep/src/com/android/quickstep/util/SystemWindowManagerProxy.java
index 10ae7a3..d92cc86 100644
--- a/quickstep/src/com/android/quickstep/util/SystemWindowManagerProxy.java
+++ b/quickstep/src/com/android/quickstep/util/SystemWindowManagerProxy.java
@@ -73,8 +73,8 @@
}
@Override
- public boolean isInDesktopMode() {
- return mDesktopVisibilityController.areDesktopTasksVisible();
+ public boolean isInDesktopMode(int displayId) {
+ return mDesktopVisibilityController.isInDesktopMode(displayId);
}
@Override
diff --git a/quickstep/src/com/android/quickstep/util/TISBindHelper.java b/quickstep/src/com/android/quickstep/util/TISBindHelper.java
index 3716efa..027dc08 100644
--- a/quickstep/src/com/android/quickstep/util/TISBindHelper.java
+++ b/quickstep/src/com/android/quickstep/util/TISBindHelper.java
@@ -28,8 +28,8 @@
import com.android.launcher3.taskbar.TaskbarManager;
import com.android.quickstep.OverviewCommandHelper;
-import com.android.quickstep.TISBinder;
import com.android.quickstep.TouchInteractionService;
+import com.android.quickstep.TouchInteractionService.TISBinder;
import java.util.ArrayList;
import java.util.function.Consumer;
@@ -109,6 +109,15 @@
return mBinder == null ? null : mBinder.getTaskbarManager();
}
+ /**
+ * Sets flag whether a predictive back-to-home animation is in progress
+ */
+ public void setPredictiveBackToHomeInProgress(boolean isInProgress) {
+ if (mBinder != null) {
+ mBinder.setPredictiveBackToHomeInProgress(isInProgress);
+ }
+ }
+
@Nullable
public OverviewCommandHelper getOverviewCommandHelper() {
return mBinder == null ? null : mBinder.getOverviewCommandHelper();
diff --git a/quickstep/src/com/android/quickstep/util/TaskGridNavHelper.java b/quickstep/src/com/android/quickstep/util/TaskGridNavHelper.java
index da26622..35e90f2 100644
--- a/quickstep/src/com/android/quickstep/util/TaskGridNavHelper.java
+++ b/quickstep/src/com/android/quickstep/util/TaskGridNavHelper.java
@@ -137,4 +137,12 @@
return currentPageTaskViewId;
}
}
+
+ /**
+ * Returns the column of a task's id in the grid.
+ */
+ public int getColumn(int taskViewId) {
+ return mTopRowIds.contains(taskViewId) ? mTopRowIds.indexOf(taskViewId)
+ : mBottomRowIds.indexOf(taskViewId);
+ }
}
diff --git a/quickstep/src/com/android/quickstep/views/DesktopTaskView.kt b/quickstep/src/com/android/quickstep/views/DesktopTaskView.kt
index 02be373..da160f1 100644
--- a/quickstep/src/com/android/quickstep/views/DesktopTaskView.kt
+++ b/quickstep/src/com/android/quickstep/views/DesktopTaskView.kt
@@ -55,8 +55,8 @@
import com.android.quickstep.recents.ui.viewmodel.DesktopTaskViewModel
import com.android.quickstep.recents.ui.viewmodel.TaskData
import com.android.quickstep.task.thumbnail.TaskThumbnailView
+import com.android.quickstep.util.DesktopTask
import com.android.quickstep.util.RecentsOrientedState
-import com.android.systemui.shared.recents.model.Task
/** TaskView that contains all tasks that are part of the desktop. */
class DesktopTaskView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) :
@@ -271,10 +271,14 @@
/** Updates this desktop task to the gives task list defined in `tasks` */
fun bind(
- tasks: List<Task>,
+ desktopTask: DesktopTask,
orientedState: RecentsOrientedState,
taskOverlayFactory: TaskOverlayFactory,
) {
+ // TODO(b/370495260): Minimized tasks should not be filtered with desktop exploded view
+ // support.
+ // Minimized tasks should not be shown in Overview.
+ val tasks = desktopTask.tasks.filterNot { it.isMinimized }
if (DEBUG) {
val sb = StringBuilder()
sb.append("bind tasks=").append(tasks.size).append("\n")
diff --git a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java
index c6bd677..0f1c294 100644
--- a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java
+++ b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java
@@ -275,7 +275,8 @@
boolean showDesktopApps = false;
GestureState.GestureEndTarget endTarget = mCurrentGestureEndTarget;
if (endTarget == GestureState.GestureEndTarget.LAST_TASK
- && desktopVisibilityController.areDesktopTasksVisibleAndNotInOverview()) {
+ && desktopVisibilityController.isInDesktopModeAndNotInOverview(
+ mContainer.getDisplayId())) {
// Recents gesture was cancelled and we are returning to the previous task.
// After super class has handled clean up, show desktop apps on top again
showDesktopApps = true;
diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java
index 51980f0..424271a 100644
--- a/quickstep/src/com/android/quickstep/views/RecentsView.java
+++ b/quickstep/src/com/android/quickstep/views/RecentsView.java
@@ -132,6 +132,7 @@
import android.widget.Toast;
import android.window.DesktopModeFlags;
import android.window.PictureInPictureSurfaceTransaction;
+import android.window.TransitionInfo;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -212,6 +213,7 @@
import com.android.quickstep.recents.viewmodel.RecentsViewModel;
import com.android.quickstep.util.ActiveGestureProtoLogProxy;
import com.android.quickstep.util.AnimUtils;
+import com.android.quickstep.util.DesktopTask;
import com.android.quickstep.util.GroupTask;
import com.android.quickstep.util.LayoutUtils;
import com.android.quickstep.util.RecentsAtomicAnimationFactory;
@@ -1394,12 +1396,13 @@
RemoteAnimationTargets targets = params.getTargetSet();
if (targets != null && targets.findTask(taskId) != null) {
launchSideTaskInLiveTileMode(taskId, targets.apps, targets.wallpapers,
- targets.nonApps);
+ targets.nonApps, /* transitionInfo= */ null);
}
}
public void launchSideTaskInLiveTileMode(int taskId, RemoteAnimationTarget[] apps,
- RemoteAnimationTarget[] wallpaper, RemoteAnimationTarget[] nonApps) {
+ RemoteAnimationTarget[] wallpaper, RemoteAnimationTarget[] nonApps,
+ @Nullable TransitionInfo transitionInfo) {
AnimatorSet anim = new AnimatorSet();
TaskView taskView = getTaskViewByTaskId(taskId);
if (taskView == null || !isTaskViewVisible(taskView)) {
@@ -1451,7 +1454,7 @@
} else {
TaskViewUtils.composeRecentsLaunchAnimator(anim, taskView, apps, wallpaper, nonApps,
true /* launcherClosing */, getStateManager(), this,
- getDepthController());
+ getDepthController(), transitionInfo);
}
anim.start();
}
@@ -1981,12 +1984,7 @@
splitTask.getBottomRightTask(), mOrientationState,
mTaskOverlayFactory, splitTask.getSplitBounds());
} else if (taskView instanceof DesktopTaskView desktopTaskView) {
- // Minimized tasks should not be shown in Overview
- List<Task> nonMinimizedTasks =
- groupTask.getTasks().stream()
- .filter(task -> !task.isMinimized)
- .toList();
- desktopTaskView.bind(nonMinimizedTasks, mOrientationState,
+ desktopTaskView.bind((DesktopTask) groupTask, mOrientationState,
mTaskOverlayFactory);
} else if (groupTask instanceof SplitTask splitTask) {
Task task = splitTask.getTopLeftTask().key.id == stagedTaskIdToBeRemoved
@@ -3034,7 +3032,7 @@
final TaskView taskView;
if (needDesktopTask) {
taskView = getTaskViewFromPool(TaskViewType.DESKTOP);
- ((DesktopTaskView) taskView).bind(Arrays.asList(runningTasks),
+ ((DesktopTaskView) taskView).bind(new DesktopTask(Arrays.asList(runningTasks)),
mOrientationState, mTaskOverlayFactory);
} else if (needGroupTaskView) {
taskView = getTaskViewFromPool(TaskViewType.GROUPED);
diff --git a/quickstep/src/com/android/quickstep/views/RecentsViewUtils.kt b/quickstep/src/com/android/quickstep/views/RecentsViewUtils.kt
index d37a3f9..d18a5f7 100644
--- a/quickstep/src/com/android/quickstep/views/RecentsViewUtils.kt
+++ b/quickstep/src/com/android/quickstep/views/RecentsViewUtils.kt
@@ -17,6 +17,7 @@
package com.android.quickstep.views
import android.graphics.Rect
+import android.os.VibrationAttributes
import android.view.View
import androidx.core.view.children
import androidx.dynamicanimation.animation.FloatPropertyCompat
@@ -26,14 +27,18 @@
import com.android.launcher3.Flags.enableLargeDesktopWindowingTile
import com.android.launcher3.Flags.enableSeparateExternalDisplayTasks
import com.android.launcher3.R
+import com.android.launcher3.Utilities.boundToRange
import com.android.launcher3.touch.SingleAxisSwipeDetector
import com.android.launcher3.util.DynamicResource
import com.android.launcher3.util.IntArray
+import com.android.launcher3.util.MSDLPlayerWrapper
import com.android.quickstep.util.GroupTask
import com.android.quickstep.util.TaskGridNavHelper
import com.android.quickstep.util.isExternalDisplay
import com.android.quickstep.views.RecentsView.RUNNING_TASK_ATTACH_ALPHA
import com.android.systemui.shared.recents.model.ThumbnailData
+import com.google.android.msdl.data.model.MSDLToken
+import com.google.android.msdl.domain.InteractionProperties
import java.util.function.BiConsumer
import kotlin.math.abs
@@ -378,7 +383,7 @@
// negative displacement to positive displacement). We do not check for an exact value
// to compare to, as the update listener does not necessarily hit every value (e.g. a
// value of zero). Do not check again once it has started settling, as a spring can
- // bounce past the origin multiple times depending on the stifness and damping ratio.
+ // bounce past the origin multiple times depending on the stiffness and damping ratio.
if (startSettling) return@addUpdateListener
if (lastPosition < 0 && value >= 0) {
startSettling = true
@@ -386,53 +391,79 @@
lastPosition = value
if (startSettling) {
neighborsToSettle.setStartVelocity(velocity).animateToFinalPosition(0f)
+ playDismissSettlingHaptic(velocity)
}
}
// Add tasks before dragged index, fanning out from the dragged task.
// The order they are added matters, as each spring drives the next.
var previousNeighbor = neighborsToSettle
- getTasksAdjacentToDraggedTask(draggedTaskView, towardsStart = true).forEach {
- previousNeighbor = createNeighboringTaskViewSpringAnimation(it, previousNeighbor)
+ getTasksOffsetPairAdjacentToDraggedTask(draggedTaskView, towardsStart = true).forEach {
+ (taskView, offset) ->
+ previousNeighbor =
+ createNeighboringTaskViewSpringAnimation(
+ taskView,
+ offset * ADDITIONAL_DISMISS_DAMPING_RATIO,
+ previousNeighbor,
+ )
}
// Add tasks after dragged index, fanning out from the dragged task.
// The order they are added matters, as each spring drives the next.
previousNeighbor = neighborsToSettle
- getTasksAdjacentToDraggedTask(draggedTaskView, towardsStart = false).forEach {
- previousNeighbor = createNeighboringTaskViewSpringAnimation(it, previousNeighbor)
+ getTasksOffsetPairAdjacentToDraggedTask(draggedTaskView, towardsStart = false).forEach {
+ (taskView, offset) ->
+ previousNeighbor =
+ createNeighboringTaskViewSpringAnimation(
+ taskView,
+ offset * ADDITIONAL_DISMISS_DAMPING_RATIO,
+ previousNeighbor,
+ )
}
}
- /** Gets adjacent tasks either before or after the dragged task in visual order. */
- private fun getTasksAdjacentToDraggedTask(
+ /**
+ * Gets pairs of (TaskView, offset) adjacent the dragged task in visual order.
+ *
+ * <p>Gets tasks either before or after the dragged task along with their offset from it. The
+ * offset is the distance between indices for carousels, or distance between columns for grids.
+ */
+ private fun getTasksOffsetPairAdjacentToDraggedTask(
draggedTaskView: TaskView,
towardsStart: Boolean,
- ): Sequence<TaskView> {
+ ): Sequence<Pair<TaskView, Int>> {
if (recentsView.showAsGrid()) {
- return gridTaskViewInTabOrderSequence(draggedTaskView, towardsStart)
+ return gridTaskOffsetPairInTabOrderSequence(draggedTaskView, towardsStart)
} else {
val taskViewList = taskViews.toList()
val draggedTaskViewIndex = taskViewList.indexOf(draggedTaskView)
return if (towardsStart) {
- taskViewList.take(draggedTaskViewIndex).reversed().asSequence()
+ taskViewList
+ .take(draggedTaskViewIndex)
+ .reversed()
+ .mapIndexed { index, taskView -> Pair(taskView, index + 1) }
+ .asSequence()
} else {
- taskViewList.takeLast(taskViewList.size - draggedTaskViewIndex - 1).asSequence()
+ taskViewList
+ .takeLast(taskViewList.size - draggedTaskViewIndex - 1)
+ .mapIndexed { index, taskView -> Pair(taskView, index + 1) }
+ .asSequence()
}
}
}
/**
- * Returns a sequence of TaskViews in the grid, ordered according to tab navigation, starting
- * from the dragged TaskView, in the direction of the provided delta.
+ * Returns a sequence of pairs of (TaskViews, offsets) in the grid, ordered according to tab
+ * navigation, starting from the dragged TaskView, towards the start or end of the grid.
*
* <p>A positive delta moves forward in the tab order towards the end of the grid, while a
- * negative value moves backward towards the beginning.
+ * negative value moves backward towards the beginning. The offset is the distance between
+ * columns the tasks are in.
*/
- private fun gridTaskViewInTabOrderSequence(
+ private fun gridTaskOffsetPairInTabOrderSequence(
draggedTaskView: TaskView,
towardsStart: Boolean,
- ): Sequence<TaskView> = sequence {
+ ): Sequence<Pair<TaskView, Int>> = sequence {
val taskGridNavHelper =
TaskGridNavHelper(
recentsView.topRowIdArray,
@@ -440,6 +471,7 @@
getLargeTaskViewIds(),
/* hasAddDesktopButton= */ false,
)
+ val draggedTaskViewColumn = taskGridNavHelper.getColumn(draggedTaskView.taskViewId)
var nextTaskView: TaskView? = draggedTaskView
var previousTaskView: TaskView? = null
while (nextTaskView != previousTaskView && nextTaskView != null) {
@@ -454,7 +486,11 @@
)
)
if (nextTaskView != null && nextTaskView != previousTaskView) {
- yield(nextTaskView)
+ val columnOffset =
+ abs(
+ taskGridNavHelper.getColumn(nextTaskView.taskViewId) - draggedTaskViewColumn
+ )
+ yield(Pair(nextTaskView, columnOffset))
}
}
}
@@ -462,6 +498,7 @@
/** Creates a neighboring task view spring, driven by the spring of its neighbor. */
private fun createNeighboringTaskViewSpringAnimation(
taskView: TaskView,
+ dampingOffsetRatio: Float,
previousNeighborSpringAnimation: SpringAnimation,
): SpringAnimation {
val neighboringTaskViewSpringAnimation =
@@ -471,7 +508,7 @@
taskView.secondaryDismissTranslationProperty
),
)
- .setSpring(createExpressiveDismissSpringForce())
+ .setSpring(createExpressiveDismissSpringForce(dampingOffsetRatio))
// Update live tile on spring animation.
if (taskView.isRunningTask && recentsView.enableDrawingLiveTile) {
neighboringTaskViewSpringAnimation.addUpdateListener { _, _, _ ->
@@ -489,18 +526,43 @@
return neighboringTaskViewSpringAnimation
}
- private fun createExpressiveDismissSpringForce(): SpringForce {
+ private fun createExpressiveDismissSpringForce(dampingRatioOffset: Float = 0f): SpringForce {
val resourceProvider = DynamicResource.provider(recentsView.mContainer)
return SpringForce()
.setDampingRatio(
- resourceProvider.getFloat(R.dimen.expressive_dismiss_task_trans_y_damping_ratio)
+ resourceProvider.getFloat(R.dimen.expressive_dismiss_task_trans_y_damping_ratio) +
+ dampingRatioOffset
)
.setStiffness(
resourceProvider.getFloat(R.dimen.expressive_dismiss_task_trans_y_stiffness)
)
}
+ /**
+ * Plays a haptic as the dragged task view settles back into its rest state.
+ *
+ * <p>Haptic intensity is proportional to velocity.
+ */
+ private fun playDismissSettlingHaptic(velocity: Float) {
+ val maxDismissSettlingVelocity =
+ recentsView.pagedOrientationHandler.getSecondaryDimension(recentsView)
+ MSDLPlayerWrapper.INSTANCE.get(recentsView.context)
+ .playToken(
+ MSDLToken.CANCEL,
+ InteractionProperties.DynamicVibrationScale(
+ boundToRange(velocity / maxDismissSettlingVelocity, 0f, 1f),
+ VibrationAttributes.Builder()
+ .setUsage(VibrationAttributes.USAGE_TOUCH)
+ .setFlags(VibrationAttributes.FLAG_PIPELINED_EFFECT)
+ .build(),
+ ),
+ )
+ }
+
companion object {
val TEMP_RECT = Rect()
+
+ // The additional damping to apply to tasks further from the dismissed task.
+ const val ADDITIONAL_DISMISS_DAMPING_RATIO = 0.15f
}
}
diff --git a/quickstep/src/com/android/quickstep/views/TaskView.kt b/quickstep/src/com/android/quickstep/views/TaskView.kt
index 609262f..56a35bd 100644
--- a/quickstep/src/com/android/quickstep/views/TaskView.kt
+++ b/quickstep/src/com/android/quickstep/views/TaskView.kt
@@ -1220,6 +1220,7 @@
recentsView.stateManager,
recentsView,
recentsView.depthController,
+ /* transitionInfo= */ null,
)
addListener(
object : AnimatorListenerAdapter() {
diff --git a/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/TaskThumbnailViewScreenshotTest.kt b/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/TaskThumbnailViewScreenshotTest.kt
index 232a08a..c3b4d15 100644
--- a/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/TaskThumbnailViewScreenshotTest.kt
+++ b/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/TaskThumbnailViewScreenshotTest.kt
@@ -24,6 +24,7 @@
import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.Uninitialized
import com.android.quickstep.task.viewmodel.TaskThumbnailViewModel
import com.google.android.apps.nexuslauncher.imagecomparison.goldenpathmanager.ViewScreenshotGoldenPathManager
+import org.junit.After
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
@@ -47,6 +48,11 @@
private val taskThumbnailViewModel = FakeTaskThumbnailViewModel()
+ @After
+ fun tearDown() {
+ RecentsDependencies.destroy()
+ }
+
@Test
fun taskThumbnailView_uninitializedByDefault() {
screenshotRule.screenshotTest("taskThumbnailView_uninitialized") { activity ->
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/model/data/TaskViewItemInfoTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/model/data/TaskViewItemInfoTest.kt
index de0da64..adfbca5 100644
--- a/quickstep/tests/multivalentTests/src/com/android/launcher3/model/data/TaskViewItemInfoTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/model/data/TaskViewItemInfoTest.kt
@@ -47,6 +47,7 @@
import com.google.common.truth.Truth.assertThat
import dagger.BindsInstance
import dagger.Component
+import org.junit.After
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
@@ -78,6 +79,11 @@
RecentsDependencies.initialize(context)
}
+ @After
+ fun tearDown() {
+ RecentsDependencies.destroy()
+ }
+
@Test
fun singleTask() {
val taskContainers = listOf(createTaskContainer(createTask(1)))
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarStashControllerTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarStashControllerTest.kt
index 8395d79..021e1e4 100644
--- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarStashControllerTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarStashControllerTest.kt
@@ -50,11 +50,8 @@
import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule.InjectController
import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule.UserSetupMode
import com.android.launcher3.taskbar.rules.TaskbarWindowSandboxContext
-import com.android.launcher3.util.Executors.MAIN_EXECUTOR
import com.android.launcher3.util.LauncherMultivalentJUnit
import com.android.launcher3.util.LauncherMultivalentJUnit.EmulatedDevices
-import com.android.launcher3.util.TestUtil
-import com.android.quickstep.RecentsAnimationDeviceState
import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_BUBBLES_EXPANDED
import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_IME_VISIBLE
import com.android.wm.shell.Flags.FLAG_ENABLE_BUBBLE_BAR
@@ -63,8 +60,6 @@
import org.junit.After
import org.junit.Rule
import org.junit.Test
-import org.junit.rules.TestWatcher
-import org.junit.runner.Description
import org.junit.runner.RunWith
@RunWith(LauncherMultivalentJUnit::class)
@@ -73,16 +68,7 @@
class TaskbarStashControllerTest {
@get:Rule(order = 0) val setFlagsRule = SetFlagsRule()
@get:Rule(order = 1) val context = TaskbarWindowSandboxContext.create()
- @get:Rule(order = 2)
- val initSingleton =
- object : TestWatcher() {
- override fun starting(description: Description?) {
- TestUtil.runOnExecutorSync(MAIN_EXECUTOR) {
- RecentsAnimationDeviceState.INSTANCE[context].systemUiStateFlags = 0
- }
- }
- }
- @get:Rule(order = 3) val taskbarModeRule = TaskbarModeRule(context)
+ @get:Rule(order = 2) val taskbarModeRule = TaskbarModeRule(context)
@get:Rule(order = 4) val animatorTestRule = AnimatorTestRule(this)
@get:Rule(order = 5) val taskbarUnitTestRule = TaskbarUnitTestRule(this, context)
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/util/SettingsCacheSandbox.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/util/SettingsCacheSandbox.kt
index dcd5352..52238c8 100644
--- a/quickstep/tests/multivalentTests/src/com/android/launcher3/util/SettingsCacheSandbox.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/util/SettingsCacheSandbox.kt
@@ -17,19 +17,22 @@
package com.android.launcher3.util
import android.net.Uri
+import com.android.launcher3.util.SettingsCache.OnChangeListener
import org.mockito.kotlin.any
import org.mockito.kotlin.doAnswer
import org.mockito.kotlin.mock
+import org.mockito.kotlin.whenever
-/**
- * Provides a sandboxed [SettingsCache] for testing.
- *
- * Note that listeners registered to [cache] will never be invoked.
- */
+/** Provides [SettingsCache] sandboxed from system settings for testing. */
class SettingsCacheSandbox {
private val values = mutableMapOf<Uri, Int>()
+ private val listeners = mutableMapOf<Uri, MutableSet<OnChangeListener>>()
- /** Fake cache that delegates [SettingsCache.getValue] to [values]. */
+ /**
+ * Fake cache that delegates:
+ * - [SettingsCache.getValue] to [values]
+ * - [SettingsCache.mListenerMap] to [listeners].
+ */
val cache =
mock<SettingsCache> {
on { getValue(any<Uri>()) } doAnswer { mock.getValue(it.getArgument(0), 1) }
@@ -37,11 +40,22 @@
{
values.getOrDefault(it.getArgument(0), it.getArgument(1)) == 1
}
+
+ doAnswer {
+ listeners.getOrPut(it.getArgument(0)) { mutableSetOf() }.add(it.getArgument(1))
+ }
+ .whenever(mock)
+ .register(any(), any())
+ doAnswer { listeners[it.getArgument(0)]?.remove(it.getArgument(1)) }
+ .whenever(mock)
+ .unregister(any(), any())
}
operator fun get(key: Uri): Int? = values[key]
operator fun set(key: Uri, value: Int) {
+ if (value == values[key]) return
values[key] = value
+ listeners[key]?.forEach { it.onSettingsChanged(value == 1) }
}
}
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/AllAppsActionManagerTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/AllAppsActionManagerTest.kt
index 73b35e8..a1bd107 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/AllAppsActionManagerTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/AllAppsActionManagerTest.kt
@@ -18,32 +18,59 @@
import android.app.PendingIntent
import android.content.IIntentSender
+import android.provider.Settings
+import android.provider.Settings.Secure.USER_SETUP_COMPLETE
import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.platform.app.InstrumentationRegistry
+import com.android.launcher3.dagger.LauncherAppComponent
+import com.android.launcher3.dagger.LauncherAppSingleton
+import com.android.launcher3.util.AllModulesForTest
import com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR
+import com.android.launcher3.util.SandboxApplication
+import com.android.launcher3.util.SettingsCache
+import com.android.launcher3.util.SettingsCacheSandbox
import com.android.launcher3.util.TestUtil
import com.google.common.truth.Truth.assertThat
+import dagger.BindsInstance
+import dagger.Component
import java.util.concurrent.Semaphore
import java.util.concurrent.TimeUnit.SECONDS
+import org.junit.After
+import org.junit.Before
+import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
private const val TIMEOUT = 5L
+private val USER_SETUP_COMPLETE_URI = Settings.Secure.getUriFor(USER_SETUP_COMPLETE)
@RunWith(AndroidJUnit4::class)
class AllAppsActionManagerTest {
private val callbackSemaphore = Semaphore(0)
private val bgExecutor = UI_HELPER_EXECUTOR
- private val allAppsActionManager =
- AllAppsActionManager(
- InstrumentationRegistry.getInstrumentation().targetContext,
- bgExecutor,
- ) {
- callbackSemaphore.release()
- PendingIntent(IIntentSender.Default())
+ @get:Rule val context = SandboxApplication()
+
+ private val settingsCacheSandbox =
+ SettingsCacheSandbox().also { it[USER_SETUP_COMPLETE_URI] = 1 }
+
+ private val allAppsActionManager by
+ lazy(LazyThreadSafetyMode.NONE) {
+ AllAppsActionManager(context, bgExecutor) {
+ callbackSemaphore.release()
+ PendingIntent(IIntentSender.Default())
+ }
}
+ @Before
+ fun initDaggerComponent() {
+ context.initDaggerComponent(
+ DaggerAllAppsActionManagerTestComponent.builder()
+ .bindSettingsCache(settingsCacheSandbox.cache)
+ )
+ }
+
+ @After fun destroyManager() = allAppsActionManager.onDestroy()
+
@Test
fun taskbarPresent_actionRegistered() {
allAppsActionManager.isTaskbarPresent = true
@@ -88,4 +115,50 @@
assertThat(callbackSemaphore.tryAcquire(TIMEOUT, SECONDS)).isTrue()
assertThat(allAppsActionManager.isActionRegistered).isTrue()
}
+
+ @Test
+ fun taskbarPresent_userSetupIncomplete_actionUnregistered() {
+ settingsCacheSandbox[USER_SETUP_COMPLETE_URI] = 0
+ allAppsActionManager.isTaskbarPresent = true
+ assertThat(allAppsActionManager.isActionRegistered).isFalse()
+ }
+
+ @Test
+ fun taskbarPresent_setupUiVisible_actionUnregistered() {
+ allAppsActionManager.isSetupUiVisible = true
+ allAppsActionManager.isTaskbarPresent = true
+ assertThat(allAppsActionManager.isActionRegistered).isFalse()
+ }
+
+ @Test
+ fun taskbarPresent_userSetupCompleted_actionRegistered() {
+ settingsCacheSandbox[USER_SETUP_COMPLETE_URI] = 0
+ allAppsActionManager.isTaskbarPresent = true
+
+ settingsCacheSandbox[USER_SETUP_COMPLETE_URI] = 1
+ assertThat(callbackSemaphore.tryAcquire(TIMEOUT, SECONDS)).isTrue()
+ assertThat(allAppsActionManager.isActionRegistered).isTrue()
+ }
+
+ @Test
+ fun taskbarPresent_setupUiDismissed_actionRegistered() {
+ allAppsActionManager.isSetupUiVisible = true
+ allAppsActionManager.isTaskbarPresent = true
+
+ allAppsActionManager.isSetupUiVisible = false
+ assertThat(callbackSemaphore.tryAcquire(TIMEOUT, SECONDS)).isTrue()
+ assertThat(allAppsActionManager.isActionRegistered).isTrue()
+ }
+}
+
+@LauncherAppSingleton
+@Component(modules = [AllModulesForTest::class])
+interface AllAppsActionManagerTestComponent : LauncherAppComponent {
+
+ @Component.Builder
+ interface Builder : LauncherAppComponent.Builder {
+ @BindsInstance fun bindSettingsCache(settingsCache: SettingsCache): Builder
+
+ override fun build(): AllAppsActionManagerTestComponent
+ }
}
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/RecentsAnimationDeviceStateTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/RecentsAnimationDeviceStateTest.kt
index 63115bf..b652ee8 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/RecentsAnimationDeviceStateTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/RecentsAnimationDeviceStateTest.kt
@@ -150,7 +150,7 @@
allSysUiStates().forEach { state ->
val canStartGesture = !disablingStates.contains(state)
- underTest.systemUiStateFlags = state
+ underTest.setSystemUiFlags(state)
assertThat(underTest.canStartTrackpadGesture()).isEqualTo(canStartGesture)
}
}
@@ -166,7 +166,7 @@
)
stateToExpectedResult.forEach { (state, allowed) ->
- underTest.systemUiStateFlags = state
+ underTest.setSystemUiFlags(state)
assertThat(underTest.canStartTrackpadGesture()).isEqualTo(allowed)
}
}
@@ -177,7 +177,7 @@
allSysUiStates().forEach { state ->
val canStartGesture = !disablingStates.contains(state)
- underTest.systemUiStateFlags = state
+ underTest.setSystemUiFlags(state)
assertThat(underTest.canStartSystemGesture()).isEqualTo(canStartGesture)
}
}
@@ -197,7 +197,7 @@
)
stateToExpectedResult.forEach { (state, gestureAllowed) ->
- underTest.systemUiStateFlags = state
+ underTest.setSystemUiFlags(state)
assertThat(underTest.canStartSystemGesture()).isEqualTo(gestureAllowed)
}
}
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/TaskAnimationManagerTest.java b/quickstep/tests/multivalentTests/src/com/android/quickstep/TaskAnimationManagerTest.java
index b730f5b..6e9885a 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/TaskAnimationManagerTest.java
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/TaskAnimationManagerTest.java
@@ -54,7 +54,12 @@
public void setUp() {
MockitoAnnotations.initMocks(this);
mTaskAnimationManager = new TaskAnimationManager(mContext,
- RecentsAnimationDeviceState.INSTANCE.get(mContext), mSystemUiProxy);
+ RecentsAnimationDeviceState.INSTANCE.get(mContext)) {
+ @Override
+ SystemUiProxy getSystemUiProxy() {
+ return mSystemUiProxy;
+ }
+ };
}
@Test
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/taskbar/controllers/TaskbarPinningControllerTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/taskbar/controllers/TaskbarPinningControllerTest.kt
index 5b42d6c..26418d8 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/taskbar/controllers/TaskbarPinningControllerTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/taskbar/controllers/TaskbarPinningControllerTest.kt
@@ -71,8 +71,9 @@
whenever(taskbarActivityContext.dragLayer).thenReturn(taskbarDragLayer)
whenever(taskbarActivityContext.statsLogManager).thenReturn(statsLogManager)
whenever(
- taskbarControllers.taskbarDesktopModeController
- .areDesktopTasksVisibleAndNotInOverview
+ taskbarControllers.taskbarDesktopModeController.isInDesktopModeAndNotInOverview(
+ taskbarActivityContext.displayId
+ )
)
.thenAnswer { _ -> isInDesktopMode }
pinningController = spy(TaskbarPinningController(taskbarActivityContext))
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/util/ContextualSearchInvokerTest.java b/quickstep/tests/multivalentTests/src/com/android/quickstep/util/ContextualSearchInvokerTest.java
index 4e49aec..61971b1 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/util/ContextualSearchInvokerTest.java
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/util/ContextualSearchInvokerTest.java
@@ -50,8 +50,7 @@
import com.android.launcher3.logging.StatsLogManager;
import com.android.quickstep.BaseContainerInterface;
import com.android.quickstep.DeviceConfigWrapper;
-import com.android.quickstep.OverviewComponentObserver;
-import com.android.quickstep.RecentsAnimationDeviceState;
+import com.android.quickstep.SystemUiProxy;
import com.android.quickstep.TopTaskTracker;
import com.android.quickstep.orientation.RecentsPagedOrientationHandler;
import com.android.quickstep.views.RecentsView;
@@ -76,7 +75,7 @@
private @Mock PackageManager mMockPackageManager;
private @Mock ContextualSearchStateManager mMockStateManager;
private @Mock TopTaskTracker mMockTopTaskTracker;
- private @Mock RecentsAnimationDeviceState mMockDeviceState;
+ private @Mock SystemUiProxy mMockSystemUiProxy;
private @Mock StatsLogManager mMockStatsLogManager;
private @Mock StatsLogManager.StatsLogger mMockStatsLogger;
private @Mock ContextualSearchHapticManager mMockContextualSearchHapticManager;
@@ -85,7 +84,6 @@
private @Mock RecentsViewContainer mMockRecentsViewContainer;
private @Mock RecentsView mMockRecentsView;
private @Mock RecentsPagedOrientationHandler mMockOrientationHandler;
- private @Mock OverviewComponentObserver mMockOverviewComponentObserver;
private ContextualSearchInvoker mContextualSearchInvoker;
@Before
@@ -94,21 +92,20 @@
when(mMockPackageManager.hasSystemFeature(FEATURE_CONTEXTUAL_SEARCH)).thenReturn(true);
Context context = spy(getApplicationContext());
doReturn(mMockPackageManager).when(context).getPackageManager();
- when(mMockDeviceState.getSystemUiStateFlags()).thenReturn(0L);
+ when(mMockSystemUiProxy.getLastSystemUiStateFlags()).thenReturn(0L);
when(mMockTopTaskTracker.getRunningSplitTaskIds()).thenReturn(new int[]{});
when(mMockStateManager.isContextualSearchIntentAvailable()).thenReturn(true);
when(mMockStateManager.isContextualSearchSettingEnabled()).thenReturn(true);
when(mMockStatsLogManager.logger()).thenReturn(mMockStatsLogger);
-
- doReturn(mMockContainerInterface).when(mMockOverviewComponentObserver)
- .getContainerInterface();
when(mMockContainerInterface.getCreatedContainer()).thenReturn(mMockRecentsViewContainer);
when(mMockRecentsViewContainer.getOverviewPanel()).thenReturn(mMockRecentsView);
- mContextualSearchInvoker = new ContextualSearchInvoker(context, mMockStateManager,
- mMockTopTaskTracker, mMockDeviceState, mMockStatsLogManager,
- mMockContextualSearchHapticManager, mMockOverviewComponentObserver,
- mMockContextualSearchManager);
+ mContextualSearchInvoker = spy(new ContextualSearchInvoker(context, mMockStateManager,
+ mMockTopTaskTracker, mMockSystemUiProxy, mMockStatsLogManager,
+ mMockContextualSearchHapticManager, mMockContextualSearchManager
+ ));
+ doReturn(mMockContainerInterface).when(mContextualSearchInvoker)
+ .getRecentsContainerInterface();
}
@Test
@@ -151,7 +148,7 @@
@Test
public void runContextualSearchInvocationChecksAndLogFailures_notificationShadeIsShowing() {
- when(mMockDeviceState.getSystemUiStateFlags()).thenReturn(SHADE_EXPANDED_SYSUI_FLAGS);
+ when(mMockSystemUiProxy.getLastSystemUiStateFlags()).thenReturn(SHADE_EXPANDED_SYSUI_FLAGS);
assertFalse("Expected invocation checks to fail when notification shade is showing",
mContextualSearchInvoker.runContextualSearchInvocationChecksAndLogFailures());
@@ -161,7 +158,7 @@
@Test
public void runContextualSearchInvocationChecksAndLogFailures_keyguardIsShowing() {
- when(mMockDeviceState.getSystemUiStateFlags()).thenReturn(
+ when(mMockSystemUiProxy.getLastSystemUiStateFlags()).thenReturn(
KEYGUARD_SHOWING_SYSUI_FLAGS);
assertFalse("Expected invocation checks to fail when keyguard is showing",
diff --git a/quickstep/tests/src/com/android/quickstep/InputConsumerUtilsTest.java b/quickstep/tests/src/com/android/quickstep/InputConsumerUtilsTest.java
index a164dad..e2ca91a 100644
--- a/quickstep/tests/src/com/android/quickstep/InputConsumerUtilsTest.java
+++ b/quickstep/tests/src/com/android/quickstep/InputConsumerUtilsTest.java
@@ -89,6 +89,7 @@
import org.mockito.junit.MockitoRule;
import java.util.Optional;
+import java.util.function.Function;
import javax.inject.Provider;
@@ -103,6 +104,7 @@
private TaskAnimationManager mTaskAnimationManager;
private InputChannelCompat.InputEventReceiver mInputEventReceiver;
@Nullable private ResetGestureInputConsumer mResetGestureInputConsumer;
+ @NonNull private Function<GestureState, AnimatedFloat> mSwipeUpProxyProvider = (state) -> null;
@NonNull @Mock private TaskbarActivityContext mTaskbarActivityContext;
@NonNull @Mock private OverviewComponentObserver mOverviewComponentObserver;
@@ -444,7 +446,7 @@
@Test
public void testNewConsumer_withSwipeUpProxyProvider_returnsProgressDelegateInputConsumer() {
- doReturn(new AnimatedFloat()).when(mDeviceState).getSwipeUpProxy(any());
+ mSwipeUpProxyProvider = (state) -> new AnimatedFloat();
assertCorrectInputConsumer(
this::createInputConsumer,
@@ -494,6 +496,7 @@
otherActivityInputConsumer -> {},
mInputEventReceiver,
mTaskbarManager,
+ mSwipeUpProxyProvider,
mOverviewCommandHelper,
event);
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
index 8b7033f..ff8a541 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -143,7 +143,7 @@
<string name="title_change_settings" msgid="1376365968844349552">"Promijeni postavke"</string>
<string name="notification_dots_service_title" msgid="4284221181793592871">"Prikaži tačke za obavještenja"</string>
<string name="developer_options_title" msgid="700788437593726194">"Opcije za programere"</string>
- <string name="auto_add_shortcuts_label" msgid="4926805029653694105">"Dodaj ikone aplikacija na početni ekran"</string>
+ <string name="auto_add_shortcuts_label" msgid="4926805029653694105">"Dodavanje ikona aplikacija na početni ekran"</string>
<string name="auto_add_shortcuts_description" msgid="7117251166066978730">"Za nove aplikacije"</string>
<string name="package_state_unknown" msgid="7592128424511031410">"Nepoznato"</string>
<string name="abandoned_clean_this" msgid="7610119707847920412">"Ukloni"</string>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index a1e822a..0c10f0d 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -129,7 +129,7 @@
<string name="app_pair_name_format" msgid="8134106404716224054">"Ζεύγος εφαρμογών: <xliff:g id="APP1">%1$s</xliff:g> και <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Ταπετσαρία και στιλ"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Επεξεργασία αρχικής οθόνης"</string>
- <string name="settings_button_text" msgid="8873672322605444408">"Ρυθμίσεις Αρχ. Οθ."</string>
+ <string name="settings_button_text" msgid="8873672322605444408">"Ρυθμ. Αρχικής οθόνης"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Απενεργοποιήθηκε από τον διαχειριστή σας"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Να επιτρέπεται η περιστροφή της αρχικής οθόνης"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Όταν το τηλέφωνο περιστρέφεται"</string>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index db2b601..8696ff8 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -50,7 +50,7 @@
<string name="add_to_home_screen" msgid="9168649446635919791">"होम स्क्रीन पर जोड़ें"</string>
<string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> विजेट को होम स्क्रीन पर जोड़ा गया"</string>
<string name="suggested_widgets_header_title" msgid="1844314680798145222">"सुझाव"</string>
- <string name="productivity_widget_recommendation_category_label" msgid="3811812719618323750">"ज़रूरी ऐप्लिकेशन"</string>
+ <string name="productivity_widget_recommendation_category_label" msgid="3811812719618323750">"अहम जानकारी"</string>
<string name="news_widget_recommendation_category_label" msgid="6756167867113741310">"खबरों और पत्रिकाओं वाले ऐप्लिकेशन"</string>
<string name="entertainment_widget_recommendation_category_label" msgid="3973107268630717874">"मनोरंजन से जुड़े ऐप्लिकेशन"</string>
<string name="social_widget_recommendation_category_label" msgid="689147679536384717">"सोशल मीडिया ऐप्लिकेशन"</string>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 9f4ac5a..1a1f405 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -54,7 +54,7 @@
<string name="news_widget_recommendation_category_label" msgid="6756167867113741310">"Újságok és magazinok"</string>
<string name="entertainment_widget_recommendation_category_label" msgid="3973107268630717874">"Szórakozás"</string>
<string name="social_widget_recommendation_category_label" msgid="689147679536384717">"Közösségi"</string>
- <string name="others_widget_recommendation_category_label" msgid="5555987036267226245">"Neked javasolt"</string>
+ <string name="others_widget_recommendation_category_label" msgid="5555987036267226245">"Javaslatok"</string>
<string name="widget_picker_right_pane_accessibility_title" msgid="1673313931455067502">"A <xliff:g id="SELECTED_HEADER">%1$s</xliff:g>-modulok a jobb, a kereső és a beállítások pedig a bal oldalon találhatók"</string>
<string name="widgets_count" msgid="6467746476364652096">"{count,plural, =1{# modul}other{# modul}}"</string>
<string name="shortcuts_count" msgid="8471715556199592381">"{count,plural, =1{# gyorsparancs}other{# gyorsparancs}}"</string>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index ec6da15..34bfbad 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -93,7 +93,7 @@
<string name="all_apps_button_personal_label" msgid="1315764287305224468">"רשימת אפליקציות אישיות"</string>
<string name="all_apps_button_work_label" msgid="7270707118948892488">"רשימת אפליקציות עבודה"</string>
<string name="remove_drop_target_label" msgid="7812859488053230776">"הסרה"</string>
- <string name="uninstall_drop_target_label" msgid="4722034217958379417">"להסרת התקנה"</string>
+ <string name="uninstall_drop_target_label" msgid="4722034217958379417">"הסרת ההתקנה"</string>
<string name="app_info_drop_target_label" msgid="692894985365717661">"פרטי האפליקציה"</string>
<string name="install_private_system_shortcut_label" msgid="1616889277073184841">"התקנה במרחב הפרטי"</string>
<string name="uninstall_private_system_shortcut_label" msgid="8423460530441627982">"הסרת האפליקציה"</string>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index b23b97b..bd792ac 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -129,7 +129,7 @@
<string name="app_pair_name_format" msgid="8134106404716224054">"Programų pora: „<xliff:g id="APP1">%1$s</xliff:g>“ ir „<xliff:g id="APP2">%2$s</xliff:g>“"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Ekrano fonas ir stilius"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Redaguoti pagrindinį ekraną"</string>
- <string name="settings_button_text" msgid="8873672322605444408">"„Home“ nustatymai"</string>
+ <string name="settings_button_text" msgid="8873672322605444408">"Pagrindinio ekrano nustatymai"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Išjungė administratorius"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Leisti pasukti pagrindinį ekraną"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Kai telefonas pasukamas"</string>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
index e3bde3a..de509df 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -136,7 +136,7 @@
<string name="landscape_mode_title" msgid="5138814555934843926">"ल्यान्डस्केप मोड"</string>
<string name="landscape_mode_desc" msgid="7372569859592816793">"फोनमा ल्यान्डस्केप मोड अन गर्नुहोस्"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"नोटिफिकेसन डट"</string>
- <string name="notification_dots_desc_on" msgid="1679848116452218908">"सक्रिय"</string>
+ <string name="notification_dots_desc_on" msgid="1679848116452218908">"अन छ"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"निष्क्रिय"</string>
<string name="title_missing_notification_access" msgid="7503287056163941064">"सूचनासम्बन्धी पहुँच आवश्यक हुन्छ"</string>
<string name="msg_missing_notification_access" msgid="281113995110910548">"नोटिफिकेसन डट देखाउन <xliff:g id="NAME">%1$s</xliff:g> को एपसम्बन्धी सूचनाहरूलाई अन गर्नुहोस्"</string>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index d771c6f..92b0c6d 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -129,7 +129,7 @@
<string name="app_pair_name_format" msgid="8134106404716224054">"App-paar: <xliff:g id="APP1">%1$s</xliff:g> en <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Achtergrond en stijl"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Startscherm bewerken"</string>
- <string name="settings_button_text" msgid="8873672322605444408">"Instellingen start"</string>
+ <string name="settings_button_text" msgid="8873672322605444408">"Instellingen Start"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Uitgezet door je beheerder"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Draaien van startscherm toestaan"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Als de telefoon gedraaid is"</string>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index ac5f3be..c15e2e9 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -50,7 +50,7 @@
<string name="add_to_home_screen" msgid="9168649446635919791">"ਹੋਮ ਸਕ੍ਰੀਨ \'ਤੇ ਸ਼ਾਮਲ ਕਰੋ"</string>
<string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> ਵਿਜੇਟ ਨੂੰ ਹੋਮ ਸਕ੍ਰੀਨ \'ਤੇ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ"</string>
<string name="suggested_widgets_header_title" msgid="1844314680798145222">"ਸੁਝਾਅ"</string>
- <string name="productivity_widget_recommendation_category_label" msgid="3811812719618323750">"ਲੋੜੀਂਦੀਆਂ"</string>
+ <string name="productivity_widget_recommendation_category_label" msgid="3811812719618323750">"ਲੋੜੀਂਦੀਆਂ ਐਪਾਂ ਦੇ ਵਿਜੇਟ"</string>
<string name="news_widget_recommendation_category_label" msgid="6756167867113741310">"ਖਬਰਾਂ ਅਤੇ ਰਸਾਲੇ"</string>
<string name="entertainment_widget_recommendation_category_label" msgid="3973107268630717874">"ਮਨੋਰੰਜਨ"</string>
<string name="social_widget_recommendation_category_label" msgid="689147679536384717">"ਸੋਸ਼ਲ"</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index b2dd767..f019544 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -49,7 +49,7 @@
<string name="add_item_request_drag_hint" msgid="8730547755622776606">"Нажмите на виджет и удерживайте его, чтобы переместить в нужное место на главном экране."</string>
<string name="add_to_home_screen" msgid="9168649446635919791">"Добавить на главный экран"</string>
<string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"Виджет \"<xliff:g id="WIDGET_NAME">%1$s</xliff:g>\" добавлен на главный экран"</string>
- <string name="suggested_widgets_header_title" msgid="1844314680798145222">"Рекомендованные"</string>
+ <string name="suggested_widgets_header_title" msgid="1844314680798145222">"Рекомендации"</string>
<string name="productivity_widget_recommendation_category_label" msgid="3811812719618323750">"Основное"</string>
<string name="news_widget_recommendation_category_label" msgid="6756167867113741310">"Новости и журналы"</string>
<string name="entertainment_widget_recommendation_category_label" msgid="3973107268630717874">"Развлечения"</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index b2d2a1b..cecfedb 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -46,7 +46,7 @@
<string name="widget_accessible_dims_format" msgid="3640149169885301790">"宽 %1$d,高 %2$d"</string>
<string name="widget_preview_context_description" msgid="9045841361655787574">"“<xliff:g id="WIDGET_NAME">%1$s</xliff:g>”微件"</string>
<string name="widget_preview_name_and_dims_content_description" msgid="8489038126122831595">"“<xliff:g id="WIDGET_NAME">%1$s</xliff:g>”微件,宽 %2$d,高 %3$d"</string>
- <string name="add_item_request_drag_hint" msgid="8730547755622776606">"轻触并按住此微件即可在主屏幕上随意移动"</string>
+ <string name="add_item_request_drag_hint" msgid="8730547755622776606">"轻触并按住此微件即可将其拖拽到主屏幕上任意位置"</string>
<string name="add_to_home_screen" msgid="9168649446635919791">"添加到主屏幕"</string>
<string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"已将“<xliff:g id="WIDGET_NAME">%1$s</xliff:g>”微件添加到主屏幕"</string>
<string name="suggested_widgets_header_title" msgid="1844314680798145222">"建议"</string>
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index f740489..a22f943 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -268,8 +268,13 @@
<attr name="allAppsCellSpecsTwoPanelId" format="reference" />
<!-- defaults to false, if not specified -->
<attr name="isFixedLandscape" format="boolean" />
- <!-- defaults to false, if not specified -->
- <attr name="isOldGrid" format="boolean" />
+ <!-- By default all grid types are enabled -->
+ <attr name="gridType" format="integer">
+ <!-- Enable on phone only -->
+ <flag name="one_grid" value="1" />
+ <!-- Enable on tablets only -->
+ <flag name="non_one_grid" value="2" />
+ </attr>
<!-- By default all categories are enabled -->
<attr name="deviceCategory" format="integer">
diff --git a/src/com/android/launcher3/BubbleTextView.java b/src/com/android/launcher3/BubbleTextView.java
index fb847f9..e6b3457 100644
--- a/src/com/android/launcher3/BubbleTextView.java
+++ b/src/com/android/launcher3/BubbleTextView.java
@@ -964,7 +964,8 @@
@Override
public void setTextColor(ColorStateList colors) {
- mTextColor = shouldDrawAppContrastTile() ? PillColorProvider.getInstance(
+ mTextColor = (shouldDrawAppContrastTile() && !TextUtils.isEmpty(getText()))
+ ? PillColorProvider.getInstance(
getContext()).getAppTitleTextPaint().getColor()
: colors.getDefaultColor();
mTextColorStateList = colors;
@@ -989,7 +990,7 @@
public boolean shouldDrawAppContrastTile() {
return mDisplay == DISPLAY_WORKSPACE && shouldTextBeVisible()
&& PillColorProvider.getInstance(getContext()).isMatchaEnabled()
- && enableContrastTiles() && !TextUtils.isEmpty(getText());
+ && enableContrastTiles();
}
public void setTextVisibility(boolean visible) {
diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java
index 813d8f1..3b283c3 100644
--- a/src/com/android/launcher3/DeviceProfile.java
+++ b/src/com/android/launcher3/DeviceProfile.java
@@ -387,7 +387,8 @@
}
/** TODO: Once we fully migrate to staged split, remove "isMultiWindowMode" */
- DeviceProfile(Context context, InvariantDeviceProfile inv, Info info, WindowBounds windowBounds,
+ DeviceProfile(Context context, InvariantDeviceProfile inv, Info info,
+ WindowManagerProxy wmProxy, IconShape iconShape, WindowBounds windowBounds,
SparseArray<DotRenderer> dotRendererCache, boolean isMultiWindowMode,
boolean transposeLayoutWithOrientation, boolean isMultiDisplay, boolean isGestureMode,
@NonNull final ViewScaleProvider viewScaleProvider,
@@ -420,7 +421,7 @@
isPhone = !isTablet;
isTwoPanels = isTablet && isMultiDisplay;
isTaskbarPresent = (isTablet || (enableTinyTaskbar() && isGestureMode))
- && WindowManagerProxy.INSTANCE.get(context).isTaskbarDrawnInProcess();
+ && wmProxy.isTaskbarDrawnInProcess();
// Some more constants.
context = getContext(context, info, inv.isFixedLandscape
@@ -845,8 +846,8 @@
dimensionOverrideProvider.accept(this);
// This is done last, after iconSizePx is calculated above.
- mDotRendererWorkSpace = createDotRenderer(context, iconSizePx, dotRendererCache);
- mDotRendererAllApps = createDotRenderer(context, allAppsIconSizePx, dotRendererCache);
+ mDotRendererWorkSpace = createDotRenderer(iconShape, iconSizePx, dotRendererCache);
+ mDotRendererAllApps = createDotRenderer(iconShape, allAppsIconSizePx, dotRendererCache);
}
/**
@@ -868,12 +869,12 @@
}
private static DotRenderer createDotRenderer(
- @NonNull Context context, int size, @NonNull SparseArray<DotRenderer> cache) {
+ @NonNull IconShape iconShape, int size, @NonNull SparseArray<DotRenderer> cache) {
DotRenderer renderer = cache.get(size);
if (renderer == null) {
renderer = new DotRenderer(
size,
- IconShape.INSTANCE.get(context).getShape().getPath(DEFAULT_DOT_SIZE),
+ iconShape.getShape().getPath(DEFAULT_DOT_SIZE),
DEFAULT_DOT_SIZE);
cache.put(size, renderer);
}
@@ -1090,7 +1091,7 @@
dotRendererCache.put(iconSizePx, mDotRendererWorkSpace);
dotRendererCache.put(allAppsIconSizePx, mDotRendererAllApps);
- return new Builder(context, inv, mInfo)
+ return inv.newDPBuilder(context, mInfo)
.setWindowBounds(bounds)
.setIsMultiDisplay(isMultiDisplay)
.setMultiWindowMode(isMultiWindowMode)
@@ -2473,9 +2474,11 @@
}
public static class Builder {
- private Context mContext;
- private InvariantDeviceProfile mInv;
- private Info mInfo;
+ private final Context mContext;
+ private final InvariantDeviceProfile mInv;
+ private final Info mInfo;
+ private final WindowManagerProxy mWMProxy;
+ private final IconShape mIconShape;
private WindowBounds mWindowBounds;
private boolean mIsMultiDisplay;
@@ -2491,10 +2494,13 @@
private boolean mIsTransientTaskbar;
- public Builder(Context context, InvariantDeviceProfile inv, Info info) {
+ public Builder(Context context, InvariantDeviceProfile inv, Info info,
+ WindowManagerProxy wmProxy, IconShape iconShape) {
mContext = context;
mInv = inv;
mInfo = info;
+ mWMProxy = wmProxy;
+ mIconShape = iconShape;
mIsTransientTaskbar = info.isTransientTaskbar();
}
@@ -2575,7 +2581,8 @@
if (mOverrideProvider == null) {
mOverrideProvider = DEFAULT_DIMENSION_PROVIDER;
}
- return new DeviceProfile(mContext, mInv, mInfo, mWindowBounds, mDotRendererCache,
+ return new DeviceProfile(mContext, mInv, mInfo, mWMProxy, mIconShape,
+ mWindowBounds, mDotRendererCache,
mIsMultiWindowMode, mTransposeLayoutWithOrientation, mIsMultiDisplay,
mIsGestureMode, mViewScaleProvider, mOverrideProvider, mIsTransientTaskbar);
}
diff --git a/src/com/android/launcher3/InvariantDeviceProfile.java b/src/com/android/launcher3/InvariantDeviceProfile.java
index 900f74d..4107c8f 100644
--- a/src/com/android/launcher3/InvariantDeviceProfile.java
+++ b/src/com/android/launcher3/InvariantDeviceProfile.java
@@ -30,7 +30,6 @@
import static com.android.launcher3.util.DisplayController.CHANGE_TASKBAR_PINNING;
import static com.android.launcher3.util.Executors.MAIN_EXECUTOR;
-import android.annotation.TargetApi;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
@@ -46,7 +45,6 @@
import android.util.Log;
import android.util.SparseArray;
import android.util.Xml;
-import android.view.Display;
import androidx.annotation.DimenRes;
import androidx.annotation.IntDef;
@@ -56,18 +54,21 @@
import androidx.core.content.res.ResourcesCompat;
import com.android.launcher3.config.FeatureFlags;
+import com.android.launcher3.dagger.ApplicationContext;
+import com.android.launcher3.dagger.LauncherAppComponent;
+import com.android.launcher3.dagger.LauncherAppSingleton;
+import com.android.launcher3.graphics.IconShape;
import com.android.launcher3.icons.DotRenderer;
import com.android.launcher3.logging.FileLog;
import com.android.launcher3.model.DeviceGridState;
import com.android.launcher3.provider.RestoreDbTask;
import com.android.launcher3.testing.shared.ResourceUtils;
+import com.android.launcher3.util.DaggerSingletonObject;
+import com.android.launcher3.util.DaggerSingletonTracker;
import com.android.launcher3.util.DisplayController;
import com.android.launcher3.util.DisplayController.Info;
-import com.android.launcher3.util.MainThreadInitializedObject;
import com.android.launcher3.util.Partner;
import com.android.launcher3.util.ResourceHelper;
-import com.android.launcher3.util.RunnableList;
-import com.android.launcher3.util.SafeCloseable;
import com.android.launcher3.util.SimpleBroadcastReceiver;
import com.android.launcher3.util.WindowBounds;
import com.android.launcher3.util.window.CachedDisplayInfo;
@@ -86,12 +87,15 @@
import java.util.Objects;
import java.util.stream.Collectors;
-public class InvariantDeviceProfile implements SafeCloseable {
+import javax.inject.Inject;
+
+@LauncherAppSingleton
+public class InvariantDeviceProfile {
public static final String TAG = "IDP";
// We do not need any synchronization for this variable as its only written on UI thread.
- public static final MainThreadInitializedObject<InvariantDeviceProfile> INSTANCE =
- new MainThreadInitializedObject<>(InvariantDeviceProfile::new);
+ public static final DaggerSingletonObject<InvariantDeviceProfile> INSTANCE =
+ new DaggerSingletonObject<>(LauncherAppComponent::getIDP);
public static final String GRID_NAME_PREFS_KEY = "idp_grid_name";
public static final String NON_FIXED_LANDSCAPE_GRID_NAME_PREFS_KEY =
@@ -129,7 +133,10 @@
private static final String RES_GRID_NUM_COLUMNS = "grid_num_columns";
private static final String RES_GRID_ICON_SIZE_DP = "grid_icon_size_dp";
- private final RunnableList mCloseActions = new RunnableList();
+ private final DisplayController mDisplayController;
+ private final WindowManagerProxy mWMProxy;
+ private final LauncherPrefs mPrefs;
+ private final IconShape mIconShape;
/**
* Number of icons per row and column in the workspace.
@@ -247,16 +254,22 @@
private final ArrayList<OnIDPChangeListener> mChangeListeners = new ArrayList<>();
- @VisibleForTesting
- public InvariantDeviceProfile() {
- }
+ @Inject
+ InvariantDeviceProfile(
+ @ApplicationContext Context context,
+ LauncherPrefs prefs,
+ DisplayController dc,
+ WindowManagerProxy wmProxy,
+ IconShape iconShape,
+ DaggerSingletonTracker lifeCycle) {
+ mDisplayController = dc;
+ mWMProxy = wmProxy;
+ mPrefs = prefs;
+ mIconShape = iconShape;
- @TargetApi(23)
- private InvariantDeviceProfile(Context context) {
- String gridName = getCurrentGridName(context);
+ String gridName = prefs.get(GRID_NAME);
initGrid(context, gridName);
- DisplayController dc = DisplayController.INSTANCE.get(context);
dc.setPriorityListener(
(displayContext, info, flags) -> {
if ((flags & (CHANGE_DENSITY | CHANGE_SUPPORTED_BOUNDS
@@ -265,126 +278,46 @@
onConfigChanged(displayContext);
}
});
- mCloseActions.add(() -> dc.setPriorityListener(null));
+ lifeCycle.addCloseable(() -> dc.setPriorityListener(null));
LauncherPrefChangeListener prefListener = key -> {
if (FIXED_LANDSCAPE_MODE.getSharedPrefKey().equals(key)
- && isFixedLandscape != FIXED_LANDSCAPE_MODE.get(context)) {
+ && isFixedLandscape != prefs.get(FIXED_LANDSCAPE_MODE)) {
Trace.beginSection("InvariantDeviceProfile#setFixedLandscape");
if (isFixedLandscape) {
- setCurrentGrid(
- context, LauncherPrefs.get(context).get(NON_FIXED_LANDSCAPE_GRID_NAME));
+ setCurrentGrid(context, prefs.get(NON_FIXED_LANDSCAPE_GRID_NAME));
} else {
- LauncherPrefs.get(context)
- .put(NON_FIXED_LANDSCAPE_GRID_NAME, getCurrentGridName(context));
+ prefs.put(NON_FIXED_LANDSCAPE_GRID_NAME, mPrefs.get(GRID_NAME));
onConfigChanged(context);
}
Trace.endSection();
} else if (ENABLE_TWOLINE_ALLAPPS_TOGGLE.getSharedPrefKey().equals(key)
- && enableTwoLinesInAllApps != ENABLE_TWOLINE_ALLAPPS_TOGGLE.get(context)) {
+ && enableTwoLinesInAllApps != prefs.get(ENABLE_TWOLINE_ALLAPPS_TOGGLE)) {
onConfigChanged(context);
}
};
- LauncherPrefs prefs = LauncherPrefs.INSTANCE.get(context);
prefs.addListener(prefListener, FIXED_LANDSCAPE_MODE, ENABLE_TWOLINE_ALLAPPS_TOGGLE);
- mCloseActions.add(() -> prefs.removeListener(prefListener,
+ lifeCycle.addCloseable(() -> prefs.removeListener(prefListener,
FIXED_LANDSCAPE_MODE, ENABLE_TWOLINE_ALLAPPS_TOGGLE));
- SimpleBroadcastReceiver localeReceiver = new SimpleBroadcastReceiver(
+ SimpleBroadcastReceiver localeReceiver = new SimpleBroadcastReceiver(context,
MAIN_EXECUTOR, i -> onConfigChanged(context));
- localeReceiver.register(context, Intent.ACTION_LOCALE_CHANGED);
- mCloseActions.add(() -> localeReceiver.unregisterReceiverSafely(context));
- }
-
- /**
- * This constructor should NOT have any monitors by design.
- */
- public InvariantDeviceProfile(Context context, String gridName) {
- String newName = initGrid(context, gridName);
- if (newName == null || !newName.equals(gridName)) {
- throw new IllegalArgumentException("Unknown grid name: " + gridName);
- }
- }
-
- /**
- * This constructor should NOT have any monitors by design.
- */
- public InvariantDeviceProfile(Context context, Display display) {
- // Ensure that the main device profile is initialized
- INSTANCE.get(context);
- String gridName = getCurrentGridName(context);
-
- // Get the display info based on default display and interpolate it to existing display
- Info defaultInfo = DisplayController.INSTANCE.get(context).getInfo();
- @DeviceType int defaultDeviceType = defaultInfo.getDeviceType();
- DisplayOption defaultDisplayOption = invDistWeightedInterpolate(
- defaultInfo,
- getPredefinedDeviceProfiles(
- context,
- gridName,
- defaultInfo,
- /*allowDisabledGrid=*/false,
- FIXED_LANDSCAPE_MODE.get(context)
- ),
- defaultDeviceType);
-
- Context displayContext = context.createDisplayContext(display);
- Info myInfo = new Info(displayContext);
- @DeviceType int deviceType = myInfo.getDeviceType();
- DisplayOption myDisplayOption = invDistWeightedInterpolate(
- myInfo,
- getPredefinedDeviceProfiles(
- context,
- gridName,
- myInfo,
- /*allowDisabledGrid=*/false,
- FIXED_LANDSCAPE_MODE.get(context)
- ),
- deviceType);
-
- DisplayOption result = new DisplayOption(defaultDisplayOption.grid)
- .add(myDisplayOption);
- result.iconSizes[INDEX_DEFAULT] =
- defaultDisplayOption.iconSizes[INDEX_DEFAULT];
- for (int i = 1; i < COUNT_SIZES; i++) {
- result.iconSizes[i] = Math.min(
- defaultDisplayOption.iconSizes[i], myDisplayOption.iconSizes[i]);
- }
-
- System.arraycopy(defaultDisplayOption.minCellSize, 0, result.minCellSize, 0,
- COUNT_SIZES);
- System.arraycopy(defaultDisplayOption.borderSpaces, 0, result.borderSpaces, 0,
- COUNT_SIZES);
-
- initGrid(context, myInfo, result);
- }
-
- @Override
- public void close() {
- mCloseActions.executeAllAndDestroy();
- }
-
- public static String getCurrentGridName(Context context) {
- return LauncherPrefs.get(context).get(GRID_NAME);
+ localeReceiver.register(Intent.ACTION_LOCALE_CHANGED);
+ lifeCycle.addCloseable(() -> localeReceiver.unregisterReceiverSafely());
}
private String initGrid(Context context, String gridName) {
- FileLog.d(TAG, "Before initGrid:"
- + "gridName:" + gridName
- + ", dbFile:" + dbFile
- + ", LauncherPrefs GRID_NAME:" + LauncherPrefs.get(context).get(GRID_NAME)
- + ", LauncherPrefs DB_FILE:" + LauncherPrefs.get(context).get(DB_FILE));
- Info displayInfo = DisplayController.INSTANCE.get(context).getInfo();
+ Info displayInfo = mDisplayController.getInfo();
List<DisplayOption> allOptions = getPredefinedDeviceProfiles(
context,
gridName,
displayInfo,
- RestoreDbTask.isPending(context),
- FIXED_LANDSCAPE_MODE.get(context)
+ RestoreDbTask.isPending(mPrefs),
+ mPrefs.get(FIXED_LANDSCAPE_MODE)
);
// Filter out options that don't have the same number of columns as the grid
- DeviceGridState deviceGridState = new DeviceGridState(context);
+ DeviceGridState deviceGridState = new DeviceGridState(mPrefs);
List<DisplayOption> allOptionsFilteredByColCount =
filterByColumnCount(allOptions, deviceGridState.getColumns());
@@ -395,15 +328,15 @@
displayInfo.getDeviceType());
if (!displayOption.grid.name.equals(gridName)) {
- LauncherPrefs.get(context).put(GRID_NAME, displayOption.grid.name);
+ mPrefs.put(GRID_NAME, displayOption.grid.name);
}
initGrid(context, displayInfo, displayOption);
FileLog.d(TAG, "After initGrid:"
+ "gridName:" + gridName
+ ", dbFile:" + dbFile
- + ", LauncherPrefs GRID_NAME:" + LauncherPrefs.get(context).get(GRID_NAME)
- + ", LauncherPrefs DB_FILE:" + LauncherPrefs.get(context).get(DB_FILE));
+ + ", LauncherPrefs GRID_NAME:" + mPrefs.get(GRID_NAME)
+ + ", LauncherPrefs DB_FILE:" + mPrefs.get(DB_FILE));
return displayOption.grid.name;
}
@@ -420,18 +353,13 @@
*/
@Deprecated
public void reset(Context context) {
- initGrid(context, getCurrentGridName(context));
- }
-
- @VisibleForTesting
- public static String getDefaultGridName(Context context) {
- return new InvariantDeviceProfile().initGrid(context, null);
+ initGrid(context, mPrefs.get(GRID_NAME));
}
private void initGrid(Context context, Info displayInfo, DisplayOption displayOption) {
enableTwoLinesInAllApps = Flags.enableTwolineToggle()
&& Utilities.isEnglishLanguage(context)
- && ENABLE_TWOLINE_ALLAPPS_TOGGLE.get(context);
+ && mPrefs.get(ENABLE_TWOLINE_ALLAPPS_TOGGLE);
mLocale = context.getResources().getConfiguration().locale.toString();
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
@@ -522,7 +450,7 @@
defaultWallpaperSize = new Point(displayInfo.currentSize);
SparseArray<DotRenderer> dotRendererCache = new SparseArray<>();
for (WindowBounds bounds : displayInfo.supportedBounds) {
- localSupportedProfiles.add(new DeviceProfile.Builder(context, this, displayInfo)
+ localSupportedProfiles.add(newDPBuilder(context, displayInfo)
.setIsMultiDisplay(deviceType == TYPE_MULTI_DISPLAY)
.setWindowBounds(bounds)
.setDotRendererCache(dotRendererCache)
@@ -561,6 +489,10 @@
});
}
+ DeviceProfile.Builder newDPBuilder(Context context, Info info) {
+ return new DeviceProfile.Builder(context, this, info, mWMProxy, mIconShape);
+ }
+
public void addOnChangeListener(OnIDPChangeListener listener) {
mChangeListeners.add(listener);
}
@@ -574,7 +506,7 @@
* migration.
*/
public void setCurrentGrid(Context context, String newGridName) {
- LauncherPrefs.get(context).put(GRID_NAME, newGridName);
+ mPrefs.put(GRID_NAME, newGridName);
MAIN_EXECUTOR.execute(() -> {
Trace.beginSection("InvariantDeviceProfile#setCurrentGrid");
onConfigChanged(context.getApplicationContext());
@@ -594,8 +526,7 @@
Object[] oldState = toModelState();
// Re-init grid
- String gridName = getCurrentGridName(context);
- initGrid(context, gridName);
+ initGrid(context, mPrefs.get(GRID_NAME));
boolean modelPropsChanged = !Arrays.equals(oldState, toModelState());
for (OnIDPChangeListener listener : mChangeListeners) {
@@ -912,11 +843,20 @@
return out;
}
- public DeviceProfile getDeviceProfile(Context context) {
- WindowManagerProxy windowManagerProxy = WindowManagerProxy.INSTANCE.get(context);
- Rect bounds = windowManagerProxy.getCurrentBounds(context);
- int rotation = windowManagerProxy.getRotation(context);
+ public DeviceProfile createDeviceProfileForSecondaryDisplay(Context displayContext) {
+ // Disable transpose layout and use multi-window mode so that the icons are scaled properly
+ return newDPBuilder(displayContext, new Info(displayContext))
+ .setIsMultiDisplay(false)
+ .setMultiWindowMode(true)
+ .setWindowBounds(mWMProxy.getRealBounds(
+ displayContext, mWMProxy.getDisplayInfo(displayContext)))
+ .setTransposeLayoutWithOrientation(false)
+ .build();
+ }
+ public DeviceProfile getDeviceProfile(Context context) {
+ Rect bounds = mWMProxy.getCurrentBounds(context);
+ int rotation = mWMProxy.getRotation(context);
return getBestMatch(bounds.width(), bounds.height(), rotation);
}
@@ -994,6 +934,9 @@
private static final int DEVICE_CATEGORY_PHONE = 1 << 0;
private static final int DEVICE_CATEGORY_TABLET = 1 << 1;
private static final int DEVICE_CATEGORY_MULTI_DISPLAY = 1 << 2;
+ private static final int GRID_TYPE_ONE_GRID = 1 << 0;
+ private static final int GRID_TYPE_NON_ONE_GRID = 1 << 1;
+ private static final int GRID_TYPE_ALL = 1 << 2;
private static final int DEVICE_CATEGORY_ALL =
DEVICE_CATEGORY_PHONE | DEVICE_CATEGORY_TABLET | DEVICE_CATEGORY_MULTI_DISPLAY;
@@ -1010,6 +953,7 @@
public final int numColumns;
public final int numSearchContainerColumns;
public final int deviceCategory;
+ public final int gridType;
private final int[] numFolderRows = new int[COUNT_SIZES];
private final int[] numFolderColumns = new int[COUNT_SIZES];
@@ -1048,7 +992,6 @@
private final int mAllAppsCellSpecsTwoPanelId;
private final int mGridSizeSpecsId;
private final boolean mIsFixedLandscape;
- private final boolean mIsOldGrid;
public GridOption(Context context, AttributeSet attrs, Info displayInfo) {
TypedArray a = context.obtainStyledAttributes(
@@ -1196,7 +1139,7 @@
}
mIsFixedLandscape = a.getBoolean(R.styleable.GridDisplayOption_isFixedLandscape, false);
- mIsOldGrid = a.getBoolean(R.styleable.GridDisplayOption_isOldGrid, false);
+ gridType = a.getInt(R.styleable.GridDisplayOption_gridType, GRID_TYPE_ALL);
int inlineForRotation = a.getInt(R.styleable.GridDisplayOption_inlineQsb,
DONT_INLINE_QSB);
@@ -1241,13 +1184,11 @@
return mIsFixedLandscape && isFixedLandscape && Flags.oneGridSpecs();
}
- // Here we return true if we want to show the new grids.
- if (mGridSizeSpecsId != INVALID_RESOURCE_HANDLE) {
+ // If the grid type is one grid we return true when the flag is on, if the grid type
+ // is non-one grid we return true when the flag is off. Otherwise, we return true.
+ if (gridType == GRID_TYPE_ONE_GRID) {
return Flags.oneGridSpecs();
- }
-
- // Here we return true if we want to show the old grids.
- if (mIsOldGrid) {
+ } else if (gridType == GRID_TYPE_NON_ONE_GRID) {
return !Flags.oneGridSpecs();
}
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index 04e699c..315301a 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -349,7 +349,8 @@
private final int[] mTmpAddItemCellCoordinates = new int[2];
- protected Hotseat mHotseat;
+ @Thunk
+ Hotseat mHotseat;
private DropTargetBar mDropTargetBar;
@@ -806,6 +807,10 @@
);
}
+ public void onAssistantVisibilityChanged(float visibility) {
+ mHotseat.getQsb().setAlpha(1f - visibility);
+ }
+
/**
* Returns {@code true} if a new DeviceProfile is initialized, and {@code false} otherwise.
*/
diff --git a/src/com/android/launcher3/LauncherAppState.java b/src/com/android/launcher3/LauncherAppState.java
index e560a14..71013c3 100644
--- a/src/com/android/launcher3/LauncherAppState.java
+++ b/src/com/android/launcher3/LauncherAppState.java
@@ -119,14 +119,13 @@
}
SimpleBroadcastReceiver modelChangeReceiver =
- new SimpleBroadcastReceiver(UI_HELPER_EXECUTOR, mModel::onBroadcastIntent);
+ new SimpleBroadcastReceiver(context, UI_HELPER_EXECUTOR, mModel::onBroadcastIntent);
modelChangeReceiver.register(
- mContext,
ACTION_DEVICE_POLICY_RESOURCE_UPDATED);
if (BuildConfig.IS_STUDIO_BUILD) {
- modelChangeReceiver.register(mContext, RECEIVER_EXPORTED, ACTION_FORCE_ROLOAD);
+ modelChangeReceiver.register(RECEIVER_EXPORTED, ACTION_FORCE_ROLOAD);
}
- mOnTerminateCallback.add(() -> modelChangeReceiver.unregisterReceiverSafely(mContext));
+ mOnTerminateCallback.add(() -> modelChangeReceiver.unregisterReceiverSafely());
SafeCloseable userChangeListener = UserCache.INSTANCE.get(mContext)
.addUserEventListener(mModel::onUserEvent);
diff --git a/src/com/android/launcher3/dagger/LauncherBaseAppComponent.java b/src/com/android/launcher3/dagger/LauncherBaseAppComponent.java
index 7bd7c3e..87b5459 100644
--- a/src/com/android/launcher3/dagger/LauncherBaseAppComponent.java
+++ b/src/com/android/launcher3/dagger/LauncherBaseAppComponent.java
@@ -18,6 +18,7 @@
import android.content.Context;
+import com.android.launcher3.InvariantDeviceProfile;
import com.android.launcher3.LauncherPrefs;
import com.android.launcher3.graphics.IconShape;
import com.android.launcher3.graphics.ThemeManager;
@@ -72,6 +73,7 @@
DisplayController getDisplayController();
WallpaperColorHints getWallpaperColorHints();
LockedUserState getLockedUserState();
+ InvariantDeviceProfile getIDP();
/** Builder for LauncherBaseAppComponent. */
interface Builder {
diff --git a/src/com/android/launcher3/dagger/LauncherComponentProvider.kt b/src/com/android/launcher3/dagger/LauncherComponentProvider.kt
index 5015e54..71e3354 100644
--- a/src/com/android/launcher3/dagger/LauncherComponentProvider.kt
+++ b/src/com/android/launcher3/dagger/LauncherComponentProvider.kt
@@ -47,6 +47,10 @@
.component
}
+ /** Extension method easily access LauncherAppComponent */
+ val Context.appComponent: LauncherAppComponent
+ get() = get(this)
+
private data class Holder(
val component: LauncherAppComponent,
private val filter: LayoutInflater.Filter?,
diff --git a/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java b/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java
index 911064c..03f0582 100644
--- a/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java
+++ b/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java
@@ -24,6 +24,7 @@
import static com.android.launcher3.BubbleTextView.DISPLAY_WORKSPACE;
import static com.android.launcher3.DeviceProfile.DEFAULT_SCALE;
import static com.android.launcher3.Hotseat.ALPHA_CHANNEL_PREVIEW_RENDERER;
+import static com.android.launcher3.LauncherPrefs.GRID_NAME;
import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_HOTSEAT;
import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_HOTSEAT_PREDICTION;
import static com.android.launcher3.Utilities.SHOULD_SHOW_FIRST_PAGE_WIDGET;
@@ -137,14 +138,14 @@
private final String mPrefName;
- public PreviewContext(Context base, InvariantDeviceProfile idp) {
+ public PreviewContext(Context base, String gridName) {
super(base);
mPrefName = "preview-" + UUID.randomUUID().toString();
- initDaggerComponent(DaggerLauncherPreviewRenderer_PreviewAppComponent.builder()
- .bindPrefs(new ProxyPrefs(
- this, getSharedPreferences(mPrefName, MODE_PRIVATE))));
-
- putObject(InvariantDeviceProfile.INSTANCE, idp);
+ LauncherPrefs prefs =
+ new ProxyPrefs(this, getSharedPreferences(mPrefName, MODE_PRIVATE));
+ prefs.put(GRID_NAME, gridName);
+ initDaggerComponent(
+ DaggerLauncherPreviewRenderer_PreviewAppComponent.builder().bindPrefs(prefs));
putObject(LauncherAppState.INSTANCE,
new LauncherAppState(this, null /* iconCacheFileName */));
}
@@ -192,8 +193,8 @@
this::getAppWidgetScale).build();
if (context instanceof PreviewContext) {
Context tempContext = ((PreviewContext) context).getBaseContext();
- mDpOrig = new InvariantDeviceProfile(tempContext, InvariantDeviceProfile
- .getCurrentGridName(tempContext)).getDeviceProfile(tempContext)
+ mDpOrig = InvariantDeviceProfile.INSTANCE.get(tempContext)
+ .getDeviceProfile(tempContext)
.copy(tempContext);
} else {
mDpOrig = mDp;
diff --git a/src/com/android/launcher3/graphics/PreviewSurfaceRenderer.java b/src/com/android/launcher3/graphics/PreviewSurfaceRenderer.java
index 7a60814..686024d 100644
--- a/src/com/android/launcher3/graphics/PreviewSurfaceRenderer.java
+++ b/src/com/android/launcher3/graphics/PreviewSurfaceRenderer.java
@@ -20,6 +20,7 @@
import static android.content.res.Configuration.UI_MODE_NIGHT_YES;
import static android.view.Display.DEFAULT_DISPLAY;
+import static com.android.launcher3.LauncherPrefs.GRID_NAME;
import static com.android.launcher3.LauncherSettings.Favorites.TABLE_NAME;
import static com.android.launcher3.graphics.ThemeManager.PREF_ICON_SHAPE;
import static com.android.launcher3.util.Executors.MAIN_EXECUTOR;
@@ -60,7 +61,6 @@
import com.android.launcher3.model.BaseLauncherBinder;
import com.android.launcher3.model.BgDataModel;
import com.android.launcher3.model.BgDataModel.Callbacks;
-import com.android.launcher3.model.GridSizeMigrationDBController;
import com.android.launcher3.model.LoaderTask;
import com.android.launcher3.model.ModelDbController;
import com.android.launcher3.provider.LauncherDbUtils;
@@ -117,7 +117,7 @@
mGridName = bundle.getString("name");
bundle.remove("name");
if (mGridName == null) {
- mGridName = InvariantDeviceProfile.getCurrentGridName(context);
+ mGridName = LauncherPrefs.get(context).get(GRID_NAME);
}
mWallpaperColors = bundle.getParcelable(KEY_COLORS);
if (Flags.newCustomizationPickerUi()) {
@@ -316,11 +316,10 @@
@WorkerThread
private void loadModelData() {
final Context inflationContext = getPreviewContext();
- final InvariantDeviceProfile idp = new InvariantDeviceProfile(inflationContext, mGridName);
- if (GridSizeMigrationDBController.needsToMigrate(inflationContext, idp)
+ if (!mGridName.equals(LauncherPrefs.INSTANCE.get(mContext).get(GRID_NAME))
|| mShapeKey != null) {
// Start the migration
- PreviewContext previewContext = new PreviewContext(inflationContext, idp);
+ PreviewContext previewContext = new PreviewContext(inflationContext, mGridName);
if (mShapeKey != null) {
LauncherPrefs.INSTANCE.get(previewContext).put(PREF_ICON_SHAPE, mShapeKey);
}
@@ -348,6 +347,7 @@
@Override
public void run() {
+ InvariantDeviceProfile idp = LauncherAppState.getIDP(previewContext);
DeviceProfile deviceProfile = idp.getDeviceProfile(previewContext);
String query =
LauncherSettings.Favorites.SCREEN + " = " + Workspace.FIRST_SCREEN_ID
@@ -371,7 +371,7 @@
LauncherAppState.getInstance(inflationContext).getModel().loadAsync(dataModel -> {
if (dataModel != null) {
MAIN_EXECUTOR.execute(() -> renderView(inflationContext, dataModel, null,
- null, idp));
+ null, LauncherAppState.getIDP(inflationContext)));
} else {
Log.e(TAG, "Model loading failed");
}
diff --git a/src/com/android/launcher3/graphics/ThemeManager.kt b/src/com/android/launcher3/graphics/ThemeManager.kt
index 242220a..1636da8 100644
--- a/src/com/android/launcher3/graphics/ThemeManager.kt
+++ b/src/com/android/launcher3/graphics/ThemeManager.kt
@@ -62,8 +62,8 @@
private val listeners = CopyOnWriteArrayList<ThemeChangeListener>()
init {
- val receiver = SimpleBroadcastReceiver(MAIN_EXECUTOR) { verifyIconState() }
- receiver.registerPkgActions(context, "android", ACTION_OVERLAY_CHANGED)
+ val receiver = SimpleBroadcastReceiver(context, MAIN_EXECUTOR) { verifyIconState() }
+ receiver.registerPkgActions("android", ACTION_OVERLAY_CHANGED)
val prefListener = LauncherPrefChangeListener { key ->
when (key) {
@@ -74,7 +74,7 @@
prefs.addListener(prefListener, THEMED_ICONS, PREF_ICON_SHAPE)
lifecycle.addCloseable {
- receiver.unregisterReceiverSafely(context)
+ receiver.unregisterReceiverSafely()
prefs.removeListener(prefListener)
}
}
diff --git a/src/com/android/launcher3/icons/LauncherIcons.java b/src/com/android/launcher3/icons/LauncherIcons.java
deleted file mode 100644
index 5c6debe..0000000
--- a/src/com/android/launcher3/icons/LauncherIcons.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.launcher3.icons;
-
-import static android.graphics.Color.BLACK;
-
-import static com.android.launcher3.graphics.ThemeManager.PREF_ICON_SHAPE;
-
-import android.content.Context;
-import android.graphics.Canvas;
-import android.graphics.Path;
-import android.graphics.Rect;
-import android.graphics.drawable.AdaptiveIconDrawable;
-import android.os.UserHandle;
-
-import androidx.annotation.NonNull;
-
-import com.android.launcher3.Flags;
-import com.android.launcher3.InvariantDeviceProfile;
-import com.android.launcher3.LauncherPrefs;
-import com.android.launcher3.graphics.IconShape;
-import com.android.launcher3.graphics.ThemeManager;
-import com.android.launcher3.pm.UserCache;
-import com.android.launcher3.util.MainThreadInitializedObject;
-import com.android.launcher3.util.SafeCloseable;
-import com.android.launcher3.util.UserIconInfo;
-
-import java.util.concurrent.ConcurrentLinkedQueue;
-
-/**
- * Wrapper class to provide access to {@link BaseIconFactory} and also to provide pool of this class
- * that are threadsafe.
- */
-public class LauncherIcons extends BaseIconFactory implements AutoCloseable {
-
- private static final float SEVEN_SIDED_COOKIE_SCALE = 72f / 80f;
- private static final float FOUR_SIDED_COOKIE_SCALE = 72f / 83.4f;
- private static final float VERY_SUNNY_SCALE = 72f / 92f;
- private static final float DEFAULT_ICON_SCALE = 1f;
-
-
- private static final MainThreadInitializedObject<Pool> POOL =
- new MainThreadInitializedObject<>(Pool::new);
-
- /**
- * Return a new Message instance from the global pool. Allows us to
- * avoid allocating new objects in many cases.
- */
- public static LauncherIcons obtain(Context context) {
- return POOL.get(context).obtain();
- }
-
- public static void clearPool(Context context) {
- POOL.get(context).close();
- }
-
- private final ConcurrentLinkedQueue<LauncherIcons> mPool;
-
- protected LauncherIcons(Context context, int fillResIconDpi, int iconBitmapSize,
- ConcurrentLinkedQueue<LauncherIcons> pool) {
- super(context, fillResIconDpi, iconBitmapSize);
- mThemeController = ThemeManager.INSTANCE.get(context).getThemeController();
- mPool = pool;
- }
-
- /**
- * Recycles a LauncherIcons that may be in-use.
- */
- public void recycle() {
- clear();
- mPool.add(this);
- }
-
- @NonNull
- @Override
- protected UserIconInfo getUserInfo(@NonNull UserHandle user) {
- return UserCache.INSTANCE.get(mContext).getUserInfo(user);
- }
-
- @NonNull
- @Override
- public Path getShapePath(AdaptiveIconDrawable drawable, Rect iconBounds) {
- if (!Flags.enableLauncherIconShapes()) return drawable.getIconMask();
- return IconShape.INSTANCE.get(mContext).getShape().getPath(iconBounds);
- }
-
- @Override
- protected void drawAdaptiveIcon(
- @NonNull Canvas canvas,
- @NonNull AdaptiveIconDrawable drawable,
- @NonNull Path overridePath
- ) {
- if (!Flags.enableLauncherIconShapes()) {
- super.drawAdaptiveIcon(canvas, drawable, overridePath);
- return;
- }
- String shapeKey = LauncherPrefs.get(mContext).get(PREF_ICON_SHAPE);
- float iconScale = switch (shapeKey) {
- case "seven_sided_cookie" -> SEVEN_SIDED_COOKIE_SCALE;
- case "four_sided_cookie" -> FOUR_SIDED_COOKIE_SCALE;
- case "sunny" -> VERY_SUNNY_SCALE;
- default -> DEFAULT_ICON_SCALE;
- };
- canvas.clipPath(overridePath);
- canvas.drawColor(BLACK);
- canvas.save();
- canvas.scale(iconScale, iconScale, canvas.getWidth() / 2f, canvas.getHeight() / 2f);
- if (drawable.getBackground() != null) {
- drawable.getBackground().draw(canvas);
- }
- if (drawable.getForeground() != null) {
- drawable.getForeground().draw(canvas);
- }
- canvas.restore();
- }
-
- @Override
- public void close() {
- recycle();
- }
-
- private static class Pool implements SafeCloseable {
-
- private final Context mContext;
-
- @NonNull
- private ConcurrentLinkedQueue<LauncherIcons> mPool = new ConcurrentLinkedQueue<>();
-
- private Pool(Context context) {
- mContext = context;
- }
-
- public LauncherIcons obtain() {
- ConcurrentLinkedQueue<LauncherIcons> pool = mPool;
- LauncherIcons m = pool.poll();
-
- if (m == null) {
- InvariantDeviceProfile idp = InvariantDeviceProfile.INSTANCE.get(mContext);
- return new LauncherIcons(mContext, idp.fillResIconDpi, idp.iconBitmapSize, pool);
- } else {
- return m;
- }
- }
-
- @Override
- public void close() {
- mPool = new ConcurrentLinkedQueue<>();
- }
- }
-}
diff --git a/src/com/android/launcher3/icons/LauncherIcons.kt b/src/com/android/launcher3/icons/LauncherIcons.kt
new file mode 100644
index 0000000..518f29d
--- /dev/null
+++ b/src/com/android/launcher3/icons/LauncherIcons.kt
@@ -0,0 +1,139 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.launcher3.icons
+
+import android.content.Context
+import android.graphics.Canvas
+import android.graphics.Color
+import android.graphics.Path
+import android.graphics.Rect
+import android.graphics.drawable.AdaptiveIconDrawable
+import android.os.UserHandle
+import com.android.launcher3.Flags
+import com.android.launcher3.InvariantDeviceProfile
+import com.android.launcher3.LauncherPrefs
+import com.android.launcher3.graphics.IconShape
+import com.android.launcher3.graphics.ThemeManager
+import com.android.launcher3.pm.UserCache
+import com.android.launcher3.util.MainThreadInitializedObject
+import com.android.launcher3.util.SafeCloseable
+import com.android.launcher3.util.UserIconInfo
+import java.util.concurrent.ConcurrentLinkedQueue
+
+/**
+ * Wrapper class to provide access to [BaseIconFactory] and also to provide pool of this class that
+ * are threadsafe.
+ */
+class LauncherIcons
+protected constructor(
+ context: Context,
+ fillResIconDpi: Int,
+ iconBitmapSize: Int,
+ private val pool: ConcurrentLinkedQueue<LauncherIcons>,
+) : BaseIconFactory(context, fillResIconDpi, iconBitmapSize), AutoCloseable {
+
+ init {
+ mThemeController = ThemeManager.INSTANCE[context].themeController
+ }
+
+ /** Recycles a LauncherIcons that may be in-use. */
+ fun recycle() {
+ clear()
+ pool.add(this)
+ }
+
+ override fun getUserInfo(user: UserHandle): UserIconInfo {
+ return UserCache.INSTANCE[mContext].getUserInfo(user)
+ }
+
+ public override fun getShapePath(drawable: AdaptiveIconDrawable, iconBounds: Rect): Path {
+ if (!Flags.enableLauncherIconShapes()) return drawable.iconMask
+ return IconShape.INSTANCE[mContext].shape.getPath(iconBounds)
+ }
+
+ override fun drawAdaptiveIcon(
+ canvas: Canvas,
+ drawable: AdaptiveIconDrawable,
+ overridePath: Path,
+ ) {
+ if (!Flags.enableLauncherIconShapes()) {
+ super.drawAdaptiveIcon(canvas, drawable, overridePath)
+ return
+ }
+ val shapeKey = LauncherPrefs.get(mContext).get(ThemeManager.PREF_ICON_SHAPE)
+ val iconScale =
+ when (shapeKey) {
+ "seven_sided_cookie" -> SEVEN_SIDED_COOKIE_SCALE
+ "four_sided_cookie" -> FOUR_SIDED_COOKIE_SCALE
+ "sunny" -> VERY_SUNNY_SCALE
+ else -> DEFAULT_ICON_SCALE
+ }
+ canvas.clipPath(overridePath)
+ canvas.drawColor(Color.BLACK)
+ canvas.save()
+ canvas.scale(iconScale, iconScale, canvas.width / 2f, canvas.height / 2f)
+ if (drawable.background != null) {
+ drawable.background.draw(canvas)
+ }
+ if (drawable.foreground != null) {
+ drawable.foreground.draw(canvas)
+ }
+ canvas.restore()
+ }
+
+ override fun close() {
+ recycle()
+ }
+
+ private class Pool(private val context: Context) : SafeCloseable {
+ private var pool = ConcurrentLinkedQueue<LauncherIcons>()
+
+ fun obtain(): LauncherIcons {
+ val pool = pool
+ return pool.poll()
+ ?: InvariantDeviceProfile.INSTANCE[context].let {
+ LauncherIcons(context, it.fillResIconDpi, it.iconBitmapSize, pool)
+ }
+ }
+
+ override fun close() {
+ pool = ConcurrentLinkedQueue()
+ }
+ }
+
+ companion object {
+ private const val SEVEN_SIDED_COOKIE_SCALE = 72f / 80f
+ private const val FOUR_SIDED_COOKIE_SCALE = 72f / 83.4f
+ private const val VERY_SUNNY_SCALE = 72f / 92f
+ private const val DEFAULT_ICON_SCALE = 1f
+
+ private val POOL = MainThreadInitializedObject { Pool(it) }
+
+ /**
+ * Return a new Message instance from the global pool. Allows us to avoid allocating new
+ * objects in many cases.
+ */
+ @JvmStatic
+ fun obtain(context: Context): LauncherIcons {
+ return POOL[context].obtain()
+ }
+
+ @JvmStatic
+ fun clearPool(context: Context) {
+ POOL[context].close()
+ }
+ }
+}
diff --git a/src/com/android/launcher3/model/DeviceGridState.java b/src/com/android/launcher3/model/DeviceGridState.java
index 90af215..6f12c97 100644
--- a/src/com/android/launcher3/model/DeviceGridState.java
+++ b/src/com/android/launcher3/model/DeviceGridState.java
@@ -68,7 +68,10 @@
}
public DeviceGridState(Context context) {
- LauncherPrefs lp = LauncherPrefs.get(context);
+ this(LauncherPrefs.get(context));
+ }
+
+ public DeviceGridState(LauncherPrefs lp) {
mGridSizeString = lp.get(WORKSPACE_SIZE);
mNumHotseat = lp.get(HOTSEAT_COUNT);
mDeviceType = lp.get(DEVICE_TYPE);
diff --git a/src/com/android/launcher3/pm/UserCache.java b/src/com/android/launcher3/pm/UserCache.java
index 0b18a87..20c0ecc 100644
--- a/src/com/android/launcher3/pm/UserCache.java
+++ b/src/com/android/launcher3/pm/UserCache.java
@@ -81,10 +81,7 @@
}
private final List<BiConsumer<UserHandle, String>> mUserEventListeners = new ArrayList<>();
- private final SimpleBroadcastReceiver mUserChangeReceiver =
- new SimpleBroadcastReceiver(MODEL_EXECUTOR, this::onUsersChanged);
-
- private final Context mContext;
+ private final SimpleBroadcastReceiver mUserChangeReceiver;
private final ApiWrapper mApiWrapper;
@NonNull
@@ -99,16 +96,17 @@
DaggerSingletonTracker tracker,
ApiWrapper apiWrapper
) {
- mContext = context;
mApiWrapper = apiWrapper;
+ mUserChangeReceiver = new SimpleBroadcastReceiver(context,
+ MODEL_EXECUTOR, this::onUsersChanged);
mUserToSerialMap = Collections.emptyMap();
MODEL_EXECUTOR.execute(this::initAsync);
- tracker.addCloseable(() -> mUserChangeReceiver.unregisterReceiverSafely(mContext));
+ tracker.addCloseable(() -> mUserChangeReceiver.unregisterReceiverSafely());
}
@WorkerThread
private void initAsync() {
- mUserChangeReceiver.register(mContext,
+ mUserChangeReceiver.register(
Intent.ACTION_MANAGED_PROFILE_AVAILABLE,
Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE,
Intent.ACTION_MANAGED_PROFILE_REMOVED,
diff --git a/src/com/android/launcher3/provider/RestoreDbTask.java b/src/com/android/launcher3/provider/RestoreDbTask.java
index dc42920..34c9117 100644
--- a/src/com/android/launcher3/provider/RestoreDbTask.java
+++ b/src/com/android/launcher3/provider/RestoreDbTask.java
@@ -415,7 +415,11 @@
}
public static boolean isPending(Context context) {
- return LauncherPrefs.get(context).has(RESTORE_DEVICE);
+ return isPending(LauncherPrefs.get(context));
+ }
+
+ public static boolean isPending(LauncherPrefs prefs) {
+ return prefs.has(RESTORE_DEVICE);
}
/**
diff --git a/src/com/android/launcher3/secondarydisplay/SecondaryDisplayLauncher.java b/src/com/android/launcher3/secondarydisplay/SecondaryDisplayLauncher.java
index df27b54..c20d655 100644
--- a/src/com/android/launcher3/secondarydisplay/SecondaryDisplayLauncher.java
+++ b/src/com/android/launcher3/secondarydisplay/SecondaryDisplayLauncher.java
@@ -115,15 +115,9 @@
if (mDragLayer != null) {
return;
}
- InvariantDeviceProfile currentDisplayIdp = new InvariantDeviceProfile(
- this, getWindow().getDecorView().getDisplay());
- // Disable transpose layout and use multi-window mode so that the icons are scaled properly
- mDeviceProfile = currentDisplayIdp.getDeviceProfile(this)
- .toBuilder(this)
- .setMultiWindowMode(true)
- .setTransposeLayoutWithOrientation(false)
- .build();
+ mDeviceProfile = InvariantDeviceProfile.INSTANCE.get(this)
+ .createDeviceProfileForSecondaryDisplay(this);
mDeviceProfile.autoResizeAllAppsCells();
setContentView(R.layout.secondary_launcher);
diff --git a/src/com/android/launcher3/util/DisplayController.java b/src/com/android/launcher3/util/DisplayController.java
index ee1af81..376a61e 100644
--- a/src/com/android/launcher3/util/DisplayController.java
+++ b/src/com/android/launcher3/util/DisplayController.java
@@ -107,7 +107,6 @@
private static final String ACTION_OVERLAY_CHANGED = "android.intent.action.OVERLAY_CHANGED";
private static final String TARGET_OVERLAY_PACKAGE = "android";
- private final Context mContext;
private final WindowManagerProxy mWMProxy;
// Null for SDK < S
@@ -120,8 +119,7 @@
// We will register broadcast receiver on main thread to ensure not missing changes on
// TARGET_OVERLAY_PACKAGE and ACTION_OVERLAY_CHANGED.
- private final SimpleBroadcastReceiver mReceiver =
- new SimpleBroadcastReceiver(MAIN_EXECUTOR, this::onIntent);
+ private final SimpleBroadcastReceiver mReceiver;
private Info mInfo;
private boolean mDestroyed = false;
@@ -131,7 +129,6 @@
WindowManagerProxy wmProxy,
LauncherPrefs prefs,
DaggerSingletonTracker lifecycle) {
- mContext = context;
mWMProxy = wmProxy;
if (enableTaskbarPinning()) {
@@ -155,11 +152,12 @@
Display display = context.getSystemService(DisplayManager.class)
.getDisplay(DEFAULT_DISPLAY);
- mWindowContext = mContext.createWindowContext(display, TYPE_APPLICATION, null);
+ mWindowContext = context.createWindowContext(display, TYPE_APPLICATION, null);
mWindowContext.registerComponentCallbacks(this);
// Initialize navigation mode change listener
- mReceiver.registerPkgActions(mContext, TARGET_OVERLAY_PACKAGE, ACTION_OVERLAY_CHANGED);
+ mReceiver = new SimpleBroadcastReceiver(context, MAIN_EXECUTOR, this::onIntent);
+ mReceiver.registerPkgActions(TARGET_OVERLAY_PACKAGE, ACTION_OVERLAY_CHANGED);
mInfo = new Info(mWindowContext, wmProxy,
wmProxy.estimateInternalDisplayBounds(mWindowContext));
@@ -169,7 +167,7 @@
lifecycle.addCloseable(() -> {
mDestroyed = true;
mWindowContext.unregisterComponentCallbacks(this);
- mReceiver.unregisterReceiverSafely(mContext);
+ mReceiver.unregisterReceiverSafely();
wmProxy.unregisterDesktopVisibilityListener(this);
});
}
@@ -229,8 +227,10 @@
}
@Override
- public void onDesktopVisibilityChanged(boolean visible) {
- notifyConfigChange();
+ public void onIsInDesktopModeChanged(int displayId, boolean isInDesktopModeAndNotInOverview) {
+ if (DEFAULT_DISPLAY == displayId) {
+ notifyConfigChange();
+ }
}
/**
@@ -448,7 +448,7 @@
mIsTaskbarPinned = LauncherPrefs.get(displayInfoContext).get(TASKBAR_PINNING);
mIsTaskbarPinnedInDesktopMode = LauncherPrefs.get(displayInfoContext).get(
TASKBAR_PINNING_IN_DESKTOP_MODE);
- mIsInDesktopMode = wmProxy.isInDesktopMode();
+ mIsInDesktopMode = wmProxy.isInDesktopMode(DEFAULT_DISPLAY);
mShowLockedTaskbarOnHome = wmProxy.showLockedTaskbarOnHome(displayInfoContext);
mShowDesktopTaskbarForFreeformDisplay = wmProxy.showDesktopTaskbarForFreeformDisplay(
displayInfoContext);
diff --git a/src/com/android/launcher3/util/LockedUserState.kt b/src/com/android/launcher3/util/LockedUserState.kt
index a6a6ceb..742a327 100644
--- a/src/com/android/launcher3/util/LockedUserState.kt
+++ b/src/com/android/launcher3/util/LockedUserState.kt
@@ -44,7 +44,7 @@
@VisibleForTesting
val userUnlockedReceiver =
- SimpleBroadcastReceiver(UI_HELPER_EXECUTOR) {
+ SimpleBroadcastReceiver(context, UI_HELPER_EXECUTOR) {
if (Intent.ACTION_USER_UNLOCKED == it.action) {
isUserUnlocked = true
}
@@ -61,7 +61,6 @@
isUserUnlockedAtLauncherStartup = isUserUnlocked
if (!isUserUnlocked) {
userUnlockedReceiver.register(
- context,
{
// If user is unlocked while registering broadcast receiver, we should update
// [isUserUnlocked], which will call [notifyUserUnlocked] in setter
@@ -72,7 +71,7 @@
Intent.ACTION_USER_UNLOCKED,
)
}
- lifeCycle.addCloseable { userUnlockedReceiver.unregisterReceiverSafely(context) }
+ lifeCycle.addCloseable { userUnlockedReceiver.unregisterReceiverSafely() }
}
private fun checkIsUserUnlocked() =
@@ -80,7 +79,7 @@
private fun notifyUserUnlocked() {
mUserUnlockedActions.executeAllAndDestroy()
- userUnlockedReceiver.unregisterReceiverSafely(context)
+ userUnlockedReceiver.unregisterReceiverSafely()
}
/**
diff --git a/src/com/android/launcher3/util/ScreenOnTracker.java b/src/com/android/launcher3/util/ScreenOnTracker.java
index 50be98b..8ffe9ea 100644
--- a/src/com/android/launcher3/util/ScreenOnTracker.java
+++ b/src/com/android/launcher3/util/ScreenOnTracker.java
@@ -46,34 +46,31 @@
private final SimpleBroadcastReceiver mReceiver;
private final CopyOnWriteArrayList<ScreenOnListener> mListeners = new CopyOnWriteArrayList<>();
- private final Context mContext;
private boolean mIsScreenOn;
@Inject
ScreenOnTracker(@ApplicationContext Context context, DaggerSingletonTracker tracker) {
// Assume that the screen is on to begin with
- mContext = context;
- mReceiver = new SimpleBroadcastReceiver(UI_HELPER_EXECUTOR, this::onReceive);
+ mReceiver = new SimpleBroadcastReceiver(context, UI_HELPER_EXECUTOR, this::onReceive);
init(tracker);
}
@VisibleForTesting
ScreenOnTracker(@ApplicationContext Context context, SimpleBroadcastReceiver receiver,
DaggerSingletonTracker tracker) {
- mContext = context;
mReceiver = receiver;
init(tracker);
}
private void init(DaggerSingletonTracker tracker) {
mIsScreenOn = true;
- mReceiver.register(mContext, ACTION_SCREEN_ON, ACTION_SCREEN_OFF, ACTION_USER_PRESENT);
+ mReceiver.register(ACTION_SCREEN_ON, ACTION_SCREEN_OFF, ACTION_USER_PRESENT);
tracker.addCloseable(this);
}
@Override
public void close() {
- mReceiver.unregisterReceiverSafely(mContext);
+ mReceiver.unregisterReceiverSafely();
}
@VisibleForTesting
diff --git a/src/com/android/launcher3/util/SimpleBroadcastReceiver.java b/src/com/android/launcher3/util/SimpleBroadcastReceiver.java
index 539a7cb..7a40abe 100644
--- a/src/com/android/launcher3/util/SimpleBroadcastReceiver.java
+++ b/src/com/android/launcher3/util/SimpleBroadcastReceiver.java
@@ -25,22 +25,29 @@
import android.text.TextUtils;
import androidx.annotation.AnyThread;
+import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.util.function.Consumer;
public class SimpleBroadcastReceiver extends BroadcastReceiver {
+ public static final String TAG = "SimpleBroadcastReceiver";
+ // Keeps a strong reference to the context.
+ private final Context mContext;
private final Consumer<Intent> mIntentConsumer;
// Handler to register/unregister broadcast receiver
private final Handler mHandler;
- public SimpleBroadcastReceiver(LooperExecutor looperExecutor, Consumer<Intent> intentConsumer) {
- this(looperExecutor.getHandler(), intentConsumer);
+ public SimpleBroadcastReceiver(@NonNull Context context, LooperExecutor looperExecutor,
+ Consumer<Intent> intentConsumer) {
+ this(context, looperExecutor.getHandler(), intentConsumer);
}
- public SimpleBroadcastReceiver(Handler handler, Consumer<Intent> intentConsumer) {
+ public SimpleBroadcastReceiver(@NonNull Context context, Handler handler,
+ Consumer<Intent> intentConsumer) {
+ mContext = context;
mIntentConsumer = intentConsumer;
mHandler = handler;
}
@@ -50,18 +57,18 @@
mIntentConsumer.accept(intent);
}
- /** Calls {@link #register(Context, Runnable, String...)} with null completionCallback. */
+ /** Calls {@link #register(Runnable, String...)} with null completionCallback. */
@AnyThread
- public void register(Context context, String... actions) {
- register(context, null, actions);
+ public void register(String... actions) {
+ register(null, actions);
}
/**
- * Calls {@link #register(Context, Runnable, int, String...)} with null completionCallback.
+ * Calls {@link #register(Runnable, int, String...)} with null completionCallback.
*/
@AnyThread
- public void register(Context context, int flags, String... actions) {
- register(context, null, flags, actions);
+ public void register(int flags, String... actions) {
+ register(null, flags, actions);
}
/**
@@ -74,19 +81,18 @@
* while registerReceiver() is executed on a binder call.
*/
@AnyThread
- public void register(
- Context context, @Nullable Runnable completionCallback, String... actions) {
+ public void register(@Nullable Runnable completionCallback, String... actions) {
if (Looper.myLooper() == mHandler.getLooper()) {
- registerInternal(context, completionCallback, actions);
+ registerInternal(mContext, completionCallback, actions);
} else {
- mHandler.post(() -> registerInternal(context, completionCallback, actions));
+ mHandler.post(() -> registerInternal(mContext, completionCallback, actions));
}
}
/** Register broadcast receiver and run completion callback if passed. */
@AnyThread
private void registerInternal(
- Context context, @Nullable Runnable completionCallback, String... actions) {
+ @NonNull Context context, @Nullable Runnable completionCallback, String... actions) {
context.registerReceiver(this, getFilter(actions));
if (completionCallback != null) {
completionCallback.run();
@@ -94,37 +100,37 @@
}
/**
- * Same as {@link #register(Context, Runnable, String...)} above but with additional flags
- * params.
+ * Same as {@link #register(Runnable, String...)} above but with additional flags
+ * params utilizine the original {@link Context}.
*/
@AnyThread
- public void register(
- Context context, @Nullable Runnable completionCallback, int flags, String... actions) {
+ public void register(@Nullable Runnable completionCallback, int flags, String... actions) {
if (Looper.myLooper() == mHandler.getLooper()) {
- registerInternal(context, completionCallback, flags, actions);
+ registerInternal(mContext, completionCallback, flags, actions);
} else {
- mHandler.post(() -> registerInternal(context, completionCallback, flags, actions));
+ mHandler.post(() -> registerInternal(mContext, completionCallback, flags, actions));
}
}
/** Register broadcast receiver and run completion callback if passed. */
@AnyThread
private void registerInternal(
- Context context, @Nullable Runnable completionCallback, int flags, String... actions) {
+ @NonNull Context context, @Nullable Runnable completionCallback, int flags,
+ String... actions) {
context.registerReceiver(this, getFilter(actions), flags);
if (completionCallback != null) {
completionCallback.run();
}
}
- /** Same as {@link #register(Context, Runnable, String...)} above but with pkg name. */
+ /** Same as {@link #register(Runnable, String...)} above but with pkg name. */
@AnyThread
- public void registerPkgActions(Context context, @Nullable String pkg, String... actions) {
+ public void registerPkgActions(@Nullable String pkg, String... actions) {
if (Looper.myLooper() == mHandler.getLooper()) {
- context.registerReceiver(this, getPackageFilter(pkg, actions));
+ mContext.registerReceiver(this, getPackageFilter(pkg, actions));
} else {
mHandler.post(() -> {
- context.registerReceiver(this, getPackageFilter(pkg, actions));
+ mContext.registerReceiver(this, getPackageFilter(pkg, actions));
});
}
}
@@ -135,19 +141,19 @@
* unregister happens on {@link #mHandler}'s looper.
*/
@AnyThread
- public void unregisterReceiverSafely(Context context) {
+ public void unregisterReceiverSafely() {
if (Looper.myLooper() == mHandler.getLooper()) {
- unregisterReceiverSafelyInternal(context);
+ unregisterReceiverSafelyInternal(mContext);
} else {
mHandler.post(() -> {
- unregisterReceiverSafelyInternal(context);
+ unregisterReceiverSafelyInternal(mContext);
});
}
}
/** Unregister broadcast receiver ignoring any errors. */
@AnyThread
- private void unregisterReceiverSafelyInternal(Context context) {
+ private void unregisterReceiverSafelyInternal(@NonNull Context context) {
try {
context.unregisterReceiver(this);
} catch (IllegalArgumentException e) {
diff --git a/src/com/android/launcher3/util/WallpaperOffsetInterpolator.java b/src/com/android/launcher3/util/WallpaperOffsetInterpolator.java
index f8cbe0d..26a04a5 100644
--- a/src/com/android/launcher3/util/WallpaperOffsetInterpolator.java
+++ b/src/com/android/launcher3/util/WallpaperOffsetInterpolator.java
@@ -31,8 +31,7 @@
// Don't use all the wallpaper for parallax until you have at least this many pages
private static final int MIN_PARALLAX_PAGE_SPAN = 4;
- private final SimpleBroadcastReceiver mWallpaperChangeReceiver =
- new SimpleBroadcastReceiver(UI_HELPER_EXECUTOR, i -> onWallpaperChanged());
+ private final SimpleBroadcastReceiver mWallpaperChangeReceiver;
private final Workspace<?> mWorkspace;
private final boolean mIsRtl;
private final Handler mHandler;
@@ -46,6 +45,8 @@
public WallpaperOffsetInterpolator(Workspace<?> workspace) {
mWorkspace = workspace;
+ mWallpaperChangeReceiver = new SimpleBroadcastReceiver(
+ workspace.getContext(), UI_HELPER_EXECUTOR, i -> onWallpaperChanged());
mIsRtl = Utilities.isRtl(workspace.getResources());
mHandler = new OffsetHandler(workspace.getContext());
}
@@ -198,11 +199,10 @@
public void setWindowToken(IBinder token) {
mWindowToken = token;
if (mWindowToken == null && mRegistered) {
- mWallpaperChangeReceiver.unregisterReceiverSafely(mWorkspace.getContext());
+ mWallpaperChangeReceiver.unregisterReceiverSafely();
mRegistered = false;
} else if (mWindowToken != null && !mRegistered) {
- mWallpaperChangeReceiver.register(
- mWorkspace.getContext(), ACTION_WALLPAPER_CHANGED);
+ mWallpaperChangeReceiver.register(ACTION_WALLPAPER_CHANGED);
onWallpaperChanged();
mRegistered = true;
}
diff --git a/src/com/android/launcher3/util/window/WindowManagerProxy.java b/src/com/android/launcher3/util/window/WindowManagerProxy.java
index f511ef2..647d170 100644
--- a/src/com/android/launcher3/util/window/WindowManagerProxy.java
+++ b/src/com/android/launcher3/util/window/WindowManagerProxy.java
@@ -109,7 +109,7 @@
/**
* Returns if we are in desktop mode or not.
*/
- public boolean isInDesktopMode() {
+ public boolean isInDesktopMode(int displayId) {
return false;
}
@@ -503,11 +503,13 @@
/** A listener for when the user enters/exits Desktop Mode. */
public interface DesktopVisibilityListener {
/**
- * Callback for when the user enters or exits Desktop Mode
+ * Called when the desktop mode state on the display whose ID is `displayId` changes.
*
- * @param visible whether Desktop Mode is now visible
+ * @param displayId The ID of the display for which this notification is triggering.
+ * @param isInDesktopModeAndNotInOverview True if a desktop is currently active on the given
+ * display, and Overview is currently inactive.
*/
- void onDesktopVisibilityChanged(boolean visible);
+ void onIsInDesktopModeChanged(int displayId, boolean isInDesktopModeAndNotInOverview);
}
}
diff --git a/src/com/android/launcher3/views/DoubleShadowBubbleTextView.java b/src/com/android/launcher3/views/DoubleShadowBubbleTextView.java
index 392d9a7..05bc4d8 100644
--- a/src/com/android/launcher3/views/DoubleShadowBubbleTextView.java
+++ b/src/com/android/launcher3/views/DoubleShadowBubbleTextView.java
@@ -25,6 +25,7 @@
import android.os.Build;
import android.text.Spannable;
import android.text.SpannableString;
+import android.text.TextUtils;
import android.text.style.ImageSpan;
import android.util.AttributeSet;
import android.util.Log;
@@ -102,7 +103,7 @@
@Override
public void onDraw(Canvas canvas) {
- if (shouldDrawAppContrastTile()) {
+ if (shouldDrawAppContrastTile() && !TextUtils.isEmpty(getText())) {
drawAppContrastTile(canvas);
}
// If text is transparent or shadow alpha is 0, don't draw any shadow
diff --git a/tests/multivalentTests/src/com/android/launcher3/AbstractDeviceProfileTest.kt b/tests/multivalentTests/src/com/android/launcher3/AbstractDeviceProfileTest.kt
index 9c64ec9..9d42e1b 100644
--- a/tests/multivalentTests/src/com/android/launcher3/AbstractDeviceProfileTest.kt
+++ b/tests/multivalentTests/src/com/android/launcher3/AbstractDeviceProfileTest.kt
@@ -28,11 +28,13 @@
import android.view.Surface
import androidx.test.core.app.ApplicationProvider.getApplicationContext
import androidx.test.platform.app.InstrumentationRegistry
+import com.android.launcher3.LauncherPrefs.Companion.GRID_NAME
import com.android.launcher3.dagger.LauncherAppComponent
import com.android.launcher3.dagger.LauncherAppSingleton
import com.android.launcher3.testing.shared.ResourceUtils
import com.android.launcher3.util.AllModulesMinusWMProxy
import com.android.launcher3.util.DisplayController
+import com.android.launcher3.util.FakePrefsModule
import com.android.launcher3.util.MainThreadInitializedObject.SandboxContext
import com.android.launcher3.util.NavigationMode
import com.android.launcher3.util.WindowBounds
@@ -70,7 +72,7 @@
protected open val runningContext: Context = getApplicationContext()
private val displayController: DisplayController = mock()
private val windowManagerProxy: WindowManagerProxy = mock()
- private val launcherPrefs: LauncherPrefs = mock()
+ private lateinit var launcherPrefs: LauncherPrefs
@get:Rule val setFlagsRule = SetFlagsRule(SetFlagsRule.DefaultInitValueType.DEVICE_DEFAULT)
@@ -132,6 +134,7 @@
isGestureMode: Boolean = true,
isVerticalBar: Boolean = false,
isFixedLandscape: Boolean = false,
+ gridName: String? = GRID_NAME.defaultValue,
) {
val (naturalX, naturalY) = deviceSpec.naturalSize
val windowsBounds = phoneWindowsBounds(deviceSpec, isGestureMode, naturalX, naturalY)
@@ -145,6 +148,7 @@
isGestureMode,
densityDpi = deviceSpec.densityDpi,
isFixedLandscape = isFixedLandscape,
+ gridName = gridName,
)
}
@@ -152,6 +156,7 @@
deviceSpec: DeviceSpec,
isLandscape: Boolean = false,
isGestureMode: Boolean = true,
+ gridName: String? = GRID_NAME.defaultValue,
) {
val (naturalX, naturalY) = deviceSpec.naturalSize
val windowsBounds = tabletWindowsBounds(deviceSpec, naturalX, naturalY)
@@ -164,6 +169,7 @@
rotation = if (isLandscape) Surface.ROTATION_0 else Surface.ROTATION_90,
isGestureMode,
densityDpi = deviceSpec.densityDpi,
+ gridName = gridName,
)
}
@@ -173,6 +179,7 @@
isLandscape: Boolean = false,
isGestureMode: Boolean = true,
isFolded: Boolean = false,
+ gridName: String? = GRID_NAME.defaultValue,
) {
val (unfoldedNaturalX, unfoldedNaturalY) = deviceSpecUnfolded.naturalSize
val unfoldedWindowsBounds =
@@ -199,6 +206,7 @@
rotation = if (isLandscape) Surface.ROTATION_90 else Surface.ROTATION_0,
isGestureMode = isGestureMode,
densityDpi = deviceSpecFolded.densityDpi,
+ gridName = gridName,
)
} else {
initializeCommonVars(
@@ -207,6 +215,7 @@
rotation = if (isLandscape) Surface.ROTATION_0 else Surface.ROTATION_90,
isGestureMode = isGestureMode,
densityDpi = deviceSpecUnfolded.densityDpi,
+ gridName = gridName,
)
}
}
@@ -282,6 +291,7 @@
isGestureMode: Boolean = true,
densityDpi: Int,
isFixedLandscape: Boolean = false,
+ gridName: String? = GRID_NAME.defaultValue,
) {
setFlagsRule.setFlags(true, Flags.FLAG_ENABLE_TWOLINE_TOGGLE)
val windowsBounds = perDisplayBoundsCache[displayInfo]!!
@@ -311,18 +321,23 @@
context.initDaggerComponent(
DaggerAbsDPTestSandboxComponent.builder()
.bindWMProxy(windowManagerProxy)
- .bindLauncherPrefs(launcherPrefs)
.bindDisplayController(displayController)
)
+ launcherPrefs = context.appComponent.launcherPrefs
+ launcherPrefs.put(
+ LauncherPrefs.TASKBAR_PINNING.to(false),
+ LauncherPrefs.TASKBAR_PINNING_IN_DESKTOP_MODE.to(true),
+ LauncherPrefs.FIXED_LANDSCAPE_MODE.to(isFixedLandscape),
+ LauncherPrefs.HOTSEAT_COUNT.to(-1),
+ LauncherPrefs.DEVICE_TYPE.to(-1),
+ LauncherPrefs.WORKSPACE_SIZE.to(""),
+ LauncherPrefs.DB_FILE.to(""),
+ LauncherPrefs.ENABLE_TWOLINE_ALLAPPS_TOGGLE.to(true),
+ )
+ if (gridName != null) {
+ launcherPrefs.put(GRID_NAME, gridName)
+ }
- whenever(launcherPrefs.get(LauncherPrefs.TASKBAR_PINNING)).thenReturn(false)
- whenever(launcherPrefs.get(LauncherPrefs.TASKBAR_PINNING_IN_DESKTOP_MODE)).thenReturn(true)
- whenever(launcherPrefs.get(LauncherPrefs.FIXED_LANDSCAPE_MODE)).thenReturn(isFixedLandscape)
- whenever(launcherPrefs.get(LauncherPrefs.HOTSEAT_COUNT)).thenReturn(-1)
- whenever(launcherPrefs.get(LauncherPrefs.DEVICE_TYPE)).thenReturn(-1)
- whenever(launcherPrefs.get(LauncherPrefs.WORKSPACE_SIZE)).thenReturn("")
- whenever(launcherPrefs.get(LauncherPrefs.DB_FILE)).thenReturn("")
- whenever(launcherPrefs.get(LauncherPrefs.ENABLE_TWOLINE_ALLAPPS_TOGGLE)).thenReturn(true)
val info = spy(DisplayController.Info(context, windowManagerProxy, perDisplayBoundsCache))
whenever(displayController.info).thenReturn(info)
whenever(info.isTransientTaskbar).thenReturn(isGestureMode)
@@ -365,15 +380,13 @@
}
@LauncherAppSingleton
-@Component(modules = [AllModulesMinusWMProxy::class])
+@Component(modules = [AllModulesMinusWMProxy::class, FakePrefsModule::class])
interface AbsDPTestSandboxComponent : LauncherAppComponent {
@Component.Builder
interface Builder : LauncherAppComponent.Builder {
@BindsInstance fun bindWMProxy(proxy: WindowManagerProxy): Builder
- @BindsInstance fun bindLauncherPrefs(prefs: LauncherPrefs): Builder
-
@BindsInstance fun bindDisplayController(displayController: DisplayController): Builder
override fun build(): AbsDPTestSandboxComponent
diff --git a/tests/multivalentTests/src/com/android/launcher3/FakeInvariantDeviceProfileTest.kt b/tests/multivalentTests/src/com/android/launcher3/FakeInvariantDeviceProfileTest.kt
index bfbdb18..060c28c 100644
--- a/tests/multivalentTests/src/com/android/launcher3/FakeInvariantDeviceProfileTest.kt
+++ b/tests/multivalentTests/src/com/android/launcher3/FakeInvariantDeviceProfileTest.kt
@@ -15,7 +15,6 @@
*/
package com.android.launcher3
-import android.content.Context
import android.graphics.PointF
import android.graphics.Rect
import android.platform.test.rule.AllowedDevices
@@ -23,10 +22,11 @@
import android.platform.test.rule.IgnoreLimit
import android.platform.test.rule.LimitDevicesRule
import android.util.SparseArray
-import androidx.test.core.app.ApplicationProvider
import com.android.launcher3.DeviceProfile.DEFAULT_DIMENSION_PROVIDER
import com.android.launcher3.DeviceProfile.DEFAULT_PROVIDER
+import com.android.launcher3.testing.shared.ResourceUtils.INVALID_RESOURCE_HANDLE
import com.android.launcher3.util.DisplayController.Info
+import com.android.launcher3.util.SandboxApplication
import com.android.launcher3.util.WindowBounds
import java.io.PrintWriter
import java.io.StringWriter
@@ -46,7 +46,8 @@
@IgnoreLimit(ignoreLimit = BuildConfig.IS_STUDIO_BUILD)
abstract class FakeInvariantDeviceProfileTest {
- protected lateinit var context: Context
+ @get:Rule val context = SandboxApplication()
+
protected lateinit var inv: InvariantDeviceProfile
protected val info = mock<Info>()
protected lateinit var windowBounds: WindowBounds
@@ -59,7 +60,6 @@
@Before
open fun setUp() {
- context = ApplicationProvider.getApplicationContext()
// make sure to reset values
useTwoPanels = false
isGestureMode = true
@@ -70,6 +70,8 @@
context,
inv,
info,
+ context.appComponent.wmProxy,
+ context.appComponent.iconShape,
windowBounds,
SparseArray(),
/*isMultiWindowMode=*/ false,
@@ -107,7 +109,7 @@
transposeLayoutWithOrientation = true
inv =
- InvariantDeviceProfile().apply {
+ context.appComponent.idp.apply {
numRows = 5
numColumns = 4
numSearchContainerColumns = 4
@@ -169,6 +171,14 @@
inlineQsb = BooleanArray(4) { false }
devicePaddingId = R.xml.paddings_handhelds
+
+ isFixedLandscape = false
+ workspaceSpecsId = INVALID_RESOURCE_HANDLE
+ allAppsSpecsId = INVALID_RESOURCE_HANDLE
+ folderSpecsId = INVALID_RESOURCE_HANDLE
+ hotseatSpecsId = INVALID_RESOURCE_HANDLE
+ workspaceCellSpecsId = INVALID_RESOURCE_HANDLE
+ allAppsCellSpecsId = INVALID_RESOURCE_HANDLE
}
}
@@ -189,7 +199,7 @@
useTwoPanels = false
inv =
- InvariantDeviceProfile().apply {
+ context.appComponent.idp.apply {
numRows = 5
numColumns = 6
numSearchContainerColumns = 3
@@ -252,6 +262,14 @@
inlineQsb = booleanArrayOf(false, true, false, false)
devicePaddingId = R.xml.paddings_handhelds
+
+ isFixedLandscape = false
+ workspaceSpecsId = INVALID_RESOURCE_HANDLE
+ allAppsSpecsId = INVALID_RESOURCE_HANDLE
+ folderSpecsId = INVALID_RESOURCE_HANDLE
+ hotseatSpecsId = INVALID_RESOURCE_HANDLE
+ workspaceCellSpecsId = INVALID_RESOURCE_HANDLE
+ allAppsCellSpecsId = INVALID_RESOURCE_HANDLE
}
}
@@ -274,7 +292,7 @@
useTwoPanels = true
inv =
- InvariantDeviceProfile().apply {
+ context.appComponent.idp.apply {
numRows = rows
numColumns = cols
numSearchContainerColumns = cols
@@ -332,6 +350,14 @@
inlineQsb = booleanArrayOf(false, false, false, false)
devicePaddingId = R.xml.paddings_handhelds
+
+ isFixedLandscape = false
+ workspaceSpecsId = INVALID_RESOURCE_HANDLE
+ allAppsSpecsId = INVALID_RESOURCE_HANDLE
+ folderSpecsId = INVALID_RESOURCE_HANDLE
+ hotseatSpecsId = INVALID_RESOURCE_HANDLE
+ workspaceCellSpecsId = INVALID_RESOURCE_HANDLE
+ allAppsCellSpecsId = INVALID_RESOURCE_HANDLE
}
}
diff --git a/tests/multivalentTests/src/com/android/launcher3/FakeLauncherPrefs.kt b/tests/multivalentTests/src/com/android/launcher3/FakeLauncherPrefs.kt
index 5e1e548..4d01d4d 100644
--- a/tests/multivalentTests/src/com/android/launcher3/FakeLauncherPrefs.kt
+++ b/tests/multivalentTests/src/com/android/launcher3/FakeLauncherPrefs.kt
@@ -21,19 +21,24 @@
import android.content.SharedPreferences
import com.android.launcher3.dagger.ApplicationContext
import com.android.launcher3.dagger.LauncherAppSingleton
-import java.io.File
+import com.android.launcher3.util.DaggerSingletonTracker
+import java.util.UUID
import javax.inject.Inject
/** Emulates Launcher preferences for a test environment. */
@LauncherAppSingleton
-class FakeLauncherPrefs @Inject constructor(@ApplicationContext context: Context) :
+class FakeLauncherPrefs
+@Inject
+constructor(@ApplicationContext context: Context, lifeCycle: DaggerSingletonTracker) :
LauncherPrefs(context) {
- private val backingPrefs =
- context.getSharedPreferences(
- File.createTempFile("fake-pref", ".xml", context.filesDir),
- MODE_PRIVATE,
- )
+ private val prefName = "fake-pref-" + UUID.randomUUID().toString()
+
+ private val backingPrefs = context.getSharedPreferences(prefName, MODE_PRIVATE)
+
+ init {
+ lifeCycle.addCloseable { context.deleteSharedPreferences(prefName) }
+ }
override fun getSharedPrefs(item: Item): SharedPreferences = backingPrefs
}
diff --git a/tests/multivalentTests/src/com/android/launcher3/FakeLauncherPrefsTest.kt b/tests/multivalentTests/src/com/android/launcher3/FakeLauncherPrefsTest.kt
index c57c86f..0941c79 100644
--- a/tests/multivalentTests/src/com/android/launcher3/FakeLauncherPrefsTest.kt
+++ b/tests/multivalentTests/src/com/android/launcher3/FakeLauncherPrefsTest.kt
@@ -18,10 +18,14 @@
import androidx.test.core.app.ApplicationProvider.getApplicationContext
import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation
+import com.android.launcher3.util.DaggerSingletonTracker
import com.android.launcher3.util.LauncherMultivalentJUnit
import com.google.common.truth.Truth.assertThat
+import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
+import org.mockito.Mock
+import org.mockito.MockitoAnnotations
private val TEST_CONSTANT_ITEM = LauncherPrefs.nonRestorableItem("TEST_BOOLEAN_ITEM", false)
@@ -36,7 +40,15 @@
@RunWith(LauncherMultivalentJUnit::class)
class FakeLauncherPrefsTest {
- private val launcherPrefs = FakeLauncherPrefs(getApplicationContext())
+
+ @Mock lateinit var lifeCycle: DaggerSingletonTracker
+ private lateinit var launcherPrefs: FakeLauncherPrefs
+
+ @Before
+ fun setup() {
+ MockitoAnnotations.initMocks(this)
+ launcherPrefs = FakeLauncherPrefs(getApplicationContext(), lifeCycle)
+ }
@Test
fun testGet_constantItemNotInPrefs_returnsDefaultValue() {
diff --git a/tests/multivalentTests/src/com/android/launcher3/util/DisplayControllerTest.kt b/tests/multivalentTests/src/com/android/launcher3/util/DisplayControllerTest.kt
index 588a668..aa1451b 100644
--- a/tests/multivalentTests/src/com/android/launcher3/util/DisplayControllerTest.kt
+++ b/tests/multivalentTests/src/com/android/launcher3/util/DisplayControllerTest.kt
@@ -203,7 +203,7 @@
fun testTaskbarPinningChangeInLockedTaskbarChange() {
whenever(windowManagerProxy.showLockedTaskbarOnHome(any())).thenReturn(true)
whenever(windowManagerProxy.isHomeVisible(any())).thenReturn(true)
- whenever(windowManagerProxy.isInDesktopMode()).thenReturn(false)
+ whenever(windowManagerProxy.isInDesktopMode(any())).thenReturn(false)
whenever(launcherPrefs.get(TASKBAR_PINNING)).thenReturn(false)
DisplayController.enableTaskbarModePreferenceForTests(true)
@@ -219,7 +219,7 @@
fun testLockedTaskbarChangeOnConfigurationChanged() {
whenever(windowManagerProxy.showLockedTaskbarOnHome(any())).thenReturn(true)
whenever(windowManagerProxy.isHomeVisible(any())).thenReturn(true)
- whenever(windowManagerProxy.isInDesktopMode()).thenReturn(false)
+ whenever(windowManagerProxy.isInDesktopMode(any())).thenReturn(false)
whenever(launcherPrefs.get(TASKBAR_PINNING)).thenReturn(false)
DisplayController.enableTaskbarModePreferenceForTests(true)
assertTrue(displayController.getInfo().isTransientTaskbar())
@@ -237,7 +237,7 @@
whenever(windowManagerProxy.showDesktopTaskbarForFreeformDisplay(any())).thenReturn(true)
whenever(launcherPrefs.get(TASKBAR_PINNING)).thenReturn(false)
whenever(launcherPrefs.get(TASKBAR_PINNING_IN_DESKTOP_MODE)).thenReturn(false)
- whenever(windowManagerProxy.isInDesktopMode()).thenReturn(true)
+ whenever(windowManagerProxy.isInDesktopMode(any())).thenReturn(true)
whenever(windowManagerProxy.isHomeVisible(any())).thenReturn(false)
DisplayController.enableTaskbarModePreferenceForTests(true)
@@ -256,7 +256,7 @@
whenever(windowManagerProxy.showDesktopTaskbarForFreeformDisplay(any())).thenReturn(true)
whenever(launcherPrefs.get(TASKBAR_PINNING)).thenReturn(false)
whenever(launcherPrefs.get(TASKBAR_PINNING_IN_DESKTOP_MODE)).thenReturn(false)
- whenever(windowManagerProxy.isInDesktopMode()).thenReturn(false)
+ whenever(windowManagerProxy.isInDesktopMode(any())).thenReturn(false)
whenever(windowManagerProxy.isHomeVisible(any())).thenReturn(false)
DisplayController.enableTaskbarModePreferenceForTests(true)
@@ -275,7 +275,7 @@
whenever(windowManagerProxy.showDesktopTaskbarForFreeformDisplay(any())).thenReturn(true)
whenever(launcherPrefs.get(TASKBAR_PINNING)).thenReturn(false)
whenever(launcherPrefs.get(TASKBAR_PINNING_IN_DESKTOP_MODE)).thenReturn(false)
- whenever(windowManagerProxy.isInDesktopMode()).thenReturn(false)
+ whenever(windowManagerProxy.isInDesktopMode(any())).thenReturn(false)
whenever(windowManagerProxy.isHomeVisible(any())).thenReturn(true)
DisplayController.enableTaskbarModePreferenceForTests(true)
diff --git a/tests/multivalentTests/src/com/android/launcher3/util/ScreenOnTrackerTest.kt b/tests/multivalentTests/src/com/android/launcher3/util/ScreenOnTrackerTest.kt
index 45cc19c..9c3f223 100644
--- a/tests/multivalentTests/src/com/android/launcher3/util/ScreenOnTrackerTest.kt
+++ b/tests/multivalentTests/src/com/android/launcher3/util/ScreenOnTrackerTest.kt
@@ -51,7 +51,7 @@
@Test
fun test_default_state() {
- verify(receiver).register(context, ACTION_SCREEN_ON, ACTION_SCREEN_OFF, ACTION_USER_PRESENT)
+ verify(receiver).register(ACTION_SCREEN_ON, ACTION_SCREEN_OFF, ACTION_USER_PRESENT)
assertThat(underTest.isScreenOn).isTrue()
}
@@ -59,7 +59,7 @@
fun close_unregister_receiver() {
underTest.close()
- verify(receiver).unregisterReceiverSafely(context)
+ verify(receiver).unregisterReceiverSafely()
}
@Test
diff --git a/tests/multivalentTests/src/com/android/launcher3/util/SimpleBroadcastReceiverTest.kt b/tests/multivalentTests/src/com/android/launcher3/util/SimpleBroadcastReceiverTest.kt
index d3e27b6..17933f2 100644
--- a/tests/multivalentTests/src/com/android/launcher3/util/SimpleBroadcastReceiverTest.kt
+++ b/tests/multivalentTests/src/com/android/launcher3/util/SimpleBroadcastReceiverTest.kt
@@ -52,7 +52,7 @@
@Before
fun setUp() {
MockitoAnnotations.initMocks(this)
- underTest = SimpleBroadcastReceiver(UI_HELPER_EXECUTOR, intentConsumer)
+ underTest = SimpleBroadcastReceiver(context, UI_HELPER_EXECUTOR, intentConsumer)
if (Looper.getMainLooper() == null) {
Looper.prepareMainLooper()
}
@@ -60,7 +60,7 @@
@Test
fun async_register() {
- underTest.register(context, "test_action_1", "test_action_2")
+ underTest.register("test_action_1", "test_action_2")
awaitTasksCompleted()
verify(context).registerReceiver(same(underTest), intentFilterCaptor.capture())
@@ -72,7 +72,7 @@
@Test
fun async_register_withCompletionRunnable() {
- underTest.register(context, completionRunnable, "test_action_1", "test_action_2")
+ underTest.register(completionRunnable, "test_action_1", "test_action_2")
awaitTasksCompleted()
verify(context).registerReceiver(same(underTest), intentFilterCaptor.capture())
@@ -85,7 +85,7 @@
@Test
fun async_register_withCompletionRunnable_and_flag() {
- underTest.register(context, completionRunnable, 1, "test_action_1", "test_action_2")
+ underTest.register(completionRunnable, 1, "test_action_1", "test_action_2")
awaitTasksCompleted()
verify(context).registerReceiver(same(underTest), intentFilterCaptor.capture(), eq(1))
@@ -98,7 +98,7 @@
@Test
fun async_register_with_package() {
- underTest.registerPkgActions(context, "pkg", "test_action_1", "test_action_2")
+ underTest.registerPkgActions("pkg", "test_action_1", "test_action_2")
awaitTasksCompleted()
verify(context).registerReceiver(same(underTest), intentFilterCaptor.capture())
@@ -112,9 +112,10 @@
@Test
fun sync_register_withCompletionRunnable_and_flag() {
- underTest = SimpleBroadcastReceiver(Handler(Looper.getMainLooper()), intentConsumer)
+ underTest =
+ SimpleBroadcastReceiver(context, Handler(Looper.getMainLooper()), intentConsumer)
- underTest.register(context, completionRunnable, 1, "test_action_1", "test_action_2")
+ underTest.register(completionRunnable, 1, "test_action_1", "test_action_2")
getInstrumentation().waitForIdleSync()
verify(context).registerReceiver(same(underTest), intentFilterCaptor.capture(), eq(1))
@@ -127,7 +128,7 @@
@Test
fun async_unregister() {
- underTest.unregisterReceiverSafely(context)
+ underTest.unregisterReceiverSafely()
awaitTasksCompleted()
verify(context).unregisterReceiver(same(underTest))
@@ -135,9 +136,10 @@
@Test
fun sync_unregister() {
- underTest = SimpleBroadcastReceiver(Handler(Looper.getMainLooper()), intentConsumer)
+ underTest =
+ SimpleBroadcastReceiver(context, Handler(Looper.getMainLooper()), intentConsumer)
- underTest.unregisterReceiverSafely(context)
+ underTest.unregisterReceiverSafely()
getInstrumentation().waitForIdleSync()
verify(context).unregisterReceiver(same(underTest))
diff --git a/tests/multivalentTests/src/com/android/launcher3/widget/GeneratedPreviewTest.kt b/tests/multivalentTests/src/com/android/launcher3/widget/GeneratedPreviewTest.kt
index b92582c..6af0950 100644
--- a/tests/multivalentTests/src/com/android/launcher3/widget/GeneratedPreviewTest.kt
+++ b/tests/multivalentTests/src/com/android/launcher3/widget/GeneratedPreviewTest.kt
@@ -17,7 +17,6 @@
import androidx.test.filters.SmallTest
import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation
import com.android.launcher3.Flags.FLAG_ENABLE_GENERATED_PREVIEWS
-import com.android.launcher3.InvariantDeviceProfile
import com.android.launcher3.R
import com.android.launcher3.icons.IconCache
import com.android.launcher3.model.WidgetItem
@@ -100,7 +99,7 @@
private fun createWidgetItem() {
Executors.MODEL_EXECUTOR.submit {
- val idp = InvariantDeviceProfile()
+ val idp = context.appComponent.idp
widgetItem = WidgetItem(appWidgetProviderInfo, idp, iconCache, context)
}
.get()
diff --git a/tests/multivalentTests/src/com/android/launcher3/widget/LauncherAppWidgetProviderInfoTest.java b/tests/multivalentTests/src/com/android/launcher3/widget/LauncherAppWidgetProviderInfoTest.java
index 48cf3df..b3fd0f7 100644
--- a/tests/multivalentTests/src/com/android/launcher3/widget/LauncherAppWidgetProviderInfoTest.java
+++ b/tests/multivalentTests/src/com/android/launcher3/widget/LauncherAppWidgetProviderInfoTest.java
@@ -15,15 +15,12 @@
*/
package com.android.launcher3.widget;
-import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
-
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doAnswer;
import android.appwidget.AppWidgetHostView;
-import android.content.Context;
import android.graphics.Point;
import android.graphics.Rect;
@@ -32,16 +29,14 @@
import com.android.launcher3.DeviceProfile;
import com.android.launcher3.InvariantDeviceProfile;
-import com.android.launcher3.LauncherAppState;
+import com.android.launcher3.util.SandboxApplication;
-import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
-import java.util.ArrayList;
import java.util.Collections;
-import java.util.List;
@SmallTest
@RunWith(AndroidJUnit4.class)
@@ -52,12 +47,7 @@
private static final int NUM_OF_COLS = 4;
private static final int NUM_OF_ROWS = 5;
- private Context mContext;
-
- @Before
- public void setUp() {
- mContext = getApplicationContext();
- }
+ @Rule public SandboxApplication mContext = new SandboxApplication();
@Test
public void initSpans_minWidthSmallerThanCellWidth_shouldInitializeSpansToOne() {
@@ -256,8 +246,9 @@
}
private InvariantDeviceProfile createIDP() {
- DeviceProfile dp = LauncherAppState.getIDP(mContext)
- .getDeviceProfile(mContext).copy(mContext);
+ InvariantDeviceProfile idp = InvariantDeviceProfile.INSTANCE.get(mContext);
+
+ DeviceProfile dp = idp.getDeviceProfile(mContext).copy(mContext);
DeviceProfile profile = Mockito.spy(dp);
doAnswer(i -> {
((Point) i.getArgument(0)).set(CELL_SIZE, CELL_SIZE);
@@ -267,10 +258,7 @@
profile.cellLayoutBorderSpacePx = new Point(SPACE_SIZE, SPACE_SIZE);
profile.widgetPadding.setEmpty();
- InvariantDeviceProfile idp = new InvariantDeviceProfile();
- List<DeviceProfile> supportedProfiles = new ArrayList<>(idp.supportedProfiles);
- supportedProfiles.add(profile);
- idp.supportedProfiles = Collections.unmodifiableList(supportedProfiles);
+ idp.supportedProfiles = Collections.singletonList(profile);
idp.numColumns = NUM_OF_COLS;
idp.numRows = NUM_OF_ROWS;
return idp;
diff --git a/tests/multivalentTests/src/com/android/launcher3/widget/picker/WidgetRecommendationCategoryProviderTest.java b/tests/multivalentTests/src/com/android/launcher3/widget/picker/WidgetRecommendationCategoryProviderTest.java
index ac67d2b..2fbeaf1 100644
--- a/tests/multivalentTests/src/com/android/launcher3/widget/picker/WidgetRecommendationCategoryProviderTest.java
+++ b/tests/multivalentTests/src/com/android/launcher3/widget/picker/WidgetRecommendationCategoryProviderTest.java
@@ -25,8 +25,6 @@
import static android.content.pm.ApplicationInfo.CATEGORY_VIDEO;
import static android.content.pm.ApplicationInfo.FLAG_INSTALLED;
-import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
-
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
@@ -35,11 +33,9 @@
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.when;
import android.appwidget.AppWidgetProviderInfo;
import android.content.ComponentName;
-import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.LauncherApps;
import android.os.Process;
@@ -53,12 +49,14 @@
import com.android.launcher3.icons.IconCache;
import com.android.launcher3.model.WidgetItem;
import com.android.launcher3.util.Executors;
+import com.android.launcher3.util.SandboxApplication;
import com.android.launcher3.util.WidgetUtils;
import com.android.launcher3.widget.LauncherAppWidgetProviderInfo;
import com.google.common.collect.ImmutableMap;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -92,22 +90,22 @@
private final ApplicationInfo mTestAppInfo = ApplicationInfoBuilder.newBuilder().setPackageName(
TEST_PACKAGE).setName(TEST_APP_NAME).build();
- private Context mContext;
+
+ @Rule public SandboxApplication mContext = new SandboxApplication();
@Mock
private IconCache mIconCache;
private WidgetItem mTestWidgetItem;
- @Mock
+
private LauncherApps mLauncherApps;
private InvariantDeviceProfile mTestProfile;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
- mContext = spy(getInstrumentation().getTargetContext());
- doReturn(mLauncherApps).when(mContext).getSystemService(LauncherApps.class);
+ mLauncherApps = mContext.spyService(LauncherApps.class);
mTestAppInfo.flags = FLAG_INSTALLED;
- mTestProfile = new InvariantDeviceProfile();
+ mTestProfile = InvariantDeviceProfile.INSTANCE.get(mContext);
mTestProfile.numRows = 5;
mTestProfile.numColumns = 5;
createTestWidgetItem();
@@ -128,10 +126,10 @@
testCategories.entrySet()) {
mTestAppInfo.category = testCategory.getKey();
- when(mLauncherApps.getApplicationInfo(/*packageName=*/ eq(TEST_PACKAGE),
+ doReturn(mTestAppInfo).when(mLauncherApps).getApplicationInfo(
+ /*packageName=*/ eq(TEST_PACKAGE),
/*flags=*/ anyInt(),
- /*user=*/ eq(Process.myUserHandle())))
- .thenReturn(mTestAppInfo);
+ /*user=*/ eq(Process.myUserHandle()));
WidgetRecommendationCategory category = Executors.MODEL_EXECUTOR.submit(() ->
new WidgetRecommendationCategoryProvider().getWidgetRecommendationCategory(
diff --git a/tests/multivalentTests/src/com/android/launcher3/widget/picker/WidgetsListHeaderViewHolderBinderTest.java b/tests/multivalentTests/src/com/android/launcher3/widget/picker/WidgetsListHeaderViewHolderBinderTest.java
index c9b6d4f..767ab63 100644
--- a/tests/multivalentTests/src/com/android/launcher3/widget/picker/WidgetsListHeaderViewHolderBinderTest.java
+++ b/tests/multivalentTests/src/com/android/launcher3/widget/picker/WidgetsListHeaderViewHolderBinderTest.java
@@ -15,8 +15,6 @@
*/
package com.android.launcher3.widget.picker;
-import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
-
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
@@ -48,11 +46,13 @@
import com.android.launcher3.model.data.PackageItemInfo;
import com.android.launcher3.util.ActivityContextWrapper;
import com.android.launcher3.util.PackageUserKey;
+import com.android.launcher3.util.SandboxApplication;
import com.android.launcher3.util.WidgetUtils;
import com.android.launcher3.widget.LauncherAppWidgetProviderInfo;
import com.android.launcher3.widget.model.WidgetsListHeaderEntry;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -67,6 +67,7 @@
private static final String TEST_PACKAGE = "com.google.test";
private static final String APP_NAME = "Test app";
+ @Rule public SandboxApplication app = new SandboxApplication();
private Context mContext;
private WidgetsListHeaderViewHolderBinder mViewHolderBinder;
private InvariantDeviceProfile mTestProfile;
@@ -80,9 +81,9 @@
public void setUp() {
MockitoAnnotations.initMocks(this);
- mContext = new ActivityContextWrapper(new ContextThemeWrapper(getApplicationContext(),
- R.style.WidgetContainerTheme));
- mTestProfile = new InvariantDeviceProfile();
+ mContext = new ActivityContextWrapper(new ContextThemeWrapper(
+ app, R.style.WidgetContainerTheme));
+ mTestProfile = InvariantDeviceProfile.INSTANCE.get(app);
mTestProfile.numRows = 5;
mTestProfile.numColumns = 5;
diff --git a/tests/multivalentTests/src/com/android/launcher3/widget/picker/WidgetsListTableViewHolderBinderTest.java b/tests/multivalentTests/src/com/android/launcher3/widget/picker/WidgetsListTableViewHolderBinderTest.java
index 86bbcc1..e6f13a6 100644
--- a/tests/multivalentTests/src/com/android/launcher3/widget/picker/WidgetsListTableViewHolderBinderTest.java
+++ b/tests/multivalentTests/src/com/android/launcher3/widget/picker/WidgetsListTableViewHolderBinderTest.java
@@ -15,7 +15,6 @@
*/
package com.android.launcher3.widget.picker;
-import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
import static com.google.common.truth.Truth.assertThat;
@@ -50,6 +49,7 @@
import com.android.launcher3.model.WidgetItem;
import com.android.launcher3.model.data.PackageItemInfo;
import com.android.launcher3.util.ActivityContextWrapper;
+import com.android.launcher3.util.SandboxApplication;
import com.android.launcher3.util.WidgetUtils;
import com.android.launcher3.widget.DatabaseWidgetPreviewLoader;
import com.android.launcher3.widget.LauncherAppWidgetProviderInfo;
@@ -57,6 +57,7 @@
import com.android.launcher3.widget.model.WidgetsListContentEntry;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -71,6 +72,7 @@
private static final String TEST_PACKAGE = "com.google.test";
private static final String APP_NAME = "Test app";
+ @Rule public SandboxApplication app = new SandboxApplication();
private Context mContext;
private WidgetsListTableViewHolderBinder mViewHolderBinder;
private InvariantDeviceProfile mTestProfile;
@@ -85,8 +87,8 @@
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
- mContext = new ActivityContextWrapper(getApplicationContext());
- mTestProfile = new InvariantDeviceProfile();
+ mContext = new ActivityContextWrapper(app);
+ mTestProfile = InvariantDeviceProfile.INSTANCE.get(app);
mTestProfile.numRows = 5;
mTestProfile.numColumns = 5;
diff --git a/tests/multivalentTests/src/com/android/launcher3/widget/picker/model/WidgetsListContentEntryTest.java b/tests/multivalentTests/src/com/android/launcher3/widget/picker/model/WidgetsListContentEntryTest.java
index 6088c8e..bd34de6 100644
--- a/tests/multivalentTests/src/com/android/launcher3/widget/picker/model/WidgetsListContentEntryTest.java
+++ b/tests/multivalentTests/src/com/android/launcher3/widget/picker/model/WidgetsListContentEntryTest.java
@@ -37,10 +37,12 @@
import com.android.launcher3.icons.cache.CachedObject;
import com.android.launcher3.model.WidgetItem;
import com.android.launcher3.model.data.PackageItemInfo;
+import com.android.launcher3.util.SandboxApplication;
import com.android.launcher3.widget.LauncherAppWidgetProviderInfo;
import com.android.launcher3.widget.model.WidgetsListContentEntry;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -64,6 +66,7 @@
private final ComponentName mWidget3 = ComponentName.createRelative(PACKAGE_NAME, ".mWidget3");
private final Map<ComponentName, String> mWidgetsToLabels = new HashMap();
+ @Rule public SandboxApplication app = new SandboxApplication();
@Mock private IconCache mIconCache;
private InvariantDeviceProfile mTestProfile;
@@ -76,7 +79,7 @@
mWidgetsToLabels.put(mWidget2, "Dog");
mWidgetsToLabels.put(mWidget3, "Bird");
- mTestProfile = new InvariantDeviceProfile();
+ mTestProfile = InvariantDeviceProfile.INSTANCE.get(app);
mTestProfile.numRows = 5;
mTestProfile.numColumns = 5;
diff --git a/tests/multivalentTests/src/com/android/launcher3/widget/picker/search/SimpleWidgetsSearchAlgorithmTest.java b/tests/multivalentTests/src/com/android/launcher3/widget/picker/search/SimpleWidgetsSearchAlgorithmTest.java
index 59f352b..0cdda3a 100644
--- a/tests/multivalentTests/src/com/android/launcher3/widget/picker/search/SimpleWidgetsSearchAlgorithmTest.java
+++ b/tests/multivalentTests/src/com/android/launcher3/widget/picker/search/SimpleWidgetsSearchAlgorithmTest.java
@@ -46,6 +46,7 @@
import com.android.launcher3.model.WidgetItem;
import com.android.launcher3.model.data.PackageItemInfo;
import com.android.launcher3.search.SearchCallback;
+import com.android.launcher3.util.SandboxApplication;
import com.android.launcher3.widget.LauncherAppWidgetProviderInfo;
import com.android.launcher3.widget.model.WidgetsListBaseEntry;
import com.android.launcher3.widget.model.WidgetsListContentEntry;
@@ -53,6 +54,7 @@
import com.android.launcher3.widget.picker.search.WidgetsSearchBar.WidgetsSearchDataProvider;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -66,6 +68,7 @@
@RunWith(AndroidJUnit4.class)
public class SimpleWidgetsSearchAlgorithmTest {
+ @Rule public SandboxApplication app = new SandboxApplication();
@Mock private IconCache mIconCache;
private InvariantDeviceProfile mTestProfile;
@@ -90,7 +93,7 @@
CachedObject componentWithLabel = invocation.getArgument(0);
return componentWithLabel.getComponent().getShortClassName();
}).when(mIconCache).getTitleNoCache(any());
- mTestProfile = new InvariantDeviceProfile();
+ mTestProfile = InvariantDeviceProfile.INSTANCE.get(app);
mTestProfile.numRows = 5;
mTestProfile.numColumns = 5;
mContext = getApplicationContext();
diff --git a/tests/multivalentTests/src/com/android/launcher3/widget/picker/util/WidgetPreviewContainerSizesTest.kt b/tests/multivalentTests/src/com/android/launcher3/widget/picker/util/WidgetPreviewContainerSizesTest.kt
index 7a858e4..2452a88 100644
--- a/tests/multivalentTests/src/com/android/launcher3/widget/picker/util/WidgetPreviewContainerSizesTest.kt
+++ b/tests/multivalentTests/src/com/android/launcher3/widget/picker/util/WidgetPreviewContainerSizesTest.kt
@@ -25,6 +25,7 @@
import com.android.launcher3.DeviceProfile
import com.android.launcher3.InvariantDeviceProfile
import com.android.launcher3.LauncherAppState
+import com.android.launcher3.dagger.LauncherComponentProvider.appComponent
import com.android.launcher3.icons.IconCache
import com.android.launcher3.model.WidgetItem
import com.android.launcher3.util.ActivityContextWrapper
@@ -53,7 +54,7 @@
context = ActivityContextWrapper(ApplicationProvider.getApplicationContext())
testInvariantProfile = LauncherAppState.getIDP(context)
widgetItemInvariantProfile =
- InvariantDeviceProfile().apply {
+ context.appComponent.idp.apply {
numRows = TEST_GRID_SIZE
numColumns = TEST_GRID_SIZE
}
@@ -143,13 +144,13 @@
widgetSize: Point,
context: Context,
invariantDeviceProfile: InvariantDeviceProfile,
- iconCache: IconCache
+ iconCache: IconCache,
): WidgetItem {
val providerInfo =
createAppWidgetProviderInfo(
ComponentName.createRelative(
TEST_PACKAGE,
- /*cls=*/ ".WidgetProvider_" + widgetSize.x + "x" + widgetSize.y
+ /*cls=*/ ".WidgetProvider_" + widgetSize.x + "x" + widgetSize.y,
)
)
val widgetInfo =
diff --git a/tests/multivalentTests/src/com/android/launcher3/widget/picker/util/WidgetsTableUtilsTest.java b/tests/multivalentTests/src/com/android/launcher3/widget/picker/util/WidgetsTableUtilsTest.java
index 2f5fcfe..a17e472 100644
--- a/tests/multivalentTests/src/com/android/launcher3/widget/picker/util/WidgetsTableUtilsTest.java
+++ b/tests/multivalentTests/src/com/android/launcher3/widget/picker/util/WidgetsTableUtilsTest.java
@@ -15,8 +15,6 @@
*/
package com.android.launcher3.widget.picker.util;
-import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
-
import static com.android.launcher3.util.WidgetUtils.createAppWidgetProviderInfo;
import static com.google.common.truth.Truth.assertThat;
@@ -44,10 +42,12 @@
import com.android.launcher3.model.WidgetItem;
import com.android.launcher3.pm.ShortcutConfigActivityInfo;
import com.android.launcher3.util.ActivityContextWrapper;
+import com.android.launcher3.util.SandboxApplication;
import com.android.launcher3.widget.LauncherAppWidgetProviderInfo;
import com.android.launcher3.widget.util.WidgetsTableUtils;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -68,6 +68,8 @@
private static final int NUM_OF_COLS = 5;
private static final int NUM_OF_ROWS = 5;
+ @Rule public SandboxApplication app = new SandboxApplication();
+
@Mock
private IconCache mIconCache;
@@ -89,9 +91,8 @@
public void setUp() {
MockitoAnnotations.initMocks(this);
- mContext = new ActivityContextWrapper(getApplicationContext());
-
- mTestInvariantProfile = new InvariantDeviceProfile();
+ mContext = new ActivityContextWrapper(app);
+ mTestInvariantProfile = InvariantDeviceProfile.INSTANCE.get(app);
mTestInvariantProfile.numColumns = NUM_OF_COLS;
mTestInvariantProfile.numRows = NUM_OF_ROWS;
diff --git a/tests/src/com/android/launcher3/model/LoaderTaskTest.kt b/tests/src/com/android/launcher3/model/LoaderTaskTest.kt
index cdb45fc..8f64e84 100644
--- a/tests/src/com/android/launcher3/model/LoaderTaskTest.kt
+++ b/tests/src/com/android/launcher3/model/LoaderTaskTest.kt
@@ -15,7 +15,6 @@
import androidx.test.filters.SmallTest
import com.android.dx.mockito.inline.extended.ExtendedMockito
import com.android.launcher3.Flags
-import com.android.launcher3.InvariantDeviceProfile
import com.android.launcher3.LauncherAppState
import com.android.launcher3.LauncherModel
import com.android.launcher3.LauncherModel.LoaderTransaction
@@ -120,12 +119,11 @@
.mockStatic(FirstScreenBroadcastHelper::class.java)
.startMocking()
val idp =
- InvariantDeviceProfile().apply {
+ context.appComponent.idp.apply {
numRows = 5
numColumns = 6
numDatabaseHotseatIcons = 5
}
- context.putObject(InvariantDeviceProfile.INSTANCE, idp)
context.putObject(LauncherAppState.INSTANCE, app)
doReturn(TestViewHelpers.findWidgetProvider(false))
diff --git a/tests/src/com/android/launcher3/nonquickstep/DeviceProfileDumpTest.kt b/tests/src/com/android/launcher3/nonquickstep/DeviceProfileDumpTest.kt
index 2e2b6cd..05cf926 100644
--- a/tests/src/com/android/launcher3/nonquickstep/DeviceProfileDumpTest.kt
+++ b/tests/src/com/android/launcher3/nonquickstep/DeviceProfileDumpTest.kt
@@ -19,7 +19,6 @@
import com.android.launcher3.AbstractDeviceProfileTest
import com.android.launcher3.DeviceProfile
import com.android.launcher3.Flags
-import com.android.launcher3.InvariantDeviceProfile
import com.android.launcher3.util.rule.setFlags
import org.junit.Before
import org.junit.Test
@@ -46,7 +45,7 @@
@Test
fun dumpPortraitGesture() {
initializeDevice(instance.deviceName, isGestureMode = true, isLandscape = false)
- val dp = getDeviceProfileForGrid(instance.gridName)
+ val dp = context.appComponent.idp.getDeviceProfile(context)
dp.isTaskbarPresentInApps = instance.isTaskbarPresentInApps
assertDump(dp, instance.filename("Portrait"))
@@ -55,7 +54,7 @@
@Test
fun dumpPortrait3Button() {
initializeDevice(instance.deviceName, isGestureMode = false, isLandscape = false)
- val dp = getDeviceProfileForGrid(instance.gridName)
+ val dp = context.appComponent.idp.getDeviceProfile(context)
dp.isTaskbarPresentInApps = instance.isTaskbarPresentInApps
assertDump(dp, instance.filename("Portrait3Button"))
@@ -64,7 +63,7 @@
@Test
fun dumpLandscapeGesture() {
initializeDevice(instance.deviceName, isGestureMode = true, isLandscape = true)
- val dp = getDeviceProfileForGrid(instance.gridName)
+ val dp = context.appComponent.idp.getDeviceProfile(context)
dp.isTaskbarPresentInApps = instance.isTaskbarPresentInApps
val testName =
@@ -79,7 +78,7 @@
@Test
fun dumpLandscape3Button() {
initializeDevice(instance.deviceName, isGestureMode = false, isLandscape = true)
- val dp = getDeviceProfileForGrid(instance.gridName)
+ val dp = context.appComponent.idp.getDeviceProfile(context)
dp.isTaskbarPresentInApps = instance.isTaskbarPresentInApps
val testName =
@@ -101,26 +100,25 @@
deviceSpecFolded = deviceSpecs["twopanel-phone"]!!,
isLandscape = isLandscape,
isGestureMode = isGestureMode,
+ gridName = instance.gridName,
)
"tablet" ->
initializeVarsForTablet(
deviceSpec = deviceSpec,
isLandscape = isLandscape,
isGestureMode = isGestureMode,
+ gridName = instance.gridName,
)
else ->
initializeVarsForPhone(
deviceSpec = deviceSpec,
isVerticalBar = isLandscape,
isGestureMode = isGestureMode,
+ gridName = instance.gridName,
)
}
}
- private fun getDeviceProfileForGrid(gridName: String): DeviceProfile {
- return InvariantDeviceProfile(context, gridName).getDeviceProfile(context)
- }
-
private fun assertDump(dp: DeviceProfile, filename: String) {
assertDump(dp, folderName, filename)
}