Snap for 13264465 from 44552dc98fc15eef89dce94290c45887462d7dfa to 25Q2-release
Change-Id: I8d341b11943f415bf62f7078a856633cd1055ab4
diff --git a/quickstep/res/values-as/strings.xml b/quickstep/res/values-as/strings.xml
index 0f8126b..0a5241b 100644
--- a/quickstep/res/values-as/strings.xml
+++ b/quickstep/res/values-as/strings.xml
@@ -146,10 +146,8 @@
<string name="quick_switch_desktop" msgid="8393802056024499749">"ডেস্কটপ"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> আৰু <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>টাৰ ভিতৰত <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>তম বস্তু"</string>
- <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
- <skip />
- <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
- <skip />
+ <string name="quick_switch_scroll_arrow_left" msgid="6527033155534184309">"বাওঁফাললৈ স্ক্ৰ’ল কৰক"</string>
+ <string name="quick_switch_scroll_arrow_right" msgid="7319779291086916348">"সোঁফাললৈ স্ক্ৰ’ল কৰক"</string>
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"বাবল"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"অ’ভাৰফ্ল’"</string>
<string name="bubble_bar_bubble_description" msgid="1882466152448446446">"<xliff:g id="APP_NAME">%2$s</xliff:g>ৰ পৰা <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
diff --git a/quickstep/res/values-b+sr+Latn/strings.xml b/quickstep/res/values-b+sr+Latn/strings.xml
index 8b60c14..12ae5e7 100644
--- a/quickstep/res/values-b+sr+Latn/strings.xml
+++ b/quickstep/res/values-b+sr+Latn/strings.xml
@@ -146,10 +146,8 @@
<string name="quick_switch_desktop" msgid="8393802056024499749">"Računar"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> i <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, stavka <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> od <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
- <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
- <skip />
- <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
- <skip />
+ <string name="quick_switch_scroll_arrow_left" msgid="6527033155534184309">"Skrolujte ulevo"</string>
+ <string name="quick_switch_scroll_arrow_right" msgid="7319779291086916348">"Skrolujte udesno"</string>
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Oblačić"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Preklopni"</string>
<string name="bubble_bar_bubble_description" msgid="1882466152448446446">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> – <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
diff --git a/quickstep/res/values-be/strings.xml b/quickstep/res/values-be/strings.xml
index f0d4ee4..c1e9b29 100644
--- a/quickstep/res/values-be/strings.xml
+++ b/quickstep/res/values-be/strings.xml
@@ -146,10 +146,8 @@
<string name="quick_switch_desktop" msgid="8393802056024499749">"Працоўны стол"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> і <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, элемент <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> з <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
- <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
- <skip />
- <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
- <skip />
+ <string name="quick_switch_scroll_arrow_left" msgid="6527033155534184309">"Прагартаць улева"</string>
+ <string name="quick_switch_scroll_arrow_right" msgid="7319779291086916348">"Прагартаць управа"</string>
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Бурбалкі"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Меню з пашырэннем"</string>
<string name="bubble_bar_bubble_description" msgid="1882466152448446446">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>, крыніца: <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
diff --git a/quickstep/res/values-es-rUS/strings.xml b/quickstep/res/values-es-rUS/strings.xml
index 703c434..903a04d 100644
--- a/quickstep/res/values-es-rUS/strings.xml
+++ b/quickstep/res/values-es-rUS/strings.xml
@@ -146,10 +146,8 @@
<string name="quick_switch_desktop" msgid="8393802056024499749">"Escritorio"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> y <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, elemento <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> de <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
- <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
- <skip />
- <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
- <skip />
+ <string name="quick_switch_scroll_arrow_left" msgid="6527033155534184309">"Desplazarse hacia la izquierda"</string>
+ <string name="quick_switch_scroll_arrow_right" msgid="7319779291086916348">"Desplazarse hacia la derecha"</string>
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Burbuja"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Ampliada"</string>
<string name="bubble_bar_bubble_description" msgid="1882466152448446446">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
diff --git a/quickstep/res/values-hu/strings.xml b/quickstep/res/values-hu/strings.xml
index 6584eaf..b38dddd 100644
--- a/quickstep/res/values-hu/strings.xml
+++ b/quickstep/res/values-hu/strings.xml
@@ -146,10 +146,8 @@
<string name="quick_switch_desktop" msgid="8393802056024499749">"Asztali"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> és <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>. elem, összesen ennyiből: <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
- <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
- <skip />
- <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
- <skip />
+ <string name="quick_switch_scroll_arrow_left" msgid="6527033155534184309">"Görgetés balra"</string>
+ <string name="quick_switch_scroll_arrow_right" msgid="7319779291086916348">"Görgetés jobbra"</string>
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Buborék"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Túlcsordulás"</string>
<string name="bubble_bar_bubble_description" msgid="1882466152448446446">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>, forrás: <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
diff --git a/quickstep/res/values-it/strings.xml b/quickstep/res/values-it/strings.xml
index 00529b7..8a08dcf 100644
--- a/quickstep/res/values-it/strings.xml
+++ b/quickstep/res/values-it/strings.xml
@@ -146,10 +146,8 @@
<string name="quick_switch_desktop" msgid="8393802056024499749">"Desktop"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> e <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, elemento <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> di <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
- <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
- <skip />
- <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
- <skip />
+ <string name="quick_switch_scroll_arrow_left" msgid="6527033155534184309">"Scorri verso sinistra"</string>
+ <string name="quick_switch_scroll_arrow_right" msgid="7319779291086916348">"Scorri verso destra"</string>
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Fumetto"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Extra"</string>
<string name="bubble_bar_bubble_description" msgid="1882466152448446446">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> da <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
diff --git a/quickstep/res/values-ja/strings.xml b/quickstep/res/values-ja/strings.xml
index 596e104..8f44ee7 100644
--- a/quickstep/res/values-ja/strings.xml
+++ b/quickstep/res/values-ja/strings.xml
@@ -146,10 +146,8 @@
<string name="quick_switch_desktop" msgid="8393802056024499749">"デスクトップ"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> と <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>、アイテム <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>/<xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
- <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
- <skip />
- <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
- <skip />
+ <string name="quick_switch_scroll_arrow_left" msgid="6527033155534184309">"左へスクロール"</string>
+ <string name="quick_switch_scroll_arrow_right" msgid="7319779291086916348">"右へスクロール"</string>
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"ふきだし"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"オーバーフロー"</string>
<string name="bubble_bar_bubble_description" msgid="1882466152448446446">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>(<xliff:g id="APP_NAME">%2$s</xliff:g>)"</string>
diff --git a/quickstep/res/values-ka/strings.xml b/quickstep/res/values-ka/strings.xml
index ac46836..6294cbd 100644
--- a/quickstep/res/values-ka/strings.xml
+++ b/quickstep/res/values-ka/strings.xml
@@ -146,10 +146,8 @@
<string name="quick_switch_desktop" msgid="8393802056024499749">"დესკტოპი"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> და <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>-ე ერთეული <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>-დან"</string>
- <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
- <skip />
- <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
- <skip />
+ <string name="quick_switch_scroll_arrow_left" msgid="6527033155534184309">"მარცხნივ გადაადგილება"</string>
+ <string name="quick_switch_scroll_arrow_right" msgid="7319779291086916348">"მარჯვნივ გადაადგილება"</string>
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"ბუშტი"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"გადავსება"</string>
<string name="bubble_bar_bubble_description" msgid="1882466152448446446">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>: <xliff:g id="APP_NAME">%2$s</xliff:g>-იდან"</string>
diff --git a/quickstep/res/values-km/strings.xml b/quickstep/res/values-km/strings.xml
index 799bcda..f1772af 100644
--- a/quickstep/res/values-km/strings.xml
+++ b/quickstep/res/values-km/strings.xml
@@ -146,10 +146,8 @@
<string name="quick_switch_desktop" msgid="8393802056024499749">"អេក្រង់ដើម"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> និង <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g> ធាតុទី <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> នៃ <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
- <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
- <skip />
- <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
- <skip />
+ <string name="quick_switch_scroll_arrow_left" msgid="6527033155534184309">"រំកិលទៅឆ្វេង"</string>
+ <string name="quick_switch_scroll_arrow_right" msgid="7319779291086916348">"រំកិលទៅស្ដាំ"</string>
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"ផ្ទាំងសារ"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"ម៉ឺនុយបន្ថែម"</string>
<string name="bubble_bar_bubble_description" msgid="1882466152448446446">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ពី <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
diff --git a/quickstep/res/values-kn/strings.xml b/quickstep/res/values-kn/strings.xml
index c88aed2..5f6734b 100644
--- a/quickstep/res/values-kn/strings.xml
+++ b/quickstep/res/values-kn/strings.xml
@@ -146,10 +146,8 @@
<string name="quick_switch_desktop" msgid="8393802056024499749">"ಡೆಸ್ಕ್ಟಾಪ್"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> ಮತ್ತು <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="TOTAL_TASKS">%3$d</xliff:g> ರಲ್ಲಿ <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> ಐಟಂ"</string>
- <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
- <skip />
- <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
- <skip />
+ <string name="quick_switch_scroll_arrow_left" msgid="6527033155534184309">"ಎಡಕ್ಕೆ ಸ್ಕ್ರಾಲ್ ಮಾಡಿ"</string>
+ <string name="quick_switch_scroll_arrow_right" msgid="7319779291086916348">"ಬಲಕ್ಕೆ ಸ್ಕ್ರಾಲ್ ಮಾಡಿ"</string>
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"ಬಬಲ್"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"ಓವರ್ಫ್ಲೋ"</string>
<string name="bubble_bar_bubble_description" msgid="1882466152448446446">"<xliff:g id="APP_NAME">%2$s</xliff:g> ನಿಂದ <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
diff --git a/quickstep/res/values-ky/strings.xml b/quickstep/res/values-ky/strings.xml
index 049da10..1d740b0 100644
--- a/quickstep/res/values-ky/strings.xml
+++ b/quickstep/res/values-ky/strings.xml
@@ -164,5 +164,5 @@
<string name="header_default_app_title" msgid="8308052350689531566">"Колдонмонун аталышы"</string>
<string name="header_close_icon_description" msgid="5400033616675911319">"Жабуу баскычы"</string>
<string name="pin_to_taskbar" msgid="6607778046321626950">"Тапшырмалар панелине кадоо"</string>
- <string name="unpin_from_taskbar" msgid="2178811773165572676">"Тапшырмалар панелинен алып коюу"</string>
+ <string name="unpin_from_taskbar" msgid="2178811773165572676">"Тапшырмалар панелинен алуу"</string>
</resources>
diff --git a/quickstep/res/values-lo/strings.xml b/quickstep/res/values-lo/strings.xml
index 9eb169a..0539e1f 100644
--- a/quickstep/res/values-lo/strings.xml
+++ b/quickstep/res/values-lo/strings.xml
@@ -146,10 +146,8 @@
<string name="quick_switch_desktop" msgid="8393802056024499749">"ເດັສທັອບ"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> ແລະ <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, ລາຍການທີ <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> ຈາກທັງໝົດ <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
- <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
- <skip />
- <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
- <skip />
+ <string name="quick_switch_scroll_arrow_left" msgid="6527033155534184309">"ເລື່ອນໄປທາງຊ້າຍ"</string>
+ <string name="quick_switch_scroll_arrow_right" msgid="7319779291086916348">"ເລື່ອນໄປທາງຂວາ"</string>
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"ຟອງ"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"ລາຍການເພີ່ມເຕີມ"</string>
<string name="bubble_bar_bubble_description" msgid="1882466152448446446">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> ຈາກ <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
diff --git a/quickstep/res/values-lt/strings.xml b/quickstep/res/values-lt/strings.xml
index 2cbdc8e..dbc5649 100644
--- a/quickstep/res/values-lt/strings.xml
+++ b/quickstep/res/values-lt/strings.xml
@@ -146,10 +146,8 @@
<string name="quick_switch_desktop" msgid="8393802056024499749">"Stalinis kompiuteris"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"„<xliff:g id="APP_NAME_1">%1$s</xliff:g>“ ir „<xliff:g id="APP_NAME_2">%2$s</xliff:g>“"</string>
<string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> element. iš <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
- <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
- <skip />
- <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
- <skip />
+ <string name="quick_switch_scroll_arrow_left" msgid="6527033155534184309">"Slinkti kairėn"</string>
+ <string name="quick_switch_scroll_arrow_right" msgid="7319779291086916348">"Slinkti dešinėn"</string>
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Burbulas"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Perpildymas"</string>
<string name="bubble_bar_bubble_description" msgid="1882466152448446446">"„<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>“ iš „<xliff:g id="APP_NAME">%2$s</xliff:g>“"</string>
diff --git a/quickstep/res/values-ml/strings.xml b/quickstep/res/values-ml/strings.xml
index 099e000..73c795b 100644
--- a/quickstep/res/values-ml/strings.xml
+++ b/quickstep/res/values-ml/strings.xml
@@ -146,10 +146,8 @@
<string name="quick_switch_desktop" msgid="8393802056024499749">"ഡെസ്ക്ടോപ്പ്"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g>, <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>-ൽ <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>-ാമത്തെ ഇനം"</string>
- <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
- <skip />
- <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
- <skip />
+ <string name="quick_switch_scroll_arrow_left" msgid="6527033155534184309">"ഇടത്തേക്ക് സ്ക്രോൾ ചെയ്യുക"</string>
+ <string name="quick_switch_scroll_arrow_right" msgid="7319779291086916348">"വലത്തേക്ക് സ്ക്രോൾ ചെയ്യുക"</string>
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"ബബിൾ"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"ഓവർഫ്ലോ"</string>
<string name="bubble_bar_bubble_description" msgid="1882466152448446446">"<xliff:g id="APP_NAME">%2$s</xliff:g> എന്നതിൽ നിന്നുള്ള <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
diff --git a/quickstep/res/values-mr/strings.xml b/quickstep/res/values-mr/strings.xml
index 5aa9dfc..ef44bb2 100644
--- a/quickstep/res/values-mr/strings.xml
+++ b/quickstep/res/values-mr/strings.xml
@@ -146,10 +146,8 @@
<string name="quick_switch_desktop" msgid="8393802056024499749">"डेस्कटॉप"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> आणि <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="TOTAL_TASKS">%3$d</xliff:g> पैकी <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> आयटम"</string>
- <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
- <skip />
- <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
- <skip />
+ <string name="quick_switch_scroll_arrow_left" msgid="6527033155534184309">"डावीकडे स्क्रोल करा"</string>
+ <string name="quick_switch_scroll_arrow_right" msgid="7319779291086916348">"उजवीकडे स्क्रोल करा"</string>
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"बबल"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"ओव्हरफ्लो"</string>
<string name="bubble_bar_bubble_description" msgid="1882466152448446446">"<xliff:g id="APP_NAME">%2$s</xliff:g> वरील <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
diff --git a/quickstep/res/values-ms/strings.xml b/quickstep/res/values-ms/strings.xml
index a633bf4..1007b55 100644
--- a/quickstep/res/values-ms/strings.xml
+++ b/quickstep/res/values-ms/strings.xml
@@ -146,10 +146,8 @@
<string name="quick_switch_desktop" msgid="8393802056024499749">"Desktop"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> dan <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> item daripada <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
- <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
- <skip />
- <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
- <skip />
+ <string name="quick_switch_scroll_arrow_left" msgid="6527033155534184309">"Tatal ke kiri"</string>
+ <string name="quick_switch_scroll_arrow_right" msgid="7319779291086916348">"Tatal ke kanan"</string>
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Gelembung"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Limpahan"</string>
<string name="bubble_bar_bubble_description" msgid="1882466152448446446">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> daripada <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
diff --git a/quickstep/res/values-ne/strings.xml b/quickstep/res/values-ne/strings.xml
index 91c6bba..fece2a8 100644
--- a/quickstep/res/values-ne/strings.xml
+++ b/quickstep/res/values-ne/strings.xml
@@ -146,10 +146,8 @@
<string name="quick_switch_desktop" msgid="8393802056024499749">"डेस्कटप"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> र <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="TOTAL_TASKS">%3$d</xliff:g> मध्ये <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> औँ वस्तु"</string>
- <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
- <skip />
- <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
- <skip />
+ <string name="quick_switch_scroll_arrow_left" msgid="6527033155534184309">"बायाँतिर स्क्रोल गर्नुहोस्"</string>
+ <string name="quick_switch_scroll_arrow_right" msgid="7319779291086916348">"दायाँतिर स्क्रोल गर्नुहोस्"</string>
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"बबल"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"ओभरफ्लो"</string>
<string name="bubble_bar_bubble_description" msgid="1882466152448446446">"<xliff:g id="APP_NAME">%2$s</xliff:g> मा देखाइएका <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
diff --git a/quickstep/res/values-nl/strings.xml b/quickstep/res/values-nl/strings.xml
index 9e49f13..a8dbb87 100644
--- a/quickstep/res/values-nl/strings.xml
+++ b/quickstep/res/values-nl/strings.xml
@@ -146,10 +146,8 @@
<string name="quick_switch_desktop" msgid="8393802056024499749">"Desktop"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> en <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, item <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> van <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
- <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
- <skip />
- <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
- <skip />
+ <string name="quick_switch_scroll_arrow_left" msgid="6527033155534184309">"Naar links scrollen"</string>
+ <string name="quick_switch_scroll_arrow_right" msgid="7319779291086916348">"Naar rechts scrollen"</string>
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Bubbel"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Overloop"</string>
<string name="bubble_bar_bubble_description" msgid="1882466152448446446">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> van <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
diff --git a/quickstep/res/values-pt/strings.xml b/quickstep/res/values-pt/strings.xml
index 92fed63..e4c3cf1 100644
--- a/quickstep/res/values-pt/strings.xml
+++ b/quickstep/res/values-pt/strings.xml
@@ -146,10 +146,8 @@
<string name="quick_switch_desktop" msgid="8393802056024499749">"Computador"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> e <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, item <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> de <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
- <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
- <skip />
- <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
- <skip />
+ <string name="quick_switch_scroll_arrow_left" msgid="6527033155534184309">"Rolar para a esquerda"</string>
+ <string name="quick_switch_scroll_arrow_right" msgid="7319779291086916348">"Rolar para a direita"</string>
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Balão"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Balão flutuante"</string>
<string name="bubble_bar_bubble_description" msgid="1882466152448446446">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> do app <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
diff --git a/quickstep/res/values-si/strings.xml b/quickstep/res/values-si/strings.xml
index d413b0d..2030252 100644
--- a/quickstep/res/values-si/strings.xml
+++ b/quickstep/res/values-si/strings.xml
@@ -146,10 +146,8 @@
<string name="quick_switch_desktop" msgid="8393802056024499749">"ඩෙස්ක්ටොපය"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> සහ <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, අයිතම <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>න් <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>"</string>
- <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
- <skip />
- <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
- <skip />
+ <string name="quick_switch_scroll_arrow_left" msgid="6527033155534184309">"වමට අනුචලනය කරන්න"</string>
+ <string name="quick_switch_scroll_arrow_right" msgid="7319779291086916348">"දකුණට අනුචලනය කරන්න"</string>
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"බුබුළු"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"පිටාර යාම"</string>
<string name="bubble_bar_bubble_description" msgid="1882466152448446446">"<xliff:g id="APP_NAME">%2$s</xliff:g> සිට <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
diff --git a/quickstep/res/values-sl/strings.xml b/quickstep/res/values-sl/strings.xml
index 1f87e65..fd7dc69 100644
--- a/quickstep/res/values-sl/strings.xml
+++ b/quickstep/res/values-sl/strings.xml
@@ -146,10 +146,8 @@
<string name="quick_switch_desktop" msgid="8393802056024499749">"Namizni računalnik"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> in <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, element <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> od <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
- <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
- <skip />
- <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
- <skip />
+ <string name="quick_switch_scroll_arrow_left" msgid="6527033155534184309">"Pomik levo"</string>
+ <string name="quick_switch_scroll_arrow_right" msgid="7319779291086916348">"Pomik desno"</string>
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Oblaček"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Oblaček z dodatnimi elementi"</string>
<string name="bubble_bar_bubble_description" msgid="1882466152448446446">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> iz aplikacije <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
diff --git a/quickstep/res/values-sr/strings.xml b/quickstep/res/values-sr/strings.xml
index 4e32155..345fc27 100644
--- a/quickstep/res/values-sr/strings.xml
+++ b/quickstep/res/values-sr/strings.xml
@@ -146,10 +146,8 @@
<string name="quick_switch_desktop" msgid="8393802056024499749">"Рачунар"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> и <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, ставка <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> од <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
- <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
- <skip />
- <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
- <skip />
+ <string name="quick_switch_scroll_arrow_left" msgid="6527033155534184309">"Скролујте улево"</string>
+ <string name="quick_switch_scroll_arrow_right" msgid="7319779291086916348">"Скролујте удесно"</string>
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Облачић"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Преклопни"</string>
<string name="bubble_bar_bubble_description" msgid="1882466152448446446">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> – <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
diff --git a/quickstep/res/values-te/strings.xml b/quickstep/res/values-te/strings.xml
index 5ab198e..7bd92dd 100644
--- a/quickstep/res/values-te/strings.xml
+++ b/quickstep/res/values-te/strings.xml
@@ -146,10 +146,8 @@
<string name="quick_switch_desktop" msgid="8393802056024499749">"డెస్క్టాప్"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g>, <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>లో <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>వ ఐటెమ్"</string>
- <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
- <skip />
- <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
- <skip />
+ <string name="quick_switch_scroll_arrow_left" msgid="6527033155534184309">"ఎడమవైపునకు స్క్రోల్ చేయండి"</string>
+ <string name="quick_switch_scroll_arrow_right" msgid="7319779291086916348">"కుడివైపునకు స్క్రోల్ చేయండి"</string>
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"బబుల్"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"ఓవర్ఫ్లో"</string>
<string name="bubble_bar_bubble_description" msgid="1882466152448446446">"<xliff:g id="APP_NAME">%2$s</xliff:g> నుండి <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
diff --git a/quickstep/res/values-th/strings.xml b/quickstep/res/values-th/strings.xml
index 9838003..a18a89f 100644
--- a/quickstep/res/values-th/strings.xml
+++ b/quickstep/res/values-th/strings.xml
@@ -146,10 +146,8 @@
<string name="quick_switch_desktop" msgid="8393802056024499749">"เดสก์ท็อป"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> และ <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, รายการที่ <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> จาก <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
- <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
- <skip />
- <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
- <skip />
+ <string name="quick_switch_scroll_arrow_left" msgid="6527033155534184309">"เลื่อนไปทางซ้าย"</string>
+ <string name="quick_switch_scroll_arrow_right" msgid="7319779291086916348">"เลื่อนไปทางขวา"</string>
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"บับเบิล"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"การดำเนินการเพิ่มเติม"</string>
<string name="bubble_bar_bubble_description" msgid="1882466152448446446">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> จาก <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
diff --git a/quickstep/res/values-tl/strings.xml b/quickstep/res/values-tl/strings.xml
index 52619b9..3551578 100644
--- a/quickstep/res/values-tl/strings.xml
+++ b/quickstep/res/values-tl/strings.xml
@@ -146,10 +146,8 @@
<string name="quick_switch_desktop" msgid="8393802056024499749">"Desktop"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> at <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, item <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> ng <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
- <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
- <skip />
- <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
- <skip />
+ <string name="quick_switch_scroll_arrow_left" msgid="6527033155534184309">"Mag-scroll pakaliwa"</string>
+ <string name="quick_switch_scroll_arrow_right" msgid="7319779291086916348">"Mag-scroll pakanan"</string>
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Bubble"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Overflow"</string>
<string name="bubble_bar_bubble_description" msgid="1882466152448446446">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> mula sa <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
diff --git a/quickstep/res/values-ur/strings.xml b/quickstep/res/values-ur/strings.xml
index a5508d4..8c44ef7 100644
--- a/quickstep/res/values-ur/strings.xml
+++ b/quickstep/res/values-ur/strings.xml
@@ -146,10 +146,8 @@
<string name="quick_switch_desktop" msgid="8393802056024499749">"ڈیسک ٹاپ"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> اور <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>، آئٹم <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> از <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
- <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
- <skip />
- <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
- <skip />
+ <string name="quick_switch_scroll_arrow_left" msgid="6527033155534184309">"بائیں طرف اسکرول کریں"</string>
+ <string name="quick_switch_scroll_arrow_right" msgid="7319779291086916348">"دائیں طرف اسکرول کریں"</string>
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"ببل"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"اوورفلو"</string>
<string name="bubble_bar_bubble_description" msgid="1882466152448446446">"<xliff:g id="APP_NAME">%2$s</xliff:g> سے <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
diff --git a/quickstep/src/com/android/launcher3/dagger/Modules.kt b/quickstep/src/com/android/launcher3/dagger/Modules.kt
index 7671a82..9723b42 100644
--- a/quickstep/src/com/android/launcher3/dagger/Modules.kt
+++ b/quickstep/src/com/android/launcher3/dagger/Modules.kt
@@ -21,8 +21,10 @@
import com.android.launcher3.uioverrides.plugins.PluginManagerWrapperImpl
import com.android.launcher3.util.ApiWrapper
import com.android.launcher3.util.PluginManagerWrapper
+import com.android.launcher3.util.window.RefreshRateTracker
import com.android.launcher3.util.window.WindowManagerProxy
import com.android.launcher3.widget.LauncherWidgetHolder.WidgetHolderFactory
+import com.android.quickstep.util.ChoreographerFrameRateTracker
import com.android.quickstep.util.GestureExclusionManager
import com.android.quickstep.util.SystemWindowManagerProxy
import dagger.Binds
@@ -60,4 +62,8 @@
@Provides
@JvmStatic
fun provideGestureExclusionManager(): GestureExclusionManager = GestureExclusionManager.INSTANCE
+
+ @Provides
+ @JvmStatic
+ fun provideRefreshRateTracker(): RefreshRateTracker = ChoreographerFrameRateTracker
}
diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
index 605fd31..69966cc 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
@@ -86,7 +86,6 @@
import android.os.UserHandle;
import android.text.TextUtils;
import android.util.AttributeSet;
-import android.util.Log;
import android.view.Display;
import android.view.HapticFeedbackConstants;
import android.view.KeyEvent;
@@ -225,7 +224,6 @@
public class QuickstepLauncher extends Launcher implements RecentsViewContainer,
SystemShortcut.BubbleActivityStarter {
- private static final String TAG = "QuickstepLauncher";
private static final boolean TRACE_LAYOUTS =
SystemProperties.getBoolean("persist.debug.trace_layouts", false);
private static final String TRACE_RELAYOUT_CLASS =
@@ -562,35 +560,20 @@
@Override
public void onDestroy() {
- // wrap non-trivial clean up blocks in try-catch to avoid stopping clean up of rest of
- // objects
-
if (mAppTransitionManager != null) {
- try {
- mAppTransitionManager.onActivityDestroyed();
- } catch (Exception e) {
- Log.e(TAG, "Failed to destroy mAppTransitionManager", e);
- }
+ mAppTransitionManager.onActivityDestroyed();
}
mAppTransitionManager = null;
mIsPredictiveBackToHomeInProgress = false;
if (mUnfoldTransitionProgressProvider != null) {
- try {
- SystemUiProxy.INSTANCE.get(this).setUnfoldAnimationListener(null);
- mUnfoldTransitionProgressProvider.destroy();
- } catch (Exception e) {
- Log.e(TAG, "Failed to destroy mUnfoldTransitionProgressProvider", e);
- }
+ SystemUiProxy.INSTANCE.get(this).setUnfoldAnimationListener(null);
+ mUnfoldTransitionProgressProvider.destroy();
}
OverviewComponentObserver.INSTANCE.get(this)
.removeOverviewChangeListener(mOverviewChangeListener);
- try {
- mTISBindHelper.onDestroy();
- } catch (Exception e) {
- Log.e(TAG, "Failed to destroy mTISBindHelper", e);
- }
+ mTISBindHelper.onDestroy();
if (mLauncherUnfoldAnimationController != null) {
mLauncherUnfoldAnimationController.onDestroy();
@@ -600,22 +583,15 @@
mSplitSelectStateController.onDestroy();
}
- try {
- RecentsView recentsView = getOverviewPanel();
- if (recentsView != null) {
- recentsView.destroy();
- }
- } catch (Exception e) {
- Log.e(TAG, "Failed to destroy RecentsView", e);
+ RecentsView recentsView = getOverviewPanel();
+ if (recentsView != null) {
+ recentsView.destroy();
}
- try {
- super.onDestroy();
- } finally { // trivial close operations in finally.
- mHotseatPredictionController.destroy();
- if (mViewCapture != null) mViewCapture.close();
- removeBackAnimationCallback(mSplitSelectStateController.getSplitBackHandler());
- }
+ super.onDestroy();
+ mHotseatPredictionController.destroy();
+ if (mViewCapture != null) mViewCapture.close();
+ removeBackAnimationCallback(mSplitSelectStateController.getSplitBackHandler());
}
@Override
diff --git a/quickstep/src/com/android/launcher3/uioverrides/states/OverviewState.java b/quickstep/src/com/android/launcher3/uioverrides/states/OverviewState.java
index 3170df9..c774143 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/states/OverviewState.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/states/OverviewState.java
@@ -22,7 +22,6 @@
import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_OVERVIEW;
import android.content.Context;
-import android.graphics.Color;
import android.graphics.Rect;
import android.os.SystemProperties;
@@ -162,7 +161,7 @@
@Override
public int getWorkspaceScrimColor(Launcher launcher) {
return enableOverviewBackgroundWallpaperBlur() && BlurUtils.supportsBlursOnWindows()
- ? Color.TRANSPARENT
+ ? Themes.getAttrColor(launcher, R.attr.overviewScrimColorOverBlur)
: Themes.getAttrColor(launcher, R.attr.overviewScrimColor);
}
diff --git a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewDismissTouchController.kt b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewDismissTouchController.kt
index eac5235..06e6734 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewDismissTouchController.kt
+++ b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewDismissTouchController.kt
@@ -25,6 +25,7 @@
import com.android.launcher3.R
import com.android.launcher3.Utilities.EDGE_NAV_BAR
import com.android.launcher3.Utilities.boundToRange
+import com.android.launcher3.Utilities.debugLog
import com.android.launcher3.Utilities.isRtl
import com.android.launcher3.Utilities.mapToRange
import com.android.launcher3.touch.SingleAxisSwipeDetector
@@ -70,6 +71,7 @@
// Don't intercept swipes on the nav bar, as user might be trying to go home during a
// task dismiss animation.
(ev.edgeFlags and EDGE_NAV_BAR) != 0 -> {
+ debugLog(TAG, "Not intercepting edge swipe on nav bar.")
false
}
@@ -77,14 +79,23 @@
AbstractFloatingView.getTopOpenViewWithType(
container,
AbstractFloatingView.TYPE_TOUCH_CONTROLLER_NO_INTERCEPT,
- ) != null -> false
-
- // Disable swiping if the task overlay is modal.
- taskViewRecentsTouchContext.isRecentsModal -> {
+ ) != null -> {
+ debugLog(TAG, "Not intercepting, open floating view blocking touch.")
false
}
- else -> taskViewRecentsTouchContext.isRecentsInteractive
+ // Disable swiping if the task overlay is modal.
+ taskViewRecentsTouchContext.isRecentsModal -> {
+ debugLog(TAG, "Not intercepting touch in modal overlay.")
+ false
+ }
+
+ else ->
+ taskViewRecentsTouchContext.isRecentsInteractive.also { isRecentsInteractive ->
+ if (!isRecentsInteractive) {
+ debugLog(TAG, "Not intercepting touch, recents not interactive.")
+ }
+ }
}
override fun onControllerInterceptTouchEvent(ev: MotionEvent): Boolean {
@@ -140,6 +151,7 @@
override fun onDragStart(start: Boolean, startDisplacement: Float) {
if (isBlockedDuringDismissal) return
val taskBeingDragged = taskBeingDragged ?: return
+ debugLog(TAG, "Handling touch event.")
initialDisplacement =
taskBeingDragged.secondaryDismissTranslationProperty.get(taskBeingDragged)
@@ -289,6 +301,8 @@
}
companion object {
+ private const val TAG = "TaskViewDismissTouchController"
+
private const val DISMISS_THRESHOLD_FRACTION = 0.5f
private const val DISMISS_THRESHOLD_HAPTIC_RANGE = 10f
diff --git a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewLaunchTouchController.kt b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewLaunchTouchController.kt
index 8ee552d..fe9cae5 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewLaunchTouchController.kt
+++ b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewLaunchTouchController.kt
@@ -24,6 +24,7 @@
import com.android.launcher3.LauncherAnimUtils
import com.android.launcher3.Utilities.EDGE_NAV_BAR
import com.android.launcher3.Utilities.boundToRange
+import com.android.launcher3.Utilities.debugLog
import com.android.launcher3.Utilities.isRtl
import com.android.launcher3.anim.AnimatorPlaybackController
import com.android.launcher3.touch.BaseSwipeDetector
@@ -72,6 +73,7 @@
// Don't intercept swipes on the nav bar, as user might be trying to go home during a
// task dismiss animation.
(ev.edgeFlags and EDGE_NAV_BAR) != 0 -> {
+ debugLog(TAG, "Not intercepting edge swipe on nav bar.")
false
}
@@ -80,15 +82,22 @@
container,
AbstractFloatingView.TYPE_TOUCH_CONTROLLER_NO_INTERCEPT,
) != null -> {
+ debugLog(TAG, "Not intercepting, open floating view blocking touch.")
false
}
// Disable swiping if the task overlay is modal.
taskViewRecentsTouchContext.isRecentsModal -> {
+ debugLog(TAG, "Not intercepting touch in modal overlay.")
false
}
- else -> taskViewRecentsTouchContext.isRecentsInteractive
+ else ->
+ taskViewRecentsTouchContext.isRecentsInteractive.also { isRecentsInteractive ->
+ if (!isRecentsInteractive) {
+ debugLog(TAG, "Not intercepting touch, recents not interactive.")
+ }
+ }
}
override fun onControllerInterceptTouchEvent(ev: MotionEvent): Boolean {
@@ -128,6 +137,7 @@
recentsView.pagedOrientationHandler.getTaskDragDisplacementFactor(isRtl)
}
if (!canTaskLaunchTaskView(taskBeingDragged)) {
+ debugLog(TAG, "Not intercepting touch, task cannot be launched.")
return false
}
detector.setDetectableScrollConditions(downDirection, /* ignoreSlop= */ false)
@@ -136,6 +146,7 @@
override fun onDragStart(start: Boolean, startDisplacement: Float) {
val taskBeingDragged = taskBeingDragged ?: return
+ debugLog(TAG, "Handling touch event.")
val secondaryLayerDimension: Int =
recentsView.pagedOrientationHandler.getSecondaryDimension(container.getDragLayer())
@@ -202,6 +213,7 @@
}
companion object {
+ private const val TAG = "TaskViewLaunchTouchController"
private const val LAUNCH_THRESHOLD_FRACTION: Float = 0.5f
}
}
diff --git a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewTouchControllerDeprecated.java b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewTouchControllerDeprecated.java
index f26bd13..57ffd95 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewTouchControllerDeprecated.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewTouchControllerDeprecated.java
@@ -17,6 +17,7 @@
import static com.android.launcher3.AbstractFloatingView.TYPE_TOUCH_CONTROLLER_NO_INTERCEPT;
import static com.android.launcher3.LauncherAnimUtils.SUCCESS_TRANSITION_PROGRESS;
+import static com.android.launcher3.Utilities.debugLog;
import static com.android.launcher3.touch.SingleAxisSwipeDetector.DIRECTION_BOTH;
import android.animation.Animator;
@@ -56,6 +57,7 @@
public class TaskViewTouchControllerDeprecated<
CONTAINER extends Context & RecentsViewContainer> extends AnimatorListenerAdapter
implements TouchController, SingleAxisSwipeDetector.Listener {
+ private static final String TAG = "TaskViewTouchControllerDeprecated";
private static final float ANIMATION_PROGRESS_FRACTION_MIDPOINT = 0.5f;
private static final long MIN_TASK_DISMISS_ANIMATION_DURATION = 300;
@@ -110,6 +112,7 @@
if (mCurrentAnimation != null) {
mCurrentAnimation.getAnimationPlayer().end();
}
+ debugLog(TAG, "Not intercepting edge swipe on nav bar.");
return false;
}
if (mCurrentAnimation != null) {
@@ -121,6 +124,7 @@
}
if (AbstractFloatingView.getTopOpenViewWithType(
mContainer, TYPE_TOUCH_CONTROLLER_NO_INTERCEPT) != null) {
+ debugLog(TAG, "Not intercepting, open floating view blocking touch.");
return false;
}
return mTaskViewRecentsTouchContext.isRecentsInteractive();
@@ -142,6 +146,7 @@
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
mNoIntercept = !canInterceptTouch(ev);
if (mNoIntercept) {
+ debugLog(TAG, "Not intercepting touch.");
return false;
}
@@ -186,6 +191,7 @@
}
if (mTaskBeingDragged == null) {
mNoIntercept = true;
+ debugLog(TAG, "Not intercepting touch, no task to drag.");
return false;
}
}
@@ -195,6 +201,7 @@
}
if (mNoIntercept) {
+ debugLog(TAG, "Not intercepting touch.");
return false;
}
@@ -266,6 +273,7 @@
@Override
public void onDragStart(boolean start, float startDisplacement) {
if (!mDraggingEnabled) return;
+ debugLog(TAG, "Handling touch.");
RecentsPagedOrientationHandler orientationHandler =
mRecentsView.getPagedOrientationHandler();
diff --git a/quickstep/src/com/android/quickstep/AspectRatioSystemShortcut.kt b/quickstep/src/com/android/quickstep/AspectRatioSystemShortcut.kt
new file mode 100644
index 0000000..68860ac
--- /dev/null
+++ b/quickstep/src/com/android/quickstep/AspectRatioSystemShortcut.kt
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.quickstep
+
+import android.content.Intent
+import android.provider.Settings
+import android.view.View
+import androidx.core.net.toUri
+import com.android.launcher3.AbstractFloatingViewHelper
+import com.android.launcher3.R
+import com.android.launcher3.logging.StatsLogManager.LauncherEvent
+import com.android.launcher3.popup.SystemShortcut
+import com.android.quickstep.views.RecentsViewContainer
+import com.android.quickstep.views.TaskContainer
+import com.android.window.flags.Flags.universalResizableByDefault
+
+/**
+ * System shortcut to change the application's aspect ratio compatibility mode.
+ *
+ * This shows up only on screens that are not compact, ie. shortest-width greater than {@link
+ * com.android.launcher3.util.window.WindowManagerProxy#MIN_TABLET_WIDTH}.
+ */
+class AspectRatioSystemShortcut(
+ viewContainer: RecentsViewContainer,
+ taskContainer: TaskContainer,
+ abstractFloatingViewHelper: AbstractFloatingViewHelper,
+) :
+ SystemShortcut<RecentsViewContainer>(
+ R.drawable.ic_aspect_ratio,
+ R.string.recent_task_option_aspect_ratio,
+ viewContainer,
+ taskContainer.itemInfo,
+ taskContainer.taskView,
+ abstractFloatingViewHelper,
+ ) {
+ override fun onClick(view: View) {
+ dismissTaskMenuView()
+
+ val intent =
+ Intent(Settings.ACTION_MANAGE_USER_ASPECT_RATIO_SETTINGS)
+ .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
+ if (mItemInfo.targetPackage != null) {
+ intent.setData(("package:" + mItemInfo.targetPackage).toUri())
+ }
+
+ mTarget.startActivitySafely(view, intent, mItemInfo)
+ mTarget
+ .statsLogManager
+ .logger()
+ .withItemInfo(mItemInfo)
+ .log(LauncherEvent.LAUNCHER_ASPECT_RATIO_SETTINGS_SYSTEM_SHORTCUT_TAP)
+ }
+
+ companion object {
+ /** Optionally create a factory for the aspect ratio system shortcut. */
+ @JvmOverloads
+ fun createFactory(
+ abstractFloatingViewHelper: AbstractFloatingViewHelper = AbstractFloatingViewHelper()
+ ): TaskShortcutFactory {
+ return object : TaskShortcutFactory {
+ override fun getShortcuts(
+ viewContainer: RecentsViewContainer,
+ taskContainer: TaskContainer,
+ ): List<AspectRatioSystemShortcut>? {
+ return when {
+ // Only available when the feature flag is on.
+ !universalResizableByDefault() -> null
+
+ // The option is only shown on sw600dp+ screens (checked by isTablet)
+ !viewContainer.deviceProfile.isTablet -> null
+
+ else -> {
+ listOf(
+ AspectRatioSystemShortcut(
+ viewContainer,
+ taskContainer,
+ abstractFloatingViewHelper,
+ )
+ )
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/quickstep/src/com/android/quickstep/LauncherBackAnimationController.java b/quickstep/src/com/android/quickstep/LauncherBackAnimationController.java
index 783ec2c..c678562 100644
--- a/quickstep/src/com/android/quickstep/LauncherBackAnimationController.java
+++ b/quickstep/src/com/android/quickstep/LauncherBackAnimationController.java
@@ -26,6 +26,7 @@
import static com.android.launcher3.BaseActivity.INVISIBLE_BY_PENDING_FLAGS;
import static com.android.launcher3.BaseActivity.PENDING_INVISIBLE_BY_WALLPAPER_ANIMATION;
import static com.android.window.flags.Flags.predictiveBackThreeButtonNav;
+import static com.android.window.flags.Flags.removeDepartTargetFromMotion;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
@@ -121,6 +122,7 @@
private final SurfaceControl.Transaction mTransaction = new SurfaceControl.Transaction();
private float mBackProgress = 0;
private boolean mBackInProgress = false;
+ private boolean mWaitStartTransition = false;
private OnBackInvokedCallbackStub mBackCallback;
private IRemoteAnimationFinishedCallback mAnimationFinishedCallback;
private final BackProgressAnimator mProgressAnimator = new BackProgressAnimator();
@@ -158,7 +160,8 @@
mBackCallback = new OnBackInvokedCallbackStub(handler, mProgressAnimator,
mProgressInterpolator, this);
SystemUiProxy.INSTANCE.get(mLauncher).setBackToLauncherCallback(mBackCallback,
- new RemoteAnimationRunnerStub(this));
+ new RemoteAnimationRunnerStub(this,
+ removeDepartTargetFromMotion() ? handler : null));
}
private static class OnBackInvokedCallbackStub extends IOnBackInvokedCallback.Stub {
@@ -195,7 +198,14 @@
mHandler.post(() -> {
LauncherBackAnimationController controller = mControllerRef.get();
if (controller != null) {
- controller.startTransition();
+ if (!removeDepartTargetFromMotion()) {
+ controller.startTransition();
+ } else {
+ controller.mWaitStartTransition = true;
+ if (controller.mBackTarget != null && controller.mBackInProgress) {
+ controller.startTransition();
+ }
+ }
}
mProgressAnimator.reset();
});
@@ -220,7 +230,8 @@
mHandler.post(() -> {
LauncherBackAnimationController controller = mControllerRef.get();
if (controller != null) {
- controller.startBack(backEvent);
+ controller.initBackMotion(backEvent);
+ controller.tryStartBackAnimation();
mProgressAnimator.onBackStarted(backEvent, event -> {
float backProgress = event.getProgress();
controller.mBackProgress =
@@ -248,9 +259,12 @@
// LauncherBackAnimationController has strong reference to Launcher activity, the binder
// callback should not hold strong reference to it to avoid memory leak.
private WeakReference<LauncherBackAnimationController> mControllerRef;
+ private final Handler mHandler;
- private RemoteAnimationRunnerStub(LauncherBackAnimationController controller) {
+ private RemoteAnimationRunnerStub(LauncherBackAnimationController controller,
+ Handler handler) {
mControllerRef = new WeakReference<>(controller);
+ mHandler = handler;
}
@Override
@@ -261,15 +275,29 @@
if (controller == null) {
return;
}
- for (final RemoteAnimationTarget target : apps) {
- if (MODE_CLOSING == target.mode) {
- controller.mBackTarget = target;
+ final Runnable r = () -> {
+ for (final RemoteAnimationTarget target : apps) {
+ if (MODE_CLOSING == target.mode) {
+ controller.mBackTarget = target;
+ }
+ if (MODE_OPENING == target.mode) {
+ controller.mLauncherTarget = target;
+ }
}
- if (MODE_OPENING == target.mode) {
- controller.mLauncherTarget = target;
+ controller.mAnimationFinishedCallback = finishedCallback;
+ if (!removeDepartTargetFromMotion()) {
+ return;
}
+ controller.tryStartBackAnimation();
+ if (controller.mWaitStartTransition) {
+ controller.startTransition();
+ }
+ };
+ if (mHandler != null) {
+ mHandler.post(r);
+ } else {
+ r.run();
}
- controller.mAnimationFinishedCallback = finishedCallback;
}
@Override
@@ -294,34 +322,39 @@
mBackCallback = null;
}
- private void startBack(BackMotionEvent backEvent) {
+ private void initBackMotion(BackMotionEvent backEvent) {
// in case we're still animating an onBackCancelled event, let's remove the finish-
// callback from the progress animator to prevent calling finishAnimation() before
// restarting a new animation
- // Side note: startBack is never called during the post-commit phase if the back gesture
- // was committed (not cancelled). BackAnimationController prevents that. Therefore we
- // don't have to handle that case.
+ // Side note: initBackMotion is never called during the post-commit phase if the back
+ // gesture was committed (not cancelled). BackAnimationController prevents that. Therefore
+ // we don't have to handle that case.
mProgressAnimator.removeOnBackCancelledFinishCallback();
+ if (!removeDepartTargetFromMotion()) {
+ RemoteAnimationTarget appTarget = backEvent.getDepartingAnimationTarget();
+ if (appTarget == null || appTarget.leash == null || !appTarget.leash.isValid()) {
+ return;
+ }
+ mBackTarget = appTarget;
+ }
mBackInProgress = true;
- RemoteAnimationTarget appTarget = backEvent.getDepartingAnimationTarget();
-
- if (appTarget == null || appTarget.leash == null || !appTarget.leash.isValid()) {
+ mInitialTouchPos.set(backEvent.getTouchX(), backEvent.getTouchY());
+ }
+ private void tryStartBackAnimation() {
+ if (mBackTarget == null || (removeDepartTargetFromMotion() && !mBackInProgress)) {
return;
}
mTransaction
- .show(appTarget.leash)
+ .show(mBackTarget.leash)
.setAnimationTransaction();
- mBackTarget = appTarget;
- mInitialTouchPos.set(backEvent.getTouchX(), backEvent.getTouchY());
-
- mStartRect.set(appTarget.windowConfiguration.getMaxBounds());
+ mStartRect.set(mBackTarget.windowConfiguration.getMaxBounds());
// inset bottom in case of taskbar being present
if (!predictiveBackThreeButtonNav() || mLauncher.getDeviceProfile().isTaskbarPresent
|| DisplayController.getNavigationMode(mLauncher) == NavigationMode.NO_BUTTON) {
- mStartRect.inset(0, 0, 0, appTarget.contentInsets.bottom);
+ mStartRect.inset(0, 0, 0, mBackTarget.contentInsets.bottom);
}
mLauncherTargetView = mQuickstepTransitionManager.findLauncherView(
@@ -466,10 +499,14 @@
}
private void startTransition() {
- if (mBackTarget == null) {
- // Trigger transition system instead of custom transition animation.
- finishAnimation();
- return;
+ if (!removeDepartTargetFromMotion()) {
+ if (mBackTarget == null) {
+ // Trigger transition system instead of custom transition animation.
+ finishAnimation();
+ return;
+ }
+ } else {
+ mWaitStartTransition = false;
}
if (mLauncher.isDestroyed()) {
return;
diff --git a/quickstep/src/com/android/quickstep/RecentsAnimationDeviceState.java b/quickstep/src/com/android/quickstep/RecentsAnimationDeviceState.java
index 6710096..9bf63a0 100644
--- a/quickstep/src/com/android/quickstep/RecentsAnimationDeviceState.java
+++ b/quickstep/src/com/android/quickstep/RecentsAnimationDeviceState.java
@@ -18,6 +18,7 @@
import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
import static android.view.Display.DEFAULT_DISPLAY;
+import static android.app.ActivityTaskManager.INVALID_TASK_ID;
import static com.android.launcher3.MotionEventsUtils.isTrackpadScroll;
import static com.android.launcher3.util.DisplayController.CHANGE_ALL;
@@ -342,6 +343,9 @@
* @return whether the given running task info matches the gesture-blocked task.
*/
public boolean isGestureBlockedTask(CachedTaskInfo taskInfo) {
+ if (mGestureBlockingTaskId == INVALID_TASK_ID) {
+ return false;
+ }
if (com.android.wm.shell.Flags.enableShellTopTaskTracking()) {
return taskInfo != null && taskInfo.topGroupedTaskContainsTask(mGestureBlockingTaskId);
} else {
diff --git a/quickstep/src/com/android/quickstep/TaskOverlayFactory.java b/quickstep/src/com/android/quickstep/TaskOverlayFactory.java
index ae6bfbc..5bf4451 100644
--- a/quickstep/src/com/android/quickstep/TaskOverlayFactory.java
+++ b/quickstep/src/com/android/quickstep/TaskOverlayFactory.java
@@ -118,6 +118,7 @@
TaskShortcutFactory.FREE_FORM,
DesktopSystemShortcut.Companion.createFactory(),
ExternalDisplaySystemShortcut.Companion.createFactory(),
+ AspectRatioSystemShortcut.Companion.createFactory(),
TaskShortcutFactory.WELLBEING,
TaskShortcutFactory.SAVE_APP_PAIR,
TaskShortcutFactory.SCREENSHOT,
diff --git a/quickstep/src/com/android/quickstep/TopTaskTracker.java b/quickstep/src/com/android/quickstep/TopTaskTracker.java
index 43e8ff9..2b83311 100644
--- a/quickstep/src/com/android/quickstep/TopTaskTracker.java
+++ b/quickstep/src/com/android/quickstep/TopTaskTracker.java
@@ -21,6 +21,7 @@
import static android.content.Intent.ACTION_CHOOSER;
import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
import static android.view.Display.DEFAULT_DISPLAY;
+import static android.view.Display.INVALID_DISPLAY;
import static com.android.launcher3.Flags.enableOverviewOnConnectedDisplays;
import static com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_TOP_OR_LEFT;
@@ -332,7 +333,7 @@
// TODO(346588978): Currently ignore filterOnlyVisibleRecents, but perhaps make this an
// explicit filter For things to ignore (ie. PIP/Bubbles/Assistant/etc/so that this is
// explicit)
- return new CachedTaskInfo(mVisibleTasks.get(displayId), mCanEnterDesktopMode);
+ return new CachedTaskInfo(mVisibleTasks.get(displayId));
} else {
if (filterOnlyVisibleRecents) {
// Since we only know about the top most task, any filtering may not be applied on
@@ -343,9 +344,10 @@
if (enableOverviewOnConnectedDisplays()) {
return new CachedTaskInfo(Arrays.stream(tasks).filter(
info -> ExternalDisplaysKt.getSafeDisplayId(info)
- == displayId).toList(), mCanEnterDesktopMode);
+ == displayId).toList(), mCanEnterDesktopMode, displayId);
} else {
- return new CachedTaskInfo(Arrays.asList(tasks), mCanEnterDesktopMode);
+ return new CachedTaskInfo(Arrays.asList(tasks), mCanEnterDesktopMode,
+ displayId);
}
}
@@ -363,9 +365,9 @@
if (enableOverviewOnConnectedDisplays()) {
return new CachedTaskInfo(tasks.stream().filter(
info -> ExternalDisplaysKt.getSafeDisplayId(info) == displayId).toList(),
- mCanEnterDesktopMode);
+ mCanEnterDesktopMode, displayId);
} else {
- return new CachedTaskInfo(tasks, mCanEnterDesktopMode);
+ return new CachedTaskInfo(tasks, mCanEnterDesktopMode, displayId);
}
}
}
@@ -385,8 +387,8 @@
* during the lifecycle of the task.
*/
public static class CachedTaskInfo {
- // TODO: b/402362465 - Provide a valid value while tracking top task per display.
- private final int mDisplayId = DEFAULT_DISPLAY;
+ // Only used when enableShellTopTaskTracking() is disabled.
+ private int mDisplayId = INVALID_DISPLAY;
// Only used when enableShellTopTaskTracking() is disabled
@Nullable
private final TaskInfo mTopTask;
@@ -397,22 +399,23 @@
@Nullable
private final GroupedTaskInfo mVisibleTasks;
- private final boolean mCanEnterDesktopMode;
+ private boolean mCanEnterDesktopMode = false;
// Only used when enableShellTopTaskTracking() is enabled
- CachedTaskInfo(@Nullable GroupedTaskInfo visibleTasks, boolean canEnterDesktopMode) {
+ CachedTaskInfo(@Nullable GroupedTaskInfo visibleTasks) {
mAllCachedTasks = null;
mTopTask = null;
mVisibleTasks = visibleTasks;
- mCanEnterDesktopMode = canEnterDesktopMode;
}
// Only used when enableShellTopTaskTracking() is disabled
- CachedTaskInfo(@NonNull List<TaskInfo> allCachedTasks, boolean canEnterDesktopMode) {
+ CachedTaskInfo(@NonNull List<TaskInfo> allCachedTasks, boolean canEnterDesktopMode,
+ int displayId) {
mVisibleTasks = null;
mAllCachedTasks = allCachedTasks;
mTopTask = allCachedTasks.isEmpty() ? null : allCachedTasks.get(0);
mCanEnterDesktopMode = canEnterDesktopMode;
+ mDisplayId = displayId;
}
/**
@@ -522,7 +525,7 @@
&& t.getActivityType() != ACTIVITY_TYPE_RECENTS)
.toList();
return visibleNonExcludedTasks.isEmpty() ? null
- : new CachedTaskInfo(visibleNonExcludedTasks, mCanEnterDesktopMode);
+ : new CachedTaskInfo(visibleNonExcludedTasks, mCanEnterDesktopMode, mDisplayId);
}
/**
@@ -555,7 +558,6 @@
// TODO(346588978): Update this to return more than a single task once the callers
// are refactored.
-
/**
* Returns a {@link GroupedTaskInfo} which can be used as a placeholder until the true
* object is loaded by the model.
diff --git a/quickstep/src/com/android/quickstep/util/ChoreographerFrameRateTracker.kt b/quickstep/src/com/android/quickstep/util/ChoreographerFrameRateTracker.kt
new file mode 100644
index 0000000..1b61a6a
--- /dev/null
+++ b/quickstep/src/com/android/quickstep/util/ChoreographerFrameRateTracker.kt
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.quickstep.util
+
+import android.util.TimeUtils
+import android.view.Choreographer
+import com.android.launcher3.util.window.RefreshRateTracker
+
+/** [RefreshRateTracker] using main thread [Choreographer] */
+object ChoreographerFrameRateTracker : RefreshRateTracker {
+
+ override val singleFrameMs: Int
+ get() =
+ Choreographer.getMainThreadInstance()?.let {
+ (it.frameIntervalNanos / TimeUtils.NANOS_PER_MS).toInt().coerceAtLeast(1)
+ } ?: 1
+}
diff --git a/quickstep/src/com/android/quickstep/util/SplitAnimationController.kt b/quickstep/src/com/android/quickstep/util/SplitAnimationController.kt
index 96a5733..8601350 100644
--- a/quickstep/src/com/android/quickstep/util/SplitAnimationController.kt
+++ b/quickstep/src/com/android/quickstep/util/SplitAnimationController.kt
@@ -65,7 +65,6 @@
import com.android.launcher3.util.SplitConfigurationOptions.SplitSelectSource
import com.android.launcher3.views.BaseDragLayer
import com.android.quickstep.TaskViewUtils
-import com.android.quickstep.util.SplitScreenUtils.Companion.extractTopParentAndChildren
import com.android.quickstep.views.FloatingAppPairView
import com.android.quickstep.views.FloatingTaskView
import com.android.quickstep.views.GroupedTaskView
@@ -982,14 +981,35 @@
progressUpdater.setDuration(QuickstepTransitionManager.APP_LAUNCH_DURATION)
progressUpdater.interpolator = Interpolators.EMPHASIZED
- val splitTree: Pair<Change, List<Change>>? = extractTopParentAndChildren(transitionInfo)
- check(splitTree != null) { "Could not find a split root candidate" }
- val rootCandidate = splitTree.first
- val stageRootTaskIds: Set<Int> = splitTree.second.map { it.taskInfo!!.taskId }.toSet()
- val leafTasks: List<Change> =
- transitionInfo.changes
- .filter { it.taskInfo != null && it.taskInfo!!.parentTaskId in stageRootTaskIds }
- .toList()
+ var rootCandidate: Change? = null
+
+ for (change in transitionInfo.changes) {
+ val taskInfo: RunningTaskInfo = change.taskInfo ?: continue
+
+ // TODO (b/316490565): Replace this logic when SplitBounds is available to
+ // startAnimation() and we can know the precise taskIds of launching tasks.
+ if (
+ taskInfo.windowingMode == windowingMode &&
+ (change.mode == TRANSIT_OPEN || change.mode == TRANSIT_TO_FRONT)
+ ) {
+ // Found one!
+ rootCandidate = change
+ break
+ }
+ }
+
+ // If we could not find a proper root candidate, something went wrong.
+ check(rootCandidate != null) { "Could not find a split root candidate" }
+
+ // Recurse up the tree until parent is null, then we've found our root.
+ var parentToken: WindowContainerToken? = rootCandidate.parent
+ while (parentToken != null) {
+ rootCandidate = transitionInfo.getChange(parentToken) ?: break
+ parentToken = rootCandidate.parent
+ }
+
+ // Make sure nothing weird happened, like getChange() returning null.
+ check(rootCandidate != null) { "Failed to find a root leash" }
// Starting position is a 34% size tile centered in the middle of the screen.
// Ending position is the full device screen.
@@ -1023,42 +1043,6 @@
override fun onAnimationEnd(animation: Animator) {
finishCallback.run()
}
-
- override fun onAnimationStart(animation: Animator) {
- // Reset leaf and stage root tasks, animation can begin from freeform windows
- for (leaf in leafTasks) {
- val endAbsBounds = leaf.endAbsBounds
-
- t.setAlpha(leaf.leash, 1f)
- t.setCrop(
- leaf.leash,
- 0f,
- 0f,
- endAbsBounds.width().toFloat(),
- endAbsBounds.height().toFloat(),
- )
- t.setPosition(leaf.leash, 0f, 0f)
- }
-
- for (stageRoot in splitTree.second) {
- val endAbsBounds = stageRoot.endAbsBounds
-
- t.setAlpha(stageRoot.leash, 1f)
- t.setCrop(
- stageRoot.leash,
- 0f,
- 0f,
- endAbsBounds.width().toFloat(),
- endAbsBounds.height().toFloat(),
- )
- t.setPosition(
- stageRoot.leash,
- endAbsBounds.left.toFloat(),
- endAbsBounds.top.toFloat(),
- )
- }
- t.apply()
- }
}
)
diff --git a/quickstep/src/com/android/quickstep/util/SplitScreenUtils.kt b/quickstep/src/com/android/quickstep/util/SplitScreenUtils.kt
index 7787e30..4005c5a 100644
--- a/quickstep/src/com/android/quickstep/util/SplitScreenUtils.kt
+++ b/quickstep/src/com/android/quickstep/util/SplitScreenUtils.kt
@@ -46,8 +46,8 @@
* Given a TransitionInfo, generates the tree structure for those changes and extracts out
* the top most root and it's two immediate children. Changes can be provided in any order.
*
- * @return null if no root is found, otherwise a [Pair] where first -> top most split root,
- * second -> [List] of 2, leftTop/bottomRight stage roots
+ * @return a [Pair] where first -> top most split root, second -> [List] of 2,
+ * leftTop/bottomRight stage roots
*/
fun extractTopParentAndChildren(
transitionInfo: TransitionInfo
diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java
index ea95206..3e4b953 100644
--- a/quickstep/src/com/android/quickstep/views/RecentsView.java
+++ b/quickstep/src/com/android/quickstep/views/RecentsView.java
@@ -7016,6 +7016,8 @@
return;
}
+ TaskView currentTaskView = getTaskViewAt(mCurrentPage);
+
// We assume that a newly added desk is always empty and gets added to the left of the
// `AddNewDesktopButton`.
DesktopTaskView desktopTaskView =
@@ -7029,9 +7031,12 @@
updateTaskSize();
mUtils.updateChildTaskOrientations();
+ updateScrollSynchronously();
- // TODO: b/401002178 - Recalculate the new current page such that the addition of the new
- // desk does not result in a change in the current scroll page.
+ // Set Current Page based on the stored TaskView.
+ if (currentTaskView != null) {
+ setCurrentPage(indexOfChild(currentTaskView));
+ }
}
@Override
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/AbsSwipeUpHandlerTestCase.java b/quickstep/tests/multivalentTests/src/com/android/quickstep/AbsSwipeUpHandlerTestCase.java
index 568da2d..6adb7b4 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/AbsSwipeUpHandlerTestCase.java
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/AbsSwipeUpHandlerTestCase.java
@@ -16,6 +16,8 @@
package com.android.quickstep;
+import static android.view.Display.DEFAULT_DISPLAY;
+
import static com.android.quickstep.AbsSwipeUpHandler.STATE_HANDLER_INVALIDATED;
import static com.android.wm.shell.shared.ShellSharedConstants.KEY_EXTRA_SHELL_CAN_HAND_OFF_ANIMATION;
import static com.android.wm.shell.shared.split.SplitBounds.KEY_EXTRA_SPLIT_BOUNDS;
@@ -102,7 +104,8 @@
new ActivityManager.RunningTaskInfo();
protected final TopTaskTracker.CachedTaskInfo mCachedTaskInfo =
new TopTaskTracker.CachedTaskInfo(
- Collections.singletonList(mRunningTaskInfo), /* canEnterDesktopMode = */ false);
+ Collections.singletonList(mRunningTaskInfo), /* canEnterDesktop = */ false,
+ DEFAULT_DISPLAY);
protected final RemoteAnimationTarget mRemoteAnimationTarget = new RemoteAnimationTarget(
/* taskId= */ 0,
/* mode= */ RemoteAnimationTarget.MODE_CLOSING,
@@ -191,7 +194,7 @@
@Before
public void setUpRecentsContainer() {
mTaskAnimationManager = new TaskAnimationManager(mContext,
- RecentsAnimationDeviceState.INSTANCE.get(mContext), Display.DEFAULT_DISPLAY);
+ RecentsAnimationDeviceState.INSTANCE.get(mContext), DEFAULT_DISPLAY);
RecentsViewContainer recentsContainer = getRecentsContainer();
RECENTS_VIEW recentsView = getRecentsView();
diff --git a/quickstep/tests/src/com/android/quickstep/AspectRatioSystemShortcutTests.kt b/quickstep/tests/src/com/android/quickstep/AspectRatioSystemShortcutTests.kt
new file mode 100644
index 0000000..10e85e6
--- /dev/null
+++ b/quickstep/tests/src/com/android/quickstep/AspectRatioSystemShortcutTests.kt
@@ -0,0 +1,285 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.quickstep
+
+import android.content.ComponentName
+import android.content.Context
+import android.content.ContextWrapper
+import android.content.Intent
+import android.platform.test.annotations.DisableFlags
+import android.platform.test.annotations.EnableFlags
+import android.platform.test.flag.junit.SetFlagsRule
+import android.provider.Settings
+import android.view.Display.DEFAULT_DISPLAY
+import android.view.LayoutInflater
+import android.view.Surface
+import android.view.View
+import android.view.ViewGroup
+import android.view.ViewGroup.LayoutParams.MATCH_PARENT
+import androidx.test.platform.app.InstrumentationRegistry
+import com.android.launcher3.AbstractFloatingView
+import com.android.launcher3.AbstractFloatingViewHelper
+import com.android.launcher3.Flags.enableRefactorTaskThumbnail
+import com.android.launcher3.InvariantDeviceProfile
+import com.android.launcher3.R
+import com.android.launcher3.logging.StatsLogManager
+import com.android.launcher3.logging.StatsLogManager.LauncherEvent
+import com.android.launcher3.logging.StatsLogManager.StatsLogger
+import com.android.launcher3.model.data.ItemInfo
+import com.android.launcher3.model.data.TaskViewItemInfo
+import com.android.launcher3.util.RunnableList
+import com.android.launcher3.util.SplitConfigurationOptions
+import com.android.launcher3.util.TransformingTouchDelegate
+import com.android.launcher3.util.WindowBounds
+import com.android.quickstep.orientation.LandscapePagedViewHandler
+import com.android.quickstep.recents.data.RecentsDeviceProfileRepository
+import com.android.quickstep.recents.data.RecentsRotationStateRepository
+import com.android.quickstep.recents.di.RecentsDependencies
+import com.android.quickstep.task.thumbnail.TaskThumbnailView
+import com.android.quickstep.util.RecentsOrientedState
+import com.android.quickstep.views.LauncherRecentsView
+import com.android.quickstep.views.RecentsViewContainer
+import com.android.quickstep.views.TaskContainer
+import com.android.quickstep.views.TaskThumbnailViewDeprecated
+import com.android.quickstep.views.TaskView
+import com.android.quickstep.views.TaskViewIcon
+import com.android.systemui.shared.recents.model.Task
+import com.android.systemui.shared.recents.model.Task.TaskKey
+import com.android.window.flags.Flags
+import com.google.common.truth.Truth.assertThat
+import org.junit.After
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.mockito.Mockito
+import org.mockito.Mockito.eq
+import org.mockito.Mockito.isNull
+import org.mockito.kotlin.any
+import org.mockito.kotlin.argumentCaptor
+import org.mockito.kotlin.doReturn
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.spy
+import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
+
+/** Test for [AspectRatioSystemShortcut] */
+class AspectRatioSystemShortcutTests {
+
+ @get:Rule val setFlagsRule = SetFlagsRule(SetFlagsRule.DefaultInitValueType.DEVICE_DEFAULT)
+
+ /** Spy on a concrete Context so we can reference real View, Layout, and Display properties. */
+ private val context: Context = spy(InstrumentationRegistry.getInstrumentation().targetContext)
+
+ /**
+ * RecentsViewContainer and its super-interface ActivityContext contain methods to convert
+ * themselves to a Context at runtime, and static methods to convert a Context back to
+ * themselves by traversing ContextWrapper layers.
+ *
+ * Thus there is an undocumented assumption that a RecentsViewContainer always extends Context.
+ * We need to mock all of the RecentsViewContainer methods but leave the Context-under-test
+ * intact.
+ *
+ * The simplest way is to extend ContextWrapper and delegate the RecentsViewContainer interface
+ * to a mock.
+ */
+ class RecentsViewContainerContextWrapper(base: Context) :
+ ContextWrapper(base), RecentsViewContainer by mock() {
+
+ private val statsLogManager: StatsLogManager = mock()
+
+ override fun getStatsLogManager(): StatsLogManager = statsLogManager
+
+ override fun startActivitySafely(v: View, intent: Intent, item: ItemInfo?): RunnableList? =
+ null
+ }
+
+ /**
+ * This <RecentsViewContainer & Context> is implicitly required in many parts of Launcher that
+ * require a Context. See RecentsViewContainerContextWrapper.
+ */
+ private val launcher: RecentsViewContainerContextWrapper =
+ spy(RecentsViewContainerContextWrapper(context))
+
+ private val recentsView: LauncherRecentsView = mock()
+ private val abstractFloatingViewHelper: AbstractFloatingViewHelper = mock()
+ private val taskOverlayFactory: TaskOverlayFactory =
+ mock(defaultAnswer = Mockito.RETURNS_DEEP_STUBS)
+ private val factory: TaskShortcutFactory =
+ AspectRatioSystemShortcut.createFactory(abstractFloatingViewHelper)
+ private val statsLogger = mock<StatsLogger>()
+ private val orientedState: RecentsOrientedState =
+ mock(defaultAnswer = Mockito.RETURNS_DEEP_STUBS)
+ private val taskView: TaskView =
+ LayoutInflater.from(context).cloneInContext(launcher).inflate(R.layout.task, null) as
+ TaskView
+
+ @Before
+ fun setUp() {
+ whenever(launcher.getOverviewPanel<LauncherRecentsView>()).thenReturn(recentsView)
+
+ val statsLogManager = launcher.getStatsLogManager()
+ whenever(statsLogManager.logger()).thenReturn(statsLogger)
+ whenever(statsLogger.withItemInfo(any())).thenReturn(statsLogger)
+
+ whenever(orientedState.orientationHandler).thenReturn(LandscapePagedViewHandler())
+ taskView.setLayoutParams(ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT))
+
+ if (enableRefactorTaskThumbnail()) {
+ val recentsDependencies = RecentsDependencies.maybeInitialize(launcher)
+ val scopeId = recentsDependencies.createRecentsViewScope(launcher)
+ recentsDependencies.provide(
+ RecentsRotationStateRepository::class.java,
+ scopeId,
+ { mock<RecentsRotationStateRepository>() }
+ )
+ recentsDependencies.provide(
+ RecentsDeviceProfileRepository::class.java,
+ scopeId,
+ { mock<RecentsDeviceProfileRepository>() }
+ )
+ }
+ }
+
+ @After
+ fun tearDown() {
+ if (enableRefactorTaskThumbnail()) {
+ RecentsDependencies.destroy(launcher)
+ }
+ }
+
+ /**
+ * When the corresponding feature flag is off, there will not be an option to open aspect ratio
+ * settings.
+ */
+ @DisableFlags(com.android.window.flags.Flags.FLAG_UNIVERSAL_RESIZABLE_BY_DEFAULT)
+ @Test
+ fun createShortcut_flaggedOff_notCreated() {
+ val task = createTask()
+ val taskContainer = createTaskContainer(task)
+
+ setScreenSizeDp(widthDp = 1200, heightDp = 800)
+ taskView.bind(task, orientedState, taskOverlayFactory)
+
+ assertThat(factory.getShortcuts(launcher, taskContainer)).isNull()
+ }
+
+ /**
+ * When the screen doesn't meet or exceed sw600dp (eg. phone, watch), there will not be an
+ * option to open aspect ratio settings.
+ */
+ @EnableFlags(com.android.window.flags.Flags.FLAG_UNIVERSAL_RESIZABLE_BY_DEFAULT)
+ @Test
+ fun createShortcut_sw599dp_notCreated() {
+ val task = createTask()
+ val taskContainer = createTaskContainer(task)
+
+ setScreenSizeDp(widthDp = 599, heightDp = 599)
+ taskView.bind(task, orientedState, taskOverlayFactory)
+
+ assertThat(factory.getShortcuts(launcher, taskContainer)).isNull()
+ }
+
+ /**
+ * When the screen does meet or exceed sw600dp (eg. tablet, inner foldable screen, home cinema)
+ * there will be an option to open aspect ratio settings.
+ */
+ @EnableFlags(com.android.window.flags.Flags.FLAG_UNIVERSAL_RESIZABLE_BY_DEFAULT)
+ @Test
+ fun createShortcut_sw800dp_created_andOpensSettings() {
+ val task = createTask()
+ val taskContainer = spy(createTaskContainer(task))
+ val taskViewItemInfo = mock<TaskViewItemInfo>()
+ doReturn(taskViewItemInfo).whenever(taskContainer).itemInfo
+
+ setScreenSizeDp(widthDp = 1200, heightDp = 800)
+ taskView.bind(task, orientedState, taskOverlayFactory)
+
+ val shortcuts = factory.getShortcuts(launcher, taskContainer)
+ assertThat(shortcuts).hasSize(1)
+
+ // On clicking the shortcut:
+ val shortcut = shortcuts!!.first() as AspectRatioSystemShortcut
+ shortcut.onClick(taskView)
+
+ // 1) Panel should be closed
+ val allTypesExceptRebindSafe =
+ AbstractFloatingView.TYPE_ALL and AbstractFloatingView.TYPE_REBIND_SAFE.inv()
+ verify(abstractFloatingViewHelper).closeOpenViews(launcher, true, allTypesExceptRebindSafe)
+
+ // 2) Compat mode settings activity should be launched
+ val intentCaptor = argumentCaptor<Intent>()
+ verify(launcher)
+ .startActivitySafely(any<View>(), intentCaptor.capture(), eq(taskViewItemInfo))
+ val intent = intentCaptor.firstValue!!
+ assertThat(intent.action).isEqualTo(Settings.ACTION_MANAGE_USER_ASPECT_RATIO_SETTINGS)
+
+ // 3) Shortcut tap event should be reported
+ verify(statsLogger).withItemInfo(taskViewItemInfo)
+ verify(statsLogger).log(LauncherEvent.LAUNCHER_ASPECT_RATIO_SETTINGS_SYSTEM_SHORTCUT_TAP)
+ }
+
+ /**
+ * Overrides the screen size reported in the DeviceProfile, keeping the same pixel density as
+ * the underlying device and adjusting the pixel width/height to match what is required.
+ */
+ private fun setScreenSizeDp(widthDp: Int, heightDp: Int) {
+ val density = context.resources.configuration.densityDpi
+ val widthPx = widthDp * density / 160
+ val heightPx = heightDp * density / 160
+
+ val screenBounds = WindowBounds(widthPx, heightPx, widthPx, heightPx, Surface.ROTATION_0)
+ val deviceProfile =
+ InvariantDeviceProfile.INSTANCE[context].getDeviceProfile(context)
+ .toBuilder(context)
+ .setWindowBounds(screenBounds)
+ .build()
+ whenever(launcher.getDeviceProfile()).thenReturn(deviceProfile)
+ }
+
+ /** Create a (very) fake task for testing. */
+ private fun createTask() =
+ Task(
+ TaskKey(
+ /* id */ 1,
+ /* windowingMode */ 0,
+ Intent(),
+ ComponentName("", ""),
+ /* userId */ 0,
+ /* lastActiveTime */ 2000,
+ DEFAULT_DISPLAY,
+ ComponentName("", ""),
+ /* numActivities */ 1,
+ /* isTopActivityNoDisplay */ false,
+ /* isActivityStackTransparent */ false,
+ )
+ )
+
+ /** Create TaskContainer out of a given Task and fill in the rest with mocks. */
+ private fun createTaskContainer(task: Task) =
+ TaskContainer(
+ taskView,
+ task,
+ if (enableRefactorTaskThumbnail()) mock<TaskThumbnailView>()
+ else mock<TaskThumbnailViewDeprecated>(),
+ mock<TaskViewIcon>(),
+ mock<TransformingTouchDelegate>(),
+ SplitConfigurationOptions.STAGE_POSITION_UNDEFINED,
+ digitalWellBeingToast = null,
+ showWindowsView = null,
+ taskOverlayFactory,
+ )
+}
diff --git a/quickstep/tests/src/com/android/quickstep/DesktopSystemShortcutTest.kt b/quickstep/tests/src/com/android/quickstep/DesktopSystemShortcutTest.kt
index 5f61ba2..8a2393d 100644
--- a/quickstep/tests/src/com/android/quickstep/DesktopSystemShortcutTest.kt
+++ b/quickstep/tests/src/com/android/quickstep/DesktopSystemShortcutTest.kt
@@ -16,9 +16,11 @@
package com.android.quickstep
+import android.Manifest.permission.SYSTEM_ALERT_WINDOW
import android.content.ComponentName
import android.content.Context
import android.content.Intent
+import android.content.pm.PackageInfo
import android.content.pm.PackageManager
import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
@@ -44,6 +46,7 @@
import com.android.quickstep.views.TaskThumbnailViewDeprecated
import com.android.quickstep.views.TaskView
import com.android.quickstep.views.TaskViewIcon
+import com.android.quickstep.views.TaskViewType
import com.android.systemui.shared.recents.model.Task
import com.android.systemui.shared.recents.model.Task.TaskKey
import com.android.window.flags.Flags
@@ -54,6 +57,8 @@
import org.junit.Before
import org.junit.Rule
import org.junit.Test
+import org.mockito.ArgumentMatchers.anyInt
+import org.mockito.ArgumentMatchers.anyString
import org.mockito.Mockito.`when`
import org.mockito.kotlin.any
import org.mockito.kotlin.doReturn
@@ -74,12 +79,12 @@
private val statsLogManager: StatsLogManager = mock()
private val statsLogger: StatsLogManager.StatsLogger = mock()
private val recentsView: LauncherRecentsView = mock()
- private val taskView: TaskView = mock()
private val abstractFloatingViewHelper: AbstractFloatingViewHelper = mock()
private val overlayFactory: TaskOverlayFactory = mock()
private val factory: TaskShortcutFactory =
DesktopSystemShortcut.createFactory(abstractFloatingViewHelper)
private val context: Context = spy(InstrumentationRegistry.getInstrumentation().targetContext)
+ private val taskView: TaskView = createTaskViewMock()
private lateinit var mockitoSession: StaticMockitoSession
@@ -135,6 +140,64 @@
}
@Test
+ @EnableFlags(
+ Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODALS_POLICY,
+ Flags.FLAG_ENABLE_MODALS_FULLSCREEN_WITH_PERMISSION,
+ )
+ fun createDesktopTaskShortcutFactoryPermissionEnabledAllowed_transparentTask() {
+ val packageManager: PackageManager = mock()
+ setUpTransparentPermission(packageManager, isAllowed = true)
+ val baseComponent = ComponentName("", /* class */ "")
+ val taskKey =
+ TaskKey(
+ /* id */ 1,
+ /* windowingMode */ 0,
+ Intent(),
+ baseComponent,
+ /* userId */ 0,
+ /* lastActiveTime */ 2000,
+ DEFAULT_DISPLAY,
+ baseComponent,
+ /* numActivities */ 1,
+ /* isTopActivityNoDisplay */ false,
+ /* isActivityStackTransparent */ true,
+ )
+ val taskContainer = createTaskContainer(Task(taskKey))
+ val shortcuts = factory.getShortcuts(launcher, taskContainer)
+ assertThat(shortcuts).isNull()
+ }
+
+ @Test
+ @EnableFlags(
+ Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODALS_POLICY,
+ Flags.FLAG_ENABLE_MODALS_FULLSCREEN_WITH_PERMISSION,
+ )
+ fun createDesktopTaskShortcutFactoryPermissionEnabledNotAllowed_transparentTask() {
+ val packageManager: PackageManager = mock()
+ setUpTransparentPermission(packageManager, isAllowed = false)
+ val baseComponent = ComponentName("", /* class */ "")
+ val homeActivities = ComponentName("defaultHomePackage", /* class */ "")
+ whenever(packageManager.getHomeActivities(any())).thenReturn(homeActivities)
+ val taskKey =
+ TaskKey(
+ /* id */ 1,
+ /* windowingMode */ 0,
+ Intent(),
+ baseComponent,
+ /* userId */ 0,
+ /* lastActiveTime */ 2000,
+ DEFAULT_DISPLAY,
+ baseComponent,
+ /* numActivities */ 1,
+ /* isTopActivityNoDisplay */ false,
+ /* isActivityStackTransparent */ true,
+ )
+ val taskContainer = createTaskContainer(Task(taskKey).apply { isDockable = true })
+ val shortcuts = factory.getShortcuts(launcher, taskContainer)
+ assertThat(shortcuts).isNotEmpty()
+ }
+
+ @Test
@EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODALS_POLICY)
fun createDesktopTaskShortcutFactory_systemUiTask() {
val sysUiPackageName: String = context.resources.getString(R.string.config_systemUi)
@@ -162,8 +225,8 @@
@EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODALS_POLICY)
fun createDesktopTaskShortcutFactory_defaultHomeTask() {
val packageManager: PackageManager = mock()
- val homeActivities = ComponentName("defaultHomePackage", /* class */ "")
whenever(context.packageManager).thenReturn(packageManager)
+ val homeActivities = ComponentName("defaultHomePackage", /* class */ "")
whenever(packageManager.getHomeActivities(any())).thenReturn(homeActivities)
val taskKey =
TaskKey(
@@ -262,4 +325,27 @@
showWindowsView = null,
overlayFactory,
)
+
+ private fun setUpTransparentPermission(packageManager: PackageManager, isAllowed: Boolean) {
+ val packageInfo: PackageInfo = mock()
+ if (isAllowed) {
+ packageInfo.requestedPermissions = arrayOf(SYSTEM_ALERT_WINDOW)
+ }
+ whenever(context.packageManager).thenReturn(packageManager)
+ whenever(
+ packageManager.getPackageInfoAsUser(
+ anyString(),
+ eq(PackageManager.GET_PERMISSIONS),
+ anyInt(),
+ )
+ )
+ .thenReturn(packageInfo)
+ }
+
+ private fun createTaskViewMock(): TaskView {
+ val taskView: TaskView = mock()
+ whenever(taskView.type).thenReturn(TaskViewType.SINGLE)
+ whenever(taskView.context).thenReturn(context)
+ return taskView
+ }
}
diff --git a/quickstep/tests/src/com/android/quickstep/InputConsumerUtilsTest.java b/quickstep/tests/src/com/android/quickstep/InputConsumerUtilsTest.java
index 1464ca8..655560c 100644
--- a/quickstep/tests/src/com/android/quickstep/InputConsumerUtilsTest.java
+++ b/quickstep/tests/src/com/android/quickstep/InputConsumerUtilsTest.java
@@ -22,9 +22,11 @@
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
+import static org.mockito.kotlin.StubberKt.doCallRealMethod;
import android.annotation.NonNull;
import android.os.Looper;
@@ -306,6 +308,16 @@
}
@Test
+ public void testNewBaseConsumer_noGestureBlockedTask_returnsOtherActivityInputConsumer() {
+ doCallRealMethod().when(mDeviceState).setGestureBlockingTaskId(anyInt());
+ mDeviceState.setGestureBlockingTaskId(-1);
+ when(mDeviceState.isGestureBlockedTask(any())).thenCallRealMethod();
+
+ assertCorrectInputConsumer(this::createBaseInputConsumer, OtherActivityInputConsumer.class,
+ InputConsumer.TYPE_OTHER_ACTIVITY);
+ }
+
+ @Test
public void testNewBaseConsumer_containsOtherActivityInputConsumer() {
assertCorrectInputConsumer(
this::createBaseInputConsumer,
diff --git a/res/drawable/ic_aspect_ratio.xml b/res/drawable/ic_aspect_ratio.xml
new file mode 100644
index 0000000..aafaac4
--- /dev/null
+++ b/res/drawable/ic_aspect_ratio.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2025 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24"
+ android:viewportHeight="24"
+ android:tint="?android:attr/textColorPrimary">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19,12h-2v3h-3v2h5v-5zM7,9h3L10,7L5,7v5h2L7,9zM21,3L3,3c-1.1,0 -2,0.9 -2,2v14c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2L23,5c0,-1.1 -0.9,-2 -2,-2zM21,19.01L3,19.01L3,4.99h18v14.02z"/>
+</vector>
diff --git a/res/layout/widgets_list_row_header.xml b/res/layout/widgets_list_row_header.xml
index 98f9dac..2a7d22c 100644
--- a/res/layout/widgets_list_row_header.xml
+++ b/res/layout/widgets_list_row_header.xml
@@ -45,25 +45,19 @@
android:id="@+id/app_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ style="@style/WidgetListHeader.Title"
android:layout_gravity="start|center_vertical"
android:ellipsize="end"
android:maxLines="1"
- android:textColor="?attr/widgetPickerHeaderAppTitleColor"
- android:textSize="@dimen/widget_picker_header_app_title_font_size"
- android:textFontWeight="@integer/widget_picker_header_app_title_font_weight"
- android:lineHeight="@dimen/widget_picker_header_app_title_line_height"
tools:text="App name" />
<TextView
android:id="@+id/app_subtitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ style="@style/WidgetListHeader.SubTitle"
android:ellipsize="end"
android:maxLines="1"
- android:textColor="?attr/widgetPickerHeaderAppSubtitleColor"
- android:textSize="@dimen/widget_picker_header_app_subtitle_font_size"
- android:textFontWeight="@integer/widget_picker_header_app_subtitle_font_weight"
- android:lineHeight="@dimen/widget_picker_header_app_subtitle_line_height"
tools:text="m widgets, n shortcuts" />
</LinearLayout>
diff --git a/res/layout/widgets_list_row_header_two_pane.xml b/res/layout/widgets_list_row_header_two_pane.xml
index d4baf0a..4827ed4 100644
--- a/res/layout/widgets_list_row_header_two_pane.xml
+++ b/res/layout/widgets_list_row_header_two_pane.xml
@@ -47,13 +47,10 @@
android:id="@+id/app_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ style="@style/WidgetListHeader.Title"
android:layout_gravity="start|center_vertical"
android:ellipsize="end"
android:maxLines="1"
- android:textColor="?attr/widgetPickerHeaderAppTitleColor"
- android:textSize="@dimen/widget_picker_header_app_title_font_size"
- android:textFontWeight="@integer/widget_picker_header_app_title_font_weight"
- android:lineHeight="@dimen/widget_picker_header_app_title_line_height"
android:duplicateParentState="true"
tools:text="App name" />
@@ -61,12 +58,9 @@
android:id="@+id/app_subtitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
+ style="@style/WidgetListHeader.SubTitle"
android:ellipsize="end"
android:maxLines="1"
- android:textColor="?attr/widgetPickerHeaderAppSubtitleColor"
- android:textSize="@dimen/widget_picker_header_app_subtitle_font_size"
- android:textFontWeight="@integer/widget_picker_header_app_subtitle_font_weight"
- android:lineHeight="@dimen/widget_picker_header_app_subtitle_line_height"
android:duplicateParentState="true"
tools:text="m widgets, n shortcuts" />
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 962a018..1b206ac 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Privaat Ruimte-oorgang"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Installeer"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Installeer apps in privaat ruimte"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Voeg lêers en meer by privaat ruimte"</string>
</resources>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index 1fbff54..204c9af 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"የግል ቦታ ሽግግር"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"ይጫኑ"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"መተግበሪያዎችን ወደ የግል ቦታ ይጫኑ"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"ወደ የግል ቦታ ፋይሎች እና ሌሎችንም ያክሉ"</string>
</resources>
diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml
index 87301ff..703b08a 100644
--- a/res/values-as/strings.xml
+++ b/res/values-as/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"ব্যক্তিগত স্পে’চৰ স্থানান্তৰণ"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"ইনষ্টল কৰক"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"এপ্সমূহ প্ৰাইভেট স্পেচত ইনষ্টল কৰক"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"প্ৰাইভেট স্পে’চত ফাইল আৰু অধিক যোগ দিয়ক"</string>
</resources>
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
index f7c68d5..07822f6 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"ব্যক্তিগত স্পেস ট্রানজিট করা"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"ইনস্টল করুন"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"প্রাইভেট স্পেসে অ্যাপ ইনস্টল করুন"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"প্রাইভেট স্পেসে ফাইল ও আরও অনেক কিছু যোগ করুন"</string>
</resources>
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
index 96d567c..80f50ea 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Prelazak u privatan prostor"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Instalirajte"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Instaliranje aplikacija u privatni prostor"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Dodavanje fajlova i drugih stavki u privatni prostor"</string>
</resources>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 839c681..f93a19e 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Canvia a Espai privat"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Instal·la"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Instal·la les aplicacions a Espai privat"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Afegeix fitxers i més a Espai privat"</string>
</resources>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index e297418..f8cab17 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Převádění soukromého prostoru"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Nainstalovat"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Instalovat aplikace do soukromého prostoru"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Přidejte do soukromého prostoru soubory a další položky"</string>
</resources>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 9691fb0..4d7cd67 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Ændringer af tilstanden for det private område"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Installer"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Installer apps i privat område"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Føj filer m.m. til dit private område"</string>
</resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index fc390f6..36bb55f 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Sperrzustand des vertraulichen Profils wird gerade geändert"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Installieren"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Apps im vertraulichen Profil installieren"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Dateien und mehr zum vertraulichen Profil hinzufügen"</string>
</resources>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index 46a9a35..d53ec23 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Private Space transitioning"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Install"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Install apps to private space"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Add files and more to private space"</string>
</resources>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index 46a9a35..d53ec23 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Private Space transitioning"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Install"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Install apps to private space"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Add files and more to private space"</string>
</resources>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index 46a9a35..d53ec23 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Private Space transitioning"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Install"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Install apps to private space"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Add files and more to private space"</string>
</resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index d5476ca..b1ce80e 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Pasar a Espacio privado"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Instalar"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Instala las apps en el espacio privado"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Agrega archivos y mucho más al Espacio privado"</string>
</resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 7e8ff04..f01900e 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Cambiar a espacio privado"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Instalar"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Descargar aplicaciones en el espacio privado"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Añade archivos y más al espacio privado"</string>
</resources>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index 3a4b3e2..de6c231 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Privaatse ruumi üleviimine"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Installi"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Rakenduste installimine privaatses ruumis"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Privaatsesse ruumi failide ja muu sisu lisamine"</string>
</resources>
diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml
index 8a84353..af54389 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Eremu pribaturako trantsizioa"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Instalatu"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Instalatu aplikazioak eremu pribatuan"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Gehitu fitxategiak eta gauza gehiago eremu pribatuan"</string>
</resources>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index ff27a1b..143b3c2 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Yksityisen tilan siirtäminen"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Asenna"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Asenna sovelluksia yksityiseen tilaan"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Lisää tiedostoja ja muuta yksityiseen tilaan"</string>
</resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 0c62a9d..acbeac0 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Transition vers Espace privé"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Installer"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Installer des applis dans l\'espace privé"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Ajoutez des fichiers et bien plus à votre espace privé"</string>
</resources>
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index 21e16cc..46fc492 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Transición ao espazo privado"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Instalar"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Instalar as aplicacións no espazo privado"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Engade ficheiros e máis elementos ao espazo privado"</string>
</resources>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 3aad85f..c86b210 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"प्राइवेट स्पेस की सेटिंग में बदलाव किया जा रहा है"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"इंस्टॉल करें"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"प्राइवेट स्पेस में ऐप्लिकेशन इंस्टॉल करें"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"प्राइवेट स्पेस में फ़ाइलें और अन्य चीज़ें जोड़ें"</string>
</resources>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index bdb088b..1b018df 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Prelazak na privatni prostor"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Instalirajte"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Instaliranje aplikacija u privatni prostor"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Dodajte datoteke i druge sadržaje u privatni prostor"</string>
</resources>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 8abfaac..b3ae8f2 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Átállás privát területre…"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Telepítés"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Alkalmazások telepítése privát területre"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Fájlok és egyebek hozzáadása a privát területhez"</string>
</resources>
diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml
index 9c6fc18..29ef36c 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Անցում մասնավոր տարածք"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Տեղադրել"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Հավելվածների տեղադրում անձնական տարածքում"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Ձեր մասնավոր տարածքում ավելացրեք ֆայլեր և ավելին"</string>
</resources>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 986f36c..abe9f30 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Ruang Pribadi Bertransisi"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Instal"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Instal aplikasi ke Ruang Pribadi"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Tambahkan file dan lainnya ke Ruang Privasi"</string>
</resources>
diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml
index 1c24006..b5368f4 100644
--- a/res/values-is/strings.xml
+++ b/res/values-is/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Leynirými að breytast"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Setja upp"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Setja upp forrit í leynirými"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Bættu skrám og fleiru við leynirými"</string>
</resources>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 1d3eef1..0f791e9 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"טפט וסגנון"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"עריכה של מסך הבית"</string>
<string name="settings_button_text" msgid="8873672322605444408">"הגדרות של מסך הבית"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"אפליקציות"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"הושבת על ידי מנהל המערכת שלך"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"סיבוב מסך הבית"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"כאשר מסובבים את הטלפון"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"הקטנת גובה"</string>
<string name="widget_resized" msgid="9130327887929620">"גודל הווידג\'ט שונה - רוחב <xliff:g id="NUMBER_0">%1$s</xliff:g> גובה <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"תפריט קיצורי הדרך"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"מסגרת שינוי גודל הווידג\'ט של <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"סגירה"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"סגירה"</string>
<string name="accessibility_close" msgid="2277148124685870734">"סגירה"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"אישי"</string>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"מעבר למרחב הפרטי"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"התקנה"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"התקנת אפליקציות במרחב הפרטי"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"הוספת קבצים ופריטים נוספים למרחב הפרטי"</string>
</resources>
diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml
index c789a8f..4360f55 100644
--- a/res/values-kk/strings.xml
+++ b/res/values-kk/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Тұсқағаз және стиль"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Негізгі экранды өзгерту"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Негізгі экран параметрлері"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Қолданбалар"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Әкімші өшірді"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Негізгі экранды бұруға рұқсат ету"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Телефон бұрылғанда"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Биіктігін азайту"</string>
<string name="widget_resized" msgid="9130327887929620">"Виджет өлшемінің ені <xliff:g id="NUMBER_0">%1$s</xliff:g>, биіктігі <xliff:g id="NUMBER_1">%2$s</xliff:g> болып өзгертілді"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Жылдам пәрмен мәзірі"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g> үшін виджет өлшемін өзгерту"</string>
+ <string name="action_close" msgid="1077760267194136901">"Жабу"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Бас тарту"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Жабу"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Жеке"</string>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Жеке бөлмеге өту"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Орнату"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Қолданбаларды \"Құпия кеңістікке\" орнатыңыз."</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Құпия кеңістікке файлдар мен басқа да элементтерді қосыңыз"</string>
</resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index ec54bd6..f1f050f 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"비공개 스페이스 전환"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"설치"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"비공개 스페이스에 앱 설치"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"비공개 스페이스에 파일 등 추가"</string>
</resources>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index d1cbf9a..141c643 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Privačios erdvės perkėlimas"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Įdiegti"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Įdiegti programas privačioje erdvėje"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Pridėkite failų ir kt. prie privačios erdvės"</string>
</resources>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index fa4dd27..723a742 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Fona tapete un stils"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Rediģēt sākuma ekrānu"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Sākumlapas iestatījumi"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Lietotnes"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Atspējojis administrators"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Atļaut sākuma ekrāna pagriešanu"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Pagriežot tālruni"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Samazināt augstumu"</string>
<string name="widget_resized" msgid="9130327887929620">"Logrīka lielums mainīts — platums: <xliff:g id="NUMBER_0">%1$s</xliff:g>, augstums: <xliff:g id="NUMBER_1">%2$s</xliff:g>."</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Saīsnes izvēlne"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Logrīka lieluma maiņas rāmis lietotnei <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Aizvērt"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Nerādīt"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Aizvērt"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personīgās lietotnes"</string>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Pāriet uz privāto mapi"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Instalēt"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Instalējiet lietotnes privātajā telpā."</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Pievienojiet failus un citu saturu privātajai telpai"</string>
</resources>
diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml
index 631e310..f017ad7 100644
--- a/res/values-mn/strings.xml
+++ b/res/values-mn/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Private Space-н шилжилт"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Суулгах"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Хувийн орон зайд аппууд суулгана уу"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Хаалттай орон зайд файл болон бусад зүйлийг нэмэх"</string>
</resources>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index c467055..258b821 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"သီးသန့်ချတ်ခန်း အပြောင်းအလဲ"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"ထည့်သွင်းရန်"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"‘သီးသန့်နေရာ’ တွင် အက်ပ်များ ထည့်သွင်းနိုင်သည်"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"‘သီးသန့်နေရာ’ တွင် ဖိုင်နှင့် အခြားအရာများ ထည့်နိုင်သည်"</string>
</resources>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index f4e10fc..200765c 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Private Space-overgang"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Installer"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Installer apper i privat område"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Legg til filer og annet i det private området"</string>
</resources>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
index 00cbba0..a368ad2 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"निजी स्पेस ट्रान्जिसन गरिँदै छ"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"इन्स्टल गर्नुहोस्"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"निजी स्पेसमा एपहरू इन्स्टल गर्नुहोस्"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"निजी स्पेसमा फाइल र अन्य कुरा हाल्नुहोस्"</string>
</resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 5fa50c6..9558cbf 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Overschakelen naar privéruimte"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Installeren"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Apps installeren in privégedeelte"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Bestanden en meer toevoegen aan privégedeelte"</string>
</resources>
diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml
index d2b1906..8351ecb 100644
--- a/res/values-or/strings.xml
+++ b/res/values-or/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"ପ୍ରାଇଭେଟ ସ୍ପେସ ଟ୍ରାଞ୍ଜିସନିଂ"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"ଇନଷ୍ଟଲ କରନ୍ତୁ"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"ଆପ୍ସକୁ ପ୍ରାଇଭେଟ ସ୍ପେସରେ ଇନଷ୍ଟଲ କରନ୍ତୁ"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"ପ୍ରାଇଭେଟ ସ୍ପେସରେ ଫାଇଲ ଏବଂ ଅଧିକ ଯୋଗ କରନ୍ତୁ"</string>
</resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 327c5ea..d1960a4 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Przenoszenie obszaru prywatnego"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Zainstaluj"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Zainstaluj aplikacje w przestrzeni prywatnej"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Dodawanie plików i innych elementów do przestrzeni prywatnej"</string>
</resources>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 9c7261b..de018c4 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Plano de fundo e estilo"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Editar tela inicial"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Configurações da tela inicial"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Apps"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Desativado pelo administrador"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Permitir a rotação da tela inicial"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Quando o smartphone for girado"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Diminuir altura"</string>
<string name="widget_resized" msgid="9130327887929620">"Widget redimensionado para a largura <xliff:g id="NUMBER_0">%1$s</xliff:g>, altura <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Menu de atalhos"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Frame de redimensionamento do widget para <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Fechar"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Dispensar"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Fechar"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Pessoais"</string>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Espaço particular em transição"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Instalar"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Instalar apps no espaço privado"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Adicione arquivos e muito mais ao espaço privado"</string>
</resources>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 9a61bb4..9683705 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Tranziție pentru spațiul privat"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Instalează"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Instalează aplicații în Spațiul privat"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Adaugă fișiere și altele în Spațiul privat"</string>
</resources>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index 504ca56..2fe2840 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Prechod súkromného priestoru"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Inštalovať"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Inštalácia aplikácií v súkromnom priestore"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Pridajte do súkromného priestoru súbory a ďalšie položky"</string>
</resources>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index 2906849..1279640 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Kalimi te \"Hapësira private\""</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Instalo"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Instalo aplikacionet në hapësirën private"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Shto skedarë dhe më shumë te \"Hapësira private\""</string>
</resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 898873a..b326a6f 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Överföring av privat rum"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Installera"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Installera appar i privat rum"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Lägg till filer och annat i det privata utrymmet"</string>
</resources>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index c6ee27b..576e247 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Mabadiliko ya Nafasi ya Faragha"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Weka"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Sakinisha programu kwenye Sehemu ya Faragha"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Weka faili na mengineyo kwenye Sehemu ya Faragha"</string>
</resources>
diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml
index 73782da..e252bf7 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"தனிப்பட்ட சேமிப்பிடத்திற்கு மாற்றுகிறது"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"நிறுவுக"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"தனிப்பட்ட சேமிப்பிடத்தில் ஆப்ஸை நிறுவும்"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"ரகசிய இடத்தில் ஃபைல்கள் மற்றும் பலவற்றைச் சேர்க்கலாம்"</string>
</resources>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index c5504fe..4daeb8a 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Gizli Alana Geçiş"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Yükle"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Uygulamaları özel alana yükleyin"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Özel alana dosya ve başka öğeler ekleyin"</string>
</resources>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 318944f..961e6e7 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Оформлення й стиль"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Редагувати головний екран"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Налаштування головного екрана"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Додатки"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Вимкнув адміністратор"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Дозволити обертання головного екрана"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Коли телефон обертається"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Зменшити висоту"</string>
<string name="widget_resized" msgid="9130327887929620">"Розміри віджета змінено на <xliff:g id="NUMBER_0">%1$s</xliff:g> завширшки та <xliff:g id="NUMBER_1">%2$s</xliff:g> заввишки"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Меню швидкого доступу"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Рамка для зміни розміру віджета \"<xliff:g id="STRING">%1$s</xliff:g>\""</string>
+ <string name="action_close" msgid="1077760267194136901">"Закрити"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Закрити"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Закрити"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Особисті додатки"</string>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Перехід у приватний простір"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Установити"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Установити додатки в особистому просторі"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Додавайте файли й інші об’єкти в приватний простір"</string>
</resources>
diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml
index 36000c0..ec0bb05 100644
--- a/res/values-ur/strings.xml
+++ b/res/values-ur/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"نجی اسپیس کی منتقلی"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"انسٹال کریں"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"پرائیویٹ اسپیس میں ایپس انسٹال کریں"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"پرائیویٹ اسپیس میں فائلز وغیرہ شامل کریں"</string>
</resources>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index a3ecb4e..c40fbe9 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Chuyển đổi sang không gian riêng tư"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Cài đặt"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Cài đặt ứng dụng vào Không gian riêng tư"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Thêm tệp và nội dung khác vào Không gian riêng tư"</string>
</resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 0b610dc..672a911 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"私密空间转换"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"安装"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"将应用安装到私密空间"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"将文件等内容添加到私密空间"</string>
</resources>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index 6262df5..dc51d9b 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"轉為「私人空間」"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"安裝"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"將應用程式安裝在「私人空間」中"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"新增檔案和其他內容到「私人空間」"</string>
</resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 9bb1056..531742b 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"轉換私人空間狀態"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"安裝"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"將應用程式安裝在私人空間中"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"將檔案和其他內容新增至私人空間"</string>
</resources>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 82fafc6..d4338d4 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -217,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Ukuguqulwa Kwendawo Yangasese"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Faka"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Faka ama-app Endaweni Engasese"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Faka amafayela nokunye Endaweni engasese"</string>
</resources>
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index 1ecac33..b0e9cd0 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -40,6 +40,7 @@
<attr name="iconOnlyShortcutColor" format="color" />
<attr name="eduHalfSheetBGColor" format="color" />
<attr name="overviewScrimColor" format="color" />
+ <attr name="overviewScrimColorOverBlur" format="color" />
<attr name="popupNotificationDotColor" format="color" />
<attr name="notificationDotColor" format="color" />
<attr name="focusOutlineColor" format="color" />
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 4d0379d..3f9c535 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -226,9 +226,11 @@
<dimen name="widget_picker_two_panels_left_right_margin">0dp</dimen>
<dimen name="widget_picker_header_app_title_font_size">16sp</dimen>
<integer name="widget_picker_header_app_title_font_weight">500</integer>
+ <integer name="widget_picker_header_selected_app_title_font_weight">600</integer>
<dimen name="widget_picker_header_app_title_line_height">24sp</dimen>
<dimen name="widget_picker_header_app_subtitle_font_size">14sp</dimen>
<integer name="widget_picker_header_app_subtitle_font_weight">400</integer>
+ <integer name="widget_picker_header_selected_app_subtitle_font_weight">600</integer>
<dimen name="widget_picker_header_app_subtitle_line_height">20sp</dimen>
<dimen name="widget_recommendations_table_vertical_padding">8dp</dimen>
<!-- Bottom margin for the search and recommended widgets container without work profile -->
diff --git a/res/values/strings.xml b/res/values/strings.xml
index a626097..f0578cd 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -42,6 +42,7 @@
<!-- Options for recent tasks -->
<!-- Title for an option to enter split screen mode for a given app -->
<string name="recent_task_option_split_screen">Split screen</string>
+ <string name="recent_task_option_aspect_ratio">Change aspect ratio</string>
<string name="split_app_info_accessibility">App info for %1$s</string>
<string name="split_app_usage_settings">Usage settings for %1$s</string>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index cf6c560..7d5b575 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -77,6 +77,7 @@
<item name="dropTargetHoverTextColor">@color/drop_target_hover_text_color_light</item>
<item name="dropTargetHoverButtonColor">@color/drop_target_hover_button_color_light</item>
<item name="overviewScrimColor">@color/overview_scrim</item>
+ <item name="overviewScrimColorOverBlur">#33000000</item>
<item name="preloadIconAccentColor">@color/preload_icon_accent_color_light</item>
<item name="preloadIconBackgroundColor">@color/preload_icon_background_color_light</item>
<item name="android:windowTranslucentStatus">false</item>
@@ -141,6 +142,7 @@
<item name="iconOnlyShortcutColor">#B3FFFFFF</item>
<item name="eduHalfSheetBGColor">#DD000000</item>
<item name="overviewScrimColor">@color/overview_scrim_dark</item>
+ <item name="overviewScrimColorOverBlur">#52000000</item>
<item name="preloadIconAccentColor">@color/preload_icon_accent_color_dark</item>
<item name="preloadIconBackgroundColor">@color/preload_icon_background_color_dark</item>
</style>
@@ -291,6 +293,36 @@
@color/widget_cell_subtitle_color_dark</item>
</style>
+ <style name="WidgetListHeader.Title" parent="@android:style/TextAppearance.DeviceDefault" >
+ <!-- Title / Medium -->
+ <item name="android:textFontWeight">@integer/widget_picker_header_app_title_font_weight</item>
+ <item name="android:textSize">@dimen/widget_picker_header_app_title_font_size</item>
+ <item name="android:lineHeight">@dimen/widget_picker_header_app_title_line_height</item>
+ <item name="android:textColor">?attr/widgetPickerHeaderAppTitleColor</item>
+ </style>
+
+ <style name="WidgetListHeader.Title.Selected" parent="WidgetListHeader.Title">
+ <!-- Title / Medium / Emphasized -->
+ <item name="android:textFontWeight">
+ @integer/widget_picker_header_selected_app_title_font_weight
+ </item>
+ </style>
+
+ <style name="WidgetListHeader.SubTitle" parent="@android:style/TextAppearance.DeviceDefault" >
+ <!-- Title / Small -->
+ <item name="android:textFontWeight">@integer/widget_picker_header_app_subtitle_font_weight</item>
+ <item name="android:textSize">@dimen/widget_picker_header_app_subtitle_font_size</item>
+ <item name="android:lineHeight">@dimen/widget_picker_header_app_subtitle_line_height</item>
+ <item name="android:textColor">?attr/widgetPickerHeaderAppSubtitleColor</item>
+ </style>
+
+ <style name="WidgetListHeader.SubTitle.Selected" parent="WidgetListHeader.SubTitle">
+ <!-- Title / Small / Emphasized -->
+ <item name="android:textFontWeight">
+ @integer/widget_picker_header_selected_app_subtitle_font_weight
+ </item>
+ </style>
+
<style name="FastScrollerPopup" parent="@android:style/TextAppearance.DeviceDefault.DialogWindowTitle">
<item name="android:layout_width">wrap_content</item>
<item name="android:minWidth">@dimen/fastscroll_popup_width</item>
diff --git a/src/com/android/launcher3/Utilities.java b/src/com/android/launcher3/Utilities.java
index d6ae3a6..79774b2 100644
--- a/src/com/android/launcher3/Utilities.java
+++ b/src/com/android/launcher3/Utilities.java
@@ -964,4 +964,15 @@
return null;
}
}
+
+ /**
+ * Logs with DEBUG priority if the current device is a debug device.
+ *
+ * <p>Debug devices by default include -eng and -userdebug builds, but not -user builds.
+ */
+ public static void debugLog(String tag, String message) {
+ if (BuildConfig.IS_DEBUG_DEVICE) {
+ Log.d(tag, message);
+ }
+ }
}
diff --git a/src/com/android/launcher3/dagger/LauncherBaseAppComponent.java b/src/com/android/launcher3/dagger/LauncherBaseAppComponent.java
index f86772e..c95c376 100644
--- a/src/com/android/launcher3/dagger/LauncherBaseAppComponent.java
+++ b/src/com/android/launcher3/dagger/LauncherBaseAppComponent.java
@@ -91,6 +91,7 @@
LoaderCursorFactory getLoaderCursorFactory();
WidgetHolderFactory getWidgetHolderFactory();
+ RefreshRateTracker getFrameRateProvider();
/** Builder for LauncherBaseAppComponent. */
interface Builder {
diff --git a/src/com/android/launcher3/logging/StatsLogManager.java b/src/com/android/launcher3/logging/StatsLogManager.java
index 40b597f..aaf26d0 100644
--- a/src/com/android/launcher3/logging/StatsLogManager.java
+++ b/src/com/android/launcher3/logging/StatsLogManager.java
@@ -865,6 +865,9 @@
@UiEvent(doc = "User long press nav handle and a long press runnable was created.")
LAUNCHER_OMNI_GET_LONG_PRESS_RUNNABLE(1545),
+ @UiEvent(doc = "User tapped on \"change aspect ratio\" system shortcut.")
+ LAUNCHER_ASPECT_RATIO_SETTINGS_SYSTEM_SHORTCUT_TAP(2219),
+
// One Grid Flags
@UiEvent(doc = "User sets the device in Fixed Landscape")
FIXED_LANDSCAPE_TOGGLE_ENABLE(2014),
diff --git a/src/com/android/launcher3/util/window/RefreshRateTracker.java b/src/com/android/launcher3/util/window/RefreshRateTracker.java
deleted file mode 100644
index e3397d4..0000000
--- a/src/com/android/launcher3/util/window/RefreshRateTracker.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.launcher3.util.window;
-
-import static android.view.Display.DEFAULT_DISPLAY;
-
-import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR;
-
-import android.content.Context;
-import android.hardware.display.DisplayManager;
-import android.hardware.display.DisplayManager.DisplayListener;
-import android.view.Display;
-
-import androidx.annotation.WorkerThread;
-
-import com.android.launcher3.dagger.ApplicationContext;
-import com.android.launcher3.dagger.LauncherAppComponent;
-import com.android.launcher3.dagger.LauncherAppSingleton;
-import com.android.launcher3.util.DaggerSingletonObject;
-import com.android.launcher3.util.DaggerSingletonTracker;
-import com.android.launcher3.util.SafeCloseable;
-
-import javax.inject.Inject;
-
-/**
- * Utility class to track refresh rate of the current device
- */
-@LauncherAppSingleton
-public class RefreshRateTracker implements DisplayListener, SafeCloseable {
-
- private static final DaggerSingletonObject<RefreshRateTracker> INSTANCE =
- new DaggerSingletonObject<>(LauncherAppComponent::getRefreshRateTracker);
-
- private int mSingleFrameMs = 1;
-
- private final DisplayManager mDM;
-
- @Inject
- RefreshRateTracker(@ApplicationContext Context context, DaggerSingletonTracker tracker) {
- mDM = context.getSystemService(DisplayManager.class);
- updateSingleFrameMs();
- mDM.registerDisplayListener(this, UI_HELPER_EXECUTOR.getHandler());
- tracker.addCloseable(this);
- }
-
- /**
- * Returns the single frame time in ms
- */
- public static int getSingleFrameMs(Context context) {
- return INSTANCE.get(context).mSingleFrameMs;
- }
-
- @Override
- public final void onDisplayAdded(int displayId) { }
-
- @Override
- public final void onDisplayRemoved(int displayId) { }
-
- @WorkerThread
- @Override
- public final void onDisplayChanged(int displayId) {
- if (displayId == DEFAULT_DISPLAY) {
- updateSingleFrameMs();
- }
- }
-
- private void updateSingleFrameMs() {
- Display display = mDM.getDisplay(DEFAULT_DISPLAY);
- if (display != null) {
- float refreshRate = display.getRefreshRate();
- mSingleFrameMs = refreshRate > 0 ? (int) (1000 / refreshRate) : 16;
- }
- }
-
- @Override
- public void close() {
- mDM.unregisterDisplayListener(this);
- }
-}
diff --git a/src/com/android/launcher3/util/window/RefreshRateTracker.kt b/src/com/android/launcher3/util/window/RefreshRateTracker.kt
new file mode 100644
index 0000000..577fec1
--- /dev/null
+++ b/src/com/android/launcher3/util/window/RefreshRateTracker.kt
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.launcher3.util.window
+
+import android.content.Context
+import android.hardware.display.DisplayManager
+import android.hardware.display.DisplayManager.DisplayListener
+import android.view.Display.DEFAULT_DISPLAY
+import com.android.launcher3.dagger.ApplicationContext
+import com.android.launcher3.dagger.LauncherAppSingleton
+import com.android.launcher3.dagger.LauncherComponentProvider.appComponent
+import com.android.launcher3.util.DaggerSingletonTracker
+import com.android.launcher3.util.Executors
+import javax.inject.Inject
+
+/** Utility class to track refresh rate of the current device */
+interface RefreshRateTracker {
+
+ val singleFrameMs: Int
+
+ @LauncherAppSingleton
+ class RefreshRateTrackerImpl
+ @Inject
+ constructor(@ApplicationContext ctx: Context, tracker: DaggerSingletonTracker) :
+ RefreshRateTracker, DisplayListener {
+
+ private val displayManager: DisplayManager =
+ ctx.getSystemService(DisplayManager::class.java)!!.also {
+ it.registerDisplayListener(this, Executors.UI_HELPER_EXECUTOR.handler)
+ tracker.addCloseable { it.unregisterDisplayListener(this) }
+ }
+
+ override var singleFrameMs: Int = updateSingleFrameMs()
+
+ private fun updateSingleFrameMs(): Int {
+ val refreshRate = displayManager.getDisplay(DEFAULT_DISPLAY)?.refreshRate
+ return if (refreshRate != null && refreshRate > 0) (1000 / refreshRate).toInt() else 16
+ }
+
+ override fun onDisplayChanged(displayId: Int) {
+ if (displayId == DEFAULT_DISPLAY) {
+ singleFrameMs = updateSingleFrameMs()
+ }
+ }
+
+ override fun onDisplayAdded(displayId: Int) {}
+
+ override fun onDisplayRemoved(displayId: Int) {}
+ }
+
+ companion object {
+
+ /** Returns the single frame time in ms */
+ @JvmStatic fun Context.getSingleFrameMs() = appComponent.frameRateProvider.singleFrameMs
+ }
+}
diff --git a/src/com/android/launcher3/widget/picker/WidgetsListHeader.java b/src/com/android/launcher3/widget/picker/WidgetsListHeader.java
index 2f123a3..836675a 100644
--- a/src/com/android/launcher3/widget/picker/WidgetsListHeader.java
+++ b/src/com/android/launcher3/widget/picker/WidgetsListHeader.java
@@ -131,6 +131,14 @@
public void setExpanded(boolean isExpanded) {
this.mIsExpanded = isExpanded;
refreshDrawableState();
+ refreshTextAppearance(isExpanded);
+ }
+
+ private void refreshTextAppearance(boolean isExpanded) {
+ mTitle.setTextAppearance(isExpanded ? R.style.WidgetListHeader_Title_Selected
+ : R.style.WidgetListHeader_Title);
+ mSubtitle.setTextAppearance(isExpanded ? R.style.WidgetListHeader_SubTitle_Selected
+ : R.style.WidgetListHeader_SubTitle);
}
/** @return true if this header is expanded. */
diff --git a/src_no_quickstep/com/android/launcher3/dagger/Modules.kt b/src_no_quickstep/com/android/launcher3/dagger/Modules.kt
index 7dbe9c3..21d8e06 100644
--- a/src_no_quickstep/com/android/launcher3/dagger/Modules.kt
+++ b/src_no_quickstep/com/android/launcher3/dagger/Modules.kt
@@ -16,6 +16,8 @@
package com.android.launcher3.dagger
+import com.android.launcher3.util.window.RefreshRateTracker
+import com.android.launcher3.util.window.RefreshRateTracker.RefreshRateTrackerImpl
import com.android.launcher3.widget.LauncherWidgetHolder.WidgetHolderFactory
import com.android.launcher3.widget.LauncherWidgetHolder.WidgetHolderFactoryImpl
import dagger.Binds
@@ -35,7 +37,10 @@
@Module abstract class PluginManagerWrapperModule {}
-@Module object StaticObjectModule {}
+@Module
+abstract class StaticObjectModule {
+ @Binds abstract fun bindRefreshRateTracker(tracker: RefreshRateTrackerImpl): RefreshRateTracker
+}
// Module containing bindings for the final derivative app
@Module abstract class AppModule {}
diff --git a/tests/src/com/android/launcher3/dragging/TaplUninstallRemoveTest.java b/tests/src/com/android/launcher3/dragging/TaplUninstallRemoveTest.java
index f490bd6..a03c161 100644
--- a/tests/src/com/android/launcher3/dragging/TaplUninstallRemoveTest.java
+++ b/tests/src/com/android/launcher3/dragging/TaplUninstallRemoveTest.java
@@ -26,6 +26,7 @@
import android.graphics.Point;
import android.platform.test.annotations.PlatinumTest;
+import android.platform.test.rule.ScreenRecordRule;
import android.util.Log;
import com.android.launcher3.Launcher;
@@ -107,6 +108,7 @@
@Test
@PortraitLandscape
@PlatinumTest(focusArea = "launcher")
+ @ScreenRecordRule.ScreenRecord // b/386231522
public void testUninstallFromAllApps() throws Exception {
// Ensure no existing app icons on the workspace cause scroll to all apps interruptions
mLauncher.clearLauncherData();