Merge "Add IS_RUNNING_IN_TEST_HARNESS check for isTransientTaskbar" into tm-qpr-dev
diff --git a/quickstep/res/values-am/strings.xml b/quickstep/res/values-am/strings.xml
index 0ac7ee5..2742bfc 100644
--- a/quickstep/res/values-am/strings.xml
+++ b/quickstep/res/values-am/strings.xml
@@ -78,10 +78,8 @@
<string name="allset_title" msgid="5021126669778966707">"ሁሉም ዝግጁ!"</string>
<string name="allset_hint" msgid="2384632994739392447">"ወደ መነሻ ለመሄድ በጣት ወደ ላይ ማንሸራተት"</string>
<string name="allset_button_hint" msgid="2395219947744706291">"ወደ መነሻ ማያ ገጽዎ ለመሄድ የመነሻ አዝራሩን መታ ያድርጉ"</string>
- <!-- no translation found for allset_description_generic (5385500062202019855) -->
- <skip />
- <!-- no translation found for default_device_name (6660656727127422487) -->
- <skip />
+ <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>
<string name="action_screenshot" msgid="8171125848358142917">"ቅጽበታዊ ገጽ እይታ"</string>
@@ -94,8 +92,7 @@
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"ይቅር"</string>
<string name="gesture_tutorial_action_button_label_skip" msgid="394452764989751960">"ዝለል"</string>
<string name="accessibility_rotate_button" msgid="4771825231336502943">"ማያ ገጹን አዙር"</string>
- <!-- no translation found for taskbar_edu_a11y_title (5417986057866415355) -->
- <skip />
+ <string name="taskbar_edu_a11y_title" msgid="5417986057866415355">"የተግባር አሞሌ ትምህርት"</string>
<string name="taskbar_edu_opened" msgid="3950252793551919129">"የተግባር አሞሌ ትምህርት ይታያል"</string>
<string name="taskbar_edu_closed" msgid="126643734478892862">"የተግባር አሞሌ ትምህርት ተዘግቷል"</string>
<string name="taskbar_edu_switch_apps" msgid="6942863327845784813">"መተግበሪያዎችን ለመቀየር የተግባር አሞሌውን ይጠቀሙ"</string>
@@ -112,10 +109,8 @@
<string name="taskbar_button_recents" msgid="7273376136216613134">"የቅርብ ጊዜዎቹ"</string>
<string name="taskbar_button_notifications" msgid="7471740351507357318">"ማሳወቂያዎች"</string>
<string name="taskbar_button_quick_settings" msgid="227662894293189391">"ፈጣን ቅንብሮች"</string>
- <!-- no translation found for taskbar_a11y_title (6432169809852243110) -->
- <skip />
- <!-- no translation found for taskbar_phone_a11y_title (4933360237131229395) -->
- <skip />
+ <string name="taskbar_a11y_title" msgid="6432169809852243110">"የተግባር አሞሌ"</string>
+ <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"የአሰሳ አሞሌ"</string>
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"ወደ ላይ/ግራ ይውሰዱ"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"ወደ ታች/ቀኝ ይውሰዱ"</string>
</resources>
diff --git a/quickstep/res/values-ar/strings.xml b/quickstep/res/values-ar/strings.xml
index fe76453..041fe24 100644
--- a/quickstep/res/values-ar/strings.xml
+++ b/quickstep/res/values-ar/strings.xml
@@ -78,10 +78,8 @@
<string name="allset_title" msgid="5021126669778966707">"اكتملت عملية الإعداد"</string>
<string name="allset_hint" msgid="2384632994739392447">"مرِّر سريعًا للأعلى للانتقال إلى الشاشة الرئيسية."</string>
<string name="allset_button_hint" msgid="2395219947744706291">"انقر على زر الشاشة الرئيسية للانتقال إلى الشاشة الرئيسية."</string>
- <!-- no translation found for allset_description_generic (5385500062202019855) -->
- <skip />
- <!-- no translation found for default_device_name (6660656727127422487) -->
- <skip />
+ <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>
<string name="action_screenshot" msgid="8171125848358142917">"لقطة شاشة"</string>
@@ -94,8 +92,7 @@
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"إلغاء"</string>
<string name="gesture_tutorial_action_button_label_skip" msgid="394452764989751960">"التخطي"</string>
<string name="accessibility_rotate_button" msgid="4771825231336502943">"تدوير الشاشة"</string>
- <!-- no translation found for taskbar_edu_a11y_title (5417986057866415355) -->
- <skip />
+ <string name="taskbar_edu_a11y_title" msgid="5417986057866415355">"التعريف بشريط التطبيقات"</string>
<string name="taskbar_edu_opened" msgid="3950252793551919129">"ظهرت لوحة تعليم استخدام شريط المهام."</string>
<string name="taskbar_edu_closed" msgid="126643734478892862">"تم إغلاق لوحة تعليم استخدام شريط المهام."</string>
<string name="taskbar_edu_switch_apps" msgid="6942863327845784813">"يمكنك استخدام شريط المهام للتبديل بين التطبيقات."</string>
@@ -112,10 +109,8 @@
<string name="taskbar_button_recents" msgid="7273376136216613134">"الأحدث"</string>
<string name="taskbar_button_notifications" msgid="7471740351507357318">"الإشعارات"</string>
<string name="taskbar_button_quick_settings" msgid="227662894293189391">"إعدادات سريعة"</string>
- <!-- no translation found for taskbar_a11y_title (6432169809852243110) -->
- <skip />
- <!-- no translation found for taskbar_phone_a11y_title (4933360237131229395) -->
- <skip />
+ <string name="taskbar_a11y_title" msgid="6432169809852243110">"شريط التطبيقات"</string>
+ <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"شريط التنقل"</string>
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"الانتقال إلى يمين الشاشة أو أعلاها"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"الانتقال إلى يسار الشاشة أو أسفلها"</string>
</resources>
diff --git a/quickstep/res/values-eu/strings.xml b/quickstep/res/values-eu/strings.xml
index 8fa8533..8028677 100644
--- a/quickstep/res/values-eu/strings.xml
+++ b/quickstep/res/values-eu/strings.xml
@@ -78,10 +78,8 @@
<string name="allset_title" msgid="5021126669778966707">"Dena prest!"</string>
<string name="allset_hint" msgid="2384632994739392447">"Pasatu hatza gora hasierako pantailara joateko"</string>
<string name="allset_button_hint" msgid="2395219947744706291">"Hasierako pantailara joateko, sakatu Hasiera botoia"</string>
- <!-- no translation found for allset_description_generic (5385500062202019855) -->
- <skip />
- <!-- no translation found for default_device_name (6660656727127422487) -->
- <skip />
+ <string name="allset_description_generic" msgid="5385500062202019855">"Prest zaude <xliff:g id="DEVICE">%1$s</xliff:g> erabiltzen hasteko"</string>
+ <string name="default_device_name" msgid="6660656727127422487">"gailua"</string>
<string name="allset_navigation_settings" msgid="4713404605961476027"><annotation id="link">"Sisteman nabigatzeko ezarpenak"</annotation></string>
<string name="action_share" msgid="2648470652637092375">"Partekatu"</string>
<string name="action_screenshot" msgid="8171125848358142917">"Atera pantaila-argazki bat"</string>
@@ -94,8 +92,7 @@
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Utzi"</string>
<string name="gesture_tutorial_action_button_label_skip" msgid="394452764989751960">"Saltatu"</string>
<string name="accessibility_rotate_button" msgid="4771825231336502943">"Biratu pantaila"</string>
- <!-- no translation found for taskbar_edu_a11y_title (5417986057866415355) -->
- <skip />
+ <string name="taskbar_edu_a11y_title" msgid="5417986057866415355">"Zereginen barra erabiltzeko argibideak"</string>
<string name="taskbar_edu_opened" msgid="3950252793551919129">"Agertu egin da zereginen barraren tutoriala"</string>
<string name="taskbar_edu_closed" msgid="126643734478892862">"Itxi egin da zereginen barraren tutoriala"</string>
<string name="taskbar_edu_switch_apps" msgid="6942863327845784813">"Erabili zereginen barra aplikazioz aldatzeko"</string>
@@ -112,10 +109,8 @@
<string name="taskbar_button_recents" msgid="7273376136216613134">"Azkenak"</string>
<string name="taskbar_button_notifications" msgid="7471740351507357318">"Jakinarazpenak"</string>
<string name="taskbar_button_quick_settings" msgid="227662894293189391">"Ezarpen bizkorrak"</string>
- <!-- no translation found for taskbar_a11y_title (6432169809852243110) -->
- <skip />
- <!-- no translation found for taskbar_phone_a11y_title (4933360237131229395) -->
- <skip />
+ <string name="taskbar_a11y_title" msgid="6432169809852243110">"Zereginen barra"</string>
+ <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Nabigazio-barra"</string>
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Eraman gora, ezkerretara"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Eraman behera, eskuinetara"</string>
</resources>
diff --git a/quickstep/res/values-gu/strings.xml b/quickstep/res/values-gu/strings.xml
index c52f39c..0c0ec88 100644
--- a/quickstep/res/values-gu/strings.xml
+++ b/quickstep/res/values-gu/strings.xml
@@ -78,10 +78,8 @@
<string name="allset_title" msgid="5021126669778966707">"બધું સેટ થઈ ગયું!"</string>
<string name="allset_hint" msgid="2384632994739392447">"હોમપેજ પર જવા માટે ઉપરની તરફ સ્વાઇપ કરો"</string>
<string name="allset_button_hint" msgid="2395219947744706291">"તમારી હોમ સ્ક્રીન પર જવા માટે હોમ બટન ટૅપ કરો"</string>
- <!-- no translation found for allset_description_generic (5385500062202019855) -->
- <skip />
- <!-- no translation found for default_device_name (6660656727127422487) -->
- <skip />
+ <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>
<string name="action_screenshot" msgid="8171125848358142917">"સ્ક્રીનશૉટ"</string>
@@ -94,8 +92,7 @@
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"રદ કરો"</string>
<string name="gesture_tutorial_action_button_label_skip" msgid="394452764989751960">"છોડો"</string>
<string name="accessibility_rotate_button" msgid="4771825231336502943">"સ્ક્રીન ફેરવો"</string>
- <!-- no translation found for taskbar_edu_a11y_title (5417986057866415355) -->
- <skip />
+ <string name="taskbar_edu_a11y_title" msgid="5417986057866415355">"ટાસ્કબાર વિશે શિક્ષણ"</string>
<string name="taskbar_edu_opened" msgid="3950252793551919129">"ટાસ્કબારનું શિક્ષણ આપતી પૅનલ દેખાય છે"</string>
<string name="taskbar_edu_closed" msgid="126643734478892862">"ટાસ્કબારનું શિક્ષણ આપતી પૅનલ બંધ થઈ છે"</string>
<string name="taskbar_edu_switch_apps" msgid="6942863327845784813">"ઍપ સ્વિચ કરવા માટે, ટાસ્કબારનો ઉપયોગ કરો"</string>
@@ -112,10 +109,8 @@
<string name="taskbar_button_recents" msgid="7273376136216613134">"તાજેતરના"</string>
<string name="taskbar_button_notifications" msgid="7471740351507357318">"નોટિફિકેશન"</string>
<string name="taskbar_button_quick_settings" msgid="227662894293189391">"ઝડપી સેટિંગ"</string>
- <!-- no translation found for taskbar_a11y_title (6432169809852243110) -->
- <skip />
- <!-- no translation found for taskbar_phone_a11y_title (4933360237131229395) -->
- <skip />
+ <string name="taskbar_a11y_title" msgid="6432169809852243110">"ટાસ્કબાર"</string>
+ <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"નૅવિગેશન બાર"</string>
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"સૌથી ઉપર ડાબી બાજુએ ખસેડો"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"સૌથી નીચે જમણી બાજુએ ખસેડો"</string>
</resources>
diff --git a/quickstep/res/values-my/strings.xml b/quickstep/res/values-my/strings.xml
index 825a263..8fcb464 100644
--- a/quickstep/res/values-my/strings.xml
+++ b/quickstep/res/values-my/strings.xml
@@ -78,10 +78,8 @@
<string name="allset_title" msgid="5021126669778966707">"အားလုံး အဆင်သင့်ပါ။"</string>
<string name="allset_hint" msgid="2384632994739392447">"ပင်မစာမျက်နှာသို့သွားရန် အပေါ်သို့ ပွတ်ဆွဲပါ"</string>
<string name="allset_button_hint" msgid="2395219947744706291">"ပင်မစာမျက်နှာသို့ သွားရန် ပင်မခလုတ်ကို တို့ပါ"</string>
- <!-- no translation found for allset_description_generic (5385500062202019855) -->
- <skip />
- <!-- no translation found for default_device_name (6660656727127422487) -->
- <skip />
+ <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>
<string name="action_screenshot" msgid="8171125848358142917">"ဖန်သားပြင်ဓာတ်ပုံ"</string>
@@ -94,8 +92,7 @@
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"မလုပ်တော့"</string>
<string name="gesture_tutorial_action_button_label_skip" msgid="394452764989751960">"ကျော်ရန်"</string>
<string name="accessibility_rotate_button" msgid="4771825231336502943">"ဖန်သားပြင်လှည့်ရန်"</string>
- <!-- no translation found for taskbar_edu_a11y_title (5417986057866415355) -->
- <skip />
+ <string name="taskbar_edu_a11y_title" msgid="5417986057866415355">"လုပ်ဆောင်စရာဘား ပညာပေး"</string>
<string name="taskbar_edu_opened" msgid="3950252793551919129">"ပညာရေး လုပ်ဆောင်စရာဘား ပြထားသည်"</string>
<string name="taskbar_edu_closed" msgid="126643734478892862">"ပညာရေး လုပ်ဆောင်စရာဘား ပိတ်ထားသည်"</string>
<string name="taskbar_edu_switch_apps" msgid="6942863327845784813">"အက်ပ်များပြောင်းရန် လုပ်ဆောင်စရာဘားကို သုံးပါ"</string>
@@ -112,10 +109,8 @@
<string name="taskbar_button_recents" msgid="7273376136216613134">"လတ်တလောများ"</string>
<string name="taskbar_button_notifications" msgid="7471740351507357318">"အကြောင်းကြားချက်"</string>
<string name="taskbar_button_quick_settings" msgid="227662894293189391">"အမြန်ဆက်တင်များ"</string>
- <!-- no translation found for taskbar_a11y_title (6432169809852243110) -->
- <skip />
- <!-- no translation found for taskbar_phone_a11y_title (4933360237131229395) -->
- <skip />
+ <string name="taskbar_a11y_title" msgid="6432169809852243110">"လုပ်ဆောင်စရာဘား"</string>
+ <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"လမ်းညွှန်ဘား"</string>
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"အပေါ်/ဘယ်ဘက်သို့ ရွှေ့ရန်"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"အောက်ခြေ/ညာဘက်သို့ ရွှေ့ရန်"</string>
</resources>
diff --git a/quickstep/res/values-pt/strings.xml b/quickstep/res/values-pt/strings.xml
index 4b2bc9c..a0f8221 100644
--- a/quickstep/res/values-pt/strings.xml
+++ b/quickstep/res/values-pt/strings.xml
@@ -78,10 +78,8 @@
<string name="allset_title" msgid="5021126669778966707">"Tudo pronto!"</string>
<string name="allset_hint" msgid="2384632994739392447">"Deslize para cima para acessar a tela inicial"</string>
<string name="allset_button_hint" msgid="2395219947744706291">"Toque no botão home para ir para a tela inicial"</string>
- <!-- no translation found for allset_description_generic (5385500062202019855) -->
- <skip />
- <!-- no translation found for default_device_name (6660656727127422487) -->
- <skip />
+ <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="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>
<string name="action_screenshot" msgid="8171125848358142917">"Capturar tela"</string>
@@ -94,8 +92,7 @@
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Cancelar"</string>
<string name="gesture_tutorial_action_button_label_skip" msgid="394452764989751960">"Pular"</string>
<string name="accessibility_rotate_button" msgid="4771825231336502943">"Girar a tela"</string>
- <!-- no translation found for taskbar_edu_a11y_title (5417986057866415355) -->
- <skip />
+ <string name="taskbar_edu_a11y_title" msgid="5417986057866415355">"Informações sobre a barra de tarefas"</string>
<string name="taskbar_edu_opened" msgid="3950252793551919129">"As dicas sobre a barra de tarefas foram abertas"</string>
<string name="taskbar_edu_closed" msgid="126643734478892862">"As dicas sobre a barra de tarefas foram fechadas"</string>
<string name="taskbar_edu_switch_apps" msgid="6942863327845784813">"Use a barra de tarefas para alternar entre apps"</string>
@@ -112,10 +109,8 @@
<string name="taskbar_button_recents" msgid="7273376136216613134">"Recentes"</string>
<string name="taskbar_button_notifications" msgid="7471740351507357318">"Notificações"</string>
<string name="taskbar_button_quick_settings" msgid="227662894293189391">"Config. rápidas"</string>
- <!-- no translation found for taskbar_a11y_title (6432169809852243110) -->
- <skip />
- <!-- no translation found for taskbar_phone_a11y_title (4933360237131229395) -->
- <skip />
+ <string name="taskbar_a11y_title" msgid="6432169809852243110">"Barra de tarefas"</string>
+ <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Barra de navegação"</string>
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Mover para cima/para a esquerda"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Mover para baixo/para a direita"</string>
</resources>
diff --git a/quickstep/res/values-sw/strings.xml b/quickstep/res/values-sw/strings.xml
index 09263ea..8283a04 100644
--- a/quickstep/res/values-sw/strings.xml
+++ b/quickstep/res/values-sw/strings.xml
@@ -78,10 +78,8 @@
<string name="allset_title" msgid="5021126669778966707">"Tayari!"</string>
<string name="allset_hint" msgid="2384632994739392447">"Telezesha kidole juu ili uende kwenye skrini ya kwanza"</string>
<string name="allset_button_hint" msgid="2395219947744706291">"Gusa kitufe cha ukurasa wa mwanzo ili uende kwenye skrini ya kwanza"</string>
- <!-- no translation found for allset_description_generic (5385500062202019855) -->
- <skip />
- <!-- no translation found for default_device_name (6660656727127422487) -->
- <skip />
+ <string name="allset_description_generic" msgid="5385500062202019855">"Uko tayari kuanza kutumia <xliff:g id="DEVICE">%1$s</xliff:g> yako"</string>
+ <string name="default_device_name" msgid="6660656727127422487">"kifaa"</string>
<string name="allset_navigation_settings" msgid="4713404605961476027"><annotation id="link">"Mipangilio ya usogezaji kwenye mfumo"</annotation></string>
<string name="action_share" msgid="2648470652637092375">"Shiriki"</string>
<string name="action_screenshot" msgid="8171125848358142917">"Picha ya skrini"</string>
@@ -94,8 +92,7 @@
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Ghairi"</string>
<string name="gesture_tutorial_action_button_label_skip" msgid="394452764989751960">"Ruka"</string>
<string name="accessibility_rotate_button" msgid="4771825231336502943">"Zungusha skrini"</string>
- <!-- no translation found for taskbar_edu_a11y_title (5417986057866415355) -->
- <skip />
+ <string name="taskbar_edu_a11y_title" msgid="5417986057866415355">"Elimu ya Upauzana"</string>
<string name="taskbar_edu_opened" msgid="3950252793551919129">"Paneli ya elimu kwenye upau wa shughuli inaonyeshwa"</string>
<string name="taskbar_edu_closed" msgid="126643734478892862">"Paneli ya elimu kwenye upau wa shughuli imefungwa"</string>
<string name="taskbar_edu_switch_apps" msgid="6942863327845784813">"Tumia upau wa shughuli kubadilisha programu"</string>
@@ -112,10 +109,8 @@
<string name="taskbar_button_recents" msgid="7273376136216613134">"Vilivyotumika majuzi"</string>
<string name="taskbar_button_notifications" msgid="7471740351507357318">"Arifa"</string>
<string name="taskbar_button_quick_settings" msgid="227662894293189391">"Mipangilio ya Haraka"</string>
- <!-- no translation found for taskbar_a11y_title (6432169809852243110) -->
- <skip />
- <!-- no translation found for taskbar_phone_a11y_title (4933360237131229395) -->
- <skip />
+ <string name="taskbar_a11y_title" msgid="6432169809852243110">"Upauzana"</string>
+ <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Sehemu ya viungo muhimu"</string>
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Sogeza juu/kushoto"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Sogeza chini/kulia"</string>
</resources>
diff --git a/quickstep/res/values-uk/strings.xml b/quickstep/res/values-uk/strings.xml
index 76422a4..d85ccca 100644
--- a/quickstep/res/values-uk/strings.xml
+++ b/quickstep/res/values-uk/strings.xml
@@ -78,10 +78,8 @@
<string name="allset_title" msgid="5021126669778966707">"Готово."</string>
<string name="allset_hint" msgid="2384632994739392447">"Щоб перейти на головний екран, проведіть пальцем угору"</string>
<string name="allset_button_hint" msgid="2395219947744706291">"Натисніть кнопку головного екрана, щоб відкрити його"</string>
- <!-- no translation found for allset_description_generic (5385500062202019855) -->
- <skip />
- <!-- no translation found for default_device_name (6660656727127422487) -->
- <skip />
+ <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>
<string name="action_screenshot" msgid="8171125848358142917">"Знімок екрана"</string>
@@ -94,8 +92,7 @@
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Скасувати"</string>
<string name="gesture_tutorial_action_button_label_skip" msgid="394452764989751960">"Пропустити"</string>
<string name="accessibility_rotate_button" msgid="4771825231336502943">"Обернути екран"</string>
- <!-- no translation found for taskbar_edu_a11y_title (5417986057866415355) -->
- <skip />
+ <string name="taskbar_edu_a11y_title" msgid="5417986057866415355">"Панель завдань Education"</string>
<string name="taskbar_edu_opened" msgid="3950252793551919129">"Панель завдань Education відкрито"</string>
<string name="taskbar_edu_closed" msgid="126643734478892862">"Панель завдань Education закрито"</string>
<string name="taskbar_edu_switch_apps" msgid="6942863327845784813">"Переходьте між додатками за допомогою панелі завдань"</string>
@@ -112,10 +109,8 @@
<string name="taskbar_button_recents" msgid="7273376136216613134">"Нещодавні"</string>
<string name="taskbar_button_notifications" msgid="7471740351507357318">"Сповіщення"</string>
<string name="taskbar_button_quick_settings" msgid="227662894293189391">"Швидкі налаштув."</string>
- <!-- no translation found for taskbar_a11y_title (6432169809852243110) -->
- <skip />
- <!-- no translation found for taskbar_phone_a11y_title (4933360237131229395) -->
- <skip />
+ <string name="taskbar_a11y_title" msgid="6432169809852243110">"Панель завдань"</string>
+ <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Панель навігації"</string>
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Перемістити вгору або вліво"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Перемістити вниз або вправо"</string>
</resources>
diff --git a/quickstep/src/com/android/launcher3/hybridhotseat/HotseatEduDialog.java b/quickstep/src/com/android/launcher3/hybridhotseat/HotseatEduDialog.java
index 80bdb6f..ba412c9 100644
--- a/quickstep/src/com/android/launcher3/hybridhotseat/HotseatEduDialog.java
+++ b/quickstep/src/com/android/launcher3/hybridhotseat/HotseatEduDialog.java
@@ -193,7 +193,7 @@
icon.setEnabled(false);
icon.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO);
icon.verifyHighRes();
- CellLayoutLayoutParams lp = new CellLayoutLayoutParams(i, 0, 1, 1);
+ CellLayoutLayoutParams lp = new CellLayoutLayoutParams(i, 0, 1, 1, -1);
mSampleHotseat.addViewToCellLayout(icon, i, info.getViewId(), lp, true);
}
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
index bc69088..049c672 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
@@ -32,6 +32,7 @@
import android.os.Handler;
import android.os.SystemProperties;
import android.provider.Settings;
+import android.util.Log;
import android.view.Display;
import androidx.annotation.NonNull;
@@ -224,8 +225,13 @@
return;
}
mActivity = activity;
- mUnfoldProgressProvider.setSourceProvider(getUnfoldTransitionProgressProviderForActivity(
- activity));
+ UnfoldTransitionProgressProvider unfoldTransitionProgressProvider =
+ getUnfoldTransitionProgressProviderForActivity(activity);
+ if (unfoldTransitionProgressProvider == null) {
+ Log.e("b/261320823", "UnfoldTransitionProgressProvider null in setActivity. "
+ + "Unfold animation for launcher will not work.");
+ }
+ mUnfoldProgressProvider.setSourceProvider(unfoldTransitionProgressProvider);
if (mTaskbarActivityContext != null) {
mTaskbarActivityContext.setUIController(
diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
index 36d9686..13d0be5 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
@@ -63,6 +63,7 @@
import android.os.CancellationSignal;
import android.os.IBinder;
import android.os.SystemProperties;
+import android.util.Log;
import android.view.Display;
import android.view.HapticFeedbackConstants;
import android.view.RemoteAnimationTarget;
@@ -720,6 +721,7 @@
mUnfoldTransitionProgressProvider,
mRotationChangeProvider
);
+ Log.d("b/261320823", "initUnfoldTransitionProgressProvider completed");
}
}
diff --git a/quickstep/tests/src/com/android/quickstep/FallbackRecentsTest.java b/quickstep/tests/src/com/android/quickstep/FallbackRecentsTest.java
index f7600ff..47bef7b 100644
--- a/quickstep/tests/src/com/android/quickstep/FallbackRecentsTest.java
+++ b/quickstep/tests/src/com/android/quickstep/FallbackRecentsTest.java
@@ -63,6 +63,7 @@
import org.junit.After;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.RuleChain;
@@ -167,6 +168,7 @@
// b/143488140
//@NavigationModeSwitch
+ @Ignore
@Test
public void goToOverviewFromHome() {
mDevice.pressHome();
@@ -178,6 +180,7 @@
// b/143488140
//@NavigationModeSwitch
+ @Ignore
@Test
public void goToOverviewFromApp() {
startAppFast(resolveSystemApp(Intent.CATEGORY_APP_CALCULATOR));
@@ -213,6 +216,7 @@
// b/143488140
//@NavigationModeSwitch
+ @Ignore
@Test
public void testOverview() {
startAppFast(getAppPackageName());
diff --git a/quickstep/tests/src/com/android/quickstep/StartLauncherViaGestureTests.java b/quickstep/tests/src/com/android/quickstep/StartLauncherViaGestureTests.java
index 401b967..df5303f 100644
--- a/quickstep/tests/src/com/android/quickstep/StartLauncherViaGestureTests.java
+++ b/quickstep/tests/src/com/android/quickstep/StartLauncherViaGestureTests.java
@@ -24,6 +24,7 @@
import com.android.quickstep.NavigationModeSwitchRule.NavigationModeSwitch;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -56,6 +57,7 @@
eventProcessor.finishIteration();
}
+ @Ignore
@Test
@NavigationModeSwitch
public void testStressPressHome() {
@@ -68,6 +70,7 @@
}
}
+ @Ignore
@Test
@NavigationModeSwitch
public void testStressSwipeToOverview() {
diff --git a/quickstep/tests/src/com/android/quickstep/TaplTestsQuickstep.java b/quickstep/tests/src/com/android/quickstep/TaplTestsQuickstep.java
index cc561c6..9a2fcc0 100644
--- a/quickstep/tests/src/com/android/quickstep/TaplTestsQuickstep.java
+++ b/quickstep/tests/src/com/android/quickstep/TaplTestsQuickstep.java
@@ -44,6 +44,7 @@
import org.junit.After;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -224,6 +225,7 @@
return launcher.<RecentsView>getOverviewPanel().getBottomRowTaskCountForTablet();
}
+ @Ignore
@Test
@NavigationModeSwitch
@PortraitLandscape
@@ -236,6 +238,7 @@
isInState(() -> LauncherState.OVERVIEW));
}
+ @Ignore
@Test
@NavigationModeSwitch
@PortraitLandscape
@@ -363,6 +366,7 @@
waitForState("Launcher internal state didn't switch to Home", () -> LauncherState.NORMAL);
}
+ @Ignore
@Test
@PortraitLandscape
public void testOverviewForTablet() throws Exception {
diff --git a/res/color-night-v31/all_apps_tab_text.xml b/res/color-night-v31/all_apps_tab_text.xml
index 83237b4..54b95ae 100644
--- a/res/color-night-v31/all_apps_tab_text.xml
+++ b/res/color-night-v31/all_apps_tab_text.xml
@@ -14,6 +14,6 @@
limitations under the License.
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:color="@android:color/system_neutral1_50" android:state_selected="true"/>
- <item android:color="@android:color/system_neutral2_700"/>
+ <item android:color="@android:color/system_neutral2_700" android:state_selected="true"/>
+ <item android:color="@android:color/system_accent2_100"/>
</selector>
\ No newline at end of file
diff --git a/res/color-night-v31/all_apps_tabs_background.xml b/res/color-night-v31/all_apps_tabs_background.xml
new file mode 100644
index 0000000..9213274
--- /dev/null
+++ b/res/color-night-v31/all_apps_tabs_background.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 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.
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:color="@android:color/system_neutral1_800"/>
+</selector>
\ No newline at end of file
diff --git a/res/layout/all_apps_content.xml b/res/layout/all_apps_content.xml
index b33029f..773ab8d 100644
--- a/res/layout/all_apps_content.xml
+++ b/res/layout/all_apps_content.xml
@@ -44,6 +44,13 @@
</com.android.launcher3.allapps.FloatingHeaderView>
+ <View
+ android:id="@+id/search_protection"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:visibility="gone"
+ android:forceHasOverlappingRendering="false" />
+
<include layout="@layout/search_container_all_apps" />
<include layout="@layout/all_apps_fast_scroller" />
diff --git a/src/com/android/launcher3/AutoInstallsLayout.java b/src/com/android/launcher3/AutoInstallsLayout.java
index efdd5e1..55ede6c 100644
--- a/src/com/android/launcher3/AutoInstallsLayout.java
+++ b/src/com/android/launcher3/AutoInstallsLayout.java
@@ -31,7 +31,6 @@
import android.util.ArrayMap;
import android.util.AttributeSet;
import android.util.Log;
-import android.util.Pair;
import android.util.Patterns;
import android.util.Xml;
@@ -45,7 +44,7 @@
import com.android.launcher3.model.data.WorkspaceItemInfo;
import com.android.launcher3.qsb.QsbContainerView;
import com.android.launcher3.util.IntArray;
-import com.android.launcher3.util.PackageManagerHelper;
+import com.android.launcher3.util.Partner;
import com.android.launcher3.util.Thunk;
import com.android.launcher3.widget.LauncherWidgetHolder;
@@ -76,19 +75,16 @@
static AutoInstallsLayout get(Context context, LauncherWidgetHolder appWidgetHolder,
LayoutParserCallback callback) {
- Pair<String, Resources> customizationApkInfo = PackageManagerHelper.findSystemApk(
- ACTION_LAUNCHER_CUSTOMIZATION, context.getPackageManager());
- if (customizationApkInfo == null) {
+ Partner partner = Partner.get(context.getPackageManager(), ACTION_LAUNCHER_CUSTOMIZATION);
+ if (partner == null) {
return null;
}
- String pkg = customizationApkInfo.first;
- Resources targetRes = customizationApkInfo.second;
InvariantDeviceProfile grid = LauncherAppState.getIDP(context);
// Try with grid size and hotseat count
String layoutName = String.format(Locale.ENGLISH, FORMATTED_LAYOUT_RES_WITH_HOSTEAT,
grid.numColumns, grid.numRows, grid.numDatabaseHotseatIcons);
- int layoutId = targetRes.getIdentifier(layoutName, "xml", pkg);
+ int layoutId = partner.getXmlResId(layoutName);
// Try with only grid size
if (layoutId == 0) {
@@ -96,21 +92,21 @@
+ " not found. Trying layout without hosteat");
layoutName = String.format(Locale.ENGLISH, FORMATTED_LAYOUT_RES,
grid.numColumns, grid.numRows);
- layoutId = targetRes.getIdentifier(layoutName, "xml", pkg);
+ layoutId = partner.getXmlResId(layoutName);
}
// Try the default layout
if (layoutId == 0) {
Log.d(TAG, "Formatted layout: " + layoutName + " not found. Trying the default layout");
- layoutId = targetRes.getIdentifier(LAYOUT_RES, "xml", pkg);
+ layoutId = partner.getXmlResId(LAYOUT_RES);
}
if (layoutId == 0) {
- Log.e(TAG, "Layout definition not found in package: " + pkg);
+ Log.e(TAG, "Layout definition not found in package: " + partner.getPackageName());
return null;
}
- return new AutoInstallsLayout(context, appWidgetHolder, callback, targetRes, layoutId,
- TAG_WORKSPACE);
+ return new AutoInstallsLayout(context, appWidgetHolder, callback, partner.getResources(),
+ layoutId, TAG_WORKSPACE);
}
// Object Tags
diff --git a/src/com/android/launcher3/ButtonDropTarget.java b/src/com/android/launcher3/ButtonDropTarget.java
index 5abe3d3..ee3e278 100644
--- a/src/com/android/launcher3/ButtonDropTarget.java
+++ b/src/com/android/launcher3/ButtonDropTarget.java
@@ -423,14 +423,15 @@
float textSize = Utilities.pxToSp(getTextSize());
int availableWidth = getMeasuredWidth();
- while (textSize > minSize) {
- if (isTextTruncated(availableWidth)) {
- textSize -= step;
+ while (isTextTruncated(availableWidth)) {
+ textSize -= step;
+ if (textSize < minSize) {
+ textSize = minSize;
setTextSize(textSize);
- } else {
- return textSize;
+ break;
}
+ setTextSize(textSize);
}
- return minSize;
+ return textSize;
}
}
diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java
index 9c5e906..fdc52b5 100644
--- a/src/com/android/launcher3/CellLayout.java
+++ b/src/com/android/launcher3/CellLayout.java
@@ -267,7 +267,7 @@
mDragCell[0] = mDragCell[1] = -1;
mDragCellSpan[0] = mDragCellSpan[1] = -1;
for (int i = 0; i < mDragOutlines.length; i++) {
- mDragOutlines[i] = new CellLayoutLayoutParams(0, 0, 0, 0);
+ mDragOutlines[i] = new CellLayoutLayoutParams(0, 0, 0, 0, -1);
}
mDragOutlinePaint.setColor(Themes.getAttrColor(context, R.attr.workspaceTextColor));
diff --git a/src/com/android/launcher3/CheckLongPressHelper.java b/src/com/android/launcher3/CheckLongPressHelper.java
index c707df0..ec29b29 100644
--- a/src/com/android/launcher3/CheckLongPressHelper.java
+++ b/src/com/android/launcher3/CheckLongPressHelper.java
@@ -16,12 +16,15 @@
package com.android.launcher3;
+import android.os.Handler;
+import android.view.InputDevice;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
/**
- * Utility class to handle tripper long press on a view with custom timeout and stylus event
+ * Utility class to handle tripper long press or right click on a view with custom timeout and
+ * stylus event
*/
public class CheckLongPressHelper {
@@ -34,6 +37,7 @@
private float mLongPressTimeoutFactor = DEFAULT_LONG_PRESS_TIMEOUT_FACTOR;
private boolean mHasPerformedLongPress;
+ private boolean mIsInMouseRightClick;
private Runnable mPendingCheckForLongPress;
@@ -59,6 +63,26 @@
// start fresh on touch down.
cancelLongPress();
+ // Mouse right click should immediately trigger a long press
+ if (isMouseRightClickDownOrMove(ev)) {
+ mIsInMouseRightClick = true;
+ triggerLongPress();
+ final Handler handler = mView.getHandler();
+ if (handler != null) {
+ // Send an ACTION_UP to end this click gesture to avoid user dragging with
+ // mouse's right button. Note that we need to call
+ // {@link Handler#postAtFrontOfQueue()} instead of {@link View#post()} to
+ // make sure ACTION_UP is sent before any ACTION_MOVE if user is dragging.
+ final MotionEvent actionUpEvent = MotionEvent.obtain(ev);
+ actionUpEvent.setAction(MotionEvent.ACTION_UP);
+ handler.postAtFrontOfQueue(() -> {
+ mView.getRootView().dispatchTouchEvent(actionUpEvent);
+ actionUpEvent.recycle();
+ });
+ }
+ break;
+ }
+
postCheckForLongPress();
if (isStylusButtonPressed(ev)) {
triggerLongPress();
@@ -70,7 +94,8 @@
cancelLongPress();
break;
case MotionEvent.ACTION_MOVE:
- if (!Utilities.pointInView(mView, ev.getX(), ev.getY(), mSlop)) {
+ if (mIsInMouseRightClick
+ || !Utilities.pointInView(mView, ev.getX(), ev.getY(), mSlop)) {
cancelLongPress();
} else if (mPendingCheckForLongPress != null && isStylusButtonPressed(ev)) {
// Only trigger long press if it has not been cancelled before
@@ -98,9 +123,10 @@
}
/**
- * Cancels any pending long press
+ * Cancels any pending long press and right click
*/
public void cancelLongPress() {
+ mIsInMouseRightClick = false;
mHasPerformedLongPress = false;
clearCallbacks();
}
@@ -150,4 +176,14 @@
return event.getToolType(0) == MotionEvent.TOOL_TYPE_STYLUS
&& event.isButtonPressed(MotionEvent.BUTTON_SECONDARY);
}
+
+ /**
+ * Detect ACTION_DOWN or ACTION_MOVE from mouse right button. Note that we cannot detect
+ * ACTION_UP from mouse's right button because, in that case,
+ * {@link MotionEvent#getButtonState()} returns 0 for any mouse button (right, middle, right).
+ */
+ private static boolean isMouseRightClickDownOrMove(MotionEvent event) {
+ return event.isFromSource(InputDevice.SOURCE_MOUSE)
+ && ((event.getButtonState() & MotionEvent.BUTTON_SECONDARY) != 0);
+ }
}
diff --git a/src/com/android/launcher3/DefaultLayoutParser.java b/src/com/android/launcher3/DefaultLayoutParser.java
index af13bea..c69ae4d 100644
--- a/src/com/android/launcher3/DefaultLayoutParser.java
+++ b/src/com/android/launcher3/DefaultLayoutParser.java
@@ -19,6 +19,7 @@
import com.android.launcher3.LauncherSettings.Favorites;
import com.android.launcher3.model.data.WorkspaceItemInfo;
import com.android.launcher3.shortcuts.ShortcutKey;
+import com.android.launcher3.util.Partner;
import com.android.launcher3.util.Thunk;
import com.android.launcher3.widget.LauncherWidgetHolder;
@@ -51,6 +52,9 @@
private static final String ATTR_SHORTCUT_ID = "shortcutId";
private static final String ATTR_PACKAGE_NAME = "packageName";
+ public static final String RES_PARTNER_FOLDER = "partner_folder";
+ public static final String RES_PARTNER_DEFAULT_LAYOUT = "partner_default_layout";
+
// TODO: Remove support for this broadcast, instead use widget options to send bind time options
private static final String ACTION_APPWIDGET_DEFAULT_WORKSPACE_CONFIGURE =
"com.android.launcher.action.APPWIDGET_DEFAULT_WORKSPACE_CONFIGURE";
@@ -278,10 +282,9 @@
// Folder contents come from an external XML resource
final Partner partner = Partner.get(mPackageManager);
if (partner != null) {
- final Resources partnerRes = partner.getResources();
- final int resId = partnerRes.getIdentifier(Partner.RES_FOLDER,
- "xml", partner.getPackageName());
+ final int resId = partner.getXmlResId(RES_PARTNER_FOLDER);
if (resId != 0) {
+ final Resources partnerRes = partner.getResources();
final XmlPullParser partnerParser = partnerRes.getXml(resId);
beginDocument(partnerParser, TAG_FOLDER);
diff --git a/src/com/android/launcher3/InvariantDeviceProfile.java b/src/com/android/launcher3/InvariantDeviceProfile.java
index 1f97535..594d7cb 100644
--- a/src/com/android/launcher3/InvariantDeviceProfile.java
+++ b/src/com/android/launcher3/InvariantDeviceProfile.java
@@ -60,6 +60,7 @@
import com.android.launcher3.util.DisplayController.Info;
import com.android.launcher3.util.IntArray;
import com.android.launcher3.util.MainThreadInitializedObject;
+import com.android.launcher3.util.Partner;
import com.android.launcher3.util.Themes;
import com.android.launcher3.util.WindowBounds;
import com.android.launcher3.util.window.WindowManagerProxy;
@@ -112,6 +113,11 @@
static final int INDEX_TWO_PANEL_PORTRAIT = 2;
static final int INDEX_TWO_PANEL_LANDSCAPE = 3;
+ /** These resources are used to override the device profile */
+ private static final String RES_GRID_NUM_ROWS = "grid_num_rows";
+ private static final String RES_GRID_NUM_COLUMNS = "grid_num_columns";
+ private static final String RES_GRID_ICON_SIZE_DP = "grid_icon_size_dp";
+
/**
* Number of icons per row and column in the workspace.
*/
@@ -567,8 +573,24 @@
*/
private void applyPartnerDeviceProfileOverrides(Context context, DisplayMetrics dm) {
Partner p = Partner.get(context.getPackageManager());
- if (p != null) {
- p.applyInvariantDeviceProfileOverrides(this, dm);
+ if (p == null) {
+ return;
+ }
+ try {
+ int numRows = p.getIntValue(RES_GRID_NUM_ROWS, -1);
+ int numColumns = p.getIntValue(RES_GRID_NUM_COLUMNS, -1);
+ float iconSizePx = p.getDimenValue(RES_GRID_ICON_SIZE_DP, -1);
+
+ if (numRows > 0 && numColumns > 0) {
+ this.numRows = numRows;
+ this.numColumns = numColumns;
+ }
+ if (iconSizePx > 0) {
+ this.iconSize[InvariantDeviceProfile.INDEX_DEFAULT] =
+ Utilities.dpiFromPx(iconSizePx, dm.densityDpi);
+ }
+ } catch (Resources.NotFoundException ex) {
+ Log.e(TAG, "Invalid Partner grid resource!", ex);
}
}
diff --git a/src/com/android/launcher3/LauncherProvider.java b/src/com/android/launcher3/LauncherProvider.java
index d002c2b..8ddbbaa 100644
--- a/src/com/android/launcher3/LauncherProvider.java
+++ b/src/com/android/launcher3/LauncherProvider.java
@@ -16,6 +16,7 @@
package com.android.launcher3;
+import static com.android.launcher3.DefaultLayoutParser.RES_PARTNER_DEFAULT_LAYOUT;
import static com.android.launcher3.provider.LauncherDbUtils.copyTable;
import static com.android.launcher3.provider.LauncherDbUtils.dropTable;
import static com.android.launcher3.provider.LauncherDbUtils.tableExists;
@@ -34,7 +35,6 @@
import android.content.OperationApplicationException;
import android.content.SharedPreferences;
import android.content.pm.ProviderInfo;
-import android.content.res.Resources;
import android.database.Cursor;
import android.database.DatabaseUtils;
import android.database.SQLException;
@@ -70,6 +70,7 @@
import com.android.launcher3.util.IntSet;
import com.android.launcher3.util.NoLocaleSQLiteHelper;
import com.android.launcher3.util.PackageManagerHelper;
+import com.android.launcher3.util.Partner;
import com.android.launcher3.util.Thunk;
import com.android.launcher3.widget.LauncherWidgetHolder;
@@ -544,13 +545,11 @@
}
if (loader == null) {
final Partner partner = Partner.get(getContext().getPackageManager());
- if (partner != null && partner.hasDefaultLayout()) {
- final Resources partnerRes = partner.getResources();
- int workspaceResId = partnerRes.getIdentifier(Partner.RES_DEFAULT_LAYOUT,
- "xml", partner.getPackageName());
+ if (partner != null) {
+ int workspaceResId = partner.getXmlResId(RES_PARTNER_DEFAULT_LAYOUT);
if (workspaceResId != 0) {
loader = new DefaultLayoutParser(getContext(), widgetHolder,
- mOpenHelper, partnerRes, workspaceResId);
+ mOpenHelper, partner.getResources(), workspaceResId);
}
}
}
diff --git a/src/com/android/launcher3/Partner.java b/src/com/android/launcher3/Partner.java
deleted file mode 100644
index 2e27f32..0000000
--- a/src/com/android/launcher3/Partner.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright (C) 2014 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;
-
-import static com.android.launcher3.util.PackageManagerHelper.findSystemApk;
-
-import android.content.pm.PackageManager;
-import android.content.res.Resources;
-import android.util.DisplayMetrics;
-import android.util.Log;
-import android.util.Pair;
-
-import java.io.File;
-
-/**
- * Utilities to discover and interact with partner customizations. There can
- * only be one set of customizations on a device, and it must be bundled with
- * the system.
- */
-public class Partner {
-
- static final String TAG = "Launcher.Partner";
-
- /** Marker action used to discover partner */
- private static final String
- ACTION_PARTNER_CUSTOMIZATION = "com.android.launcher3.action.PARTNER_CUSTOMIZATION";
-
- public static final String RES_FOLDER = "partner_folder";
- public static final String RES_WALLPAPERS = "partner_wallpapers";
- public static final String RES_DEFAULT_LAYOUT = "partner_default_layout";
-
- public static final String RES_DEFAULT_WALLPAPER_HIDDEN = "default_wallpapper_hidden";
- public static final String RES_SYSTEM_WALLPAPER_DIR = "system_wallpaper_directory";
-
- public static final String RES_REQUIRE_FIRST_RUN_FLOW = "requires_first_run_flow";
-
- /** These resources are used to override the device profile */
- public static final String RES_GRID_NUM_ROWS = "grid_num_rows";
- public static final String RES_GRID_NUM_COLUMNS = "grid_num_columns";
- public static final String RES_GRID_ICON_SIZE_DP = "grid_icon_size_dp";
-
- /**
- * Find and return partner details, or {@code null} if none exists.
- */
- public static synchronized Partner get(PackageManager pm) {
- Pair<String, Resources> apkInfo = findSystemApk(ACTION_PARTNER_CUSTOMIZATION, pm);
- return apkInfo != null ? new Partner(apkInfo.first, apkInfo.second) : null;
- }
-
- private final String mPackageName;
- private final Resources mResources;
-
- private Partner(String packageName, Resources res) {
- mPackageName = packageName;
- mResources = res;
- }
-
- public String getPackageName() {
- return mPackageName;
- }
-
- public Resources getResources() {
- return mResources;
- }
-
- public boolean hasDefaultLayout() {
- int defaultLayout = getResources().getIdentifier(Partner.RES_DEFAULT_LAYOUT,
- "xml", getPackageName());
- return defaultLayout != 0;
- }
-
- public boolean hasFolder() {
- int folder = getResources().getIdentifier(Partner.RES_FOLDER,
- "xml", getPackageName());
- return folder != 0;
- }
-
- public boolean hideDefaultWallpaper() {
- int resId = getResources().getIdentifier(RES_DEFAULT_WALLPAPER_HIDDEN, "bool",
- getPackageName());
- return resId != 0 && getResources().getBoolean(resId);
- }
-
- public File getWallpaperDirectory() {
- int resId = getResources().getIdentifier(RES_SYSTEM_WALLPAPER_DIR, "string",
- getPackageName());
- return (resId != 0) ? new File(getResources().getString(resId)) : null;
- }
-
- public boolean requiresFirstRunFlow() {
- int resId = getResources().getIdentifier(RES_REQUIRE_FIRST_RUN_FLOW, "bool",
- getPackageName());
- return resId != 0 && getResources().getBoolean(resId);
- }
-
- public void applyInvariantDeviceProfileOverrides(InvariantDeviceProfile inv, DisplayMetrics dm) {
- int numRows = -1;
- int numColumns = -1;
- float iconSize = -1;
-
- try {
- int resId = getResources().getIdentifier(RES_GRID_NUM_ROWS,
- "integer", getPackageName());
- if (resId > 0) {
- numRows = getResources().getInteger(resId);
- }
-
- resId = getResources().getIdentifier(RES_GRID_NUM_COLUMNS,
- "integer", getPackageName());
- if (resId > 0) {
- numColumns = getResources().getInteger(resId);
- }
-
- resId = getResources().getIdentifier(RES_GRID_ICON_SIZE_DP,
- "dimen", getPackageName());
- if (resId > 0) {
- int px = getResources().getDimensionPixelSize(resId);
- iconSize = Utilities.dpiFromPx((float) px, dm.densityDpi);
- }
- } catch (Resources.NotFoundException ex) {
- Log.e(TAG, "Invalid Partner grid resource!", ex);
- return;
- }
-
- if (numRows > 0 && numColumns > 0) {
- inv.numRows = numRows;
- inv.numColumns = numColumns;
- }
-
- if (iconSize > 0) {
- inv.iconSize[InvariantDeviceProfile.INDEX_DEFAULT] = iconSize;
- }
- }
-}
diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java
index 27c9e98..483309d 100644
--- a/src/com/android/launcher3/Workspace.java
+++ b/src/com/android/launcher3/Workspace.java
@@ -582,7 +582,7 @@
}
int cellHSpan = mLauncher.getDeviceProfile().inv.numSearchContainerColumns;
- CellLayoutLayoutParams lp = new CellLayoutLayoutParams(0, 0, cellHSpan, 1);
+ CellLayoutLayoutParams lp = new CellLayoutLayoutParams(0, 0, cellHSpan, 1, FIRST_SCREEN_ID);
lp.canReorder = false;
if (!firstPage.addViewToCellLayout(
mFirstPagePinnedItem, 0, R.id.search_container_workspace, lp, true)) {
@@ -2392,10 +2392,10 @@
mDragTargetLayout.visualizeDropLocation(mTargetCell[0], mTargetCell[1],
item.spanX, item.spanY, d);
} else if ((mDragMode == DRAG_MODE_NONE || mDragMode == DRAG_MODE_REORDER)
- && !mReorderAlarm.alarmPending()
&& (mLastReorderX != reorderX || mLastReorderY != reorderY)
&& targetCellDistance < mDragTargetLayout.getReorderRadius(mTargetCell, item.spanX,
item.spanY)) {
+ mReorderAlarm.cancelAlarm();
mLastReorderX = reorderX;
mLastReorderY = reorderY;
mDragTargetLayout.performReorder((int) mDragViewVisualCenter[0],
diff --git a/src/com/android/launcher3/WorkspaceLayoutManager.java b/src/com/android/launcher3/WorkspaceLayoutManager.java
index 0b3a62f..91e12fa 100644
--- a/src/com/android/launcher3/WorkspaceLayoutManager.java
+++ b/src/com/android/launcher3/WorkspaceLayoutManager.java
@@ -114,7 +114,7 @@
ViewGroup.LayoutParams genericLp = child.getLayoutParams();
CellLayoutLayoutParams lp;
if (genericLp == null || !(genericLp instanceof CellLayoutLayoutParams)) {
- lp = new CellLayoutLayoutParams(x, y, spanX, spanY);
+ lp = new CellLayoutLayoutParams(x, y, spanX, spanY, screenId);
} else {
lp = (CellLayoutLayoutParams) genericLp;
lp.cellX = x;
diff --git a/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java b/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java
index e4e56a9..5c55b53 100644
--- a/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java
+++ b/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java
@@ -282,7 +282,7 @@
@Override
public int getHeaderBottom() {
if (FeatureFlags.ENABLE_FLOATING_SEARCH_BAR.get()) {
- return super.getHeaderBottom();
+ return super.getHeaderBottom() + mHeader.getClipTop();
}
return super.getHeaderBottom() + mSearchContainer.getBottom();
}
diff --git a/src/com/android/launcher3/allapps/BaseAllAppsContainerView.java b/src/com/android/launcher3/allapps/BaseAllAppsContainerView.java
index 8e519c1..f308a25 100644
--- a/src/com/android/launcher3/allapps/BaseAllAppsContainerView.java
+++ b/src/com/android/launcher3/allapps/BaseAllAppsContainerView.java
@@ -58,6 +58,7 @@
import com.android.launcher3.R;
import com.android.launcher3.Utilities;
import com.android.launcher3.allapps.search.SearchAdapterProvider;
+import com.android.launcher3.config.FeatureFlags;
import com.android.launcher3.keyboard.FocusedItemDecorator;
import com.android.launcher3.model.StringCache;
import com.android.launcher3.model.data.ItemInfo;
@@ -123,6 +124,7 @@
protected FloatingHeaderView mHeader;
private View mBottomSheetBackground;
private View mBottomSheetHandleArea;
+ @Nullable private View mSearchBarProtection;
protected boolean mUsingTabs;
private boolean mHasWorkApps;
@@ -363,6 +365,11 @@
return mSearchRecyclerView;
}
+ @Nullable
+ public View getSearchBarProtection() {
+ return mSearchBarProtection;
+ }
+
protected boolean isPersonalTab() {
return mViewPager == null || mViewPager.getNextPage() == 0;
}
@@ -410,6 +417,12 @@
});
mHeader = findViewById(R.id.all_apps_header);
+ mSearchBarProtection = findViewById(R.id.search_protection);
+ if (mSearchBarProtection != null) {
+ mSearchBarProtection.setBackgroundColor(mScrimColor);
+ mSearchBarProtection.setVisibility(
+ FeatureFlags.ENABLE_FLOATING_SEARCH_BAR.get() ? VISIBLE : GONE);
+ }
mSearchRecyclerView = findViewById(R.id.search_results_list_view);
mAH.get(AdapterHolder.SEARCH).setup(mSearchRecyclerView,
/* Filter out A-Z apps */ itemInfo -> false);
@@ -744,7 +757,7 @@
if (mHeaderPaint.getColor() != mScrimColor && mHeaderPaint.getColor() != 0) {
int bottom = getHeaderBottom();
FloatingHeaderView headerView = getFloatingHeaderView();
- if (!mUsingTabs) {
+ if (!mUsingTabs && !FeatureFlags.ENABLE_FLOATING_SEARCH_BAR.get()) {
// Add protection which is otherwise added when tabs scroll up.
bottom += headerView.getTabsAdditionalPaddingTop();
}
@@ -803,17 +816,6 @@
return mActivityContext.getDeviceProfile().isTablet ? mBottomSheetBackground : this;
}
- /**
- * Sets whether the view or its children should react to the window inset.
- * Used for when exiting all apps -> workspace and determines if window inset
- * should be applied.. ex) the work mode switch.
- */
- public void setApplyWindowInset(boolean shouldApplyWindowInset) {
- if (mWorkManager.getWorkModeSwitch() != null) {
- mWorkManager.getWorkModeSwitch().setApplyWindowInset(shouldApplyWindowInset);
- }
- }
-
protected void onInitializeRecyclerView(RecyclerView rv) {
rv.addOnScrollListener(mScrollListener);
}
diff --git a/src/com/android/launcher3/allapps/FloatingHeaderView.java b/src/com/android/launcher3/allapps/FloatingHeaderView.java
index 1cbb0f9..7fd3752 100644
--- a/src/com/android/launcher3/allapps/FloatingHeaderView.java
+++ b/src/com/android/launcher3/allapps/FloatingHeaderView.java
@@ -364,6 +364,10 @@
onHeightUpdated();
}
+ public int getClipTop() {
+ return mHeaderClip.top;
+ }
+
public void reset(boolean animate) {
if (mAnimator.isStarted()) {
mAnimator.cancel();
diff --git a/src/com/android/launcher3/allapps/WorkModeSwitch.java b/src/com/android/launcher3/allapps/WorkModeSwitch.java
index 2272cdc..aadd0b5 100644
--- a/src/com/android/launcher3/allapps/WorkModeSwitch.java
+++ b/src/com/android/launcher3/allapps/WorkModeSwitch.java
@@ -19,7 +19,6 @@
import static com.android.launcher3.workprofile.PersonalWorkSlidingTabStrip.getTabWidth;
import android.content.Context;
-import android.graphics.Insets;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.View;
@@ -27,6 +26,9 @@
import android.view.WindowInsets;
import android.widget.Button;
+import androidx.core.graphics.Insets;
+import androidx.core.view.WindowInsetsCompat;
+
import com.android.launcher3.DeviceProfile;
import com.android.launcher3.Insettable;
import com.android.launcher3.R;
@@ -49,10 +51,10 @@
private static final int FLAG_PROFILE_TOGGLE_ONGOING = 1 << 3;
private final Rect mInsets = new Rect();
+ private final Rect mImeInsets = new Rect();
private int mFlags;
private boolean mWorkEnabled;
private boolean mOnWorkTab;
- private boolean mApplyWindowInset;
public WorkModeSwitch(Context context) {
this(context, null, 0);
@@ -89,12 +91,12 @@
@Override
public void setInsets(Rect insets) {
mInsets.set(insets);
+ updateTranslationY();
MarginLayoutParams lp = (MarginLayoutParams) getLayoutParams();
if (lp != null) {
int bottomMargin = getResources().getDimensionPixelSize(R.dimen.work_fab_margin_bottom);
DeviceProfile dp = ActivityContext.lookupContext(getContext()).getDeviceProfile();
if (FeatureFlags.ENABLE_FLOATING_SEARCH_BAR.get()) {
- bottomMargin <<= 1; // Double margin to add space above search bar.
bottomMargin += dp.hotseatQsbHeight;
}
@@ -154,7 +156,6 @@
private void updateVisibility() {
clearAnimation();
- onApplyWindowInsets(getRootWindowInsets());
if (mWorkEnabled && mOnWorkTab) {
setFlag(FLAG_FADE_ONGOING);
setVisibility(VISIBLE);
@@ -170,16 +171,29 @@
@Override
public WindowInsets onApplyWindowInsets(WindowInsets insets) {
- if (!Utilities.ATLEAST_R || !mApplyWindowInset) {
- return insets;
- }
- if (insets.isVisible(WindowInsets.Type.ime())) {
- Insets keyboardInsets = insets.getInsets(WindowInsets.Type.ime());
- setTranslationY(mInsets.bottom - keyboardInsets.bottom);
+ WindowInsetsCompat windowInsetsCompat =
+ WindowInsetsCompat.toWindowInsetsCompat(insets, this);
+ if (windowInsetsCompat.isVisible(WindowInsetsCompat.Type.ime())) {
+ setInsets(mImeInsets, windowInsetsCompat.getInsets(WindowInsetsCompat.Type.ime()));
} else {
- setTranslationY(0);
+ mImeInsets.setEmpty();
}
- return insets;
+ updateTranslationY();
+ return super.onApplyWindowInsets(insets);
+ }
+
+ private void updateTranslationY() {
+ setTranslationY(-mImeInsets.bottom);
+ }
+
+ @Override
+ public void setTranslationY(float translationY) {
+ // Always translate at least enough for nav bar insets.
+ super.setTranslationY(Math.min(translationY, -mInsets.bottom));
+ }
+
+ private void setInsets(Rect rect, Insets insets) {
+ rect.set(insets.left, insets.top, insets.right, insets.bottom);
}
@Override
@@ -199,8 +213,4 @@
private void removeFlag(int flag) {
mFlags &= ~flag;
}
-
- public void setApplyWindowInset(boolean applyWindowInset){
- mApplyWindowInset = applyWindowInset;
- }
}
diff --git a/src/com/android/launcher3/anim/KeyboardInsetAnimationCallback.java b/src/com/android/launcher3/anim/KeyboardInsetAnimationCallback.java
index 9d96365..3863dc1 100644
--- a/src/com/android/launcher3/anim/KeyboardInsetAnimationCallback.java
+++ b/src/com/android/launcher3/anim/KeyboardInsetAnimationCallback.java
@@ -53,10 +53,21 @@
mView.setTranslationY(mInitialTranslation);
return windowInsets;
}
- float progress = list.get(0).getInterpolatedFraction();
+ WindowInsetsAnimation animation = list.get(0);
- mView.setTranslationY(
- Utilities.mapRange(progress, mInitialTranslation, mTerminalTranslation));
+ if (animation.getDurationMillis() > -1) {
+ float progress = animation.getInterpolatedFraction();
+ mView.setTranslationY(
+ Utilities.mapRange(progress, mInitialTranslation, mTerminalTranslation));
+ } else {
+ // Manually controlled animation: Set translation to keyboard height.
+ int translationY = -windowInsets.getInsets(WindowInsets.Type.ime()).bottom;
+ if (mView.getParent() instanceof View) {
+ // Offset any translation of the parent (e.g. All Apps parallax).
+ translationY -= ((View) mView.getParent()).getTranslationY();
+ }
+ mView.setTranslationY(translationY);
+ }
return windowInsets;
}
@@ -73,6 +84,7 @@
@Override
public void onEnd(WindowInsetsAnimation animation) {
+ mView.setTranslationY(mTerminalTranslation);
if (mView instanceof KeyboardInsetListener) {
((KeyboardInsetListener) mView).onTranslationEnd();
}
diff --git a/src/com/android/launcher3/celllayout/CellLayoutLayoutParams.java b/src/com/android/launcher3/celllayout/CellLayoutLayoutParams.java
index b14ae8d..abd4682 100644
--- a/src/com/android/launcher3/celllayout/CellLayoutLayoutParams.java
+++ b/src/com/android/launcher3/celllayout/CellLayoutLayoutParams.java
@@ -28,6 +28,9 @@
* Represents the logic of where a view is in a CellLayout and its size
*/
public class CellLayoutLayoutParams extends ViewGroup.MarginLayoutParams {
+
+ public int screenId = -1;
+
/**
* Horizontal location of the item in the grid.
*/
@@ -106,14 +109,20 @@
this.cellY = source.cellY;
this.cellHSpan = source.cellHSpan;
this.cellVSpan = source.cellVSpan;
+ this.screenId = source.screenId;
+ this.tmpCellX = source.tmpCellX;
+ this.tmpCellY = source.tmpCellY;
+ this.useTmpCoords = source.useTmpCoords;
}
- public CellLayoutLayoutParams(int cellX, int cellY, int cellHSpan, int cellVSpan) {
+ public CellLayoutLayoutParams(int cellX, int cellY, int cellHSpan, int cellVSpan,
+ int screenId) {
super(CellLayoutLayoutParams.MATCH_PARENT, CellLayoutLayoutParams.MATCH_PARENT);
this.cellX = cellX;
this.cellY = cellY;
this.cellHSpan = cellHSpan;
this.cellVSpan = cellVSpan;
+ this.screenId = screenId;
}
/**
diff --git a/src/com/android/launcher3/config/FeatureFlags.java b/src/com/android/launcher3/config/FeatureFlags.java
index f9883e3..797207d 100644
--- a/src/com/android/launcher3/config/FeatureFlags.java
+++ b/src/com/android/launcher3/config/FeatureFlags.java
@@ -89,14 +89,6 @@
getDebugFlag("ENABLE_FLOATING_SEARCH_BAR", false,
"Keep All Apps search bar at the bottom (but above keyboard if open)");
- public static final BooleanFlag ENABLE_QUICK_LAUNCH_V2 = new DeviceFlag(
- "ENABLE_QUICK_LAUNCH_V2", false, "Use quick launch v2 "
- + "behavior. Quick search and quick launch v1 would be unavailable if this is enabled");
-
- public static final BooleanFlag GBOARD_UPDATE_ENTER_KEY = new DeviceFlag(
- "GBOARD_UPDATE_ENTER_KEY", false, "Update gBoard enter key "
- + "icon dynamically based on top search content for Quick Launch V2");
-
public static final BooleanFlag ENABLE_HIDE_HEADER = new DeviceFlag("ENABLE_HIDE_HEADER",
true, "Hide header on keyboard before typing in all apps");
@@ -247,7 +239,7 @@
"Enables One Search box in Taskbar All Apps.");
public static final BooleanFlag ENABLE_TASKBAR_IN_OVERVIEW = getDebugFlag(
- "ENABLE_TASKBAR_IN_OVERVIEW", false,
+ "ENABLE_TASKBAR_IN_OVERVIEW", true,
"Enables accessing the system Taskbar in overview.");
public static final BooleanFlag ENABLE_SPLIT_FROM_WORKSPACE = getDebugFlag(
@@ -335,7 +327,7 @@
+ " to have better visuals");
public static final BooleanFlag ENABLE_TASKBAR_REVISED_THRESHOLDS = getDebugFlag(
- "ENABLE_TASKBAR_REVISED_THRESHOLDS", false,
+ "ENABLE_TASKBAR_REVISED_THRESHOLDS", true,
"Uses revised thresholds for transient taskbar.");
public static final BooleanFlag FORCE_PERSISTENT_TASKBAR = getDebugFlag(
diff --git a/src/com/android/launcher3/dragndrop/AddItemActivity.java b/src/com/android/launcher3/dragndrop/AddItemActivity.java
index 5a49f4a..a610548 100644
--- a/src/com/android/launcher3/dragndrop/AddItemActivity.java
+++ b/src/com/android/launcher3/dragndrop/AddItemActivity.java
@@ -23,6 +23,7 @@
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_ADD_EXTERNAL_ITEM_PLACED_AUTOMATICALLY;
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_ADD_EXTERNAL_ITEM_START;
import static com.android.launcher3.util.Executors.MODEL_EXECUTOR;
+import static com.android.launcher3.widget.WidgetSections.NO_CATEGORY;
import android.annotation.TargetApi;
import android.app.ActivityOptions;
@@ -63,10 +64,11 @@
import com.android.launcher3.logging.StatsLogManager;
import com.android.launcher3.model.ItemInstallQueue;
import com.android.launcher3.model.WidgetItem;
+import com.android.launcher3.model.WidgetsModel;
import com.android.launcher3.model.data.ItemInfo;
+import com.android.launcher3.model.data.PackageItemInfo;
import com.android.launcher3.pm.PinRequestHelper;
import com.android.launcher3.util.PackageManagerHelper;
-import com.android.launcher3.util.PackageUserKey;
import com.android.launcher3.util.SystemUiController;
import com.android.launcher3.views.AbstractSlideInView;
import com.android.launcher3.views.BaseDragLayer;
@@ -80,6 +82,7 @@
import com.android.launcher3.widget.WidgetCellPreview;
import com.android.launcher3.widget.WidgetImageView;
import com.android.launcher3.widget.WidgetManagerHelper;
+import com.android.launcher3.widget.WidgetSections;
import java.util.function.Supplier;
@@ -142,7 +145,7 @@
mAccessibilityManager =
getApplicationContext().getSystemService(AccessibilityManager.class);
- PackageUserKey targetApp = null;
+ final PackageItemInfo targetApp;
switch (mRequest.getRequestType()) {
case PinItemRequest.REQUEST_TYPE_SHORTCUT:
targetApp = setupShortcut();
@@ -150,6 +153,9 @@
case PinItemRequest.REQUEST_TYPE_APPWIDGET:
targetApp = setupWidget();
break;
+ default:
+ targetApp = null;
+ break;
}
if (targetApp == null) {
// TODO: show error toast?
@@ -157,7 +163,7 @@
return;
}
ApplicationInfo info = new PackageManagerHelper(this)
- .getApplicationInfo(targetApp.mPackageName, targetApp.mUser, 0);
+ .getApplicationInfo(targetApp.packageName, targetApp.user, 0);
if (info == null) {
finish();
return;
@@ -177,7 +183,10 @@
// Set the label synchronously instead of via IconCache as this is the first thing
// user sees
TextView widgetAppName = findViewById(R.id.widget_appName);
- widgetAppName.setText(info.loadLabel(getPackageManager()));
+ WidgetSections.WidgetSection section = targetApp.widgetCategory == NO_CATEGORY ? null
+ : WidgetSections.getWidgetSections(this).get(targetApp.widgetCategory);
+ widgetAppName.setText(section == null ? info.loadLabel(getPackageManager())
+ : getString(section.mSectionTitle));
mSlideInView = findViewById(R.id.add_item_bottom_sheet);
mSlideInView.addOnCloseListener(this);
@@ -266,19 +275,18 @@
}
}
- private PackageUserKey setupShortcut() {
+ private PackageItemInfo setupShortcut() {
PinShortcutRequestActivityInfo shortcutInfo =
new PinShortcutRequestActivityInfo(mRequest, this);
mWidgetCell.getWidgetView().setTag(new PendingAddShortcutInfo(shortcutInfo));
applyWidgetItemAsync(
() -> new WidgetItem(shortcutInfo, mApp.getIconCache(), getPackageManager()));
- return new PackageUserKey(
- mRequest.getShortcutInfo().getPackage(),
+ return new PackageItemInfo(mRequest.getShortcutInfo().getPackage(),
mRequest.getShortcutInfo().getUserHandle());
}
- private PackageUserKey setupWidget() {
- LauncherAppWidgetProviderInfo widgetInfo = LauncherAppWidgetProviderInfo
+ private PackageItemInfo setupWidget() {
+ final LauncherAppWidgetProviderInfo widgetInfo = LauncherAppWidgetProviderInfo
.fromProviderInfo(this, mRequest.getAppWidgetProviderInfo(this));
if (widgetInfo.minSpanX > mIdp.numColumns || widgetInfo.minSpanY > mIdp.numRows) {
// Cannot add widget
@@ -297,7 +305,8 @@
mWidgetCell.getWidgetView().setTag(pendingInfo);
applyWidgetItemAsync(() -> new WidgetItem(widgetInfo, mIdp, mApp.getIconCache()));
- return new PackageUserKey(widgetInfo.provider.getPackageName(), widgetInfo.getUser());
+ return WidgetsModel.newPendingItemInfo(this, widgetInfo.getComponent(),
+ widgetInfo.getUser());
}
private void applyWidgetItemAsync(final Supplier<WidgetItem> itemProvider) {
diff --git a/src/com/android/launcher3/folder/FolderPagedView.java b/src/com/android/launcher3/folder/FolderPagedView.java
index b87ab17..141388f 100644
--- a/src/com/android/launcher3/folder/FolderPagedView.java
+++ b/src/com/android/launcher3/folder/FolderPagedView.java
@@ -223,7 +223,7 @@
CellLayoutLayoutParams lp = (CellLayoutLayoutParams) textView.getLayoutParams();
if (lp == null) {
textView.setLayoutParams(new CellLayoutLayoutParams(
- item.cellX, item.cellY, item.spanX, item.spanY));
+ item.cellX, item.cellY, item.spanX, item.spanY, item.screenId));
} else {
lp.cellX = item.cellX;
lp.cellY = item.cellY;
diff --git a/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java b/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java
index 2361907..772913d 100644
--- a/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java
+++ b/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java
@@ -534,7 +534,7 @@
View qsb = mHomeElementInflater.inflate(R.layout.qsb_preview, firstScreen,
false);
CellLayoutLayoutParams lp = new CellLayoutLayoutParams(0, 0, firstScreen.getCountX(),
- 1);
+ 1, FIRST_SCREEN_ID);
lp.canReorder = false;
firstScreen.addViewToCellLayout(qsb, 0, R.id.search_container_workspace, lp, true);
}
diff --git a/src/com/android/launcher3/logging/StatsLogManager.java b/src/com/android/launcher3/logging/StatsLogManager.java
index 0e42d58..24d8c9d 100644
--- a/src/com/android/launcher3/logging/StatsLogManager.java
+++ b/src/com/android/launcher3/logging/StatsLogManager.java
@@ -779,7 +779,8 @@
FAIL(4),
COLD_USERWAITING(5),
ATOMIC(6),
- CONTROLLED(7);
+ CONTROLLED(7),
+ CACHED(8);
private final int mId;
LatencyType(int id) {
diff --git a/src/com/android/launcher3/model/GridSizeMigrationUtil.java b/src/com/android/launcher3/model/GridSizeMigrationUtil.java
index d63408b..eded5ea 100644
--- a/src/com/android/launcher3/model/GridSizeMigrationUtil.java
+++ b/src/com/android/launcher3/model/GridSizeMigrationUtil.java
@@ -66,7 +66,7 @@
public class GridSizeMigrationUtil {
private static final String TAG = "GridSizeMigrationUtil";
- private static final boolean DEBUG = false;
+ private static final boolean DEBUG = true;
private GridSizeMigrationUtil() {
// Util class should not be instantiated
@@ -188,27 +188,54 @@
@NonNull final DeviceGridState srcDeviceState,
@NonNull final DeviceGridState destDeviceState) {
- final List<DbEntry> hotseatItems = destReader.loadHotseatEntries();
- final List<DbEntry> workspaceItems = destReader.loadAllWorkspaceEntries();
- final List<DbEntry> hotseatDiff =
- calcDiff(srcReader.loadHotseatEntries(), hotseatItems);
- final List<DbEntry> workspaceDiff =
- calcDiff(srcReader.loadAllWorkspaceEntries(), workspaceItems);
+ final List<DbEntry> srcHotseatItems = srcReader.loadHotseatEntries();
+ final List<DbEntry> srcWorkspaceItems = srcReader.loadAllWorkspaceEntries();
+ final List<DbEntry> dstHotseatItems = destReader.loadHotseatEntries();
+ final List<DbEntry> dstWorkspaceItems = destReader.loadAllWorkspaceEntries();
+ final List<DbEntry> hotseatToBeAdded = new ArrayList<>(1);
+ final List<DbEntry> workspaceToBeAdded = new ArrayList<>(1);
+ final IntArray toBeRemoved = new IntArray();
+
+ calcDiff(srcHotseatItems, dstHotseatItems, hotseatToBeAdded, toBeRemoved);
+ calcDiff(srcWorkspaceItems, dstWorkspaceItems, workspaceToBeAdded, toBeRemoved);
final int trgX = targetSize.x;
final int trgY = targetSize.y;
- if (hotseatDiff.isEmpty() && workspaceDiff.isEmpty()) {
+ if (DEBUG) {
+ Log.d(TAG, "Start migration:"
+ + "\n Source Device:"
+ + srcWorkspaceItems.stream().map(DbEntry::toString).collect(
+ Collectors.joining(",\n", "[", "]"))
+ + "\n Target Device:"
+ + dstWorkspaceItems.stream().map(DbEntry::toString).collect(
+ Collectors.joining(",\n", "[", "]"))
+ + "\n Removing Items:"
+ + dstWorkspaceItems.stream().filter(entry ->
+ toBeRemoved.contains(entry.id)).map(DbEntry::toString).collect(
+ Collectors.joining(",\n", "[", "]"))
+ + "\n Adding Workspace Items:"
+ + workspaceToBeAdded.stream().map(DbEntry::toString).collect(
+ Collectors.joining(",\n", "[", "]"))
+ + "\n Adding Hotseat Items:"
+ + hotseatToBeAdded.stream().map(DbEntry::toString).collect(
+ Collectors.joining(",\n", "[", "]"))
+ );
+ }
+ if (!toBeRemoved.isEmpty()) {
+ removeEntryFromDb(destReader.mDb, destReader.mTableName, toBeRemoved);
+ }
+ if (hotseatToBeAdded.isEmpty() && workspaceToBeAdded.isEmpty()) {
return false;
}
// Sort the items by the reading order.
- Collections.sort(hotseatDiff);
- Collections.sort(workspaceDiff);
+ Collections.sort(hotseatToBeAdded);
+ Collections.sort(workspaceToBeAdded);
// Migrate hotseat
solveHotseatPlacement(db, srcReader,
- destReader, context, destHotseatSize, hotseatItems, hotseatDiff);
+ destReader, context, destHotseatSize, dstHotseatItems, hotseatToBeAdded);
// Migrate workspace.
// First we create a collection of the screens
@@ -229,8 +256,8 @@
Log.d(TAG, "Migrating " + screenId);
}
solveGridPlacement(db, srcReader,
- destReader, context, screenId, trgX, trgY, workspaceDiff, false);
- if (workspaceDiff.isEmpty()) {
+ destReader, context, screenId, trgX, trgY, workspaceToBeAdded, false);
+ if (workspaceToBeAdded.isEmpty()) {
break;
}
}
@@ -238,42 +265,37 @@
// In case the new grid is smaller, there might be some leftover items that don't fit on
// any of the screens, in this case we add them to new screens until all of them are placed.
int screenId = destReader.mLastScreenId + 1;
- while (!workspaceDiff.isEmpty()) {
+ while (!workspaceToBeAdded.isEmpty()) {
solveGridPlacement(db, srcReader,
- destReader, context, screenId, trgX, trgY, workspaceDiff, preservePages);
+ destReader, context, screenId, trgX, trgY, workspaceToBeAdded, preservePages);
screenId++;
}
return true;
}
- /** Return what's in the src but not in the dest */
- private static List<DbEntry> calcDiff(List<DbEntry> src, List<DbEntry> dest) {
- Map<String, Integer> destIdSet = new HashMap<>();
- for (DbEntry entry : dest) {
- String entryID = entry.getEntryMigrationId();
- if (destIdSet.containsKey(entryID)) {
- destIdSet.put(entryID, destIdSet.get(entryID) + 1);
- } else {
- destIdSet.put(entryID, 1);
+ /**
+ * Calculate the differences between {@code src} (denoted by A) and {@code dest}
+ * (denoted by B).
+ * All DbEntry in A - B will be added to {@code toBeAdded}
+ * All DbEntry.id in B - A will be added to {@code toBeRemoved}
+ */
+ private static void calcDiff(@NonNull final List<DbEntry> src,
+ @NonNull final List<DbEntry> dest, @NonNull final List<DbEntry> toBeAdded,
+ @NonNull final IntArray toBeRemoved) {
+ src.forEach(entry -> {
+ if (!dest.contains(entry)) {
+ toBeAdded.add(entry);
}
- }
- List<DbEntry> diff = new ArrayList<>();
- for (DbEntry entry : src) {
- String entryID = entry.getEntryMigrationId();
- if (destIdSet.containsKey(entryID)) {
- Integer count = destIdSet.get(entryID);
- if (count <= 0) {
- diff.add(entry);
- destIdSet.remove(entryID);
- } else {
- destIdSet.put(entryID, count - 1);
+ });
+ dest.forEach(entry -> {
+ if (!src.contains(entry)) {
+ toBeRemoved.add(entry.id);
+ if (entry.itemType == LauncherSettings.Favorites.ITEM_TYPE_FOLDER) {
+ entry.mFolderItems.values().forEach(ids -> ids.forEach(toBeRemoved::add));
}
- } else {
- diff.add(entry);
}
- }
- return diff;
+ });
}
private static void insertEntryInDb(SQLiteDatabase db, Context context, DbEntry entry,
@@ -682,12 +704,12 @@
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
DbEntry entry = (DbEntry) o;
- return Objects.equals(mIntent, entry.mIntent);
+ return Objects.equals(getEntryMigrationId(), entry.getEntryMigrationId());
}
@Override
public int hashCode() {
- return Objects.hash(mIntent);
+ return Objects.hash(getEntryMigrationId());
}
public void updateContentValues(ContentValues values) {
diff --git a/src/com/android/launcher3/util/PackageManagerHelper.java b/src/com/android/launcher3/util/PackageManagerHelper.java
index 12e8b54..140440e 100644
--- a/src/com/android/launcher3/util/PackageManagerHelper.java
+++ b/src/com/android/launcher3/util/PackageManagerHelper.java
@@ -16,8 +16,6 @@
package com.android.launcher3.util;
-import static android.content.pm.PackageManager.MATCH_SYSTEM_ONLY;
-
import android.app.AppOpsManager;
import android.content.ActivityNotFoundException;
import android.content.ComponentName;
@@ -31,7 +29,6 @@
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo;
-import android.content.res.Resources;
import android.graphics.Rect;
import android.net.Uri;
import android.os.Build;
@@ -40,7 +37,6 @@
import android.os.UserHandle;
import android.text.TextUtils;
import android.util.Log;
-import android.util.Pair;
import android.widget.Toast;
import androidx.annotation.NonNull;
@@ -296,25 +292,6 @@
}
/**
- * Finds a system apk which had a broadcast receiver listening to a particular action.
- * @param action intent action used to find the apk
- * @return a pair of apk package name and the resources.
- */
- public static Pair<String, Resources> findSystemApk(String action, PackageManager pm) {
- final Intent intent = new Intent(action);
- for (ResolveInfo info : pm.queryBroadcastReceivers(intent, MATCH_SYSTEM_ONLY)) {
- final String packageName = info.activityInfo.packageName;
- try {
- final Resources res = pm.getResourcesForApplication(packageName);
- return Pair.create(packageName, res);
- } catch (NameNotFoundException e) {
- Log.w(TAG, "Failed to find resources for " + packageName);
- }
- }
- return null;
- }
-
- /**
* Returns true if the intent is a valid launch intent for a launcher activity of an app.
* This is used to identify shortcuts which are different from the ones exposed by the
* applications' manifest file.
diff --git a/src/com/android/launcher3/util/Partner.java b/src/com/android/launcher3/util/Partner.java
new file mode 100644
index 0000000..220ab56
--- /dev/null
+++ b/src/com/android/launcher3/util/Partner.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.launcher3.util;
+
+import static android.content.pm.PackageManager.MATCH_SYSTEM_ONLY;
+
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.pm.ResolveInfo;
+import android.content.res.Resources;
+import android.util.Log;
+import android.util.Pair;
+
+/**
+ * Utilities to discover and interact with partner customizations. There can
+ * only be one set of customizations on a device, and it must be bundled with
+ * the system.
+ */
+public class Partner {
+
+ static final String TAG = "Launcher.Partner";
+
+ /** Marker action used to discover partner */
+ private static final String
+ ACTION_PARTNER_CUSTOMIZATION = "com.android.launcher3.action.PARTNER_CUSTOMIZATION";
+
+ /**
+ * Find and return partner details, or {@code null} if none exists.
+ */
+ public static Partner get(PackageManager pm) {
+ return get(pm, ACTION_PARTNER_CUSTOMIZATION);
+ }
+
+ /**
+ * Find and return partner details, or {@code null} if none exists.
+ */
+ public static Partner get(PackageManager pm, String action) {
+ Pair<String, Resources> apkInfo = findSystemApk(action, pm);
+ return apkInfo != null ? new Partner(apkInfo.first, apkInfo.second) : null;
+ }
+
+ private final String mPackageName;
+ private final Resources mResources;
+
+ private Partner(String packageName, Resources res) {
+ mPackageName = packageName;
+ mResources = res;
+ }
+
+ public String getPackageName() {
+ return mPackageName;
+ }
+
+ public Resources getResources() {
+ return mResources;
+ }
+
+ /**
+ * Returns the xml resource Id for the provided name, or 0 is the resource is not found
+ */
+ public int getXmlResId(String layoutName) {
+ return getResources().getIdentifier(layoutName, "xml", getPackageName());
+ }
+
+ /**
+ * Returns the integer resource value for the provided resource name,
+ * or default value if the resource name is not present
+ */
+ public int getIntValue(String resName, int defaultValue) {
+ int resId = getResources().getIdentifier(resName, "integer", getPackageName());
+ return resId > 0 ? getResources().getInteger(resId) : defaultValue;
+ }
+
+ /**
+ * Returns the dimension value for the provided resource name,
+ * or default value if the resource name is not present
+ */
+ public float getDimenValue(String resName, int defaultValue) {
+ int resId = getResources().getIdentifier(resName, "dimen", getPackageName());
+ return resId > 0 ? getResources().getDimension(resId) : defaultValue;
+ }
+
+ /**
+ * Finds a system apk which had a broadcast receiver listening to a particular action.
+ * @param action intent action used to find the apk
+ * @return a pair of apk package name and the resources.
+ */
+ private static Pair<String, Resources> findSystemApk(String action, PackageManager pm) {
+ final Intent intent = new Intent(action);
+ for (ResolveInfo info : pm.queryBroadcastReceivers(intent, MATCH_SYSTEM_ONLY)) {
+ final String packageName = info.activityInfo.packageName;
+ try {
+ final Resources res = pm.getResourcesForApplication(packageName);
+ return Pair.create(packageName, res);
+ } catch (NameNotFoundException e) {
+ Log.w(TAG, "Failed to find resources for " + packageName);
+ }
+ }
+ return null;
+ }
+}
diff --git a/tests/src/com/android/launcher3/celllayout/ReorderWidgets.java b/tests/src/com/android/launcher3/celllayout/ReorderWidgets.java
index d3b6d37..9da7e0f 100644
--- a/tests/src/com/android/launcher3/celllayout/ReorderWidgets.java
+++ b/tests/src/com/android/launcher3/celllayout/ReorderWidgets.java
@@ -145,28 +145,26 @@
runTestCase(testCaseMap.get(iconGridDimensions));
}
- @Ignore //b/261178121
@Test
- public void simpleReorder() throws ExecutionException, InterruptedException {
+ public void simpleReorder() throws ExecutionException, InterruptedException {
runTestCaseMap(SimpleReorderCase.TEST_BY_GRID_SIZE,
SimpleReorderCase.class.getSimpleName());
}
- @Ignore //b/261178121
+ @Ignore
@Test
- public void pushTest() throws ExecutionException, InterruptedException {
+ public void pushTest() throws ExecutionException, InterruptedException {
runTestCaseMap(PushReorderCase.TEST_BY_GRID_SIZE, PushReorderCase.class.getSimpleName());
}
- @Ignore //b/261178121
+ @Ignore
@Test
- public void fullReorder() throws ExecutionException, InterruptedException {
+ public void fullReorder() throws ExecutionException, InterruptedException {
runTestCaseMap(FullReorderCase.TEST_BY_GRID_SIZE, FullReorderCase.class.getSimpleName());
}
- @Ignore //b/261178121
@Test
- public void moveOutReorder() throws ExecutionException, InterruptedException {
+ public void moveOutReorder() throws ExecutionException, InterruptedException {
runTestCaseMap(MoveOutReorderCase.TEST_BY_GRID_SIZE,
MoveOutReorderCase.class.getSimpleName());
}
diff --git a/tests/src/com/android/launcher3/celllayout/testcases/FullReorderCase.java b/tests/src/com/android/launcher3/celllayout/testcases/FullReorderCase.java
index a98882c..d68d2ed 100644
--- a/tests/src/com/android/launcher3/celllayout/testcases/FullReorderCase.java
+++ b/tests/src/com/android/launcher3/celllayout/testcases/FullReorderCase.java
@@ -81,8 +81,29 @@
MOVE_TO_4x4,
END_BOARD_STR_4x4);
+ /** 4x4 Test
+ **/
+ private static final String START_BOARD_STR_4x5 = ""
+ + "xxxx\n"
+ + "22mm\n"
+ + "iimm\n"
+ + "ii11\n"
+ + "ii11";
+ private static final Point MOVE_TO_4x5 = new Point(0, 3);
+ private static final String END_BOARD_STR_4x5 = ""
+ + "xxxx\n"
+ + "22ii\n"
+ + "mmii\n"
+ + "mm11\n"
+ + "ii11";
+
+ private static final ReorderTestCase TEST_CASE_4x5 = new ReorderTestCase(START_BOARD_STR_4x5,
+ MOVE_TO_4x5,
+ END_BOARD_STR_4x5);
+
public static final Map<Point, ReorderTestCase> TEST_BY_GRID_SIZE =
Map.of(new Point(5, 5), TEST_CASE_5x5,
new Point(6, 5), TEST_CASE_6x5,
- new Point(4, 4), TEST_CASE_4x4);
+ new Point(4, 4), TEST_CASE_4x4,
+ new Point(4, 5), TEST_CASE_4x5);
}
diff --git a/tests/src/com/android/launcher3/model/GridSizeMigrationUtilTest.kt b/tests/src/com/android/launcher3/model/GridSizeMigrationUtilTest.kt
index 85d7bf9..76a186b 100644
--- a/tests/src/com/android/launcher3/model/GridSizeMigrationUtilTest.kt
+++ b/tests/src/com/android/launcher3/model/GridSizeMigrationUtilTest.kt
@@ -17,6 +17,7 @@
import android.content.Context
import android.content.Intent
+import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase
import android.graphics.Point
import android.os.Process
@@ -183,15 +184,232 @@
// Expected dest grid icons
// _ _ _ _
// 5 6 7 8
- // 9 _ 10_
+ // 9 _ _ _
// _ _ _ _
- assertThat(locMap.size.toLong()).isEqualTo(6)
+ assertThat(locMap.size.toLong()).isEqualTo(5)
assertThat(locMap[testPackage5]).isEqualTo(Point(0, 1))
assertThat(locMap[testPackage6]).isEqualTo(Point(1, 1))
assertThat(locMap[testPackage7]).isEqualTo(Point(2, 1))
assertThat(locMap[testPackage8]).isEqualTo(Point(3, 1))
assertThat(locMap[testPackage9]).isEqualTo(Point(0, 2))
- assertThat(locMap[testPackage10]).isEqualTo(Point(2, 2))
+ }
+
+ /**
+ * Old migration logic, should be modified once [FeatureFlags.ENABLE_NEW_MIGRATION_LOGIC] is
+ * not needed anymore
+ */
+ @Test
+ @Throws(Exception::class)
+ fun testMigrationBackAndForth() {
+ // Hotseat items in grid A
+ // 1 2 _ 3 4
+ modelHelper.addItem(APP_ICON, 0, HOTSEAT, 0, 0, testPackage1, 1, TMP_CONTENT_URI)
+ modelHelper.addItem(SHORTCUT, 1, HOTSEAT, 0, 0, testPackage2, 2, TMP_CONTENT_URI)
+ modelHelper.addItem(SHORTCUT, 3, HOTSEAT, 0, 0, testPackage3, 3, TMP_CONTENT_URI)
+ modelHelper.addItem(APP_ICON, 4, HOTSEAT, 0, 0, testPackage4, 4, TMP_CONTENT_URI)
+ // Workspace items in grid A
+ // _ _ _ _ _
+ // _ _ _ _ 5
+ // _ _ 6 _ 7
+ // _ _ 8 _ _
+ // _ _ _ _ _
+ modelHelper.addItem(APP_ICON, 0, DESKTOP, 4, 1, testPackage5, 5, TMP_CONTENT_URI)
+ modelHelper.addItem(APP_ICON, 0, DESKTOP, 2, 2, testPackage6, 6, TMP_CONTENT_URI)
+ modelHelper.addItem(APP_ICON, 0, DESKTOP, 4, 2, testPackage7, 7, TMP_CONTENT_URI)
+ modelHelper.addItem(APP_ICON, 0, DESKTOP, 2, 3, testPackage8, 8, TMP_CONTENT_URI)
+
+ // Hotseat items in grid B
+ // 2 _ _ _
+ modelHelper.addItem(SHORTCUT, 0, HOTSEAT, 0, 0, testPackage2)
+ // Workspace items in grid B
+ // _ _ _ _
+ // _ _ _ 10
+ // _ _ _ _
+ // _ _ _ _
+ modelHelper.addItem(APP_ICON, 0, DESKTOP, 1, 3, testPackage10)
+
+ idp.numDatabaseHotseatIcons = 4
+ idp.numColumns = 4
+ idp.numRows = 4
+ val readerGridA = DbReader(db, TMP_TABLE, context, validPackages)
+ val readerGridB = DbReader(db, TABLE_NAME, context, validPackages)
+ // migrate from A -> B
+ GridSizeMigrationUtil.migrate(
+ context,
+ db,
+ readerGridA,
+ readerGridB,
+ idp.numDatabaseHotseatIcons,
+ Point(idp.numColumns, idp.numRows),
+ DeviceGridState(context),
+ DeviceGridState(idp)
+ )
+
+ // Check hotseat items in grid B
+ var c = context.contentResolver.query(
+ CONTENT_URI,
+ arrayOf(SCREEN, INTENT),
+ "container=$CONTAINER_HOTSEAT",
+ null,
+ SCREEN,
+ null
+ ) ?: throw IllegalStateException()
+ // Expected hotseat items in grid B
+ // 2 1 3 4
+ verifyHotseat(c, idp,
+ mutableListOf(testPackage2, testPackage1, testPackage3, testPackage4).toList())
+
+ // Check workspace items in grid B
+ c = context.contentResolver.query(
+ CONTENT_URI,
+ arrayOf(SCREEN, CELLX, CELLY, INTENT),
+ "container=$CONTAINER_DESKTOP",
+ null,
+ null,
+ null
+ ) ?: throw IllegalStateException()
+ var locMap = parseLocMap(context, c)
+ // Expected items in grid B
+ // _ _ _ _
+ // 5 6 7 8
+ // _ _ _ _
+ // _ _ _ _
+ assertThat(locMap.size.toLong()).isEqualTo(4)
+ assertThat(locMap[testPackage5]).isEqualTo(Triple(0, 0, 1))
+ assertThat(locMap[testPackage6]).isEqualTo(Triple(0, 1, 1))
+ assertThat(locMap[testPackage7]).isEqualTo(Triple(0, 2, 1))
+ assertThat(locMap[testPackage8]).isEqualTo(Triple(0, 3, 1))
+
+ // add item in B
+ modelHelper.addItem(APP_ICON, 0, DESKTOP, 0, 2, testPackage9)
+
+ // migrate from B -> A
+ GridSizeMigrationUtil.migrate(
+ context,
+ db,
+ readerGridB,
+ readerGridA,
+ 5,
+ Point(5, 5),
+ DeviceGridState(idp),
+ DeviceGridState(context)
+ )
+ // Check hotseat items in grid A
+ c = context.contentResolver.query(
+ TMP_CONTENT_URI,
+ arrayOf(SCREEN, INTENT),
+ "container=$CONTAINER_HOTSEAT",
+ null,
+ SCREEN,
+ null
+ ) ?: throw IllegalStateException()
+ // Expected hotseat items in grid A
+ // 1 2 _ 3 4
+ verifyHotseat(c, idp, mutableListOf(
+ testPackage1, testPackage2, null, testPackage3, testPackage4).toList())
+
+ // Check workspace items in grid A
+ c = context.contentResolver.query(
+ TMP_CONTENT_URI,
+ arrayOf(SCREEN, CELLX, CELLY, INTENT),
+ "container=$CONTAINER_DESKTOP",
+ null,
+ null,
+ null
+ ) ?: throw IllegalStateException()
+ locMap = parseLocMap(context, c)
+ // Expected workspace items in grid A
+ // _ _ _ _ _
+ // _ _ _ _ 5
+ // 9 _ 6 _ 7
+ // _ _ 8 _ _
+ // _ _ _ _ _
+ assertThat(locMap.size.toLong()).isEqualTo(5)
+ // Verify items that existed in grid A remains in same position
+ assertThat(locMap[testPackage5]).isEqualTo(Triple(0, 4, 1))
+ assertThat(locMap[testPackage6]).isEqualTo(Triple(0, 2, 2))
+ assertThat(locMap[testPackage7]).isEqualTo(Triple(0, 4, 2))
+ assertThat(locMap[testPackage8]).isEqualTo(Triple(0, 2, 3))
+ // Verify items that didn't exist in grid A are added in new screen
+ assertThat(locMap[testPackage9]).isEqualTo(Triple(0, 0, 2))
+
+ // remove item from B
+ modelHelper.deleteItem(7, TMP_TABLE)
+
+ // migrate from A -> B
+ GridSizeMigrationUtil.migrate(
+ context,
+ db,
+ readerGridA,
+ readerGridB,
+ idp.numDatabaseHotseatIcons,
+ Point(idp.numColumns, idp.numRows),
+ DeviceGridState(context),
+ DeviceGridState(idp)
+ )
+
+ // Check hotseat items in grid B
+ c = context.contentResolver.query(
+ CONTENT_URI,
+ arrayOf(SCREEN, INTENT),
+ "container=$CONTAINER_HOTSEAT",
+ null,
+ SCREEN,
+ null
+ ) ?: throw IllegalStateException()
+ // Expected hotseat items in grid B
+ // 2 1 3 4
+ verifyHotseat(c, idp,
+ mutableListOf(testPackage2, testPackage1, testPackage3, testPackage4).toList())
+
+ // Check workspace items in grid B
+ c = context.contentResolver.query(
+ CONTENT_URI,
+ arrayOf(SCREEN, CELLX, CELLY, INTENT),
+ "container=$CONTAINER_DESKTOP",
+ null,
+ null,
+ null
+ ) ?: throw IllegalStateException()
+ locMap = parseLocMap(context, c)
+ // Expected workspace items in grid B
+ // _ _ _ _
+ // 5 6 _ 8
+ // 9 _ _ _
+ // _ _ _ _
+ assertThat(locMap.size.toLong()).isEqualTo(4)
+ assertThat(locMap[testPackage5]).isEqualTo(Triple(0, 0, 1))
+ assertThat(locMap[testPackage6]).isEqualTo(Triple(0, 1, 1))
+ assertThat(locMap[testPackage8]).isEqualTo(Triple(0, 3, 1))
+ assertThat(locMap[testPackage9]).isEqualTo(Triple(0, 0, 2))
+ }
+
+ private fun verifyHotseat(c: Cursor, idp: InvariantDeviceProfile, expected: List<String?>) {
+ assertThat(c.count).isEqualTo(idp.numDatabaseHotseatIcons)
+ val screenIndex = c.getColumnIndex(SCREEN)
+ val intentIndex = c.getColumnIndex(INTENT)
+ expected.forEachIndexed { idx, pkg ->
+ if (pkg == null) return@forEachIndexed
+ c.moveToNext()
+ assertThat(c.getInt(screenIndex).toLong()).isEqualTo(idx)
+ assertThat(c.getString(intentIndex)).contains(pkg)
+ }
+ c.close()
+ }
+
+ private fun parseLocMap(context: Context, c: Cursor): Map<String, Triple<Int, Int, Int>> {
+ // Check workspace items
+ val intentIndex = c.getColumnIndex(INTENT)
+ val screenIndex = c.getColumnIndex(SCREEN)
+ val cellXIndex = c.getColumnIndex(CELLX)
+ val cellYIndex = c.getColumnIndex(CELLY)
+ val locMap = mutableMapOf<String, Triple<Int, Int, Int>>()
+ while (c.moveToNext()) {
+ locMap[Intent.parseUri(c.getString(intentIndex), 0).getPackage()] =
+ Triple(c.getInt(screenIndex), c.getInt(cellXIndex), c.getInt(cellYIndex))
+ }
+ c.close()
+ return locMap.toMap()
}
@Test
diff --git a/tests/src/com/android/launcher3/ui/widget/AddConfigWidgetTest.java b/tests/src/com/android/launcher3/ui/widget/AddConfigWidgetTest.java
index 2c9785c..3f4a1c1 100644
--- a/tests/src/com/android/launcher3/ui/widget/AddConfigWidgetTest.java
+++ b/tests/src/com/android/launcher3/ui/widget/AddConfigWidgetTest.java
@@ -37,6 +37,7 @@
import com.android.launcher3.widget.LauncherAppWidgetProviderInfo;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -64,6 +65,7 @@
mAppWidgetManager = AppWidgetManager.getInstance(mTargetContext);
}
+ @Ignore
@Test
@PortraitLandscape
public void testWidgetConfig() throws Throwable {
diff --git a/tests/src/com/android/launcher3/ui/workspace/ThemeIconsTest.java b/tests/src/com/android/launcher3/ui/workspace/ThemeIconsTest.java
index 93329fa..9d5763b 100644
--- a/tests/src/com/android/launcher3/ui/workspace/ThemeIconsTest.java
+++ b/tests/src/com/android/launcher3/ui/workspace/ThemeIconsTest.java
@@ -38,6 +38,7 @@
import com.android.launcher3.util.Executors;
import com.android.launcher3.util.rule.ScreenRecordRule.ScreenRecord;
+import org.junit.Ignore;
import org.junit.Test;
import java.util.ArrayDeque;
@@ -110,6 +111,7 @@
}
}
+ @Ignore
@Test
@ScreenRecord // b/260722220
public void testShortcutIconWithTheme() throws Exception {
diff --git a/tests/src/com/android/launcher3/util/LauncherModelHelper.java b/tests/src/com/android/launcher3/util/LauncherModelHelper.java
index e7e551f..93bf312 100644
--- a/tests/src/com/android/launcher3/util/LauncherModelHelper.java
+++ b/tests/src/com/android/launcher3/util/LauncherModelHelper.java
@@ -362,6 +362,12 @@
sandboxContext.getContentResolver().insert(contentUri, values);
}
+ public void deleteItem(int itemId, @NonNull final String tableName) {
+ final Uri uri = Uri.parse("content://"
+ + LauncherProvider.AUTHORITY + "/" + tableName + "/" + itemId);
+ sandboxContext.getContentResolver().delete(uri, null, null);
+ }
+
public int[][][] createGrid(int[][][] typeArray) {
return createGrid(typeArray, 1);
}
diff --git a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java
index c3ea14a..fcff3fa 100644
--- a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java
+++ b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java
@@ -827,7 +827,11 @@
waitUntilLauncherObjectGone(APPS_RES_ID);
waitUntilLauncherObjectGone(WORKSPACE_RES_ID);
waitUntilLauncherObjectGone(WIDGETS_RES_ID);
- waitUntilSystemLauncherObjectGone(TASKBAR_RES_ID);
+ if (isTablet()) {
+ waitForSystemLauncherObject(TASKBAR_RES_ID);
+ } else {
+ waitUntilSystemLauncherObjectGone(TASKBAR_RES_ID);
+ }
waitUntilSystemLauncherObjectGone(SPLIT_PLACEHOLDER_RES_ID);
return waitForSystemLauncherObject(OVERVIEW_RES_ID);
@@ -836,7 +840,11 @@
waitUntilLauncherObjectGone(APPS_RES_ID);
waitUntilLauncherObjectGone(WORKSPACE_RES_ID);
waitUntilLauncherObjectGone(WIDGETS_RES_ID);
- waitUntilSystemLauncherObjectGone(TASKBAR_RES_ID);
+ if (isTablet()) {
+ waitForSystemLauncherObject(TASKBAR_RES_ID);
+ } else {
+ waitUntilSystemLauncherObjectGone(TASKBAR_RES_ID);
+ }
waitForSystemLauncherObject(SPLIT_PLACEHOLDER_RES_ID);
return waitForSystemLauncherObject(OVERVIEW_RES_ID);
diff --git a/tests/tapl/com/android/launcher3/tapl/SearchResultFromQsb.java b/tests/tapl/com/android/launcher3/tapl/SearchResultFromQsb.java
index bddb593..80e4116 100644
--- a/tests/tapl/com/android/launcher3/tapl/SearchResultFromQsb.java
+++ b/tests/tapl/com/android/launcher3/tapl/SearchResultFromQsb.java
@@ -55,7 +55,7 @@
}
/** Find the web suggestion from search suggestion's title text */
- public void findWebSuggest(String text) {
+ public void verifyWebSuggestIsPresent(String text) {
ArrayList<UiObject2> goldenGateResults =
new ArrayList<>(mLauncher.waitForObjectsInContainer(
mLauncher.waitForSystemLauncherObject(SEARCH_CONTAINER_RES_ID),