Merge "Update HomeSettings Font to Google Sans Flex" into main
diff --git a/aconfig/launcher.aconfig b/aconfig/launcher.aconfig
index cd8b891..d3c5c01 100644
--- a/aconfig/launcher.aconfig
+++ b/aconfig/launcher.aconfig
@@ -566,11 +566,14 @@
}
flag {
- name: "google_sans_flex_font"
+ name: "gsf_res"
namespace: "launcher"
description: "Adds refresh for font family. Needs to be fixed to be used in resources."
bug: "395145453"
is_fixed_read_only: true
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
}
flag {
diff --git a/proguard.flags b/proguard.flags
index da00c00..c0a0042 100644
--- a/proguard.flags
+++ b/proguard.flags
@@ -1,6 +1,12 @@
--keep,allowshrinking,allowoptimization class com.android.launcher3.** {
- *;
-}
+
+-keep,allowshrinking,allowoptimization class com.android.launcher3.** {*;}
+-keepclasseswithmembernames class com.android.launcher3.** {*;}
+
+-keep,allowshrinking,allowoptimization class com.android.systemui.shared.** {*;}
+-keepclasseswithmembernames class com.android.systemui.shared.** {*;}
+
+-keep,allowshrinking,allowoptimization class com.android.quickstep.** {*;}
+-keepclasseswithmembernames class com.android.quickstep.** {*;}
# The support library contains references to newer platform versions.
# Don't warn about those in case this app is linking against an older
@@ -49,14 +55,6 @@
# Ignore warnings for hidden utility classes referenced from the shared lib
-dontwarn com.android.internal.util.**
-################ Do not optimize recents lib #############
--keep class com.android.systemui.shared.** {
- *;
-}
-
--keep class com.android.quickstep.** {
- *;
-}
-keep class com.android.internal.protolog.** {
*;
diff --git a/quickstep/res/drawable/taskbar_divider_button_expressive_theme.xml b/quickstep/res/drawable/taskbar_divider_button_expressive_theme.xml
new file mode 100644
index 0000000..7fc61fc
--- /dev/null
+++ b/quickstep/res/drawable/taskbar_divider_button_expressive_theme.xml
@@ -0,0 +1,30 @@
+<?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="52dp"
+ android:height="52dp"
+ android:viewportHeight="52"
+ android:viewportWidth="52">
+ <group>
+ <path
+ android:fillColor="@color/taskbar_divider_background"
+ android:pathData="M26,14L26,38"
+ android:strokeColor="@color/taskbar_divider_background"
+ android:strokeLineCap="round"
+ android:strokeWidth="3" />
+ </group>
+</vector>
\ No newline at end of file
diff --git a/quickstep/res/values-af/strings.xml b/quickstep/res/values-af/strings.xml
index 83e6f79..c2f572b 100644
--- a/quickstep/res/values-af/strings.xml
+++ b/quickstep/res/values-af/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Borrel"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Oorvloei"</string>
<string name="bubble_bar_bubble_description" msgid="1882466152448446446">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> vanaf <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
diff --git a/quickstep/res/values-am/strings.xml b/quickstep/res/values-am/strings.xml
index d596734..e335423 100644
--- a/quickstep/res/values-am/strings.xml
+++ b/quickstep/res/values-am/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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-ar/strings.xml b/quickstep/res/values-ar/strings.xml
index ec37983..8fbc23b 100644
--- a/quickstep/res/values-ar/strings.xml
+++ b/quickstep/res/values-ar/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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-as/strings.xml b/quickstep/res/values-as/strings.xml
index 9cadc10..8c1ccda 100644
--- a/quickstep/res/values-as/strings.xml
+++ b/quickstep/res/values-as/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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-az/strings.xml b/quickstep/res/values-az/strings.xml
index bf34d27..53de211 100644
--- a/quickstep/res/values-az/strings.xml
+++ b/quickstep/res/values-az/strings.xml
@@ -149,6 +149,10 @@
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> və <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Yumrucuq"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Kənara çıxma"</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-b+sr+Latn/strings.xml b/quickstep/res/values-b+sr+Latn/strings.xml
index 14724e9..1db58be 100644
--- a/quickstep/res/values-b+sr+Latn/strings.xml
+++ b/quickstep/res/values-b+sr+Latn/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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 5f55b41..20c914d 100644
--- a/quickstep/res/values-be/strings.xml
+++ b/quickstep/res/values-be/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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-bg/strings.xml b/quickstep/res/values-bg/strings.xml
index 871501f..414219a 100644
--- a/quickstep/res/values-bg/strings.xml
+++ b/quickstep/res/values-bg/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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-bn/strings.xml b/quickstep/res/values-bn/strings.xml
index a1e30bb..001c008 100644
--- a/quickstep/res/values-bn/strings.xml
+++ b/quickstep/res/values-bn/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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-bs/strings.xml b/quickstep/res/values-bs/strings.xml
index 57aa3c3..1eb88aa 100644
--- a/quickstep/res/values-bs/strings.xml
+++ b/quickstep/res/values-bs/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Oblačić"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Preklopni meni"</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-ca/strings.xml b/quickstep/res/values-ca/strings.xml
index e729ff5..6397b14 100644
--- a/quickstep/res/values-ca/strings.xml
+++ b/quickstep/res/values-ca/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Bombolla"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Desbordament"</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-cs/strings.xml b/quickstep/res/values-cs/strings.xml
index 5106ae3..3b000ef 100644
--- a/quickstep/res/values-cs/strings.xml
+++ b/quickstep/res/values-cs/strings.xml
@@ -149,6 +149,10 @@
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> a <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Bublina"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Rozbalovací nabídka"</string>
<string name="bubble_bar_bubble_description" msgid="1882466152448446446">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> z aplikace <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
diff --git a/quickstep/res/values-da/strings.xml b/quickstep/res/values-da/strings.xml
index 1328da9..cf45967 100644
--- a/quickstep/res/values-da/strings.xml
+++ b/quickstep/res/values-da/strings.xml
@@ -149,6 +149,10 @@
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> og <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Boble"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Overløb"</string>
<string name="bubble_bar_bubble_description" msgid="1882466152448446446">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> fra <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
diff --git a/quickstep/res/values-de/strings.xml b/quickstep/res/values-de/strings.xml
index 2074d5e..f15838e 100644
--- a/quickstep/res/values-de/strings.xml
+++ b/quickstep/res/values-de/strings.xml
@@ -149,6 +149,10 @@
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> und <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Bubble"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Weitere Optionen"</string>
<string name="bubble_bar_bubble_description" msgid="1882466152448446446">"„<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>“ aus <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
diff --git a/quickstep/res/values-el/strings.xml b/quickstep/res/values-el/strings.xml
index 8951e20..a94a2f2 100644
--- a/quickstep/res/values-el/strings.xml
+++ b/quickstep/res/values-el/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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-en-rAU/strings.xml b/quickstep/res/values-en-rAU/strings.xml
index 18e5984..9082df4 100644
--- a/quickstep/res/values-en-rAU/strings.xml
+++ b/quickstep/res/values-en-rAU/strings.xml
@@ -149,6 +149,10 @@
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> and <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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> from <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
diff --git a/quickstep/res/values-en-rCA/strings.xml b/quickstep/res/values-en-rCA/strings.xml
index 8f52c66..0d9e572 100644
--- a/quickstep/res/values-en-rCA/strings.xml
+++ b/quickstep/res/values-en-rCA/strings.xml
@@ -140,14 +140,15 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Move to top/left"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Move to bottom/right"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Open app as a bubble"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Recent apps"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Recent app list"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{more app}other{more apps}}"</string>
<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> and <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
+ <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> of <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="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Bubble"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Overflow"</string>
diff --git a/quickstep/res/values-en-rGB/strings.xml b/quickstep/res/values-en-rGB/strings.xml
index 18e5984..9082df4 100644
--- a/quickstep/res/values-en-rGB/strings.xml
+++ b/quickstep/res/values-en-rGB/strings.xml
@@ -149,6 +149,10 @@
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> and <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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> from <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
diff --git a/quickstep/res/values-en-rIN/strings.xml b/quickstep/res/values-en-rIN/strings.xml
index 18e5984..9082df4 100644
--- a/quickstep/res/values-en-rIN/strings.xml
+++ b/quickstep/res/values-en-rIN/strings.xml
@@ -149,6 +149,10 @@
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> and <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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> from <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 d909af1..78bb88a 100644
--- a/quickstep/res/values-es-rUS/strings.xml
+++ b/quickstep/res/values-es-rUS/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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-es/strings.xml b/quickstep/res/values-es/strings.xml
index 016e579..542e8aa 100644
--- a/quickstep/res/values-es/strings.xml
+++ b/quickstep/res/values-es/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Burbuja"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Menú adicional"</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-et/strings.xml b/quickstep/res/values-et/strings.xml
index ecf59af..66d0b9f 100644
--- a/quickstep/res/values-et/strings.xml
+++ b/quickstep/res/values-et/strings.xml
@@ -149,6 +149,10 @@
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> ja <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Mull"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Ületäide"</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-eu/strings.xml b/quickstep/res/values-eu/strings.xml
index 90748c0..618992c 100644
--- a/quickstep/res/values-eu/strings.xml
+++ b/quickstep/res/values-eu/strings.xml
@@ -149,6 +149,10 @@
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> eta <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Burbuila"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Luzapena"</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-fa/strings.xml b/quickstep/res/values-fa/strings.xml
index ee9ed1d..9745b58 100644
--- a/quickstep/res/values-fa/strings.xml
+++ b/quickstep/res/values-fa/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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-fi/strings.xml b/quickstep/res/values-fi/strings.xml
index f681e0d..af132e7 100644
--- a/quickstep/res/values-fi/strings.xml
+++ b/quickstep/res/values-fi/strings.xml
@@ -149,6 +149,10 @@
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> ja <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Kupla"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Ylivuoto"</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-fr-rCA/strings.xml b/quickstep/res/values-fr-rCA/strings.xml
index 5b1f149..6c4fcc4 100644
--- a/quickstep/res/values-fr-rCA/strings.xml
+++ b/quickstep/res/values-fr-rCA/strings.xml
@@ -149,6 +149,10 @@
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> et <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Bulle"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Bulle à développer"</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-fr/strings.xml b/quickstep/res/values-fr/strings.xml
index 95b448d..09079d8 100644
--- a/quickstep/res/values-fr/strings.xml
+++ b/quickstep/res/values-fr/strings.xml
@@ -149,6 +149,10 @@
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> et <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Bulle"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Dépassement"</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-gl/strings.xml b/quickstep/res/values-gl/strings.xml
index e59b451..3840b5e 100644
--- a/quickstep/res/values-gl/strings.xml
+++ b/quickstep/res/values-gl/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Burbulla"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Menú adicional"</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-gu/strings.xml b/quickstep/res/values-gu/strings.xml
index b0238d0..c39fe20 100644
--- a/quickstep/res/values-gu/strings.xml
+++ b/quickstep/res/values-gu/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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-hi/strings.xml b/quickstep/res/values-hi/strings.xml
index 6aba44c..af24811 100644
--- a/quickstep/res/values-hi/strings.xml
+++ b/quickstep/res/values-hi/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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-hr/strings.xml b/quickstep/res/values-hr/strings.xml
index 963ce57..fca73aa 100644
--- a/quickstep/res/values-hr/strings.xml
+++ b/quickstep/res/values-hr/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Oblačić"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Dodatni izbornik"</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-hu/strings.xml b/quickstep/res/values-hu/strings.xml
index 093c92d..6584eaf 100644
--- a/quickstep/res/values-hu/strings.xml
+++ b/quickstep/res/values-hu/strings.xml
@@ -140,14 +140,15 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Mozgatás felülre vagy a bal oldalra"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Mozgatás alulra vagy a jobb oldalra"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Alkalmazás megnyitása buborékként"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Legutóbbi alkalmazások"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Legutóbbi alkalmazások listája"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{további alkalmazás}other{további alkalmazás}}"</string>
<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>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
+ <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="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Buborék"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Túlcsordulás"</string>
diff --git a/quickstep/res/values-hy/strings.xml b/quickstep/res/values-hy/strings.xml
index 0fa5d2d..184e281 100644
--- a/quickstep/res/values-hy/strings.xml
+++ b/quickstep/res/values-hy/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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-in/strings.xml b/quickstep/res/values-in/strings.xml
index fe28340..19ce0ad 100644
--- a/quickstep/res/values-in/strings.xml
+++ b/quickstep/res/values-in/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Balon"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Tambahan"</string>
<string name="bubble_bar_bubble_description" msgid="1882466152448446446">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> dari <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
diff --git a/quickstep/res/values-is/strings.xml b/quickstep/res/values-is/strings.xml
index a0657dd..77e2fd0 100644
--- a/quickstep/res/values-is/strings.xml
+++ b/quickstep/res/values-is/strings.xml
@@ -149,6 +149,10 @@
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> og <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Blaðra"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Yfirflæði"</string>
<string name="bubble_bar_bubble_description" msgid="1882466152448446446">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> frá <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 bc795e4..2069ece 100644
--- a/quickstep/res/values-it/strings.xml
+++ b/quickstep/res/values-it/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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-iw/strings.xml b/quickstep/res/values-iw/strings.xml
index 3f5ddfc..2b2302b 100644
--- a/quickstep/res/values-iw/strings.xml
+++ b/quickstep/res/values-iw/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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-ja/strings.xml b/quickstep/res/values-ja/strings.xml
index d6f64a5..596e104 100644
--- a/quickstep/res/values-ja/strings.xml
+++ b/quickstep/res/values-ja/strings.xml
@@ -140,14 +140,15 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"上 / 左に移動"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"下 / 右に移動"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"アプリをバブルとして開く"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"最近使ったアプリ"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"最近使ったアプリの一覧"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{個のその他のアプリ}other{個のその他のアプリ}}"</string>
<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>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
+ <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="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"ふきだし"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"オーバーフロー"</string>
diff --git a/quickstep/res/values-ka/strings.xml b/quickstep/res/values-ka/strings.xml
index 1ea1eea..c590ade 100644
--- a/quickstep/res/values-ka/strings.xml
+++ b/quickstep/res/values-ka/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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-kk/strings.xml b/quickstep/res/values-kk/strings.xml
index b06ac37..b9785a4 100644
--- a/quickstep/res/values-kk/strings.xml
+++ b/quickstep/res/values-kk/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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-km/strings.xml b/quickstep/res/values-km/strings.xml
index 6686851..a139ca3 100644
--- a/quickstep/res/values-km/strings.xml
+++ b/quickstep/res/values-km/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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 3bb3d46..a1907d5 100644
--- a/quickstep/res/values-kn/strings.xml
+++ b/quickstep/res/values-kn/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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-ko/strings.xml b/quickstep/res/values-ko/strings.xml
index 367908f..1e7e850 100644
--- a/quickstep/res/values-ko/strings.xml
+++ b/quickstep/res/values-ko/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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 834e38f..3190dee 100644
--- a/quickstep/res/values-ky/strings.xml
+++ b/quickstep/res/values-ky/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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-lo/strings.xml b/quickstep/res/values-lo/strings.xml
index 80b745b..42b487e 100644
--- a/quickstep/res/values-lo/strings.xml
+++ b/quickstep/res/values-lo/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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 bb1fff3..20fcc80 100644
--- a/quickstep/res/values-lt/strings.xml
+++ b/quickstep/res/values-lt/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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-lv/strings.xml b/quickstep/res/values-lv/strings.xml
index c3c21a6..7b256a7 100644
--- a/quickstep/res/values-lv/strings.xml
+++ b/quickstep/res/values-lv/strings.xml
@@ -149,6 +149,10 @@
<string name="quick_switch_split_task" msgid="5598194724255333896">"“<xliff:g id="APP_NAME_1">%1$s</xliff:g>” un “<xliff:g id="APP_NAME_2">%2$s</xliff:g>”"</string>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Burbulis"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Pārpilde"</string>
<string name="bubble_bar_bubble_description" msgid="1882466152448446446">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> no lietotnes <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
diff --git a/quickstep/res/values-mk/strings.xml b/quickstep/res/values-mk/strings.xml
index 7362c82..08dc459 100644
--- a/quickstep/res/values-mk/strings.xml
+++ b/quickstep/res/values-mk/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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-ml/strings.xml b/quickstep/res/values-ml/strings.xml
index 9aa1d1c..9b87841 100644
--- a/quickstep/res/values-ml/strings.xml
+++ b/quickstep/res/values-ml/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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-mn/strings.xml b/quickstep/res/values-mn/strings.xml
index 129b75c..f390e21 100644
--- a/quickstep/res/values-mn/strings.xml
+++ b/quickstep/res/values-mn/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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 818b824..4e6d309 100644
--- a/quickstep/res/values-mr/strings.xml
+++ b/quickstep/res/values-mr/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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 c06811b..a633bf4 100644
--- a/quickstep/res/values-ms/strings.xml
+++ b/quickstep/res/values-ms/strings.xml
@@ -140,14 +140,15 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Alihkan ke atas/kiri"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Alihkan ke bawah/kanan"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Buka apl sebagai gelembung"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Apl terbaharu"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Senarai apl terbaharu"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{apl lagi}other{apl lagi}}"</string>
<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>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
+ <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="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Gelembung"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Limpahan"</string>
diff --git a/quickstep/res/values-my/strings.xml b/quickstep/res/values-my/strings.xml
index b556ded..8f90b8b 100644
--- a/quickstep/res/values-my/strings.xml
+++ b/quickstep/res/values-my/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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-nb/strings.xml b/quickstep/res/values-nb/strings.xml
index 4528a83..a5799c5 100644
--- a/quickstep/res/values-nb/strings.xml
+++ b/quickstep/res/values-nb/strings.xml
@@ -149,6 +149,10 @@
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> og <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Boble"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Overflyt"</string>
<string name="bubble_bar_bubble_description" msgid="1882466152448446446">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> fra <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 2d35a22..b1b03e4 100644
--- a/quickstep/res/values-ne/strings.xml
+++ b/quickstep/res/values-ne/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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 3086c40..bd4dfc5 100644
--- a/quickstep/res/values-nl/strings.xml
+++ b/quickstep/res/values-nl/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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-or/strings.xml b/quickstep/res/values-or/strings.xml
index 4581f97..7efa026 100644
--- a/quickstep/res/values-or/strings.xml
+++ b/quickstep/res/values-or/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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-pa/strings.xml b/quickstep/res/values-pa/strings.xml
index ac88e6f..798619b 100644
--- a/quickstep/res/values-pa/strings.xml
+++ b/quickstep/res/values-pa/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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-pl/strings.xml b/quickstep/res/values-pl/strings.xml
index 090dc4c..6f6b08b 100644
--- a/quickstep/res/values-pl/strings.xml
+++ b/quickstep/res/values-pl/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Dymek"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Rozwijany"</string>
<string name="bubble_bar_bubble_description" msgid="1882466152448446446">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> z aplikacji <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
diff --git a/quickstep/res/values-pt-rPT/strings.xml b/quickstep/res/values-pt-rPT/strings.xml
index ff5dbf7..7f3a3c2 100644
--- a/quickstep/res/values-pt-rPT/strings.xml
+++ b/quickstep/res/values-pt-rPT/strings.xml
@@ -140,14 +140,15 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Mover para a parte superior esquerda"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Mover para a part superior direita"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Abrir app como um balão"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Apps recentes"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Lista de apps recentes"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{outra app}other{outras apps}}"</string>
<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>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
+ <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="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Balão"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Menu adicional"</string>
diff --git a/quickstep/res/values-pt/strings.xml b/quickstep/res/values-pt/strings.xml
index bc0b838..892881b 100644
--- a/quickstep/res/values-pt/strings.xml
+++ b/quickstep/res/values-pt/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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-ro/strings.xml b/quickstep/res/values-ro/strings.xml
index 0d1aab1..3be5fcc 100644
--- a/quickstep/res/values-ro/strings.xml
+++ b/quickstep/res/values-ro/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Balon"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Suplimentar"</string>
<string name="bubble_bar_bubble_description" msgid="1882466152448446446">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> de la <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
diff --git a/quickstep/res/values-ru/strings.xml b/quickstep/res/values-ru/strings.xml
index 3cf299d..8129585 100644
--- a/quickstep/res/values-ru/strings.xml
+++ b/quickstep/res/values-ru/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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-si/strings.xml b/quickstep/res/values-si/strings.xml
index 0b4efc4..2d6a3b9 100644
--- a/quickstep/res/values-si/strings.xml
+++ b/quickstep/res/values-si/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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-sk/strings.xml b/quickstep/res/values-sk/strings.xml
index 9ca4ae7..e3a86cb 100644
--- a/quickstep/res/values-sk/strings.xml
+++ b/quickstep/res/values-sk/strings.xml
@@ -149,6 +149,10 @@
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> a <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Bublina"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Rozbaľovacia ponuka"</string>
<string name="bubble_bar_bubble_description" msgid="1882466152448446446">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> z aplikácie <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
diff --git a/quickstep/res/values-sl/strings.xml b/quickstep/res/values-sl/strings.xml
index 9a437bc..1f87e65 100644
--- a/quickstep/res/values-sl/strings.xml
+++ b/quickstep/res/values-sl/strings.xml
@@ -140,14 +140,15 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Premakni na vrh/levo"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Premakni na dno/desno"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Odpri aplikacijo kot oblaček"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Nedavne aplikacije"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Seznam nedavnih aplikacij"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{dodatna aplikacija}one{dodatna aplikacija}two{dodatni aplikaciji}few{dodatne aplikacije}other{dodatnih aplikacij}}"</string>
<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>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
+ <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="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Oblaček"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Oblaček z dodatnimi elementi"</string>
diff --git a/quickstep/res/values-sq/strings.xml b/quickstep/res/values-sq/strings.xml
index c72b926..0bea11d 100644
--- a/quickstep/res/values-sq/strings.xml
+++ b/quickstep/res/values-sq/strings.xml
@@ -149,6 +149,10 @@
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> dhe <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Flluska"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Tejkalimi"</string>
<string name="bubble_bar_bubble_description" msgid="1882466152448446446">"\"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>\" nga <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 c418302..06ca295 100644
--- a/quickstep/res/values-sr/strings.xml
+++ b/quickstep/res/values-sr/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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-sv/strings.xml b/quickstep/res/values-sv/strings.xml
index 76c8d3d..8f57cad 100644
--- a/quickstep/res/values-sv/strings.xml
+++ b/quickstep/res/values-sv/strings.xml
@@ -149,6 +149,10 @@
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> och <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Bubbla"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Fler alternativ"</string>
<string name="bubble_bar_bubble_description" msgid="1882466152448446446">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> från <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
diff --git a/quickstep/res/values-sw/strings.xml b/quickstep/res/values-sw/strings.xml
index ca800d9..7aaf14e 100644
--- a/quickstep/res/values-sw/strings.xml
+++ b/quickstep/res/values-sw/strings.xml
@@ -149,6 +149,10 @@
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> na <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Kiputo"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Kiputo cha vipengee vya ziada"</string>
<string name="bubble_bar_bubble_description" msgid="1882466152448446446">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> kutoka <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
diff --git a/quickstep/res/values-ta/strings.xml b/quickstep/res/values-ta/strings.xml
index 236982a..b0b771e 100644
--- a/quickstep/res/values-ta/strings.xml
+++ b/quickstep/res/values-ta/strings.xml
@@ -90,7 +90,7 @@
<string name="allset_title" msgid="5021126669778966707">"அனைத்தையும் அமைத்துவிட்டீர்கள்!"</string>
<string name="allset_hint" msgid="459504134589971527">"முகப்புக்குச் செல்ல மேல்நோக்கி ஸ்வைப் செய்யுங்கள்"</string>
<string name="allset_button_hint" msgid="2395219947744706291">"முகப்புத் திரைக்குச் செல்வதற்கு முகப்பு பட்டனைத் தட்டவும்"</string>
- <string name="allset_description_generic" msgid="5385500062202019855">"உங்கள் <xliff:g id="DEVICE">%1$s</xliff:g> ஐப் பயன்படுத்தத் தயாராகிவிட்டீர்கள்"</string>
+ <string name="allset_description_generic" msgid="5385500062202019855">"உங்கள் <xliff:g id="DEVICE">%1$s</xliff:g> உங்களுக்காகத் தயாராக இருக்கிறது"</string>
<string name="default_device_name" msgid="6660656727127422487">"சாதனம்"</string>
<string name="allset_navigation_settings" msgid="4713404605961476027"><annotation id="link">"சிஸ்டம் வழிசெலுத்தல் அமைப்புகள்"</annotation></string>
<string name="action_share" msgid="2648470652637092375">"பகிர்"</string>
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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-te/strings.xml b/quickstep/res/values-te/strings.xml
index d5bc982..5f0e7a4 100644
--- a/quickstep/res/values-te/strings.xml
+++ b/quickstep/res/values-te/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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 6767358..9a88f92 100644
--- a/quickstep/res/values-th/strings.xml
+++ b/quickstep/res/values-th/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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 479a5d3..f85cce4 100644
--- a/quickstep/res/values-tl/strings.xml
+++ b/quickstep/res/values-tl/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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-tr/strings.xml b/quickstep/res/values-tr/strings.xml
index e68056a..c39a65f 100644
--- a/quickstep/res/values-tr/strings.xml
+++ b/quickstep/res/values-tr/strings.xml
@@ -149,6 +149,10 @@
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> ve <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Balon"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Taşma"</string>
<string name="bubble_bar_bubble_description" msgid="1882466152448446446">"<xliff:g id="APP_NAME">%2$s</xliff:g> uygulamasından <xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g>"</string>
diff --git a/quickstep/res/values-uk/strings.xml b/quickstep/res/values-uk/strings.xml
index 350b23b..433e020 100644
--- a/quickstep/res/values-uk/strings.xml
+++ b/quickstep/res/values-uk/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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-ur/strings.xml b/quickstep/res/values-ur/strings.xml
index 3b46f51..603760c 100644
--- a/quickstep/res/values-ur/strings.xml
+++ b/quickstep/res/values-ur/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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-uz/strings.xml b/quickstep/res/values-uz/strings.xml
index 3f61658..f289573 100644
--- a/quickstep/res/values-uz/strings.xml
+++ b/quickstep/res/values-uz/strings.xml
@@ -149,6 +149,10 @@
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> va <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Pufak"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Kengaytirish"</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-vi/strings.xml b/quickstep/res/values-vi/strings.xml
index 6f48660..d0f5252 100644
--- a/quickstep/res/values-vi/strings.xml
+++ b/quickstep/res/values-vi/strings.xml
@@ -149,6 +149,10 @@
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> và <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Bong bóng"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Bong bóng bổ sung"</string>
<string name="bubble_bar_bubble_description" msgid="1882466152448446446">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> từ <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
diff --git a/quickstep/res/values-zh-rCN/strings.xml b/quickstep/res/values-zh-rCN/strings.xml
index 8e8badc..6548148 100644
--- a/quickstep/res/values-zh-rCN/strings.xml
+++ b/quickstep/res/values-zh-rCN/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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-zh-rHK/strings.xml b/quickstep/res/values-zh-rHK/strings.xml
index 9f5745a..0606463 100644
--- a/quickstep/res/values-zh-rHK/strings.xml
+++ b/quickstep/res/values-zh-rHK/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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-zh-rTW/strings.xml b/quickstep/res/values-zh-rTW/strings.xml
index d11cafd..44c6fdf 100644
--- a/quickstep/res/values-zh-rTW/strings.xml
+++ b/quickstep/res/values-zh-rTW/strings.xml
@@ -149,6 +149,10 @@
<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>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<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-zu/strings.xml b/quickstep/res/values-zu/strings.xml
index 1d99965..c666ee7 100644
--- a/quickstep/res/values-zu/strings.xml
+++ b/quickstep/res/values-zu/strings.xml
@@ -149,6 +149,10 @@
<string name="quick_switch_split_task" msgid="5598194724255333896">"I-<xliff:g id="APP_NAME_1">%1$s</xliff:g> ne-<xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
<skip />
+ <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
+ <skip />
+ <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
+ <skip />
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Ibhamuza"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Ukugcwala kakhulu"</string>
<string name="bubble_bar_bubble_description" msgid="1882466152448446446">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> kusuka ku-<xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
diff --git a/quickstep/res/values/config.xml b/quickstep/res/values/config.xml
index 1ce28cf..49cee0f 100644
--- a/quickstep/res/values/config.xml
+++ b/quickstep/res/values/config.xml
@@ -23,7 +23,6 @@
<string name="stats_log_manager_class" translatable="false">com.android.quickstep.logging.StatsLogCompatManager</string>
<string name="test_information_handler_class" translatable="false">com.android.quickstep.QuickstepTestInformationHandler</string>
- <string name="widget_holder_factory_class" translatable="false">com.android.launcher3.uioverrides.QuickstepWidgetHolder$QuickstepHolderFactory</string>
<string name="instant_app_resolver_class" translatable="false">com.android.quickstep.InstantAppResolverImpl</string>
<string name="app_launch_tracker_class" translatable="false">com.android.launcher3.appprediction.PredictionAppTracker</string>
<string name="main_process_initializer_class" translatable="false">com.android.quickstep.QuickstepProcessInitializer</string>
diff --git a/quickstep/res/values/dimens.xml b/quickstep/res/values/dimens.xml
index c74390e..cb3c446 100644
--- a/quickstep/res/values/dimens.xml
+++ b/quickstep/res/values/dimens.xml
@@ -363,6 +363,7 @@
<dimen name="taskbar_home_button_left_margin_kids">48dp</dimen>
<dimen name="taskbar_icon_size_kids">32dp</dimen>
<dimen name="taskbar_all_apps_search_button_translation_x_offset">6dp</dimen>
+ <dimen name="taskbar_all_apps_search_button_translation_x_offset_for_expressive_theme">5.5dp</dimen>
<dimen name="taskbar_contextual_button_suw_margin">64dp</dimen>
<dimen name="taskbar_contextual_button_suw_height">64dp</dimen>
<dimen name="taskbar_back_button_suw_start_margin">48dp</dimen>
@@ -381,6 +382,7 @@
<dimen name="transient_taskbar_key_shadow_distance">10dp</dimen>
<dimen name="transient_taskbar_stashed_height">32dp</dimen>
<dimen name="transient_taskbar_all_apps_button_translation_x_offset">8dp</dimen>
+ <dimen name="transient_taskbar_all_apps_button_translation_x_offset_for_expressive_theme">8dp</dimen>
<dimen name="transient_taskbar_stash_spring_velocity_dp_per_s">400dp</dimen>
<dimen name="taskbar_tooltip_vertical_padding">8dp</dimen>
<dimen name="taskbar_tooltip_horizontal_padding">16dp</dimen>
@@ -459,7 +461,8 @@
<!-- Container size with pointer included: bubblebar_size + bubblebar_pointer_size -->
<dimen name="bubblebar_size_with_pointer">80dp</dimen>
<dimen name="bubblebar_elevation">1dp</dimen>
- <dimen name="bubblebar_drag_elevation">2dp</dimen>
+ <!-- TODO b/396539130: used wmshared value once resources are fixed -->
+ <dimen name="dragged_bubble_elevation">3dp</dimen>
<dimen name="bubblebar_hotseat_adjustment_threshold">90dp</dimen>
<dimen name="bubblebar_bounce_distance">20dp</dimen>
@@ -532,8 +535,8 @@
<dimen name="keyboard_quick_switch_text_button_fade_edge_length">20dp</dimen>
<dimen name="keyboard_quick_switch_scroll_button_width">36dp</dimen>
<dimen name="keyboard_quick_switch_scroll_button_height">56dp</dimen>
- <dimen name="keyboard_quick_switch_scroll_button_horizontal_padding">12dp</dimen>
- <dimen name="keyboard_quick_switch_scroll_button_vertical_padding">32dp</dimen>
+ <dimen name="keyboard_quick_switch_scroll_button_horizontal_padding">6dp</dimen>
+ <dimen name="keyboard_quick_switch_scroll_button_vertical_padding">16dp</dimen>
<dimen name="keyboard_quick_switch_scroll_button_corner_radius">18dp</dimen>
<!-- Digital Wellbeing -->
diff --git a/quickstep/res/values/strings.xml b/quickstep/res/values/strings.xml
index 7578bd5..f263f7e 100644
--- a/quickstep/res/values/strings.xml
+++ b/quickstep/res/values/strings.xml
@@ -345,12 +345,10 @@
<!-- Accessibility label for quick switch tiles that include information about the tile's position in the parent list [CHAR LIMIT=NONE] -->
<string name="quick_switch_task_with_position_in_parent"><xliff:g id="task_description" example="Chrome">%1$s</xliff:g>, item <xliff:g id="index_in_parent" example="1">%2$d</xliff:g> of <xliff:g id="total_tasks" example="5">%3$d</xliff:g></string>
- <!-- Accessibility label for an arrow button within quick switch UI that scrolls the quick switch content left
- TODO(b/397975686): Make these translatable when verified by UX. -->
- <string name="quick_switch_scroll_arrow_left" translatable="false">Scroll left</string>
- <!-- Accessibility label for an arrow button within quick switch UI that scrolls the quick switch content right
- TODO(b/397975686): Make these translatable when verified by UX. -->
- <string name="quick_switch_scroll_arrow_right" translatable="false">Scroll right</string>
+ <!-- Accessibility label for an arrow button within quick switch UI that scrolls the quick switch content left -->
+ <string name="quick_switch_scroll_arrow_left">Scroll left</string>
+ <!-- Accessibility label for an arrow button within quick switch UI that scrolls the quick switch content right -->
+ <string name="quick_switch_scroll_arrow_right">Scroll right</string>
<!-- Strings for bubble bar -->
<!-- Fallback name for a bubble if it does have a title [CHAR_LIMIT=none] -->
diff --git a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java
index aae8a56..21af26e 100644
--- a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java
+++ b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java
@@ -40,12 +40,14 @@
import static com.android.app.animation.Interpolators.DECELERATE_1_7;
import static com.android.app.animation.Interpolators.EXAGGERATED_EASE;
import static com.android.app.animation.Interpolators.LINEAR;
+import static com.android.launcher3.BaseActivity.EVENT_DESTROYED;
import static com.android.launcher3.BaseActivity.INVISIBLE_ALL;
import static com.android.launcher3.BaseActivity.INVISIBLE_BY_APP_TRANSITIONS;
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.launcher3.Flags.enableContainerReturnAnimations;
import static com.android.launcher3.Flags.enableScalingRevealHomeAnimation;
+import static com.android.launcher3.Flags.syncAppLaunchWithTaskbarStash;
import static com.android.launcher3.LauncherAnimUtils.SCALE_PROPERTY;
import static com.android.launcher3.LauncherState.ALL_APPS;
import static com.android.launcher3.LauncherState.BACKGROUND_APP;
@@ -92,6 +94,7 @@
import android.os.SystemProperties;
import android.os.UserHandle;
import android.provider.Settings;
+import android.util.Log;
import android.util.Pair;
import android.util.Size;
import android.view.CrossWindowBlurListeners;
@@ -182,6 +185,7 @@
* Manages the opening and closing app transitions from Launcher
*/
public class QuickstepTransitionManager implements OnDeviceProfileChangeListener {
+ private static final String TAG = "QuickstepTransitionManager";
private static final boolean ENABLE_SHELL_STARTING_SURFACE =
SystemProperties.getBoolean("persist.debug.shell_starting_surface", true);
@@ -356,6 +360,20 @@
options.setOnAnimationAbortListener(endCallback);
options.setOnAnimationFinishedListener(endCallback);
options.setLaunchCookie(StableViewInfo.toLaunchCookie(itemInfo));
+
+ // Prepare taskbar for animation synchronization. This needs to happen here before any
+ // app transition is created.
+ LauncherTaskbarUIController taskbarController = mLauncher.getTaskbarUIController();
+ if (syncAppLaunchWithTaskbarStash()
+ && enableScalingRevealHomeAnimation()
+ && taskbarController != null) {
+ taskbarController.setIgnoreInAppFlagForSync(true);
+ mLauncher.addEventCallback(EVENT_DESTROYED, onEndCallback::executeAllAndDestroy);
+ onEndCallback.add(() -> {
+ taskbarController.setIgnoreInAppFlagForSync(false);
+ });
+ }
+
return new ActivityOptionsWrapper(options, onEndCallback);
}
@@ -1207,7 +1225,7 @@
mLauncher.removeOnDeviceProfileChangeListener(this);
SystemUiProxy.INSTANCE.get(mLauncher).setStartingWindowListener(null);
if (BuildConfig.IS_STUDIO_BUILD && !mRegisteredTaskStackChangeListener.isEmpty()) {
- throw new IllegalStateException("Failed to run onEndCallback created from"
+ Log.e(TAG, "IllegalState: Failed to run onEndCallback created from"
+ " getActivityLaunchOptions()");
}
mRegisteredTaskStackChangeListener.forEach(TaskRestartedDuringLaunchListener::unregister);
@@ -1903,6 +1921,21 @@
anim.addListener(mForceInvisibleListener);
}
+ // Syncs the app launch animation and taskbar stash animation (if exists).
+ if (syncAppLaunchWithTaskbarStash() && enableScalingRevealHomeAnimation()) {
+ LauncherTaskbarUIController taskbarController = mLauncher.getTaskbarUIController();
+ if (taskbarController != null) {
+ taskbarController.setIgnoreInAppFlagForSync(false);
+
+ if (launcherClosing) {
+ Animator taskbar = taskbarController.createAnimToApp();
+ if (taskbar != null) {
+ anim.play(taskbar);
+ }
+ }
+ }
+ }
+
result.setAnimation(anim, mLauncher, mOnEndCallback::executeAllAndDestroy,
skipFirstFrame);
}
diff --git a/quickstep/src/com/android/launcher3/dagger/Modules.kt b/quickstep/src/com/android/launcher3/dagger/Modules.kt
index 52be413..7671a82 100644
--- a/quickstep/src/com/android/launcher3/dagger/Modules.kt
+++ b/quickstep/src/com/android/launcher3/dagger/Modules.kt
@@ -16,11 +16,13 @@
package com.android.launcher3.dagger
+import com.android.launcher3.uioverrides.QuickstepWidgetHolder.QuickstepWidgetHolderFactory
import com.android.launcher3.uioverrides.SystemApiWrapper
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.WindowManagerProxy
+import com.android.launcher3.widget.LauncherWidgetHolder.WidgetHolderFactory
import com.android.quickstep.util.GestureExclusionManager
import com.android.quickstep.util.SystemWindowManagerProxy
import dagger.Binds
@@ -40,6 +42,13 @@
}
@Module
+abstract class WidgetModule {
+
+ @Binds
+ abstract fun bindWidgetHolderFactory(factor: QuickstepWidgetHolderFactory): WidgetHolderFactory
+}
+
+@Module
abstract class PluginManagerWrapperModule {
@Binds
abstract fun bindPluginManagerWrapper(impl: PluginManagerWrapperImpl): PluginManagerWrapper
diff --git a/quickstep/src/com/android/launcher3/statehandlers/DepthController.java b/quickstep/src/com/android/launcher3/statehandlers/DepthController.java
index 4c24d95..360210b 100644
--- a/quickstep/src/com/android/launcher3/statehandlers/DepthController.java
+++ b/quickstep/src/com/android/launcher3/statehandlers/DepthController.java
@@ -65,7 +65,7 @@
private void onLauncherDraw() {
View view = mLauncher.getDragLayer();
ViewRootImpl viewRootImpl = view.getViewRootImpl();
- setSurface(viewRootImpl != null ? viewRootImpl.getSurfaceControl() : null);
+ setBaseSurface(viewRootImpl != null ? viewRootImpl.getSurfaceControl() : null);
view.post(() -> view.getViewTreeObserver().removeOnDrawListener(mOnDrawListener));
}
@@ -127,7 +127,7 @@
mLauncher.getDragLayer().getViewTreeObserver().addOnDrawListener(mOnDrawListener);
} else {
mLauncher.getDragLayer().getViewTreeObserver().removeOnDrawListener(mOnDrawListener);
- setSurface(null);
+ setBaseSurface(null);
}
}
@@ -189,7 +189,8 @@
writer.println(prefix + "DepthController");
writer.println(prefix + "\tmMaxBlurRadius=" + mMaxBlurRadius);
writer.println(prefix + "\tmCrossWindowBlursEnabled=" + mCrossWindowBlursEnabled);
- writer.println(prefix + "\tmSurface=" + mSurface);
+ writer.println(prefix + "\tmBaseSurface=" + mBaseSurface);
+ writer.println(prefix + "\tmBaseSurfaceOverride=" + mBaseSurfaceOverride);
writer.println(prefix + "\tmStateDepth=" + stateDepth.getValue());
writer.println(prefix + "\tmWidgetDepth=" + widgetDepth.getValue());
writer.println(prefix + "\tmCurrentBlur=" + mCurrentBlur);
diff --git a/quickstep/src/com/android/launcher3/statehandlers/DesktopVisibilityController.kt b/quickstep/src/com/android/launcher3/statehandlers/DesktopVisibilityController.kt
index 810fa6f..1ac2d7c 100644
--- a/quickstep/src/com/android/launcher3/statehandlers/DesktopVisibilityController.kt
+++ b/quickstep/src/com/android/launcher3/statehandlers/DesktopVisibilityController.kt
@@ -40,7 +40,8 @@
import com.android.quickstep.fallback.RecentsState
import com.android.wm.shell.desktopmode.DisplayDeskState
import com.android.wm.shell.desktopmode.IDesktopTaskListener.Stub
-import com.android.wm.shell.shared.desktopmode.DesktopModeStatus
+import com.android.wm.shell.shared.desktopmode.DesktopModeStatus.enableMultipleDesktops
+import com.android.wm.shell.shared.desktopmode.DesktopModeStatus.useRoundedCorners
import java.io.PrintWriter
import java.lang.ref.WeakReference
import javax.inject.Inject
@@ -89,8 +90,7 @@
private val taskbarDesktopModeListeners: MutableSet<TaskbarDesktopModeListener> = HashSet()
// This simply indicates that user is currently in desktop mode or not.
- var isInDesktopMode = false
- private set
+ @Deprecated("Does not work with multi-desks") private var isInDesktopModeDeprecated = false
// to track if any pending notification to be done.
var isNotifyingDesktopVisibilityPending = false
@@ -104,12 +104,16 @@
* Number of visible desktop windows in desktop mode. This can be > 0 when user goes to overview
* from desktop window mode.
*/
- var visibleDesktopTasksCount: Int = 0
+ @Deprecated("Does not work with multi-desks")
+ var visibleDesktopTasksCountDeprecated: Int = 0
/**
* Sets the number of desktop windows that are visible and updates launcher visibility based
* on it.
*/
set(visibleTasksCount) {
+ if (enableMultipleDesktops(context)) {
+ return
+ }
if (DEBUG) {
Log.d(
TAG,
@@ -121,11 +125,11 @@
}
if (visibleTasksCount != field) {
- if (visibleDesktopTasksCount == 0 && visibleTasksCount == 1) {
- isInDesktopMode = true
+ if (visibleDesktopTasksCountDeprecated == 0 && visibleTasksCount == 1) {
+ isInDesktopModeDeprecated = true
}
- if (visibleDesktopTasksCount == 1 && visibleTasksCount == 0) {
- isInDesktopMode = false
+ if (visibleDesktopTasksCountDeprecated == 1 && visibleTasksCount == 0) {
+ isInDesktopModeDeprecated = false
}
val wasVisible = field > 0
val isVisible = visibleTasksCount > 0
@@ -171,7 +175,7 @@
private var desktopTaskListener: DesktopTaskListenerImpl?
init {
- desktopTaskListener = DesktopTaskListenerImpl(this, context.displayId)
+ desktopTaskListener = DesktopTaskListenerImpl(this, context, context.displayId)
systemUiProxy.setDesktopTaskListener(desktopTaskListener)
lifecycleTracker.addCloseable {
@@ -185,7 +189,7 @@
* [INACTIVE_DESK_ID] if no desk is currently active or the multiple desks feature is disabled.
*/
fun getActiveDeskId(displayId: Int): Int {
- if (!DesktopModeStatus.enableMultipleDesktops(context)) {
+ if (!enableMultipleDesktops(context)) {
// When the multiple desks feature is disabled, callers should not rely on the concept
// of a desk ID.
return INACTIVE_DESK_ID
@@ -196,8 +200,8 @@
/** Returns whether a desk is currently active on the display with the given [displayId]. */
fun isInDesktopMode(displayId: Int): Boolean {
- if (!DesktopModeStatus.enableMultipleDesktops(context)) {
- return isInDesktopMode
+ if (!enableMultipleDesktops(context)) {
+ return isInDesktopModeDeprecated
}
val activeDeskId = getDisplayDeskConfig(displayId)?.activeDeskId ?: INACTIVE_DESK_ID
@@ -213,7 +217,7 @@
* Overview is not active.
*/
fun isInDesktopModeAndNotInOverview(displayId: Int): Boolean {
- if (!DesktopModeStatus.enableMultipleDesktops(context)) {
+ if (!enableMultipleDesktops(context)) {
return areDesktopTasksVisibleAndNotInOverview()
}
@@ -225,7 +229,7 @@
/** Whether desktop tasks are visible in desktop mode. */
private fun areDesktopTasksVisibleAndNotInOverview(): Boolean {
- val desktopTasksVisible: Boolean = visibleDesktopTasksCount > 0
+ val desktopTasksVisible: Boolean = visibleDesktopTasksCountDeprecated > 0
if (DEBUG) {
Log.d(
TAG,
@@ -309,7 +313,7 @@
inOverviewState = overviewStateEnabled
val areDesktopTasksVisibleNow = areDesktopTasksVisibleAndNotInOverview()
- if (!DesktopModeStatus.enableMultipleDesktops(context)) {
+ if (!enableMultipleDesktops(context)) {
if (wereDesktopTasksVisibleBefore != areDesktopTasksVisibleNow) {
notifyIsInDesktopModeChanged(DEFAULT_DISPLAY, areDesktopTasksVisibleNow)
}
@@ -504,7 +508,7 @@
displayDeskStates: Array<DisplayDeskState>,
canCreateDesks: Boolean,
) {
- if (!DesktopModeStatus.enableMultipleDesktops(context)) {
+ if (!enableMultipleDesktops(context)) {
return
}
@@ -527,7 +531,7 @@
?: null.also { Slog.e(TAG, "Expected non-null desk config for display: $displayId") }
private fun onCanCreateDesksChanged(canCreateDesks: Boolean) {
- if (!DesktopModeStatus.enableMultipleDesktops(context)) {
+ if (!enableMultipleDesktops(context)) {
return
}
@@ -535,7 +539,7 @@
}
private fun onDeskAdded(displayId: Int, deskId: Int) {
- if (!DesktopModeStatus.enableMultipleDesktops(context)) {
+ if (!enableMultipleDesktops(context)) {
return
}
@@ -549,7 +553,7 @@
}
private fun onDeskRemoved(displayId: Int, deskId: Int) {
- if (!DesktopModeStatus.enableMultipleDesktops(context)) {
+ if (!enableMultipleDesktops(context)) {
return
}
@@ -566,7 +570,7 @@
}
private fun onActiveDeskChanged(displayId: Int, newActiveDesk: Int, oldActiveDesk: Int) {
- if (!DesktopModeStatus.enableMultipleDesktops(context)) {
+ if (!enableMultipleDesktops(context)) {
return
}
@@ -626,7 +630,7 @@
pw.println(prefix + "DesktopVisibilityController:")
pw.println("$prefix\tdesktopVisibilityListeners=$desktopVisibilityListeners")
- pw.println("$prefix\tvisibleDesktopTasksCount=$visibleDesktopTasksCount")
+ pw.println("$prefix\tvisibleDesktopTasksCount=$visibleDesktopTasksCountDeprecated")
pw.println("$prefix\tinOverviewState=$inOverviewState")
pw.println("$prefix\tbackgroundStateEnabled=$backgroundStateEnabled")
pw.println("$prefix\tgestureInProgress=$gestureInProgress")
@@ -640,6 +644,7 @@
*/
private class DesktopTaskListenerImpl(
controller: DesktopVisibilityController,
+ @ApplicationContext private val context: Context,
private val displayId: Int,
) : Stub() {
private val controller = WeakReference(controller)
@@ -660,7 +665,7 @@
if (DEBUG) {
Log.d(TAG, "desktop visible tasks count changed=$visibleTasksCount")
}
- visibleDesktopTasksCount = visibleTasksCount
+ visibleDesktopTasksCountDeprecated = visibleTasksCount
}
}
}
@@ -670,7 +675,7 @@
}
override fun onTaskbarCornerRoundingUpdate(doesAnyTaskRequireTaskbarRounding: Boolean) {
- if (!DesktopModeStatus.useRoundedCorners()) return
+ if (!useRoundedCorners()) return
MAIN_EXECUTOR.execute {
controller.get()?.apply {
Log.d(
@@ -683,7 +688,10 @@
}
}
+ // TODO: b/402496827 - The multi-desks backend needs to be updated to call this API only
+ // once, not between desk switches.
override fun onEnterDesktopModeTransitionStarted(transitionDuration: Int) {
+ val controller = controller.get() ?: return
MAIN_EXECUTOR.execute {
Log.d(
TAG,
@@ -691,15 +699,19 @@
"duration= " +
transitionDuration),
)
- val controller = controller.get()
- if (controller != null && !controller.isInDesktopMode) {
- controller.isInDesktopMode = true
+ if (enableMultipleDesktops(context)) {
+ controller.notifyTaskbarDesktopModeListenersForEntry(transitionDuration)
+ } else if (!controller.isInDesktopModeDeprecated) {
+ controller.isInDesktopModeDeprecated = true
controller.notifyTaskbarDesktopModeListenersForEntry(transitionDuration)
}
}
}
+ // TODO: b/402496827 - The multi-desks backend needs to be updated to call this API only
+ // once, not between desk switches.
override fun onExitDesktopModeTransitionStarted(transitionDuration: Int) {
+ val controller = controller.get() ?: return
MAIN_EXECUTOR.execute {
Log.d(
TAG,
@@ -707,9 +719,10 @@
"duration= " +
transitionDuration),
)
- val controller = controller.get()
- if (controller != null && controller.isInDesktopMode) {
- controller.isInDesktopMode = false
+ if (enableMultipleDesktops(context)) {
+ controller.notifyTaskbarDesktopModeListenersForExit(transitionDuration)
+ } else if (controller.isInDesktopModeDeprecated) {
+ controller.isInDesktopModeDeprecated = false
controller.notifyTaskbarDesktopModeListenersForExit(transitionDuration)
}
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/BaseTaskbarContext.java b/quickstep/src/com/android/launcher3/taskbar/BaseTaskbarContext.java
index aa3feb7..b82e6ed 100644
--- a/quickstep/src/com/android/launcher3/taskbar/BaseTaskbarContext.java
+++ b/quickstep/src/com/android/launcher3/taskbar/BaseTaskbarContext.java
@@ -23,7 +23,7 @@
import com.android.launcher3.popup.SystemShortcut;
import com.android.launcher3.util.BaseContext;
-import com.android.launcher3.util.DisplayController;
+import com.android.launcher3.util.NavigationMode;
import com.android.launcher3.util.Themes;
import com.android.quickstep.SystemUiProxy;
@@ -33,21 +33,49 @@
implements SystemShortcut.BubbleActivityStarter {
protected final LayoutInflater mLayoutInflater;
- private final boolean mIsPrimaryDisplay;
public BaseTaskbarContext(Context windowContext, boolean isPrimaryDisplay) {
super(windowContext, Themes.getActivityThemeRes(windowContext));
mLayoutInflater = LayoutInflater.from(this).cloneInContext(this);
- mIsPrimaryDisplay = isPrimaryDisplay;
}
- public boolean isTransientTaskbar() {
- return DisplayController.isTransientTaskbar(this) && mIsPrimaryDisplay;
- }
+ /**
+ * Returns whether taskbar is transient or persistent. External displays will be persistent.
+ *
+ * @return {@code true} if transient, {@code false} if persistent.
+ */
+ public abstract boolean isTransientTaskbar();
- public boolean isPrimaryDisplay() {
- return mIsPrimaryDisplay;
- }
+ /**
+ * Returns whether the taskbar is pinned in gesture navigation mode.
+ */
+ public abstract boolean isPinnedTaskbar();
+
+ /**
+ * Returns the current navigation mode. External displays will be in THREE_BUTTONS mode.
+ */
+ public abstract NavigationMode getNavigationMode();
+
+ /**
+ * Returns whether the taskbar is in desktop mode.
+ */
+ public abstract boolean isInDesktopMode();
+
+ /**
+ * Returns whether the taskbar is forced to be pinned when home is visible.
+ */
+ public abstract boolean showLockedTaskbarOnHome();
+
+ /**
+ * Returns whether desktop taskbar (pinned taskbar that shows desktop tasks) is to be used on
+ * the display because the display is a freeform display.
+ */
+ public abstract boolean showDesktopTaskbarForFreeformDisplay();
+
+ /**
+ * Returns whether the taskbar is displayed on primary or external display.
+ */
+ public abstract boolean isPrimaryDisplay();
@Override
public final LayoutInflater getLayoutInflater() {
diff --git a/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java
index e998388..913035a 100644
--- a/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java
@@ -17,12 +17,14 @@
import static android.window.DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY;
+import static com.android.launcher3.Flags.syncAppLaunchWithTaskbarStash;
import static com.android.launcher3.QuickstepTransitionManager.TASKBAR_TO_APP_DURATION;
import static com.android.launcher3.QuickstepTransitionManager.TRANSIENT_TASKBAR_TRANSITION_DURATION;
import static com.android.launcher3.QuickstepTransitionManager.getTaskbarToHomeDuration;
import static com.android.launcher3.statemanager.BaseState.FLAG_NON_INTERACTIVE;
import static com.android.launcher3.taskbar.TaskbarEduTooltipControllerKt.TOOLTIP_STEP_FEATURES;
import static com.android.launcher3.taskbar.TaskbarLauncherStateController.FLAG_VISIBLE;
+import static com.android.launcher3.taskbar.TaskbarStashController.FLAG_IGNORE_IN_APP;
import android.animation.Animator;
import android.animation.AnimatorSet;
@@ -221,7 +223,8 @@
if (!Flags.predictiveBackToHomePolish()) {
shouldOverrideToFastAnimation |= mLauncher.getPredictiveBackToHomeInProgress();
}
- boolean isPinnedTaskbar = DisplayController.isPinnedTaskbar(mLauncher);
+ boolean isPinnedTaskbar =
+ mControllers.taskbarActivityContext.isPinnedTaskbar();
if (isVisible || isPinnedTaskbar) {
return getTaskbarToHomeDuration(shouldOverrideToFastAnimation, isPinnedTaskbar);
} else {
@@ -301,6 +304,29 @@
return mTaskbarLauncherStateController.createAnimToLauncher(toState, callbacks, duration);
}
+ /**
+ * Create Taskbar animation to be played alongside the Launcher app launch animation.
+ */
+ public @Nullable Animator createAnimToApp() {
+ if (!syncAppLaunchWithTaskbarStash()) {
+ return null;
+ }
+ TaskbarStashController stashController = mControllers.taskbarStashController;
+ stashController.updateStateForFlag(TaskbarStashController.FLAG_IN_APP, true);
+ return stashController.createApplyStateAnimator(stashController.getStashDuration());
+ }
+
+ /**
+ * Temporarily ignore FLAG_IN_APP for app launches to prevent premature taskbar stashing.
+ * This is needed because taskbar gets a signal to stash before we actually start the
+ * app launch animation.
+ */
+ public void setIgnoreInAppFlagForSync(boolean enabled) {
+ if (syncAppLaunchWithTaskbarStash()) {
+ mControllers.taskbarStashController.updateStateForFlag(FLAG_IGNORE_IN_APP, enabled);
+ }
+ }
+
public void updateTaskbarLauncherStateGoingHome() {
mTaskbarLauncherStateController.updateStateForFlag(FLAG_VISIBLE, true);
mTaskbarLauncherStateController.applyState();
diff --git a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java
index 33cd759..7d2dc71 100644
--- a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java
@@ -15,7 +15,6 @@
*/
package com.android.launcher3.taskbar;
-import static android.view.KeyEvent.ACTION_UP;
import static android.view.View.AccessibilityDelegate;
import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
import static android.view.ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION;
@@ -121,6 +120,7 @@
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.StringJoiner;
+import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.IntPredicate;
/**
@@ -174,6 +174,7 @@
private static final int NUM_ALPHA_CHANNELS = 3;
private static final long AUTODIM_TIMEOUT_MS = 2250;
+ private static final long PREDICTIVE_BACK_TIMEOUT_MS = 200;
private final ArrayList<StatePropertyHolder> mPropertyHolders = new ArrayList<>();
private final ArrayList<ImageView> mAllButtons = new ArrayList<>();
@@ -894,23 +895,36 @@
private void setBackButtonTouchListener(View buttonView,
TaskbarNavButtonController navButtonController) {
final RectF rect = new RectF();
+ final AtomicBoolean hasSentDownEvent = new AtomicBoolean(false);
+ final Runnable longPressTimeout = () -> {
+ navButtonController.sendBackKeyEvent(KeyEvent.ACTION_DOWN, /*cancelled*/ false);
+ hasSentDownEvent.set(true);
+ };
buttonView.setOnTouchListener((v, event) -> {
int motionEventAction = event.getAction();
if (motionEventAction == MotionEvent.ACTION_DOWN) {
+ hasSentDownEvent.set(false);
+ mHandler.postDelayed(longPressTimeout, PREDICTIVE_BACK_TIMEOUT_MS);
rect.set(0, 0, v.getWidth(), v.getHeight());
}
boolean isCancelled = motionEventAction == MotionEvent.ACTION_CANCEL
|| (!rect.contains(event.getX(), event.getY())
&& (motionEventAction == MotionEvent.ACTION_MOVE
|| motionEventAction == MotionEvent.ACTION_UP));
- if (motionEventAction != MotionEvent.ACTION_DOWN
- && motionEventAction != MotionEvent.ACTION_UP && !isCancelled) {
- // return early. we don't care about any other cases than DOWN, UP and CANCEL
+ if (motionEventAction != MotionEvent.ACTION_UP && !isCancelled) {
+ // return early. we don't care about any other cases than UP or CANCEL from here on
return false;
}
- int keyEventAction = motionEventAction == MotionEvent.ACTION_DOWN
- ? KeyEvent.ACTION_DOWN : ACTION_UP;
- navButtonController.sendBackKeyEvent(keyEventAction, isCancelled);
+ mHandler.removeCallbacks(longPressTimeout);
+ if (!hasSentDownEvent.get()) {
+ if (isCancelled) {
+ // if it is cancelled and ACTION_DOWN has not been sent yet, return early and
+ // don't send anything to sysui.
+ return false;
+ }
+ navButtonController.sendBackKeyEvent(KeyEvent.ACTION_DOWN, isCancelled);
+ }
+ navButtonController.sendBackKeyEvent(KeyEvent.ACTION_UP, isCancelled);
if (motionEventAction == MotionEvent.ACTION_UP && !isCancelled) {
buttonView.performClick();
buttonView.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
index de91c54..e9b4956 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
@@ -65,6 +65,7 @@
import android.content.res.Resources;
import android.graphics.PixelFormat;
import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
import android.hardware.display.DisplayManager;
import android.os.IRemoteCallback;
import android.os.Process;
@@ -98,6 +99,7 @@
import com.android.launcher3.LauncherPrefs;
import com.android.launcher3.LauncherSettings.Favorites;
import com.android.launcher3.R;
+import com.android.launcher3.Utilities;
import com.android.launcher3.allapps.ActivityAllAppsContainerView;
import com.android.launcher3.anim.AnimatorListeners;
import com.android.launcher3.anim.AnimatorPlaybackController;
@@ -107,6 +109,8 @@
import com.android.launcher3.desktop.DesktopAppLaunchTransition.AppLaunchType;
import com.android.launcher3.folder.Folder;
import com.android.launcher3.folder.FolderIcon;
+import com.android.launcher3.icons.BitmapRenderer;
+import com.android.launcher3.icons.FastBitmapDrawable;
import com.android.launcher3.logger.LauncherAtom;
import com.android.launcher3.logging.StatsLogManager;
import com.android.launcher3.model.data.AppInfo;
@@ -139,7 +143,9 @@
import com.android.launcher3.taskbar.bubbles.stashing.TransientBubbleStashController;
import com.android.launcher3.taskbar.customization.TaskbarFeatureEvaluator;
import com.android.launcher3.taskbar.customization.TaskbarSpecsEvaluator;
+import com.android.launcher3.taskbar.growth.NudgeController;
import com.android.launcher3.taskbar.navbutton.NearestTouchFrame;
+import com.android.launcher3.taskbar.overlay.TaskbarOverlayContext;
import com.android.launcher3.taskbar.overlay.TaskbarOverlayController;
import com.android.launcher3.testing.TestLogging;
import com.android.launcher3.testing.shared.TestProtocol;
@@ -160,6 +166,7 @@
import com.android.launcher3.util.TraceHelper;
import com.android.launcher3.util.VibratorWrapper;
import com.android.launcher3.views.ActivityContext;
+import com.android.launcher3.views.BaseDragLayer;
import com.android.quickstep.NavHandle;
import com.android.quickstep.RecentsModel;
import com.android.quickstep.SystemUiProxy;
@@ -170,6 +177,7 @@
import com.android.quickstep.views.DesktopTaskView;
import com.android.quickstep.views.RecentsView;
import com.android.quickstep.views.TaskView;
+import com.android.systemui.animation.ViewRootSync;
import com.android.systemui.shared.recents.model.Task;
import com.android.systemui.shared.rotation.RotationButtonController;
import com.android.systemui.shared.statusbar.phone.BarTransitions;
@@ -198,7 +206,7 @@
private static final String WINDOW_TITLE = "Taskbar";
- private static final DesktopModeFlag ENABLE_TASKBAR_BEHIND_SHADE = new DesktopModeFlag(
+ protected static final DesktopModeFlag ENABLE_TASKBAR_BEHIND_SHADE = new DesktopModeFlag(
Flags::enableTaskbarBehindShade, false);
private final @Nullable Context mNavigationBarPanelContext;
@@ -251,6 +259,10 @@
private TaskbarSpecsEvaluator mTaskbarSpecsEvaluator;
+ // Snapshot is used to temporarily draw taskbar behind the shade.
+ private @Nullable View mTaskbarSnapshotView;
+ private @Nullable TaskbarOverlayContext mTaskbarSnapshotOverlay;
+
public TaskbarActivityContext(Context windowContext,
@Nullable Context navigationBarPanelContext, DeviceProfile launcherDp,
TaskbarNavButtonController buttonController,
@@ -308,6 +320,7 @@
if (BubbleBarController.isBubbleBarEnabled()
&& deviceBubbleBarEnabled
&& bubbleBarView != null
+ && isPrimaryDisplay
) {
Optional<BubbleStashedHandleViewController> bubbleHandleController = Optional.empty();
Optional<BubbleBarSwipeController> bubbleBarSwipeController = Optional.empty();
@@ -381,7 +394,8 @@
new TaskbarPinningController(this),
bubbleControllersOptional,
new TaskbarDesktopModeController(this,
- DesktopVisibilityController.INSTANCE.get(this)));
+ DesktopVisibilityController.INSTANCE.get(this)),
+ new NudgeController(this));
mLauncherPrefs = LauncherPrefs.get(this);
onViewCreated();
@@ -403,9 +417,41 @@
dispatchDeviceProfileChanged();
}
- /** Returns whether current taskbar is transient. */
+ @Override
public boolean isTransientTaskbar() {
- return super.isTransientTaskbar() && !isPhoneMode();
+ return DisplayController.isTransientTaskbar(this) && mIsPrimaryDisplay && !isPhoneMode();
+ }
+
+ @Override
+ public boolean isPinnedTaskbar() {
+ return DisplayController.isPinnedTaskbar(this);
+ }
+
+ @Override
+ public NavigationMode getNavigationMode() {
+ return isPrimaryDisplay() ? DisplayController.getNavigationMode(this)
+ : NavigationMode.THREE_BUTTONS;
+ }
+
+ @Override
+ public boolean isInDesktopMode() {
+ return mControllers != null
+ && mControllers.taskbarDesktopModeController.isInDesktopMode(getDisplayId());
+ }
+
+ @Override
+ public boolean showLockedTaskbarOnHome() {
+ return DisplayController.showLockedTaskbarOnHome(this);
+ }
+
+ @Override
+ public boolean showDesktopTaskbarForFreeformDisplay() {
+ return DisplayController.showDesktopTaskbarForFreeformDisplay(this);
+ }
+
+ @Override
+ public boolean isPrimaryDisplay() {
+ return mIsPrimaryDisplay;
}
/**
@@ -441,9 +487,7 @@
.setIsTransientTaskbar(true)
.build();
}
- mNavMode = (DesktopExperienceFlags.ENABLE_TASKBAR_CONNECTED_DISPLAYS.isTrue()
- && !mIsPrimaryDisplay) ? NavigationMode.THREE_BUTTONS
- : DisplayController.getNavigationMode(this);
+ mNavMode = getNavigationMode();
}
/** Called when the visibility of the bubble bar changed. */
@@ -994,6 +1038,8 @@
mWindowManager.removeViewImmediate(mDragLayer);
mAddedWindow = false;
}
+ mTaskbarSnapshotView = null;
+ mTaskbarSnapshotOverlay = null;
}
public boolean isDestroyed() {
@@ -1065,6 +1111,80 @@
if (skipAnim) {
anim.end();
}
+
+ updateTaskbarSnapshot(anim, isExpanded);
+ }
+
+ private void updateTaskbarSnapshot(AnimatorSet anim, boolean isExpanded) {
+ if (!ENABLE_TASKBAR_BEHIND_SHADE.isTrue()) {
+ return;
+ }
+ if (mTaskbarSnapshotView == null) {
+ mTaskbarSnapshotView = new View(this);
+ }
+ if (isExpanded) {
+ if (!mTaskbarSnapshotView.isAttachedToWindow()
+ && mDragLayer.isAttachedToWindow()
+ && mDragLayer.isLaidOut()
+ && mTaskbarSnapshotView.getParent() == null) {
+ NearestTouchFrame navButtonsView = mDragLayer.findViewById(R.id.navbuttons_view);
+ int oldNavButtonsVisibility = navButtonsView.getVisibility();
+ navButtonsView.setVisibility(View.INVISIBLE);
+
+ Drawable drawable = new FastBitmapDrawable(BitmapRenderer.createHardwareBitmap(
+ mDragLayer.getWidth(),
+ mDragLayer.getHeight(),
+ mDragLayer::draw));
+
+ navButtonsView.setVisibility(oldNavButtonsVisibility);
+ mTaskbarSnapshotView.setBackground(drawable);
+ mTaskbarSnapshotView.setAlpha(0f);
+
+ mTaskbarSnapshotView.addOnAttachStateChangeListener(
+ new View.OnAttachStateChangeListener() {
+ @Override
+ public void onViewAttachedToWindow(@NonNull View v) {
+ mTaskbarSnapshotView.removeOnAttachStateChangeListener(this);
+ anim.end();
+ mTaskbarSnapshotView.setAlpha(1f);
+ if (!Utilities.isRunningInTestHarness()) {
+ ViewRootSync.synchronizeNextDraw(mDragLayer,
+ mTaskbarSnapshotView,
+ () -> {});
+ }
+ }
+
+ @Override
+ public void onViewDetachedFromWindow(@NonNull View v) {}
+ });
+ BaseDragLayer.LayoutParams layoutParams = new BaseDragLayer.LayoutParams(
+ mDragLayer.getWidth(), mDragLayer.getHeight());
+ layoutParams.gravity = mWindowLayoutParams.gravity;
+ layoutParams.ignoreInsets = true;
+ mTaskbarSnapshotOverlay = mControllers.taskbarOverlayController.requestWindow();
+ mTaskbarSnapshotOverlay.getDragLayer().addView(mTaskbarSnapshotView, layoutParams);
+ }
+ } else {
+ Runnable removeSnapshotView = () -> {
+ if (mTaskbarSnapshotOverlay != null) {
+ mTaskbarSnapshotOverlay.getDragLayer().removeView(mTaskbarSnapshotView);
+ mTaskbarSnapshotView = null;
+ mTaskbarSnapshotOverlay = null;
+ }
+ };
+ if (mTaskbarSnapshotView.isAttachedToWindow()) {
+ mTaskbarSnapshotView.setAlpha(0f);
+ anim.end();
+ if (Utilities.isRunningInTestHarness()) {
+ removeSnapshotView.run();
+ } else {
+ ViewRootSync.synchronizeNextDraw(mDragLayer, mTaskbarSnapshotView,
+ removeSnapshotView);
+ }
+ } else {
+ removeSnapshotView.run();
+ }
+ }
}
public void onRotationProposal(int rotation, boolean isValid) {
@@ -1336,11 +1456,6 @@
mControllers.uiController.startSplitSelection(splitSelectSource);
}
- boolean isInDesktopMode() {
- return mControllers != null
- && mControllers.taskbarDesktopModeController.isInDesktopMode(getDisplayId());
- }
-
protected void onTaskbarIconClicked(View view) {
TaskbarUIController taskbarUIController = mControllers.uiController;
RecentsView recents = taskbarUIController.getRecentsView();
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java
index a2b6423..9e15a60 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java
@@ -25,6 +25,7 @@
import com.android.launcher3.anim.AnimatedFloat;
import com.android.launcher3.taskbar.allapps.TaskbarAllAppsController;
import com.android.launcher3.taskbar.bubbles.BubbleControllers;
+import com.android.launcher3.taskbar.growth.NudgeController;
import com.android.launcher3.taskbar.overlay.TaskbarOverlayController;
import com.android.systemui.shared.rotation.RotationButtonController;
import com.android.wm.shell.shared.bubbles.BubbleBarLocation;
@@ -67,6 +68,7 @@
public final TaskbarPinningController taskbarPinningController;
public final Optional<BubbleControllers> bubbleControllers;
public final TaskbarDesktopModeController taskbarDesktopModeController;
+ public final NudgeController nudgeController;
@Nullable private LoggableTaskbarController[] mControllersToLog = null;
@Nullable private BackgroundRendererController[] mBackgroundRendererControllers = null;
@@ -115,7 +117,8 @@
KeyboardQuickSwitchController keyboardQuickSwitchController,
TaskbarPinningController taskbarPinningController,
Optional<BubbleControllers> bubbleControllers,
- TaskbarDesktopModeController taskbarDesktopModeController) {
+ TaskbarDesktopModeController taskbarDesktopModeController,
+ NudgeController nudgeController) {
this.taskbarActivityContext = taskbarActivityContext;
this.taskbarDragController = taskbarDragController;
this.navButtonController = navButtonController;
@@ -143,6 +146,7 @@
this.taskbarPinningController = taskbarPinningController;
this.bubbleControllers = bubbleControllers;
this.taskbarDesktopModeController = taskbarDesktopModeController;
+ this.nudgeController = nudgeController;
}
/**
@@ -179,6 +183,7 @@
keyboardQuickSwitchController.init(this);
taskbarPinningController.init(this, mSharedState);
taskbarDesktopModeController.init(this, mSharedState);
+ nudgeController.init(this);
mControllersToLog = new LoggableTaskbarController[] {
taskbarDragController, navButtonController, navbarButtonsViewController,
@@ -189,6 +194,7 @@
voiceInteractionWindowController, taskbarRecentAppsController,
taskbarTranslationController, taskbarEduTooltipController,
keyboardQuickSwitchController, taskbarPinningController,
+ nudgeController
};
mBackgroundRendererControllers = new BackgroundRendererController[] {
taskbarDragLayerController, taskbarScrimViewController,
@@ -344,7 +350,7 @@
return taskbarActivityContext;
}
- protected interface LoggableTaskbarController {
+ public interface LoggableTaskbarController {
void dumpLogs(String prefix, PrintWriter pw);
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarDesktopModeController.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarDesktopModeController.kt
index ca8e4ca..e96e67d 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarDesktopModeController.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarDesktopModeController.kt
@@ -20,7 +20,6 @@
import com.android.launcher3.statehandlers.DesktopVisibilityController
import com.android.launcher3.statehandlers.DesktopVisibilityController.TaskbarDesktopModeListener
import com.android.launcher3.taskbar.TaskbarBackgroundRenderer.Companion.MAX_ROUNDNESS
-import com.android.launcher3.util.DisplayController
/** Handles Taskbar in Desktop Windowing mode. */
class TaskbarDesktopModeController(
@@ -30,9 +29,6 @@
private lateinit var taskbarControllers: TaskbarControllers
private lateinit var taskbarSharedState: TaskbarSharedState
- val isInDesktopMode: Boolean
- get() = desktopVisibilityController.isInDesktopMode
-
fun init(controllers: TaskbarControllers, sharedState: TaskbarSharedState) {
taskbarControllers = controllers
taskbarSharedState = sharedState
@@ -52,9 +48,10 @@
}
fun shouldShowDesktopTasksInTaskbar(): Boolean {
+ val activityContext = taskbarControllers.taskbarActivityContext
return isInDesktopMode(context.displayId) ||
- DisplayController.showDesktopTaskbarForFreeformDisplay(context) ||
- (DisplayController.showLockedTaskbarOnHome(context) &&
+ activityContext.showDesktopTaskbarForFreeformDisplay() ||
+ (activityContext.showLockedTaskbarOnHome() &&
taskbarControllers.taskbarStashController.isOnHome)
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarEduTooltipController.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarEduTooltipController.kt
index 7a23006..038e374 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarEduTooltipController.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarEduTooltipController.kt
@@ -44,7 +44,6 @@
import com.android.launcher3.config.FeatureFlags.enableTaskbarPinning
import com.android.launcher3.taskbar.TaskbarAutohideSuspendController.FLAG_AUTOHIDE_SUSPEND_EDU_OPEN
import com.android.launcher3.taskbar.TaskbarControllers.LoggableTaskbarController
-import com.android.launcher3.util.DisplayController
import com.android.launcher3.util.OnboardingPrefs.TASKBAR_EDU_TOOLTIP_STEP
import com.android.launcher3.util.OnboardingPrefs.TASKBAR_SEARCH_EDU_SEEN
import com.android.launcher3.util.ResourceBasedOverride
@@ -319,7 +318,7 @@
fun maybeShowSearchEdu() {
if (
!enableTaskbarPinning() ||
- !DisplayController.isPinnedTaskbar(activityContext) ||
+ !activityContext.isPinnedTaskbar ||
!isTooltipEnabled ||
!shouldShowSearchEdu ||
userHasSeenSearchEdu ||
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt
index 3af2ab6..f342fa5 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt
@@ -51,7 +51,6 @@
import com.android.launcher3.config.FeatureFlags.enableTaskbarNoRecreate
import com.android.launcher3.taskbar.TaskbarControllers.LoggableTaskbarController
import com.android.launcher3.testing.shared.ResourceUtils
-import com.android.launcher3.util.DisplayController
import com.android.launcher3.util.Executors
import java.io.PrintWriter
import kotlin.jvm.optionals.getOrNull
@@ -150,7 +149,7 @@
if (
taskbarStashController.isInApp ||
controllers.uiController.isInOverviewUi ||
- DisplayController.showLockedTaskbarOnHome(context)
+ context.showLockedTaskbarOnHome()
) {
// only add the taskbar touch region if not on home
val bottom = windowLayoutParams.height
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java
index b510e7e..98415d1 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java
@@ -40,7 +40,6 @@
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
-import android.content.Context;
import android.os.SystemClock;
import android.util.Log;
import android.view.animation.Interpolator;
@@ -61,7 +60,6 @@
import com.android.launcher3.statemanager.StateManager;
import com.android.launcher3.taskbar.bubbles.stashing.BubbleStashController.BubbleLauncherState;
import com.android.launcher3.uioverrides.QuickstepLauncher;
-import com.android.launcher3.util.DisplayController;
import com.android.launcher3.util.MultiPropertyFactory.MultiProperty;
import com.android.quickstep.RecentsAnimationCallbacks;
import com.android.quickstep.RecentsAnimationController;
@@ -225,11 +223,9 @@
updateStateForFlag(FLAG_LAUNCHER_IN_STATE_TRANSITION, true);
if (!mShouldDelayLauncherStateAnim) {
if (toState == LauncherState.NORMAL) {
+ TaskbarActivityContext activity = mControllers.taskbarActivityContext;
boolean isPinnedTaskbarAndNotInDesktopMode =
- DisplayController.isPinnedTaskbar(
- mControllers.taskbarActivityContext)
- && !DisplayController.isInDesktopMode(
- mControllers.taskbarActivityContext);
+ !activity.isInDesktopMode() && activity.isPinnedTaskbar();
applyState(QuickstepTransitionManager.getTaskbarToHomeDuration(
isPinnedTaskbarAndNotInDesktopMode));
} else {
@@ -475,8 +471,8 @@
final boolean isIconAlignedWithHotseat = isIconAlignedWithHotseat();
final float toAlignment = isIconAlignedWithHotseat ? 1 : 0;
boolean handleOpenFloatingViews = false;
- boolean isPinnedTaskbar = DisplayController.isPinnedTaskbar(
- mControllers.taskbarActivityContext);
+ boolean isPinnedTaskbar =
+ mControllers.taskbarActivityContext.isPinnedTaskbar();
if (DEBUG) {
Log.d(TAG, "onStateChangeApplied - isInLauncher: " + isInLauncher
+ ", mLauncherState: " + mLauncherState
@@ -590,7 +586,8 @@
float backgroundAlpha = isInLauncher && isTaskbarAlignedWithHotseat() ? 0 : 1;
AnimatedFloat taskbarBgOffset =
mControllers.taskbarDragLayerController.getTaskbarBackgroundOffset();
- boolean showTaskbar = shouldShowTaskbar(mLauncher, isInLauncher, isInOverview);
+ boolean showTaskbar = shouldShowTaskbar(mControllers.taskbarActivityContext, isInLauncher,
+ isInOverview);
float taskbarBgOffsetEnd = showTaskbar ? 0f : 1f;
float taskbarBgOffsetStart = showTaskbar ? 1f : 0f;
@@ -727,13 +724,13 @@
return animatorSet;
}
- private static boolean shouldShowTaskbar(Context context, boolean isInLauncher,
- boolean isInOverview) {
- if (DisplayController.showDesktopTaskbarForFreeformDisplay(context)) {
+ private static boolean shouldShowTaskbar(TaskbarActivityContext activityContext,
+ boolean isInLauncher, boolean isInOverview) {
+ if (activityContext.showDesktopTaskbarForFreeformDisplay()) {
return true;
}
- if (DisplayController.showLockedTaskbarOnHome(context) && isInLauncher) {
+ if (activityContext.showLockedTaskbarOnHome() && isInLauncher) {
return true;
}
return !isInLauncher || isInOverview;
@@ -788,11 +785,11 @@
* This refers to the intended state - a transition to this state might be in progress.
*/
public boolean isTaskbarAlignedWithHotseat() {
- if (DisplayController.showDesktopTaskbarForFreeformDisplay(mLauncher)) {
+ if (mControllers.taskbarActivityContext.showDesktopTaskbarForFreeformDisplay()) {
return false;
}
- if (DisplayController.showLockedTaskbarOnHome(mLauncher) && isInLauncher()) {
+ if (mControllers.taskbarActivityContext.showLockedTaskbarOnHome() && isInLauncher()) {
return false;
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
index 0fff0aa..1521715 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
@@ -17,6 +17,8 @@
import static android.content.Context.RECEIVER_EXPORTED;
import static android.content.Context.RECEIVER_NOT_EXPORTED;
+import static android.content.pm.PackageManager.FEATURE_PC;
+import static android.content.pm.PackageManager.FEATURE_FREEFORM_WINDOW_MANAGEMENT;
import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR;
import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL;
@@ -87,6 +89,7 @@
import com.android.quickstep.util.ContextualSearchInvoker;
import com.android.quickstep.util.GroupTask;
import com.android.quickstep.views.RecentsViewContainer;
+import com.android.server.am.Flags;
import com.android.systemui.shared.recents.model.Task;
import com.android.systemui.shared.statusbar.phone.BarTransitions;
import com.android.systemui.shared.system.ActivityManagerWrapper;
@@ -167,6 +170,10 @@
private final SparseArray<DeviceProfile> mExternalDeviceProfiles = new SparseArray<>();
private StatefulActivity mActivity;
private RecentsViewContainer mRecentsViewContainer;
+ /** Whether this device is a desktop android device **/
+ private boolean mIsAndroidPC;
+ /** Whether this device supports freeform windows management. Can change dynamically **/
+ private boolean mSupportsFreeformWindowsManagement;
/**
* Cache a copy here so we can initialize state whenever taskbar is recreated, since
@@ -189,29 +196,29 @@
private class RecreationListener implements DisplayController.DisplayInfoChangeListener {
@Override
public void onDisplayInfoChanged(Context context, DisplayController.Info info, int flags) {
+ int displayId = context.getDisplayId();
if ((flags & CHANGE_DENSITY) != 0) {
- debugTaskbarManager("onDisplayInfoChanged: Display density changed",
- context.getDisplayId());
+ debugTaskbarManager("onDisplayInfoChanged: Display density changed", displayId);
}
if ((flags & CHANGE_NAVIGATION_MODE) != 0) {
- debugTaskbarManager("onDisplayInfoChanged: Navigation mode changed",
- context.getDisplayId());
+ debugTaskbarManager("onDisplayInfoChanged: Navigation mode changed", displayId);
}
if ((flags & CHANGE_DESKTOP_MODE) != 0) {
debugTaskbarManager("onDisplayInfoChanged: Desktop mode changed",
context.getDisplayId());
+ handleDisplayUpdatesForPerceptibleTasks();
}
if ((flags & CHANGE_TASKBAR_PINNING) != 0) {
- debugTaskbarManager("onDisplayInfoChanged: Taskbar pinning changed",
- context.getDisplayId());
+ debugTaskbarManager("onDisplayInfoChanged: Taskbar pinning changed", displayId);
}
if ((flags & (CHANGE_DENSITY | CHANGE_NAVIGATION_MODE | CHANGE_DESKTOP_MODE
| CHANGE_TASKBAR_PINNING | CHANGE_SHOW_LOCKED_TASKBAR)) != 0) {
- debugTaskbarManager("onDisplayInfoChanged: Recreating Taskbar!",
- context.getDisplayId());
+
TaskbarActivityContext taskbarActivityContext = getCurrentActivityContext();
if ((flags & CHANGE_SHOW_LOCKED_TASKBAR) != 0) {
+ debugTaskbarManager("onDisplayInfoChanged: show locked taskbar changed!",
+ displayId);
recreateTaskbars();
} else if ((flags & CHANGE_DESKTOP_MODE) != 0) {
if (mShouldIgnoreNextDesktopModeChangeFromDisplayController) {
@@ -220,7 +227,7 @@
}
// Only Handles Special Exit Cases for Desktop Mode Taskbar Recreation.
if (taskbarActivityContext != null
- && !DisplayController.showLockedTaskbarOnHome(context)) {
+ && !taskbarActivityContext.showLockedTaskbarOnHome()) {
recreateTaskbars();
}
} else {
@@ -235,7 +242,7 @@
recreateTaskbars();
};
- private final PerceptibleTaskListener mTaskStackListener;
+ private PerceptibleTaskListener mTaskStackListener;
private class PerceptibleTaskListener implements TaskStackChangeListener {
private ArraySet<Integer> mPerceptibleTasks = new ArraySet<Integer>();
@@ -289,6 +296,14 @@
public void onTaskRemoved(int taskId) {
mPerceptibleTasks.remove(taskId);
}
+
+ public void unregisterListener() {
+ for (Integer taskId : mPerceptibleTasks) {
+ ActivityManagerWrapper.getInstance().setTaskIsPerceptible(taskId, false);
+ }
+ TaskStackChangeListeners.getInstance().unregisterTaskStackListener(
+ mTaskStackListener);
+ }
}
private final DesktopVisibilityController.TaskbarDesktopModeListener
@@ -298,6 +313,11 @@
public void onExitDesktopMode(int duration) {
for (int taskbarIndex = 0; taskbarIndex < mTaskbars.size(); taskbarIndex++) {
int displayId = mTaskbars.keyAt(taskbarIndex);
+ if (DesktopExperienceFlags.ENABLE_TASKBAR_CONNECTED_DISPLAYS.isTrue()
+ && !isDefaultDisplay(displayId)) {
+ continue;
+ }
+
TaskbarActivityContext taskbarActivityContext = getTaskbarForDisplay(
displayId);
if (taskbarActivityContext != null
@@ -317,6 +337,11 @@
public void onEnterDesktopMode(int duration) {
for (int taskbarIndex = 0; taskbarIndex < mTaskbars.size(); taskbarIndex++) {
int displayId = mTaskbars.keyAt(taskbarIndex);
+ if (DesktopExperienceFlags.ENABLE_TASKBAR_CONNECTED_DISPLAYS.isTrue()
+ && !isDefaultDisplay(displayId)) {
+ continue;
+ }
+
TaskbarActivityContext taskbarActivityContext = getTaskbarForDisplay(
displayId);
if (taskbarActivityContext != null) {
@@ -338,7 +363,6 @@
}
};
-
private boolean mUserUnlocked = false;
private final SimpleBroadcastReceiver mTaskbarBroadcastReceiver;
@@ -458,7 +482,10 @@
mTaskbarBroadcastReceiver.register(RECEIVER_NOT_EXPORTED, ACTION_SHOW_TASKBAR);
});
- if (ActivityManagerWrapper.usePerceptibleTasks(getPrimaryWindowContext())) {
+ mIsAndroidPC = getPrimaryWindowContext().getPackageManager().hasSystemFeature(FEATURE_PC);
+ mSupportsFreeformWindowsManagement = getFreeformWindowsManagementInfo();
+
+ if (eligibleForPerceptibleTasks()) {
mTaskStackListener = new PerceptibleTaskListener();
TaskStackChangeListeners.getInstance().registerTaskStackListener(mTaskStackListener);
} else {
@@ -468,6 +495,30 @@
debugPrimaryTaskbar("TaskbarManager created");
}
+ private void handleDisplayUpdatesForPerceptibleTasks() {
+ // 1. When desktop mode changes, detect eligibility for perceptible tasks.
+ // 2. When no longer eligible for perceptible tasks, turn off and clean up.
+ mSupportsFreeformWindowsManagement = getFreeformWindowsManagementInfo();
+ if (eligibleForPerceptibleTasks()) {
+ if (mTaskStackListener == null) {
+ mTaskStackListener = new PerceptibleTaskListener();
+ TaskStackChangeListeners.getInstance()
+ .registerTaskStackListener(mTaskStackListener);
+ }
+ } else {
+ // not eligible for perceptible tasks, so we should unregister the listener
+ if (mTaskStackListener != null) {
+ mTaskStackListener.unregisterListener();
+ mTaskStackListener = null;
+ }
+ }
+ }
+
+ private boolean getFreeformWindowsManagementInfo() {
+ return getPrimaryWindowContext().getPackageManager().hasSystemFeature(
+ FEATURE_FREEFORM_WINDOW_MANAGEMENT);
+ }
+
private void destroyAllTaskbars() {
debugPrimaryTaskbar("destroyAllTaskbars");
for (int i = 0; i < mTaskbars.size(); i++) {
@@ -988,12 +1039,12 @@
displayId);
removeAndUnregisterComponentCallbacks(displayId);
- debugTaskbarManager("onDisplayRemoved: destroying Taskbar!", displayId);
- destroyTaskbarForDisplay(displayId);
-
debugTaskbarManager("onDisplayRemoved: removing DeviceProfile from map!", displayId);
removeDeviceProfileFromMap(displayId);
+ debugTaskbarManager("onDisplayRemoved: destroying Taskbar!", displayId);
+ destroyTaskbarForDisplay(displayId);
+
debugTaskbarManager("onDisplayRemoved: removing WindowContext from map!", displayId);
removeWindowContextFromMap(displayId);
@@ -1052,17 +1103,26 @@
debugPrimaryTaskbar("destroy: unregistering component callbacks");
removeAndUnregisterComponentCallbacks(getDefaultDisplayId());
mShutdownReceiver.unregisterReceiverSafely();
- if (ActivityManagerWrapper.usePerceptibleTasks(getPrimaryWindowContext())) {
- for (Integer taskId : mTaskStackListener.mPerceptibleTasks) {
- ActivityManagerWrapper.getInstance().setTaskIsPerceptible(taskId, false);
- }
+ if (mTaskStackListener != null) {
+ mTaskStackListener.unregisterListener();
}
- TaskStackChangeListeners.getInstance().unregisterTaskStackListener(mTaskStackListener);
+
debugPrimaryTaskbar("destroy: destroying all taskbars!");
destroyAllTaskbars();
debugPrimaryTaskbar("destroy: finished!");
}
+ private boolean eligibleForPerceptibleTasks() {
+ // Perceptible tasks feature (oom boosting) is eligible for android PC devices, and
+ // other android devices that supports free form windows
+ //
+ // - isAndroidPC is set per device (in this case, desktop devices)
+ // - supportsFreeformWindowsManagement is dynamic, and is to be used for the use-case where
+ // user plugs in their device to external displays
+ return Flags.perceptibleTasks()
+ && (mIsAndroidPC || mSupportsFreeformWindowsManagement);
+ }
+
public @Nullable TaskbarActivityContext getCurrentActivityContext() {
return getTaskbarForDisplay(getDefaultDisplayId());
}
@@ -1168,7 +1228,7 @@
* @return The {@link TaskbarActivityContext} for the specified display, or
* {@code null} if no taskbar is associated with that display.
*/
- private TaskbarActivityContext getTaskbarForDisplay(int displayId) {
+ public TaskbarActivityContext getTaskbarForDisplay(int displayId) {
return mTaskbars.get(displayId);
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java
index 5284edd..e597148 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java
@@ -23,10 +23,12 @@
import static com.android.app.animation.Interpolators.LINEAR;
import static com.android.internal.jank.InteractionJankMonitor.Configuration;
import static com.android.launcher3.Flags.enableScalingRevealHomeAnimation;
+import static com.android.launcher3.Flags.syncAppLaunchWithTaskbarStash;
import static com.android.launcher3.QuickstepTransitionManager.PINNED_TASKBAR_TRANSITION_DURATION;
import static com.android.launcher3.config.FeatureFlags.ENABLE_TASKBAR_NAVBAR_UNIFICATION;
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TRANSIENT_TASKBAR_HIDE;
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TRANSIENT_TASKBAR_SHOW;
+import static com.android.launcher3.taskbar.TaskbarActivityContext.ENABLE_TASKBAR_BEHIND_SHADE;
import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR;
import static com.android.launcher3.util.FlagDebugUtils.appendFlag;
import static com.android.launcher3.util.FlagDebugUtils.formatFlagChange;
@@ -64,7 +66,6 @@
import com.android.launcher3.anim.AnimatedFloat;
import com.android.launcher3.anim.AnimationSuccessListener;
import com.android.launcher3.anim.AnimatorListeners;
-import com.android.launcher3.util.DisplayController;
import com.android.launcher3.util.MultiPropertyFactory.MultiProperty;
import com.android.quickstep.SystemUiProxy;
import com.android.quickstep.util.SystemUiFlagUtils;
@@ -107,6 +108,8 @@
// taskbar should always be stashed for bubble bar on phone
public static final int FLAG_STASHED_BUBBLE_BAR_ON_PHONE = 1 << 15;
+ public static final int FLAG_IGNORE_IN_APP = 1 << 16; // used to sync with app launch animation
+
// If any of these flags are enabled, isInApp should return true.
private static final int FLAGS_IN_APP = FLAG_IN_APP | FLAG_IN_SETUP;
@@ -303,8 +306,8 @@
// TODO(b/390665752): Feature to "lock" pinned taskbar to home screen will be superseded by
// pinning, in other launcher states, at which point this variable can be removed.
mInAppStateAffectsDesktopTasksVisibilityInTaskbar =
- !DisplayController.showDesktopTaskbarForFreeformDisplay(mActivity)
- && DisplayController.showLockedTaskbarOnHome(mActivity);
+ !mActivity.showDesktopTaskbarForFreeformDisplay()
+ && mActivity.showLockedTaskbarOnHome();
mTaskbarBackgroundDuration = activity.getResources().getInteger(
R.integer.taskbar_background_duration);
@@ -409,7 +412,7 @@
* Returns how long the stash/unstash animation should play.
*/
public long getStashDuration() {
- if (DisplayController.isPinnedTaskbar(mActivity)) {
+ if (mActivity.isPinnedTaskbar()) {
return PINNED_TASKBAR_TRANSITION_DURATION;
}
return mActivity.isTransientTaskbar() ? TRANSIENT_TASKBAR_STASH_DURATION
@@ -1135,7 +1138,10 @@
long startDelay = 0;
updateStateForFlag(FLAG_STASHED_IN_APP_SYSUI, hasAnyFlag(systemUiStateFlags,
- SYSUI_STATE_NOTIFICATION_PANEL_VISIBLE | SYSUI_STATE_DIALOG_SHOWING));
+ SYSUI_STATE_DIALOG_SHOWING | (ENABLE_TASKBAR_BEHIND_SHADE.isTrue()
+ ? 0
+ : SYSUI_STATE_NOTIFICATION_PANEL_VISIBLE)
+ ));
boolean stashForBubbles = hasAnyFlag(FLAG_IN_OVERVIEW)
&& hasAnyFlag(systemUiStateFlags, SYSUI_STATE_BUBBLES_EXPANDED)
@@ -1179,7 +1185,7 @@
}
// Do not stash if pinned taskbar, hardware keyboard is attached and no IME is docked
- if (mActivity.isHardwareKeyboard() && DisplayController.isPinnedTaskbar(mActivity)
+ if (mActivity.isHardwareKeyboard() && mActivity.isPinnedTaskbar()
&& !mActivity.isImeDocked()) {
return false;
}
@@ -1412,6 +1418,13 @@
*/
@Nullable
public Animator createSetStateAnimator(long flags, long duration) {
+ // We do this when we want to synchronize the app launch and taskbar stash animations.
+ if (syncAppLaunchWithTaskbarStash()
+ && hasAnyFlag(FLAG_IGNORE_IN_APP)
+ && hasAnyFlag(flags, FLAG_IN_APP)) {
+ flags = flags & ~FLAG_IN_APP;
+ }
+
boolean isStashed = mStashCondition.test(flags);
if (DEBUG) {
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java
index 4c94432..b2989cd 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java
@@ -368,23 +368,9 @@
if (!(view.getTag() instanceof CollectionInfo)) {
mActivityContext.getViewCache().recycleView(view.getSourceLayoutResId(), view);
}
- if (view instanceof FolderIcon fi) {
- // We should clear FolderInfo's Folder and FolderIcon to avoid memory leak.
- fi.removeListeners();
- }
view.setTag(null);
}
- /** Loop through all {@link FolderIcon} as child views and clear listeners to avoid leak. */
- public void removeFolderIconListeners() {
- final int childCount = getChildCount();
- for (int i = 0; i < childCount; i++) {
- if (getChildAt(i) instanceof FolderIcon fi) {
- fi.removeListeners();
- }
- }
- }
-
/** Inflates/binds the hotseat items and recent tasks to the view. */
protected void updateItems(ItemInfo[] hotseatItemInfos, List<GroupTask> recentTasks) {
if (mActivityContext.isDestroyed()) return;
@@ -445,7 +431,6 @@
private void updateItemsWithLayoutTransition(
ItemInfo[] hotseatItemInfos, List<GroupTask> recentTasks) {
-
if (mNumStaticViews == 0) {
mNumStaticViews = addStaticViews();
}
@@ -579,6 +564,9 @@
LayoutParams lp = new LayoutParams(mIconTouchSize, mIconTouchSize);
hotseatView.setPadding(mItemPadding, mItemPadding, mItemPadding, mItemPadding);
addView(hotseatView, mNextViewIndex, lp);
+ } else if (hotseatView instanceof FolderIcon fi) {
+ fi.onItemsChanged(false);
+ fi.getFolder().reapplyItemInfo();
}
// Apply the Hotseat ItemInfos, or hide the view if there is none for a given index.
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacks.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacks.java
index dcb9fbf..d0886e0 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacks.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacks.java
@@ -36,7 +36,6 @@
import com.android.internal.jank.Cuj;
import com.android.launcher3.taskbar.bubbles.BubbleBarViewController;
-import com.android.launcher3.util.DisplayController;
import com.android.systemui.shared.system.InteractionJankMonitorWrapper;
import com.android.wm.shell.shared.bubbles.BubbleBarLocation;
@@ -67,8 +66,8 @@
InteractionJankMonitorWrapper.begin(v, Cuj.CUJ_LAUNCHER_OPEN_ALL_APPS,
/* tag= */ "TASKBAR_BUTTON");
mActivity.getStatsLogManager().logger().log(LAUNCHER_TASKBAR_ALLAPPS_BUTTON_TAP);
- if (DisplayController.showLockedTaskbarOnHome(mActivity)
- || DisplayController.showDesktopTaskbarForFreeformDisplay(mActivity)) {
+ if (mActivity.showLockedTaskbarOnHome()
+ || mActivity.showDesktopTaskbarForFreeformDisplay()) {
// If the taskbar can be shown on the home screen, use mAllAppsToggler to toggle all
// apps, which will toggle the launcher activity all apps when on home screen.
// TODO(b/395913143): Reconsider this if a gap in taskbar all apps functionality that
@@ -248,8 +247,7 @@
/** Returns true if the taskbar pinning popup view was shown for {@code event}. */
private boolean maybeShowPinningView(@NonNull MotionEvent event) {
- if (!DisplayController.isPinnedTaskbar(mActivity) || mTaskbarView.isEventOverAnyItem(
- event)) {
+ if (!mActivity.isPinnedTaskbar() || mTaskbarView.isEventOverAnyItem(event)) {
return false;
}
mControllers.taskbarPinningController.showPinningView(mTaskbarView, event.getRawX());
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java
index 605171a..c5b97e7 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java
@@ -19,6 +19,7 @@
import static android.animation.LayoutTransition.CHANGE_APPEARING;
import static android.animation.LayoutTransition.CHANGE_DISAPPEARING;
import static android.animation.LayoutTransition.DISAPPEARING;
+import static android.view.Display.DEFAULT_DISPLAY;
import static android.window.DesktopModeFlags.ENABLE_TASKBAR_RECENTS_LAYOUT_TRANSITION;
import static com.android.app.animation.Interpolators.EMPHASIZED;
@@ -86,7 +87,6 @@
import com.android.launcher3.taskbar.bubbles.BubbleControllers;
import com.android.launcher3.taskbar.customization.TaskbarAllAppsButtonContainer;
import com.android.launcher3.taskbar.customization.TaskbarDividerContainer;
-import com.android.launcher3.util.DisplayController;
import com.android.launcher3.util.ItemInfoMatcher;
import com.android.launcher3.util.LauncherBindableItemsContainer;
import com.android.launcher3.util.MultiPropertyFactory;
@@ -393,7 +393,6 @@
if (enableTaskbarPinning()) {
mTaskbarView.removeOnLayoutChangeListener(mTaskbarViewLayoutChangeListener);
}
- mTaskbarView.removeFolderIconListeners();
LauncherAppState.getInstance(mActivity).getModel().removeCallbacks(mModelCallbacks);
mActivity.removeOnDeviceProfileChangeListener(mDeviceProfileChangeListener);
}
@@ -748,7 +747,8 @@
}
private boolean shouldUpdateIconContentDescription(BubbleTextView btv) {
- boolean isInDesktopMode = mControllers.taskbarDesktopModeController.isInDesktopMode();
+ boolean isInDesktopMode = mControllers.taskbarDesktopModeController.isInDesktopMode(
+ DEFAULT_DISPLAY);
boolean isAllAppsButton = btv instanceof TaskbarAllAppsButtonContainer;
boolean isDividerButton = btv instanceof TaskbarDividerContainer;
return isInDesktopMode && !isAllAppsButton && !isDividerButton;
@@ -931,7 +931,9 @@
private AnimatorPlaybackController createIconAlignmentController(DeviceProfile launcherDp) {
PendingAnimation setter = new PendingAnimation(100);
// icon alignment not needed for pinned taskbar.
- if (DisplayController.isPinnedTaskbar(mActivity)) return setter.createPlaybackController();
+ if (mActivity.isPinnedTaskbar()) {
+ return setter.createPlaybackController();
+ }
mOnControllerPreCreateCallback.run();
DeviceProfile taskbarDp = mActivity.getDeviceProfile();
Rect hotseatPadding = launcherDp.getHotseatLayoutPadding(mActivity);
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarView.java b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarView.java
index d43ebe2..1abef8a 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarView.java
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarView.java
@@ -204,7 +204,7 @@
mExpandedBarIconsSpacing = getResources().getDimensionPixelSize(
R.dimen.bubblebar_expanded_icon_spacing);
mBubbleElevation = getResources().getDimensionPixelSize(R.dimen.bubblebar_icon_elevation);
- mDragElevation = getResources().getDimensionPixelSize(R.dimen.bubblebar_drag_elevation);
+ mDragElevation = getResources().getDimensionPixelSize(R.dimen.dragged_bubble_elevation);
mPointerSize = getResources()
.getDimensionPixelSize(R.dimen.bubblebar_pointer_visible_size);
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java
index 7fb6480..9fb283c 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java
@@ -222,7 +222,7 @@
mIconSize = res.getDimensionPixelSize(R.dimen.bubblebar_icon_size);
mBubbleBarTaskbarMinDistance = res.getDimensionPixelSize(
R.dimen.bubblebar_transient_taskbar_min_distance);
- mDragElevation = res.getDimensionPixelSize(R.dimen.bubblebar_drag_elevation);
+ mDragElevation = res.getDimensionPixelSize(R.dimen.dragged_bubble_elevation);
mTaskbarTranslationDelta = getBubbleBarTranslationDeltaForTaskbar(activity);
if (DeviceConfig.isSmallTablet(mActivity)) {
mBubbleBarDropTargetSize = res.getDimensionPixelSize(R.dimen.drag_zone_bubble_fold);
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/flyout/BubbleBarFlyoutView.kt b/quickstep/src/com/android/launcher3/taskbar/bubbles/flyout/BubbleBarFlyoutView.kt
index 75bf937..ac87b5e 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/flyout/BubbleBarFlyoutView.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/flyout/BubbleBarFlyoutView.kt
@@ -36,6 +36,8 @@
import androidx.core.animation.ArgbEvaluator
import com.android.launcher3.R
import com.android.launcher3.popup.RoundedArrowDrawable
+import com.android.wm.shell.shared.TypefaceUtils
+import com.android.wm.shell.shared.TypefaceUtils.Companion.setTypeface
import kotlin.math.min
/** The flyout view used to notify the user of a new bubble notification. */
@@ -163,6 +165,9 @@
LayoutInflater.from(context).inflate(R.layout.bubblebar_flyout, this, true)
id = R.id.bubble_bar_flyout_view
+ setTypeface(title, TypefaceUtils.FontFamily.GSF_LABEL_LARGE)
+ setTypeface(message, TypefaceUtils.FontFamily.GSF_BODY_MEDIUM)
+
val ta = context.obtainStyledAttributes(intArrayOf(android.R.attr.dialogCornerRadius))
cornerRadius = ta.getDimensionPixelSize(0, 0).toFloat()
ta.recycle()
diff --git a/quickstep/src/com/android/launcher3/taskbar/customization/TaskbarAllAppsButtonContainer.kt b/quickstep/src/com/android/launcher3/taskbar/customization/TaskbarAllAppsButtonContainer.kt
index bb2acd6..a1df21f 100644
--- a/quickstep/src/com/android/launcher3/taskbar/customization/TaskbarAllAppsButtonContainer.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/customization/TaskbarAllAppsButtonContainer.kt
@@ -37,6 +37,7 @@
import com.android.launcher3.views.IconButtonView
import com.android.quickstep.DeviceConfigWrapper
import com.android.quickstep.util.ContextualSearchStateManager
+import com.android.wm.shell.Flags
/** Taskbar all apps button container for customizable taskbar. */
class TaskbarAllAppsButtonContainer
@@ -97,14 +98,34 @@
@DrawableRes
private fun getAllAppsButton(isTransientTaskbar: Boolean): Int {
+ if (Flags.enableGsf()) {
+ return getAllAppsButtonForExpressiveTheme()
+ }
val shouldSelectTransientIcon =
isTransientTaskbar || (enableTaskbarPinning() && !activityContext.isThreeButtonNav)
return if (shouldSelectTransientIcon) R.drawable.ic_transient_taskbar_all_apps_search_button
else R.drawable.ic_taskbar_all_apps_search_button
}
+ @DrawableRes
+ private fun getAllAppsButtonForExpressiveTheme(): Int {
+ return R.drawable.ic_taskbar_all_apps_search_button_expressive_theme
+ }
+
+ @DimenRes
+ fun getAllAppsButtonTranslationXOffsetForExpressiveTheme(isTransientTaskbar: Boolean): Int {
+ return if (isTransientTaskbar) {
+ R.dimen.transient_taskbar_all_apps_button_translation_x_offset_for_expressive_theme
+ } else {
+ R.dimen.taskbar_all_apps_search_button_translation_x_offset_for_expressive_theme
+ }
+ }
+
@DimenRes
fun getAllAppsButtonTranslationXOffset(isTransientTaskbar: Boolean): Int {
+ if (Flags.enableGsf()) {
+ return getAllAppsButtonTranslationXOffsetForExpressiveTheme(isTransientTaskbar)
+ }
return if (isTransientTaskbar) {
R.dimen.transient_taskbar_all_apps_button_translation_x_offset
} else {
diff --git a/quickstep/src/com/android/launcher3/taskbar/customization/TaskbarDividerContainer.kt b/quickstep/src/com/android/launcher3/taskbar/customization/TaskbarDividerContainer.kt
index 060ce46..08a1b48 100644
--- a/quickstep/src/com/android/launcher3/taskbar/customization/TaskbarDividerContainer.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/customization/TaskbarDividerContainer.kt
@@ -20,6 +20,7 @@
import android.content.Context
import android.content.res.ColorStateList
import android.graphics.Color.TRANSPARENT
+import android.graphics.drawable.Drawable
import android.util.AttributeSet
import androidx.core.view.setPadding
import com.android.launcher3.R
@@ -28,6 +29,7 @@
import com.android.launcher3.taskbar.TaskbarViewCallbacks
import com.android.launcher3.views.ActivityContext
import com.android.launcher3.views.IconButtonView
+import com.android.wm.shell.Flags
/** Taskbar divider view container for customizable taskbar. */
class TaskbarDividerContainer
@@ -46,16 +48,24 @@
setUpIcon()
}
- @SuppressLint("UseCompatLoadingForDrawables")
fun setUpIcon() {
backgroundTintList = ColorStateList.valueOf(TRANSPARENT)
- val drawable = resources.getDrawable(R.drawable.taskbar_divider_button)
+ val drawable = getTaskbarDividerIcon()
setIconDrawable(drawable)
if (!activityContext.isTransientTaskbar) {
setPadding(dpToPx(activityContext.taskbarSpecsEvaluator.taskbarIconPadding.toFloat()))
}
}
+ @SuppressLint("UseCompatLoadingForDrawables")
+ fun getTaskbarDividerIcon(): Drawable {
+ return if (Flags.enableGsf()) {
+ resources.getDrawable(R.drawable.taskbar_divider_button_expressive_theme)
+ } else {
+ resources.getDrawable(R.drawable.taskbar_divider_button)
+ }
+ }
+
@SuppressLint("ClickableViewAccessibility")
fun setUpCallbacks(callbacks: TaskbarViewCallbacks) {
setOnLongClickListener(callbacks.taskbarDividerLongClickListener)
diff --git a/quickstep/src/com/android/launcher3/taskbar/growth/NudgeController.kt b/quickstep/src/com/android/launcher3/taskbar/growth/NudgeController.kt
new file mode 100644
index 0000000..04e41bc
--- /dev/null
+++ b/quickstep/src/com/android/launcher3/taskbar/growth/NudgeController.kt
@@ -0,0 +1,61 @@
+/*
+ * 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.taskbar.growth
+
+import android.content.Context
+import com.android.launcher3.Utilities
+import com.android.launcher3.taskbar.TaskbarActivityContext
+import com.android.launcher3.taskbar.TaskbarControllers
+import com.android.launcher3.taskbar.TaskbarControllers.LoggableTaskbarController
+import com.android.launcher3.util.DisplayController
+import com.android.launcher3.views.ActivityContext
+import java.io.PrintWriter
+
+/** Controls nudge lifecycles. */
+class NudgeController(context: Context) : LoggableTaskbarController {
+
+ protected val activityContext: TaskbarActivityContext = ActivityContext.lookupContext(context)
+
+ private val isNudgeEnabled: Boolean
+ get() {
+ return !Utilities.isRunningInTestHarness() &&
+ !activityContext.isPhoneMode &&
+ !activityContext.isTinyTaskbar
+ }
+
+ private lateinit var controllers: TaskbarControllers
+
+ fun init(controllers: TaskbarControllers) {
+ this.controllers = controllers
+ }
+
+ fun maybeShow(payload: NudgePayload) {
+ if (!isNudgeEnabled || !DisplayController.isTransientTaskbar(activityContext)) {
+ return
+ }
+ // TODO: b/398033012 - create and show nudge view based on the payload.
+ }
+
+ /** Closes the current [nudgeView]. */
+ fun hide() {
+ // TODO: b/398033012 - hide the nudge view.
+ }
+
+ override fun dumpLogs(prefix: String?, pw: PrintWriter?) {
+ pw?.println(prefix + "NudgeController:")
+ pw?.println("$prefix\tisNudgeEnabled=$isNudgeEnabled")
+ }
+}
diff --git a/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayContext.java b/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayContext.java
index dd91d17..8574b89 100644
--- a/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayContext.java
+++ b/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayContext.java
@@ -31,6 +31,7 @@
import com.android.launcher3.taskbar.TaskbarUIController;
import com.android.launcher3.taskbar.allapps.TaskbarAllAppsContainerView;
import com.android.launcher3.taskbar.allapps.TaskbarSearchSessionController;
+import com.android.launcher3.util.NavigationMode;
import com.android.launcher3.util.SplitConfigurationOptions.SplitSelectSource;
/**
@@ -142,6 +143,41 @@
}
@Override
+ public boolean isTransientTaskbar() {
+ return mTaskbarContext.isTransientTaskbar();
+ }
+
+ @Override
+ public boolean isPinnedTaskbar() {
+ return mTaskbarContext.isPinnedTaskbar();
+ }
+
+ @Override
+ public NavigationMode getNavigationMode() {
+ return mTaskbarContext.getNavigationMode();
+ }
+
+ @Override
+ public boolean isInDesktopMode() {
+ return mTaskbarContext.isInDesktopMode();
+ }
+
+ @Override
+ public boolean showLockedTaskbarOnHome() {
+ return mTaskbarContext.showLockedTaskbarOnHome();
+ }
+
+ @Override
+ public boolean showDesktopTaskbarForFreeformDisplay() {
+ return mTaskbarContext.showDesktopTaskbarForFreeformDisplay();
+ }
+
+ @Override
+ public boolean isPrimaryDisplay() {
+ return mTaskbarContext.isPrimaryDisplay();
+ }
+
+ @Override
public void onDragStart() {}
@Override
diff --git a/quickstep/src/com/android/launcher3/uioverrides/PredictedAppIcon.java b/quickstep/src/com/android/launcher3/uioverrides/PredictedAppIcon.java
index 15a27d1..e8de0d2 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/PredictedAppIcon.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/PredictedAppIcon.java
@@ -402,16 +402,16 @@
canvas.scale(
mRingScale * (1f - RING_EFFECT_RATIO),
mRingScale * (1f - RING_EFFECT_RATIO),
- canvas.getWidth() / 2f,
- canvas.getHeight() / 2f);
+ getWidth() / 2f,
+ getHeight() / 2f);
} else if (Float.compare(1, mRingScale) != 0) {
- canvas.scale(mRingScale, mRingScale, canvas.getWidth() / 2f, canvas.getHeight() / 2f);
+ canvas.scale(mRingScale, mRingScale, getWidth() / 2f, getHeight() / 2f);
}
// Draw ring shadow around canvas.
canvas.drawPath(mRingPath, mIconRingPaint);
mIconRingPaint.setColor(mPlateColor.currentColor);
if (Flags.enableLauncherIconShapes()) {
- mIconRingPaint.setStrokeWidth(canvas.getWidth() * RING_EFFECT_RATIO);
+ mIconRingPaint.setStrokeWidth(getWidth() * RING_EFFECT_RATIO);
// Using FILL_AND_STROKE as there is still some gap to fill,
// between inner curve of ring / outer curve of icon.
mIconRingPaint.setStyle(Paint.Style.FILL_AND_STROKE);
diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepAppWidgetHost.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepAppWidgetHost.java
deleted file mode 100644
index 45813ce..0000000
--- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepAppWidgetHost.java
+++ /dev/null
@@ -1,74 +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.uioverrides;
-
-import static com.android.launcher3.widget.LauncherWidgetHolder.APPWIDGET_HOST_ID;
-
-import android.appwidget.AppWidgetHost;
-import android.appwidget.AppWidgetProviderInfo;
-import android.content.Context;
-import android.os.Looper;
-
-import androidx.annotation.NonNull;
-
-import com.android.launcher3.LauncherAppState;
-import com.android.launcher3.util.Executors;
-import com.android.launcher3.widget.LauncherAppWidgetProviderInfo;
-import com.android.launcher3.widget.LauncherWidgetHolder;
-
-import java.util.function.IntConsumer;
-
-/**
- * {@link AppWidgetHost} that is used to receive the changes to the widgets without
- * storing any {@code Activity} info like that of the launcher.
- */
-final class QuickstepAppWidgetHost extends AppWidgetHost {
- private final @NonNull Context mContext;
- private final @NonNull IntConsumer mAppWidgetRemovedCallback;
- private final @NonNull LauncherWidgetHolder.ProviderChangedListener mProvidersChangedListener;
-
- QuickstepAppWidgetHost(@NonNull Context context, @NonNull IntConsumer appWidgetRemovedCallback,
- @NonNull LauncherWidgetHolder.ProviderChangedListener listener,
- @NonNull Looper looper) {
- super(context, APPWIDGET_HOST_ID, null, looper);
- mContext = context;
- mAppWidgetRemovedCallback = appWidgetRemovedCallback;
- mProvidersChangedListener = listener;
- }
-
- @Override
- protected void onProvidersChanged() {
- mProvidersChangedListener.notifyWidgetProvidersChanged();
- }
-
- @Override
- public void onAppWidgetRemoved(int appWidgetId) {
- // Route the call via model thread, in case it comes while a loader-bind is in progress
- Executors.MODEL_EXECUTOR.execute(
- () -> Executors.MAIN_EXECUTOR.execute(
- () -> mAppWidgetRemovedCallback.accept(appWidgetId)));
- }
-
- @Override
- protected void onProviderChanged(int appWidgetId, @NonNull AppWidgetProviderInfo appWidget) {
- LauncherAppWidgetProviderInfo info = LauncherAppWidgetProviderInfo.fromProviderInfo(
- mContext, appWidget);
- super.onProviderChanged(appWidgetId, info);
- // The super method updates the dimensions of the providerInfo. Update the
- // launcher spans accordingly.
- info.initSpans(mContext, LauncherAppState.getIDP(mContext));
- }
-}
diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepAppWidgetHostProvider.kt b/quickstep/src/com/android/launcher3/uioverrides/QuickstepAppWidgetHostProvider.kt
new file mode 100644
index 0000000..1387cb7
--- /dev/null
+++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepAppWidgetHostProvider.kt
@@ -0,0 +1,48 @@
+/*
+ * 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.uioverrides
+
+import android.app.ActivityThread
+import android.content.Context
+import android.content.ContextWrapper
+import com.android.launcher3.BuildConfig
+import com.android.launcher3.util.LooperExecutor
+import com.android.launcher3.widget.LauncherWidgetHolder
+import com.android.launcher3.widget.ListenableAppWidgetHost
+
+object QuickstepAppWidgetHostProvider {
+
+ /** Static widget host which is always listening and is lazily created */
+ @JvmStatic
+ val staticQuickstepHost: ListenableAppWidgetHost by lazy {
+ ListenableAppWidgetHost(
+ LooperContext(
+ ActivityThread.currentApplication(),
+ ListenableAppWidgetHost.widgetHolderExecutor,
+ ),
+ LauncherWidgetHolder.APPWIDGET_HOST_ID,
+ )
+ .apply { if (BuildConfig.WIDGETS_ENABLED) startListening() }
+ }
+
+ private class LooperContext(ctx: Context, val executor: LooperExecutor) : ContextWrapper(ctx) {
+
+ override fun getMainLooper() = executor.looper
+
+ override fun getMainExecutor() = executor
+ }
+}
diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepInteractionHandler.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepInteractionHandler.java
index 26a1322..2f61eab 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepInteractionHandler.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepInteractionHandler.java
@@ -34,8 +34,11 @@
import com.android.launcher3.util.ActivityOptionsWrapper;
import com.android.launcher3.widget.LauncherAppWidgetHostView;
+import java.util.function.Consumer;
+
/** Provides a Quickstep specific animation when launching an activity from an app widget. */
-class QuickstepInteractionHandler implements RemoteViews.InteractionHandler {
+class QuickstepInteractionHandler implements RemoteViews.InteractionHandler,
+ Consumer<LauncherAppWidgetHostView> {
private static final String TAG = "QuickstepInteractionHandler";
@@ -45,6 +48,11 @@
mLauncher = launcher;
}
+ @Override
+ public void accept(LauncherAppWidgetHostView host) {
+ host.setInteractionHandler(this);
+ }
+
@SuppressWarnings("NewApi")
@Override
public boolean onInteraction(View view, PendingIntent pendingIntent,
diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
index cd0a4f3..605fd31 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
@@ -86,6 +86,7 @@
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;
@@ -142,7 +143,6 @@
import com.android.launcher3.taskbar.TaskbarUIController;
import com.android.launcher3.testing.TestLogging;
import com.android.launcher3.testing.shared.TestProtocol;
-import com.android.launcher3.uioverrides.QuickstepWidgetHolder.QuickstepHolderFactory;
import com.android.launcher3.uioverrides.states.QuickstepAtomicAnimationFactory;
import com.android.launcher3.uioverrides.touchcontrollers.NavBarToHomeTouchController;
import com.android.launcher3.uioverrides.touchcontrollers.NoButtonNavbarToOverviewTouchController;
@@ -171,7 +171,6 @@
import com.android.launcher3.util.StartActivityParams;
import com.android.launcher3.util.TouchController;
import com.android.launcher3.views.FloatingIconView;
-import com.android.launcher3.widget.LauncherWidgetHolder;
import com.android.quickstep.OverviewCommandHelper;
import com.android.quickstep.OverviewComponentObserver;
import com.android.quickstep.OverviewComponentObserver.OverviewChangeListener;
@@ -226,6 +225,7 @@
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 =
@@ -296,6 +296,7 @@
@Override
protected void setupViews() {
+ getAppWidgetHolder().setOnViewCreationCallback(new QuickstepInteractionHandler(this));
super.setupViews();
mActionsView = findViewById(R.id.overview_actions_view);
@@ -561,20 +562,35 @@
@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) {
- mAppTransitionManager.onActivityDestroyed();
+ try {
+ mAppTransitionManager.onActivityDestroyed();
+ } catch (Exception e) {
+ Log.e(TAG, "Failed to destroy mAppTransitionManager", e);
+ }
}
mAppTransitionManager = null;
mIsPredictiveBackToHomeInProgress = false;
if (mUnfoldTransitionProgressProvider != null) {
- SystemUiProxy.INSTANCE.get(this).setUnfoldAnimationListener(null);
- mUnfoldTransitionProgressProvider.destroy();
+ try {
+ SystemUiProxy.INSTANCE.get(this).setUnfoldAnimationListener(null);
+ mUnfoldTransitionProgressProvider.destroy();
+ } catch (Exception e) {
+ Log.e(TAG, "Failed to destroy mUnfoldTransitionProgressProvider", e);
+ }
}
OverviewComponentObserver.INSTANCE.get(this)
.removeOverviewChangeListener(mOverviewChangeListener);
- mTISBindHelper.onDestroy();
+ try {
+ mTISBindHelper.onDestroy();
+ } catch (Exception e) {
+ Log.e(TAG, "Failed to destroy mTISBindHelper", e);
+ }
if (mLauncherUnfoldAnimationController != null) {
mLauncherUnfoldAnimationController.onDestroy();
@@ -584,15 +600,22 @@
mSplitSelectStateController.onDestroy();
}
- RecentsView recentsView = getOverviewPanel();
- if (recentsView != null) {
- recentsView.destroy();
+ try {
+ RecentsView recentsView = getOverviewPanel();
+ if (recentsView != null) {
+ recentsView.destroy();
+ }
+ } catch (Exception e) {
+ Log.e(TAG, "Failed to destroy RecentsView", e);
}
- super.onDestroy();
- mHotseatPredictionController.destroy();
- if (mViewCapture != null) mViewCapture.close();
- removeBackAnimationCallback(mSplitSelectStateController.getSplitBackHandler());
+ try {
+ super.onDestroy();
+ } finally { // trivial close operations in finally.
+ mHotseatPredictionController.destroy();
+ if (mViewCapture != null) mViewCapture.close();
+ removeBackAnimationCallback(mSplitSelectStateController.getSplitBackHandler());
+ }
}
@Override
@@ -702,15 +725,6 @@
}
@Override
- protected LauncherWidgetHolder createAppWidgetHolder() {
- final QuickstepHolderFactory factory =
- (QuickstepHolderFactory) LauncherWidgetHolder.HolderFactory.newFactory(this);
- return factory.newInstance(this,
- appWidgetId -> getWorkspace().removeWidget(appWidgetId),
- new QuickstepInteractionHandler(this));
- }
-
- @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepWidgetHolder.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepWidgetHolder.java
index 56fc4d1..9970a7d 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepWidgetHolder.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepWidgetHolder.java
@@ -16,13 +16,14 @@
package com.android.launcher3.uioverrides;
import static com.android.launcher3.BuildConfig.WIDGETS_ENABLED;
+import static com.android.launcher3.uioverrides.QuickstepAppWidgetHostProvider.getStaticQuickstepHost;
import static com.android.launcher3.util.Executors.MAIN_EXECUTOR;
+import static com.android.launcher3.widget.ListenableAppWidgetHost.getWidgetHolderExecutor;
import android.appwidget.AppWidgetHost;
import android.appwidget.AppWidgetHostView;
import android.appwidget.AppWidgetProviderInfo;
import android.content.Context;
-import android.util.Log;
import android.util.SparseArray;
import android.widget.RemoteViews;
@@ -31,28 +32,26 @@
import androidx.annotation.Nullable;
import androidx.annotation.UiThread;
-import com.android.launcher3.config.FeatureFlags;
import com.android.launcher3.util.IntSet;
import com.android.launcher3.util.SafeCloseable;
import com.android.launcher3.widget.LauncherAppWidgetHostView;
import com.android.launcher3.widget.LauncherAppWidgetProviderInfo;
import com.android.launcher3.widget.LauncherWidgetHolder;
-import java.util.ArrayList;
+import dagger.assisted.Assisted;
+import dagger.assisted.AssistedFactory;
+import dagger.assisted.AssistedInject;
+
import java.util.Collections;
-import java.util.List;
import java.util.Set;
import java.util.WeakHashMap;
import java.util.function.BiConsumer;
-import java.util.function.IntConsumer;
/**
* {@link LauncherWidgetHolder} that puts the app widget host in the background
*/
public final class QuickstepWidgetHolder extends LauncherWidgetHolder {
- private static final String TAG = "QuickstepWidgetHolder";
-
private static final UpdateKey<AppWidgetProviderInfo> KEY_PROVIDER_UPDATE =
AppWidgetHostView::onUpdateProviderInfo;
private static final UpdateKey<RemoteViews> KEY_VIEWS_UPDATE =
@@ -60,51 +59,17 @@
private static final UpdateKey<Integer> KEY_VIEW_DATA_CHANGED =
AppWidgetHostView::onViewDataChanged;
- private static final List<QuickstepWidgetHolder> sHolders = new ArrayList<>();
private static final SparseArray<QuickstepWidgetHolderListener> sListeners =
new SparseArray<>();
- private static AppWidgetHost sWidgetHost = null;
-
private final UpdateHandler mUpdateHandler = this::onWidgetUpdate;
- private final @Nullable RemoteViews.InteractionHandler mInteractionHandler;
-
- private final @NonNull IntConsumer mAppWidgetRemovedCallback;
// Map to all pending updated keyed with appWidgetId;
private final SparseArray<PendingUpdate> mPendingUpdateMap = new SparseArray<>();
- private QuickstepWidgetHolder(@NonNull Context context,
- @Nullable IntConsumer appWidgetRemovedCallback,
- @Nullable RemoteViews.InteractionHandler interactionHandler) {
- super(context, appWidgetRemovedCallback);
- mAppWidgetRemovedCallback = appWidgetRemovedCallback != null ? appWidgetRemovedCallback
- : i -> {};
- mInteractionHandler = interactionHandler;
- MAIN_EXECUTOR.execute(() -> sHolders.add(this));
- }
-
- @Override
- @NonNull
- protected AppWidgetHost createHost(@NonNull Context context,
- @Nullable IntConsumer appWidgetRemovedCallback) {
- if (sWidgetHost == null) {
- sWidgetHost = new QuickstepAppWidgetHost(context.getApplicationContext(),
- i -> MAIN_EXECUTOR.execute(() ->
- sHolders.forEach(h -> h.mAppWidgetRemovedCallback.accept(i))),
- () -> MAIN_EXECUTOR.execute(() ->
- sHolders.forEach(h ->
- // Listeners might remove themselves from the list during the
- // iteration. Creating a copy of the list to avoid exceptions
- // for concurrent modification.
- new ArrayList<>(h.mProviderChangedListeners).forEach(
- ProviderChangedListener::notifyWidgetProvidersChanged))),
- getWidgetHolderExecutor().getLooper());
- if (WIDGETS_ENABLED) {
- sWidgetHost.startListening();
- }
- }
- return sWidgetHost;
+ @AssistedInject
+ public QuickstepWidgetHolder(@Assisted("UI_CONTEXT") @NonNull Context context) {
+ super(context, getStaticQuickstepHost());
}
@Override
@@ -168,21 +133,6 @@
sListeners.remove(appWidgetId);
}
- /**
- * Called when the launcher is destroyed
- */
- @Override
- public void destroy() {
- try {
- MAIN_EXECUTOR.submit(() -> {
- clearViews();
- sHolders.remove(this);
- }).get();
- } catch (Exception e) {
- Log.e(TAG, "Failed to remove self from holder list", e);
- }
- }
-
@Override
protected boolean shouldListen(int flags) {
return (flags & (FLAG_STATE_IS_NORMAL | FLAG_ACTIVITY_STARTED))
@@ -199,7 +149,7 @@
}
getWidgetHolderExecutor().execute(() -> {
- sWidgetHost.setAppWidgetHidden();
+ mWidgetHost.setAppWidgetHidden();
setListeningFlag(false);
});
}
@@ -239,7 +189,6 @@
protected LauncherAppWidgetHostView createViewInternal(
int appWidgetId, @NonNull LauncherAppWidgetProviderInfo appWidget) {
LauncherAppWidgetHostView widgetView = new LauncherAppWidgetHostView(mContext);
- widgetView.setInteractionHandler(mInteractionHandler);
widgetView.setAppWidget(appWidgetId, appWidget);
widgetView.updateAppWidget(getHolderListener(appWidgetId).addHolder(mUpdateHandler));
return widgetView;
@@ -249,7 +198,7 @@
QuickstepWidgetHolderListener listener = sListeners.get(appWidgetId);
if (listener == null) {
listener = new QuickstepWidgetHolderListener(appWidgetId);
- sWidgetHost.setListener(appWidgetId, listener);
+ getStaticQuickstepHost().setListener(appWidgetId, listener);
sListeners.put(appWidgetId, listener);
}
return listener;
@@ -322,44 +271,13 @@
}
}
- /**
- * {@code HolderFactory} subclass that takes an interaction handler as one of the parameters
- * when creating a new instance.
- */
- public static class QuickstepHolderFactory extends HolderFactory {
- @SuppressWarnings("unused")
- public QuickstepHolderFactory(Context context) { }
+ /** A factory that generates new instances of {@code LauncherWidgetHolder} */
+ @AssistedFactory
+ public interface QuickstepWidgetHolderFactory extends WidgetHolderFactory {
@Override
- public LauncherWidgetHolder newInstance(@NonNull Context context,
- @Nullable IntConsumer appWidgetRemovedCallback) {
- return newInstance(context, appWidgetRemovedCallback, null);
- }
-
- /**
- * @param context The context of the caller
- * @param appWidgetRemovedCallback The callback that is called when widgets are removed
- * @param interactionHandler The interaction handler when the widgets are clicked
- * @return A new {@link LauncherWidgetHolder} instance
- */
- public LauncherWidgetHolder newInstance(@NonNull Context context,
- @Nullable IntConsumer appWidgetRemovedCallback,
- @Nullable RemoteViews.InteractionHandler interactionHandler) {
-
- if (!FeatureFlags.ENABLE_WIDGET_HOST_IN_BACKGROUND.get()) {
- return new LauncherWidgetHolder(context, appWidgetRemovedCallback) {
- @Override
- protected AppWidgetHost createHost(Context context,
- @Nullable IntConsumer appWidgetRemovedCallback) {
- AppWidgetHost host = super.createHost(context, appWidgetRemovedCallback);
- host.setInteractionHandler(interactionHandler);
- return host;
- }
- };
- }
- return new QuickstepWidgetHolder(context, appWidgetRemovedCallback, interactionHandler);
- }
+ QuickstepWidgetHolder newInstance(@Assisted("UI_CONTEXT") @NonNull Context context);
}
private interface UpdateKey<T> extends BiConsumer<AppWidgetHostView, T> { }
diff --git a/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.kt b/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.kt
index 23dc81d..c9f791c 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.kt
+++ b/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.kt
@@ -21,6 +21,7 @@
import com.android.app.animation.Interpolators.INSTANT
import com.android.app.animation.Interpolators.LINEAR
import com.android.launcher3.Flags.enableDesktopExplodedView
+import com.android.launcher3.Flags.enableGridOnlyOverview
import com.android.launcher3.Flags.enableLargeDesktopWindowingTile
import com.android.launcher3.LauncherState
import com.android.launcher3.anim.AnimatedFloat
@@ -143,7 +144,11 @@
recentsView,
TASK_MODALNESS,
toState.overviewModalness,
- config.getInterpolator(ANIM_OVERVIEW_MODAL, LINEAR),
+ config.getInterpolator(
+ ANIM_OVERVIEW_MODAL,
+ if (enableGridOnlyOverview() && !toState.isRecentsViewVisible) FINAL_FRAME
+ else LINEAR,
+ ),
)
val fromState = launcher.stateManager.state
diff --git a/quickstep/src/com/android/launcher3/uioverrides/states/OverviewModalTaskState.java b/quickstep/src/com/android/launcher3/uioverrides/states/OverviewModalTaskState.java
index 0c0b4fd..ae82f82 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/states/OverviewModalTaskState.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/states/OverviewModalTaskState.java
@@ -15,11 +15,11 @@
*/
package com.android.launcher3.uioverrides.states;
+import static com.android.launcher3.Flags.enableGridOnlyOverview;
import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_OVERVIEW;
import android.graphics.Rect;
-import com.android.launcher3.Flags;
import com.android.launcher3.Launcher;
import com.android.launcher3.LauncherState;
import com.android.launcher3.views.ActivityContext;
@@ -50,6 +50,9 @@
@Override
public float[] getOverviewScaleAndOffset(Launcher launcher) {
+ if (enableGridOnlyOverview()) {
+ return super.getOverviewScaleAndOffset(launcher);
+ }
return getOverviewScaleAndOffsetForModalState(launcher.getOverviewPanel());
}
@@ -65,7 +68,7 @@
@Override
public boolean isTaskbarStashed(Launcher launcher) {
- if (Flags.enableGridOnlyOverview()) {
+ if (enableGridOnlyOverview()) {
return true;
}
return super.isTaskbarStashed(launcher);
diff --git a/quickstep/src/com/android/launcher3/uioverrides/states/OverviewState.java b/quickstep/src/com/android/launcher3/uioverrides/states/OverviewState.java
index 963504f..3170df9 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/states/OverviewState.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/states/OverviewState.java
@@ -17,10 +17,12 @@
import static com.android.app.animation.Interpolators.DECELERATE_2;
import static com.android.launcher3.Flags.enableDesktopExplodedView;
+import static com.android.launcher3.Flags.enableOverviewBackgroundWallpaperBlur;
import static com.android.launcher3.Flags.enableScalingRevealHomeAnimation;
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;
@@ -35,6 +37,7 @@
import com.android.quickstep.util.LayoutUtils;
import com.android.quickstep.views.RecentsView;
import com.android.quickstep.views.TaskView;
+import com.android.systemui.shared.system.BlurUtils;
/**
* Definition for overview state
@@ -158,7 +161,9 @@
@Override
public int getWorkspaceScrimColor(Launcher launcher) {
- return Themes.getAttrColor(launcher, R.attr.overviewScrimColor);
+ return enableOverviewBackgroundWallpaperBlur() && BlurUtils.supportsBlursOnWindows()
+ ? Color.TRANSPARENT
+ : Themes.getAttrColor(launcher, R.attr.overviewScrimColor);
}
@Override
diff --git a/quickstep/src/com/android/quickstep/DisplayModel.kt b/quickstep/src/com/android/quickstep/DisplayModel.kt
index ac94375..3de6fd0 100644
--- a/quickstep/src/com/android/quickstep/DisplayModel.kt
+++ b/quickstep/src/com/android/quickstep/DisplayModel.kt
@@ -22,7 +22,6 @@
import android.util.SparseArray
import android.view.Display
import androidx.core.util.valueIterator
-import com.android.launcher3.util.Executors
import com.android.quickstep.DisplayModel.DisplayResource
import java.io.PrintWriter
@@ -37,29 +36,24 @@
private val displayManager = context.getSystemService(Context.DISPLAY_SERVICE) as DisplayManager
protected val displayResourceArray = SparseArray<RESOURCE_TYPE>()
- private val displayListener: DisplayManager.DisplayListener =
- (object : DisplayManager.DisplayListener {
- override fun onDisplayAdded(displayId: Int) {
- if (DEBUG) Log.d(TAG, "onDisplayAdded: displayId=$displayId")
- storeDisplayResource(displayId)
- }
+ fun onDisplayAddSystemDecorations(displayId: Int) {
+ if (DEBUG) Log.d(TAG, "onDisplayAdded: displayId=$displayId")
+ storeDisplayResource(displayId)
+ }
- override fun onDisplayRemoved(displayId: Int) {
- if (DEBUG) Log.d(TAG, "onDisplayRemoved: displayId=$displayId")
- deleteDisplayResource(displayId)
- }
+ fun onDisplayRemoved(displayId: Int) {
+ if (DEBUG) Log.d(TAG, "onDisplayRemoved: displayId=$displayId")
+ deleteDisplayResource(displayId)
+ }
- override fun onDisplayChanged(displayId: Int) {
- if (DEBUG) Log.d(TAG, "onDisplayChanged: displayId=$displayId")
- }
- })
+ fun onDisplayRemoveSystemDecorations(displayId: Int) {
+ if (DEBUG) Log.d(TAG, "onDisplayRemoveSystemDecorations: displayId=$displayId")
+ deleteDisplayResource(displayId)
+ }
protected abstract fun createDisplayResource(display: Display): RESOURCE_TYPE
- protected fun registerDisplayListener() {
- displayManager.registerDisplayListener(displayListener, Executors.MAIN_EXECUTOR.handler)
- // In the scenario where displays were added before this display listener was
- // registered, we should store the DisplayResources for those displays directly.
+ protected fun initializeDisplays() {
displayManager.displays
.filter { getDisplayResource(it.displayId) == null }
.forEach { storeDisplayResource(it.displayId) }
@@ -70,18 +64,19 @@
displayResource.cleanup()
}
displayResourceArray.clear()
- displayManager.unregisterDisplayListener(displayListener)
}
fun getDisplayResource(displayId: Int): RESOURCE_TYPE? {
- if (DEBUG) Log.d(TAG, "get: displayId=$displayId")
+ if (DEBUG) Log.d(TAG, Log.getStackTraceString(Throwable("get: displayId=$displayId")))
return displayResourceArray[displayId]
}
fun deleteDisplayResource(displayId: Int) {
if (DEBUG) Log.d(TAG, "delete: displayId=$displayId")
- getDisplayResource(displayId)?.cleanup()
- displayResourceArray.remove(displayId)
+ getDisplayResource(displayId)?.let {
+ it.cleanup()
+ displayResourceArray.remove(displayId)
+ }
}
fun storeDisplayResource(displayId: Int) {
diff --git a/quickstep/src/com/android/quickstep/InputConsumer.java b/quickstep/src/com/android/quickstep/InputConsumer.java
index 081ed9d..e5cbc66 100644
--- a/quickstep/src/com/android/quickstep/InputConsumer.java
+++ b/quickstep/src/com/android/quickstep/InputConsumer.java
@@ -63,13 +63,25 @@
"TYPE_BUBBLE_BAR", // 16
};
- InputConsumer NO_OP = () -> TYPE_NO_OP;
+ InputConsumer DEFAULT_NO_OP = createNoOpInputConsumer(Display.DEFAULT_DISPLAY);
+
+ static InputConsumer createNoOpInputConsumer(int displayId) {
+ return new InputConsumer() {
+ @Override
+ public int getType() {
+ return TYPE_NO_OP;
+ }
+
+ @Override
+ public int getDisplayId() {
+ return displayId;
+ }
+ };
+ }
int getType();
- default int getDisplayId() {
- return Display.DEFAULT_DISPLAY;
- }
+ int getDisplayId();
/**
* Returns true if the user has crossed the threshold for it to be an explicit action.
diff --git a/quickstep/src/com/android/quickstep/InputConsumerUtils.kt b/quickstep/src/com/android/quickstep/InputConsumerUtils.kt
index cd3ac12..c8ca534 100644
--- a/quickstep/src/com/android/quickstep/InputConsumerUtils.kt
+++ b/quickstep/src/com/android/quickstep/InputConsumerUtils.kt
@@ -57,7 +57,7 @@
@JvmStatic
fun <S : BaseState<S>, T> newConsumer(
context: Context,
- resetGestureInputConsumer: ResetGestureInputConsumer?,
+ userUnlocked: Boolean,
overviewComponentObserver: OverviewComponentObserver,
deviceState: RecentsAnimationDeviceState,
previousGestureState: GestureState,
@@ -122,7 +122,8 @@
// camera).
createDeviceLockedInputConsumer(
context,
- resetGestureInputConsumer,
+ userUnlocked,
+ taskbarManager,
deviceState,
gestureState,
taskAnimationManager,
@@ -131,7 +132,10 @@
)
} else {
getDefaultInputConsumer(
- resetGestureInputConsumer,
+ gestureState.displayId,
+ userUnlocked,
+ taskAnimationManager,
+ taskbarManager,
reasonString.append("%scannot start system gesture", SUBSTRING_PREFIX),
)
}
@@ -153,7 +157,8 @@
base =
newBaseConsumer<S, T>(
context,
- resetGestureInputConsumer,
+ userUnlocked,
+ taskbarManager,
overviewComponentObserver,
deviceState,
previousGestureState,
@@ -172,7 +177,14 @@
"cannot start system gesture and recents " +
"animation was not running, trying to use default input consumer"
)
- base = getDefaultInputConsumer(resetGestureInputConsumer, reasonString)
+ base =
+ getDefaultInputConsumer(
+ gestureState.displayId,
+ userUnlocked,
+ taskAnimationManager,
+ taskbarManager,
+ reasonString,
+ )
}
if (deviceState.isGesturalNavMode || gestureState.isTrackpadGesture) {
handleOrientationSetup(base)
@@ -237,7 +249,14 @@
SUBSTRING_PREFIX,
)
// Bubbles can handle home gesture itself.
- base = getDefaultInputConsumer(resetGestureInputConsumer, reasonString)
+ base =
+ getDefaultInputConsumer(
+ gestureState.displayId,
+ userUnlocked,
+ taskAnimationManager,
+ taskbarManager,
+ reasonString,
+ )
}
}
@@ -279,7 +298,14 @@
SUBSTRING_PREFIX,
)
// Bubbles can handle home gesture itself.
- base = getDefaultInputConsumer(resetGestureInputConsumer, reasonString)
+ base =
+ getDefaultInputConsumer(
+ gestureState.displayId,
+ userUnlocked,
+ taskAnimationManager,
+ taskbarManager,
+ reasonString,
+ )
}
}
@@ -374,7 +400,14 @@
"%sscreen pinning is active, trying to use default input consumer",
SUBSTRING_PREFIX,
)
- base = getDefaultInputConsumer(resetGestureInputConsumer, reasonString)
+ base =
+ getDefaultInputConsumer(
+ gestureState.displayId,
+ userUnlocked,
+ taskAnimationManager,
+ taskbarManager,
+ reasonString,
+ )
}
if (deviceState.canTriggerOneHandedAction(event)) {
@@ -411,7 +444,7 @@
context,
deviceState,
inputMonitorCompat,
- InputConsumer.NO_OP,
+ InputConsumer.createNoOpInputConsumer(gestureState.displayId),
gestureState,
motionEvent,
CompoundString.NO_OP,
@@ -450,7 +483,8 @@
@JvmStatic
fun <S : BaseState<S>, T> newBaseConsumer(
context: Context,
- resetGestureInputConsumer: ResetGestureInputConsumer?,
+ userUnlocked: Boolean,
+ taskbarManager: TaskbarManager,
overviewComponentObserver: OverviewComponentObserver,
deviceState: RecentsAnimationDeviceState,
previousGestureState: GestureState,
@@ -467,7 +501,8 @@
// This handles apps showing over the lockscreen (e.g. camera)
return createDeviceLockedInputConsumer(
context,
- resetGestureInputConsumer,
+ userUnlocked,
+ taskbarManager,
deviceState,
gestureState,
taskAnimationManager,
@@ -521,7 +556,9 @@
return if (gestureState.getContainerInterface<S, T>().isInLiveTileMode()) {
createOverviewInputConsumer<S, T>(
- resetGestureInputConsumer,
+ userUnlocked,
+ taskAnimationManager,
+ taskbarManager,
deviceState,
inputMonitorCompat,
previousGestureState,
@@ -534,7 +571,10 @@
)
} else if (runningTask == null) {
getDefaultInputConsumer(
- resetGestureInputConsumer,
+ gestureState.displayId,
+ userUnlocked,
+ taskAnimationManager,
+ taskbarManager,
reasonString.append("%srunning task == null", SUBSTRING_PREFIX),
)
} else if (
@@ -543,7 +583,9 @@
forceOverviewInputConsumer
) {
createOverviewInputConsumer<S, T>(
- resetGestureInputConsumer,
+ userUnlocked,
+ taskAnimationManager,
+ taskbarManager,
deviceState,
inputMonitorCompat,
previousGestureState,
@@ -565,7 +607,10 @@
)
} else if (deviceState.isGestureBlockedTask(runningTask) || launcherChildActivityResumed) {
getDefaultInputConsumer(
- resetGestureInputConsumer,
+ gestureState.displayId,
+ userUnlocked,
+ taskAnimationManager,
+ taskbarManager,
reasonString.append(
if (launcherChildActivityResumed)
"%sis launcher child-task, trying to use default input consumer"
@@ -592,7 +637,8 @@
private fun createDeviceLockedInputConsumer(
context: Context,
- resetGestureInputConsumer: ResetGestureInputConsumer?,
+ userUnlocked: Boolean,
+ taskbarManager: TaskbarManager,
deviceState: RecentsAnimationDeviceState,
gestureState: GestureState,
taskAnimationManager: TaskAnimationManager,
@@ -617,7 +663,10 @@
)
} else {
getDefaultInputConsumer(
- resetGestureInputConsumer,
+ gestureState.displayId,
+ userUnlocked,
+ taskAnimationManager,
+ taskbarManager,
reasonString.append(
if (deviceState.isFullyGesturalNavMode || gestureState.isTrackpadGesture)
"%srunning task == null, trying to use default input consumer"
@@ -631,7 +680,9 @@
}
private fun <S : BaseState<S>, T> createOverviewInputConsumer(
- resetGestureInputConsumer: ResetGestureInputConsumer?,
+ userUnlocked: Boolean,
+ taskAnimationManager: TaskAnimationManager,
+ taskbarManager: TaskbarManager,
deviceState: RecentsAnimationDeviceState,
inputMonitorCompat: InputMonitorCompat,
previousGestureState: GestureState,
@@ -642,7 +693,10 @@
val container: T =
gestureState.getContainerInterface<S, T>().getCreatedContainer()
?: return getDefaultInputConsumer(
- resetGestureInputConsumer,
+ gestureState.displayId,
+ userUnlocked,
+ taskAnimationManager,
+ taskbarManager,
reasonString.append(
"%sactivity == null, trying to use default input consumer",
SUBSTRING_PREFIX,
@@ -694,24 +748,34 @@
}
/** Returns the [ResetGestureInputConsumer] if user is unlocked, else NO_OP. */
- private fun getDefaultInputConsumer(
- resetGestureInputConsumer: ResetGestureInputConsumer?,
+ @JvmStatic
+ fun getDefaultInputConsumer(
+ displayId: Int,
+ userUnlocked: Boolean,
+ taskAnimationManager: TaskAnimationManager?,
+ taskbarManager: TaskbarManager?,
reasonString: CompoundString,
): InputConsumer {
- return if (resetGestureInputConsumer != null) {
+ return if (userUnlocked && taskAnimationManager != null && taskbarManager != null) {
reasonString.append(
- "%smResetGestureInputConsumer initialized, using ResetGestureInputConsumer",
+ "%sResetGestureInputConsumer available, using ResetGestureInputConsumer",
SUBSTRING_PREFIX,
)
- resetGestureInputConsumer
+ ResetGestureInputConsumer(displayId, taskAnimationManager) {
+ taskbarManager.getTaskbarForDisplay(displayId)
+ }
} else {
reasonString.append(
- "%smResetGestureInputConsumer not initialized, using no-op input consumer",
+ "%s${
+ if (userUnlocked) "user is locked"
+ else if (taskAnimationManager == null) "taskAnimationManager is null"
+ else "taskbarManager is null"
+ }, using no-op input consumer",
SUBSTRING_PREFIX,
)
- // mResetGestureInputConsumer isn't initialized until onUserUnlocked(), so reset to
+ // ResetGestureInputConsumer isn't available until onUserUnlocked(), so reset to
// NO_OP until then (we never want these to be null).
- InputConsumer.NO_OP
+ InputConsumer.createNoOpInputConsumer(displayId)
}
}
diff --git a/quickstep/src/com/android/quickstep/LauncherBackAnimationController.java b/quickstep/src/com/android/quickstep/LauncherBackAnimationController.java
index 2ff42cd..783ec2c 100644
--- a/quickstep/src/com/android/quickstep/LauncherBackAnimationController.java
+++ b/quickstep/src/com/android/quickstep/LauncherBackAnimationController.java
@@ -220,7 +220,7 @@
mHandler.post(() -> {
LauncherBackAnimationController controller = mControllerRef.get();
if (controller != null) {
- controller.initBackMotion(backEvent);
+ controller.startBack(backEvent);
mProgressAnimator.onBackStarted(backEvent, event -> {
float backProgress = event.getProgress();
controller.mBackProgress =
@@ -270,7 +270,6 @@
}
}
controller.mAnimationFinishedCallback = finishedCallback;
- controller.startBack();
}
@Override
@@ -295,32 +294,34 @@
mBackCallback = null;
}
- private void initBackMotion(BackMotionEvent backEvent) {
+ private void startBack(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: 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.
+ // 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.
mProgressAnimator.removeOnBackCancelledFinishCallback();
mBackInProgress = true;
- mInitialTouchPos.set(backEvent.getTouchX(), backEvent.getTouchY());
- }
- private void startBack() {
- if (mBackTarget == null) {
+ RemoteAnimationTarget appTarget = backEvent.getDepartingAnimationTarget();
+
+ if (appTarget == null || appTarget.leash == null || !appTarget.leash.isValid()) {
return;
}
mTransaction
- .show(mBackTarget.leash)
+ .show(appTarget.leash)
.setAnimationTransaction();
- mStartRect.set(mBackTarget.windowConfiguration.getMaxBounds());
+ mBackTarget = appTarget;
+ mInitialTouchPos.set(backEvent.getTouchX(), backEvent.getTouchY());
+
+ mStartRect.set(appTarget.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, mBackTarget.contentInsets.bottom);
+ mStartRect.inset(0, 0, 0, appTarget.contentInsets.bottom);
}
mLauncherTargetView = mQuickstepTransitionManager.findLauncherView(
diff --git a/quickstep/src/com/android/quickstep/OverviewCommandHelper.kt b/quickstep/src/com/android/quickstep/OverviewCommandHelper.kt
index 20dfb10..6a9c3dd 100644
--- a/quickstep/src/com/android/quickstep/OverviewCommandHelper.kt
+++ b/quickstep/src/com/android/quickstep/OverviewCommandHelper.kt
@@ -75,7 +75,6 @@
constructor(
private val touchInteractionService: TouchInteractionService,
private val overviewComponentObserver: OverviewComponentObserver,
- private val taskAnimationManager: TaskAnimationManager,
private val dispatcherProvider: DispatcherProvider = ProductionDispatchers,
private val recentsDisplayModel: RecentsDisplayModel,
private val focusState: FocusState,
@@ -92,27 +91,33 @@
*/
private var keyboardTaskFocusIndex = -1
- // TODO (b/397942185): get per-display interface
- private val containerInterface: BaseContainerInterface<*, *>
- get() = overviewComponentObserver.getContainerInterface(DEFAULT_DISPLAY)
+ private fun getContainerInterface(displayId: Int) =
+ overviewComponentObserver.getContainerInterface(displayId)
- // TODO (b/397942185): get per-display RecentsView
- private val visibleRecentsView: RecentsView<*, *>?
- get() = containerInterface.getVisibleRecentsView<RecentsView<*, *>>()
+ private fun getVisibleRecentsView(displayId: Int) =
+ getContainerInterface(displayId).getVisibleRecentsView<RecentsView<*, *>>()
/**
* Adds a command to be executed next, after all pending tasks are completed. Max commands that
* can be queued is [.MAX_QUEUE_SIZE]. Requests after reaching that limit will be silently
* dropped.
+ *
+ * @param type The type of the command
+ * @param onDisplays The display to run the command on
*/
@BinderThread
- fun addCommand(type: CommandType): CommandInfo? {
+ @JvmOverloads
+ fun addCommand(
+ type: CommandType,
+ displayId: Int = DEFAULT_DISPLAY,
+ isLastOfBatch: Boolean = true,
+ ): CommandInfo? {
if (commandQueue.size >= MAX_QUEUE_SIZE) {
Log.d(TAG, "command not added: $type - queue is full ($commandQueue).")
return null
}
- val command = CommandInfo(type)
+ val command = CommandInfo(type, displayId = displayId, isLastOfBatch = isLastOfBatch)
commandQueue.add(command)
Log.d(TAG, "command added: $command")
@@ -130,6 +135,35 @@
return command
}
+ @BinderThread
+ fun addCommandsForDisplays(type: CommandType, displayIds: IntArray): CommandInfo? {
+ if (displayIds.isEmpty()) return null
+ var lastCommand: CommandInfo? = null
+ displayIds.forEachIndexed({ i, displayId ->
+ lastCommand = addCommand(type, displayId, i == displayIds.size - 1)
+ })
+ return lastCommand
+ }
+
+ @BinderThread
+ fun addCommandsForAllDisplays(type: CommandType) =
+ addCommandsForDisplays(
+ type,
+ recentsDisplayModel.activeDisplayResources
+ .map { resource -> resource.displayId }
+ .toIntArray(),
+ )
+
+ @BinderThread
+ fun addCommandsForDisplaysExcept(type: CommandType, excludedDisplayId: Int) =
+ addCommandsForDisplays(
+ type,
+ recentsDisplayModel.activeDisplayResources
+ .map { resource -> resource.displayId }
+ .filter { displayId -> displayId != excludedDisplayId }
+ .toIntArray(),
+ )
+
fun canStartHomeSafely(): Boolean = commandQueue.isEmpty() || commandQueue.first().type == HOME
/** Clear pending or completed commands from the queue */
@@ -144,7 +178,7 @@
* completion (returns false).
*/
@UiThread
- private fun processNextCommand() =
+ private fun processNextCommand(): Unit =
traceSection("OverviewCommandHelper.processNextCommand") {
val command: CommandInfo? = commandQueue.firstOrNull()
if (command == null) {
@@ -183,7 +217,7 @@
*/
@VisibleForTesting
fun executeCommand(command: CommandInfo, onCallbackResult: () -> Unit): Boolean {
- val recentsView = visibleRecentsView
+ val recentsView = getVisibleRecentsView(command.displayId)
Log.d(TAG, "executeCommand: $command - visibleRecentsView: $recentsView")
return if (recentsView != null) {
executeWhenRecentsIsVisible(command, recentsView, onCallbackResult)
@@ -231,6 +265,7 @@
launchTask(recentsView, taskView, command, onCallbackResult)
}
}
+
TOGGLE -> {
launchTask(
recentsView,
@@ -239,6 +274,7 @@
onCallbackResult,
)
}
+
HOME -> {
recentsView.startHome()
true
@@ -295,6 +331,7 @@
command: CommandInfo,
onCallbackResult: () -> Unit,
): Boolean {
+ val containerInterface = getContainerInterface(command.displayId)
val recentsViewContainer = containerInterface.getCreatedContainer()
val recentsView: RecentsView<*, *>? = recentsViewContainer?.getOverviewPanel()
val deviceProfile = recentsViewContainer?.getDeviceProfile()
@@ -336,6 +373,7 @@
if (keyboardTaskFocusIndex == -1) return true
}
+
KEYBOARD_INPUT ->
if (uiController != null && deviceProfile?.isTablet == true) {
if (
@@ -349,6 +387,7 @@
} else {
keyboardTaskFocusIndex = 0
}
+
HOME -> {
ActiveGestureProtoLogProxy.logExecuteHomeCommand()
// Although IActivityTaskManager$Stub$Proxy.startActivity is a slow binder call,
@@ -358,12 +397,14 @@
touchInteractionService.startActivity(overviewComponentObserver.homeIntent)
return true
}
+
SHOW ->
// When Recents is not currently visible, the command's type is SHOW
// when overview is triggered via the keyboard overview button or Action+Tab
// keys (Not Alt+Tab which is KQS). The overview button on-screen in 3-button
// nav is TYPE_TOGGLE.
keyboardTaskFocusIndex = 0
+
TOGGLE -> {}
}
@@ -379,7 +420,7 @@
Log.d(TAG, "switching to Overview state - onAnimationStart: $command")
super.onAnimationStart(animation)
updateRecentsViewFocus(command)
- logShowOverviewFrom(command.type)
+ logShowOverviewFrom(command)
}
override fun onAnimationEnd(animation: Animator) {
@@ -403,7 +444,7 @@
val gestureState =
touchInteractionService.createGestureState(
- focusedDisplayId,
+ command.displayId,
GestureState.DEFAULT_STATE,
GestureState.TrackpadGestureType.NONE,
)
@@ -433,7 +474,7 @@
}
updateRecentsViewFocus(command)
- logShowOverviewFrom(command.type)
+ logShowOverviewFrom(command)
containerInterface.runOnInitBackgroundStateUI {
Log.d(TAG, "recents animation started - onInitBackgroundStateUI: $command")
interactionHandler.onGestureEnded(
@@ -457,6 +498,15 @@
}
}
+ val taskAnimationManager =
+ recentsDisplayModel.getTaskAnimationManager(command.displayId)
+ ?: run {
+ Log.e(TAG, "No TaskAnimationManager found for display ${command.displayId}")
+ ActiveGestureProtoLogProxy.logOnTaskAnimationManagerNotAvailable(
+ command.displayId
+ )
+ return false
+ }
if (taskAnimationManager.isRecentsAnimationRunning) {
command.setAnimationCallbacks(
taskAnimationManager.continueRecentsAnimation(gestureState)
@@ -519,8 +569,13 @@
}
private fun updateRecentsViewFocus(command: CommandInfo) {
- val recentsView: RecentsView<*, *> = visibleRecentsView ?: return
- if (command.type != KEYBOARD_INPUT && command.type != HIDE && command.type != SHOW) {
+ val recentsView: RecentsView<*, *> = getVisibleRecentsView(command.displayId) ?: return
+ if (
+ command.type != KEYBOARD_INPUT &&
+ command.type != HIDE &&
+ command.type != SHOW &&
+ command.type != TOGGLE
+ ) {
return
}
@@ -540,7 +595,7 @@
}
private fun onRecentsViewFocusUpdated(command: CommandInfo) {
- val recentsView: RecentsView<*, *> = visibleRecentsView ?: return
+ val recentsView: RecentsView<*, *> = getVisibleRecentsView(command.displayId) ?: return
if (command.type != HIDE || keyboardTaskFocusIndex == PagedView.INVALID_PAGE) {
return
}
@@ -558,10 +613,11 @@
return true
}
- private fun logShowOverviewFrom(commandType: CommandType) {
+ private fun logShowOverviewFrom(command: CommandInfo) {
+ val containerInterface = getContainerInterface(command.displayId)
val container = containerInterface.getCreatedContainer() ?: return
val event =
- when (commandType) {
+ when (command.type) {
SHOW -> LAUNCHER_OVERVIEW_SHOW_OVERVIEW_FROM_KEYBOARD_SHORTCUT
HIDE -> LAUNCHER_OVERVIEW_SHOW_OVERVIEW_FROM_KEYBOARD_QUICK_SWITCH
TOGGLE -> LAUNCHER_OVERVIEW_SHOW_OVERVIEW_FROM_3_BUTTON
@@ -594,6 +650,8 @@
var status: CommandStatus = CommandStatus.IDLE,
val createTime: Long = SystemClock.elapsedRealtime(),
private var animationCallbacks: RecentsAnimationCallbacks? = null,
+ val displayId: Int = DEFAULT_DISPLAY,
+ val isLastOfBatch: Boolean = true,
) {
fun setAnimationCallbacks(recentsAnimationCallbacks: RecentsAnimationCallbacks) {
this.animationCallbacks = recentsAnimationCallbacks
diff --git a/quickstep/src/com/android/quickstep/RecentTasksList.java b/quickstep/src/com/android/quickstep/RecentTasksList.java
index cc5b2da..dab78c5 100644
--- a/quickstep/src/com/android/quickstep/RecentTasksList.java
+++ b/quickstep/src/com/android/quickstep/RecentTasksList.java
@@ -511,13 +511,14 @@
// When the multiple desktop feature is disabled, there can only be up to a single desk
// on each display, The desk ID doesn't matter and should not be used.
return MapsKt.map(perDisplayTasks,
- it -> new DesktopTask(DesktopVisibilityController.INACTIVE_DESK_ID,
+ it -> new DesktopTask(DesktopVisibilityController.INACTIVE_DESK_ID, it.getKey(),
it.getValue()));
} else {
final int deskId = recentTaskInfo.getDeskId();
+ final int displayId = recentTaskInfo.getDeskDisplayId();
List<Task> tasks = CollectionsKt.map(recentTaskInfo.getTaskInfoList(),
it -> createTask(it, minimizedTaskIds));
- return List.of(new DesktopTask(deskId, tasks));
+ return List.of(new DesktopTask(deskId, displayId, tasks));
}
}
diff --git a/quickstep/src/com/android/quickstep/RemoteTargetGluer.java b/quickstep/src/com/android/quickstep/RemoteTargetGluer.java
index f96bbcb..943f543 100644
--- a/quickstep/src/com/android/quickstep/RemoteTargetGluer.java
+++ b/quickstep/src/com/android/quickstep/RemoteTargetGluer.java
@@ -68,8 +68,10 @@
* running tasks
*/
public RemoteTargetGluer(Context context, BaseContainerInterface sizingStrategy) {
+ // TODO: b/403344864 Make sure init with correct number of RemoteTargetHandle with
+ // multi-desks feature enabled as well.
int visibleTasksCount = DesktopVisibilityController.INSTANCE.get(context)
- .getVisibleDesktopTasksCount();
+ .getVisibleDesktopTasksCountDeprecated();
if (visibleTasksCount > 0) {
// Allocate +1 to account for a new task added to the desktop mode
int numHandles = visibleTasksCount + 1;
diff --git a/quickstep/src/com/android/quickstep/TaskAnimationManager.java b/quickstep/src/com/android/quickstep/TaskAnimationManager.java
index 1c7f23c..4f00381 100644
--- a/quickstep/src/com/android/quickstep/TaskAnimationManager.java
+++ b/quickstep/src/com/android/quickstep/TaskAnimationManager.java
@@ -77,6 +77,7 @@
private boolean mRecentsAnimationStartPending = false;
private boolean mShouldIgnoreMotionEvents = false;
+ private final int mDisplayId;
private final TaskStackChangeListener mLiveTileRestartListener = new TaskStackChangeListener() {
@Override
@@ -101,10 +102,13 @@
}
};
- TaskAnimationManager(Context ctx, RecentsAnimationDeviceState deviceState) {
+ public TaskAnimationManager(Context ctx, RecentsAnimationDeviceState deviceState,
+ int displayId) {
mCtx = ctx;
mDeviceState = deviceState;
+ mDisplayId = displayId;
}
+
SystemUiProxy getSystemUiProxy() {
return SystemUiProxy.INSTANCE.get(mCtx);
}
@@ -489,6 +493,7 @@
public void dump(String prefix, PrintWriter pw) {
pw.println(prefix + "TaskAnimationManager:");
+ pw.println(prefix + "\tmDisplayId=" + mDisplayId);
if (enableHandleDelayedGestureCallbacks()) {
pw.println(prefix + "\tmRecentsAnimationStartPending=" + mRecentsAnimationStartPending);
diff --git a/quickstep/src/com/android/quickstep/TaskViewUtils.java b/quickstep/src/com/android/quickstep/TaskViewUtils.java
index 855ff98..d161d45 100644
--- a/quickstep/src/com/android/quickstep/TaskViewUtils.java
+++ b/quickstep/src/com/android/quickstep/TaskViewUtils.java
@@ -433,9 +433,7 @@
out.addListener(new AnimationSuccessListener() {
@Override
public void onAnimationStart(Animator animation) {
- for (RemoteTargetHandle remoteTargetHandle : remoteTargetHandles) {
- remoteTargetHandle.getTaskViewSimulator().setDrawsBelowRecents(false);
- }
+ recentsView.setDrawBelowRecents(false, remoteTargetHandles);
}
@Override
diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java
index 741ae7d..7878e68 100644
--- a/quickstep/src/com/android/quickstep/TouchInteractionService.java
+++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java
@@ -35,6 +35,7 @@
import static com.android.quickstep.GestureState.DEFAULT_STATE;
import static com.android.quickstep.GestureState.TrackpadGestureType.getTrackpadGestureType;
import static com.android.quickstep.InputConsumer.TYPE_CURSOR_HOVER;
+import static com.android.quickstep.InputConsumer.createNoOpInputConsumer;
import static com.android.quickstep.InputConsumerUtils.newConsumer;
import static com.android.quickstep.InputConsumerUtils.tryCreateAssistantInputConsumer;
import static com.android.systemui.shared.system.ActivityManagerWrapper.CLOSE_SYSTEM_WINDOWS_REASON_RECENTS;
@@ -98,7 +99,6 @@
import com.android.quickstep.fallback.window.RecentsWindowSwipeHandler;
import com.android.quickstep.inputconsumers.BubbleBarInputConsumer;
import com.android.quickstep.inputconsumers.OneHandedModeInputConsumer;
-import com.android.quickstep.inputconsumers.ResetGestureInputConsumer;
import com.android.quickstep.util.ActiveGestureLog;
import com.android.quickstep.util.ActiveGestureLog.CompoundString;
import com.android.quickstep.util.ActiveGestureProtoLogProxy;
@@ -316,7 +316,10 @@
@Override
public void onDisplayAddSystemDecorations(int displayId) {
executeForTaskbarManager(taskbarManager ->
- taskbarManager.onDisplayAddSystemDecorations(displayId));
+ taskbarManager.onDisplayAddSystemDecorations(displayId));
+
+ executeForRecentsDisplayModel(displayModel ->
+ displayModel.onDisplayAddSystemDecorations(displayId));
}
@BinderThread
@@ -327,6 +330,8 @@
executeForTouchInteractionService(tis -> {
tis.mDeviceState.clearSysUIStateFlagsForDisplay(displayId);
});
+ executeForRecentsDisplayModel(displayModel ->
+ displayModel.onDisplayRemoved(displayId));
}
@BinderThread
@@ -334,6 +339,8 @@
public void onDisplayRemoveSystemDecorations(int displayId) {
executeForTaskbarManager(taskbarManager ->
taskbarManager.onDisplayRemoveSystemDecorations(displayId));
+ executeForRecentsDisplayModel(displayModel ->
+ displayModel.onDisplayRemoveSystemDecorations(displayId));
}
@BinderThread
@@ -445,6 +452,15 @@
}));
}
+ private void executeForRecentsDisplayModel(
+ @NonNull Consumer<RecentsDisplayModel> recentsDisplayModelConsumer) {
+ MAIN_EXECUTOR.execute(() -> executeForTouchInteractionService(tis -> {
+ RecentsDisplayModel recentsDisplayModel = tis.mRecentsDisplayModel;
+ if (recentsDisplayModel == null) return;
+ recentsDisplayModelConsumer.accept(recentsDisplayModel);
+ }));
+ }
+
/**
* Returns the {@link TaskbarManager}.
* <p>
@@ -557,12 +573,11 @@
private OverviewComponentObserver mOverviewComponentObserver;
private InputConsumerController mInputConsumer;
private RecentsAnimationDeviceState mDeviceState;
- private TaskAnimationManager mTaskAnimationManager;
- private @NonNull InputConsumer mUncheckedConsumer = InputConsumer.NO_OP;
- private @NonNull InputConsumer mConsumer = InputConsumer.NO_OP;
+ private @NonNull InputConsumer mUncheckedConsumer = InputConsumer.DEFAULT_NO_OP;
+ private @NonNull InputConsumer mConsumer = InputConsumer.DEFAULT_NO_OP;
private Choreographer mMainChoreographer;
- private @Nullable ResetGestureInputConsumer mResetGestureInputConsumer;
+ private boolean mUserUnlocked = false;
private GestureState mGestureState = DEFAULT_STATE;
private InputMonitorDisplayModel mInputMonitorDisplayModel;
@@ -667,7 +682,7 @@
if (ENABLE_GESTURE_NAV_ON_CONNECTED_DISPLAYS.isTrue()) {
mInputMonitorDisplayModel = new InputMonitorDisplayModel(this);
} else {
- mInputMonitorCompat = new InputMonitorCompat("swipe-up", Display.DEFAULT_DISPLAY);
+ mInputMonitorCompat = new InputMonitorCompat("swipe-up", DEFAULT_DISPLAY);
mInputEventReceiver = mInputMonitorCompat.getInputReceiver(Looper.getMainLooper(),
mMainChoreographer, this::onInputEvent);
}
@@ -687,13 +702,11 @@
public void onUserUnlocked() {
Log.d(TAG, "onUserUnlocked: userId=" + getUserId()
+ " instance=" + System.identityHashCode(this));
- mTaskAnimationManager = new TaskAnimationManager(this, mDeviceState);
mOverviewComponentObserver = OverviewComponentObserver.INSTANCE.get(this);
mOverviewCommandHelper = new OverviewCommandHelper(this,
- mOverviewComponentObserver, mTaskAnimationManager, mRecentsDisplayModel,
+ mOverviewComponentObserver, mRecentsDisplayModel,
SystemUiProxy.INSTANCE.get(this).getFocusState(), mTaskbarManager);
- mResetGestureInputConsumer = new ResetGestureInputConsumer(
- mTaskAnimationManager, mTaskbarManager::getCurrentActivityContext);
+ mUserUnlocked = true;
mInputConsumer.registerInputConsumer();
for (int displayId : mDeviceState.getDisplaysWithSysUIState()) {
onSystemUiFlagsChanged(mDeviceState.getSystemUiStateFlags(displayId), displayId);
@@ -766,14 +779,18 @@
if (LockedUserState.get(this).isUserUnlocked()) {
long systemUiStateFlags = mDeviceState.getSystemUiStateFlags(displayId);
mTaskbarManager.onSystemUiFlagsChanged(systemUiStateFlags, displayId);
- if (displayId == Display.DEFAULT_DISPLAY) {
+ if (displayId == DEFAULT_DISPLAY) {
// The following don't care about non-default displays, at least for now. If they
// ever will, they should be taken care of.
SystemUiProxy.INSTANCE.get(this).setLastSystemUiStateFlags(systemUiStateFlags);
mOverviewComponentObserver.setHomeDisabled(mDeviceState.isHomeDisabled());
// TODO b/399371607 - Propagate to taskAnimationManager once overview is multi
// display.
- mTaskAnimationManager.onSystemUiFlagsChanged(lastSysUIFlags, systemUiStateFlags);
+ TaskAnimationManager taskAnimationManager =
+ mRecentsDisplayModel.getTaskAnimationManager(displayId);
+ if (taskAnimationManager != null) {
+ taskAnimationManager.onSystemUiFlagsChanged(lastSysUIFlags, systemUiStateFlags);
+ }
}
}
}
@@ -865,11 +882,18 @@
boolean isHoverActionWithoutConsumer = enableCursorHoverStates()
&& isHoverActionWithoutConsumer(event);
+ TaskAnimationManager taskAnimationManager = mRecentsDisplayModel.getTaskAnimationManager(
+ displayId);
+ if (taskAnimationManager == null) {
+ Log.e(TAG, "TaskAnimationManager not available for displayId " + displayId);
+ ActiveGestureProtoLogProxy.logOnTaskAnimationManagerNotAvailable(displayId);
+ return;
+ }
if (enableHandleDelayedGestureCallbacks()) {
if (action == ACTION_DOWN || isHoverActionWithoutConsumer) {
- mTaskAnimationManager.notifyNewGestureStart();
+ taskAnimationManager.notifyNewGestureStart();
}
- if (mTaskAnimationManager.shouldIgnoreMotionEvents()) {
+ if (taskAnimationManager.shouldIgnoreMotionEvents()) {
if (action == ACTION_DOWN || isHoverActionWithoutConsumer) {
ActiveGestureProtoLogProxy.logOnInputIgnoringFollowingEvents(displayId);
}
@@ -917,7 +941,7 @@
} else {
reasonString.append(" but event cannot trigger Assistant, "
+ "consuming gesture as no-op");
- mUncheckedConsumer = InputConsumer.NO_OP;
+ mUncheckedConsumer = createNoOpInputConsumer(displayId);
}
} else if ((!isOneHandedModeActive && isInSwipeUpTouchRegion)
|| isHoverActionWithoutConsumer || isOnBubbles) {
@@ -934,12 +958,12 @@
mGestureState = newGestureState;
mConsumer = newConsumer(
this,
- mResetGestureInputConsumer,
+ mUserUnlocked,
mOverviewComponentObserver,
mDeviceState,
prevGestureState,
mGestureState,
- mTaskAnimationManager,
+ taskAnimationManager,
inputMonitorCompat,
getSwipeUpHandlerFactory(),
this::onConsumerInactive,
@@ -968,19 +992,22 @@
+ "consuming gesture for one-handed action");
// Consume gesture event for triggering one handed feature.
mUncheckedConsumer = new OneHandedModeInputConsumer(
- this, displayId, mDeviceState, InputConsumer.NO_OP, inputMonitorCompat);
+ this,
+ displayId,
+ mDeviceState,
+ InputConsumer.createNoOpInputConsumer(displayId), inputMonitorCompat);
} else {
- mUncheckedConsumer = InputConsumer.NO_OP;
+ mUncheckedConsumer = InputConsumer.createNoOpInputConsumer(displayId);
}
} else {
// Other events
- if (mUncheckedConsumer != InputConsumer.NO_OP) {
+ if (mUncheckedConsumer.getType() != InputConsumer.TYPE_NO_OP) {
// Only transform the event if we are handling it in a proper consumer
mRotationTouchHelper.setOrientationTransformIfNeeded(event);
}
}
- if (mUncheckedConsumer != InputConsumer.NO_OP) {
+ if (mUncheckedConsumer.getType() != InputConsumer.TYPE_NO_OP) {
switch (action) {
case ACTION_DOWN:
ActiveGestureProtoLogProxy.logOnInputEventActionDown(displayId, reasonString);
@@ -1053,7 +1080,9 @@
GestureState.TrackpadGestureType trackpadGestureType) {
final GestureState gestureState;
TopTaskTracker.CachedTaskInfo taskInfo;
- if (mTaskAnimationManager.isRecentsAnimationRunning()) {
+ TaskAnimationManager taskAnimationManager = mRecentsDisplayModel.getTaskAnimationManager(
+ displayId);
+ if (taskAnimationManager != null && taskAnimationManager.isRecentsAnimationRunning()) {
gestureState = new GestureState(
mOverviewComponentObserver, displayId, ActiveGestureLog.INSTANCE.getLogId());
TopTaskTracker.CachedTaskInfo previousTaskInfo = previousGestureState.getRunningTask();
@@ -1100,7 +1129,12 @@
}
private void reset(int displayId) {
- mConsumer = mUncheckedConsumer = getDefaultInputConsumer();
+ mConsumer = mUncheckedConsumer = InputConsumerUtils.getDefaultInputConsumer(
+ displayId,
+ mUserUnlocked,
+ mRecentsDisplayModel.getTaskAnimationManager(displayId),
+ mTaskbarManager,
+ CompoundString.NO_OP);
mGestureState = DEFAULT_STATE;
// By default, use batching of the input events, but check receiver before using in the rare
// case that the monitor was disposed before the swipe settled
@@ -1110,29 +1144,6 @@
}
}
- private @NonNull InputConsumer getDefaultInputConsumer() {
- return getDefaultInputConsumer(CompoundString.NO_OP);
- }
-
- /**
- * Returns the {@link ResetGestureInputConsumer} if user is unlocked, else NO_OP.
- */
- private @NonNull InputConsumer getDefaultInputConsumer(@NonNull CompoundString reasonString) {
- if (mResetGestureInputConsumer != null) {
- reasonString.append(
- "%smResetGestureInputConsumer initialized, using ResetGestureInputConsumer",
- SUBSTRING_PREFIX);
- return mResetGestureInputConsumer;
- } else {
- reasonString.append(
- "%smResetGestureInputConsumer not initialized, using no-op input consumer",
- SUBSTRING_PREFIX);
- // mResetGestureInputConsumer isn't initialized until onUserUnlocked(), so reset to
- // NO_OP until then (we never want these to be null).
- return InputConsumer.NO_OP;
- }
- }
-
@Override
public void onConfigurationChanged(Configuration newConfig) {
if (!LockedUserState.get(this).isUserUnlocked()) {
@@ -1208,13 +1219,11 @@
if (createdOverviewContainer != null) {
createdOverviewContainer.getDeviceProfile().dump(this, "", pw);
}
+ resource.getTaskAnimationManager().dump("\t", pw);
}
pw.println("\tmConsumer=" + mConsumer.getName());
ActiveGestureLog.INSTANCE.dump("", pw);
RecentsModel.INSTANCE.get(this).dump("", pw);
- if (mTaskAnimationManager != null) {
- mTaskAnimationManager.dump("", pw);
- }
mTaskbarManager.dumpLogs("", pw);
DesktopVisibilityController.INSTANCE.get(this).dumpLogs("", pw);
pw.println("ContextualSearchStateManager:");
@@ -1226,22 +1235,28 @@
private AbsSwipeUpHandler createLauncherSwipeHandler(
GestureState gestureState, long touchTimeMs) {
- return new LauncherSwipeHandlerV2(this, mTaskAnimationManager,
- gestureState, touchTimeMs, mTaskAnimationManager.isRecentsAnimationRunning(),
+ TaskAnimationManager taskAnimationManager = mRecentsDisplayModel.getTaskAnimationManager(
+ gestureState.getDisplayId());
+ return new LauncherSwipeHandlerV2(this, taskAnimationManager,
+ gestureState, touchTimeMs, taskAnimationManager.isRecentsAnimationRunning(),
mInputConsumer, MSDLPlayerWrapper.INSTANCE.get(this));
}
private AbsSwipeUpHandler createFallbackSwipeHandler(
GestureState gestureState, long touchTimeMs) {
- return new FallbackSwipeHandler(this, mTaskAnimationManager,
- gestureState, touchTimeMs, mTaskAnimationManager.isRecentsAnimationRunning(),
+ TaskAnimationManager taskAnimationManager = mRecentsDisplayModel.getTaskAnimationManager(
+ gestureState.getDisplayId());
+ return new FallbackSwipeHandler(this, taskAnimationManager,
+ gestureState, touchTimeMs, taskAnimationManager.isRecentsAnimationRunning(),
mInputConsumer, MSDLPlayerWrapper.INSTANCE.get(this));
}
private AbsSwipeUpHandler createRecentsWindowSwipeHandler(
GestureState gestureState, long touchTimeMs) {
- return new RecentsWindowSwipeHandler(this, mTaskAnimationManager,
- gestureState, touchTimeMs, mTaskAnimationManager.isRecentsAnimationRunning(),
+ TaskAnimationManager taskAnimationManager = mRecentsDisplayModel.getTaskAnimationManager(
+ gestureState.getDisplayId());
+ return new RecentsWindowSwipeHandler(this, taskAnimationManager,
+ gestureState, touchTimeMs, taskAnimationManager.isRecentsAnimationRunning(),
mInputConsumer, MSDLPlayerWrapper.INSTANCE.get(this));
}
@@ -1252,7 +1267,7 @@
private InputMonitorDisplayModel(Context context) {
super(context);
- registerDisplayListener();
+ initializeDisplays();
}
@NonNull
diff --git a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsStateController.java b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsStateController.java
index 554cea2..7db1813 100644
--- a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsStateController.java
+++ b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsStateController.java
@@ -19,6 +19,7 @@
import static com.android.app.animation.Interpolators.INSTANT;
import static com.android.app.animation.Interpolators.LINEAR;
import static com.android.launcher3.Flags.enableDesktopExplodedView;
+import static com.android.launcher3.Flags.enableGridOnlyOverview;
import static com.android.launcher3.Flags.enableLargeDesktopWindowingTile;
import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_MODAL;
import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_SCALE;
@@ -118,7 +119,9 @@
config.getInterpolator(ANIM_OVERVIEW_TRANSLATE_Y, LINEAR));
setter.setFloat(mRecentsView, TASK_MODALNESS, state.getOverviewModalness(),
- config.getInterpolator(ANIM_OVERVIEW_MODAL, LINEAR));
+ config.getInterpolator(ANIM_OVERVIEW_MODAL,
+ enableGridOnlyOverview() && !state.isRecentsViewVisible() ? FINAL_FRAME
+ : LINEAR));
setter.setFloat(mRecentsView, FULLSCREEN_PROGRESS, state.isFullScreen() ? 1 : 0, LINEAR);
boolean showAsGrid =
state.displayOverviewTasksAsGrid(mRecentsViewContainer.getDeviceProfile());
diff --git a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java
index 8ec97ed..695c77c 100644
--- a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java
+++ b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java
@@ -17,6 +17,7 @@
import static android.app.ActivityTaskManager.INVALID_TASK_ID;
+import static com.android.launcher3.Flags.enableGridOnlyOverview;
import static com.android.quickstep.GestureState.GestureEndTarget.RECENTS;
import static com.android.quickstep.fallback.RecentsState.DEFAULT;
import static com.android.quickstep.fallback.RecentsState.MODAL_TASK;
@@ -252,7 +253,14 @@
@Override
public void onStateTransitionStart(RecentsState toState) {
setOverviewStateEnabled(true);
- setOverviewGridEnabled(toState.displayOverviewTasksAsGrid(mContainer.getDeviceProfile()));
+ if (enableGridOnlyOverview()) {
+ if (toState.displayOverviewTasksAsGrid(mContainer.getDeviceProfile())) {
+ setOverviewGridEnabled(true);
+ }
+ } else {
+ setOverviewGridEnabled(
+ toState.displayOverviewTasksAsGrid(mContainer.getDeviceProfile()));
+ }
setOverviewFullscreenEnabled(toState.isFullScreen());
if (toState == MODAL_TASK) {
setOverviewSelectEnabled(true);
@@ -271,6 +279,11 @@
@Override
public void onStateTransitionComplete(RecentsState finalState) {
DesktopVisibilityController.INSTANCE.get(mContainer).onLauncherStateChanged(finalState);
+ if (enableGridOnlyOverview()) {
+ if (!finalState.displayOverviewTasksAsGrid(mContainer.getDeviceProfile())) {
+ setOverviewGridEnabled(false);
+ }
+ }
if (!finalState.isRecentsViewVisible()) {
// Clean-up logic that occurs when recents is no longer in use/visible.
reset();
@@ -292,8 +305,7 @@
// disabling this so app icons aren't drawn on top of recent tasks.
if (isOverlayEnabled && !RecentsWindowFlags.Companion.getEnableOverviewInWindow()) {
- runActionOnRemoteHandles(remoteTargetHandle ->
- remoteTargetHandle.getTaskViewSimulator().setDrawsBelowRecents(true));
+ mBlurUtils.setDrawLiveTileBelowRecents(true);
}
}
@@ -303,6 +315,7 @@
if (enabled) {
RecentsState state = mContainer.getStateManager().getState();
setDisallowScrollToClearAll(!state.hasClearAllButton());
+ setDisallowScrollToAddDesk(!state.hasAddDeskButton());
}
}
diff --git a/quickstep/src/com/android/quickstep/fallback/RecentsState.java b/quickstep/src/com/android/quickstep/fallback/RecentsState.java
index 2c1a4eb..00aa109 100644
--- a/quickstep/src/com/android/quickstep/fallback/RecentsState.java
+++ b/quickstep/src/com/android/quickstep/fallback/RecentsState.java
@@ -17,6 +17,7 @@
import static com.android.launcher3.Flags.enableDesktopExplodedView;
import static com.android.launcher3.Flags.enableDesktopWindowingCarouselDetach;
+import static com.android.launcher3.Flags.enableGridOnlyOverview;
import static com.android.launcher3.LauncherState.FLAG_CLOSE_POPUPS;
import static com.android.launcher3.uioverrides.states.BackgroundAppState.getOverviewScaleAndOffsetForBackgroundState;
import static com.android.launcher3.uioverrides.states.OverviewModalTaskState.getOverviewScaleAndOffsetForModalState;
@@ -197,6 +198,9 @@
@Override
public float[] getOverviewScaleAndOffset(RecentsViewContainer container) {
+ if (enableGridOnlyOverview()) {
+ return super.getOverviewScaleAndOffset(container);
+ }
return getOverviewScaleAndOffsetForModalState(container.getOverviewPanel());
}
}
diff --git a/quickstep/src/com/android/quickstep/fallback/window/RecentsDisplayModel.kt b/quickstep/src/com/android/quickstep/fallback/window/RecentsDisplayModel.kt
index 12dc177..5b88686 100644
--- a/quickstep/src/com/android/quickstep/fallback/window/RecentsDisplayModel.kt
+++ b/quickstep/src/com/android/quickstep/fallback/window/RecentsDisplayModel.kt
@@ -17,7 +17,9 @@
package com.android.quickstep.fallback.window
import android.content.Context
+import android.util.Log
import android.view.Display
+import android.view.Display.DEFAULT_DISPLAY
import androidx.core.util.valueIterator
import com.android.launcher3.dagger.ApplicationContext
import com.android.launcher3.dagger.LauncherAppSingleton
@@ -26,6 +28,8 @@
import com.android.launcher3.util.WallpaperColorHints
import com.android.quickstep.DisplayModel
import com.android.quickstep.FallbackWindowInterface
+import com.android.quickstep.RecentsAnimationDeviceState
+import com.android.quickstep.TaskAnimationManager
import com.android.quickstep.dagger.QuickstepBaseAppComponent
import com.android.quickstep.fallback.window.RecentsDisplayModel.RecentsDisplayResource
import com.android.quickstep.fallback.window.RecentsWindowFlags.Companion.enableOverviewInWindow
@@ -54,9 +58,12 @@
init {
if (enableOverviewInWindow) {
- registerDisplayListener()
- tracker.addCloseable { destroy() }
+ initializeDisplays()
+ } else {
+ // Always create resource for default display
+ storeDisplayResource(DEFAULT_DISPLAY)
}
+ tracker.addCloseable { destroy() }
}
override fun createDisplayResource(display: Display): RecentsDisplayResource {
@@ -68,13 +75,19 @@
}
fun getRecentsWindowManager(displayId: Int): RecentsWindowManager? {
+ if (DEBUG) Log.d(TAG, "getRecentsWindowManager for display $displayId")
return getDisplayResource(displayId)?.recentsWindowManager
}
fun getFallbackWindowInterface(displayId: Int): FallbackWindowInterface? {
+ if (DEBUG) Log.d(TAG, "getFallbackWindowInterface for display $displayId")
return getDisplayResource(displayId)?.fallbackWindowInterface
}
+ fun getTaskAnimationManager(displayId: Int): TaskAnimationManager? {
+ return getDisplayResource(displayId)?.taskAnimationManager
+ }
+
val activeDisplayResources: Iterable<RecentsDisplayResource>
get() =
object : Iterable<RecentsDisplayResource> {
@@ -86,12 +99,20 @@
val displayContext: Context,
val wallpaperColorHints: Int,
) : DisplayResource() {
- val recentsWindowManager = RecentsWindowManager(displayContext, wallpaperColorHints)
- val fallbackWindowInterface: FallbackWindowInterface =
- FallbackWindowInterface(recentsWindowManager)
+ val recentsWindowManager =
+ if (enableOverviewInWindow) RecentsWindowManager(displayContext, wallpaperColorHints)
+ else null
+ val fallbackWindowInterface =
+ if (enableOverviewInWindow) FallbackWindowInterface(recentsWindowManager) else null
+ val taskAnimationManager =
+ TaskAnimationManager(
+ displayContext,
+ RecentsAnimationDeviceState.INSTANCE.get(displayContext),
+ displayId,
+ )
override fun cleanup() {
- recentsWindowManager.destroy()
+ recentsWindowManager?.destroy()
}
override fun dump(prefix: String, writer: PrintWriter) {
diff --git a/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowFlags.kt b/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowFlags.kt
index 9953154..d880774 100644
--- a/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowFlags.kt
+++ b/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowFlags.kt
@@ -29,8 +29,15 @@
val enableFallbackOverviewInWindow: DesktopModeFlag =
DesktopModeFlag(Flags::enableFallbackOverviewInWindow, false)
+ @JvmField
+ val enableOverviewOnConnectedDisplays: DesktopModeFlag =
+ DesktopModeFlag(Flags::enableOverviewOnConnectedDisplays, false)
+
@JvmStatic
val enableOverviewInWindow
- get() = enableLauncherOverviewInWindow.isTrue || enableFallbackOverviewInWindow.isTrue
+ get() =
+ enableLauncherOverviewInWindow.isTrue ||
+ enableFallbackOverviewInWindow.isTrue ||
+ enableOverviewOnConnectedDisplays.isTrue
}
}
diff --git a/quickstep/src/com/android/quickstep/inputconsumers/ResetGestureInputConsumer.java b/quickstep/src/com/android/quickstep/inputconsumers/ResetGestureInputConsumer.java
deleted file mode 100644
index 349f4d2..0000000
--- a/quickstep/src/com/android/quickstep/inputconsumers/ResetGestureInputConsumer.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2019 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.inputconsumers;
-
-import android.view.MotionEvent;
-
-import com.android.launcher3.taskbar.TaskbarActivityContext;
-import com.android.quickstep.InputConsumer;
-import com.android.quickstep.TaskAnimationManager;
-
-import java.util.function.Supplier;
-
-/**
- * A NO_OP input consumer which also resets any pending gesture
- */
-public class ResetGestureInputConsumer implements InputConsumer {
-
- private final TaskAnimationManager mTaskAnimationManager;
- private final Supplier<TaskbarActivityContext> mActivityContextSupplier;
-
- public ResetGestureInputConsumer(
- TaskAnimationManager taskAnimationManager,
- Supplier<TaskbarActivityContext> activityContextSupplier) {
- mTaskAnimationManager = taskAnimationManager;
- mActivityContextSupplier = activityContextSupplier;
- }
-
- @Override
- public int getType() {
- return TYPE_RESET_GESTURE;
- }
-
- @Override
- public void onMotionEvent(MotionEvent ev) {
- if (ev.getAction() == MotionEvent.ACTION_DOWN
- && mTaskAnimationManager.isRecentsAnimationRunning()) {
- TaskbarActivityContext tac = mActivityContextSupplier.get();
- mTaskAnimationManager.finishRunningRecentsAnimation(
- /* toHome= */ tac != null && !tac.isInApp());
- }
- }
-}
diff --git a/quickstep/src/com/android/quickstep/inputconsumers/ResetGestureInputConsumer.kt b/quickstep/src/com/android/quickstep/inputconsumers/ResetGestureInputConsumer.kt
new file mode 100644
index 0000000..96e7943
--- /dev/null
+++ b/quickstep/src/com/android/quickstep/inputconsumers/ResetGestureInputConsumer.kt
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2019 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.inputconsumers
+
+import android.view.MotionEvent
+import com.android.launcher3.taskbar.TaskbarActivityContext
+import com.android.quickstep.InputConsumer
+import com.android.quickstep.TaskAnimationManager
+import java.util.function.Supplier
+
+/** A NO_OP input consumer which also resets any pending gesture */
+class ResetGestureInputConsumer(
+ private val displayId: Int,
+ private val taskAnimationManager: TaskAnimationManager,
+ private val activityContextSupplier: Supplier<TaskbarActivityContext?>,
+) : InputConsumer {
+ override fun getType() = InputConsumer.TYPE_RESET_GESTURE
+
+ override fun getDisplayId() = displayId
+
+ override fun onMotionEvent(ev: MotionEvent) {
+ if (
+ ev.action == MotionEvent.ACTION_DOWN && taskAnimationManager.isRecentsAnimationRunning
+ ) {
+ val tac = activityContextSupplier.get()
+ taskAnimationManager.finishRunningRecentsAnimation(
+ /* toHome= */ tac != null && !tac.isInApp
+ )
+ }
+ }
+}
diff --git a/quickstep/src/com/android/quickstep/orientation/LandscapePagedViewHandler.kt b/quickstep/src/com/android/quickstep/orientation/LandscapePagedViewHandler.kt
index c4e343e..b8f43a4 100644
--- a/quickstep/src/com/android/quickstep/orientation/LandscapePagedViewHandler.kt
+++ b/quickstep/src/com/android/quickstep/orientation/LandscapePagedViewHandler.kt
@@ -661,7 +661,7 @@
): SplitIconPositions {
return if (Flags.enableOverviewIconMenu()) {
if (isRtl) {
- SplitIconPositions(0, -(totalThumbnailHeight - primarySnapshotHeight))
+ SplitIconPositions(-(totalThumbnailHeight - primarySnapshotHeight), 0)
} else {
SplitIconPositions(0, primarySnapshotHeight + dividerSize)
}
diff --git a/quickstep/src/com/android/quickstep/orientation/SeascapePagedViewHandler.kt b/quickstep/src/com/android/quickstep/orientation/SeascapePagedViewHandler.kt
index 67358bbb..80b50cb 100644
--- a/quickstep/src/com/android/quickstep/orientation/SeascapePagedViewHandler.kt
+++ b/quickstep/src/com/android/quickstep/orientation/SeascapePagedViewHandler.kt
@@ -248,14 +248,14 @@
val iconCenter = iconAppChipView.getHeight() / 2f
if (isRtl) {
- iconMenuParams.gravity = Gravity.TOP or Gravity.END
+ iconMenuParams.gravity = Gravity.TOP or Gravity.START
iconMenuParams.topMargin = iconMenuMargin
iconMenuParams.marginEnd = thumbnailTopMargin
// Use half menu height to place the pivot within the X/Y center of icon in the menu.
iconAppChipView.pivotX = iconMenuParams.width / 2f
iconAppChipView.pivotY = iconMenuParams.width / 2f
} else {
- iconMenuParams.gravity = Gravity.BOTTOM or Gravity.START
+ iconMenuParams.gravity = Gravity.BOTTOM or Gravity.END
iconMenuParams.topMargin = 0
iconMenuParams.marginEnd = 0
iconAppChipView.pivotX = iconCenter
@@ -409,7 +409,7 @@
if (Flags.enableOverviewIconMenu()) {
val appChipView = iconView as IconAppChipView
layoutParams.gravity =
- if (isRtl) Gravity.TOP or Gravity.END else Gravity.BOTTOM or Gravity.START
+ if (isRtl) Gravity.TOP or Gravity.START else Gravity.BOTTOM or Gravity.END
appChipView.layoutParams = layoutParams
appChipView.setSplitTranslationX(0f)
appChipView.setSplitTranslationY(translationY.toFloat())
diff --git a/quickstep/src/com/android/quickstep/recents/di/RecentsDependencies.kt b/quickstep/src/com/android/quickstep/recents/di/RecentsDependencies.kt
index 553a620..00ef13b 100644
--- a/quickstep/src/com/android/quickstep/recents/di/RecentsDependencies.kt
+++ b/quickstep/src/com/android/quickstep/recents/di/RecentsDependencies.kt
@@ -31,7 +31,7 @@
import com.android.quickstep.recents.domain.usecase.IsThumbnailValidUseCase
import com.android.quickstep.recents.domain.usecase.OrganizeDesktopTasksUseCase
import com.android.quickstep.recents.viewmodel.RecentsViewData
-import com.android.systemui.shared.recents.utilities.PreviewPositionHelper
+import com.android.systemui.shared.recents.utilities.PreviewPositionHelper.PreviewPositionHelperFactory
import kotlinx.coroutines.CoroutineName
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.SupervisorJob
@@ -203,7 +203,7 @@
GetThumbnailPositionUseCase(
deviceProfileRepository = inject(scopeId),
rotationStateRepository = inject(scopeId),
- previewPositionHelper = PreviewPositionHelper(),
+ previewPositionHelperFactory = PreviewPositionHelperFactory(),
)
OrganizeDesktopTasksUseCase::class.java -> OrganizeDesktopTasksUseCase()
else -> {
diff --git a/quickstep/src/com/android/quickstep/recents/domain/usecase/GetThumbnailPositionUseCase.kt b/quickstep/src/com/android/quickstep/recents/domain/usecase/GetThumbnailPositionUseCase.kt
index 8501382..e83d9f0 100644
--- a/quickstep/src/com/android/quickstep/recents/domain/usecase/GetThumbnailPositionUseCase.kt
+++ b/quickstep/src/com/android/quickstep/recents/domain/usecase/GetThumbnailPositionUseCase.kt
@@ -27,7 +27,7 @@
class GetThumbnailPositionUseCase(
private val deviceProfileRepository: RecentsDeviceProfileRepository,
private val rotationStateRepository: RecentsRotationStateRepository,
- private val previewPositionHelper: PreviewPositionHelper,
+ private val previewPositionHelperFactory: PreviewPositionHelper.PreviewPositionHelperFactory,
) {
operator fun invoke(
thumbnailData: ThumbnailData?,
@@ -38,6 +38,7 @@
val thumbnail =
thumbnailData?.thumbnail ?: return ThumbnailPosition(Matrix.IDENTITY_MATRIX, false)
+ val previewPositionHelper = previewPositionHelperFactory.create()
previewPositionHelper.updateThumbnailMatrix(
Rect(0, 0, thumbnail.width, thumbnail.height),
thumbnailData,
diff --git a/quickstep/src/com/android/quickstep/util/BaseDepthController.java b/quickstep/src/com/android/quickstep/util/BaseDepthController.java
index f956a7c..89f1e33 100644
--- a/quickstep/src/com/android/quickstep/util/BaseDepthController.java
+++ b/quickstep/src/com/android/quickstep/util/BaseDepthController.java
@@ -15,6 +15,7 @@
*/
package com.android.quickstep.util;
+import static com.android.launcher3.Flags.enableOverviewBackgroundWallpaperBlur;
import static com.android.launcher3.Flags.enableScalingRevealHomeAnimation;
import android.app.WallpaperManager;
@@ -24,6 +25,8 @@
import android.view.AttachedSurfaceControl;
import android.view.SurfaceControl;
+import androidx.annotation.Nullable;
+
import com.android.launcher3.Flags;
import com.android.launcher3.Launcher;
import com.android.launcher3.R;
@@ -75,11 +78,14 @@
/**
* Ratio from 0 to 1, where 0 is fully zoomed out, and 1 is zoomed in.
+ *
* @see android.service.wallpaper.WallpaperService.Engine#onZoomChanged(float)
*/
private float mDepth;
- protected SurfaceControl mSurface;
+ protected SurfaceControl mBaseSurface;
+
+ protected SurfaceControl mBaseSurfaceOverride;
// Hints that there is potentially content behind Launcher and that we shouldn't optimize by
// marking the launcher surface as opaque. Only used in certain Launcher states.
@@ -100,6 +106,8 @@
protected boolean mWaitingOnSurfaceValidity;
+ private SurfaceControl mBlurSurface = null;
+
public BaseDepthController(Launcher activity) {
mLauncher = activity;
if (Flags.allAppsBlur()) {
@@ -114,6 +122,13 @@
new MultiPropertyFactory<>(this, DEPTH, DEPTH_INDEX_COUNT, Float::max);
stateDepth = depthProperty.get(DEPTH_INDEX_STATE_TRANSITION);
widgetDepth = depthProperty.get(DEPTH_INDEX_WIDGET);
+ if (enableOverviewBackgroundWallpaperBlur()) {
+ mBlurSurface = new SurfaceControl.Builder()
+ .setName("Overview Blur")
+ .setHidden(false)
+ .build();
+ }
+
}
protected void setCrossWindowBlursEnabled(boolean isEnabled) {
@@ -151,11 +166,11 @@
if (!BlurUtils.supportsBlursOnWindows()) {
return;
}
- if (mSurface == null) {
+ if (mBaseSurface == null) {
Log.d(TAG, "mSurface is null and mCurrentBlur is: " + mCurrentBlur);
return;
}
- if (!mSurface.isValid()) {
+ if (!mBaseSurface.isValid()) {
Log.d(TAG, "mSurface is not valid");
mWaitingOnSurfaceValidity = true;
onInvalidSurface();
@@ -174,10 +189,21 @@
mCurrentBlur = !mCrossWindowBlursEnabled || hasOpaqueBg || mPauseBlurs
? 0 : (int) (blurAmount * mMaxBlurRadius);
- SurfaceControl.Transaction transaction = new SurfaceControl.Transaction()
- .setBackgroundBlurRadius(mSurface, mCurrentBlur)
- .setOpaque(mSurface, isSurfaceOpaque);
-
+ SurfaceControl.Transaction transaction = new SurfaceControl.Transaction();
+ if (enableOverviewBackgroundWallpaperBlur() && mBlurSurface != null) {
+ // Reparent to launcher for full screen blur.
+ transaction.setBackgroundBlurRadius(mBlurSurface, mCurrentBlur)
+ .reparent(mBlurSurface, mBaseSurface);
+ // Set mBlurSurface to be 1 layer behind mBaseSurface or mBaseSurfaceOverride.
+ if (mBaseSurfaceOverride != null && mBaseSurfaceOverride.isValid()) {
+ transaction.setRelativeLayer(mBlurSurface, mBaseSurfaceOverride, -1);
+ } else {
+ transaction.setRelativeLayer(mBlurSurface, mBaseSurface, -1);
+ }
+ } else {
+ transaction.setBackgroundBlurRadius(mBaseSurface, mCurrentBlur);
+ }
+ transaction.setOpaque(mBaseSurface, isSurfaceOpaque);
// Set early wake-up flags when we know we're executing an expensive operation, this way
// SurfaceFlinger will adjust its internal offsets to avoid jank.
boolean wantsEarlyWakeUp = depth > 0 && depth < 1;
@@ -209,13 +235,26 @@
}
/**
+ * Sets the lowest surface that should not be blurred.
+ * <p>
+ * Blur is applied to below {@link #mBaseSurfaceOverride}. When set to {@code null}, blur is
+ * applied
+ * to below {@link #mBaseSurface}.
+ * </p>
+ */
+ public void setBaseSurfaceOverride(@Nullable SurfaceControl baseSurfaceOverride) {
+ this.mBaseSurfaceOverride = baseSurfaceOverride;
+ applyDepthAndBlur();
+ }
+
+ /**
* Sets the specified app target surface to apply the blur to.
*/
- protected void setSurface(SurfaceControl surface) {
- if (mSurface != surface || mWaitingOnSurfaceValidity) {
- mSurface = surface;
+ protected void setBaseSurface(SurfaceControl baseSurface) {
+ if (mBaseSurface != baseSurface || mWaitingOnSurfaceValidity) {
+ mBaseSurface = baseSurface;
Log.d(TAG, "setSurface:\n\tmWaitingOnSurfaceValidity: " + mWaitingOnSurfaceValidity
- + "\n\tmSurface: " + mSurface);
+ + "\n\tmBaseSurface: " + mBaseSurface);
applyDepthAndBlur();
}
}
diff --git a/quickstep/src/com/android/quickstep/util/DesksUtils.kt b/quickstep/src/com/android/quickstep/util/DesksUtils.kt
index ecddc3f..521ba27 100644
--- a/quickstep/src/com/android/quickstep/util/DesksUtils.kt
+++ b/quickstep/src/com/android/quickstep/util/DesksUtils.kt
@@ -38,8 +38,12 @@
task.key.component?.let(::isDesktopWallpaperComponent) == true
@JvmStatic
- fun isDesktopWallpaperTask(taskInfo: TaskInfo) =
- taskInfo.baseIntent.component?.let(::isDesktopWallpaperComponent) == true
+ fun isDesktopWallpaperTask(taskInfo: TaskInfo): Boolean {
+ // TODO: b/403118101 - In some launcher tests, there is a task with baseIntent set to
+ // null. Remove this check after finding out how that task is created.
+ if (taskInfo.baseIntent == null) return false
+ return taskInfo.baseIntent.component?.let(::isDesktopWallpaperComponent) == true
+ }
@JvmStatic
fun isDesktopWallpaperComponent(component: ComponentName) =
diff --git a/quickstep/src/com/android/quickstep/util/DesktopTask.kt b/quickstep/src/com/android/quickstep/util/DesktopTask.kt
index fbe3bc6..7c27293 100644
--- a/quickstep/src/com/android/quickstep/util/DesktopTask.kt
+++ b/quickstep/src/com/android/quickstep/util/DesktopTask.kt
@@ -17,22 +17,27 @@
import com.android.quickstep.views.TaskViewType
import com.android.systemui.shared.recents.model.Task
+import java.util.Objects
/**
* A [Task] container that can contain N number of tasks that are part of the desktop in recent
- * tasks list. Note that desktops can be empty with no tasks in them. The [deskId] makes sense only
- * when the multiple desks feature is enabled.
+ * tasks list. Note that desktops can be empty with no tasks in them. The [deskId], [displayId]
+ * makes sense only when the multiple desks feature is enabled.
*/
-class DesktopTask(val deskId: Int, tasks: List<Task>) : GroupTask(tasks, TaskViewType.DESKTOP) {
+class DesktopTask(val deskId: Int, val displayId: Int, tasks: List<Task>) :
+ GroupTask(tasks, TaskViewType.DESKTOP) {
- override fun copy() = DesktopTask(deskId, tasks)
+ override fun copy() = DesktopTask(deskId, displayId, tasks)
- override fun toString() = "type=$taskViewType deskId=$deskId tasks=$tasks"
+ override fun toString() = "type=$taskViewType deskId=$deskId displayId=$displayId tasks=$tasks"
override fun equals(o: Any?): Boolean {
if (this === o) return true
if (o !is DesktopTask) return false
if (deskId != o.deskId) return false
+ if (displayId != o.displayId) return false
return super.equals(o)
}
+
+ override fun hashCode() = Objects.hash(super.hashCode(), deskId, displayId)
}
diff --git a/quickstep/src/com/android/quickstep/util/GroupTask.kt b/quickstep/src/com/android/quickstep/util/GroupTask.kt
index add8821..2b754e2 100644
--- a/quickstep/src/com/android/quickstep/util/GroupTask.kt
+++ b/quickstep/src/com/android/quickstep/util/GroupTask.kt
@@ -86,6 +86,8 @@
return TaskItemInfo(task.task.key.id, wii)
}
}
+
+ override fun hashCode() = super.hashCode()
}
/**
diff --git a/quickstep/src/com/android/quickstep/util/InputProxyHandlerFactory.java b/quickstep/src/com/android/quickstep/util/InputProxyHandlerFactory.java
index 843619d..9aded89 100644
--- a/quickstep/src/com/android/quickstep/util/InputProxyHandlerFactory.java
+++ b/quickstep/src/com/android/quickstep/util/InputProxyHandlerFactory.java
@@ -35,8 +35,8 @@
private final GestureState mGestureState;
@UiThread
- public InputProxyHandlerFactory(BaseContainerInterface activityInterface,
- GestureState gestureState) {
+ public InputProxyHandlerFactory(
+ BaseContainerInterface activityInterface, GestureState gestureState) {
mContainerInterface = activityInterface;
mGestureState = gestureState;
}
@@ -47,7 +47,8 @@
@Override
public InputConsumer get() {
RecentsViewContainer container = mContainerInterface.getCreatedContainer();
- return container == null ? InputConsumer.NO_OP
+ return container == null
+ ? InputConsumer.createNoOpInputConsumer(mGestureState.getDisplayId())
: new OverviewInputConsumer(mGestureState, container, null, true);
}
}
diff --git a/quickstep/src/com/android/quickstep/util/SwipePipToHomeAnimator.java b/quickstep/src/com/android/quickstep/util/SwipePipToHomeAnimator.java
index d2f9652..54ac1cf 100644
--- a/quickstep/src/com/android/quickstep/util/SwipePipToHomeAnimator.java
+++ b/quickstep/src/com/android/quickstep/util/SwipePipToHomeAnimator.java
@@ -137,7 +137,8 @@
mDestinationBoundsTransformed.set(destinationBoundsTransformed);
mSurfaceTransactionHelper = new PipSurfaceTransactionHelper(cornerRadius, shadowRadius);
- final float aspectRatio = destinationBounds.width() / (float) destinationBounds.height();
+ final Rational aspectRatio = new Rational(
+ destinationBounds.width(), destinationBounds.height());
String reasonForCreateOverlay = null; // For debugging purpose.
// Slightly larger app bounds to allow for off by 1 pixel source-rect-hint errors.
@@ -158,16 +159,22 @@
// not a valid rectangle to use for cropping app surface
reasonForCreateOverlay = "Source rect hint exceeds display bounds " + sourceRectHint;
sourceRectHint.setEmpty();
- } else if (!PictureInPictureParams.isSameAspectRatio(sourceRectHint,
- new Rational(destinationBounds.width(), destinationBounds.height()))) {
- // The source rect hint does not aspect ratio
- reasonForCreateOverlay = "Source rect hint does not match aspect ratio "
- + sourceRectHint + " aspect ratio " + aspectRatio;
- sourceRectHint.setEmpty();
+ } else {
+ final Rational srcAspectRatio = new Rational(
+ sourceRectHint.width(), sourceRectHint.height());
+ if (!PictureInPictureParams.isSameAspectRatio(destinationBounds, srcAspectRatio)) {
+ // The aspect ratio of destination bounds does not match source rect hint.
+ // We use the aspect ratio of source rect hint to check against destination bounds
+ // here to avoid upscaling error.
+ reasonForCreateOverlay = "Source rect hint:" + sourceRectHint
+ + " does not match destination bounds:" + destinationBounds;
+ sourceRectHint.setEmpty();
+ }
}
if (sourceRectHint.isEmpty()) {
- mSourceRectHint.set(getEnterPipWithOverlaySrcRectHint(appBounds, aspectRatio));
+ mSourceRectHint.set(
+ getEnterPipWithOverlaySrcRectHint(appBounds, aspectRatio.floatValue()));
mPipContentOverlay = new PipContentOverlay.PipAppIconOverlay(view.getContext(),
mAppBounds, mDestinationBounds,
new IconProvider(context).getIcon(mActivityInfo), appIconSizePx);
diff --git a/quickstep/src/com/android/quickstep/views/BlurUtils.kt b/quickstep/src/com/android/quickstep/views/BlurUtils.kt
new file mode 100644
index 0000000..d6b2a05
--- /dev/null
+++ b/quickstep/src/com/android/quickstep/views/BlurUtils.kt
@@ -0,0 +1,63 @@
+/*
+ * 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.views
+
+import com.android.launcher3.Flags.enableOverviewBackgroundWallpaperBlur
+import com.android.quickstep.RemoteTargetGluer.RemoteTargetHandle
+
+/** Applies blur either behind launcher surface or live tile app. */
+class BlurUtils(private val recentsView: RecentsView<*, *>) {
+
+ fun setDrawLiveTileBelowRecents(drawBelowRecents: Boolean) {
+ val liveTileRemoteTargetHandles =
+ if (
+ recentsView.remoteTargetHandles != null &&
+ recentsView.recentsAnimationController != null
+ )
+ recentsView.remoteTargetHandles
+ else null
+ setDrawBelowRecents(drawBelowRecents, liveTileRemoteTargetHandles)
+ }
+
+ /**
+ * Set surface in [remoteTargetHandles] to be above or below Recents layer, and update the base
+ * layer to apply blur to in BaseDepthController.
+ */
+ fun setDrawBelowRecents(
+ drawBelowRecents: Boolean,
+ remoteTargetHandles: Array<RemoteTargetHandle>? = null,
+ ) {
+ remoteTargetHandles?.forEach { it.taskViewSimulator.setDrawsBelowRecents(drawBelowRecents) }
+ if (enableOverviewBackgroundWallpaperBlur()) {
+ recentsView.depthController?.setBaseSurfaceOverride(
+ // Blurs behind launcher layer.
+ if (!drawBelowRecents || remoteTargetHandles == null) {
+ null
+ } else {
+ // Blurs behind live tile. blur will be applied behind window
+ // which farthest from user in case of desktop and split apps.
+ remoteTargetHandles
+ .maxByOrNull { it.transformParams.targetSet.firstAppTarget.leash.layerId }
+ ?.transformParams
+ ?.targetSet
+ ?.firstAppTarget
+ ?.leash
+ }
+ )
+ }
+ }
+}
diff --git a/quickstep/src/com/android/quickstep/views/DesktopTaskView.kt b/quickstep/src/com/android/quickstep/views/DesktopTaskView.kt
index 27657b4..8876633 100644
--- a/quickstep/src/com/android/quickstep/views/DesktopTaskView.kt
+++ b/quickstep/src/com/android/quickstep/views/DesktopTaskView.kt
@@ -25,6 +25,7 @@
import android.util.AttributeSet
import android.util.Log
import android.util.Size
+import android.view.Display.INVALID_DISPLAY
import android.view.Gravity
import android.view.View
import android.view.ViewStub
@@ -59,6 +60,7 @@
import com.android.quickstep.task.thumbnail.TaskThumbnailView
import com.android.quickstep.util.DesktopTask
import com.android.quickstep.util.RecentsOrientedState
+import com.android.wm.shell.shared.desktopmode.DesktopModeStatus.enableMultipleDesktops
import kotlin.math.roundToInt
/** TaskView that contains all tasks that are part of the desktop. */
@@ -69,7 +71,10 @@
type = TaskViewType.DESKTOP,
thumbnailFullscreenParams = DesktopFullscreenDrawParams(context),
) {
- var deskId = DesktopVisibilityController.INACTIVE_DESK_ID
+ val deskId
+ get() = desktopTask?.deskId ?: DesktopVisibilityController.INACTIVE_DESK_ID
+
+ private var desktopTask: DesktopTask? = null
private val contentViewFullscreenParams = FullscreenDrawParams(context)
@@ -112,6 +117,14 @@
positionTaskWindows()
}
+ override val displayId: Int
+ get() =
+ if (enableMultipleDesktops(context)) {
+ desktopTask?.displayId ?: INVALID_DISPLAY
+ } else {
+ super.displayId
+ }
+
private fun getRemoteTargetHandle(taskId: Int): RemoteTargetHandle? =
remoteTargetHandles?.firstOrNull {
it.transformParams.targetSet.firstAppTargetTaskId == taskId
@@ -284,7 +297,7 @@
orientedState: RecentsOrientedState,
taskOverlayFactory: TaskOverlayFactory,
) {
- deskId = desktopTask.deskId
+ this.desktopTask = desktopTask
// TODO(b/370495260): Minimized tasks should not be filtered with desktop exploded view
// support.
// Minimized tasks should not be shown in Overview.
@@ -336,7 +349,7 @@
override fun onRecycle() {
super.onRecycle()
- deskId = DesktopVisibilityController.INACTIVE_DESK_ID
+ desktopTask = null
explodeProgress = 0.0f
viewModel = null
visibility = VISIBLE
diff --git a/quickstep/src/com/android/quickstep/views/GroupedTaskView.kt b/quickstep/src/com/android/quickstep/views/GroupedTaskView.kt
index 71a4dde..10a2e90 100644
--- a/quickstep/src/com/android/quickstep/views/GroupedTaskView.kt
+++ b/quickstep/src/com/android/quickstep/views/GroupedTaskView.kt
@@ -182,7 +182,6 @@
val splitBoundsConfig = splitBoundsConfig ?: return
val deviceProfile = container.deviceProfile
val taskIconHeight = deviceProfile.overviewTaskIconSizePx
- val isRtl = layoutDirection == LAYOUT_DIRECTION_RTL
val inSplitSelection = getThisTaskCurrentlyInSplitSelection() != INVALID_TASK_ID
var oneIconHiddenDueToSmallWidth = false
@@ -211,6 +210,7 @@
}
if (enableOverviewIconMenu()) {
+ val isDeviceRtl = Utilities.isRtl(resources)
val groupedTaskViewSizes =
pagedOrientationHandler.getGroupedTaskViewSizes(
deviceProfile,
@@ -226,7 +226,7 @@
groupedTaskViewSizes.first.y,
layoutParams.height,
layoutParams.width,
- isRtl,
+ isDeviceRtl,
deviceProfile,
splitBoundsConfig,
inSplitSelection,
@@ -241,7 +241,7 @@
leftTopTaskContainer.taskContentView.measuredHeight,
measuredHeight,
measuredWidth,
- isRtl,
+ isLayoutRtl,
deviceProfile,
splitBoundsConfig,
inSplitSelection,
diff --git a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java
index 0f1c294..c1282b9 100644
--- a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java
+++ b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java
@@ -18,7 +18,9 @@
import static android.app.ActivityTaskManager.INVALID_TASK_ID;
import static android.window.DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY;
+import static com.android.launcher3.Flags.enableGridOnlyOverview;
import static com.android.launcher3.LauncherState.CLEAR_ALL_BUTTON;
+import static com.android.launcher3.LauncherState.ADD_DESK_BUTTON;
import static com.android.launcher3.LauncherState.NORMAL;
import static com.android.launcher3.LauncherState.OVERVIEW;
import static com.android.launcher3.LauncherState.OVERVIEW_MODAL_TASK;
@@ -150,7 +152,14 @@
public void onStateTransitionStart(LauncherState toState) {
setOverviewStateEnabled(toState.isRecentsViewVisible);
- setOverviewGridEnabled(toState.displayOverviewTasksAsGrid(mContainer.getDeviceProfile()));
+ if (enableGridOnlyOverview()) {
+ if (toState.displayOverviewTasksAsGrid(mContainer.getDeviceProfile())) {
+ setOverviewGridEnabled(true);
+ }
+ } else {
+ setOverviewGridEnabled(
+ toState.displayOverviewTasksAsGrid(mContainer.getDeviceProfile()));
+ }
setOverviewFullscreenEnabled(toState.getOverviewFullscreenProgress() == 1);
if (toState == OVERVIEW_MODAL_TASK) {
setOverviewSelectEnabled(true);
@@ -169,6 +178,11 @@
@Override
public void onStateTransitionComplete(LauncherState finalState) {
DesktopVisibilityController.INSTANCE.get(mContainer).onLauncherStateChanged(finalState);
+ if (enableGridOnlyOverview()) {
+ if (!finalState.displayOverviewTasksAsGrid(mContainer.getDeviceProfile())) {
+ setOverviewGridEnabled(false);
+ }
+ }
if (!finalState.isRecentsViewVisible) {
// Clean-up logic that occurs when recents is no longer in use/visible.
@@ -184,10 +198,8 @@
if (finalState.isRecentsViewVisible && finalState != OVERVIEW_MODAL_TASK) {
setTaskBorderEnabled(true);
}
-
if (isOverlayEnabled) {
- runActionOnRemoteHandles(remoteTargetHandle ->
- remoteTargetHandle.getTaskViewSimulator().setDrawsBelowRecents(true));
+ mBlurUtils.setDrawLiveTileBelowRecents(true);
}
}
@@ -198,7 +210,10 @@
LauncherState state = getStateManager().getState();
boolean hasClearAllButton = (state.getVisibleElements(mContainer)
& CLEAR_ALL_BUTTON) != 0;
+ boolean hasAddDeskButton = (state.getVisibleElements(mContainer)
+ & ADD_DESK_BUTTON) != 0;
setDisallowScrollToClearAll(!hasClearAllButton);
+ setDisallowScrollToAddDesk(!hasAddDeskButton);
}
}
@@ -276,7 +291,7 @@
GestureState.GestureEndTarget endTarget = mCurrentGestureEndTarget;
if (endTarget == GestureState.GestureEndTarget.LAST_TASK
&& desktopVisibilityController.isInDesktopModeAndNotInOverview(
- mContainer.getDisplayId())) {
+ mContainer.getDisplayId())) {
// Recents gesture was cancelled and we are returning to the previous task.
// After super class has handled clean up, show desktop apps on top again
showDesktopApps = true;
diff --git a/quickstep/src/com/android/quickstep/views/RecentsDismissUtils.kt b/quickstep/src/com/android/quickstep/views/RecentsDismissUtils.kt
index 4ce18f5..d39b528 100644
--- a/quickstep/src/com/android/quickstep/views/RecentsDismissUtils.kt
+++ b/quickstep/src/com/android/quickstep/views/RecentsDismissUtils.kt
@@ -96,63 +96,86 @@
onEndRunnable()
}
if (!isDismissing) {
- addNeighboringSpringAnimationsForDismissCancel(
+ addNeighborSettlingSpringAnimations(
draggedTaskView,
draggedTaskViewSpringAnimation,
+ driverProgressThreshold = 0f,
+ isSpringDirectionVertical = true,
)
}
return draggedTaskViewSpringAnimation
}
- private fun addNeighboringSpringAnimationsForDismissCancel(
+ private fun addNeighborSettlingSpringAnimations(
draggedTaskView: TaskView,
- draggedTaskViewSpringAnimation: SpringAnimation,
+ springAnimationDriver: SpringAnimation,
+ tasksToExclude: List<TaskView> = emptyList(),
+ driverProgressThreshold: Float,
+ isSpringDirectionVertical: Boolean,
) {
// Empty spring animation exists for conditional start, and to drive neighboring springs.
val neighborsToSettle =
SpringAnimation(FloatValueHolder()).setSpring(createExpressiveDismissSpringForce())
- var lastPosition = 0f
- var startSettling = false
- draggedTaskViewSpringAnimation.addUpdateListener { _, value, velocity ->
- // Start the settling animation the first time the dragged task passes the origin (from
- // negative displacement to positive displacement). We do not check for an exact value
- // to compare to, as the update listener does not necessarily hit every value (e.g. a
- // value of zero). Do not check again once it has started settling, as a spring can
- // bounce past the origin multiple times depending on the stiffness and damping ratio.
- if (startSettling) return@addUpdateListener
- if (lastPosition < 0 && value >= 0) {
- startSettling = true
- }
- lastPosition = value
- if (startSettling) {
- neighborsToSettle.setStartVelocity(velocity).animateToFinalPosition(0f)
- playDismissSettlingHaptic(velocity)
- }
- }
+ addThresholdSpringAnimationTrigger(
+ springAnimationDriver,
+ progressThreshold = driverProgressThreshold,
+ neighborsToSettle,
+ )
// Add tasks before dragged index, fanning out from the dragged task.
// The order they are added matters, as each spring drives the next.
var previousNeighbor = neighborsToSettle
- getTasksOffsetPairAdjacentToDraggedTask(draggedTaskView, towardsStart = true).forEach {
- (taskView, offset) ->
- previousNeighbor =
- createNeighboringTaskViewSpringAnimation(
- taskView,
- offset * ADDITIONAL_DISMISS_DAMPING_RATIO,
- previousNeighbor,
- )
- }
+ getTasksOffsetPairAdjacentToDraggedTask(draggedTaskView, towardsStart = true)
+ .filter { (taskView, _) -> !tasksToExclude.contains(taskView) }
+ .forEach { (taskView, offset) ->
+ previousNeighbor =
+ createNeighboringTaskViewSpringAnimation(
+ taskView,
+ offset * ADDITIONAL_DISMISS_DAMPING_RATIO,
+ previousNeighbor,
+ isSpringDirectionVertical,
+ )
+ }
// Add tasks after dragged index, fanning out from the dragged task.
// The order they are added matters, as each spring drives the next.
previousNeighbor = neighborsToSettle
- getTasksOffsetPairAdjacentToDraggedTask(draggedTaskView, towardsStart = false).forEach {
- (taskView, offset) ->
- previousNeighbor =
- createNeighboringTaskViewSpringAnimation(
- taskView,
- offset * ADDITIONAL_DISMISS_DAMPING_RATIO,
- previousNeighbor,
- )
+ getTasksOffsetPairAdjacentToDraggedTask(draggedTaskView, towardsStart = false)
+ .filter { (taskView, _) -> !tasksToExclude.contains(taskView) }
+ .forEach { (taskView, offset) ->
+ previousNeighbor =
+ createNeighboringTaskViewSpringAnimation(
+ taskView,
+ offset * ADDITIONAL_DISMISS_DAMPING_RATIO,
+ previousNeighbor,
+ isSpringDirectionVertical,
+ )
+ }
+ }
+
+ /** As spring passes threshold for the first time, run conditional spring with velocity. */
+ private fun addThresholdSpringAnimationTrigger(
+ springAnimationDriver: SpringAnimation,
+ progressThreshold: Float,
+ conditionalSpring: SpringAnimation,
+ ) {
+ var lastPosition = 0f
+ var startSettling = false
+ springAnimationDriver.addUpdateListener { _, value, velocity ->
+ // We do not compare to the threshold directly, as the update listener
+ // does not necessarily hit every value. Do not check again once it has started
+ // settling, as a spring can bounce past the end value multiple times.
+ if (startSettling) return@addUpdateListener
+ if (
+ lastPosition < progressThreshold && value >= progressThreshold ||
+ lastPosition > progressThreshold && value <= progressThreshold
+ ) {
+ startSettling = true
+ }
+ lastPosition = value
+ if (startSettling) {
+ conditionalSpring.setStartVelocity(velocity).animateToFinalPosition(0f)
+ playDismissSettlingHaptic(velocity)
+ }
}
}
@@ -208,21 +231,25 @@
taskView: TaskView,
dampingOffsetRatio: Float,
previousNeighborSpringAnimation: SpringAnimation,
+ springingDirectionVertical: Boolean,
): SpringAnimation {
+ val springProperty =
+ if (springingDirectionVertical) taskView.secondaryDismissTranslationProperty
+ else taskView.primaryDismissTranslationProperty
val neighboringTaskViewSpringAnimation =
- SpringAnimation(
- taskView,
- FloatPropertyCompat.createFloatPropertyCompat(
- taskView.secondaryDismissTranslationProperty
- ),
- )
+ SpringAnimation(taskView, FloatPropertyCompat.createFloatPropertyCompat(springProperty))
.setSpring(createExpressiveDismissSpringForce(dampingOffsetRatio))
// Update live tile on spring animation.
if (taskView.isRunningTask && recentsView.enableDrawingLiveTile) {
neighboringTaskViewSpringAnimation.addUpdateListener { _, _, _ ->
recentsView.runActionOnRemoteHandles { remoteTargetHandle ->
- remoteTargetHandle.taskViewSimulator.taskSecondaryTranslation.value =
- taskView.secondaryDismissTranslationProperty.get(taskView)
+ val taskTranslation =
+ if (springingDirectionVertical) {
+ remoteTargetHandle.taskViewSimulator.taskSecondaryTranslation
+ } else {
+ remoteTargetHandle.taskViewSimulator.taskPrimaryTranslation
+ }
+ taskTranslation.value = springProperty.get(taskView)
}
recentsView.redrawLiveTile()
}
@@ -271,7 +298,7 @@
.playToken(
MSDLToken.CANCEL,
InteractionProperties.DynamicVibrationScale(
- boundToRange(velocity / maxDismissSettlingVelocity, 0f, 1f),
+ boundToRange(abs(velocity) / maxDismissSettlingVelocity, 0f, 1f),
VibrationAttributes.Builder()
.setUsage(VibrationAttributes.USAGE_TOUCH)
.setFlags(VibrationAttributes.FLAG_PIPELINED_EFFECT)
@@ -319,32 +346,39 @@
.setSpring(createExpressiveGridReflowSpringForce(finalPosition = dismissedTaskGap))
val towardsStart = if (recentsView.isRtl) dismissedTaskGap < 0 else dismissedTaskGap > 0
+ var tasksToReflow: List<TaskView>
// Build the chains of Spring Animations
when {
!recentsView.showAsGrid() -> {
- buildDismissReflowSpringAnimationChain(
+ tasksToReflow =
getTasksToReflow(
recentsView.mUtils.taskViews.toList(),
dismissedTaskView,
towardsStart,
- ),
+ )
+ buildDismissReflowSpringAnimationChain(
+ tasksToReflow,
dismissedTaskGap,
previousSpring = springAnimationDriver,
)
}
dismissedTaskView.isLargeTile -> {
+ tasksToReflow =
+ getTasksToReflow(
+ recentsView.mUtils.getLargeTaskViews(),
+ dismissedTaskView,
+ towardsStart,
+ )
val lastSpringAnimation =
buildDismissReflowSpringAnimationChain(
- getTasksToReflow(
- recentsView.mUtils.getLargeTaskViews(),
- dismissedTaskView,
- towardsStart,
- ),
+ tasksToReflow,
dismissedTaskGap,
previousSpring = springAnimationDriver,
)
// Add all top and bottom grid tasks when animating towards the end of the grid.
if (!towardsStart) {
+ tasksToReflow += recentsView.mUtils.getTopRowTaskViews()
+ tasksToReflow += recentsView.mUtils.getBottomRowTaskViews()
buildDismissReflowSpringAnimationChain(
recentsView.mUtils.getTopRowTaskViews(),
dismissedTaskGap,
@@ -358,29 +392,43 @@
}
}
recentsView.isOnGridBottomRow(dismissedTaskView) -> {
- buildDismissReflowSpringAnimationChain(
+ tasksToReflow =
getTasksToReflow(
recentsView.mUtils.getBottomRowTaskViews(),
dismissedTaskView,
towardsStart,
- ),
+ )
+ buildDismissReflowSpringAnimationChain(
+ tasksToReflow,
dismissedTaskGap,
previousSpring = springAnimationDriver,
)
}
else -> {
- buildDismissReflowSpringAnimationChain(
+ tasksToReflow =
getTasksToReflow(
recentsView.mUtils.getTopRowTaskViews(),
dismissedTaskView,
towardsStart,
- ),
+ )
+ buildDismissReflowSpringAnimationChain(
+ tasksToReflow,
dismissedTaskGap,
previousSpring = springAnimationDriver,
)
}
}
+ if (tasksToReflow.isNotEmpty()) {
+ addNeighborSettlingSpringAnimations(
+ dismissedTaskView,
+ springAnimationDriver,
+ tasksToExclude = tasksToReflow,
+ driverProgressThreshold = dismissedTaskGap,
+ isSpringDirectionVertical = false,
+ )
+ }
+
// Start animations and remove the dismissed task at the end, dismiss immediately if no
// neighboring tasks exist.
val runGridEndAnimationAndRelayout = {
@@ -429,8 +477,8 @@
else -> 1f
} * (if (recentsView.isRtl) 1f else -1f)
- return (dismissedTaskView.layoutParams.width + recentsView.pageSpacing) *
- dismissHorizontalFactor
+ return (recentsView.pagedOrientationHandler.getPrimarySize(dismissedTaskView) +
+ recentsView.pageSpacing) * dismissHorizontalFactor
}
private fun getTasksToReflow(
diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java
index 6067550..37c75cd 100644
--- a/quickstep/src/com/android/quickstep/views/RecentsView.java
+++ b/quickstep/src/com/android/quickstep/views/RecentsView.java
@@ -34,14 +34,13 @@
import static com.android.app.animation.Interpolators.LINEAR;
import static com.android.app.animation.Interpolators.clampToProgress;
import static com.android.launcher3.AbstractFloatingView.TYPE_REBIND_SAFE;
-import static com.android.launcher3.AbstractFloatingView.TYPE_TASK_MENU;
-import static com.android.launcher3.AbstractFloatingView.getTopOpenViewWithType;
import static com.android.launcher3.BaseActivity.STATE_HANDLER_INVISIBILITY_FLAGS;
import static com.android.launcher3.Flags.enableAdditionalHomeAnimations;
import static com.android.launcher3.Flags.enableDesktopExplodedView;
import static com.android.launcher3.Flags.enableDesktopTaskAlphaAnimation;
import static com.android.launcher3.Flags.enableGridOnlyOverview;
import static com.android.launcher3.Flags.enableLargeDesktopWindowingTile;
+import static com.android.launcher3.Flags.enableOverviewBackgroundWallpaperBlur;
import static com.android.launcher3.Flags.enableRefactorTaskThumbnail;
import static com.android.launcher3.Flags.enableSeparateExternalDisplayTasks;
import static com.android.launcher3.LauncherAnimUtils.SUCCESS_TRANSITION_PROGRESS;
@@ -142,7 +141,6 @@
import androidx.core.graphics.ColorUtils;
import androidx.dynamicanimation.animation.SpringAnimation;
-import com.android.app.tracing.TraceUtilsKt;
import com.android.internal.jank.Cuj;
import com.android.launcher3.AbstractFloatingView;
import com.android.launcher3.BaseActivity.MultiWindowModeChangedListener;
@@ -277,7 +275,7 @@
HighResLoadingState.HighResLoadingStateChangedCallback,
TaskVisualsChangeListener, DesktopVisibilityListener {
- private static final String TAG = "RecentsView";
+ protected static final String TAG = "RecentsView";
private static final boolean DEBUG = false;
public static final FloatProperty<RecentsView<?, ?>> CONTENT_ALPHA =
@@ -536,7 +534,6 @@
protected final Rect mLastComputedTaskSize = new Rect();
protected final Rect mLastComputedGridSize = new Rect();
protected final Rect mLastComputedGridTaskSize = new Rect();
- private TaskView mSelectedTask = null;
// How much a task that is directly offscreen will be pushed out due to RecentsView scale/pivot.
@Nullable
protected Float mLastComputedTaskStartPushOutDistance = null;
@@ -589,6 +586,8 @@
private final TaskOverlayFactory mTaskOverlayFactory;
protected boolean mDisallowScrollToClearAll;
+ // True if it is not allowed to scroll to [AddDesktopButton].
+ protected boolean mDisallowScrollToAddDesk;
private boolean mOverlayEnabled;
protected boolean mFreezeViewVisibility;
private boolean mOverviewGridEnabled;
@@ -832,7 +831,7 @@
mOrientationState.setMultiWindowMode(inMultiWindowMode);
setLayoutRotation(mOrientationState.getTouchRotation(),
mOrientationState.getDisplayRotation());
- updateChildTaskOrientations();
+ mUtils.updateChildTaskOrientations();
if (!inMultiWindowMode && mOverviewStateEnabled) {
// TODO: Re-enable layout transitions for addition of the unpinned task
reloadIfNeeded();
@@ -868,6 +867,9 @@
private final Matrix mTmpMatrix = new Matrix();
private int mTaskViewCount = 0;
+
+ protected final BlurUtils mBlurUtils = new BlurUtils(this);
+
@Nullable
public TaskView getFirstTaskView() {
return mUtils.getFirstTaskView();
@@ -2087,7 +2089,7 @@
traceBegin(Trace.TRACE_TAG_APP, "RecentsView.applyLoadPlan.layouts");
updateTaskSize();
- updateChildTaskOrientations();
+ mUtils.updateChildTaskOrientations();
traceEnd(Trace.TRACE_TAG_APP);
TaskView newRunningTaskView = mUtils.getDesktopTaskViewForDeskId(runningTaskViewDeskId);
@@ -2339,7 +2341,7 @@
updateSizeAndPadding();
// Update TaskView's DeviceProfile dependent layout.
- updateChildTaskOrientations();
+ mUtils.updateChildTaskOrientations();
requestLayout();
// Reapply the current page to update page scrolls.
@@ -2415,21 +2417,28 @@
}
/**
- * Sets the last TaskView selected.
+ * Returns the currently selected TaskView in Select mode.
+ */
+ @Nullable
+ public TaskView getSelectedTaskView() {
+ return mUtils.getSelectedTaskView();
+ }
+
+ /**
+ * Sets the selected TaskView in Select mode.
*/
public void setSelectedTask(int lastSelectedTaskId) {
- mSelectedTask = getTaskViewByTaskId(lastSelectedTaskId);
+ mUtils.setSelectedTaskView(getTaskViewByTaskId(lastSelectedTaskId));
}
/**
* Returns the bounds of the task selected to enter modal state.
*/
public Rect getSelectedTaskBounds() {
- if (mSelectedTask == null) {
- return enableGridOnlyOverview() && mContainer.getDeviceProfile().isTablet
- ? mLastComputedGridTaskSize : mLastComputedTaskSize;
+ if (getSelectedTaskView() == null) {
+ return mLastComputedTaskSize;
}
- return getTaskBounds(mSelectedTask);
+ return getTaskBounds(getSelectedTaskView());
}
/**
@@ -2445,7 +2454,7 @@
return deviceProfile.overviewTaskThumbnailTopMarginPx / 2.0f;
}
- private Rect getTaskBounds(TaskView taskView) {
+ protected Rect getTaskBounds(TaskView taskView) {
int selectedPage = indexOfChild(taskView);
int primaryScroll = getPagedOrientationHandler().getPrimaryScroll(this);
int selectedPageScroll = getScrollForPage(selectedPage);
@@ -2747,9 +2756,7 @@
}
setEnableDrawingLiveTile(false);
}
- runActionOnRemoteHandles(remoteTargetHandle ->
- remoteTargetHandle.getTaskViewSimulator().setDrawsBelowRecents(false));
-
+ mBlurUtils.setDrawLiveTileBelowRecents(false);
// These are relatively expensive and don't need to be done this frame (RecentsView isn't
// visible anyway), so defer by a frame to get off the critical path, e.g. app to home.
post(this::onReset);
@@ -2949,22 +2956,6 @@
return as;
}
- private void updateChildTaskOrientations() {
- for (TaskView taskView : getTaskViews()) {
- taskView.setOrientationState(mOrientationState);
- }
- boolean shouldRotateMenuForFakeRotation =
- !mOrientationState.isRecentsActivityRotationAllowed();
- if (!shouldRotateMenuForFakeRotation) {
- return;
- }
- AbstractFloatingView floatingView = getTopOpenViewWithType(mContainer, TYPE_TASK_MENU);
- if (floatingView instanceof TaskMenuView taskMenuView) {
- // Rotation is supported on phone (details at b/254198019#comment4)
- taskMenuView.onRotationChanged();
- }
- }
-
/**
* Called when a gesture from an app has finished, and an end target has been determined.
*/
@@ -3121,7 +3112,8 @@
// TODO: b/401582344 - Implement a way to exclude the `DesktopWallpaperActivity`.
desktopTaskView.bind(
- new DesktopTask(activeDeskId, Arrays.asList(runningTasks)),
+ new DesktopTask(activeDeskId, mContainer.getDisplayId(),
+ Arrays.asList(runningTasks)),
mOrientationState, mTaskOverlayFactory);
return desktopTaskView;
}
@@ -3201,7 +3193,7 @@
setRunningTaskHidden(runningTaskTileHidden);
// Update task size after setting current task.
updateTaskSize();
- updateChildTaskOrientations();
+ mUtils.updateChildTaskOrientations();
// Reload the task list
reloadIfNeeded();
@@ -4354,7 +4346,7 @@
finalNextFocusedTaskView.getDismissIconFadeInAnimator().start();
}
updateTaskSize();
- updateChildTaskOrientations();
+ mUtils.updateChildTaskOrientations();
// Update scroll and snap to page.
updateScrollSynchronously();
@@ -5025,15 +5017,8 @@
}
private void updatePivots() {
- if (mOverviewSelectEnabled) {
- if (enableGridOnlyOverview()) {
- getModalTaskSize(mTempRect);
- Rect selectedTaskPosition = getSelectedTaskBounds();
- Utilities.getPivotsForScalingRectToRect(mTempRect, selectedTaskPosition,
- mTempPointF);
- } else {
- mTempPointF.set(mLastComputedTaskSize.centerX(), mLastComputedTaskSize.bottom);
- }
+ if (mOverviewSelectEnabled && !enableGridOnlyOverview()) {
+ mTempPointF.set(mLastComputedTaskSize.centerX(), mLastComputedTaskSize.bottom);
} else {
mTempRect.set(mLastComputedTaskSize);
getPagedViewOrientedState().getFullScreenScaleAndPivot(mTempRect,
@@ -5079,7 +5064,7 @@
&& (enableGridOnlyOverview() || enableLargeDesktopWindowingTile())
&& mTaskModalness > 0;
if (shouldCalculateOffsetForAllTasks) {
- modalMidpoint = indexOfChild(mSelectedTask);
+ modalMidpoint = indexOfChild(getSelectedTaskView());
}
float midpointOffsetSize = 0;
@@ -5287,7 +5272,7 @@
*/
private float getVerticalOffsetSize(TaskView taskView, float offsetProgress) {
if (offsetProgress == 0 || !(showAsGrid() && enableGridOnlyOverview())
- || mSelectedTask == null) {
+ || getSelectedTaskView() == null) {
// Don't bother calculating everything below if we won't offset vertically.
return 0;
}
@@ -5295,7 +5280,7 @@
// First, get the position of the task relative to the top row.
Rect taskPosition = getTaskBounds(taskView);
- boolean isSelectedTaskTopRow = mTopRowIdSet.contains(mSelectedTask.getTaskViewId());
+ boolean isSelectedTaskTopRow = mTopRowIdSet.contains(getSelectedTaskView().getTaskViewId());
boolean isChildTopRow = mTopRowIdSet.contains(taskView.getTaskViewId());
// Whether the task should be shifted to the top.
boolean isTopShift = !isSelectedTaskTopRow && isChildTopRow;
@@ -5349,8 +5334,8 @@
* Resets the visuals when exit modal state.
*/
public void resetModalVisuals() {
- if (mSelectedTask != null) {
- mSelectedTask.taskContainers.forEach(
+ if (getSelectedTaskView() != null) {
+ getSelectedTaskView().taskContainers.forEach(
taskContainer -> taskContainer.getOverlay().resetModalVisuals());
}
}
@@ -5819,12 +5804,10 @@
// above RecentsView to avoid wallpaper blur from being applied to it.
if (!taskView.isRunningTask()) {
runActionOnRemoteHandles(
- remoteTargetHandle -> {
- remoteTargetHandle.getTaskViewSimulator().setPivotOverride(
- mTempPointF);
- remoteTargetHandle.getTaskViewSimulator().setDrawsBelowRecents(
- false);
- });
+ remoteTargetHandle ->
+ remoteTargetHandle.getTaskViewSimulator()
+ .setPivotOverride(mTempPointF));
+ mBlurUtils.setDrawLiveTileBelowRecents(false);
}
}
@@ -5959,8 +5942,7 @@
mPendingAnimation.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
- runActionOnRemoteHandles(remoteTargetHandle ->
- remoteTargetHandle.getTaskViewSimulator().setDrawsBelowRecents(false));
+ mBlurUtils.setDrawLiveTileBelowRecents(false);
}
});
mPendingAnimation.addEndListener(isSuccess -> {
@@ -5998,8 +5980,7 @@
// If launch animation didn't complete i.e. user dragged live tile down and then
// back up and returned to Overview, then we need to ensure we reset the
// view to draw below recents so that it can't be interacted with.
- runActionOnRemoteHandles(remoteTargetHandle ->
- remoteTargetHandle.getTaskViewSimulator().setDrawsBelowRecents(true));
+ mBlurUtils.setDrawLiveTileBelowRecents(true);
redrawLiveTile();
}
return Unit.INSTANCE;
@@ -6078,6 +6059,7 @@
});
}
+ @Nullable
public RemoteTargetHandle[] getRemoteTargetHandles() {
return mRemoteTargetHandles;
}
@@ -6231,6 +6213,9 @@
mRecentsAnimationController = null;
mSplitSelectStateController.setRecentsAnimationRunning(false);
executeSideTaskLaunchCallback();
+ if (enableOverviewBackgroundWallpaperBlur()) {
+ mBlurUtils.setDrawLiveTileBelowRecents(false);
+ }
}
public void setDisallowScrollToClearAll(boolean disallowScrollToClearAll) {
@@ -6239,6 +6224,17 @@
updateMinAndMaxScrollX();
}
}
+ /**
+ * Update the value of [mDisallowScrollToAddDesk]
+ */
+ public void setDisallowScrollToAddDesk(boolean disallowScrollToAddDesk) {
+ if (mDisallowScrollToAddDesk != disallowScrollToAddDesk) {
+ mDisallowScrollToAddDesk = disallowScrollToAddDesk;
+ updateMinAndMaxScrollX();
+ }
+ }
+
+
/**
* Updates page scroll synchronously after measure and layout child views.
@@ -6384,7 +6380,20 @@
if (addDesktopButtonIndex >= 0 && addDesktopButtonIndex < outPageScrolls.length) {
int firstViewIndex = getFirstViewIndex();
if (firstViewIndex >= 0 && firstViewIndex < outPageScrolls.length) {
- outPageScrolls[addDesktopButtonIndex] = outPageScrolls[firstViewIndex];
+ // If we can scroll to [AddDesktopButton], make its page scroll equal to
+ // the first [TaskView]. Otherwise, make its page scroll out of range of
+ // [minScroll, maxScroll].
+ if (!mDisallowScrollToAddDesk) {
+ outPageScrolls[addDesktopButtonIndex] = outPageScrolls[firstViewIndex];
+ } else {
+ outPageScrolls[addDesktopButtonIndex] =
+ outPageScrolls[firstViewIndex] + (mIsRtl ? 1 : -1);
+ }
+ }
+
+ if (DEBUG) {
+ Log.d(TAG, "getPageScrolls - addDesktopButtonScroll: "
+ + outPageScrolls[addDesktopButtonIndex]);
}
}
if (DEBUG) {
@@ -6707,8 +6716,14 @@
private void setTaskModalness(float modalness) {
mTaskModalness = modalness;
updatePageOffsets();
- if (mSelectedTask != null) {
- mSelectedTask.setModalness(modalness);
+ if (getSelectedTaskView() != null) {
+ if (enableGridOnlyOverview()) {
+ for (TaskView taskView : getTaskViews()) {
+ taskView.setModalness(modalness);
+ }
+ } else {
+ getSelectedTaskView().setModalness(modalness);
+ }
} else if (getCurrentPageTaskView() != null) {
getCurrentPageTaskView().setModalness(modalness);
}
@@ -7026,7 +7041,7 @@
// `AddNewDesktopButton`.
DesktopTaskView desktopTaskView =
(DesktopTaskView) getTaskViewFromPool(TaskViewType.DESKTOP);
- desktopTaskView.bind(new DesktopTask(deskId, new ArrayList<>()),
+ desktopTaskView.bind(new DesktopTask(deskId, displayId, new ArrayList<>()),
mOrientationState, mTaskOverlayFactory);
Objects.requireNonNull(mAddDesktopButton);
@@ -7034,7 +7049,7 @@
addView(desktopTaskView, insertionIndex);
updateTaskSize();
- updateChildTaskOrientations();
+ mUtils.updateChildTaskOrientations();
// 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.
@@ -7186,4 +7201,15 @@
public interface TaskLaunchListener {
void onTaskLaunched();
}
+
+ /**
+ * Sets whether the remote animation targets should draw below the recents view.
+ *
+ * @param drawBelowRecents whether the surface should draw below Recents.
+ * @param remoteTargetHandles collection of remoteTargetHandles in Recents.
+ */
+ public void setDrawBelowRecents(boolean drawBelowRecents,
+ RemoteTargetHandle[] remoteTargetHandles) {
+ mBlurUtils.setDrawBelowRecents(drawBelowRecents, remoteTargetHandles);
+ }
}
diff --git a/quickstep/src/com/android/quickstep/views/RecentsViewUtils.kt b/quickstep/src/com/android/quickstep/views/RecentsViewUtils.kt
index 24b7fa7..51a5d0f 100644
--- a/quickstep/src/com/android/quickstep/views/RecentsViewUtils.kt
+++ b/quickstep/src/com/android/quickstep/views/RecentsViewUtils.kt
@@ -16,15 +16,21 @@
package com.android.quickstep.views
+import android.graphics.PointF
import android.graphics.Rect
import android.util.FloatProperty
import android.view.KeyEvent
import android.view.View
+import android.view.View.LAYOUT_DIRECTION_LTR
+import android.view.View.LAYOUT_DIRECTION_RTL
import androidx.core.view.children
-import com.android.launcher3.AbstractFloatingView
-import com.android.launcher3.Flags
+import com.android.launcher3.AbstractFloatingView.TYPE_TASK_MENU
+import com.android.launcher3.AbstractFloatingView.getTopOpenViewWithType
+import com.android.launcher3.Flags.enableGridOnlyOverview
import com.android.launcher3.Flags.enableLargeDesktopWindowingTile
+import com.android.launcher3.Flags.enableOverviewIconMenu
import com.android.launcher3.Flags.enableSeparateExternalDisplayTasks
+import com.android.launcher3.Utilities.getPivotsForScalingRectToRect
import com.android.launcher3.statehandlers.DesktopVisibilityController
import com.android.launcher3.statehandlers.DesktopVisibilityController.Companion.INACTIVE_DESK_ID
import com.android.launcher3.util.IntArray
@@ -35,6 +41,7 @@
import com.android.quickstep.views.RecentsView.RUNNING_TASK_ATTACH_ALPHA
import com.android.systemui.shared.recents.model.ThumbnailData
import java.util.function.BiConsumer
+import kotlin.math.min
import kotlin.reflect.KMutableProperty1
/**
@@ -357,24 +364,80 @@
}
}
+ private fun getTaskMenu(): TaskMenuView? =
+ getTopOpenViewWithType(recentsView.mContainer, TYPE_TASK_MENU) as? TaskMenuView
+
fun shouldInterceptKeyEvent(event: KeyEvent): Boolean {
- if (Flags.enableOverviewIconMenu()) {
- val floatingView: AbstractFloatingView? = AbstractFloatingView.getTopOpenViewWithType(
- recentsView.mContainer as RecentsViewContainer,
- AbstractFloatingView.TYPE_TASK_MENU
- )
- val isMenuOpen = floatingView?.isOpen
- return isMenuOpen == true || event.keyCode == KeyEvent.KEYCODE_TAB
+ if (enableOverviewIconMenu()) {
+ return getTaskMenu()?.isOpen == true || event.keyCode == KeyEvent.KEYCODE_TAB
}
return false
}
+ fun updateChildTaskOrientations() {
+ with(recentsView) {
+ taskViews.forEach { it.setOrientationState(mOrientationState) }
+ if (enableOverviewIconMenu()) {
+ children.forEach {
+ it.layoutDirection = if (isRtl) LAYOUT_DIRECTION_LTR else LAYOUT_DIRECTION_RTL
+ }
+ }
+
+ // Return when it's not fake landscape
+ if (mOrientationState.isRecentsActivityRotationAllowed) return@with
+
+ // Rotation is supported on phone (details at b/254198019#comment4)
+ getTaskMenu()?.onRotationChanged()
+ }
+ }
+
var deskExplodeProgress: Float = 0f
set(value) {
field = value
taskViews.filterIsInstance<DesktopTaskView>().forEach { it.explodeProgress = field }
}
+ var selectedTaskView: TaskView? = null
+ set(newValue) {
+ val oldValue = field
+ field = newValue
+ if (oldValue != newValue) {
+ onSelectedTaskViewUpdated(oldValue, newValue)
+ }
+ }
+
+ private fun onSelectedTaskViewUpdated(
+ oldSelectedTaskView: TaskView?,
+ newSelectedTaskView: TaskView?,
+ ) {
+ if (!enableGridOnlyOverview()) return
+ with(recentsView) {
+ oldSelectedTaskView?.modalScale = 1f
+ oldSelectedTaskView?.modalPivot = null
+
+ if (newSelectedTaskView == null) return
+
+ val modalTaskBounds = mTempRect
+ getModalTaskSize(modalTaskBounds)
+ val selectedTaskBounds = getTaskBounds(newSelectedTaskView)
+
+ // Map bounds to selectedTaskView's coordinate system.
+ modalTaskBounds.offset(-selectedTaskBounds.left, -selectedTaskBounds.top)
+ selectedTaskBounds.offset(-selectedTaskBounds.left, -selectedTaskBounds.top)
+
+ val modalScale =
+ min(
+ (modalTaskBounds.height().toFloat() / selectedTaskBounds.height()),
+ (modalTaskBounds.width().toFloat() / selectedTaskBounds.width()),
+ )
+ val modalPivot = PointF()
+ getPivotsForScalingRectToRect(modalTaskBounds, selectedTaskBounds, modalPivot)
+
+ newSelectedTaskView.modalScale = modalScale
+ newSelectedTaskView.modalPivot = modalPivot
+ }
+ }
+
companion object {
class RecentsViewFloatProperty(
private val utilsProperty: KMutableProperty1<RecentsViewUtils, Float>
diff --git a/quickstep/src/com/android/quickstep/views/TaskView.kt b/quickstep/src/com/android/quickstep/views/TaskView.kt
index 8d95b13..3835e48 100644
--- a/quickstep/src/com/android/quickstep/views/TaskView.kt
+++ b/quickstep/src/com/android/quickstep/views/TaskView.kt
@@ -33,6 +33,7 @@
import android.view.Display
import android.view.MotionEvent
import android.view.View
+import android.view.View.OnClickListener
import android.view.ViewGroup
import android.view.ViewStub
import android.view.accessibility.AccessibilityNodeInfo
@@ -77,6 +78,7 @@
import com.android.quickstep.FullscreenDrawParams
import com.android.quickstep.RecentsModel
import com.android.quickstep.RemoteAnimationTargets
+import com.android.quickstep.RemoteTargetGluer.RemoteTargetHandle
import com.android.quickstep.TaskOverlayFactory
import com.android.quickstep.TaskViewUtils
import com.android.quickstep.orientation.RecentsPagedOrientationHandler
@@ -146,7 +148,10 @@
val isRunningTask: Boolean
get() = this === recentsView?.runningTaskView
- val displayId: Int
+ private val isSelectedTask: Boolean
+ get() = this === recentsView?.selectedTaskView
+
+ open val displayId: Int
get() = taskContainers.firstOrNull()?.task.displayId
val isExternalDisplay: Boolean
@@ -336,6 +341,12 @@
onModalnessUpdated(field)
}
+ var modalPivot: PointF? = null
+ set(value) {
+ field = value
+ updatePivots()
+ }
+
var splitSplashAlpha = 0f
set(value) {
field = value
@@ -360,6 +371,12 @@
applyScale()
}
+ var modalScale = 1f
+ set(value) {
+ field = value
+ applyScale()
+ }
+
private var dismissTranslationX = 0f
set(value) {
field = value
@@ -445,9 +462,10 @@
}
private val taskViewAlpha = MultiValueAlpha(this, Alpha.entries.size)
- protected var stableAlpha by MultiPropertyDelegate(taskViewAlpha, Alpha.STABLE)
- var attachAlpha by MultiPropertyDelegate(taskViewAlpha, Alpha.ATTACH)
- var splitAlpha by MultiPropertyDelegate(taskViewAlpha, Alpha.SPLIT)
+ protected var stableAlpha by MultiPropertyDelegate(taskViewAlpha, Alpha.Stable)
+ var attachAlpha by MultiPropertyDelegate(taskViewAlpha, Alpha.Attach)
+ var splitAlpha by MultiPropertyDelegate(taskViewAlpha, Alpha.Split)
+ private var modalAlpha by MultiPropertyDelegate(taskViewAlpha, Alpha.Modal)
protected var shouldShowScreenshot = false
get() = !isRunningTask || field
@@ -615,16 +633,19 @@
super.draw(canvas)
}
+ override fun setLayoutDirection(layoutDirection: Int) {
+ super.setLayoutDirection(layoutDirection)
+ if (enableOverviewIconMenu()) {
+ val deviceLayoutDirection = resources.configuration.layoutDirection
+ taskContainers.forEach {
+ (it.iconView as IconAppChipView).layoutDirection = deviceLayoutDirection
+ }
+ }
+ }
+
override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
super.onLayout(changed, left, top, right, bottom)
- val thumbnailTopMargin = container.deviceProfile.overviewTaskThumbnailTopMarginPx
- if (container.deviceProfile.isTablet) {
- pivotX = (if (layoutDirection == LAYOUT_DIRECTION_RTL) 0 else right - left).toFloat()
- pivotY = thumbnailTopMargin.toFloat()
- } else {
- pivotX = (right - left) * 0.5f
- pivotY = thumbnailTopMargin + (height - thumbnailTopMargin) * 0.5f
- }
+ updatePivots()
systemGestureExclusionRects =
SYSTEM_GESTURE_EXCLUSION_RECT.onEach {
it.right = width
@@ -635,6 +656,24 @@
}
}
+ private fun updatePivots() {
+ val modalPivot = modalPivot
+ if (modalPivot != null) {
+ pivotX = modalPivot.x
+ pivotY = modalPivot.y
+ } else {
+ val thumbnailTopMargin = container.deviceProfile.overviewTaskThumbnailTopMarginPx
+ if (container.deviceProfile.isTablet) {
+ pivotX =
+ (if (layoutDirection == LAYOUT_DIRECTION_RTL) 0 else right - left).toFloat()
+ pivotY = thumbnailTopMargin.toFloat()
+ } else {
+ pivotX = (right - left) * 0.5f
+ pivotY = thumbnailTopMargin + (height - thumbnailTopMargin) * 0.5f
+ }
+ }
+ }
+
override fun onRecycle() {
resetPersistentViewTransforms()
@@ -642,6 +681,9 @@
attachAlpha = 1f
splitAlpha = 1f
splitSplashAlpha = 0f
+ modalAlpha = 1f
+ modalScale = 1f
+ modalPivot = null
taskThumbnailSplashAlpha = 0f
// Clear any references to the thumbnail (it will be re-read either from the cache or the
// system on next bind)
@@ -1210,15 +1252,14 @@
/** Launch of the current task (both live and inactive tasks) with an animation. */
fun launchWithAnimation(): RunnableList? {
return if (isRunningTask && recentsView?.remoteTargetHandles != null) {
- launchAsLiveTile()
+ launchAsLiveTile(recentsView?.remoteTargetHandles!!)
} else {
launchAsStaticTile()
}
}
- private fun launchAsLiveTile(): RunnableList? {
+ private fun launchAsLiveTile(remoteTargetHandles: Array<RemoteTargetHandle>): RunnableList? {
val recentsView = recentsView ?: return null
- val remoteTargetHandles = recentsView.remoteTargetHandles
if (!isClickableAsLiveTile) {
Log.e(
TAG,
@@ -1228,21 +1269,27 @@
}
isClickableAsLiveTile = false
val targets =
- if (remoteTargetHandles.size == 1) {
- remoteTargetHandles[0].transformParams.targetSet
+ if (remoteTargetHandles.isNotEmpty()) {
+ if (remoteTargetHandles.size == 1) {
+ remoteTargetHandles[0].transformParams.targetSet
+ } else {
+ val apps =
+ remoteTargetHandles.flatMap {
+ it.transformParams.targetSet.apps.asIterable()
+ }
+ val wallpapers =
+ remoteTargetHandles.flatMap {
+ it.transformParams.targetSet.wallpapers.asIterable()
+ }
+ RemoteAnimationTargets(
+ apps.toTypedArray(),
+ wallpapers.toTypedArray(),
+ remoteTargetHandles[0].transformParams.targetSet.nonApps,
+ remoteTargetHandles[0].transformParams.targetSet.targetMode,
+ )
+ }
} else {
- val apps =
- remoteTargetHandles.flatMap { it.transformParams.targetSet.apps.asIterable() }
- val wallpapers =
- remoteTargetHandles.flatMap {
- it.transformParams.targetSet.wallpapers.asIterable()
- }
- RemoteAnimationTargets(
- apps.toTypedArray(),
- wallpapers.toTypedArray(),
- remoteTargetHandles[0].transformParams.targetSet.nonApps,
- remoteTargetHandles[0].transformParams.targetSet.targetMode,
- )
+ null
}
if (targets == null) {
// If the recents animation is cancelled somehow between the parent if block and
@@ -1270,7 +1317,7 @@
targets.apps,
targets.wallpapers,
targets.nonApps,
- true /* launcherClosing */,
+ true, /* launcherClosing */
recentsView.stateManager,
recentsView,
recentsView.depthController,
@@ -1484,10 +1531,11 @@
}
private fun closeTaskMenu(): Boolean {
- val floatingView: AbstractFloatingView? = AbstractFloatingView.getTopOpenViewWithType(
- container,
- AbstractFloatingView.TYPE_TASK_MENU
- )
+ val floatingView: AbstractFloatingView? =
+ AbstractFloatingView.getTopOpenViewWithType(
+ container,
+ AbstractFloatingView.TYPE_TASK_MENU,
+ )
if (floatingView?.isOpen == true) {
floatingView.close(true)
return true
@@ -1705,7 +1753,7 @@
fun getSizeAdjustment(fullscreenEnabled: Boolean) = if (fullscreenEnabled) nonGridScale else 1f
private fun applyScale() {
- val scale = persistentScale * dismissScale
+ val scale = persistentScale * dismissScale * Utilities.mapRange(modalness, 1f, modalScale)
scaleX = scale
scaleY = scale
updateFullscreenParams()
@@ -1767,9 +1815,13 @@
private fun onModalnessUpdated(modalness: Float) {
isClickable = modalness == 0f
taskContainers.forEach {
- it.iconView.setModalAlpha(1 - modalness)
+ it.iconView.setModalAlpha(1f - modalness)
it.digitalWellBeingToast?.bannerOffsetPercentage = modalness
}
+ if (enableGridOnlyOverview()) {
+ modalAlpha = if (isSelectedTask) 1f else (1f - modalness)
+ applyScale()
+ }
}
fun resetPersistentViewTransforms() {
@@ -1825,9 +1877,10 @@
private const val TAG = "TaskView"
private enum class Alpha {
- STABLE,
- ATTACH,
- SPLIT,
+ Stable,
+ Attach,
+ Split,
+ Modal,
}
private enum class SettledProgress {
diff --git a/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureProtoLogProxy.java b/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureProtoLogProxy.java
index 18a5338..773a039 100644
--- a/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureProtoLogProxy.java
+++ b/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureProtoLogProxy.java
@@ -551,4 +551,13 @@
displayRotation, displaySize.flattenToString(), swipeRegion.toShortString(),
ohmRegion.toShortString(), gesturalHeight, largerGesturalHeight, reason);
}
+
+ public static void logOnTaskAnimationManagerNotAvailable(int displayId) {
+ ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString(
+ "TaskAnimationManager not available for displayId=%d",
+ displayId));
+ if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return;
+ ProtoLog.d(ACTIVE_GESTURE_LOG, "TaskAnimationManager not available for displayId=%d",
+ displayId);
+ }
}
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarBaseTestCase.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarBaseTestCase.kt
index 26f1197..52d288a 100644
--- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarBaseTestCase.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarBaseTestCase.kt
@@ -17,6 +17,7 @@
import com.android.launcher3.taskbar.allapps.TaskbarAllAppsController
import com.android.launcher3.taskbar.bubbles.BubbleControllers
+import com.android.launcher3.taskbar.growth.NudgeController
import com.android.launcher3.taskbar.overlay.TaskbarOverlayController
import com.android.systemui.shared.rotation.RotationButtonController
import java.util.Optional
@@ -58,6 +59,7 @@
@Mock lateinit var taskbarPinningController: TaskbarPinningController
@Mock lateinit var optionalBubbleControllers: Optional<BubbleControllers>
@Mock lateinit var taskbarDesktopModeController: TaskbarDesktopModeController
+ @Mock lateinit var nudgeController: NudgeController
lateinit var taskbarControllers: TaskbarControllers
@@ -100,6 +102,7 @@
taskbarPinningController,
optionalBubbleControllers,
taskbarDesktopModeController,
+ nudgeController,
)
}
}
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarOverflowTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarOverflowTest.kt
index 3761044..c589415 100644
--- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarOverflowTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarOverflowTest.kt
@@ -23,6 +23,7 @@
import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import android.platform.test.flag.junit.SetFlagsRule
+import android.view.Display.DEFAULT_DISPLAY
import androidx.test.core.app.ApplicationProvider
import com.android.launcher3.Flags.FLAG_ENABLE_MULTI_INSTANCE_MENU_TASKBAR
import com.android.launcher3.Flags.FLAG_TASKBAR_OVERFLOW
@@ -446,7 +447,7 @@
)
})
- recentsModel.updateRecentTasks(listOf(DesktopTask(deskId = 0, tasks)))
+ recentsModel.updateRecentTasks(listOf(DesktopTask(deskId = 0, DEFAULT_DISPLAY, tasks)))
for (task in 1..tasks.size) {
desktopTaskListener?.onTasksVisibilityChanged(
context.virtualDisplay.display.displayId,
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarRecentAppsControllerTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarRecentAppsControllerTest.kt
index 8376bc1..334d8ab 100644
--- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarRecentAppsControllerTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarRecentAppsControllerTest.kt
@@ -25,6 +25,7 @@
import android.os.Process
import android.os.UserHandle
import android.platform.test.annotations.EnableFlags
+import android.view.Display.DEFAULT_DISPLAY
import androidx.test.annotation.UiThreadTest
import com.android.internal.R
import com.android.launcher3.BubbleTextView.RunningAppState
@@ -877,7 +878,7 @@
val allTasks =
ArrayList<GroupTask>().apply {
if (!runningTasks.isEmpty()) {
- add(DesktopTask(deskId = 0, ArrayList(runningTasks)))
+ add(DesktopTask(deskId = 0, DEFAULT_DISPLAY, ArrayList(runningTasks)))
}
addAll(recentTasks)
}
@@ -959,7 +960,7 @@
private fun setInDesktopMode(inDesktopMode: Boolean) {
whenever(taskbarControllers.taskbarDesktopModeController.shouldShowDesktopTasksInTaskbar())
.thenReturn(inDesktopMode)
- whenever(taskbarControllers.taskbarDesktopModeController.isInDesktopMode)
+ whenever(taskbarControllers.taskbarDesktopModeController.isInDesktopMode(DEFAULT_DISPLAY))
.thenReturn(inDesktopMode)
}
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/AbsSwipeUpHandlerTestCase.java b/quickstep/tests/multivalentTests/src/com/android/quickstep/AbsSwipeUpHandlerTestCase.java
index 6fbbd59..7824000 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/AbsSwipeUpHandlerTestCase.java
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/AbsSwipeUpHandlerTestCase.java
@@ -49,6 +49,7 @@
import android.platform.test.annotations.DisableFlags;
import android.platform.test.annotations.EnableFlags;
import android.platform.test.flag.junit.SetFlagsRule;
+import android.view.Display;
import android.view.RemoteAnimationTarget;
import android.view.SurfaceControl;
import android.view.ViewTreeObserver;
@@ -189,7 +190,7 @@
@Before
public void setUpRecentsContainer() {
mTaskAnimationManager = new TaskAnimationManager(mContext,
- RecentsAnimationDeviceState.INSTANCE.get(mContext));
+ RecentsAnimationDeviceState.INSTANCE.get(mContext), Display.DEFAULT_DISPLAY);
RecentsViewContainer recentsContainer = getRecentsContainer();
RECENTS_VIEW recentsView = getRecentsView();
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/OverviewCommandHelperTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/OverviewCommandHelperTest.kt
index 56c01f9..11e0ee8 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/OverviewCommandHelperTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/OverviewCommandHelperTest.kt
@@ -17,6 +17,7 @@
package com.android.quickstep
import android.platform.test.flag.junit.SetFlagsRule
+import android.view.Display.DEFAULT_DISPLAY
import androidx.test.filters.SmallTest
import com.android.launcher3.Flags
import com.android.launcher3.util.LauncherMultivalentJUnit
@@ -25,6 +26,7 @@
import com.android.quickstep.OverviewCommandHelper.CommandInfo
import com.android.quickstep.OverviewCommandHelper.CommandInfo.CommandStatus
import com.android.quickstep.OverviewCommandHelper.CommandType
+import com.android.quickstep.fallback.window.RecentsDisplayModel
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.delay
@@ -41,9 +43,9 @@
import org.junit.runner.RunWith
import org.mockito.Mockito.doAnswer
import org.mockito.Mockito.spy
-import org.mockito.Mockito.`when`
import org.mockito.kotlin.any
import org.mockito.kotlin.mock
+import org.mockito.kotlin.whenever
@SmallTest
@RunWith(LauncherMultivalentJUnit::class)
@@ -57,19 +59,38 @@
private var pendingCallbacksWithDelays = mutableListOf<Long>()
+ private val recentsDisplayModel: RecentsDisplayModel = mock()
+ private val defaultDisplayResource: RecentsDisplayModel.RecentsDisplayResource = mock()
+ private val secondaryDisplayResource: RecentsDisplayModel.RecentsDisplayResource = mock()
+ private val executeCommandDisplayIds = mutableListOf<Int>()
+
+ private fun setupDefaultDisplay() {
+ whenever(defaultDisplayResource.displayId).thenReturn(DEFAULT_DISPLAY)
+ whenever(recentsDisplayModel.activeDisplayResources)
+ .thenReturn(listOf(defaultDisplayResource))
+ }
+
+ private fun setupMultipleDisplays() {
+ whenever(defaultDisplayResource.displayId).thenReturn(DEFAULT_DISPLAY)
+ whenever(secondaryDisplayResource.displayId).thenReturn(1)
+ whenever(recentsDisplayModel.activeDisplayResources)
+ .thenReturn(listOf(defaultDisplayResource, secondaryDisplayResource))
+ }
+
@Suppress("UNCHECKED_CAST")
@Before
fun setup() {
setFlagsRule.setFlags(true, Flags.FLAG_ENABLE_OVERVIEW_COMMAND_HELPER_TIMEOUT)
+ setupDefaultDisplay()
+
sut =
spy(
OverviewCommandHelper(
touchInteractionService = mock(),
overviewComponentObserver = mock(),
- taskAnimationManager = mock(),
dispatcherProvider = TestDispatcherProvider(dispatcher),
- recentsDisplayModel = mock(),
+ recentsDisplayModel = recentsDisplayModel,
focusState = mock(),
taskbarManager = mock(),
)
@@ -87,6 +108,8 @@
}
}
}
+ val commandInfo = invocation.arguments[0] as CommandInfo
+ executeCommandDisplayIds.add(commandInfo.displayId)
delayInMillis == null // if no callback to execute, returns success
}
.`when`(sut)
@@ -176,7 +199,61 @@
assertThat(commandInfo2.status).isEqualTo(CommandStatus.COMPLETED)
}
+ @Test
+ fun whenAllDisplaysCommandIsAdded_singleCommandProcessedForDefaultDisplay() =
+ testScope.runTest {
+ executeCommandDisplayIds.clear()
+ // Add command to queue
+ val commandInfo: CommandInfo = sut.addCommandsForAllDisplays(CommandType.HOME)!!
+ assertThat(commandInfo.status).isEqualTo(CommandStatus.IDLE)
+ runCurrent()
+ assertThat(commandInfo.status).isEqualTo(CommandStatus.COMPLETED)
+ assertThat(executeCommandDisplayIds).containsExactly(DEFAULT_DISPLAY)
+ }
+
+ @Test
+ fun whenAllDisplaysCommandIsAdded_multipleCommandsProcessedForMultipleDisplays() =
+ testScope.runTest {
+ setupMultipleDisplays()
+ executeCommandDisplayIds.clear()
+ // Add command to queue
+ val commandInfo: CommandInfo = sut.addCommandsForAllDisplays(CommandType.HOME)!!
+ assertThat(commandInfo.status).isEqualTo(CommandStatus.IDLE)
+ runCurrent()
+ assertThat(commandInfo.status).isEqualTo(CommandStatus.COMPLETED)
+ assertThat(executeCommandDisplayIds)
+ .containsExactly(DEFAULT_DISPLAY, EXTERNAL_DISPLAY_ID)
+ }
+
+ @Test
+ fun whenAllExceptDisplayCommandIsAdded_otherDisplayProcessed() =
+ testScope.runTest {
+ setupMultipleDisplays()
+ executeCommandDisplayIds.clear()
+ // Add command to queue
+ val commandInfo: CommandInfo =
+ sut.addCommandsForDisplaysExcept(CommandType.HOME, DEFAULT_DISPLAY)!!
+ assertThat(commandInfo.status).isEqualTo(CommandStatus.IDLE)
+ runCurrent()
+ assertThat(commandInfo.status).isEqualTo(CommandStatus.COMPLETED)
+ assertThat(executeCommandDisplayIds).containsExactly(EXTERNAL_DISPLAY_ID)
+ }
+
+ @Test
+ fun whenSingleDisplayCommandIsAdded_thatDisplayIsProcessed() =
+ testScope.runTest {
+ executeCommandDisplayIds.clear()
+ val displayId = 5
+ // Add command to queue
+ val commandInfo: CommandInfo = sut.addCommand(CommandType.HOME, displayId)!!
+ assertThat(commandInfo.status).isEqualTo(CommandStatus.IDLE)
+ runCurrent()
+ assertThat(commandInfo.status).isEqualTo(CommandStatus.COMPLETED)
+ assertThat(executeCommandDisplayIds).containsExactly(displayId)
+ }
+
private companion object {
const val QUEUE_TIMEOUT = 5001L
+ const val EXTERNAL_DISPLAY_ID = 1
}
}
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/RecentTasksListTest.java b/quickstep/tests/multivalentTests/src/com/android/quickstep/RecentTasksListTest.java
index 9722e9d..1e4315a 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/RecentTasksListTest.java
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/RecentTasksListTest.java
@@ -52,6 +52,7 @@
import com.android.launcher3.statehandlers.DesktopVisibilityController;
import com.android.launcher3.util.DaggerSingletonTracker;
import com.android.launcher3.util.LooperExecutor;
+import com.android.quickstep.util.DesktopTask;
import com.android.quickstep.util.GroupTask;
import com.android.quickstep.views.TaskViewType;
import com.android.systemui.shared.recents.model.Task;
@@ -148,6 +149,66 @@
}
@Test
+ @EnableFlags(FLAG_ENABLE_MULTIPLE_DESKTOPS_BACKEND)
+ public void loadTasksInBackground_freeformTask_multiDesksInMultiDisplays() throws Exception {
+ List<TaskInfo> tasksInDefaultDesk1 = Arrays.asList(
+ createRecentTaskInfo(/* taskId = */ 1, DEFAULT_DISPLAY),
+ createRecentTaskInfo(/* taskId = */ 4, DEFAULT_DISPLAY));
+ List<TaskInfo> tasksInDefaultDesk2 = Arrays.asList(
+ createRecentTaskInfo(/* taskId = */ 2, DEFAULT_DISPLAY),
+ createRecentTaskInfo(/* taskId = */ 3, DEFAULT_DISPLAY));
+ List<TaskInfo> tasksInExtend = Arrays.asList(
+ createRecentTaskInfo(/* taskId = */ 5, /* displayId = */ 1),
+ createRecentTaskInfo(/* taskId = */ 6, /* displayId = */ 1));
+ GroupedTaskInfo recentTaskInfosOfDesk1 = GroupedTaskInfo.forDeskTasks(/* deskId = */1,
+ DEFAULT_DISPLAY, tasksInDefaultDesk1, /* minimizedTaskIds = */
+ Collections.emptySet());
+ GroupedTaskInfo recentTaskInfosOfDesk2 = GroupedTaskInfo.forDeskTasks(/* deskId = */2,
+ DEFAULT_DISPLAY, tasksInDefaultDesk2, /* minimizedTaskIds = */
+ Collections.emptySet());
+ GroupedTaskInfo recentTaskInfosOfDesk3 = GroupedTaskInfo.forDeskTasks(/* deskId = */3,
+ /* displayId = */ 1, tasksInExtend, /* minimizedTaskIds = */
+ Collections.emptySet());
+ when(mSystemUiProxy.getRecentTasks(anyInt(), anyInt())).thenReturn(
+ new ArrayList<>(Arrays.asList(recentTaskInfosOfDesk1, recentTaskInfosOfDesk2,
+ recentTaskInfosOfDesk3)));
+
+ List<GroupTask> taskList = mRecentTasksList.loadTasksInBackground(Integer.MAX_VALUE, -1,
+ false);
+
+ assertThat(taskList).hasSize(3);
+ assertThat(taskList.get(2).taskViewType).isEqualTo(TaskViewType.DESKTOP);
+ List<Task> actualFreeformTasksInDesk1 = taskList.get(2).getTasks();
+ assertThat(actualFreeformTasksInDesk1).hasSize(2);
+ assertThat(actualFreeformTasksInDesk1.get(0).key.id).isEqualTo(1);
+ assertThat(actualFreeformTasksInDesk1.get(0).isMinimized).isFalse();
+ assertThat(actualFreeformTasksInDesk1.get(1).key.id).isEqualTo(4);
+ assertThat(actualFreeformTasksInDesk1.get(1).isMinimized).isFalse();
+ assertThat(((DesktopTask) taskList.get(2)).getDeskId()).isEqualTo(1);
+ assertThat(((DesktopTask) taskList.get(2)).getDisplayId()).isEqualTo(DEFAULT_DISPLAY);
+
+ assertThat(taskList.get(1).taskViewType).isEqualTo(TaskViewType.DESKTOP);
+ List<Task> actualFreeformTasksInDesk2 = taskList.get(1).getTasks();
+ assertThat(actualFreeformTasksInDesk2).hasSize(2);
+ assertThat(actualFreeformTasksInDesk2.get(0).key.id).isEqualTo(2);
+ assertThat(actualFreeformTasksInDesk2.get(0).isMinimized).isFalse();
+ assertThat(actualFreeformTasksInDesk2.get(1).key.id).isEqualTo(3);
+ assertThat(actualFreeformTasksInDesk2.get(1).isMinimized).isFalse();
+ assertThat(((DesktopTask) taskList.get(1)).getDeskId()).isEqualTo(2);
+ assertThat(((DesktopTask) taskList.get(1)).getDisplayId()).isEqualTo(DEFAULT_DISPLAY);
+
+ assertThat(taskList.get(0).taskViewType).isEqualTo(TaskViewType.DESKTOP);
+ List<Task> actualFreeformTasksInDesk3 = taskList.get(0).getTasks();
+ assertThat(actualFreeformTasksInDesk3).hasSize(2);
+ assertThat(actualFreeformTasksInDesk3.get(0).key.id).isEqualTo(5);
+ assertThat(actualFreeformTasksInDesk3.get(0).isMinimized).isFalse();
+ assertThat(actualFreeformTasksInDesk3.get(1).key.id).isEqualTo(6);
+ assertThat(actualFreeformTasksInDesk3.get(1).isMinimized).isFalse();
+ assertThat(((DesktopTask) taskList.get(0)).getDeskId()).isEqualTo(3);
+ assertThat(((DesktopTask) taskList.get(0)).getDisplayId()).isEqualTo(1);
+ }
+
+ @Test
public void loadTasksInBackground_moreThanKeys_hasValidTaskDescription() throws Exception {
String taskDescription = "Wheeee!";
RecentTaskInfo task1 = new RecentTaskInfo();
@@ -175,7 +236,8 @@
}
@Test
- @DisableFlags(FLAG_ENABLE_SEPARATE_EXTERNAL_DISPLAY_TASKS)
+ @DisableFlags({FLAG_ENABLE_SEPARATE_EXTERNAL_DISPLAY_TASKS,
+ FLAG_ENABLE_MULTIPLE_DESKTOPS_BACKEND})
public void loadTasksInBackground_freeformTask_createsDesktopTask() throws Exception {
List<TaskInfo> tasks = Arrays.asList(
createRecentTaskInfo(1 /* taskId */, DEFAULT_DISPLAY),
@@ -183,7 +245,8 @@
createRecentTaskInfo(5 /* taskId */, 1 /* displayId */),
createRecentTaskInfo(6 /* taskId */, 1 /* displayId */));
GroupedTaskInfo recentTaskInfos = GroupedTaskInfo.forDeskTasks(
- 0 /* deskId */, tasks, Collections.emptySet() /* minimizedTaskIds */);
+ 0 /* deskId */, DEFAULT_DISPLAY, tasks,
+ Collections.emptySet() /* minimizedTaskIds */);
when(mSystemUiProxy.getRecentTasks(anyInt(), anyInt()))
.thenReturn(new ArrayList<>(Collections.singletonList(recentTaskInfos)));
@@ -214,7 +277,8 @@
createRecentTaskInfo(5 /* taskId */, 1 /* displayId */),
createRecentTaskInfo(6 /* taskId */, 1 /* displayId */));
GroupedTaskInfo recentTaskInfos = GroupedTaskInfo.forDeskTasks(
- 0 /* deskId */, tasks, Collections.emptySet() /* minimizedTaskIds */);
+ 0 /* deskId */, DEFAULT_DISPLAY, tasks,
+ Collections.emptySet() /* minimizedTaskIds */);
when(mSystemUiProxy.getRecentTasks(anyInt(), anyInt()))
.thenReturn(new ArrayList<>(Collections.singletonList(recentTaskInfos)));
@@ -248,7 +312,7 @@
Set<Integer> minimizedTaskIds =
Arrays.stream(new Integer[]{1, 4, 5}).collect(Collectors.toSet());
GroupedTaskInfo recentTaskInfos = GroupedTaskInfo.forDeskTasks(
- 0 /* deskId */, tasks, minimizedTaskIds);
+ 0 /* deskId */, DEFAULT_DISPLAY, tasks, minimizedTaskIds);
when(mSystemUiProxy.getRecentTasks(anyInt(), anyInt()))
.thenReturn(new ArrayList<>(Collections.singletonList(recentTaskInfos)));
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/TaskAnimationManagerTest.java b/quickstep/tests/multivalentTests/src/com/android/quickstep/TaskAnimationManagerTest.java
index 6e9885a..fd88a5c 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/TaskAnimationManagerTest.java
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/TaskAnimationManagerTest.java
@@ -26,6 +26,7 @@
import android.app.ActivityOptions;
import android.content.Context;
import android.content.Intent;
+import android.view.Display;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;
@@ -54,7 +55,7 @@
public void setUp() {
MockitoAnnotations.initMocks(this);
mTaskAnimationManager = new TaskAnimationManager(mContext,
- RecentsAnimationDeviceState.INSTANCE.get(mContext)) {
+ RecentsAnimationDeviceState.INSTANCE.get(mContext), Display.DEFAULT_DISPLAY) {
@Override
SystemUiProxy getSystemUiProxy() {
return mSystemUiProxy;
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/orientation/LandscapePagedViewHandlerTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/orientation/LandscapePagedViewHandlerTest.kt
index 0570c26..66b3b04 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/orientation/LandscapePagedViewHandlerTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/orientation/LandscapePagedViewHandlerTest.kt
@@ -43,12 +43,12 @@
if (isEnabled) {
setFlagsRule.enableFlags(
Flags.FLAG_ENABLE_GRID_ONLY_OVERVIEW,
- Flags.FLAG_ENABLE_OVERVIEW_ICON_MENU
+ Flags.FLAG_ENABLE_OVERVIEW_ICON_MENU,
)
} else {
setFlagsRule.disableFlags(
Flags.FLAG_ENABLE_GRID_ONLY_OVERVIEW,
- Flags.FLAG_ENABLE_OVERVIEW_ICON_MENU
+ Flags.FLAG_ENABLE_OVERVIEW_ICON_MENU,
)
}
}
@@ -108,14 +108,8 @@
val (topLeftY, bottomRightY) = getSplitIconsPosition(isRTL = true)
- // TODO(b/326377497): When started in fake seascape and rotated to landscape,
- // the icon chips are in RTL and wrongly positioned at the right side of the snapshot.
- // Top-Left app chip should be placed at the top left of the first snapshot, but because
- // this issue, it's displayed at the top-right of the second snapshot.
- // The Bottom-Right app chip is displayed at the top-right of the first snapshot because
- // of this issue.
- assertThat(topLeftY).isEqualTo(0)
- assertThat(bottomRightY).isEqualTo(-316)
+ assertThat(topLeftY).isEqualTo(-316)
+ assertThat(bottomRightY).isEqualTo(0)
}
/** Test updateSplitIconsPosition */
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/orientation/SeascapePagedViewHandlerTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/orientation/SeascapePagedViewHandlerTest.kt
index 3788688..d455b0d 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/orientation/SeascapePagedViewHandlerTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/orientation/SeascapePagedViewHandlerTest.kt
@@ -43,12 +43,12 @@
if (isEnabled) {
setFlagsRule.enableFlags(
Flags.FLAG_ENABLE_GRID_ONLY_OVERVIEW,
- Flags.FLAG_ENABLE_OVERVIEW_ICON_MENU
+ Flags.FLAG_ENABLE_OVERVIEW_ICON_MENU,
)
} else {
setFlagsRule.disableFlags(
Flags.FLAG_ENABLE_GRID_ONLY_OVERVIEW,
- Flags.FLAG_ENABLE_OVERVIEW_ICON_MENU
+ Flags.FLAG_ENABLE_OVERVIEW_ICON_MENU,
)
}
}
@@ -110,12 +110,6 @@
val (topLeftY, bottomRightY) = getSplitIconsPosition(isRTL = true)
- // TODO(b/326377497): When started in fake seascape and rotated to landscape,
- // the icon chips are in RTL and wrongly positioned at the right side of the snapshot.
- // Top-Left app chip should be placed at the top left of the first snapshot, but because
- // this issue, it's displayed at the top-right of the second snapshot.
- // The Bottom-Right app chip is displayed at the top-right of the first snapshot because
- // of this issue.
assertThat(topLeftY).isEqualTo(316)
assertThat(bottomRightY).isEqualTo(0)
}
@@ -167,7 +161,7 @@
`when`(iconView.layoutParams).thenReturn(frameLayout)
sut.updateSplitIconsPosition(iconView, expectedTranslationY, false)
- assertThat(frameLayout.gravity).isEqualTo(Gravity.BOTTOM or Gravity.START)
+ assertThat(frameLayout.gravity).isEqualTo(Gravity.BOTTOM or Gravity.END)
verify(iconView).setSplitTranslationX(0f)
verify(iconView).setSplitTranslationY(expectedTranslationY.toFloat())
}
@@ -182,7 +176,7 @@
`when`(iconView.layoutParams).thenReturn(frameLayout)
sut.updateSplitIconsPosition(iconView, expectedTranslationY, true)
- assertThat(frameLayout.gravity).isEqualTo(Gravity.TOP or Gravity.END)
+ assertThat(frameLayout.gravity).isEqualTo(Gravity.TOP or Gravity.START)
verify(iconView).setSplitTranslationX(0f)
verify(iconView).setSplitTranslationY(expectedTranslationY.toFloat())
}
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/data/TasksRepositoryTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/data/TasksRepositoryTest.kt
index 6790567..e22892c 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/data/TasksRepositoryTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/data/TasksRepositoryTest.kt
@@ -21,6 +21,7 @@
import android.graphics.Bitmap
import android.graphics.Rect
import android.graphics.drawable.Drawable
+import android.view.Display.DEFAULT_DISPLAY
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.android.launcher3.util.SplitConfigurationOptions
import com.android.launcher3.util.TestDispatcherProvider
@@ -64,7 +65,7 @@
/* snapPosition = */ SNAP_TO_2_50_50,
),
),
- DesktopTask(deskId = 0, tasks.subList(3, 6)),
+ DesktopTask(deskId = 0, DEFAULT_DISPLAY, tasks.subList(3, 6)),
)
private val recentsModel = FakeRecentTasksDataSource()
private val taskThumbnailDataSource = FakeTaskThumbnailDataSource()
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/domain/usecase/GetThumbnailPositionUseCaseTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/domain/usecase/GetThumbnailPositionUseCaseTest.kt
index a253280..7646e69 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/domain/usecase/GetThumbnailPositionUseCaseTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/domain/usecase/GetThumbnailPositionUseCaseTest.kt
@@ -25,11 +25,14 @@
import com.android.quickstep.recents.data.FakeRecentsRotationStateRepository
import com.android.systemui.shared.recents.model.ThumbnailData
import com.android.systemui.shared.recents.utilities.PreviewPositionHelper
+import com.android.systemui.shared.recents.utilities.PreviewPositionHelper.PreviewPositionHelperFactory
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.test.runTest
+import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.kotlin.mock
+import org.mockito.kotlin.times
import org.mockito.kotlin.verify
import org.mockito.kotlin.whenever
@@ -38,15 +41,21 @@
class GetThumbnailPositionUseCaseTest {
private val deviceProfileRepository = FakeRecentsDeviceProfileRepository()
private val rotationStateRepository = FakeRecentsRotationStateRepository()
+ private val previewPositionHelperFactoryMock = mock<PreviewPositionHelperFactory>()
private val previewPositionHelper = mock<PreviewPositionHelper>()
private val systemUnderTest =
GetThumbnailPositionUseCase(
- deviceProfileRepository,
- rotationStateRepository,
- previewPositionHelper,
+ deviceProfileRepository = deviceProfileRepository,
+ rotationStateRepository = rotationStateRepository,
+ previewPositionHelperFactory = previewPositionHelperFactoryMock,
)
+ @Before
+ fun setUp() {
+ whenever(previewPositionHelperFactoryMock.create()).thenReturn(previewPositionHelper)
+ }
+
@Test
fun nullThumbnailData_returnsIdentityMatrix() = runTest {
val expectedResult = ThumbnailPosition(Matrix.IDENTITY_MATRIX, false)
@@ -96,6 +105,25 @@
)
}
+ @Test
+ fun multipleInvocations_usesPreviewPositionHelperFactoryEachTime() = runTest {
+ whenever(previewPositionHelper.matrix).thenReturn(MATRIX)
+
+ val sut =
+ GetThumbnailPositionUseCase(
+ deviceProfileRepository = deviceProfileRepository,
+ rotationStateRepository = rotationStateRepository,
+ previewPositionHelperFactory = previewPositionHelperFactoryMock,
+ )
+ verify(previewPositionHelperFactoryMock, times(0)).create()
+
+ sut.invoke(THUMBNAIL_DATA, CANVAS_WIDTH, CANVAS_HEIGHT, /* isRtl= */ true)
+ sut.invoke(THUMBNAIL_DATA, CANVAS_WIDTH, CANVAS_HEIGHT, /* isRtl= */ false)
+
+ // Each invocation of use case should use a fresh position helper acquired by the factory.
+ verify(previewPositionHelperFactoryMock, times(2)).create()
+ }
+
private companion object {
const val THUMBNAIL_WIDTH = 100
const val THUMBNAIL_HEIGHT = 200
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/util/DesktopTaskTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/util/DesktopTaskTest.kt
index 6fbf482..15da4d4 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/util/DesktopTaskTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/util/DesktopTaskTest.kt
@@ -18,6 +18,7 @@
import android.content.ComponentName
import android.content.Intent
+import android.view.Display.DEFAULT_DISPLAY
import com.android.launcher3.util.LauncherMultivalentJUnit
import com.android.systemui.shared.recents.model.Task
import com.google.common.truth.Truth.assertThat
@@ -29,42 +30,42 @@
@Test
fun testDesktopTask_sameInstance_isEqual() {
- val task = DesktopTask(deskId = 0, createTasks(1))
+ val task = DesktopTask(deskId = 0, DEFAULT_DISPLAY, createTasks(1))
assertThat(task).isEqualTo(task)
}
@Test
fun testDesktopTask_identicalConstructor_isEqual() {
- val task1 = DesktopTask(deskId = 0, createTasks(1))
- val task2 = DesktopTask(deskId = 0, createTasks(1))
+ val task1 = DesktopTask(deskId = 0, DEFAULT_DISPLAY, createTasks(1))
+ val task2 = DesktopTask(deskId = 0, DEFAULT_DISPLAY, createTasks(1))
assertThat(task1).isEqualTo(task2)
}
@Test
fun testDesktopTask_copy_isEqual() {
- val task1 = DesktopTask(deskId = 0, createTasks(1))
+ val task1 = DesktopTask(deskId = 0, DEFAULT_DISPLAY, createTasks(1))
val task2 = task1.copy()
assertThat(task1).isEqualTo(task2)
}
@Test
fun testDesktopTask_differentDeskIds_isNotEqual() {
- val task1 = DesktopTask(deskId = 0, createTasks(1))
- val task2 = DesktopTask(deskId = 1, createTasks(1))
+ val task1 = DesktopTask(deskId = 0, DEFAULT_DISPLAY, createTasks(1))
+ val task2 = DesktopTask(deskId = 1, DEFAULT_DISPLAY, createTasks(1))
assertThat(task1).isNotEqualTo(task2)
}
@Test
fun testDesktopTask_differentTaskIds_isNotEqual() {
- val task1 = DesktopTask(deskId = 0, createTasks(1))
- val task2 = DesktopTask(deskId = 0, createTasks(2))
+ val task1 = DesktopTask(deskId = 0, DEFAULT_DISPLAY, createTasks(1))
+ val task2 = DesktopTask(deskId = 0, DEFAULT_DISPLAY, createTasks(2))
assertThat(task1).isNotEqualTo(task2)
}
@Test
fun testDesktopTask_differentLength_isNotEqual() {
- val task1 = DesktopTask(deskId = 0, createTasks(1))
- val task2 = DesktopTask(deskId = 0, createTasks(1, 2))
+ val task1 = DesktopTask(deskId = 0, DEFAULT_DISPLAY, createTasks(1))
+ val task2 = DesktopTask(deskId = 0, DEFAULT_DISPLAY, createTasks(1, 2))
assertThat(task1).isNotEqualTo(task2)
}
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/util/GroupTaskTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/util/GroupTaskTest.kt
index 67fc62f..9f49171 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/util/GroupTaskTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/util/GroupTaskTest.kt
@@ -19,6 +19,7 @@
import android.content.ComponentName
import android.content.Intent
import android.graphics.Rect
+import android.view.Display.DEFAULT_DISPLAY
import com.android.launcher3.util.LauncherMultivalentJUnit
import com.android.launcher3.util.SplitConfigurationOptions
import com.android.systemui.shared.recents.model.Task
@@ -98,7 +99,7 @@
@Test
fun testGroupTask_differentType_isNotEqual() {
val task1 = SingleTask(createTask(1))
- val task2 = DesktopTask(deskId = 0, listOf(createTask(1)))
+ val task2 = DesktopTask(deskId = 0, DEFAULT_DISPLAY, listOf(createTask(1)))
assertThat(task1).isNotEqualTo(task2)
}
diff --git a/quickstep/tests/src/com/android/quickstep/DesktopSystemShortcutTest.kt b/quickstep/tests/src/com/android/quickstep/DesktopSystemShortcutTest.kt
index 7b73be7..746f8bb 100644
--- a/quickstep/tests/src/com/android/quickstep/DesktopSystemShortcutTest.kt
+++ b/quickstep/tests/src/com/android/quickstep/DesktopSystemShortcutTest.kt
@@ -22,6 +22,7 @@
import android.content.pm.PackageManager
import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
+import android.platform.test.flag.junit.SetFlagsRule
import android.view.Display.DEFAULT_DISPLAY
import androidx.test.platform.app.InstrumentationRegistry
import com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession
@@ -52,6 +53,7 @@
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.`when`
import org.mockito.kotlin.any
@@ -64,8 +66,11 @@
import org.mockito.quality.Strictness
/** Test for [DesktopSystemShortcut] */
+// TODO(b/403558856): Improve test coverage for DesktopModeCompatPolicy integration.
class DesktopSystemShortcutTest {
+ @get:Rule val setFlagsRule = SetFlagsRule(SetFlagsRule.DefaultInitValueType.DEVICE_DEFAULT)
+
private val launcher: RecentsViewContainer = mock()
private val statsLogManager: StatsLogManager = mock()
private val statsLogger: StatsLogManager.StatsLogger = mock()
diff --git a/quickstep/tests/src/com/android/quickstep/InputConsumerUtilsTest.java b/quickstep/tests/src/com/android/quickstep/InputConsumerUtilsTest.java
index ef6f55e..93b979c 100644
--- a/quickstep/tests/src/com/android/quickstep/InputConsumerUtilsTest.java
+++ b/quickstep/tests/src/com/android/quickstep/InputConsumerUtilsTest.java
@@ -27,7 +27,6 @@
import static org.mockito.Mockito.when;
import android.annotation.NonNull;
-import android.annotation.Nullable;
import android.os.Looper;
import android.view.Choreographer;
import android.view.Display;
@@ -100,12 +99,13 @@
@Rule public final SandboxApplication mContext = new SandboxApplication();
+ private final int mDisplayId = Display.DEFAULT_DISPLAY;
@NonNull private final InputMonitorCompat mInputMonitorCompat =
- new InputMonitorCompat("", Display.DEFAULT_DISPLAY);
+ new InputMonitorCompat("", mDisplayId);
private TaskAnimationManager mTaskAnimationManager;
private InputChannelCompat.InputEventReceiver mInputEventReceiver;
- @Nullable private ResetGestureInputConsumer mResetGestureInputConsumer;
+ private boolean mUserUnlocked = true;
@NonNull private Function<GestureState, AnimatedFloat> mSwipeUpProxyProvider = (state) -> null;
@NonNull @Mock private TaskbarActivityContext mTaskbarActivityContext;
@@ -126,8 +126,7 @@
@Before
public void setupTaskAnimationManager() {
- mTaskAnimationManager = new TaskAnimationManager(
- mContext, mDeviceState);
+ mTaskAnimationManager = new TaskAnimationManager(mContext, mDeviceState, mDisplayId);
}
@Before
@@ -164,12 +163,6 @@
}
@Before
- public void setUpResetGestureInputConsumer() {
- mResetGestureInputConsumer = new ResetGestureInputConsumer(
- mTaskAnimationManager, mTaskbarManager::getCurrentActivityContext);
- }
-
- @Before
public void setupLockedUserState() {
when(mLockedUserState.isUserUnlocked()).thenReturn(true);
}
@@ -314,8 +307,6 @@
@Test
public void testNewBaseConsumer_containsOtherActivityInputConsumer() {
- // OtherActivityInputConsumer needs to be initialized on the main thread because of
- // MotionPauseDetector.mForcePauseTimeout
assertCorrectInputConsumer(
this::createBaseInputConsumer,
OtherActivityInputConsumer.class,
@@ -486,7 +477,7 @@
MotionEvent event = MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 0, 0, 0);
InputConsumer inputConsumer = newConsumer(
mContext,
- mResetGestureInputConsumer,
+ mUserUnlocked,
mOverviewComponentObserver,
mDeviceState,
mPreviousGestureState,
@@ -510,7 +501,8 @@
MotionEvent event = MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 0, 0, 0);
InputConsumer inputConsumer = newBaseConsumer(
mContext,
- mResetGestureInputConsumer,
+ mUserUnlocked,
+ mTaskbarManager,
mOverviewComponentObserver,
mDeviceState,
mPreviousGestureState,
@@ -535,12 +527,15 @@
ResetGestureInputConsumer.class,
InputConsumer.TYPE_RESET_GESTURE);
- mResetGestureInputConsumer = null;
+ mUserUnlocked = false;
- runOnMainSync(() -> assertThat(inputConsumerProvider.get()).isEqualTo(InputConsumer.NO_OP));
+ assertCorrectInputConsumer(
+ inputConsumerProvider,
+ InputConsumer.class,
+ InputConsumer.TYPE_NO_OP);
}
- private static void assertCorrectInputConsumer(
+ private void assertCorrectInputConsumer(
@NonNull Provider<InputConsumer> inputConsumerProvider,
@NonNull Class<? extends InputConsumer> expectedOutputConsumer,
int expectedType) {
@@ -551,11 +546,13 @@
expectedType);
}
- private static void assertCorrectInputConsumer(
+ private void assertCorrectInputConsumer(
@NonNull Provider<InputConsumer> inputConsumerProvider,
@NonNull Class<? extends InputConsumer> expectedOutputConsumer,
@NonNull Class<? extends InputConsumer> expectedActiveConsumer,
int expectedType) {
+ when(mCurrentGestureState.getDisplayId()).thenReturn(mDisplayId);
+
runOnMainSync(() -> {
InputConsumer inputConsumer = inputConsumerProvider.get();
@@ -563,7 +560,14 @@
assertThat(inputConsumer.getActiveConsumerInHierarchy())
.isInstanceOf(expectedActiveConsumer);
assertThat(inputConsumer.getType()).isEqualTo(expectedType);
+ assertThat(inputConsumer.getDisplayId()).isEqualTo(mDisplayId);
});
+ int expectedDisplayId = mDisplayId + 1;
+
+ when(mCurrentGestureState.getDisplayId()).thenReturn(expectedDisplayId);
+
+ runOnMainSync(() -> assertThat(inputConsumerProvider.get().getDisplayId())
+ .isEqualTo(expectedDisplayId));
}
private static void runOnMainSync(@NonNull Runnable runnable) {
diff --git a/res/drawable/ic_taskbar_all_apps_search_button_expressive_theme.xml b/res/drawable/ic_taskbar_all_apps_search_button_expressive_theme.xml
new file mode 100644
index 0000000..ed4a821
--- /dev/null
+++ b/res/drawable/ic_taskbar_all_apps_search_button_expressive_theme.xml
@@ -0,0 +1,25 @@
+<!--
+ ~ 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="52dp"
+ android:height="52dp"
+ android:viewportWidth="52"
+ android:viewportHeight="52">
+ <path
+ android:pathData="M32.862,38.75C31.263,38.75 29.888,38.175 28.737,37.025C27.587,35.875 27.013,34.487 27.013,32.862C27.013,31.237 27.587,29.85 28.737,28.7C29.888,27.55 31.263,26.975 32.862,26.975C34.487,26.975 35.875,27.55 37.025,28.7C38.175,29.85 38.75,31.237 38.75,32.862C38.75,33.438 38.662,33.987 38.487,34.513C38.338,35.037 38.125,35.525 37.85,35.975L41.45,39.612C41.6,39.737 41.7,39.875 41.75,40.025C41.825,40.175 41.862,40.338 41.862,40.513C41.862,40.688 41.825,40.85 41.75,41C41.7,41.15 41.6,41.3 41.45,41.45C41.325,41.575 41.188,41.675 41.037,41.75C40.888,41.8 40.725,41.825 40.55,41.825C40.375,41.825 40.213,41.8 40.063,41.75C39.912,41.675 39.763,41.575 39.612,41.45L35.975,37.85C35.525,38.15 35.037,38.375 34.513,38.525C33.987,38.675 33.438,38.75 32.862,38.75ZM16.1,38.75C14.5,38.75 13.125,38.175 11.975,37.025C10.825,35.875 10.25,34.5 10.25,32.9C10.25,31.25 10.825,29.85 11.975,28.7C13.125,27.55 14.5,26.975 16.1,26.975C17.75,26.975 19.15,27.55 20.3,28.7C21.45,29.85 22.025,31.25 22.025,32.9C22.025,34.5 21.45,35.875 20.3,37.025C19.15,38.175 17.75,38.75 16.1,38.75ZM32.862,36.125C33.763,36.125 34.525,35.813 35.15,35.188C35.8,34.537 36.125,33.775 36.125,32.9C36.125,31.975 35.8,31.2 35.15,30.575C34.525,29.925 33.763,29.6 32.862,29.6C31.962,29.6 31.188,29.925 30.538,30.575C29.913,31.2 29.6,31.975 29.6,32.9C29.6,33.775 29.913,34.537 30.538,35.188C31.188,35.813 31.962,36.125 32.862,36.125ZM16.1,22.025C14.5,22.025 13.125,21.45 11.975,20.3C10.825,19.15 10.25,17.763 10.25,16.138C10.25,14.512 10.825,13.125 11.975,11.975C13.125,10.825 14.5,10.25 16.1,10.25C17.75,10.25 19.15,10.825 20.3,11.975C21.45,13.125 22.025,14.512 22.025,16.138C22.025,17.763 21.45,19.15 20.3,20.3C19.15,21.45 17.75,22.025 16.1,22.025ZM32.862,22.025C31.237,22.025 29.85,21.45 28.7,20.3C27.55,19.15 26.975,17.763 26.975,16.138C26.975,14.512 27.55,13.125 28.7,11.975C29.85,10.825 31.237,10.25 32.862,10.25C34.487,10.25 35.875,10.825 37.025,11.975C38.175,13.125 38.75,14.512 38.75,16.138C38.75,17.763 38.175,19.15 37.025,20.3C35.875,21.45 34.487,22.025 32.862,22.025Z"
+ android:fillColor="#FF000000"/>
+</vector>
\ No newline at end of file
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index c8ab8ff..4133419 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -131,6 +131,8 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Muurpapier en styl"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Wysig tuisskerm"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Tuis-instellings"</string>
+ <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
+ <skip />
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Gedeaktiveer deur jou administrateur"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Laat toe dat tuisskerm gedraai word"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Wanneer foon gedraai word"</string>
@@ -184,14 +186,16 @@
<string name="action_decrease_height" msgid="282377193880900022">"Verminder hoogte"</string>
<string name="widget_resized" msgid="9130327887929620">"Legstukgrootte is verander na breedte <xliff:g id="NUMBER_0">%1$s</xliff:g> hoogte <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Kortpadkieslys"</string>
+ <!-- no translation found for widget_frame_name (8782828448471444270) -->
+ <skip />
+ <!-- no translation found for action_close (1077760267194136901) -->
+ <skip />
<string name="action_dismiss_notification" msgid="5909461085055959187">"Maak toe"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Maak toe"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Persoonlik"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Werk"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Persoonlike Apps-oortjie"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Werkapps-oortjie"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Werkprofiel"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Werkprogramme het \'n kenteken en is sigbaar vir jou IT-administrateur"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Het dit"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index 56e4d56..4cb4e1a 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -131,6 +131,8 @@
<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="msg_disabled_by_admin" msgid="6898038085516271325">"በእርስዎ አስተዳዳሪ የተሰናከለ"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"የመነሻ ማያ ገፅ ማሽከርከርን ይፍቀዱ"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"ስልኩ ሲዞር"</string>
@@ -184,14 +186,16 @@
<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="action_dismiss_notification" msgid="5909461085055959187">"አሰናብት"</string>
<string name="accessibility_close" msgid="2277148124685870734">"ዝጋ"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"የግል"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"ሥራ"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"የግል መተግበሪያዎች ትር"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"የሥራ መተግበሪያዎች ትር"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"የሥራ መገለጫ"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"የሥራ መተግበሪያዎች ባጅ የተደረገባቸው እና ለእርስዎ የአይቲ አስተዳዳሪ የሚታዩ ናቸው"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"ገባኝ"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 83b07ec..3961d11 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -131,6 +131,8 @@
<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="msg_disabled_by_admin" msgid="6898038085516271325">"أوقف المشرف هذه الميزة"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"السماح بتدوير الشاشة الرئيسية"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"عند تدوير الهاتف"</string>
@@ -184,14 +186,16 @@
<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="action_dismiss_notification" msgid="5909461085055959187">"تجاهل"</string>
<string name="accessibility_close" msgid="2277148124685870734">"إغلاق"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"شخصية"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"للعمل"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"علامة تبويب التطبيقات الشخصية"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"علامة تبويب تطبيقات العمل"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"ملف العمل"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"تحمل تطبيقات العمل مميّزة بشارة ومرئية لمشرف تكنولوجيا المعلومات."</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"حسنًا"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml
index 1e4861c..b1b4113 100644
--- a/res/values-as/strings.xml
+++ b/res/values-as/strings.xml
@@ -131,6 +131,8 @@
<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="msg_disabled_by_admin" msgid="6898038085516271325">"আপোনাৰ প্ৰশাসকে অক্ষম কৰি ৰাখিছে"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"গৃহ স্ক্ৰীন ঘূৰোৱাৰ অনুমতি দিয়ক"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"ফ\'নটো যেতিয়া ঘূৰোৱা হয়"</string>
@@ -184,14 +186,16 @@
<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="action_dismiss_notification" msgid="5909461085055959187">"অগ্ৰাহ্য কৰক"</string>
<string name="accessibility_close" msgid="2277148124685870734">"বন্ধ কৰক"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"ব্যক্তিগত"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"কৰ্মস্থান"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"ব্যক্তিগত এপৰ টেব"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"কৰ্মস্থানৰ এপৰ টেব"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"কৰ্মস্থানৰ প্ৰ\'ফাইল"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"কৰ্মস্থানৰ এপ্সমূহ প্ৰতীকেৰে চিহ্নিত কৰা হয় আৰু সেইবোৰ আপোনাৰ আইটি প্ৰশাসকৰ বাবে দৃশ্যমান হয়"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"বুজি পালোঁ"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml
index 916b738..061b621 100644
--- a/res/values-az/strings.xml
+++ b/res/values-az/strings.xml
@@ -131,6 +131,8 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Divar kağızı və üslub"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Əsas ekranı redaktə edin"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Home ayarları"</string>
+ <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
+ <skip />
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Admininiz tərəfindən deaktiv edilib"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Əsas ekran çevrilsin"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Telefon çevrilən zaman"</string>
@@ -184,14 +186,16 @@
<string name="action_decrease_height" msgid="282377193880900022">"Hündürlüyü azaldın"</string>
<string name="widget_resized" msgid="9130327887929620">"Vidcetin eni <xliff:g id="NUMBER_0">%1$s</xliff:g> hündürlüyü <xliff:g id="NUMBER_1">%2$s</xliff:g> kimi ölçüləndirildi"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Qısayol menyusu"</string>
+ <!-- no translation found for widget_frame_name (8782828448471444270) -->
+ <skip />
+ <!-- no translation found for action_close (1077760267194136901) -->
+ <skip />
<string name="action_dismiss_notification" msgid="5909461085055959187">"Rədd edin"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Bağlayın"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Şəxsi"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"İş"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Şəxsi tətbiqlər tabı"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"İş tətbiqləri tabı"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"İş profili"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"İş tətbiqləri nişanlanıb və İT administratorunuza görünür"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Anladım"</string>
@@ -216,4 +220,6 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Şəxsi məkana keçid"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Quraşdırın"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Tətbiqləri şəxsi sahədə quraşdırın"</string>
+ <!-- no translation found for ps_app_content_description (1129133475892816226) -->
+ <skip />
</resources>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index c8782e2..b53224a 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -131,6 +131,8 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Pozadina i stil"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Izmeni početni ekran"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Podešavanja početnog ekrana"</string>
+ <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
+ <skip />
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Administrator je onemogućio"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Dozvoli rotaciju početnog ekrana"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Kada se telefon rotira"</string>
@@ -184,14 +186,16 @@
<string name="action_decrease_height" msgid="282377193880900022">"Smanji visinu"</string>
<string name="widget_resized" msgid="9130327887929620">"Veličina vidžeta je promenjena na širinu <xliff:g id="NUMBER_0">%1$s</xliff:g> i visinu <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Meni sa prečicama"</string>
+ <!-- no translation found for widget_frame_name (8782828448471444270) -->
+ <skip />
+ <!-- no translation found for action_close (1077760267194136901) -->
+ <skip />
<string name="action_dismiss_notification" msgid="5909461085055959187">"Odbaci"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Zatvori"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Lično"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Posao"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Kartica Lične aplikacije"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Kartica Poslovne aplikacije"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Poslovni profil"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Poslovne aplikacije su označene značkom i IT administrator može da ih vidi"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Važi"</string>
@@ -216,4 +220,6 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Prenos privatnog prostora"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Instalirajte"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Instaliraj aplikacije u privatan prostor"</string>
+ <!-- no translation found for ps_app_content_description (1129133475892816226) -->
+ <skip />
</resources>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index 671cb6d..b12eb23 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -131,6 +131,8 @@
<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="msg_disabled_by_admin" msgid="6898038085516271325">"Адключаная адміністратарам"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Дазволіць паварот галоўнага экрана"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Пры павароце тэлефона"</string>
@@ -184,14 +186,16 @@
<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="action_dismiss_notification" msgid="5909461085055959187">"Адхіліць"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Закрыць"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Асабістыя"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Працоўныя"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Укладка \"Асабістыя праграмы\""</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Укладка \"Працоўныя праграмы\""</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Працоўны профіль"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Працоўныя праграмы пазначаны спецыяльнымі значкамі, а таксама бачныя IT-адміністратару"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Зразумела"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index a4c3faf..ee4dabc 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -131,6 +131,8 @@
<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="msg_disabled_by_admin" msgid="6898038085516271325">"Деактивирано от администратора ви"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Разрешаване на завъртането на началния екран"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"При завъртане на телефона"</string>
@@ -184,14 +186,16 @@
<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="action_dismiss_notification" msgid="5909461085055959187">"Отхвърляне"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Затваряне"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Лични"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Служебни"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Раздел „Лични приложения“"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Раздел „Служебни приложения“"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Служебен потребителски профил"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Служебните приложения са означени със значка и са видими за системния администратор"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Разбрах"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
index 296f088..a889a94 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -131,6 +131,8 @@
<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="msg_disabled_by_admin" msgid="6898038085516271325">"আপনার প্রশাসক দ্বারা অক্ষম করা হয়েছে"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"হোম স্ক্রিন রোটেট করার অনুমতি দিন"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"যখন ফোনটি ঘোরানো হয়"</string>
@@ -184,14 +186,16 @@
<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="action_dismiss_notification" msgid="5909461085055959187">"খারিজ করুন"</string>
<string name="accessibility_close" msgid="2277148124685870734">"বন্ধ করুন"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"ব্যক্তিগত"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"অফিস"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"ব্যক্তিগত অ্যাপ সম্পর্কিত ট্যাব"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"অফিস অ্যাপ সম্পর্কিত ট্যাব"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"অফিসের প্রোফাইল"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"অফিস অ্যাপে ব্যাজ যোগ করা হয়েছে এবং আপনার আইটি অ্যাডমিন সেগুলি দেখতে পাবেন"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"বুঝেছি"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
index 9ab5c4c..4308879 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -131,6 +131,8 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Pozadinska slika i stil"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Uredi Početni ekran"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Postavke početnog ekrana"</string>
+ <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
+ <skip />
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Onemogućio vaš administrator"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Dozvoli rotiranje početnog ekrana"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Kada se telefon zarotira"</string>
@@ -184,14 +186,16 @@
<string name="action_decrease_height" msgid="282377193880900022">"Smanji visinu"</string>
<string name="widget_resized" msgid="9130327887929620">"Veličina vidžeta je promijenjena na širinu <xliff:g id="NUMBER_0">%1$s</xliff:g> visinu <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Meni prečica"</string>
+ <!-- no translation found for widget_frame_name (8782828448471444270) -->
+ <skip />
+ <!-- no translation found for action_close (1077760267194136901) -->
+ <skip />
<string name="action_dismiss_notification" msgid="5909461085055959187">"Odbaci"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Zatvaranje"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Lično"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Poslovno"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Kartica ličnih aplikacija"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Kartica poslovnih aplikacija"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Radni profil"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Poslovne aplikacije su označene i vaš IT administrator ih može vidjeti"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Razumijem"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 07a21ab..434117b 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -131,6 +131,8 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Estil i fons de pantalla"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Edita la pantalla d\'inici"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Configuració de la pantalla d\'inici"</string>
+ <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
+ <skip />
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Desactivada per l\'administrador"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Permet la rotació de la pantalla d\'inici"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"En girar el telèfon"</string>
@@ -184,14 +186,16 @@
<string name="action_decrease_height" msgid="282377193880900022">"Redueix l\'alçada"</string>
<string name="widget_resized" msgid="9130327887929620">"S\'ha canviat la mida del widget a l\'amplada <xliff:g id="NUMBER_0">%1$s</xliff:g> i l\'alçada <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Menú de dreceres"</string>
+ <!-- no translation found for widget_frame_name (8782828448471444270) -->
+ <skip />
+ <!-- no translation found for action_close (1077760267194136901) -->
+ <skip />
<string name="action_dismiss_notification" msgid="5909461085055959187">"Ignora"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Tanca"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personal"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Treball"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Pestanya Aplicacions personals"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Pestanya Aplicacions de treball"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Perfil de treball"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Les aplicacions de treball tenen una insígnia i el teu administrador de TI les pot veure"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Entesos"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 693c6e5..bc73d08 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -131,6 +131,8 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Tapety a styl"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Upravit plochu"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Nastavení plochy"</string>
+ <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
+ <skip />
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Zakázáno administrátorem"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Povolit otáčení plochy"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Při otočení telefonu"</string>
@@ -184,14 +186,16 @@
<string name="action_decrease_height" msgid="282377193880900022">"Snížit výšku"</string>
<string name="widget_resized" msgid="9130327887929620">"Velikost widgetu upravena: šířka <xliff:g id="NUMBER_0">%1$s</xliff:g>, výška <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Nabídka zkratek"</string>
+ <!-- no translation found for widget_frame_name (8782828448471444270) -->
+ <skip />
+ <!-- no translation found for action_close (1077760267194136901) -->
+ <skip />
<string name="action_dismiss_notification" msgid="5909461085055959187">"Zavřít"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Zavřít"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Osobní"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Pracovní"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Karta osobních aplikací"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Karta pracovních aplikací"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Pracovní profil"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Pracovní aplikace jsou označené a váš administrátor IT je vidí"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Rozumím"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index bd2bf5a..0a2f74f 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -131,6 +131,8 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Baggrund og stil"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Rediger startskærm"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Indst. for startskærm"</string>
+ <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
+ <skip />
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Deaktiveret af din administrator"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Tillad rotation af startskærmen"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Når telefonen roteres"</string>
@@ -184,14 +186,16 @@
<string name="action_decrease_height" msgid="282377193880900022">"Reducer højden"</string>
<string name="widget_resized" msgid="9130327887929620">"Størrelsen for widgetten er ændret til bredde <xliff:g id="NUMBER_0">%1$s</xliff:g> og højde <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Genvejsmenu"</string>
+ <!-- no translation found for widget_frame_name (8782828448471444270) -->
+ <skip />
+ <!-- no translation found for action_close (1077760267194136901) -->
+ <skip />
<string name="action_dismiss_notification" msgid="5909461085055959187">"Afvis"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Luk"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personlig"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Arbejde"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Fanen Personlige apps"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Fanen Arbejdsapps"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Arbejdsprofil"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Arbejdsapps har badges og kan ses af din it-administrator"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"OK"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index ecdc73a..69e1d90 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -131,6 +131,8 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Hintergrund & Stil"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Startbildschirm bearbeiten"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Einstellungen"</string>
+ <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
+ <skip />
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Von deinem Administrator deaktiviert"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Drehen des Startbildschirms zulassen"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Beim Drehen des Smartphones"</string>
@@ -184,14 +186,16 @@
<string name="action_decrease_height" msgid="282377193880900022">"Höhe verringern"</string>
<string name="widget_resized" msgid="9130327887929620">"Größe des Widgets zu Breite <xliff:g id="NUMBER_0">%1$s</xliff:g> und Höhe <xliff:g id="NUMBER_1">%2$s</xliff:g> geändert"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Menü für Tastenkombinationen"</string>
+ <!-- no translation found for widget_frame_name (8782828448471444270) -->
+ <skip />
+ <!-- no translation found for action_close (1077760267194136901) -->
+ <skip />
<string name="action_dismiss_notification" msgid="5909461085055959187">"Schließen"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Schließen"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Privat"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Geschäftlich"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Tab „Private Apps“"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Tab „Geschäftliche Apps“"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Arbeitsprofil"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Geschäftliche Apps sind gekennzeichnet und für deinen IT-Administrator sichtbar"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"OK"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 330c23e..aaa575c 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -131,6 +131,8 @@
<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="msg_disabled_by_admin" msgid="6898038085516271325">"Απενεργοποιήθηκε από τον διαχειριστή σας"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Να επιτρέπεται η περιστροφή της αρχικής οθόνης"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Όταν το τηλέφωνο περιστρέφεται"</string>
@@ -184,14 +186,16 @@
<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="action_dismiss_notification" msgid="5909461085055959187">"Παράβλεψη"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Κλείσιμο"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Προσωπικές"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Εργασίας"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Καρτέλα προσωπικών εφαρμογών"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Καρτέλα εφαρμογών εργασιών"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Προφίλ εργασίας"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Οι εφαρμογές εργασιών φέρουν σήμα και είναι ορατές στον διαχειριστή IT σας"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Το κατάλαβα"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index 6825d80..db602e7 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -131,6 +131,8 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Wallpaper and style"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Edit home screen"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Home settings"</string>
+ <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
+ <skip />
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Disabled by your admin"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Allow home screen rotation"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"When phone is rotated"</string>
@@ -184,14 +186,16 @@
<string name="action_decrease_height" msgid="282377193880900022">"Decrease height"</string>
<string name="widget_resized" msgid="9130327887929620">"Widget re-sized to width <xliff:g id="NUMBER_0">%1$s</xliff:g> height <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Shortcut menu"</string>
+ <!-- no translation found for widget_frame_name (8782828448471444270) -->
+ <skip />
+ <!-- no translation found for action_close (1077760267194136901) -->
+ <skip />
<string name="action_dismiss_notification" msgid="5909461085055959187">"Dismiss"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Close"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personal"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Work"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Personal apps tab"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Work apps tab"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Work profile"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Work apps are badged and visible to your IT admin"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"OK"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-en-rCA/strings.xml b/res/values-en-rCA/strings.xml
index f383e3f..2756feb 100644
--- a/res/values-en-rCA/strings.xml
+++ b/res/values-en-rCA/strings.xml
@@ -131,6 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Wallpaper and style"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Edit Home Screen"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Home settings"</string>
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Apps"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Disabled by your admin"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Allow home screen rotation"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"When phone is rotated"</string>
@@ -184,6 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Decrease height"</string>
<string name="widget_resized" msgid="9130327887929620">"Widget resized to width <xliff:g id="NUMBER_0">%1$s</xliff:g> height <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Shortcut Menu"</string>
+ <string name="widget_frame_name" msgid="8782828448471444270">"Widget Resize Frame for <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Close"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Dismiss"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Close"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personal"</string>
@@ -214,4 +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>
+ <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 6825d80..db602e7 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -131,6 +131,8 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Wallpaper and style"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Edit home screen"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Home settings"</string>
+ <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
+ <skip />
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Disabled by your admin"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Allow home screen rotation"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"When phone is rotated"</string>
@@ -184,14 +186,16 @@
<string name="action_decrease_height" msgid="282377193880900022">"Decrease height"</string>
<string name="widget_resized" msgid="9130327887929620">"Widget re-sized to width <xliff:g id="NUMBER_0">%1$s</xliff:g> height <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Shortcut menu"</string>
+ <!-- no translation found for widget_frame_name (8782828448471444270) -->
+ <skip />
+ <!-- no translation found for action_close (1077760267194136901) -->
+ <skip />
<string name="action_dismiss_notification" msgid="5909461085055959187">"Dismiss"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Close"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personal"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Work"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Personal apps tab"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Work apps tab"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Work profile"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Work apps are badged and visible to your IT admin"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"OK"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index 6825d80..db602e7 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -131,6 +131,8 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Wallpaper and style"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Edit home screen"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Home settings"</string>
+ <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
+ <skip />
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Disabled by your admin"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Allow home screen rotation"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"When phone is rotated"</string>
@@ -184,14 +186,16 @@
<string name="action_decrease_height" msgid="282377193880900022">"Decrease height"</string>
<string name="widget_resized" msgid="9130327887929620">"Widget re-sized to width <xliff:g id="NUMBER_0">%1$s</xliff:g> height <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Shortcut menu"</string>
+ <!-- no translation found for widget_frame_name (8782828448471444270) -->
+ <skip />
+ <!-- no translation found for action_close (1077760267194136901) -->
+ <skip />
<string name="action_dismiss_notification" msgid="5909461085055959187">"Dismiss"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Close"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personal"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Work"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Personal apps tab"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Work apps tab"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Work profile"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Work apps are badged and visible to your IT admin"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"OK"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index a287135..6dd87e1 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -131,6 +131,8 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Fondo de pantalla y estilo"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Editar pantalla principal"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Configuración de pantalla principal"</string>
+ <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
+ <skip />
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"El administrador inhabilitó esta función"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Permitir la rotación de la pantalla principal"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Al girar el teléfono"</string>
@@ -184,6 +186,10 @@
<string name="action_decrease_height" msgid="282377193880900022">"Reducir la altura"</string>
<string name="widget_resized" msgid="9130327887929620">"Se cambió la dimensión del widget a <xliff:g id="NUMBER_0">%1$s</xliff:g> de ancho y <xliff:g id="NUMBER_1">%2$s</xliff:g> de alto."</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Menú de accesos directos"</string>
+ <!-- no translation found for widget_frame_name (8782828448471444270) -->
+ <skip />
+ <!-- no translation found for action_close (1077760267194136901) -->
+ <skip />
<string name="action_dismiss_notification" msgid="5909461085055959187">"Descartar"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Cerrar"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personal"</string>
@@ -214,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index e3ab38d..c604da7 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -131,6 +131,8 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Fondo de pantalla y estilo"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Editar pantalla de inicio"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Ajustes de la pantalla de inicio"</string>
+ <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
+ <skip />
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Inhabilitado por el administrador"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Permitir rotación de la pantalla de inicio"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Al girar el teléfono"</string>
@@ -184,14 +186,16 @@
<string name="action_decrease_height" msgid="282377193880900022">"Reducir altura"</string>
<string name="widget_resized" msgid="9130327887929620">"Se ha modificado el tamaño del widget a <xliff:g id="NUMBER_0">%1$s</xliff:g> de ancho y <xliff:g id="NUMBER_1">%2$s</xliff:g> de alto"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Menú de combinaciones de teclas"</string>
+ <!-- no translation found for widget_frame_name (8782828448471444270) -->
+ <skip />
+ <!-- no translation found for action_close (1077760267194136901) -->
+ <skip />
<string name="action_dismiss_notification" msgid="5909461085055959187">"Cerrar"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Cerrar"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personal"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Trabajo"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Pestaña Aplicaciones personales"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Pestaña Aplicaciones de trabajo"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Perfil de trabajo"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Las aplicaciones de trabajo tienen una insignia, y tu administrador de TI las puede ver"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Entendido"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index 3df323d..3d270c9 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -131,6 +131,8 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Taustapilt ja stiil"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Muuda avaekraani"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Avakuva seaded"</string>
+ <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
+ <skip />
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Keelas administraator"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Luba avakuva pööramine"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Kui telefoni pööratakse"</string>
@@ -184,14 +186,16 @@
<string name="action_decrease_height" msgid="282377193880900022">"Vähenda kõrgust"</string>
<string name="widget_resized" msgid="9130327887929620">"Vidina suurust muudeti. Laius: <xliff:g id="NUMBER_0">%1$s</xliff:g>. Kõrgus: <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Kiirmenüü"</string>
+ <!-- no translation found for widget_frame_name (8782828448471444270) -->
+ <skip />
+ <!-- no translation found for action_close (1077760267194136901) -->
+ <skip />
<string name="action_dismiss_notification" msgid="5909461085055959187">"Loobu"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Sule"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Isiklik"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Töö"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Vahekaart Isiklikud rakendused"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Vahekaart töörakendused"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Tööprofiil"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Töörakendustel on märk ja need on teie IT-administraatorile nähtavad"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Selge"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml
index 0b30b38..07a75a1 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -131,6 +131,8 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Horma-papera eta estiloa"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Editatu orri nagusia"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Orri nagusiaren ezarpenak"</string>
+ <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
+ <skip />
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Administratzaileak desgaitu du"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Eman orri nagusia biratzeko baimena"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Telefonoa biratzean"</string>
@@ -184,14 +186,16 @@
<string name="action_decrease_height" msgid="282377193880900022">"Txikitu altuera"</string>
<string name="widget_resized" msgid="9130327887929620">"Aldatu da widgetaren tamaina. Zabalera: <xliff:g id="NUMBER_0">%1$s</xliff:g>. Altuera: <xliff:g id="NUMBER_1">%2$s</xliff:g>."</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Lasterbideen menua"</string>
+ <!-- no translation found for widget_frame_name (8782828448471444270) -->
+ <skip />
+ <!-- no translation found for action_close (1077760267194136901) -->
+ <skip />
<string name="action_dismiss_notification" msgid="5909461085055959187">"Baztertu"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Itxi"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Pertsonalak"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Lanekoak"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Aplikazio pertsonalen fitxa"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Laneko aplikazioen fitxa"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Laneko profila"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Laneko aplikazioek bereizgarriak dituzte, eta IKT saileko administratzaileak ikus ditzake"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Ados"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 671c7f2..4afde8a 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -131,6 +131,8 @@
<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="msg_disabled_by_admin" msgid="6898038085516271325">"توسط سرپرست سیستم غیرفعال شده است"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"مجاز کردن چرخش صفحه اصلی"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"وقتی تلفن چرخانده میشود"</string>
@@ -184,14 +186,16 @@
<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="action_dismiss_notification" msgid="5909461085055959187">"رد کردن"</string>
<string name="accessibility_close" msgid="2277148124685870734">"بستن"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"شخصی"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"کاری"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"برگه برنامههای شخصی"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"برگه برنامههای کاری"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"نمایه کاری"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"برنامههای کاری نشاندار هستند و سرپرست فناوری اطلاعات میتواند آنها را ببیند"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"متوجهم"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 49b2b57..8a0de4c 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -131,6 +131,8 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Taustakuva ja tyyli"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Muokkaa aloitusnäyttöä"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Aloitusnäyttö"</string>
+ <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
+ <skip />
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Järjestelmänvalvoja on poistanut toiminnon käytöstä."</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Salli aloitusnäytön kiertäminen"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Kun puhelinta kierretään"</string>
@@ -184,14 +186,16 @@
<string name="action_decrease_height" msgid="282377193880900022">"Vähennä korkeutta"</string>
<string name="widget_resized" msgid="9130327887929620">"Widgetin kokoa muutettiin. Sen leveys on nyt <xliff:g id="NUMBER_0">%1$s</xliff:g> ja korkeus <xliff:g id="NUMBER_1">%2$s</xliff:g>."</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Pikanäppäinvalikko"</string>
+ <!-- no translation found for widget_frame_name (8782828448471444270) -->
+ <skip />
+ <!-- no translation found for action_close (1077760267194136901) -->
+ <skip />
<string name="action_dismiss_notification" msgid="5909461085055959187">"Hylkää"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Sulje"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Henkilökohtaiset"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Työsovellukset"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Henkilökohtaiset sovellukset ‑välilehti"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Työsovellukset-välilehti"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Työprofiili"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Työsovellukset on merkitty sellaisiksi ja näkyvät IT-järjestelmänvalvojille"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Selvä"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 6c39282..159d980 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -131,6 +131,8 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Fond d\'écran et style"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Modifier l\'écran d\'accueil"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Paramètres d\'accueil"</string>
+ <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
+ <skip />
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Cette fonction est désactivée par votre administrateur"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Autoriser la rotation de l\'écran d\'accueil"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Lorsque vous faites pivoter le téléphone"</string>
@@ -184,14 +186,16 @@
<string name="action_decrease_height" msgid="282377193880900022">"Diminuer la hauteur"</string>
<string name="widget_resized" msgid="9130327887929620">"Le widget a été redimensionné (largeur : <xliff:g id="NUMBER_0">%1$s</xliff:g>, hauteur : <xliff:g id="NUMBER_1">%2$s</xliff:g>)"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Menu des raccourcis"</string>
+ <!-- no translation found for widget_frame_name (8782828448471444270) -->
+ <skip />
+ <!-- no translation found for action_close (1077760267194136901) -->
+ <skip />
<string name="action_dismiss_notification" msgid="5909461085055959187">"Ignorer"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Fermer"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personnel"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Travail"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Onglet Applis personnelles"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Onglet Applis professionnelles"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Profil professionnel"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Les applis professionnelles sont indiquées par un badge et elles sont visibles pour votre administrateur informatique"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"OK"</string>
@@ -216,4 +220,6 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Transition vers l\'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 />
</resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 73902b4..837425b 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -131,11 +131,13 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Fond d\'écran et style"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Modifier l\'écran d\'accueil"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Paramètres de l\'accueil"</string>
+ <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
+ <skip />
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Désactivé par votre administrateur"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Autoriser la rotation de l\'écran d\'accueil"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Lorsque vous faites pivoter le téléphone"</string>
<string name="landscape_mode_title" msgid="5138814555934843926">"Mode Paysage"</string>
- <string name="landscape_mode_desc" msgid="7372569859592816793">"Placez le téléphone en mode Paysage"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Paramétrer le téléphone en mode Paysage"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Pastilles de notification"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Activées"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Désactivées"</string>
@@ -184,14 +186,16 @@
<string name="action_decrease_height" msgid="282377193880900022">"Diminuer la hauteur"</string>
<string name="widget_resized" msgid="9130327887929620">"Le widget a bien été redimensionné (largeur : <xliff:g id="NUMBER_0">%1$s</xliff:g>, hauteur : <xliff:g id="NUMBER_1">%2$s</xliff:g>)."</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Menu de raccourci"</string>
+ <!-- no translation found for widget_frame_name (8782828448471444270) -->
+ <skip />
+ <!-- no translation found for action_close (1077760267194136901) -->
+ <skip />
<string name="action_dismiss_notification" msgid="5909461085055959187">"Ignorer"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Fermer"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personnel"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Professionnel"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Onglet \"Applications personnelles\""</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Onglet \"Applications professionnelles\""</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Profil professionnel"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Les applis professionnelles sont identifiées par un badge et votre administrateur informatique peut les voir"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"OK"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index 1619b14..5c9b179 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -131,6 +131,8 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Estilo e fondo de pantalla"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Editar pantalla de inicio"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Configuración da pantalla de inicio"</string>
+ <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
+ <skip />
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Función desactivada polo administrador"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Permitir xirar a pantalla de inicio"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Ao xirar o teléfono"</string>
@@ -184,14 +186,16 @@
<string name="action_decrease_height" msgid="282377193880900022">"Reducir altura"</string>
<string name="widget_resized" msgid="9130327887929620">"Cambiouse o tamaño do widget polo ancho <xliff:g id="NUMBER_0">%1$s</xliff:g> e a altura <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Menú do atallo"</string>
+ <!-- no translation found for widget_frame_name (8782828448471444270) -->
+ <skip />
+ <!-- no translation found for action_close (1077760267194136901) -->
+ <skip />
<string name="action_dismiss_notification" msgid="5909461085055959187">"Pechar"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Pechar"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Persoal"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Traballo"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Pestana de aplicacións persoais"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Pestana de aplicacións do traballo"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Perfil de traballo"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"O administrador de TI pode ver as aplicacións do traballo e engadirlles indicadores"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Entendido"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
index bd40d19..5f9407b 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -131,6 +131,8 @@
<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="msg_disabled_by_admin" msgid="6898038085516271325">"તમારા વ્યવસ્થાપક દ્વારા અક્ષમ કરેલ"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"હોમ સ્ક્રીનને ફેરવવાની મંજૂરી આપો"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"જ્યારે ફોન ફેરવવામાં આવે ત્યારે"</string>
@@ -184,6 +186,10 @@
<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="action_dismiss_notification" msgid="5909461085055959187">"છોડી દો"</string>
<string name="accessibility_close" msgid="2277148124685870734">"બંધ કરો"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"વ્યક્તિગત ઍપ"</string>
@@ -216,4 +222,6 @@
<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 />
</resources>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 15485a2..5bd0c6f 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -131,6 +131,8 @@
<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="msg_disabled_by_admin" msgid="6898038085516271325">"आपके एडमिन ने बंद किया हुआ है"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"होम स्क्रीन घुमाने की अनुमति दें"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"फ़ोन घुुमाए जाने पर"</string>
@@ -184,14 +186,16 @@
<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="action_dismiss_notification" msgid="5909461085055959187">"खारिज करें"</string>
<string name="accessibility_close" msgid="2277148124685870734">"बंद करें"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"निजी ऐप्लिकेशन"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"वर्क ऐप्लिकेशन"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"निजी ऐप्लिकेशन टैब"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"वर्क ऐप्लिकेशन टैब"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"वर्क प्रोफ़ाइल"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"वर्क ऐप्लिकेशन बैज किए गए हैं. आईटी एडमिन इन्हें देख सकता है"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"ठीक है"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 48069a2..6ff7441 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -131,11 +131,13 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Pozadina i stil"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Uredi početni zaslon"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Postavke početnog zaslona"</string>
+ <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
+ <skip />
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Onemogućio administrator"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Dopusti zakretanje početnog zaslona"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Kada se telefon zakrene"</string>
<string name="landscape_mode_title" msgid="5138814555934843926">"Pejzažni način"</string>
- <string name="landscape_mode_desc" msgid="7372569859592816793">"Postavljanje telefona u pejzažni način"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Telefon se postavlja u pejzažni način"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Točke obavijesti"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Uključeno"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Isključeno"</string>
@@ -184,14 +186,16 @@
<string name="action_decrease_height" msgid="282377193880900022">"Smanjenje visine"</string>
<string name="widget_resized" msgid="9130327887929620">"Širina widgeta promijenjena je na <xliff:g id="NUMBER_0">%1$s</xliff:g>, a visina na <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Izbornik prečaca"</string>
+ <!-- no translation found for widget_frame_name (8782828448471444270) -->
+ <skip />
+ <!-- no translation found for action_close (1077760267194136901) -->
+ <skip />
<string name="action_dismiss_notification" msgid="5909461085055959187">"Odbaci"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Zatvori"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Osobno"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Posao"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Kartica osobnih aplikacija"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Kartica poslovnih aplikacija"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Poslovni profil"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Poslovne su aplikacije označene i vidljive vašem IT administratoru"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Shvaćam"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index a298738..5920dff 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -131,6 +131,8 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Háttérkép és stílus"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Kezdőképernyő szerkesztése"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Kezdőképernyő beállításai"</string>
+ <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
+ <skip />
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"A rendszergazda letiltotta"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"A kezdőképernyő elforgatásának engedélyezése"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"A telefon elforgatásakor"</string>
@@ -184,14 +186,16 @@
<string name="action_decrease_height" msgid="282377193880900022">"Magasság csökkentése"</string>
<string name="widget_resized" msgid="9130327887929620">"Modul átméretezve <xliff:g id="NUMBER_0">%1$s</xliff:g> szélességre és <xliff:g id="NUMBER_1">%2$s</xliff:g> magasságra"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Gyorsparancsok menüje"</string>
+ <!-- no translation found for widget_frame_name (8782828448471444270) -->
+ <skip />
+ <!-- no translation found for action_close (1077760267194136901) -->
+ <skip />
<string name="action_dismiss_notification" msgid="5909461085055959187">"Elvetés"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Bezárás"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Személyes"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Munkahelyi"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Személyes alkalmazások lap"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Munkahelyi alkalmazások lap"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Munkaprofil"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"A munkahelyi alkalmazások jelvénnyel vannak megjelölve, és ezeket láthatja a rendszergazda"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Értem"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml
index 7d805a6..38e0bf1 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -131,6 +131,8 @@
<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="msg_disabled_by_admin" msgid="6898038085516271325">"Անջատվել է ձեր ադմինիստրատորի կողմից"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Թույլ տալ հիմնական էկրանի պտտումը"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Հեռախոսը պտտելու դեպքում"</string>
@@ -184,14 +186,16 @@
<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="action_dismiss_notification" msgid="5909461085055959187">"Անտեսել"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Փակել"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Անձնական"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Աշխատանքային"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Անձնական հավելվածների ներդիր"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Աշխատանքային հավելվածների ներդիր"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Աշխատանքային պրոֆիլ"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Աշխատանքային հավելվածները հատուկ նշանակ ունեն և տեսանելի են ՏՏ ադմինիստրատորին"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Եղավ"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 047c074..a850e9c 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -131,6 +131,8 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Wallpaper & gaya"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Edit Layar Utama"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Setelan layar utama"</string>
+ <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
+ <skip />
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Dinonaktifkan oleh admin"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Izinkan layar utama diputar"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Saat ponsel diputar"</string>
@@ -184,14 +186,16 @@
<string name="action_decrease_height" msgid="282377193880900022">"Kurangi tinggi"</string>
<string name="widget_resized" msgid="9130327887929620">"Widget diubah ukurannya menjadi lebar <xliff:g id="NUMBER_0">%1$s</xliff:g> tinggi <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Menu Pintasan"</string>
+ <!-- no translation found for widget_frame_name (8782828448471444270) -->
+ <skip />
+ <!-- no translation found for action_close (1077760267194136901) -->
+ <skip />
<string name="action_dismiss_notification" msgid="5909461085055959187">"Tutup"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Tutup"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Pribadi"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Kerja"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Tab aplikasi pribadi"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Tab aplikasi kerja"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Profil kerja"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Aplikasi kerja diberi badge dan terlihat oleh admin IT"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Oke"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml
index 19b967f..0dbcda2 100644
--- a/res/values-is/strings.xml
+++ b/res/values-is/strings.xml
@@ -131,6 +131,8 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Veggfóður og stíll"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Breyta heimaskjá"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Heimastillingar"</string>
+ <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
+ <skip />
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Gert óvirkt af kerfisstjóra"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Leyfa snúning á heimaskjá"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Þegar símanum er snúið"</string>
@@ -184,6 +186,10 @@
<string name="action_decrease_height" msgid="282377193880900022">"Minnka hæð"</string>
<string name="widget_resized" msgid="9130327887929620">"Stærð græju breytt í <xliff:g id="NUMBER_0">%1$s</xliff:g> á breidd og <xliff:g id="NUMBER_1">%2$s</xliff:g> á hæð"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Flýtileiðavalmynd"</string>
+ <!-- no translation found for widget_frame_name (8782828448471444270) -->
+ <skip />
+ <!-- no translation found for action_close (1077760267194136901) -->
+ <skip />
<string name="action_dismiss_notification" msgid="5909461085055959187">"Hunsa"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Loka"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Persónulegt"</string>
@@ -214,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index fd747d1..29e28e1 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -131,6 +131,8 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Sfondo e stile"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Modifica schermata Home"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Impostazioni schermata Home"</string>
+ <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
+ <skip />
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Disattivata dall\'amministratore"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Consenti rotazione della schermata Home"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Con il telefono ruotato"</string>
@@ -184,6 +186,10 @@
<string name="action_decrease_height" msgid="282377193880900022">"Riduci altezza"</string>
<string name="widget_resized" msgid="9130327887929620">"Widget ridimensionato a larghezza <xliff:g id="NUMBER_0">%1$s</xliff:g>, altezza <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Menu scorciatoie"</string>
+ <!-- no translation found for widget_frame_name (8782828448471444270) -->
+ <skip />
+ <!-- no translation found for action_close (1077760267194136901) -->
+ <skip />
<string name="action_dismiss_notification" msgid="5909461085055959187">"Ignora"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Esci"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personali"</string>
@@ -214,4 +220,6 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Transizione dello Spazio privato in corso…"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Installa"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Installa le app su spazi privati"</string>
+ <!-- no translation found for ps_app_content_description (1129133475892816226) -->
+ <skip />
</resources>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index e829738..1d3eef1 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -131,6 +131,8 @@
<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="msg_disabled_by_admin" msgid="6898038085516271325">"הושבת על ידי מנהל המערכת שלך"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"סיבוב מסך הבית"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"כאשר מסובבים את הטלפון"</string>
@@ -184,14 +186,16 @@
<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="action_dismiss_notification" msgid="5909461085055959187">"סגירה"</string>
<string name="accessibility_close" msgid="2277148124685870734">"סגירה"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"אישי"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"עבודה"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"הכרטיסייה \"אפליקציות לשימוש אישי\""</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"הכרטיסייה \"אפליקציות לעבודה\""</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"פרופיל עבודה"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"האפליקציות לעבודה מתויגות ומוצגות למנהל ה-IT"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"הבנתי"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 1e530cd..9cc6a83 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -131,6 +131,8 @@
<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="msg_disabled_by_admin" msgid="6898038085516271325">"管理者により無効にされています"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"ホーム画面の回転を許可"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"スマートフォンの向きに合わせます"</string>
@@ -184,6 +186,10 @@
<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="action_dismiss_notification" msgid="5909461085055959187">"表示しない"</string>
<string name="accessibility_close" msgid="2277148124685870734">"閉じる"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"個人用"</string>
@@ -214,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml
index 4cd473b..108176b 100644
--- a/res/values-ka/strings.xml
+++ b/res/values-ka/strings.xml
@@ -131,6 +131,8 @@
<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="msg_disabled_by_admin" msgid="6898038085516271325">"გათიშულია თქვენი ადმინისტრატორის მიერ"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"მთავარი ეკრანის შეტრიალების დაშვება"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"ტელეფონის შეტრიალებისას"</string>
@@ -184,6 +186,10 @@
<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="action_dismiss_notification" msgid="5909461085055959187">"დახურვა"</string>
<string name="accessibility_close" msgid="2277148124685870734">"დახურვა"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"პირადი"</string>
@@ -214,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml
index c60376b..c789a8f 100644
--- a/res/values-kk/strings.xml
+++ b/res/values-kk/strings.xml
@@ -131,6 +131,8 @@
<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="msg_disabled_by_admin" msgid="6898038085516271325">"Әкімші өшірді"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Негізгі экранды бұруға рұқсат ету"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Телефон бұрылғанда"</string>
@@ -184,14 +186,16 @@
<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="action_dismiss_notification" msgid="5909461085055959187">"Бас тарту"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Жабу"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Жеке"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Жұмыс"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Жеке қолданбалар қойындысы"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Жұмыс қолданбалары қойындысы"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Жұмыс профилі"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Жұмыс қолданбаларының танымбелгілері бар және олар әкімшіңізге көрінеді."</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Түсінікті"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml
index 5dbae5f..1c12f04 100644
--- a/res/values-km/strings.xml
+++ b/res/values-km/strings.xml
@@ -131,6 +131,8 @@
<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="msg_disabled_by_admin" msgid="6898038085516271325">"បានបិទដំណើរការដោយអ្នកគ្រប់គ្រងរបស់អ្នក"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"អនុញ្ញាតការបងិ្វលអេក្រង់ដើម"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"នៅពេលដែលបង្វិលទូរសព្ទ"</string>
@@ -184,6 +186,10 @@
<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="action_dismiss_notification" msgid="5909461085055959187">"ច្រានចោល"</string>
<string name="accessibility_close" msgid="2277148124685870734">"បិទ"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"ផ្ទាល់ខ្លួន"</string>
@@ -214,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
index cd5d59d..e30b80b 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -131,6 +131,8 @@
<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="msg_disabled_by_admin" msgid="6898038085516271325">"ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ್ದಾರೆ"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"ಹೋಮ್ ಸ್ಕ್ರೀನ್ ತಿರುಗುವಿಕೆಯನ್ನು ಅನುಮತಿಸಿ"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"ಫೋನ್ ತಿರುಗಿಸಿದಾಗ"</string>
@@ -184,14 +186,16 @@
<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="action_dismiss_notification" msgid="5909461085055959187">"ವಜಾಗೊಳಿಸಿ"</string>
<string name="accessibility_close" msgid="2277148124685870734">"ಮುಚ್ಚಿರಿ"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"ವೈಯಕ್ತಿಕ"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"ಕೆಲಸ"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"ವೈಯಕ್ತಿಕ ಆ್ಯಪ್ಗಳ ಟ್ಯಾಬ್"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"ಕೆಲಸಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಆ್ಯಪ್ಗಳ ಟ್ಯಾಬ್"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"ಕೆಲಸದ ಪ್ರೊಫೈಲ್"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"ಕೆಲಸಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಆ್ಯಪ್ಗಳನ್ನು ಬ್ಯಾಡ್ಜ್ ಮಾಡಲಾಗಿದೆ ಮತ್ತು ಅವುಗಳು ನಿಮ್ಮ IT ನಿರ್ವಾಹಕರಿಗೆ ಗೋಚರಿಸುತ್ತವೆ"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"ಸರಿ"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 24053c8..1d60d88 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -131,6 +131,8 @@
<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="msg_disabled_by_admin" msgid="6898038085516271325">"관리자가 사용 중지함"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"홈 화면 회전 허용"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"휴대전화 회전 시"</string>
@@ -184,14 +186,16 @@
<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="action_dismiss_notification" msgid="5909461085055959187">"닫기"</string>
<string name="accessibility_close" msgid="2277148124685870734">"닫기"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"개인"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"직장"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"개인 앱 탭"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"직장 앱 탭"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"직장 프로필"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"직장 앱에는 배지가 있으며, IT 관리자는 직장 앱을 확인할 수 있습니다"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"확인"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml
index 2ad0668..638e107 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -131,6 +131,8 @@
<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="msg_disabled_by_admin" msgid="6898038085516271325">"Администраторуңуз өчүрүп койгон"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Башкы экранды бурууга уруксат берүү"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Телефон бурулганда"</string>
@@ -184,14 +186,16 @@
<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="action_dismiss_notification" msgid="5909461085055959187">"Этибарга албоо"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Жабуу"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Жеке колдонмолор"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Жумуш колдонмолору"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Жеке колдонмолор өтмөгү"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Жумуш колдонмолор өтмөгү"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Жумуш профили"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Жумуш колдонмолору белгиленип, аларды IT администраторлору көрөт"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Түшүндүм"</string>
@@ -216,4 +220,6 @@
<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">"Колдонмолорду Жеке мейкиндикке орнотуe"</string>
+ <!-- no translation found for ps_app_content_description (1129133475892816226) -->
+ <skip />
</resources>
diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml
index 2aaf40b..d459fd9 100644
--- a/res/values-lo/strings.xml
+++ b/res/values-lo/strings.xml
@@ -131,6 +131,8 @@
<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="msg_disabled_by_admin" msgid="6898038085516271325">"ຖືກປິດການນຳໃຊ້ໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"ອະນຸຍາດໃຫ້ໝຸນໜ້າຈໍຢູ່ໂຮມສະກຣີນໄດ້"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"ເມື່ອໝຸນໂທລະສັບ"</string>
@@ -184,14 +186,16 @@
<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="action_dismiss_notification" msgid="5909461085055959187">"ປິດໄວ້"</string>
<string name="accessibility_close" msgid="2277148124685870734">"ປິດ"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"ສ່ວນຕົວ"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"ວຽກ"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"ແຖບແອັບສ່ວນຕົວ"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"ແຖບແອັບບ່ອນເຮັດວຽກ"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"ໂປຣໄຟລ໌ບ່ອນເຮັດວຽກ"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"ແອັບບ່ອນເຮັດວຽກແມ່ນຖືກຕິດປ້າຍ ແລະ ສະແດງໃຫ້ຜູ້ເບິ່ງແຍງໄອທີຂອງທ່ານເຫັນ"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"ເຂົ້າໃຈແລ້ວ"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index aeba444..2421ddd 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -131,6 +131,8 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Ekrano fonas ir stilius"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Redaguoti pagrindinį ekraną"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Pagrindinio ekrano nustatymai"</string>
+ <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
+ <skip />
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Išjungė administratorius"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Leisti pasukti pagrindinį ekraną"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Kai telefonas pasukamas"</string>
@@ -184,14 +186,16 @@
<string name="action_decrease_height" msgid="282377193880900022">"Sumažinti aukštį"</string>
<string name="widget_resized" msgid="9130327887929620">"Valdiklio dydis pakeistas: plotis – <xliff:g id="NUMBER_0">%1$s</xliff:g>, aukštis – <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Sparčiųjų klavišų meniu"</string>
+ <!-- no translation found for widget_frame_name (8782828448471444270) -->
+ <skip />
+ <!-- no translation found for action_close (1077760267194136901) -->
+ <skip />
<string name="action_dismiss_notification" msgid="5909461085055959187">"Atsisakyti"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Uždaryti"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Asmeninės"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Darbo"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Asmeninių programų skirtukas"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Darbo programų skirtukas"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Darbo profilis"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Darbo programos yra pažymėtos ženkleliu ir matomos IT administratoriui"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Supratau"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index e1b9b34..fa4dd27 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -131,6 +131,8 @@
<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="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>
@@ -184,14 +186,16 @@
<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="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>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Darba lietotnes"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Cilne Personīgās lietotnes"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Cilne Darba lietotnes"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Darba profils"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Darba lietotnēm ir pievienota emblēma, un tās ir redzamas jūsu IT administratoram"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Labi"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
index 8ab50b8..aebd1f1 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -131,6 +131,8 @@
<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="msg_disabled_by_admin" msgid="6898038085516271325">"Оневозможено од администраторот"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Дозволи ротирање на почетниот екран"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Кога телефонот се ротира"</string>
@@ -184,14 +186,16 @@
<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="action_dismiss_notification" msgid="5909461085055959187">"Отфрли"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Затвори"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Лично"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"За работа"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Картичка „Лични апликации“"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Картичка „Работни апликации“"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Работен профил"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Работните апликации имаат значка и се видливи за IT-администраторот"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Сфатив"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml
index d6df3ac..68d484b 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -131,6 +131,8 @@
<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="msg_disabled_by_admin" msgid="6898038085516271325">"അഡ്മിൻ പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"ഹോം സ്ക്രീൻ റൊട്ടേഷൻ അനുവദിക്കുക"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"ഫോൺ തിരിച്ച നിലയിലായിരിക്കുമ്പോൾ"</string>
@@ -184,14 +186,16 @@
<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="action_dismiss_notification" msgid="5909461085055959187">"നിരസിക്കുക"</string>
<string name="accessibility_close" msgid="2277148124685870734">"അടയ്ക്കൂ"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"വ്യക്തിപരം"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Work"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"വ്യക്തിപര ആപ്പുകളുടെ ടാബ്"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"ഔദ്യോഗിക ആപ്പുകളുടെ ടാബ്"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"ഔദ്യോഗിക പ്രൊഫൈൽ"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"ഔദ്യോഗിക ആപ്പുകൾക്ക് ബാഡ്ജ് നൽകിയിരിക്കുന്നു, അവ നിങ്ങളുടെ ഐടി അഡ്മിന് കാണാനുമാകും"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"മനസ്സിലായി"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml
index 7803296..1eeea10 100644
--- a/res/values-mn/strings.xml
+++ b/res/values-mn/strings.xml
@@ -131,6 +131,8 @@
<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="msg_disabled_by_admin" msgid="6898038085516271325">"Таны админ идэвхгүй болгосон"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Үндсэн нүүрийг эргүүлэхийг зөвшөөрөх"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Утсыг эргүүлсэн үед"</string>
@@ -184,14 +186,16 @@
<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="action_dismiss_notification" msgid="5909461085055959187">"Хаах"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Хаах"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Хувийн"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Ажил"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Хувийн апп таб"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Ажлын апп таб"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Ажлын профайл"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Ажлын аппуудыг тэмдэглэсэн бөгөөд танай IT админд харагдана"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Ойлголоо"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml
index b0cda77..5c19b74 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -131,6 +131,8 @@
<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="msg_disabled_by_admin" msgid="6898038085516271325">"आपल्या प्रशासकाने अक्षम केले"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"होम स्क्रीन फिरवण्याची अनुमती द्या"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"फोन फिरवला जातो तेव्हा"</string>
@@ -184,14 +186,16 @@
<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="action_dismiss_notification" msgid="5909461085055959187">"डिसमिस करा"</string>
<string name="accessibility_close" msgid="2277148124685870734">"बंद करा"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"वैयक्तिक"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"कार्य"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"वैयक्तिक ॲप्स टॅब"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Work apps टॅब"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"कार्य प्रोफाइल"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"कार्य ॲप्स ही बॅज केलेली असून तुमच्या आयटी ॲडमिनला दृश्यमान आहेत"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"समजले"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index c4d97d5..4982d02 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -131,6 +131,8 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Hiasan latar & gaya"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Edit Skrin Utama"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Tetapan skrin utama"</string>
+ <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
+ <skip />
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Dilumpuhkan oleh pentadbir anda"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Benarkan putaran skrin utama"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Apabila telefon diputar"</string>
@@ -184,6 +186,10 @@
<string name="action_decrease_height" msgid="282377193880900022">"Kurangkan ketinggian"</string>
<string name="widget_resized" msgid="9130327887929620">"Saiz widget diubah menjadi <xliff:g id="NUMBER_0">%1$s</xliff:g> lebar <xliff:g id="NUMBER_1">%2$s</xliff:g> tinggi"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Menu Pintasan"</string>
+ <!-- no translation found for widget_frame_name (8782828448471444270) -->
+ <skip />
+ <!-- no translation found for action_close (1077760267194136901) -->
+ <skip />
<string name="action_dismiss_notification" msgid="5909461085055959187">"Ketepikan"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Tutup"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Peribadi"</string>
@@ -214,4 +220,6 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Peralihan Ruang Peribadi"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Pasang"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Pasang apl pada Ruang Peribadi"</string>
+ <!-- no translation found for ps_app_content_description (1129133475892816226) -->
+ <skip />
</resources>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index 75e87f4..9ef1758 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -131,6 +131,8 @@
<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="msg_disabled_by_admin" msgid="6898038085516271325">"သင့်စီမံခန့်ခွဲသူက ပိတ်လိုက်ပါသည်"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"ပင်မစာမျက်နှာလှည့်ခြင်းကို ခွင့်ပြုခြင်း"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"ဖုန်းကိုလှည့်ထားစဉ်"</string>
@@ -184,14 +186,16 @@
<string name="action_decrease_height" msgid="282377193880900022">"အမြင့်အား လျှော့ပါ"</string>
<string name="widget_resized" msgid="9130327887929620">"Widget အား အကျယ် <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="action_dismiss_notification" msgid="5909461085055959187">"ပယ်ရန်"</string>
<string name="accessibility_close" msgid="2277148124685870734">"ပိတ်ရန်"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"ကိုယ်ပိုင်"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"အလုပ်"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"ကိုယ်ရေးသုံးအက်ပ် တဘ်"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"အလုပ်သုံးအက်ပ် တဘ်"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"အလုပ်ပရိုဖိုင်"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"အလုပ်သုံးအက်ပ်များကို တံဆိပ်တပ်ထားပြီး သင်၏ IT စီမံခန့်ခွဲသူက မြင်နိုင်ပါသည်"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"ရပါပြီ"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index d7497cd..4fb3642 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -131,6 +131,8 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Bakgrunn og stil"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Endre startsiden"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Startsideinnstillinger"</string>
+ <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
+ <skip />
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Administratoren har slått av funksjonen"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Tillat at startskjermen roterer"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Når telefonen roteres"</string>
@@ -184,14 +186,16 @@
<string name="action_decrease_height" msgid="282377193880900022">"Reduser høyden"</string>
<string name="widget_resized" msgid="9130327887929620">"Størrelsen på modulen er endret til bredde <xliff:g id="NUMBER_0">%1$s</xliff:g> og høyde <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Hurtigtastmeny"</string>
+ <!-- no translation found for widget_frame_name (8782828448471444270) -->
+ <skip />
+ <!-- no translation found for action_close (1077760267194136901) -->
+ <skip />
<string name="action_dismiss_notification" msgid="5909461085055959187">"Avvis"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Lukk"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personlig"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Jobb"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Personlige apper-fane"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Jobbapper-fane"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Jobbprofil"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Jobbapper er merket og synlige for IT-administratoren"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Greit"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
index bbe8233..38167de 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -131,6 +131,8 @@
<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="msg_disabled_by_admin" msgid="6898038085516271325">"तपाईँको प्रशासकद्वारा असक्षम गरिएको"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"होम स्क्रिन रोटेट हुन दिइयोस्"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"फोन घुमाउँदा"</string>
@@ -184,6 +186,10 @@
<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="action_dismiss_notification" msgid="5909461085055959187">"खारेज गर्नुहोस्"</string>
<string name="accessibility_close" msgid="2277148124685870734">"बन्द गर्नुहोस्"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"व्यक्तिगत"</string>
@@ -216,4 +222,6 @@
<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 />
</resources>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 971eee9..2b99b69 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -131,6 +131,8 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Achtergrond en stijl"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Startscherm bewerken"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Instellingen Start"</string>
+ <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
+ <skip />
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Uitgezet door je beheerder"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Draaien van startscherm toestaan"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Als de telefoon gedraaid is"</string>
@@ -184,14 +186,16 @@
<string name="action_decrease_height" msgid="282377193880900022">"Hoogte verkleinen"</string>
<string name="widget_resized" msgid="9130327887929620">"Formaat van widget gewijzigd in breedte <xliff:g id="NUMBER_0">%1$s</xliff:g> en hoogte <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Snelmenu"</string>
+ <!-- no translation found for widget_frame_name (8782828448471444270) -->
+ <skip />
+ <!-- no translation found for action_close (1077760267194136901) -->
+ <skip />
<string name="action_dismiss_notification" msgid="5909461085055959187">"Sluiten"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Sluiten"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Privé"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Werk"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Tabblad Persoonlijke apps"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Tabblad Werk-apps"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Werkprofiel"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Werk-apps hebben badges en zijn zichtbaar voor je IT-beheerder"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"OK"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml
index d5b87dc..2b924de 100644
--- a/res/values-or/strings.xml
+++ b/res/values-or/strings.xml
@@ -131,6 +131,8 @@
<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="msg_disabled_by_admin" msgid="6898038085516271325">"ଆପଣଙ୍କ ଆଡମିନଙ୍କ ଦ୍ୱାରା ଅକ୍ଷମ କରାଯାଇଛି"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"ହୋମ ସ୍କ୍ରିନ ରୋଟେସନକୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"ଯେତେବେଳେ ଫୋନକୁ ରୋଟେଟ କରାଯାଇଥାଏ"</string>
@@ -184,14 +186,16 @@
<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="action_dismiss_notification" msgid="5909461085055959187">"ଖାରଜ କରନ୍ତୁ"</string>
<string name="accessibility_close" msgid="2277148124685870734">"ବନ୍ଦ କରନ୍ତୁ"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"ବ୍ୟକ୍ତିଗତ"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"ୱାର୍କ"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"ବ୍ୟକ୍ତିଗତ ଆପ୍ସ ଟାବ"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"ୱାର୍କ ଆପ୍ସ ଟାବ"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"ୱର୍କ ପ୍ରୋଫାଇଲ୍"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"ୱାର୍କ ଆପ୍ସକୁ ବେଜ କରାଯାଇଛି ଏବଂ ସେଗୁଡ଼ିକ ଆପଣଙ୍କ IT ଆଡମିନଙ୍କୁ ଦେଖାଯାଉଛି"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"ବୁଝିଗଲି"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index a9b089b..934266d 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -131,6 +131,8 @@
<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="msg_disabled_by_admin" msgid="6898038085516271325">"ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਦੁਆਰਾ ਅਯੋਗ ਬਣਾਈ ਗਈ"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"ਹੋਮ ਸਕ੍ਰੀਨ ਨੂੰ ਘੁਮਾਉਣ ਦੀ ਆਗਿਆ ਦਿਓ"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"ਜਦੋਂ ਫ਼ੋਨ ਘੁਮਾਇਆ ਜਾਂਦਾ ਹੈ"</string>
@@ -184,14 +186,16 @@
<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="action_dismiss_notification" msgid="5909461085055959187">"ਖਾਰਜ ਕਰੋ"</string>
<string name="accessibility_close" msgid="2277148124685870734">"ਬੰਦ ਕਰੋ"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"ਨਿੱਜੀ"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"ਕੰਮ ਸੰਬੰਧੀ"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"ਨਿੱਜੀ ਐਪਾਂ ਟੈਬ"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"ਕੰਮ ਸੰਬੰਧੀ ਐਪਾਂ ਟੈਬ"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"ਕਾਰਜ ਪ੍ਰੋਫਾਈਲ"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"ਕੰਮ ਸੰਬੰਧੀ ਐਪਾਂ ਨੂੰ ਬੈਜ ਕੀਤਾ ਗਿਆ ਹੈ ਅਤੇ ਇਹ ਤੁਹਾਡੇ ਆਈ.ਟੀ. ਪ੍ਰਸ਼ਾਸਕ ਨੂੰ ਦਿਸਣਗੀਆਂ"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"ਸਮਝ ਲਿਆ"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 7860464..36fa4e8 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -131,6 +131,8 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Tapeta i styl"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Edytuj ekran główny"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Ustawienia ekranu głównego"</string>
+ <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
+ <skip />
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Funkcja wyłączona przez administratora"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Zezwalaj na obrót ekranu głównego"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Po obróceniu telefonu"</string>
@@ -184,14 +186,16 @@
<string name="action_decrease_height" msgid="282377193880900022">"Zmniejsz wysokość"</string>
<string name="widget_resized" msgid="9130327887929620">"Szerokość i wysokość widżetu zmieniła się na <xliff:g id="NUMBER_0">%1$s</xliff:g> x <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Menu skrótów"</string>
+ <!-- no translation found for widget_frame_name (8782828448471444270) -->
+ <skip />
+ <!-- no translation found for action_close (1077760267194136901) -->
+ <skip />
<string name="action_dismiss_notification" msgid="5909461085055959187">"Zamknij"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Zamknij"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Osobiste"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Służbowe"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Karta aplikacji osobistych"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Karta aplikacji służbowych"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Profil służbowy"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Aplikacje służbowe mają plakietki i są widoczne dla administratora IT"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"OK"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 24235d1..50252d5 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -131,6 +131,8 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Imagem fundo/estilo"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Editar ecrã principal"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Definições de início"</string>
+ <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
+ <skip />
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Desativada pelo gestor"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Permitir rotação do ecrã principal"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Quando o telemóvel é rodado"</string>
@@ -184,14 +186,16 @@
<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 atalho"</string>
+ <!-- no translation found for widget_frame_name (8782828448471444270) -->
+ <skip />
+ <!-- no translation found for action_close (1077760267194136901) -->
+ <skip />
<string name="action_dismiss_notification" msgid="5909461085055959187">"Ignorar"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Fechar"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Pessoal"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Trabalho"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Separador de apps pessoais"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Separador de apps de trabalho"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Perfil de trabalho"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"As apps de trabalho têm um emblema e estão visíveis para o seu administrador de TI"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"OK"</string>
@@ -216,4 +220,6 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Transição do espaço privado"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Instalar"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Instale apps no espaço privado"</string>
+ <!-- no translation found for ps_app_content_description (1129133475892816226) -->
+ <skip />
</resources>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 76e6bcf..9c7261b 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -131,6 +131,8 @@
<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="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>
@@ -184,14 +186,16 @@
<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="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>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Trabalho"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Guia de apps pessoais"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Guia de apps de trabalho"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Perfil de trabalho"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Os apps de trabalho são identificados e ficam visíveis para o adm. de TI"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Ok"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 035e8cd..458f46e 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -131,6 +131,8 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Imagine de fundal și stil"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Editează ecranul de pornire"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Setări ecran de pornire"</string>
+ <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
+ <skip />
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Dezactivată de administrator"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Permite rotirea ecranului de pornire"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Când telefonul este rotit"</string>
@@ -184,14 +186,16 @@
<string name="action_decrease_height" msgid="282377193880900022">"Redu înălțimea"</string>
<string name="widget_resized" msgid="9130327887929620">"Widgetul a fost redimensionat la lățimea <xliff:g id="NUMBER_0">%1$s</xliff:g> și înălțimea <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Meniu de comenzi rapide"</string>
+ <!-- no translation found for widget_frame_name (8782828448471444270) -->
+ <skip />
+ <!-- no translation found for action_close (1077760267194136901) -->
+ <skip />
<string name="action_dismiss_notification" msgid="5909461085055959187">"Închide"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Închide"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personale"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Profesionale"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Fila Aplicații personale"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Fila Aplicații pentru lucru"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Profil de serviciu"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Aplicațiile pentru lucru sunt marcate și vizibile pentru administratorul IT"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"OK"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index a0230e2..5299596 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -131,6 +131,8 @@
<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="msg_disabled_by_admin" msgid="6898038085516271325">"Функция отключена администратором"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Разрешить поворачивать главный экран"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"При повороте телефона"</string>
@@ -184,14 +186,16 @@
<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="action_dismiss_notification" msgid="5909461085055959187">"Закрыть"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Закрыть"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Личные"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Рабочие"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Вкладка \"Личные приложения\""</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Вкладка \"Рабочие приложения\""</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Рабочий профиль"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"У рабочих приложений есть специальный значок. Они видны системному администратору."</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"ОК"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml
index db885f4..766dafd 100644
--- a/res/values-si/strings.xml
+++ b/res/values-si/strings.xml
@@ -131,6 +131,8 @@
<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="msg_disabled_by_admin" msgid="6898038085516271325">"ඔබගේ පරිපාලක විසින් අබල කරන ලදී"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"මුල් තිරය කරකැවීමට ඉඩ දෙන්න"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"දුරකථනය කරකවන විට"</string>
@@ -184,14 +186,16 @@
<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="action_dismiss_notification" msgid="5909461085055959187">"ඉවතලන්න"</string>
<string name="accessibility_close" msgid="2277148124685870734">"වසන්න"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"පුද්ගලික"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"කාර්යාලය"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"පුද්ගලික යෙදුම් පටිත්ත"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"කාර්ය යෙදුම් ටැබය"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"කාර්යාල පැතිකඩ"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"කාර්යාල යෙදුම්වලට ලාංඡන යොදා ඇති අතර ඔබගේ IT පරිපාලකට දෘශ්යමාන වේ"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"තේරුණා"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index ba174ad..465ed09 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -131,6 +131,8 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Tapeta a štýl"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Upraviť plochu"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Nastavenia plochy"</string>
+ <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
+ <skip />
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Zakázané vaším správcom"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Povoliť otáčanie plochy"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Pri otočení telefónu"</string>
@@ -184,14 +186,16 @@
<string name="action_decrease_height" msgid="282377193880900022">"Znížiť výšku"</string>
<string name="widget_resized" msgid="9130327887929620">"Veľkosť miniaplikácie bola zmenená na <xliff:g id="NUMBER_0">%1$s</xliff:g> x <xliff:g id="NUMBER_1">%2$s</xliff:g> (šírka x výška)"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Ponuka skratiek"</string>
+ <!-- no translation found for widget_frame_name (8782828448471444270) -->
+ <skip />
+ <!-- no translation found for action_close (1077760267194136901) -->
+ <skip />
<string name="action_dismiss_notification" msgid="5909461085055959187">"Zavrieť"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Zavrieť"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Osobné"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Pracovné"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Karta Osobné aplikácie"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Karta Pracovné aplikácie"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Pracovný profil"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Pracovné aplikácie majú odznak a zobrazujú sa správcovi IT"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Dobre"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index 9fabdcf..a32a0a9 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -131,6 +131,8 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Zaslonsko ozadje in slog"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Urejanje začetnega zaslona"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Začetni zaslon"</string>
+ <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
+ <skip />
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Onemogočil skrbnik."</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Dovoli sukanje začetnega zaslona"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Ko se telefon zasuka"</string>
@@ -184,14 +186,16 @@
<string name="action_decrease_height" msgid="282377193880900022">"Zmanjšanje višine"</string>
<string name="widget_resized" msgid="9130327887929620">"Velikost pripomočka je bila spremenjena na <xliff:g id="NUMBER_0">%1$s</xliff:g> širine in <xliff:g id="NUMBER_1">%2$s</xliff:g> višine"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Meni z bližnjicami"</string>
+ <!-- no translation found for widget_frame_name (8782828448471444270) -->
+ <skip />
+ <!-- no translation found for action_close (1077760267194136901) -->
+ <skip />
<string name="action_dismiss_notification" msgid="5909461085055959187">"Opusti"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Zapri"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Osebno"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Delo"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Zavihek z osebnimi aplikacijami"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Zavihek z delovnimi aplikacijami"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Delovni profil"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Delovne aplikacije so označene z značko in vidne skrbniku za IT."</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Razumem"</string>
@@ -216,4 +220,6 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Preklapljanje zasebnega prostora"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Namestitev"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Nameščanje aplikacij v zasebni prostor"</string>
+ <!-- no translation found for ps_app_content_description (1129133475892816226) -->
+ <skip />
</resources>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index 2109538..d1b955c 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -131,6 +131,8 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Imazhi i sfondit dhe stili"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Modifiko ekranin bazë"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Cilësimet e ekranit bazë"</string>
+ <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
+ <skip />
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Çaktivizuar nga administratori"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Lejo rrotullimin e ekranit bazë"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Kur telefoni rrotullohet"</string>
@@ -184,14 +186,16 @@
<string name="action_decrease_height" msgid="282377193880900022">"Zvogëlo lartësinë"</string>
<string name="widget_resized" msgid="9130327887929620">"Madhësia e miniaplikacionit u ndryshua me gjerësinë <xliff:g id="NUMBER_0">%1$s</xliff:g> dhe lartësinë <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Menyja e shkurtoreve"</string>
+ <!-- no translation found for widget_frame_name (8782828448471444270) -->
+ <skip />
+ <!-- no translation found for action_close (1077760267194136901) -->
+ <skip />
<string name="action_dismiss_notification" msgid="5909461085055959187">"Hiqe"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Mbyll"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personale"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Punë"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Skeda e aplikacioneve personale"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Skeda e aplikacioneve të punës"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Profili i punës"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Aplikacionet e punës janë të shënuara dhe të dukshme për administratorin e teknologjisë së informacionit"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"E kuptova"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index fea7de5..ca04201 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -131,6 +131,8 @@
<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="msg_disabled_by_admin" msgid="6898038085516271325">"Администратор је онемогућио"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Дозволи ротацију почетног екрана"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Када се телефон ротира"</string>
@@ -184,14 +186,16 @@
<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="action_dismiss_notification" msgid="5909461085055959187">"Одбаци"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Затвори"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Лично"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Посао"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Картица Личне апликације"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Картица Пословне апликације"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Пословни профил"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Пословне апликације су означене значком и ИТ администратор може да их види"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Важи"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index f2d0ed9..dd91e4b 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -131,6 +131,8 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Bakgrund och utseende"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Redigera startskärm"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Startinställningar"</string>
+ <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
+ <skip />
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Inaktiverat av administratören"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Tillåt rotering av startskärmen"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"När telefonen vrids"</string>
@@ -184,14 +186,16 @@
<string name="action_decrease_height" msgid="282377193880900022">"Minska höjden"</string>
<string name="widget_resized" msgid="9130327887929620">"Widgetens storlek har ändrats till: bredd <xliff:g id="NUMBER_0">%1$s</xliff:g>, höjd <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Snabbmeny"</string>
+ <!-- no translation found for widget_frame_name (8782828448471444270) -->
+ <skip />
+ <!-- no translation found for action_close (1077760267194136901) -->
+ <skip />
<string name="action_dismiss_notification" msgid="5909461085055959187">"Ignorera"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Stäng"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Privat"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Arbete"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Fliken Privata appar"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Fliken Jobbappar"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Jobbprofil"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Jobbappar är märkta och synliga för IT-administratören"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"OK"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index 6a5aa13..bd6e135 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -131,6 +131,8 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Mandhari na mtindo"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Badilisha Skrini ya Kwanza"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Mipangilio ya mwanzo"</string>
+ <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
+ <skip />
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Imezimwa na msimamizi wako"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Ruhusu kipengele cha kuzungusha skrini ya kwanza"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Simu inapozungushwa"</string>
@@ -184,14 +186,16 @@
<string name="action_decrease_height" msgid="282377193880900022">"Punguza urefu"</string>
<string name="widget_resized" msgid="9130327887929620">"Wijeti imepunguzwa hadi upana <xliff:g id="NUMBER_0">%1$s</xliff:g> urefu <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Menyu ya Njia za Mkato"</string>
+ <!-- no translation found for widget_frame_name (8782828448471444270) -->
+ <skip />
+ <!-- no translation found for action_close (1077760267194136901) -->
+ <skip />
<string name="action_dismiss_notification" msgid="5909461085055959187">"Ondoa"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Funga"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Binafsi"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Kazini"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Kichupo cha programu za binafsi"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Kichupo cha programu za kazini"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Wasifu wa kazini"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Programu za kazini zina beji na msimamizi wako wa TEHAMA anaziona"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Nimeelewa"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml
index 890e280..743df88 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -131,6 +131,8 @@
<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="msg_disabled_by_admin" msgid="6898038085516271325">"உங்கள் நிர்வாகி முடக்கியுள்ளார்"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"முகப்புத் திரை சுழற்சியை அனுமதித்தல்"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"மொபைலைச் சுழற்றும் போது"</string>
@@ -184,14 +186,16 @@
<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="action_dismiss_notification" msgid="5909461085055959187">"நிராகரி"</string>
<string name="accessibility_close" msgid="2277148124685870734">"மூடும் பட்டன்"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"தனிப்பட்டவை"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"பணி"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"தனிப்பட்ட ஆப்ஸ் பிரிவு"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"பணி ஆப்ஸ் பிரிவு"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"பணிக் கணக்கு"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"பணி ஆப்ஸில் பேட்ஜ் இடப்பட்டிருக்கும், உங்கள் IT நிர்வாகியால் பணி ஆப்ஸைப் பார்க்க முடியும்"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"முடிந்தது"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index 63d25f7..4df936c 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -131,6 +131,8 @@
<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="msg_disabled_by_admin" msgid="6898038085516271325">"మీ నిర్వాహకులు నిలిపివేసారు"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"మొదటి స్క్రీన్ రొటేషన్ను అనుమతించండి"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"ఫోన్ను తిప్పినప్పుడు"</string>
@@ -184,6 +186,10 @@
<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="action_dismiss_notification" msgid="5909461085055959187">"తీసివేయండి"</string>
<string name="accessibility_close" msgid="2277148124685870734">"మూసివేస్తుంది"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"వ్యక్తిగతం"</string>
@@ -214,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 1aa4a97..9107582 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -131,6 +131,8 @@
<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="msg_disabled_by_admin" msgid="6898038085516271325">"ปิดใช้โดยผู้ดูแลระบบ"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"อนุญาตให้หมุนหน้าจอหลัก"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"เมื่อหมุนโทรศัพท์"</string>
@@ -184,14 +186,16 @@
<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="action_dismiss_notification" msgid="5909461085055959187">"ปิด"</string>
<string name="accessibility_close" msgid="2277148124685870734">"ปิด"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"ส่วนตัว"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"งาน"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"แท็บแอปส่วนตัว"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"แท็บแอปงาน"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"โปรไฟล์งาน"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"แอปงานจะติดป้ายไว้และผู้ดูแลระบบไอทีจะมองเห็น"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"รับทราบ"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 27b171b..59661c0 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -131,6 +131,8 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Wallpaper & istilo"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"I-edit ang Home Screen"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Mga setting ng Home"</string>
+ <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
+ <skip />
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Na-disable ng iyong admin"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Payagan ang pag-rotate ng home screen"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Kailan maro-rotate ang telepono"</string>
@@ -184,14 +186,16 @@
<string name="action_decrease_height" msgid="282377193880900022">"Bawasan ang taas"</string>
<string name="widget_resized" msgid="9130327887929620">"Na-resize ang widget sa lapad <xliff:g id="NUMBER_0">%1$s</xliff:g> taas <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Menu ng Shortcut"</string>
+ <!-- no translation found for widget_frame_name (8782828448471444270) -->
+ <skip />
+ <!-- no translation found for action_close (1077760267194136901) -->
+ <skip />
<string name="action_dismiss_notification" msgid="5909461085055959187">"I-dismiss"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Isara"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personal"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Trabaho"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Tab ng mga personal na app"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Tab ng mga app para sa trabaho"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Profile sa trabaho"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"May badge at nakikita ng iyong IT admin ang mga app para sa trabaho"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"OK"</string>
@@ -216,4 +220,6 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Pag-transition ng Pribadong Space"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"I-install"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Mag-install ng mga app sa Pribadong Space"</string>
+ <!-- no translation found for ps_app_content_description (1129133475892816226) -->
+ <skip />
</resources>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index a1bc2b7..c834f6c 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -131,6 +131,8 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Duvar kağıdı ve stil"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Ana ekranı düzenleyin"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Ana ekran ayarları"</string>
+ <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
+ <skip />
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Yöneticiniz tarafından devre dışı bırakıldı"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Ana ekranı döndürmeye izin ver"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Telefon döndürüldüğünde"</string>
@@ -184,14 +186,16 @@
<string name="action_decrease_height" msgid="282377193880900022">"Yüksekliği azalt"</string>
<string name="widget_resized" msgid="9130327887929620">"Widget, <xliff:g id="NUMBER_0">%1$s</xliff:g> genişlik ve <xliff:g id="NUMBER_1">%2$s</xliff:g> yükseklik değerine yeniden boyutlandırıldı"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Kısayol Menüsü"</string>
+ <!-- no translation found for widget_frame_name (8782828448471444270) -->
+ <skip />
+ <!-- no translation found for action_close (1077760267194136901) -->
+ <skip />
<string name="action_dismiss_notification" msgid="5909461085055959187">"Kapat"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Kapat"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Kişisel"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"İş"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Kişisel uygulamalar sekmesi"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"İş uygulamaları sekmesi"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"İş profili"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"İş uygulamaları rozetle işaretlenmiş olup BT yöneticisi tarafından görülebilir"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Anladım"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index 389dd75..318944f 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -131,6 +131,8 @@
<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="msg_disabled_by_admin" msgid="6898038085516271325">"Вимкнув адміністратор"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Дозволити обертання головного екрана"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Коли телефон обертається"</string>
@@ -184,14 +186,16 @@
<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="action_dismiss_notification" msgid="5909461085055959187">"Закрити"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Закрити"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Особисті додатки"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Робочі додатки"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Вкладка особистих додатків"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Вкладка робочих додатків"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Робочий профіль"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Робочі додатки мають спеціальну позначку. Їх бачить системний адміністратор."</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"OK"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml
index 724cbcd..efe5297 100644
--- a/res/values-ur/strings.xml
+++ b/res/values-ur/strings.xml
@@ -131,6 +131,8 @@
<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="msg_disabled_by_admin" msgid="6898038085516271325">"آپ کے منتظم کی طرف سے غیر فعال کر دیا گیا"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"ہوم اسکرین گھمانے کی اجازت دیں"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"جب فون گھمایا جاتا ہے"</string>
@@ -184,6 +186,10 @@
<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="action_dismiss_notification" msgid="5909461085055959187">"برخاست کریں"</string>
<string name="accessibility_close" msgid="2277148124685870734">"بند کریں"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"ذاتی"</string>
@@ -214,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml
index 67c96ef..8d65f8c 100644
--- a/res/values-uz/strings.xml
+++ b/res/values-uz/strings.xml
@@ -131,6 +131,8 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Fon rasmi va uslubi"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Bosh ekranni tahrirlash"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Bosh ekran sozlamalari"</string>
+ <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
+ <skip />
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Administrator tomonidan o‘chirilgan"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Bosh ekranni burishga ruxsat"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Telefon burilganda"</string>
@@ -184,14 +186,16 @@
<string name="action_decrease_height" msgid="282377193880900022">"Bo‘yini kichraytirish"</string>
<string name="widget_resized" msgid="9130327887929620">"Vidjetning eni <xliff:g id="NUMBER_0">%1$s</xliff:g>, bo‘yi <xliff:g id="NUMBER_1">%2$s</xliff:g> qilib o‘zgartirildi"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Tezkor tugma menyusi"</string>
+ <!-- no translation found for widget_frame_name (8782828448471444270) -->
+ <skip />
+ <!-- no translation found for action_close (1077760267194136901) -->
+ <skip />
<string name="action_dismiss_notification" msgid="5909461085055959187">"Yopish"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Yopish"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Shaxsiy"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Ish"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Shaxsiy ilovalar sahifasi"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Ishga oid ilovalar sahifasi"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Ish profili"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Ishga oid ilovalarning maxsus belgisi bor hamda ular administratoringizga koʻrinadi"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"OK"</string>
@@ -216,4 +220,6 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Maxfiy joyga almashtirish"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Oʻrnatish"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Ilovalarni Maxfiy makonga oʻrnatish"</string>
+ <!-- no translation found for ps_app_content_description (1129133475892816226) -->
+ <skip />
</resources>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 3074222..78cf3e3 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -131,6 +131,8 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Hình nền và phong cách"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Chỉnh sửa Màn hình chính"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Cài đặt màn hình chính"</string>
+ <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
+ <skip />
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Bị tắt bởi quản trị viên của bạn"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Cho phép xoay màn hình chính"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Khi xoay điện thoại"</string>
@@ -184,14 +186,16 @@
<string name="action_decrease_height" msgid="282377193880900022">"Giảm chiều cao"</string>
<string name="widget_resized" msgid="9130327887929620">"Đã đổi kích thước tiện ích thành chiều rộng <xliff:g id="NUMBER_0">%1$s</xliff:g> chiều cao <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Trình đơn lối tắt"</string>
+ <!-- no translation found for widget_frame_name (8782828448471444270) -->
+ <skip />
+ <!-- no translation found for action_close (1077760267194136901) -->
+ <skip />
<string name="action_dismiss_notification" msgid="5909461085055959187">"Loại bỏ"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Đóng"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Cá nhân"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Công việc"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Thẻ ứng dụng cá nhân"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Thẻ ứng dụng công việc"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Hồ sơ công việc"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Các ứng dụng công việc được gắn huy hiệu và quản trị viên CNTT có thể nhìn thấy"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"OK"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index bed166c..6e69045 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -131,6 +131,8 @@
<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="msg_disabled_by_admin" msgid="6898038085516271325">"已被您的管理员停用"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"允许旋转主屏幕"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"手机旋转时"</string>
@@ -184,14 +186,16 @@
<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="action_dismiss_notification" msgid="5909461085055959187">"关闭"</string>
<string name="accessibility_close" msgid="2277148124685870734">"关闭"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"个人"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"工作"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"“个人应用”标签页"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"“工作应用”标签页"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"工作资料"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"工作应用都有相应的标志,且您的 IT 管理员可以看到它们"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"知道了"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index 07c6386..2e0e929 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -131,6 +131,8 @@
<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="msg_disabled_by_admin" msgid="6898038085516271325">"已由你的管理員停用"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"允許旋轉主畫面"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"隨手機旋轉"</string>
@@ -184,14 +186,16 @@
<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="action_dismiss_notification" msgid="5909461085055959187">"關閉"</string>
<string name="accessibility_close" msgid="2277148124685870734">"關閉"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"個人"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"工作"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"個人應用程式分頁"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"工作應用程式分頁"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"工作設定檔"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"工作應用程式均加有標誌。你的 IT 管理員可以看到這些應用程式"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"知道了"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index c3ffbc1..2b4a8b3 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -131,6 +131,8 @@
<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="msg_disabled_by_admin" msgid="6898038085516271325">"已由你的管理員停用"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"允許旋轉主畫面"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"當手機旋轉時"</string>
@@ -184,14 +186,16 @@
<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="action_dismiss_notification" msgid="5909461085055959187">"關閉"</string>
<string name="accessibility_close" msgid="2277148124685870734">"關閉"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"個人"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"工作"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"個人應用程式分頁"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"工作應用程式分頁"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"工作資料夾"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"工作應用程式會加上標記,且你的 IT 管理員可以看到這類應用程式"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"我知道了"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index d08a21e..dc40b80 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -131,6 +131,8 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Isithombe sangemuva nesitayela"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Hlela Isikrini Sasekhaya"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Amasethingi asekhaya"</string>
+ <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
+ <skip />
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Kukhutshazwe umlawuli wakho"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Vumela ukuzungezisa kwesikrini sasekhaya"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Uma ifoni iphendukiswa"</string>
@@ -184,14 +186,16 @@
<string name="action_decrease_height" msgid="282377193880900022">"Nciphisa ubude"</string>
<string name="widget_resized" msgid="9130327887929620">"Iwijethi inikezwe usayizi omusha ngobubanzi obungu-<xliff:g id="NUMBER_0">%1$s</xliff:g> ubude obungu-<xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Imenyu Yezinqamuleli"</string>
+ <!-- no translation found for widget_frame_name (8782828448471444270) -->
+ <skip />
+ <!-- no translation found for action_close (1077760267194136901) -->
+ <skip />
<string name="action_dismiss_notification" msgid="5909461085055959187">"Cashisa"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Vala"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Okomuntu siqu"</string>
<string name="all_apps_work_tab" msgid="4884822796154055118">"Umsebenzi"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"Ithebhu yama-app omuntu siqu"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"Ithebhu yama-app omsebenzi"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"Iphrofayela yomsebenzi"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"Ama-app omsebenzi anebheji futhi ayabonakala kumphathi wakho we-IT"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"Ngiyezwa"</string>
@@ -216,4 +220,6 @@
<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 />
</resources>
diff --git a/res/values/config.xml b/res/values/config.xml
index d65580c..fc636a5 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -68,7 +68,6 @@
<string name="app_launch_tracker_class" translatable="false"></string>
<string name="test_information_handler_class" translatable="false"></string>
<string name="secondary_display_predictions_class" translatable="false"></string>
- <string name="widget_holder_factory_class" translatable="false"></string>
<string name="taskbar_search_session_controller_class" translatable="false"></string>
<string name="taskbar_model_callbacks_factory_class" translatable="false"></string>
<string name="taskbar_view_callbacks_factory_class" translatable="false"></string>
@@ -224,4 +223,7 @@
of the same name in SystemUI. -->
<string-array name="config_appsSupportMultiInstancesSplit">
</string-array>
+
+ <!-- Used to differentiate between desktop and non-desktop devices. -->
+ <bool name="desktop_form_factor">false</bool>
</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 3c1a9c6..a626097 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -549,4 +549,5 @@
<string name="ps_add_button_label">Install</string>
<!-- Content description for install app icon -->
<string name="ps_add_button_content_description">Install apps to Private Space</string>
+ <string name="ps_app_content_description">Add files and more to Private Space</string>
</resources>
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index 289f175..d5b3ed5 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -532,11 +532,14 @@
mAllAppsController = new AllAppsTransitionController(this);
mStateManager = new StateManager<>(this, NORMAL);
+ mAppWidgetManager = new WidgetManagerHelper(this);
+ mAppWidgetHolder = LauncherWidgetHolder.newInstance(this);
+ mAppWidgetHolder.setAppWidgetRemovedCallback(
+ appWidgetId -> getWorkspace().removeWidget(appWidgetId));
+
setupViews();
updateDisallowBack();
- mAppWidgetManager = new WidgetManagerHelper(this);
- mAppWidgetHolder = createAppWidgetHolder();
mAppWidgetHolder.startListening();
mAppWidgetHolder.addProviderChangeListener(() -> refreshAndBindWidgetsForPackageUser(null));
mItemInflater = new ItemInflater<>(this, mAppWidgetHolder, getItemOnClickListener(),
@@ -1472,8 +1475,7 @@
// Adding a shortcut to a Folder.
FolderIcon folderIcon = findFolderIcon(container);
if (folderIcon != null) {
- FolderInfo folderInfo = (FolderInfo) folderIcon.getTag();
- folderInfo.add(info, args.rank, false);
+ folderIcon.getFolder().addFolderContent(info, args.rank, false);
} else {
Log.e(TAG, "Could not find folder with id " + container + " to add shortcut.");
}
@@ -1615,11 +1617,6 @@
return instance;
}
- protected LauncherWidgetHolder createAppWidgetHolder() {
- return LauncherWidgetHolder.HolderFactory.newFactory(this).newInstance(
- this, appWidgetId -> getWorkspace().removeWidget(appWidgetId));
- }
-
@Override
protected void onNewIntent(Intent intent) {
if (Utilities.isRunningInTestHarness()) {
@@ -1792,7 +1789,6 @@
SettingsCache.INSTANCE.get(this).unregister(TOUCHPAD_NATURAL_SCROLLING,
mNaturalScrollingChangedListener);
ScreenOnTracker.INSTANCE.get(this).removeListener(mScreenOnListener);
- mWorkspace.removeFolderListeners();
PluginManagerWrapper.INSTANCE.get(this).removePluginListener(this);
mModel.removeCallbacks(this);
@@ -2053,9 +2049,10 @@
@Nullable final String reason) {
if (itemInfo instanceof WorkspaceItemInfo) {
View collectionIcon = mWorkspace.getViewByItemId(itemInfo.container);
- if (collectionIcon instanceof FolderIcon) {
+ if (collectionIcon instanceof FolderIcon folderIcon) {
// Remove the shortcut from the folder before removing it from launcher
- ((FolderInfo) collectionIcon.getTag()).remove((WorkspaceItemInfo) itemInfo, true);
+ Folder folder = folderIcon.getFolder();
+ folder.removeFolderContent(true, itemInfo);
} else if (collectionIcon instanceof AppPairIcon appPairIcon) {
removeItem(appPairIcon, appPairIcon.getInfo(), deleteFromDb,
"removing app pair because one of its member apps was removed");
@@ -2066,9 +2063,6 @@
getModelWriter().deleteItemFromDatabase(itemInfo, reason);
}
} else if (itemInfo instanceof CollectionInfo ci) {
- if (v instanceof FolderIcon) {
- ((FolderIcon) v).removeListeners();
- }
mWorkspace.removeWorkspaceItem(v);
if (deleteFromDb) {
getModelWriter().deleteCollectionAndContentsFromDatabase(ci);
diff --git a/src/com/android/launcher3/LauncherModel.kt b/src/com/android/launcher3/LauncherModel.kt
index 02d70ae..557ad67 100644
--- a/src/com/android/launcher3/LauncherModel.kt
+++ b/src/com/android/launcher3/LauncherModel.kt
@@ -86,12 +86,11 @@
private val loaderFactory: LoaderTaskFactory,
private val binderFactory: BaseLauncherBinderFactory,
private val spaceFinderFactory: Provider<WorkspaceItemSpaceFinder>,
+ val modelDbController: ModelDbController,
) {
private val mCallbacksList = ArrayList<BgDataModel.Callbacks>(1)
- val modelDbController = ModelDbController(context)
-
private val mLock = Any()
private var mLoaderTask: LoaderTask? = null
diff --git a/src/com/android/launcher3/LauncherProvider.java b/src/com/android/launcher3/LauncherProvider.java
index 03ecf14..acb2b48 100644
--- a/src/com/android/launcher3/LauncherProvider.java
+++ b/src/com/android/launcher3/LauncherProvider.java
@@ -26,13 +26,13 @@
import android.content.ContentValues;
import android.content.pm.PackageManager;
import android.database.Cursor;
-import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import android.os.Binder;
import android.os.Bundle;
import android.os.Process;
import android.text.TextUtils;
import android.util.Log;
+import android.util.Pair;
import com.android.launcher3.LauncherSettings.Favorites;
import com.android.launcher3.model.ModelDbController;
@@ -74,24 +74,20 @@
@Override
public String getType(Uri uri) {
- SqlArguments args = new SqlArguments(uri, null, null);
- if (TextUtils.isEmpty(args.where)) {
- return "vnd.android.cursor.dir/" + args.table;
+ if (TextUtils.isEmpty(parseUri(uri, null, null).first)) {
+ return "vnd.android.cursor.dir/" + Favorites.TABLE_NAME;
} else {
- return "vnd.android.cursor.item/" + args.table;
+ return "vnd.android.cursor.item/" + Favorites.TABLE_NAME;
}
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
- SqlArguments args = new SqlArguments(uri, selection, selectionArgs);
- SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
- qb.setTables(args.table);
-
+ Pair<String, String[]> args = parseUri(uri, selection, selectionArgs);
Cursor[] result = new Cursor[1];
executeControllerTask(controller -> {
- result[0] = controller.query(args.table, projection, args.where, args.args, sortOrder);
+ result[0] = controller.query(projection, args.first, args.second, sortOrder);
return 0;
});
return result[0];
@@ -108,7 +104,7 @@
// attempt allocate and bind the widget.
Integer itemType = values.getAsInteger(Favorites.ITEM_TYPE);
if (itemType != null
- && itemType.intValue() == Favorites.ITEM_TYPE_APPWIDGET
+ && itemType == Favorites.ITEM_TYPE_APPWIDGET
&& !values.containsKey(Favorites.APPWIDGET_ID)) {
ComponentName cn = ComponentName.unflattenFromString(
@@ -135,8 +131,7 @@
}
}
- SqlArguments args = new SqlArguments(uri);
- return controller.insert(args.table, values);
+ return controller.insert(values);
});
return rowId < 0 ? null : ContentUris.withAppendedId(uri, rowId);
@@ -144,14 +139,14 @@
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
- SqlArguments args = new SqlArguments(uri, selection, selectionArgs);
- return executeControllerTask(c -> c.delete(args.table, args.where, args.args));
+ Pair<String, String[]> args = parseUri(uri, selection, selectionArgs);
+ return executeControllerTask(c -> c.delete(args.first, args.second));
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
- SqlArguments args = new SqlArguments(uri, selection, selectionArgs);
- return executeControllerTask(c -> c.update(args.table, values, args.where, args.args));
+ Pair<String, String[]> args = parseUri(uri, selection, selectionArgs);
+ return executeControllerTask(c -> c.update(values, args.first, args.second));
}
@Override
@@ -209,35 +204,24 @@
}
}
- static class SqlArguments {
- public final String table;
- public final String where;
- public final String[] args;
-
- SqlArguments(Uri url, String where, String[] args) {
- if (url.getPathSegments().size() == 1) {
- this.table = url.getPathSegments().get(0);
- this.where = where;
- this.args = args;
- } else if (url.getPathSegments().size() != 2) {
- throw new IllegalArgumentException("Invalid URI: " + url);
- } else if (!TextUtils.isEmpty(where)) {
- throw new UnsupportedOperationException("WHERE clause not supported: " + url);
- } else {
- this.table = url.getPathSegments().get(0);
- this.where = "_id=" + ContentUris.parseId(url);
- this.args = null;
+ /**
+ * Parses the uri and returns the where and arg clause.
+ *
+ * Note: This should be called on the binder thread (before posting on any executor) so that
+ * any parsing error gets propagated to the caller.
+ */
+ private static Pair<String, String[]> parseUri(Uri url, String where, String[] args) {
+ switch (url.getPathSegments().size()) {
+ case 1 -> {
+ return Pair.create(where, args);
}
- }
-
- SqlArguments(Uri url) {
- if (url.getPathSegments().size() == 1) {
- table = url.getPathSegments().get(0);
- where = null;
- args = null;
- } else {
- throw new IllegalArgumentException("Invalid URI: " + url);
+ case 2 -> {
+ if (!TextUtils.isEmpty(where)) {
+ throw new UnsupportedOperationException("WHERE clause not supported: " + url);
+ }
+ return Pair.create("_id=" + ContentUris.parseId(url), null);
}
+ default -> throw new IllegalArgumentException("Invalid URI: " + url);
}
}
}
diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java
index 6ed183a..59f84ab 100644
--- a/src/com/android/launcher3/Workspace.java
+++ b/src/com/android/launcher3/Workspace.java
@@ -137,7 +137,6 @@
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Predicate;
-import java.util.stream.Collectors;
/**
* The workspace is a wide area with a wallpaper and a finite number of pages.
@@ -659,7 +658,6 @@
}
// Remove the pages and clear the screen models
- removeFolderListeners();
removeAllViews();
mScreenOrder.clear();
mWorkspaceScreens.clear();
@@ -1914,7 +1912,7 @@
boolean aboveShortcut = Folder.willAccept(dropOverView.getTag())
&& ((ItemInfo) dropOverView.getTag()).container != CONTAINER_HOTSEAT_PREDICTION;
- boolean willBecomeShortcut = Folder.willAcceptItemType(info.itemType);
+ boolean willBecomeShortcut = FolderInfo.willAcceptItemType(info.itemType);
return (aboveShortcut && willBecomeShortcut);
}
@@ -1994,8 +1992,8 @@
fi.performCreateAnimation(destInfo, v, sourceInfo, d, folderLocation, scale);
} else {
fi.prepareCreateAnimation(v);
- fi.addItem(destInfo);
- fi.addItem(sourceInfo);
+ fi.getFolder().addFolderContent(destInfo);
+ fi.getFolder().addFolderContent(sourceInfo);
}
return true;
}
@@ -3209,21 +3207,6 @@
});
}
- /**
- * Removes all folder listeners
- */
- public void removeFolderListeners() {
- mapOverItems(new ItemOperator() {
- @Override
- public boolean evaluate(ItemInfo info, View view) {
- if (view instanceof FolderIcon) {
- ((FolderIcon) view).removeListeners();
- }
- return false;
- }
- });
- }
-
public boolean isDropEnabled() {
return true;
}
@@ -3349,15 +3332,15 @@
if (child instanceof DropTarget) {
mDragController.removeDropTarget((DropTarget) child);
}
- } else if (child instanceof FolderIcon) {
+ } else if (child instanceof FolderIcon folderIcon) {
FolderInfo folderInfo = (FolderInfo) info;
- List<ItemInfo> matches = folderInfo.getContents().stream()
+ ItemInfo[] matches = folderInfo.getContents().stream()
.filter(matcher)
- .collect(Collectors.toList());
- if (!matches.isEmpty()) {
- folderInfo.removeAll(matches, false);
- if (((FolderIcon) child).getFolder().isOpen()) {
- ((FolderIcon) child).getFolder().close(false /* animate */);
+ .toArray(ItemInfo[]::new);
+ if (matches.length > 0) {
+ folderIcon.getFolder().removeFolderContent(false, matches);
+ if (folderIcon.getFolder().isOpen()) {
+ folderIcon.getFolder().close(false /* animate */);
}
}
} else if (info instanceof AppPairInfo api) {
diff --git a/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java b/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java
index cd91f8e..df34ccf 100644
--- a/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java
+++ b/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java
@@ -519,7 +519,7 @@
Folder folder = Folder.getOpen(mContext);
folder.close(true);
WorkspaceItemInfo info = (WorkspaceItemInfo) item;
- folder.getInfo().remove(info, false);
+ folder.removeFolderContent(false, info);
final int[] coordinates = new int[2];
final int screenId = findSpaceOnWorkspace(item, coordinates);
diff --git a/src/com/android/launcher3/allapps/AlphabeticalAppsList.java b/src/com/android/launcher3/allapps/AlphabeticalAppsList.java
index 870c891..bf02e03 100644
--- a/src/com/android/launcher3/allapps/AlphabeticalAppsList.java
+++ b/src/com/android/launcher3/allapps/AlphabeticalAppsList.java
@@ -435,7 +435,10 @@
}
if (currentItem.itemInfo != null && Objects.equals(
currentItem.itemInfo.getTargetPackage(), PRIVATE_SPACE_PACKAGE)) {
+ currentItem.itemInfo.bitmap = mPrivateProviderManager.preparePSBitmapInfo();
currentItem.itemInfo.bitmap.creationFlags |= FLAG_NO_BADGE;
+ currentItem.itemInfo.contentDescription =
+ mPrivateProviderManager.getPsAppContentDesc();
privateSpaceAppIndex = i;
}
}
diff --git a/src/com/android/launcher3/allapps/PrivateProfileManager.java b/src/com/android/launcher3/allapps/PrivateProfileManager.java
index 609edd2..0e6a5b8 100644
--- a/src/com/android/launcher3/allapps/PrivateProfileManager.java
+++ b/src/com/android/launcher3/allapps/PrivateProfileManager.java
@@ -142,6 +142,7 @@
private PrivateSpaceSettingsButton mPrivateSpaceSettingsButton;
@Nullable
private ConstraintLayout mFloatingMaskView;
+ private final String mPrivateSpaceAppContentDesc;
private final String mLockedStateContentDesc;
private final String mUnLockedStateContentDesc;
@@ -157,6 +158,8 @@
UI_HELPER_EXECUTOR.post(() -> initializeInBackgroundThread(appContext));
mPsHeaderHeight = mAllApps.getContext().getResources().getDimensionPixelSize(
R.dimen.ps_header_height);
+ mPrivateSpaceAppContentDesc = mAllApps.getContext()
+ .getString(R.string.ps_app_content_description);
mLockedStateContentDesc = mAllApps.getContext()
.getString(R.string.ps_container_lock_button_content_description);
mUnLockedStateContentDesc = mAllApps.getContext()
@@ -187,15 +190,11 @@
/** Adds Private Space install app button to the layout. */
public void addPrivateSpaceInstallAppButton(List<BaseAllAppsAdapter.AdapterItem> adapterItems) {
Context context = mAllApps.getContext();
- // Prepare bitmapInfo
- Intent.ShortcutIconResource shortcut = Intent.ShortcutIconResource.fromContext(
- context, com.android.launcher3.R.drawable.private_space_install_app_icon);
- BitmapInfo bitmapInfo = LauncherIcons.obtain(context).createIconBitmap(shortcut);
PrivateSpaceInstallAppButtonInfo itemInfo = new PrivateSpaceInstallAppButtonInfo();
itemInfo.title = context.getResources().getString(R.string.ps_add_button_label);
itemInfo.intent = mAppInstallerIntent;
- itemInfo.bitmap = bitmapInfo;
+ itemInfo.bitmap = preparePSBitmapInfo();
itemInfo.contentDescription = context.getResources().getString(
com.android.launcher3.R.string.ps_add_button_content_description);
itemInfo.runtimeStatusFlags |= FLAG_NOT_PINNABLE;
@@ -215,6 +214,13 @@
.get(mAllApps.getContext()).getValue(PRIVATE_SPACE_HIDE_WHEN_LOCKED_URI, 0);
}
+ BitmapInfo preparePSBitmapInfo() {
+ Context context = mAllApps.getContext();
+ Intent.ShortcutIconResource shortcut = Intent.ShortcutIconResource.fromContext(
+ context, com.android.launcher3.R.drawable.private_space_install_app_icon);
+ return LauncherIcons.obtain(context).createIconBitmap(shortcut);
+ }
+
/**
* Resets the current state of Private Profile, w.r.t. to Launcher. The decorator should only
* be applied upon expand before animating. When collapsing, reset() will remove the decorator
@@ -929,6 +935,10 @@
return mPsHeaderHeight;
}
+ String getPsAppContentDesc() {
+ return mPrivateSpaceAppContentDesc;
+ }
+
boolean isPrivateSpaceItem(BaseAllAppsAdapter.AdapterItem item) {
return getItemInfoMatcher().test(item.itemInfo) || item.decorationInfo != null
|| (item.itemInfo instanceof PrivateSpaceInstallAppButtonInfo);
diff --git a/src/com/android/launcher3/config/FeatureFlags.java b/src/com/android/launcher3/config/FeatureFlags.java
index 44dcc06..d987841 100644
--- a/src/com/android/launcher3/config/FeatureFlags.java
+++ b/src/com/android/launcher3/config/FeatureFlags.java
@@ -163,11 +163,6 @@
"ENABLE_WIDGET_TRANSITION_FOR_RESIZING", DISABLED,
"Enable widget transition animation when resizing the widgets");
- // TODO(Block 25): Clean up flags
- public static final BooleanFlag ENABLE_WIDGET_HOST_IN_BACKGROUND = getDebugFlag(270394384,
- "ENABLE_WIDGET_HOST_IN_BACKGROUND", ENABLED,
- "Enable background widget updates listening for widget holder");
-
// TODO(Block 27): Clean up flags
public static final BooleanFlag ENABLE_OVERLAY_CONNECTION_OPTIM = getDebugFlag(270392629,
"ENABLE_OVERLAY_CONNECTION_OPTIM", DISABLED,
diff --git a/src/com/android/launcher3/dagger/LauncherAppModule.java b/src/com/android/launcher3/dagger/LauncherAppModule.java
index c58a414..0fd3219 100644
--- a/src/com/android/launcher3/dagger/LauncherAppModule.java
+++ b/src/com/android/launcher3/dagger/LauncherAppModule.java
@@ -23,6 +23,7 @@
ApiWrapperModule.class,
PluginManagerWrapperModule.class,
StaticObjectModule.class,
+ WidgetModule.class,
AppModule.class
})
public class LauncherAppModule {
diff --git a/src/com/android/launcher3/dagger/LauncherBaseAppComponent.java b/src/com/android/launcher3/dagger/LauncherBaseAppComponent.java
index c499097..f86772e 100644
--- a/src/com/android/launcher3/dagger/LauncherBaseAppComponent.java
+++ b/src/com/android/launcher3/dagger/LauncherBaseAppComponent.java
@@ -46,6 +46,7 @@
import com.android.launcher3.util.WallpaperColorHints;
import com.android.launcher3.util.window.RefreshRateTracker;
import com.android.launcher3.util.window.WindowManagerProxy;
+import com.android.launcher3.widget.LauncherWidgetHolder.WidgetHolderFactory;
import com.android.launcher3.widget.custom.CustomWidgetManager;
import dagger.BindsInstance;
@@ -89,6 +90,7 @@
WidgetsFilterDataProvider getWidgetsFilterDataProvider();
LoaderCursorFactory getLoaderCursorFactory();
+ WidgetHolderFactory getWidgetHolderFactory();
/** Builder for LauncherBaseAppComponent. */
interface Builder {
diff --git a/src/com/android/launcher3/dot/FolderDotInfo.java b/src/com/android/launcher3/dot/FolderDotInfo.java
index 54800a0..cb91db7 100644
--- a/src/com/android/launcher3/dot/FolderDotInfo.java
+++ b/src/com/android/launcher3/dot/FolderDotInfo.java
@@ -30,6 +30,10 @@
private int mNumNotifications;
+ public void reset() {
+ mNumNotifications = 0;
+ }
+
public void addDotInfo(DotInfo dotToAdd) {
if (dotToAdd == null) {
return;
@@ -39,15 +43,6 @@
mNumNotifications, MIN_COUNT, DotInfo.MAX_COUNT);
}
- public void subtractDotInfo(DotInfo dotToSubtract) {
- if (dotToSubtract == null) {
- return;
- }
- mNumNotifications -= dotToSubtract.getNotificationKeys().size();
- mNumNotifications = Utilities.boundToRange(
- mNumNotifications, MIN_COUNT, DotInfo.MAX_COUNT);
- }
-
@Override
public int getNotificationCount() {
return mNumNotifications;
diff --git a/src/com/android/launcher3/dragndrop/DragController.java b/src/com/android/launcher3/dragndrop/DragController.java
index 284faba..415a2c6 100644
--- a/src/com/android/launcher3/dragndrop/DragController.java
+++ b/src/com/android/launcher3/dragndrop/DragController.java
@@ -544,9 +544,10 @@
}
accepted = true;
}
+
+ final View dropTargetAsView = dropTarget.getDropView();
+ dispatchDropComplete(dropTargetAsView, accepted);
}
- final View dropTargetAsView = dropTarget.getDropView();
- dispatchDropComplete(dropTargetAsView, accepted);
}
private DropTarget findDropTarget(final int x, final int y) {
diff --git a/src/com/android/launcher3/folder/Folder.java b/src/com/android/launcher3/folder/Folder.java
index 0ae9519..967af05 100644
--- a/src/com/android/launcher3/folder/Folder.java
+++ b/src/com/android/launcher3/folder/Folder.java
@@ -19,9 +19,6 @@
import static android.text.TextUtils.isEmpty;
import static com.android.launcher3.LauncherAnimUtils.SPRING_LOADED_EXIT_DELAY;
-import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_APPLICATION;
-import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_APP_PAIR;
-import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT;
import static com.android.launcher3.LauncherState.EDIT_MODE;
import static com.android.launcher3.LauncherState.NORMAL;
import static com.android.launcher3.compat.AccessibilityManagerCompat.sendCustomAccessibilityEvent;
@@ -29,6 +26,7 @@
import static com.android.launcher3.folder.FolderGridOrganizer.createFolderGridOrganizer;
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_FOLDER_LABEL_UPDATED;
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_ITEM_DROP_COMPLETED;
+import static com.android.launcher3.model.data.FolderInfo.willAcceptItemType;
import static com.android.launcher3.testing.shared.TestProtocol.FOLDER_OPENED_MESSAGE;
import static com.android.launcher3.util.window.RefreshRateTracker.getSingleFrameMs;
@@ -95,7 +93,6 @@
import com.android.launcher3.logging.StatsLogManager;
import com.android.launcher3.logging.StatsLogManager.StatsLogger;
import com.android.launcher3.model.data.FolderInfo;
-import com.android.launcher3.model.data.FolderInfo.FolderListener;
import com.android.launcher3.model.data.ItemInfo;
import com.android.launcher3.model.data.WorkspaceItemFactory;
import com.android.launcher3.model.data.WorkspaceItemInfo;
@@ -111,6 +108,7 @@
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
@@ -122,7 +120,7 @@
* Represents a set of icons chosen by the user or generated by the system.
*/
public class Folder extends AbstractFloatingView implements ClipPathView, DragSource,
- View.OnLongClickListener, DropTarget, FolderListener, TextView.OnEditorActionListener,
+ View.OnLongClickListener, DropTarget, TextView.OnEditorActionListener,
View.OnFocusChangeListener, DragListener, ExtendedEditText.OnBackKeyListener,
LauncherBindableItemsContainer {
private static final String TAG = "Launcher.Folder";
@@ -179,15 +177,6 @@
return o instanceof ItemInfo info && willAcceptItemType(info.itemType);
}
- /**
- * Checks if {@code itemType} is a type that can be placed in folders.
- */
- public static boolean willAcceptItemType(int itemType) {
- return itemType == ITEM_TYPE_APPLICATION
- || itemType == ITEM_TYPE_DEEP_SHORTCUT
- || itemType == ITEM_TYPE_APP_PAIR;
- }
-
private Alarm mReorderAlarm = new Alarm(Looper.getMainLooper());
private Alarm mOnExitAlarm = new Alarm(Looper.getMainLooper());
private Alarm mOnScrollHintAlarm = new Alarm(Looper.getMainLooper());
@@ -243,7 +232,10 @@
private boolean mIsExternalDrag;
private boolean mIsDragInProgress = false;
private boolean mDeleteFolderOnDropCompleted = false;
+
private boolean mSuppressFolderDeletion = false;
+ private boolean mSuppressContentUpdate = false;
+
private boolean mItemAddedBackToSelfViaIcon = false;
private boolean mIsEditingName = false;
@@ -385,9 +377,8 @@
// We do not want to get events for the item being removed, as they will get handled
// when the drop completes
- try (SuppressInfoChanges s = new SuppressInfoChanges()) {
- mInfo.remove(dragObject.dragInfo, true);
- }
+ executeWithContentUpdateSuppressed(() -> removeFolderContent(true, dragObject.dragInfo));
+
mIsDragInProgress = true;
mItemAddedBackToSelfViaIcon = false;
}
@@ -532,16 +523,7 @@
lp.customPosition = true;
setLayoutParams(lp);
}
- mItemsInvalidated = true;
- mInfo.addListener(this);
-
- if (!isEmpty(mInfo.title)) {
- mFolderName.setText(mInfo.title);
- mFolderName.setHint(null);
- } else {
- mFolderName.setText("");
- mFolderName.setHint(R.string.folder_hint_text);
- }
+ reapplyItemInfo();
// In case any children didn't come across during loading, clean up the folder accordingly
mFolderIcon.post(() -> {
if (getItemCount() <= 1) {
@@ -550,6 +532,17 @@
});
}
+ public void reapplyItemInfo() {
+ mItemsInvalidated = true;
+
+ if (!isEmpty(mInfo.title)) {
+ mFolderName.setText(mInfo.title);
+ mFolderName.setHint(null);
+ } else {
+ mFolderName.setText("");
+ mFolderName.setHint(R.string.folder_hint_text);
+ }
+ }
/**
* Show suggested folder title in FolderEditText if the first suggestion is non-empty, push
@@ -680,7 +673,6 @@
if (!shouldAnimateOpen(items)) {
return;
}
-
Folder openFolder = getOpen(mActivityContext);
closeOpenFolder(openFolder);
@@ -954,9 +946,7 @@
@Override
public boolean acceptDrop(DragObject d) {
- final ItemInfo item = d.dragInfo;
- final int itemType = item.itemType;
- return Folder.willAcceptItemType(itemType);
+ return willAcceptItemType(d.dragInfo.itemType);
}
public void onDragEnter(DragObject d) {
@@ -1121,9 +1111,8 @@
mContent.arrangeChildren(views);
mItemsInvalidated = true;
- try (SuppressInfoChanges s = new SuppressInfoChanges()) {
- mFolderIcon.onDrop(d, true /* itemReturnedOnFailedDrop */);
- }
+ executeWithContentUpdateSuppressed(
+ () -> mFolderIcon.onDrop(d, true /* itemReturnedOnFailedDrop */));
}
}
@@ -1417,9 +1406,7 @@
rearrangeChildren();
// Temporarily suppress the listener, as we did all the work already here.
- try (SuppressInfoChanges s = new SuppressInfoChanges()) {
- mInfo.add(si, mEmptyCellRank, false);
- }
+ executeWithContentUpdateSuppressed(() -> addFolderContent(si, mEmptyCellRank, false));
// We only need to update the locations if it doesn't get handled in
// #onDropCompleted.
@@ -1465,37 +1452,66 @@
}
}
- @Override
- public void onAdd(ItemInfo item, int rank) {
- FolderGridOrganizer verifier = createFolderGridOrganizer(
- mActivityContext.getDeviceProfile()).setFolderInfo(mInfo);
- verifier.updateRankAndPos(item, rank);
- mLauncherDelegate.getModelWriter().addOrMoveItemInDatabase(item, mInfo.id, 0, item.cellX,
- item.cellY);
- updateItemLocationsInDatabaseBatch(false);
-
- if (mContent.areViewsBound()) {
- mContent.createAndAddViewForRank(item, rank);
- }
- mItemsInvalidated = true;
+ /** Add an app or shortcut */
+ public void addFolderContent(ItemInfo item) {
+ addFolderContent(item, mInfo.getContents().size(), true);
}
- @Override
- public void onRemove(List<ItemInfo> items) {
- mItemsInvalidated = true;
- items.stream().map(this::getViewForInfo).forEach(mContent::removeItem);
- if (mState == STATE_ANIMATING) {
- mRearrangeOnClose = true;
- } else {
- rearrangeChildren();
+ /** Add an app or shortcut for a specified rank */
+ public void addFolderContent(ItemInfo item, int rank, boolean animate) {
+ if (!willAcceptItemType(item.itemType)) {
+ throw new RuntimeException("tried to add an illegal type into a folder");
}
- if (getItemCount() <= 1) {
- if (mIsOpen) {
- close(true);
- } else {
- replaceFolderWithFinalItem();
+
+ rank = Utilities.boundToRange(rank, 0, mInfo.getContents().size());
+ mInfo.getContents().add(rank, item);
+
+ if (!mSuppressContentUpdate) {
+ FolderGridOrganizer verifier = createFolderGridOrganizer(
+ mActivityContext.getDeviceProfile()).setFolderInfo(mInfo);
+ verifier.updateRankAndPos(item, rank);
+ mLauncherDelegate.getModelWriter().addOrMoveItemInDatabase(item, mInfo.id, 0,
+ item.cellX,
+ item.cellY);
+ updateItemLocationsInDatabaseBatch(false);
+
+ if (mContent.areViewsBound()) {
+ mContent.createAndAddViewForRank(item, rank);
}
+ mItemsInvalidated = true;
+ updateTextViewFocus();
}
+
+ mLauncherDelegate.getModelWriter().notifyItemModified(mInfo);
+ mFolderIcon.onItemsChanged(animate);
+ }
+
+ /** Remove all matching app or shortcut. Does not change the DB. */
+ public void removeFolderContent(boolean animate, ItemInfo... items) {
+ List<ItemInfo> itemArray = Arrays.asList(items);
+ if (mInfo.getContents().removeAll(itemArray)) {
+ mLauncherDelegate.getModelWriter().notifyItemModified(mInfo);
+ }
+
+ if (!mSuppressContentUpdate) {
+ mItemsInvalidated = true;
+ itemArray.forEach(item -> mContent.removeItem(getViewForInfo(item)));
+ if (mState == STATE_ANIMATING) {
+ mRearrangeOnClose = true;
+ } else {
+ rearrangeChildren();
+ }
+ if (getItemCount() <= 1) {
+ if (mIsOpen) {
+ close(true);
+ } else {
+ replaceFolderWithFinalItem();
+ }
+ }
+ updateTextViewFocus();
+ }
+
+ mFolderIcon.onItemsChanged(animate);
}
@VisibleForTesting
@@ -1503,16 +1519,6 @@
return mContent.iterateOverItems((info, view) -> info == item);
}
- @Override
- public void onItemsChanged(boolean animate) {
- updateTextViewFocus();
- }
-
- @Override
- public void onTitleChanged(CharSequence title) {
- mFolderName.setText(title);
- }
-
/**
* Utility methods to iterate over items of the view
*/
@@ -1666,18 +1672,14 @@
}
};
- /**
- * Temporary resource held while we don't want to handle info changes
- */
- private class SuppressInfoChanges implements AutoCloseable {
-
- SuppressInfoChanges() {
- mInfo.removeListener(Folder.this);
- }
-
- @Override
- public void close() {
- mInfo.addListener(Folder.this);
+ /** Executes the task while suppressing the content update for the folder */
+ private void executeWithContentUpdateSuppressed(Runnable task) {
+ if (mSuppressContentUpdate) {
+ task.run();
+ } else {
+ mSuppressContentUpdate = true;
+ task.run();
+ mSuppressContentUpdate = false;
updateTextViewFocus();
}
}
diff --git a/src/com/android/launcher3/folder/FolderIcon.java b/src/com/android/launcher3/folder/FolderIcon.java
index 0ed8787..1cd9bcc 100644
--- a/src/com/android/launcher3/folder/FolderIcon.java
+++ b/src/com/android/launcher3/folder/FolderIcon.java
@@ -23,6 +23,7 @@
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_FOLDER_AUTO_LABELED;
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_FOLDER_AUTO_LABELING_SKIPPED_EMPTY_PRIMARY;
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_FOLDER_AUTO_LABELING_SKIPPED_EMPTY_SUGGESTIONS;
+import static com.android.launcher3.model.data.FolderInfo.willAcceptItemType;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
@@ -73,7 +74,6 @@
import com.android.launcher3.logging.StatsLogManager;
import com.android.launcher3.model.data.AppPairInfo;
import com.android.launcher3.model.data.FolderInfo;
-import com.android.launcher3.model.data.FolderInfo.FolderListener;
import com.android.launcher3.model.data.FolderInfo.LabelState;
import com.android.launcher3.model.data.ItemInfo;
import com.android.launcher3.model.data.WorkspaceItemFactory;
@@ -92,7 +92,7 @@
/**
* An icon that can appear on in the workspace representing an {@link Folder}.
*/
-public class FolderIcon extends FrameLayout implements FolderListener, FloatingIconViewCompanion,
+public class FolderIcon extends FrameLayout implements FloatingIconViewCompanion,
DraggableView, Reorderable {
private final MultiTranslateDelegate mTranslateDelegate = new MultiTranslateDelegate(this);
@@ -127,7 +127,7 @@
private boolean mForceHideDot;
@ViewDebug.ExportedProperty(category = "launcher", deepExport = true)
- private FolderDotInfo mDotInfo = new FolderDotInfo();
+ private final FolderDotInfo mDotInfo = new FolderDotInfo();
private DotRenderer mDotRenderer;
@ViewDebug.ExportedProperty(category = "launcher", deepExport = true)
private DotRenderer.DrawParams mDotParams;
@@ -178,7 +178,6 @@
folder.bind(folderInfo);
icon.setFolder(folder);
- folderInfo.addListener(icon);
return icon;
}
@@ -217,13 +216,7 @@
icon.mDotRenderer = grid.mDotRendererWorkSpace;
icon.setContentDescription(icon.getAccessiblityTitle(folderInfo.title));
-
- // Keep the notification dot up to date with the sum of all the content's dots.
- FolderDotInfo folderDotInfo = new FolderDotInfo();
- for (ItemInfo si : folderInfo.getContents()) {
- folderDotInfo.addDotInfo(activity.getDotInfoForItem(si));
- }
- icon.setDotInfo(folderDotInfo);
+ icon.updateDotInfo();
icon.setAccessibilityDelegate(activity.getAccessibilityDelegate());
@@ -264,22 +257,13 @@
}
private boolean willAcceptItem(ItemInfo item) {
- final int itemType = item.itemType;
- return (Folder.willAcceptItemType(itemType) && item != mInfo && !mFolder.isOpen());
+ return (willAcceptItemType(item.itemType) && item != mInfo && !mFolder.isOpen());
}
public boolean acceptDrop(ItemInfo dragInfo) {
return !mFolder.isDestroyed() && willAcceptItem(dragInfo);
}
- public void addItem(ItemInfo item) {
- mInfo.add(item, true);
- }
-
- public void removeItem(ItemInfo item, boolean animate) {
- mInfo.remove(item, animate);
- }
-
public void onDragEnter(ItemInfo dragInfo) {
if (mFolder.isDestroyed() || !willAcceptItem(dragInfo)) return;
CellLayoutLayoutParams lp = (CellLayoutLayoutParams) getLayoutParams();
@@ -308,9 +292,8 @@
public void performCreateAnimation(final ItemInfo destInfo, final View destView,
final ItemInfo srcInfo, final DragObject d, Rect dstRect,
float scaleRelativeToDragLayer) {
- final DragView srcView = d.dragView;
prepareCreateAnimation(destView);
- addItem(destInfo);
+ getFolder().addFolderContent(destInfo);
// This will animate the first item from it's position as an icon into its
// position as the first item in the preview
mPreviewItemManager.createFirstItemAnimation(false /* reverse */, null)
@@ -364,7 +347,7 @@
boolean itemAdded = false;
if (itemReturnedOnFailedDrop || index >= MAX_NUM_ITEMS_IN_PREVIEW) {
List<ItemInfo> oldPreviewItems = new ArrayList<>(mCurrentPreviewItems);
- mInfo.add(item, index, false);
+ getFolder().addFolderContent(item, index, false);
mCurrentPreviewItems.clear();
mCurrentPreviewItems.addAll(getPreviewItemsOnPage(0));
@@ -380,12 +363,12 @@
mPreviewItemManager.onDrop(oldPreviewItems, mCurrentPreviewItems, item);
itemAdded = true;
} else {
- removeItem(item, false);
+ getFolder().removeFolderContent(false, item);
}
}
if (!itemAdded) {
- mInfo.add(item, index, true);
+ getFolder().addFolderContent(item, index, true);
}
int[] center = new int[2];
@@ -431,7 +414,7 @@
}, DROP_IN_ANIMATION_DURATION);
});
} else {
- addItem(item);
+ getFolder().addFolderContent(item);
}
}
@@ -500,9 +483,23 @@
);
}
- public void setDotInfo(FolderDotInfo dotInfo) {
- updateDotScale(mDotInfo.hasDot(), dotInfo.hasDot());
- mDotInfo = dotInfo;
+ /** Keep the notification dot up to date with the sum of all the content's dots. */
+ public void updateDotInfo() {
+ boolean hadDot = mDotInfo.hasDot();
+ mDotInfo.reset();
+ for (ItemInfo si : mInfo.getContents()) {
+ mDotInfo.addDotInfo(mActivity.getDotInfoForItem(si));
+ }
+ boolean isDotted = mDotInfo.hasDot();
+ float newDotScale = isDotted ? 1f : 0f;
+ // Animate when a dot is first added or when it is removed.
+ if ((hadDot ^ isDotted) && isShown()) {
+ animateDotScale(newDotScale);
+ } else {
+ cancelDotScaleAnim();
+ mDotScale = newDotScale;
+ invalidate();
+ }
}
public ClippedFolderIconLayoutRule getLayoutRule() {
@@ -523,22 +520,6 @@
}
}
- /**
- * Sets mDotScale to 1 or 0, animating if wasDotted or isDotted is false
- * (the dot is being added or removed).
- */
- private void updateDotScale(boolean wasDotted, boolean isDotted) {
- float newDotScale = isDotted ? 1f : 0f;
- // Animate when a dot is first added or when it is removed.
- if ((wasDotted ^ isDotted) && isShown()) {
- animateDotScale(newDotScale);
- } else {
- cancelDotScaleAnim();
- mDotScale = newDotScale;
- invalidate();
- }
- }
-
private void cancelDotScaleAnim() {
if (mDotScaleAnim != null) {
mDotScaleAnim.cancel();
@@ -682,13 +663,6 @@
return mPreviewItemManager.verifyDrawable(who) || super.verifyDrawable(who);
}
- @Override
- public void onItemsChanged(boolean animate) {
- updatePreviewItems(animate);
- invalidate();
- requestLayout();
- }
-
private void updatePreviewItems(boolean animate) {
mPreviewItemManager.updatePreviewItems(animate);
mCurrentPreviewItems.clear();
@@ -702,31 +676,15 @@
mPreviewItemManager.updatePreviewItems(itemCheck);
}
- @Override
- public void onAdd(ItemInfo item, int rank) {
+ public void onItemsChanged(boolean animate) {
updatePreviewItems(false);
- boolean wasDotted = mDotInfo.hasDot();
- mDotInfo.addDotInfo(mActivity.getDotInfoForItem(item));
- boolean isDotted = mDotInfo.hasDot();
- updateDotScale(wasDotted, isDotted);
+ updateDotInfo();
setContentDescription(getAccessiblityTitle(mInfo.title));
+ updatePreviewItems(animate);
invalidate();
requestLayout();
}
- @Override
- public void onRemove(List<ItemInfo> items) {
- updatePreviewItems(false);
- boolean wasDotted = mDotInfo.hasDot();
- items.stream().map(mActivity::getDotInfoForItem).forEach(mDotInfo::subtractDotInfo);
- boolean isDotted = mDotInfo.hasDot();
- updateDotScale(wasDotted, isDotted);
- setContentDescription(getAccessiblityTitle(mInfo.title));
- invalidate();
- requestLayout();
- }
-
- @Override
public void onTitleChanged(CharSequence title) {
mFolderName.setText(title);
setContentDescription(getAccessiblityTitle(title));
@@ -762,11 +720,6 @@
mLongPressHelper.cancelLongPress();
}
- public void removeListeners() {
- mInfo.removeListener(this);
- mInfo.removeListener(mFolder);
- }
-
private boolean isInHotseat() {
return mInfo.container == LauncherSettings.Favorites.CONTAINER_HOTSEAT;
}
diff --git a/src/com/android/launcher3/graphics/GridCustomizationsProxy.java b/src/com/android/launcher3/graphics/GridCustomizationsProxy.java
index 48519ce..b40e099 100644
--- a/src/com/android/launcher3/graphics/GridCustomizationsProxy.java
+++ b/src/com/android/launcher3/graphics/GridCustomizationsProxy.java
@@ -143,7 +143,7 @@
private final InvariantDeviceProfile mIdp;
@Inject
- GridCustomizationsProxy(
+ protected GridCustomizationsProxy(
@ApplicationContext Context context,
ThemeManager themeManager,
LauncherPrefs prefs,
diff --git a/src/com/android/launcher3/graphics/PreviewSurfaceRenderer.java b/src/com/android/launcher3/graphics/PreviewSurfaceRenderer.java
index 5a9b9c2..457d12e 100644
--- a/src/com/android/launcher3/graphics/PreviewSurfaceRenderer.java
+++ b/src/com/android/launcher3/graphics/PreviewSurfaceRenderer.java
@@ -21,7 +21,6 @@
import static android.view.Display.DEFAULT_DISPLAY;
import static com.android.launcher3.LauncherPrefs.GRID_NAME;
-import static com.android.launcher3.LauncherSettings.Favorites.TABLE_NAME;
import static com.android.launcher3.graphics.ThemeManager.PREF_ICON_SHAPE;
import static com.android.launcher3.util.Executors.MAIN_EXECUTOR;
import static com.android.launcher3.util.Executors.MODEL_EXECUTOR;
@@ -179,7 +178,7 @@
ModelDbController mainController =
LauncherAppState.getInstance(mContext).getModel().getModelDbController();
- try (Cursor c = mainController.query(TABLE_NAME,
+ try (Cursor c = mainController.query(
new String[] {
LauncherSettings.Favorites.APPWIDGET_ID,
LauncherSettings.Favorites.SPANX,
diff --git a/src/com/android/launcher3/logging/StatsLogManager.java b/src/com/android/launcher3/logging/StatsLogManager.java
index 4715132..44d2e26 100644
--- a/src/com/android/launcher3/logging/StatsLogManager.java
+++ b/src/com/android/launcher3/logging/StatsLogManager.java
@@ -883,6 +883,13 @@
@UiEvent(doc = "Work utility view shrink animation ended")
LAUNCHER_WORK_UTILITY_VIEW_SHRINK_ANIMATION_END(2078),
+
+ @UiEvent(doc = "Standard grid migration occurred")
+ LAUNCHER_STANDARD_GRID_MIGRATION(2200),
+
+ @UiEvent(doc = "Row shift grid migration occurred")
+ LAUNCHER_ROW_SHIFT_GRID_MIGRATION(2201),
+
// ADD MORE
;
diff --git a/src/com/android/launcher3/model/GridSizeMigrationDBController.java b/src/com/android/launcher3/model/GridSizeMigrationDBController.java
index 5d0a7bd..3e43943 100644
--- a/src/com/android/launcher3/model/GridSizeMigrationDBController.java
+++ b/src/com/android/launcher3/model/GridSizeMigrationDBController.java
@@ -20,6 +20,8 @@
import static com.android.launcher3.LauncherSettings.Favorites.TABLE_NAME;
import static com.android.launcher3.LauncherSettings.Favorites.TMP_TABLE;
import static com.android.launcher3.Utilities.SHOULD_SHOW_FIRST_PAGE_WIDGET;
+import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_ROW_SHIFT_GRID_MIGRATION;
+import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_STANDARD_GRID_MIGRATION;
import static com.android.launcher3.model.LoaderTask.SMARTSPACE_ON_HOME_SCREEN;
import static com.android.launcher3.provider.LauncherDbUtils.copyTable;
import static com.android.launcher3.provider.LauncherDbUtils.dropTable;
@@ -44,6 +46,7 @@
import com.android.launcher3.LauncherSettings;
import com.android.launcher3.Utilities;
import com.android.launcher3.config.FeatureFlags;
+import com.android.launcher3.logging.StatsLogManager;
import com.android.launcher3.provider.LauncherDbUtils.SQLiteTransaction;
import com.android.launcher3.util.GridOccupancy;
import com.android.launcher3.util.IntArray;
@@ -127,6 +130,8 @@
return true;
}
+ StatsLogManager statsLogManager = StatsLogManager.newInstance(context);
+
boolean shouldMigrateToStrictlyTallerGrid = (Flags.oneGridSpecs() || isDestNewDb)
&& srcDeviceState.getColumns().equals(destDeviceState.getColumns())
&& srcDeviceState.getRows() < destDeviceState.getRows();
@@ -152,6 +157,7 @@
// Save current configuration, so that the migration does not run again.
destDeviceState.writeToPrefs(context);
t.commit();
+ statsLogManager.logger().log(LAUNCHER_ROW_SHIFT_GRID_MIGRATION);
return true;
}
@@ -163,6 +169,7 @@
destDeviceState.getNumHotseat(), targetSize, srcDeviceState, destDeviceState);
dropTable(t.getDb(), TMP_TABLE);
t.commit();
+ statsLogManager.logger().log(LAUNCHER_STANDARD_GRID_MIGRATION);
return true;
} catch (Exception e) {
Log.e(TAG, "Error during grid migration", e);
diff --git a/src/com/android/launcher3/model/GridSizeMigrationLogic.kt b/src/com/android/launcher3/model/GridSizeMigrationLogic.kt
index 5df135a..2957e3c 100644
--- a/src/com/android/launcher3/model/GridSizeMigrationLogic.kt
+++ b/src/com/android/launcher3/model/GridSizeMigrationLogic.kt
@@ -30,6 +30,9 @@
import com.android.launcher3.Utilities
import com.android.launcher3.config.FeatureFlags
import com.android.launcher3.logging.FileLog
+import com.android.launcher3.logging.StatsLogManager
+import com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_ROW_SHIFT_GRID_MIGRATION
+import com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_STANDARD_GRID_MIGRATION
import com.android.launcher3.model.GridSizeMigrationDBController.DbReader
import com.android.launcher3.provider.LauncherDbUtils.SQLiteTransaction
import com.android.launcher3.provider.LauncherDbUtils.copyTable
@@ -58,6 +61,8 @@
return
}
+ val statsLogManager: StatsLogManager = StatsLogManager.newInstance(context)
+
val isAfterRestore = get(context).get(LauncherPrefs.IS_FIRST_LOAD_AFTER_RESTORE)
FileLog.d(
TAG,
@@ -90,6 +95,7 @@
// Save current configuration, so that the migration does not run again.
destDeviceState.writeToPrefs(context)
t.commit()
+ statsLogManager.logger().log(LAUNCHER_ROW_SHIFT_GRID_MIGRATION)
return
}
@@ -119,6 +125,7 @@
dropTable(t.db, TMP_TABLE)
t.commit()
+ statsLogManager.logger().log(LAUNCHER_STANDARD_GRID_MIGRATION)
}
} catch (e: Exception) {
FileLog.e(TAG, "Error during grid migration", e)
diff --git a/src/com/android/launcher3/model/LoaderCursor.java b/src/com/android/launcher3/model/LoaderCursor.java
index 77d0d76..efe6157 100644
--- a/src/com/android/launcher3/model/LoaderCursor.java
+++ b/src/com/android/launcher3/model/LoaderCursor.java
@@ -21,7 +21,6 @@
import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_APPLICATION;
import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_APP_PAIR;
import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT;
-import static com.android.launcher3.LauncherSettings.Favorites.TABLE_NAME;
import static com.android.launcher3.Utilities.SHOULD_SHOW_FIRST_PAGE_WIDGET;
import static com.android.launcher3.icons.cache.CacheLookupFlag.DEFAULT_LOOKUP_FLAG;
import static com.android.launcher3.model.data.ItemInfoWithIcon.FLAG_ARCHIVED;
@@ -466,7 +465,7 @@
public boolean commitDeleted() {
if (mItemsToRemove.size() > 0) {
// Remove dead items
- mModel.getModelDbController().delete(TABLE_NAME,
+ mModel.getModelDbController().delete(
Utilities.createDbSelectionQuery(Favorites._ID, mItemsToRemove), null);
return true;
}
@@ -492,7 +491,7 @@
// Update restored items that no longer require special handling
ContentValues values = new ContentValues();
values.put(Favorites.RESTORED, 0);
- mModel.getModelDbController().update(TABLE_NAME, values,
+ mModel.getModelDbController().update(values,
Utilities.createDbSelectionQuery(Favorites._ID, mRestoredRows), null);
}
if (mRestoreEventLogger != null) {
diff --git a/src/com/android/launcher3/model/LoaderTask.java b/src/com/android/launcher3/model/LoaderTask.java
index 73af6a2..78e5d89 100644
--- a/src/com/android/launcher3/model/LoaderTask.java
+++ b/src/com/android/launcher3/model/LoaderTask.java
@@ -23,7 +23,6 @@
import static com.android.launcher3.LauncherPrefs.IS_FIRST_LOAD_AFTER_RESTORE;
import static com.android.launcher3.LauncherPrefs.SHOULD_SHOW_SMARTSPACE;
import static com.android.launcher3.LauncherSettings.Favorites.DESKTOP_ICON_FLAG;
-import static com.android.launcher3.LauncherSettings.Favorites.TABLE_NAME;
import static com.android.launcher3.icons.CacheableShortcutInfo.convertShortcutsToCacheableShortcuts;
import static com.android.launcher3.icons.cache.CacheLookupFlag.DEFAULT_LOOKUP_FLAG;
import static com.android.launcher3.model.BgDataModel.Callbacks.FLAG_HAS_SHORTCUT_PERMISSION;
@@ -485,7 +484,7 @@
mShortcutKeyToPinnedShortcuts = new HashMap<>();
final LoaderCursor c = mLoaderCursorFactory.createLoaderCursor(
- dbController.query(TABLE_NAME, null, selection, null, null),
+ dbController.query(null, selection, null, null),
mUserManagerState,
mIsRestoreFromBackup ? restoreEventLogger : null);
final Bundle extras = c.getExtras();
diff --git a/src/com/android/launcher3/model/ModelDbController.java b/src/com/android/launcher3/model/ModelDbController.java
index feae632..64b9c1c 100644
--- a/src/com/android/launcher3/model/ModelDbController.java
+++ b/src/com/android/launcher3/model/ModelDbController.java
@@ -73,6 +73,8 @@
import com.android.launcher3.Utilities;
import com.android.launcher3.backuprestore.LauncherRestoreEventLogger;
import com.android.launcher3.backuprestore.LauncherRestoreEventLogger.RestoreError;
+import com.android.launcher3.dagger.ApplicationContext;
+import com.android.launcher3.dagger.LauncherAppSingleton;
import com.android.launcher3.logging.FileLog;
import com.android.launcher3.pm.UserCache;
import com.android.launcher3.provider.LauncherDbUtils;
@@ -91,10 +93,13 @@
import java.util.List;
import java.util.stream.Collectors;
+import javax.inject.Inject;
+
/**
* Utility class which maintains an instance of Launcher database and provides utility methods
* around it.
*/
+@LauncherAppSingleton
public class ModelDbController {
private static final String TAG = "ModelDbController";
@@ -105,17 +110,25 @@
protected DatabaseHelper mOpenHelper;
private final Context mContext;
+ private final InvariantDeviceProfile mIdp;
+ private final LauncherPrefs mPrefs;
+ private final UserCache mUserCache;
- public ModelDbController(Context context) {
+ @Inject
+ ModelDbController(
+ @ApplicationContext Context context,
+ InvariantDeviceProfile idp,
+ LauncherPrefs prefs,
+ UserCache userCache) {
mContext = context;
+ mIdp = idp;
+ mPrefs = prefs;
+ mUserCache = userCache;
}
private void printDBs(String prefix) {
try {
- File directory = new File(
- mContext.getDatabasePath(InvariantDeviceProfile.INSTANCE.get(mContext).dbFile)
- .getParent()
- );
+ File directory = new File(mContext.getDatabasePath(mIdp.dbFile).getParent());
if (directory.exists()) {
for (File file : directory.listFiles()) {
Log.d("b/353505773", prefix + "Database file: " + file.getName());
@@ -130,9 +143,9 @@
private synchronized void createDbIfNotExists() {
if (mOpenHelper == null) {
- String dbFile = LauncherPrefs.get(mContext).get(DB_FILE);
+ String dbFile = mPrefs.get(DB_FILE);
if (dbFile.isEmpty()) {
- dbFile = InvariantDeviceProfile.INSTANCE.get(mContext).dbFile;
+ dbFile = mIdp.dbFile;
}
mOpenHelper = createDatabaseHelper(false /* forMigration */, dbFile);
printDBs("before: ");
@@ -144,7 +157,7 @@
protected DatabaseHelper createDatabaseHelper(boolean forMigration, String dbFile) {
// Set the flag for empty DB
Runnable onEmptyDbCreateCallback = forMigration ? () -> { }
- : () -> LauncherPrefs.get(mContext).putSync(getEmptyDbCreatedKey(dbFile).to(true));
+ : () -> mPrefs.putSync(getEmptyDbCreatedKey(dbFile).to(true));
DatabaseHelper databaseHelper = new DatabaseHelper(mContext, dbFile,
this::getSerialNumberForUser, onEmptyDbCreateCallback);
@@ -169,12 +182,12 @@
* Refer {@link SQLiteDatabase#query}
*/
@WorkerThread
- public Cursor query(String table, String[] projection, String selection,
+ public Cursor query(String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
createDbIfNotExists();
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
Cursor result = db.query(
- table, projection, selection, selectionArgs, null, null, sortOrder);
+ TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);
final Bundle extra = new Bundle();
extra.putString(EXTRA_DB_NAME, mOpenHelper.getDatabaseName());
@@ -186,12 +199,12 @@
* Refer {@link SQLiteDatabase#insert(String, String, ContentValues)}
*/
@WorkerThread
- public int insert(String table, ContentValues initialValues) {
+ public int insert(ContentValues initialValues) {
createDbIfNotExists();
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
addModifiedTime(initialValues);
- int rowId = mOpenHelper.dbInsertAndCheck(db, table, initialValues);
+ int rowId = mOpenHelper.dbInsertAndCheck(db, TABLE_NAME, initialValues);
if (rowId >= 0) {
onAddOrDeleteOp(db);
}
@@ -202,11 +215,11 @@
* Refer {@link SQLiteDatabase#delete(String, String, String[])}
*/
@WorkerThread
- public int delete(String table, String selection, String[] selectionArgs) {
+ public int delete(String selection, String[] selectionArgs) {
createDbIfNotExists();
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
- int count = db.delete(table, selection, selectionArgs);
+ int count = db.delete(TABLE_NAME, selection, selectionArgs);
if (count > 0) {
onAddOrDeleteOp(db);
}
@@ -217,14 +230,12 @@
* Refer {@link SQLiteDatabase#update(String, ContentValues, String, String[])}
*/
@WorkerThread
- public int update(String table, ContentValues values,
- String selection, String[] selectionArgs) {
+ public int update(ContentValues values, String selection, String[] selectionArgs) {
createDbIfNotExists();
addModifiedTime(values);
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
- int count = db.update(table, values, selection, selectionArgs);
- return count;
+ return db.update(TABLE_NAME, values, selection, selectionArgs);
}
/**
@@ -261,7 +272,7 @@
public void createEmptyDB() {
createDbIfNotExists();
mOpenHelper.createEmptyDB(mOpenHelper.getWritableDatabase());
- LauncherPrefs.get(mContext).putSync(getEmptyDbCreatedKey().to(true));
+ mPrefs.putSync(getEmptyDbCreatedKey().to(true));
}
/**
@@ -292,7 +303,6 @@
mOpenHelper.getReadableDatabase(), Favorites.HYBRID_HOTSEAT_BACKUP_TABLE);
}
-
/**
* Resets the launcher DB if we should reset it.
*/
@@ -302,11 +312,10 @@
}
FileLog.d(TAG, "resetLauncherDb: Migration failed: resetting launcher database");
createEmptyDB();
- LauncherPrefs.get(mContext).putSync(
- getEmptyDbCreatedKey(mOpenHelper.getDatabaseName()).to(true));
+ mPrefs.putSync(getEmptyDbCreatedKey(mOpenHelper.getDatabaseName()).to(true));
// Write the grid state to avoid another migration
- new DeviceGridState(LauncherAppState.getIDP(mContext)).writeToPrefs(mContext);
+ new DeviceGridState(mIdp).writeToPrefs(mContext);
}
/**
@@ -326,7 +335,7 @@
}
private boolean isThereExistingDb() {
- if (LauncherPrefs.get(mContext).get(getEmptyDbCreatedKey())) {
+ if (mPrefs.get(getEmptyDbCreatedKey())) {
// If we already have a new DB, ignore migration
FileLog.d(TAG, "isThereExistingDb: new DB already created, skipping migration");
return true;
@@ -335,8 +344,7 @@
}
private boolean isGridMigrationNecessary() {
- InvariantDeviceProfile idp = LauncherAppState.getIDP(mContext);
- if (GridSizeMigrationDBController.needsToMigrate(mContext, idp)) {
+ if (GridSizeMigrationDBController.needsToMigrate(mContext, mIdp)) {
return true;
}
FileLog.d(TAG, "isGridMigrationNecessary: no grid migration needed");
@@ -344,8 +352,7 @@
}
private boolean isCurrentDbSameAsTarget() {
- InvariantDeviceProfile idp = LauncherAppState.getIDP(mContext);
- String targetDbName = new DeviceGridState(idp).getDbFile();
+ String targetDbName = new DeviceGridState(mIdp).getDbFile();
if (TextUtils.equals(targetDbName, mOpenHelper.getDatabaseName())) {
FileLog.e(TAG, "isCurrentDbSameAsTarget: target db is same as current"
+ " current db: " + mOpenHelper.getDatabaseName()
@@ -367,7 +374,6 @@
return;
}
- InvariantDeviceProfile idp = LauncherAppState.getIDP(mContext);
DatabaseHelper oldHelper = mOpenHelper;
// We save the existing db's before creating the destination db helper so we know what logic
@@ -376,12 +382,12 @@
.filter(dbName -> mContext.getDatabasePath(dbName).exists())
.collect(Collectors.toList());
- mOpenHelper = createDatabaseHelper(true, new DeviceGridState(idp).getDbFile());
+ mOpenHelper = createDatabaseHelper(true, new DeviceGridState(mIdp).getDbFile());
try {
// This is the current grid we have, given by the mContext
DeviceGridState srcDeviceState = new DeviceGridState(mContext);
// This is the state we want to migrate to that is given by the idp
- DeviceGridState destDeviceState = new DeviceGridState(idp);
+ DeviceGridState destDeviceState = new DeviceGridState(mIdp);
boolean isDestNewDb = !existingDBs.contains(destDeviceState.getDbFile());
GridSizeMigrationLogic gridSizeMigrationLogic = new GridSizeMigrationLogic();
@@ -404,10 +410,10 @@
ModelDelegate modelDelegate) {
if (!migrateGridIfNeeded(modelDelegate)) {
if (restoreEventLogger != null) {
- if (LauncherPrefs.get(mContext).get(NO_DB_FILES_RESTORED)) {
+ if (mPrefs.get(NO_DB_FILES_RESTORED)) {
restoreEventLogger.logLauncherItemsRestoreFailed(DATA_TYPE_DB_FILE, 1,
RestoreError.DATABASE_FILE_NOT_RESTORED);
- LauncherPrefs.get(mContext).put(NO_DB_FILES_RESTORED, false);
+ mPrefs.put(NO_DB_FILES_RESTORED, false);
FileLog.d(TAG, "There is no data to migrate: resetting launcher database");
} else {
restoreEventLogger.logLauncherItemsRestored(DATA_TYPE_DB_FILE, 1);
@@ -416,11 +422,10 @@
}
FileLog.d(TAG, "tryMigrateDB: Migration failed: resetting launcher database");
createEmptyDB();
- LauncherPrefs.get(mContext).putSync(
- getEmptyDbCreatedKey(mOpenHelper.getDatabaseName()).to(true));
+ mPrefs.putSync(getEmptyDbCreatedKey(mOpenHelper.getDatabaseName()).to(true));
// Write the grid state to avoid another migration
- new DeviceGridState(LauncherAppState.getIDP(mContext)).writeToPrefs(mContext);
+ new DeviceGridState(mIdp).writeToPrefs(mContext);
} else if (restoreEventLogger != null) {
restoreEventLogger.logLauncherItemsRestored(DATA_TYPE_DB_FILE, 1);
}
@@ -434,17 +439,16 @@
*/
private boolean migrateGridIfNeeded(ModelDelegate modelDelegate) {
createDbIfNotExists();
- if (LauncherPrefs.get(mContext).get(getEmptyDbCreatedKey())) {
+ if (mPrefs.get(getEmptyDbCreatedKey())) {
// If we have already create a new DB, ignore migration
FileLog.d(TAG, "migrateGridIfNeeded: new DB already created, skipping migration");
return false;
}
- InvariantDeviceProfile idp = LauncherAppState.getIDP(mContext);
- if (!GridSizeMigrationDBController.needsToMigrate(mContext, idp)) {
+ if (!GridSizeMigrationDBController.needsToMigrate(mContext, mIdp)) {
FileLog.d(TAG, "migrateGridIfNeeded: no grid migration needed");
return true;
}
- String targetDbName = new DeviceGridState(idp).getDbFile();
+ String targetDbName = new DeviceGridState(mIdp).getDbFile();
if (TextUtils.equals(targetDbName, mOpenHelper.getDatabaseName())) {
FileLog.e(TAG, "migrateGridIfNeeded: target db is same as current"
+ " current db: " + mOpenHelper.getDatabaseName()
@@ -462,7 +466,7 @@
// This is the current grid we have, given by the mContext
DeviceGridState srcDeviceState = new DeviceGridState(mContext);
// This is the state we want to migrate to that is given by the idp
- DeviceGridState destDeviceState = new DeviceGridState(idp);
+ DeviceGridState destDeviceState = new DeviceGridState(mIdp);
boolean isDestNewDb = !existingDBs.contains(destDeviceState.getDbFile());
return GridSizeMigrationDBController.migrateGridIfNeeded(mContext, srcDeviceState,
destDeviceState, mOpenHelper, oldHelper.getWritableDatabase(), isDestNewDb,
@@ -611,7 +615,7 @@
}
private void clearFlagEmptyDbCreated() {
- LauncherPrefs.get(mContext).removeSync(getEmptyDbCreatedKey());
+ mPrefs.removeSync(getEmptyDbCreatedKey());
}
/**
@@ -625,7 +629,7 @@
public synchronized void loadDefaultFavoritesIfNecessary() {
createDbIfNotExists();
- if (LauncherPrefs.get(mContext).get(getEmptyDbCreatedKey())) {
+ if (mPrefs.get(getEmptyDbCreatedKey())) {
Log.d(TAG, "loading default workspace");
LauncherWidgetHolder widgetHolder = mOpenHelper.newLauncherWidgetHolder();
@@ -737,10 +741,9 @@
}
private DefaultLayoutParser getDefaultLayoutParser(LauncherWidgetHolder widgetHolder) {
- InvariantDeviceProfile idp = LauncherAppState.getIDP(mContext);
- int defaultLayout = idp.demoModeLayoutId != 0
+ int defaultLayout = mIdp.demoModeLayoutId != 0
&& mContext.getSystemService(UserManager.class).isDemoUser()
- ? idp.demoModeLayoutId : idp.defaultLayoutId;
+ ? mIdp.demoModeLayoutId : mIdp.defaultLayoutId;
return new DefaultLayoutParser(mContext, widgetHolder,
mOpenHelper, mContext.getResources(), defaultLayout);
@@ -766,6 +769,6 @@
* Returns the serial number for the provided user
*/
public long getSerialNumberForUser(UserHandle user) {
- return UserCache.INSTANCE.get(mContext).getSerialNumberForUser(user);
+ return mUserCache.getSerialNumberForUser(user);
}
}
diff --git a/src/com/android/launcher3/model/ModelWriter.java b/src/com/android/launcher3/model/ModelWriter.java
index 0332775..2650e03 100644
--- a/src/com/android/launcher3/model/ModelWriter.java
+++ b/src/com/android/launcher3/model/ModelWriter.java
@@ -16,7 +16,6 @@
package com.android.launcher3.model;
-import static com.android.launcher3.LauncherSettings.Favorites.TABLE_NAME;
import static com.android.launcher3.provider.LauncherDbUtils.itemIdMatch;
import static com.android.launcher3.util.Executors.MODEL_EXECUTOR;
@@ -229,7 +228,7 @@
}).executeOnModelThread();
}
- private void notifyItemModified(ItemInfo item) {
+ public void notifyItemModified(ItemInfo item) {
notifyOtherCallbacks(c -> c.bindItemsModified(Collections.singletonList(item)));
}
@@ -253,7 +252,7 @@
item.onAddToDatabase(writer);
writer.put(Favorites._ID, item.id);
- mModel.getModelDbController().insert(Favorites.TABLE_NAME, writer.getValues(mContext));
+ mModel.getModelDbController().insert(writer.getValues(mContext));
synchronized (mBgDataModel) {
checkItemInfoLocked(item.id, item, stackTrace);
mBgDataModel.addItem(mContext, item, true);
@@ -292,7 +291,7 @@
notifyDelete(items);
enqueueDeleteRunnable(newModelTask(() -> {
for (ItemInfo item : items) {
- mModel.getModelDbController().delete(TABLE_NAME, itemIdMatch(item.id), null);
+ mModel.getModelDbController().delete(itemIdMatch(item.id), null);
mBgDataModel.removeItem(mContext, item);
verifier.verifyModel();
}
@@ -307,12 +306,12 @@
notifyDelete(Collections.singleton(info));
enqueueDeleteRunnable(newModelTask(() -> {
- mModel.getModelDbController().delete(Favorites.TABLE_NAME,
+ mModel.getModelDbController().delete(
Favorites.CONTAINER + "=" + info.id, null);
mBgDataModel.removeItem(mContext, info.getContents());
info.getContents().clear();
- mModel.getModelDbController().delete(Favorites.TABLE_NAME,
+ mModel.getModelDbController().delete(
Favorites._ID + "=" + info.id, null);
mBgDataModel.removeItem(mContext, info);
verifier.verifyModel();
@@ -411,7 +410,7 @@
@Override
public void runImpl() {
mModel.getModelDbController().update(
- TABLE_NAME, mWriter.get().getValues(mContext), itemIdMatch(mItemId), null);
+ mWriter.get().getValues(mContext), itemIdMatch(mItemId), null);
updateItemArrays(mItem, mItemId);
}
}
@@ -433,7 +432,7 @@
ItemInfo item = mItems.get(i);
final int itemId = item.id;
mModel.getModelDbController().update(
- TABLE_NAME, mValues.get(i), itemIdMatch(itemId), null);
+ mValues.get(i), itemIdMatch(itemId), null);
updateItemArrays(item, itemId);
}
t.commit();
diff --git a/src/com/android/launcher3/model/data/FolderInfo.java b/src/com/android/launcher3/model/data/FolderInfo.java
index 9656ac1..4c792a7 100644
--- a/src/com/android/launcher3/model/data/FolderInfo.java
+++ b/src/com/android/launcher3/model/data/FolderInfo.java
@@ -20,6 +20,9 @@
import static androidx.core.util.Preconditions.checkNotNull;
+import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_APPLICATION;
+import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_APP_PAIR;
+import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT;
import static com.android.launcher3.logger.LauncherAtom.Attribute.EMPTY_LABEL;
import static com.android.launcher3.logger.LauncherAtom.Attribute.MANUAL_LABEL;
import static com.android.launcher3.logger.LauncherAtom.Attribute.SUGGESTED_LABEL;
@@ -30,8 +33,6 @@
import androidx.annotation.Nullable;
import com.android.launcher3.LauncherSettings;
-import com.android.launcher3.Utilities;
-import com.android.launcher3.folder.Folder;
import com.android.launcher3.folder.FolderNameInfos;
import com.android.launcher3.logger.LauncherAtom;
import com.android.launcher3.logger.LauncherAtom.Attribute;
@@ -42,8 +43,6 @@
import com.android.launcher3.util.ContentWriter;
import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
import java.util.OptionalInt;
import java.util.stream.IntStream;
@@ -52,18 +51,6 @@
*/
public class FolderInfo extends CollectionInfo {
- public static final int NO_FLAGS = 0x00000000;
-
- /**
- * The folder is locked in sorted mode
- */
- public static final int FLAG_ITEMS_SORTED = 0x00000001;
-
- /**
- * It is a work folder
- */
- public static final int FLAG_WORK_FOLDER = 0x00000002;
-
/**
* The multi-page animation has run for this folder
*/
@@ -95,8 +82,6 @@
}
}
- public static final String EXTRA_FOLDER_SUGGESTIONS = "suggest";
-
public int options;
public FolderNameInfos suggestedFolderNames;
@@ -106,61 +91,16 @@
*/
private final ArrayList<ItemInfo> contents = new ArrayList<>();
- private ArrayList<FolderListener> mListeners = new ArrayList<>();
-
public FolderInfo() {
itemType = LauncherSettings.Favorites.ITEM_TYPE_FOLDER;
}
- /** Adds a app or shortcut to the contents ArrayList without animation. */
@Override
public void add(@NonNull ItemInfo item) {
- add(item, false /* animate */);
- }
-
- /**
- * Add an app or shortcut
- *
- * @param item
- */
- public void add(ItemInfo item, boolean animate) {
- add(item, getContents().size(), animate);
- }
-
- /**
- * Add an app or shortcut for a specified rank.
- */
- public void add(ItemInfo item, int rank, boolean animate) {
- if (!Folder.willAccept(item)) {
+ if (!willAcceptItemType(item.itemType)) {
throw new RuntimeException("tried to add an illegal type into a folder");
}
-
- rank = Utilities.boundToRange(rank, 0, getContents().size());
- getContents().add(rank, item);
- for (int i = 0; i < mListeners.size(); i++) {
- mListeners.get(i).onAdd(item, rank);
- }
- itemsChanged(animate);
- }
-
- /**
- * Remove an app or shortcut. Does not change the DB.
- *
- * @param item
- */
- public void remove(ItemInfo item, boolean animate) {
- removeAll(Collections.singletonList(item), animate);
- }
-
- /**
- * Remove all matching app or shortcut. Does not change the DB.
- */
- public void removeAll(List<ItemInfo> items, boolean animate) {
- contents.removeAll(items);
- for (int i = 0; i < mListeners.size(); i++) {
- mListeners.get(i).onRemove(items);
- }
- itemsChanged(animate);
+ getContents().add(item);
}
/**
@@ -197,28 +137,6 @@
writer.put(LauncherSettings.Favorites.OPTIONS, options);
}
- public void addListener(FolderListener listener) {
- mListeners.add(listener);
- }
-
- public void removeListener(FolderListener listener) {
- mListeners.remove(listener);
- }
-
- public void itemsChanged(boolean animate) {
- for (int i = 0; i < mListeners.size(); i++) {
- mListeners.get(i).onItemsChanged(animate);
- }
- }
-
- public interface FolderListener {
- void onAdd(ItemInfo item, int rank);
- void onRemove(List<ItemInfo> item);
- void onItemsChanged(boolean animate);
- void onTitleChanged(CharSequence title);
-
- }
-
public boolean hasOption(int optionFlag) {
return (options & optionFlag) != 0;
}
@@ -261,7 +179,6 @@
.build();
}
- @Override
public void setTitle(@Nullable CharSequence title, ModelWriter modelWriter) {
// Updating label from null to empty is considered as false touch.
// Retaining null title(ie., UNLABELED state) allows auto-labeling when new items added.
@@ -289,10 +206,6 @@
if (modelWriter != null) {
modelWriter.updateItemInDatabase(this);
}
-
- for (int i = 0; i < mListeners.size(); i++) {
- mListeners.get(i).onTitleChanged(title);
- }
}
/**
@@ -401,4 +314,13 @@
}
return LauncherAtom.ToState.TO_STATE_UNSPECIFIED;
}
+
+ /**
+ * Checks if {@code itemType} is a type that can be placed in folders.
+ */
+ public static boolean willAcceptItemType(int itemType) {
+ return itemType == ITEM_TYPE_APPLICATION
+ || itemType == ITEM_TYPE_DEEP_SHORTCUT
+ || itemType == ITEM_TYPE_APP_PAIR;
+ }
}
diff --git a/src/com/android/launcher3/model/data/ItemInfo.java b/src/com/android/launcher3/model/data/ItemInfo.java
index 588e759..ad7696c 100644
--- a/src/com/android/launcher3/model/data/ItemInfo.java
+++ b/src/com/android/launcher3/model/data/ItemInfo.java
@@ -61,7 +61,6 @@
import com.android.launcher3.logger.LauncherAtom.TaskSwitcherContainer;
import com.android.launcher3.logger.LauncherAtom.WallpapersContainer;
import com.android.launcher3.logger.LauncherAtomExtensions.ExtendedContainers;
-import com.android.launcher3.model.ModelWriter;
import com.android.launcher3.pm.UserCache;
import com.android.launcher3.util.ComponentKey;
import com.android.launcher3.util.ContentWriter;
@@ -536,14 +535,6 @@
}
/**
- * Sets the title of the item and writes to DB model if needed.
- */
- public void setTitle(@Nullable final CharSequence title,
- @Nullable final ModelWriter modelWriter) {
- this.title = title;
- }
-
- /**
* Returns a string ID that is stable for a user session, but may not be persisted
*/
@Nullable
diff --git a/src/com/android/launcher3/pageindicators/PageIndicatorDots.java b/src/com/android/launcher3/pageindicators/PageIndicatorDots.java
index 2112638..384f876 100644
--- a/src/com/android/launcher3/pageindicators/PageIndicatorDots.java
+++ b/src/com/android/launcher3/pageindicators/PageIndicatorDots.java
@@ -79,6 +79,7 @@
private static final int SMALL_HEIGHT_MULTIPLIER = 4;
private static final int LARGE_WIDTH_MULTIPLIER = 5;
private static final int SMALL_WIDTH_MULTIPLIER = 3;
+ private static final float ARROW_TOUCH_BOX_FACTOR = 5f;
private static final int PAGE_INDICATOR_ALPHA = 255;
private static final int DOT_ALPHA = 128;
@@ -130,10 +131,10 @@
private final float mGapWidth;
private final float mCircleGap;
private final boolean mIsRtl;
- private final VectorDrawable mArrowEnd;
- private final VectorDrawable mArrowStart;
- private final Rect mArrowEndBounds = new Rect();
- private final Rect mArrowStartBounds = new Rect();
+ private final VectorDrawable mArrowRight;
+ private final VectorDrawable mArrowLeft;
+ private final Rect mArrowRightBounds = new Rect();
+ private final Rect mArrowLeftBounds = new Rect();
private int mNumPages;
private int mActivePage;
@@ -185,8 +186,8 @@
: DOT_GAP_FACTOR * mDotRadius;
setOutlineProvider(new MyOutlineProver());
mIsRtl = Utilities.isRtl(getResources());
- mArrowEnd = (VectorDrawable) getResources().getDrawable(R.drawable.ic_chevron_end);
- mArrowStart = (VectorDrawable) getResources().getDrawable(R.drawable.ic_chevron_start);
+ mArrowRight = (VectorDrawable) getResources().getDrawable(R.drawable.ic_chevron_end);
+ mArrowLeft = (VectorDrawable) getResources().getDrawable(R.drawable.ic_chevron_start);
}
@Override
@@ -473,18 +474,51 @@
float y = getHeight() / 2;
if (mEntryAnimationRadiusFactors != null) {
- // During entry animation, only draw the circles
- // TODO(b/394355070): Verify Folder Entry Animation works correctly - visual updates
+ if (enableLauncherVisualRefresh()) {
+ x -= mDotRadius;
+ if (mIsRtl) {
+ x = getWidth() - x;
+ circleGap = -circleGap;
+ }
+ sTempRect.top = y - mDotRadius;
+ sTempRect.bottom = y + mDotRadius;
- if (mIsRtl) {
- x = getWidth() - x;
- circleGap = -circleGap;
- }
- for (int i = 0; i < mEntryAnimationRadiusFactors.length; i++) {
- mPaginationPaint.setAlpha(i == mActivePage ? PAGE_INDICATOR_ALPHA : DOT_ALPHA);
- canvas.drawCircle(x, y, mDotRadius * mEntryAnimationRadiusFactors[i],
- mPaginationPaint);
- x += circleGap;
+ for (int i = 0; i < mEntryAnimationRadiusFactors.length; i++) {
+ if (i == mActivePage) {
+ if (mIsRtl) {
+ sTempRect.left = x - (mDotRadius * 3);
+ sTempRect.right = x + mDotRadius;
+ x += circleGap - (mDotRadius * 2);
+ } else {
+ sTempRect.left = x - mDotRadius;
+ sTempRect.right = x + (mDotRadius * 3);
+ x += circleGap + (mDotRadius * 2);
+ }
+ scale(sTempRect, mEntryAnimationRadiusFactors[i]);
+ float scaledRadius = mDotRadius * mEntryAnimationRadiusFactors[i];
+ mPaginationPaint.setAlpha(PAGE_INDICATOR_ALPHA);
+ canvas.drawRoundRect(sTempRect, scaledRadius, scaledRadius,
+ mPaginationPaint);
+ } else {
+ mPaginationPaint.setAlpha(DOT_ALPHA);
+ canvas.drawCircle(x, y, mDotRadius * mEntryAnimationRadiusFactors[i],
+ mPaginationPaint);
+ x += circleGap;
+ }
+ }
+ } else {
+ // During entry animation, only draw the circles
+
+ if (mIsRtl) {
+ x = getWidth() - x;
+ circleGap = -circleGap;
+ }
+ for (int i = 0; i < mEntryAnimationRadiusFactors.length; i++) {
+ mPaginationPaint.setAlpha(i == mActivePage ? PAGE_INDICATOR_ALPHA : DOT_ALPHA);
+ canvas.drawCircle(x, y, mDotRadius * mEntryAnimationRadiusFactors[i],
+ mPaginationPaint);
+ x += circleGap;
+ }
}
} else {
// Save the current alpha value, so we can reset to it again after drawing the dots
@@ -514,14 +548,14 @@
if (mOnArrowClickListener != null && boundedPosition >= 1) {
// Here we draw the Left Arrow
- mArrowStart.setAlpha(alpha);
+ mArrowLeft.setAlpha(alpha);
int size = (int) (mGapWidth * 4);
- mArrowStartBounds.left = (int) (sTempRect.left - mGapWidth - size);
- mArrowStartBounds.top = (int) (y - size / 2);
- mArrowStartBounds.right = (int) (sTempRect.left - mGapWidth);
- mArrowStartBounds.bottom = (int) (y + size / 2);
- mArrowStart.setBounds(mArrowStartBounds);
- mArrowStart.draw(canvas);
+ mArrowLeftBounds.left = (int) (sTempRect.left - mGapWidth - size);
+ mArrowLeftBounds.top = (int) (y - size / 2);
+ mArrowLeftBounds.right = (int) (sTempRect.left - mGapWidth);
+ mArrowLeftBounds.bottom = (int) (y + size / 2);
+ mArrowLeft.setBounds(mArrowLeftBounds);
+ mArrowLeft.draw(canvas);
}
// Here we draw the dots, one at a time from the left-most dot to the right-most dot
@@ -575,14 +609,14 @@
if (mOnArrowClickListener != null && boundedPosition <= mNumPages - 2) {
// Here we draw the Right Arrow
- mArrowEnd.setAlpha(alpha);
+ mArrowRight.setAlpha(alpha);
int size = (int) (mGapWidth * 4);
- mArrowEndBounds.left = (int) sTempRect.left;
- mArrowEndBounds.top = (int) (y - size / 2);
- mArrowEndBounds.right = (int) (int) (sTempRect.left + size);
- mArrowEndBounds.bottom = (int) (y + size / 2);
- mArrowEnd.setBounds(mArrowEndBounds);
- mArrowEnd.draw(canvas);
+ mArrowRightBounds.left = (int) sTempRect.left;
+ mArrowRightBounds.top = (int) (y - size / 2);
+ mArrowRightBounds.right = (int) (int) (sTempRect.left + size);
+ mArrowRightBounds.bottom = (int) (y + size / 2);
+ mArrowRight.setBounds(mArrowRightBounds);
+ mArrowRight.draw(canvas);
}
} else {
// Here we draw the dots
@@ -606,9 +640,11 @@
public boolean onTouchEvent(MotionEvent ev) {
if (mOnArrowClickListener == null) {
// No - Op. Don't care about touch events
- } else if (withinExpandedBounds(mArrowStartBounds, ev)) {
+ } else if ((mIsRtl && withinExpandedBounds(mArrowRightBounds, ev))
+ || (!mIsRtl && withinExpandedBounds(mArrowLeftBounds, ev))) {
mOnArrowClickListener.accept(Direction.START);
- } else if (withinExpandedBounds(mArrowEndBounds, ev)) {
+ } else if ((mIsRtl && withinExpandedBounds(mArrowLeftBounds, ev))
+ || (!mIsRtl && withinExpandedBounds(mArrowRightBounds, ev))) {
mOnArrowClickListener.accept(Direction.END);
}
return super.onTouchEvent(ev);
@@ -616,18 +652,20 @@
// For larger Touch box
private boolean withinExpandedBounds(Rect rect, MotionEvent ev) {
- Rect scaledRect = new Rect();
- scaledRect.set(rect);
+ RectF scaledRect = new RectF(rect);
+ scale(scaledRect, ARROW_TOUCH_BOX_FACTOR);
+ return scaledRect.contains(ev.getX(), ev.getY());
+ }
- float verticalAdjustment = (scaledRect.bottom - scaledRect.top) * 2;
- scaledRect.top -= verticalAdjustment;
- scaledRect.bottom += verticalAdjustment;
+ private static void scale(RectF rect, float factor) {
+ float horizontalAdjustment = rect.width() * (factor - 1) / 2;
+ float verticalAdjustment = rect.height() * (factor - 1) / 2;
- float horizontalAdjustment = (scaledRect.right - scaledRect.left) * 2;
- scaledRect.left -= horizontalAdjustment;
- scaledRect.right += horizontalAdjustment;
+ rect.top -= verticalAdjustment;
+ rect.bottom += verticalAdjustment;
- return scaledRect.contains((int) ev.getX(), (int) ev.getY());
+ rect.left -= horizontalAdjustment;
+ rect.right += horizontalAdjustment;
}
private RectF getActiveRect() {
diff --git a/src/com/android/launcher3/popup/PopupContainerWithArrow.java b/src/com/android/launcher3/popup/PopupContainerWithArrow.java
index aad1400..39f68bf 100644
--- a/src/com/android/launcher3/popup/PopupContainerWithArrow.java
+++ b/src/com/android/launcher3/popup/PopupContainerWithArrow.java
@@ -16,9 +16,12 @@
package com.android.launcher3.popup;
+import static android.multiuser.Flags.enableMovingContentIntoPrivateSpace;
+
import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_SHORTCUTS;
import static com.android.launcher3.Utilities.squaredHypot;
import static com.android.launcher3.Utilities.squaredTouchSlop;
+import static com.android.launcher3.allapps.AlphabeticalAppsList.PRIVATE_SPACE_PACKAGE;
import static com.android.launcher3.model.data.ItemInfoWithIcon.FLAG_NOT_PINNABLE;
import static com.android.launcher3.popup.PopupPopulator.MAX_SHORTCUTS;
import static com.android.launcher3.util.Executors.MODEL_EXECUTOR;
@@ -65,6 +68,7 @@
import com.android.launcher3.views.BaseDragLayer;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
@@ -207,7 +211,10 @@
container = (PopupContainerWithArrow) launcher.getLayoutInflater().inflate(
R.layout.popup_container, launcher.getDragLayer(), false);
container.configureForLauncher(launcher, item);
- container.populateAndShowRows(icon, deepShortcutCount, systemShortcuts);
+ boolean shouldHideSystemShortcuts = enableMovingContentIntoPrivateSpace()
+ && Objects.equals(item.getTargetPackage(), PRIVATE_SPACE_PACKAGE);
+ container.populateAndShowRows(icon, deepShortcutCount,
+ shouldHideSystemShortcuts ? Collections.emptyList() : systemShortcuts);
launcher.refreshAndBindWidgetsForPackageUser(PackageUserKey.fromItemInfo(item));
container.requestFocus();
return container;
diff --git a/src/com/android/launcher3/popup/PopupDataProvider.java b/src/com/android/launcher3/popup/PopupDataProvider.java
index 5c1a755..9511032 100644
--- a/src/com/android/launcher3/popup/PopupDataProvider.java
+++ b/src/com/android/launcher3/popup/PopupDataProvider.java
@@ -26,7 +26,6 @@
import com.android.launcher3.BubbleTextView;
import com.android.launcher3.allapps.ActivityAllAppsContainerView;
import com.android.launcher3.dot.DotInfo;
-import com.android.launcher3.dot.FolderDotInfo;
import com.android.launcher3.folder.Folder;
import com.android.launcher3.folder.FolderIcon;
import com.android.launcher3.model.data.FolderInfo;
@@ -76,11 +75,7 @@
((BubbleTextView) v).applyDotState(info, true /* animate */);
} else if (v instanceof FolderIcon icon
&& info instanceof FolderInfo fi && fi.anyMatch(matcher)) {
- FolderDotInfo folderDotInfo = new FolderDotInfo();
- for (ItemInfo si : fi.getContents()) {
- folderDotInfo.addDotInfo(getDotInfoForItem(si));
- }
- icon.setDotInfo(folderDotInfo);
+ icon.updateDotInfo();
}
// process all the shortcuts
diff --git a/src/com/android/launcher3/provider/RestoreDbTask.java b/src/com/android/launcher3/provider/RestoreDbTask.java
index 23941bb..f6ee26b 100644
--- a/src/com/android/launcher3/provider/RestoreDbTask.java
+++ b/src/com/android/launcher3/provider/RestoreDbTask.java
@@ -80,6 +80,7 @@
import java.util.Collection;
import java.util.List;
import java.util.Map;
+import java.util.function.Supplier;
import java.util.stream.Collectors;
/**
@@ -206,7 +207,8 @@
LauncherRestoreEventLogger restoreEventLogger =
LauncherRestoreEventLogger.Companion.newInstance(context);
task.sanitizeDB(context, controller, db, backupManager, restoreEventLogger);
- task.restoreAppWidgetIdsIfExists(context, controller, restoreEventLogger);
+ task.restoreAppWidgetIdsIfExists(context, controller, restoreEventLogger,
+ () -> new AppWidgetHost(context, APPWIDGET_HOST_ID));
t.commit();
return true;
} catch (Exception e) {
@@ -438,14 +440,13 @@
@WorkerThread
@VisibleForTesting
void restoreAppWidgetIdsIfExists(Context context, ModelDbController controller,
- LauncherRestoreEventLogger restoreEventLogger) {
+ LauncherRestoreEventLogger restoreEventLogger, Supplier<AppWidgetHost> hostSupplier) {
LauncherPrefs lp = LauncherPrefs.get(context);
if (lp.has(APP_WIDGET_IDS, OLD_APP_WIDGET_IDS)) {
- AppWidgetHost host = new AppWidgetHost(context, APPWIDGET_HOST_ID);
restoreAppWidgetIds(context, controller, restoreEventLogger,
IntArray.fromConcatString(lp.get(OLD_APP_WIDGET_IDS)).toArray(),
IntArray.fromConcatString(lp.get(APP_WIDGET_IDS)).toArray(),
- host);
+ hostSupplier.get());
} else {
FileLog.d(TAG, "Did not receive new app widget id map during Launcher restore");
}
diff --git a/src/com/android/launcher3/util/ContentWriter.java b/src/com/android/launcher3/util/ContentWriter.java
index 9910dc2..c2c1fee 100644
--- a/src/com/android/launcher3/util/ContentWriter.java
+++ b/src/com/android/launcher3/util/ContentWriter.java
@@ -23,7 +23,6 @@
import com.android.launcher3.LauncherAppState;
import com.android.launcher3.LauncherSettings;
-import com.android.launcher3.LauncherSettings.Favorites;
import com.android.launcher3.icons.BitmapInfo;
import com.android.launcher3.icons.GraphicsUtils;
import com.android.launcher3.model.ModelDbController;
@@ -107,7 +106,7 @@
public int commit() {
if (mCommitParams != null) {
return mCommitParams.mDbController.update(
- Favorites.TABLE_NAME, getValues(mContext),
+ getValues(mContext),
mCommitParams.mWhere, mCommitParams.mSelectionArgs);
}
return 0;
diff --git a/src/com/android/launcher3/widget/LauncherAppWidgetHost.java b/src/com/android/launcher3/widget/LauncherAppWidgetHost.java
index 91b899c..63d2954 100644
--- a/src/com/android/launcher3/widget/LauncherAppWidgetHost.java
+++ b/src/com/android/launcher3/widget/LauncherAppWidgetHost.java
@@ -16,8 +16,6 @@
package com.android.launcher3.widget;
-import static com.android.launcher3.widget.LauncherWidgetHolder.APPWIDGET_HOST_ID;
-
import android.appwidget.AppWidgetHost;
import android.appwidget.AppWidgetProviderInfo;
import android.content.Context;
@@ -26,49 +24,18 @@
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
-import com.android.launcher3.LauncherAppState;
-import com.android.launcher3.util.Executors;
-import com.android.launcher3.widget.LauncherWidgetHolder.ProviderChangedListener;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.function.IntConsumer;
-
/**
* Specific {@link AppWidgetHost} that creates our {@link LauncherAppWidgetHostView}
* which correctly captures all long-press events. This ensures that users can
* always pick up and move widgets.
*/
-class LauncherAppWidgetHost extends AppWidgetHost {
- @NonNull
- private final List<ProviderChangedListener> mProviderChangeListeners;
-
- @NonNull
- private final Context mContext;
-
- @Nullable
- private final IntConsumer mAppWidgetRemovedCallback;
+class LauncherAppWidgetHost extends ListenableAppWidgetHost {
@Nullable
private ListenableHostView mViewToRecycle;
- public LauncherAppWidgetHost(@NonNull Context context,
- @Nullable IntConsumer appWidgetRemovedCallback,
- List<ProviderChangedListener> providerChangeListeners) {
- super(context, APPWIDGET_HOST_ID);
- mContext = context;
- mAppWidgetRemovedCallback = appWidgetRemovedCallback;
- mProviderChangeListeners = providerChangeListeners;
- }
-
- @Override
- protected void onProvidersChanged() {
- if (!mProviderChangeListeners.isEmpty()) {
- for (LauncherWidgetHolder.ProviderChangedListener callback :
- new ArrayList<>(mProviderChangeListeners)) {
- callback.notifyWidgetProvidersChanged();
- }
- }
+ LauncherAppWidgetHost(@NonNull Context context, int appWidgetId) {
+ super(context, appWidgetId);
}
/**
@@ -94,35 +61,6 @@
}
/**
- * Called when the AppWidget provider for a AppWidget has been upgraded to a new apk.
- */
- @Override
- protected void onProviderChanged(int appWidgetId, @NonNull AppWidgetProviderInfo appWidget) {
- LauncherAppWidgetProviderInfo info = LauncherAppWidgetProviderInfo.fromProviderInfo(
- mContext, appWidget);
- super.onProviderChanged(appWidgetId, info);
- // The super method updates the dimensions of the providerInfo. Update the
- // launcher spans accordingly.
- info.initSpans(mContext, LauncherAppState.getIDP(mContext));
- }
-
- /**
- * Called on an appWidget is removed for a widgetId
- *
- * @param appWidgetId TODO: make this override when SDK is updated
- */
- @Override
- public void onAppWidgetRemoved(int appWidgetId) {
- if (mAppWidgetRemovedCallback == null) {
- return;
- }
- // Route the call via model thread, in case it comes while a loader-bind is in progress
- Executors.MODEL_EXECUTOR.execute(
- () -> Executors.MAIN_EXECUTOR.execute(
- () -> mAppWidgetRemovedCallback.accept(appWidgetId)));
- }
-
- /**
* The same as super.clearViews(), except with the scope exposed
*/
@Override
diff --git a/src/com/android/launcher3/widget/LauncherWidgetHolder.java b/src/com/android/launcher3/widget/LauncherWidgetHolder.java
index 78197e2..642f35a 100644
--- a/src/com/android/launcher3/widget/LauncherWidgetHolder.java
+++ b/src/com/android/launcher3/widget/LauncherWidgetHolder.java
@@ -20,10 +20,9 @@
import static com.android.launcher3.BuildConfig.WIDGETS_ENABLED;
import static com.android.launcher3.Flags.enableWorkspaceInflation;
import static com.android.launcher3.util.Executors.MAIN_EXECUTOR;
-import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR;
import static com.android.launcher3.widget.LauncherAppWidgetProviderInfo.fromProviderInfo;
+import static com.android.launcher3.widget.ListenableAppWidgetHost.getWidgetHolderExecutor;
-import android.appwidget.AppWidgetHost;
import android.appwidget.AppWidgetHostView;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProviderInfo;
@@ -32,6 +31,7 @@
import android.content.Intent;
import android.os.Bundle;
import android.os.Looper;
+import android.util.Log;
import android.util.SparseArray;
import android.widget.Toast;
@@ -43,18 +43,23 @@
import com.android.launcher3.BaseActivity;
import com.android.launcher3.R;
import com.android.launcher3.Utilities;
+import com.android.launcher3.dagger.LauncherComponentProvider;
import com.android.launcher3.model.data.ItemInfo;
import com.android.launcher3.testing.TestLogging;
import com.android.launcher3.testing.shared.TestProtocol;
-import com.android.launcher3.util.LooperExecutor;
-import com.android.launcher3.util.ResourceBasedOverride;
import com.android.launcher3.util.SafeCloseable;
import com.android.launcher3.views.ActivityContext;
+import com.android.launcher3.widget.ListenableAppWidgetHost.ProviderChangedListener;
import com.android.launcher3.widget.custom.CustomWidgetManager;
+import dagger.assisted.Assisted;
+import dagger.assisted.AssistedFactory;
+import dagger.assisted.AssistedInject;
+
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Consumer;
import java.util.function.IntConsumer;
/**
@@ -62,51 +67,57 @@
* background.
*/
public class LauncherWidgetHolder {
+
+ private static final String TAG = "LauncherWidgetHolder";
+
public static final int APPWIDGET_HOST_ID = 1024;
protected static final int FLAG_LISTENING = 1;
protected static final int FLAG_STATE_IS_NORMAL = 1 << 1;
protected static final int FLAG_ACTIVITY_STARTED = 1 << 2;
protected static final int FLAG_ACTIVITY_RESUMED = 1 << 3;
+
private static final int FLAGS_SHOULD_LISTEN =
FLAG_STATE_IS_NORMAL | FLAG_ACTIVITY_STARTED | FLAG_ACTIVITY_RESUMED;
- @NonNull
- protected final Context mContext;
-
- @NonNull
- private final AppWidgetHost mWidgetHost;
-
- @NonNull
- protected final SparseArray<LauncherAppWidgetHostView> mViews = new SparseArray<>();
- protected final List<ProviderChangedListener> mProviderChangedListeners = new ArrayList<>();
-
- protected AtomicInteger mFlags = new AtomicInteger(FLAG_STATE_IS_NORMAL);
-
// TODO(b/191735836): Replace with ActivityOptions.KEY_SPLASH_SCREEN_STYLE when un-hidden
private static final String KEY_SPLASH_SCREEN_STYLE = "android.activity.splashScreenStyle";
// TODO(b/191735836): Replace with SplashScreen.SPLASH_SCREEN_STYLE_EMPTY when un-hidden
private static final int SPLASH_SCREEN_STYLE_EMPTY = 0;
- protected LauncherWidgetHolder(@NonNull Context context,
- @Nullable IntConsumer appWidgetRemovedCallback) {
+ @NonNull
+ protected final Context mContext;
+
+ @NonNull
+ protected final ListenableAppWidgetHost mWidgetHost;
+
+ @NonNull
+ protected final SparseArray<LauncherAppWidgetHostView> mViews = new SparseArray<>();
+
+ /** package visibility */
+ final List<ProviderChangedListener> mProviderChangedListeners = new ArrayList<>();
+
+ protected AtomicInteger mFlags = new AtomicInteger(FLAG_STATE_IS_NORMAL);
+
+ @Nullable
+ private Consumer<LauncherAppWidgetHostView> mOnViewCreationCallback;
+
+ /** package visibility */
+ @Nullable IntConsumer mAppWidgetRemovedCallback;
+
+ @AssistedInject
+ protected LauncherWidgetHolder(@Assisted("UI_CONTEXT") @NonNull Context context) {
+ this(context, new LauncherAppWidgetHost(context, APPWIDGET_HOST_ID));
+ }
+
+ protected LauncherWidgetHolder(
+ @NonNull Context context, @NonNull ListenableAppWidgetHost appWidgetHost) {
mContext = context;
- mWidgetHost = createHost(context, appWidgetRemovedCallback);
+ mWidgetHost = appWidgetHost;
+ MAIN_EXECUTOR.execute(() -> mWidgetHost.getHolders().add(this));
}
- protected AppWidgetHost createHost(
- Context context, @Nullable IntConsumer appWidgetRemovedCallback) {
- return new LauncherAppWidgetHost(
- context, appWidgetRemovedCallback, mProviderChangedListeners);
- }
-
- protected LooperExecutor getWidgetHolderExecutor() {
- return UI_HELPER_EXECUTOR;
- }
-
- /**
- * Starts listening to the widget updates from the server side
- */
+ /** Starts listening to the widget updates from the server side */
public void startListening() {
if (!WIDGETS_ENABLED) {
return;
@@ -127,13 +138,11 @@
// TODO: Investigate why widgetHost.startListening() always return non-empty updates
setListeningFlag(true);
- MAIN_EXECUTOR.execute(() -> updateDeferredView());
+ MAIN_EXECUTOR.execute(this::updateDeferredView);
});
}
- /**
- * Update any views which have been deferred because the host was not listening.
- */
+ /** Update any views which have been deferred because the host was not listening */
protected void updateDeferredView() {
// Update any views which have been deferred because the host was not listening.
// We go in reverse order and inflate any deferred or cached widget
@@ -180,7 +189,14 @@
* Called when the launcher is destroyed
*/
public void destroy() {
- // No-op
+ try {
+ MAIN_EXECUTOR.submit(() -> {
+ clearViews();
+ mWidgetHost.getHolders().remove(this);
+ }).get();
+ } catch (Exception e) {
+ Log.e(TAG, "Failed to remove self from holder list", e);
+ }
}
/**
@@ -198,8 +214,7 @@
* Add a listener that is triggered when the providers of the widgets are changed
* @param listener The listener that notifies when the providers changed
*/
- public void addProviderChangeListener(
- @NonNull LauncherWidgetHolder.ProviderChangedListener listener) {
+ public void addProviderChangeListener(@NonNull ProviderChangedListener listener) {
MAIN_EXECUTOR.execute(() -> mProviderChangedListeners.add(listener));
}
@@ -207,12 +222,23 @@
* Remove the specified listener from the host
* @param listener The listener that is to be removed from the host
*/
- public void removeProviderChangeListener(
- LauncherWidgetHolder.ProviderChangedListener listener) {
+ public void removeProviderChangeListener(ProviderChangedListener listener) {
MAIN_EXECUTOR.execute(() -> mProviderChangedListeners.remove(listener));
}
/**
+ * Sets a callbacks for whenever a widget view is created
+ */
+ public void setOnViewCreationCallback(@Nullable Consumer<LauncherAppWidgetHostView> callback) {
+ mOnViewCreationCallback = callback;
+ }
+
+ /** Sets a callback for listening app widget removals */
+ public void setAppWidgetRemovedCallback(@Nullable IntConsumer callback) {
+ mAppWidgetRemovedCallback = callback;
+ }
+
+ /**
* Starts the configuration activity for the widget
* @param activity The activity in which to start the configuration page
* @param widgetId The ID of the widget
@@ -284,9 +310,7 @@
activity.startActivityForResult(intent, requestCode);
}
- /**
- * Stop the host from listening to the widget updates
- */
+ /** Stop the host from listening to the widget updates */
public void stopListening() {
if (!WIDGETS_ENABLED) {
return;
@@ -298,8 +322,8 @@
}
/**
- * Update {@link FLAG_LISTENING} on {@link mFlags} after making binder calls from
- * {@link sWidgetHost}.
+ * Update {@link #FLAG_LISTENING} on {@link #mFlags} after making binder calls from
+ * {@link #mWidgetHost}.
*/
@WorkerThread
protected void setListeningFlag(final boolean isListening) {
@@ -350,6 +374,7 @@
}
LauncherAppWidgetHostView view = createViewInternal(appWidgetId, appWidget);
+ if (mOnViewCreationCallback != null) mOnViewCreationCallback.accept(view);
// Do not update mViews on a background thread call, as the holder is not thread safe.
if (!enableWorkspaceInflation() || Looper.myLooper() == Looper.getMainLooper()) {
mViews.put(appWidgetId, view);
@@ -368,8 +393,8 @@
// Binder can also inflate placeholder widgets in case of backup-restore. Skip
// attaching such widgets
- boolean isRealWidget = ((view instanceof PendingAppWidgetHostView pw)
- ? pw.isDeferredWidget() : true)
+ boolean isRealWidget = (!(view instanceof PendingAppWidgetHostView pw)
+ || pw.isDeferredWidget())
&& view.getAppWidgetInfo() != null;
if (isRealWidget && mViews.get(view.getAppWidgetId()) != view) {
view = recycleExistingView(view);
@@ -446,28 +471,13 @@
}
}
- /**
- * Listener for getting notifications on provider changes.
- */
- public interface ProviderChangedListener {
- /**
- * Notify the listener that the providers have changed
- */
- void notifyWidgetProvidersChanged();
- }
-
- /**
- * Clears all the views from the host
- */
+ /** Clears all the views from the host */
public void clearViews() {
- LauncherAppWidgetHost tempHost = (LauncherAppWidgetHost) mWidgetHost;
- tempHost.clearViews();
+ ((LauncherAppWidgetHost) mWidgetHost).clearViews();
mViews.clear();
}
- /**
- * Clears all the internal widget views
- */
+ /** Clears all the internal widget views */
public void clearWidgetViews() {
clearViews();
}
@@ -514,32 +524,19 @@
* Returns the new LauncherWidgetHolder instance
*/
public static LauncherWidgetHolder newInstance(Context context) {
- return HolderFactory.newFactory(context).newInstance(context, null);
+ return LauncherComponentProvider.get(context).getWidgetHolderFactory().newInstance(context);
}
- /**
- * A factory class that generates new instances of {@code LauncherWidgetHolder}
- */
- public static class HolderFactory implements ResourceBasedOverride {
+ /** A factory that generates new instances of {@code LauncherWidgetHolder} */
+ public interface WidgetHolderFactory {
- /**
- * @param context The context of the caller
- * @param appWidgetRemovedCallback The callback that is called when widgets are removed
- * @return A new instance of {@code LauncherWidgetHolder}
- */
- public LauncherWidgetHolder newInstance(@NonNull Context context,
- @Nullable IntConsumer appWidgetRemovedCallback) {
- return new LauncherWidgetHolder(context, appWidgetRemovedCallback);
- }
+ LauncherWidgetHolder newInstance(@NonNull Context context);
+ }
- /**
- * @param context The context of the caller
- * @return A new instance of factory class for widget holders. If not specified, returning
- * {@code HolderFactory} by default.
- */
- public static HolderFactory newFactory(Context context) {
- return Overrides.getObject(
- HolderFactory.class, context, R.string.widget_holder_factory_class);
- }
+ /** A factory that generates new instances of {@code LauncherWidgetHolder} */
+ @AssistedFactory
+ public interface WidgetHolderFactoryImpl extends WidgetHolderFactory {
+
+ LauncherWidgetHolder newInstance(@Assisted("UI_CONTEXT") @NonNull Context context);
}
}
diff --git a/src/com/android/launcher3/widget/ListenableAppWidgetHost.kt b/src/com/android/launcher3/widget/ListenableAppWidgetHost.kt
new file mode 100644
index 0000000..58bf0aa
--- /dev/null
+++ b/src/com/android/launcher3/widget/ListenableAppWidgetHost.kt
@@ -0,0 +1,72 @@
+/*
+ * 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.widget
+
+import android.appwidget.AppWidgetHost
+import android.appwidget.AppWidgetProviderInfo
+import android.content.Context
+import com.android.launcher3.InvariantDeviceProfile
+import com.android.launcher3.util.Executors
+import com.android.launcher3.util.Executors.MAIN_EXECUTOR
+import com.android.launcher3.util.Executors.MODEL_EXECUTOR
+import com.android.launcher3.util.LooperExecutor
+
+open class ListenableAppWidgetHost(private val ctx: Context, hostId: Int) :
+ AppWidgetHost(ctx, hostId) {
+
+ protected val holders = mutableListOf<LauncherWidgetHolder>()
+
+ override fun onProvidersChanged() {
+ MAIN_EXECUTOR.execute {
+ holders.forEach { holder ->
+ // Listeners might remove themselves from the list during the iteration.
+ // Creating a copy of the list to avoid exceptions for concurrent modification.
+ holder.mProviderChangedListeners.toList().forEach {
+ it.notifyWidgetProvidersChanged()
+ }
+ }
+ }
+ }
+
+ override fun onAppWidgetRemoved(appWidgetId: Int) {
+ // Route the call via model thread, in case it comes while a loader-bind is in progress
+ MODEL_EXECUTOR.execute {
+ MAIN_EXECUTOR.execute {
+ holders.forEach { it.mAppWidgetRemovedCallback?.accept(appWidgetId) }
+ }
+ }
+ }
+
+ override fun onProviderChanged(appWidgetId: Int, appWidget: AppWidgetProviderInfo) {
+ val info = LauncherAppWidgetProviderInfo.fromProviderInfo(ctx, appWidget)
+ super.onProviderChanged(appWidgetId, info)
+ // The super method updates the dimensions of the providerInfo. Update the
+ // launcher spans accordingly.
+ info.initSpans(ctx, InvariantDeviceProfile.INSTANCE.get(ctx))
+ }
+
+ /** Listener for getting notifications on provider changes. */
+ fun interface ProviderChangedListener {
+ /** Notify the listener that the providers have changed */
+ fun notifyWidgetProvidersChanged()
+ }
+
+ companion object {
+
+ @JvmStatic val widgetHolderExecutor: LooperExecutor = Executors.UI_HELPER_EXECUTOR
+ }
+}
diff --git a/src/com/android/launcher3/widget/PendingAppWidgetHostView.java b/src/com/android/launcher3/widget/PendingAppWidgetHostView.java
index cd8e457..1c29f89 100644
--- a/src/com/android/launcher3/widget/PendingAppWidgetHostView.java
+++ b/src/com/android/launcher3/widget/PendingAppWidgetHostView.java
@@ -66,7 +66,7 @@
import com.android.launcher3.util.RunnableList;
import com.android.launcher3.util.SafeCloseable;
import com.android.launcher3.util.Themes;
-import com.android.launcher3.widget.LauncherWidgetHolder.ProviderChangedListener;
+import com.android.launcher3.widget.ListenableAppWidgetHost.ProviderChangedListener;
import java.util.List;
diff --git a/src_no_quickstep/com/android/launcher3/dagger/Modules.kt b/src_no_quickstep/com/android/launcher3/dagger/Modules.kt
index c3bf7c5..7dbe9c3 100644
--- a/src_no_quickstep/com/android/launcher3/dagger/Modules.kt
+++ b/src_no_quickstep/com/android/launcher3/dagger/Modules.kt
@@ -16,6 +16,9 @@
package com.android.launcher3.dagger
+import com.android.launcher3.widget.LauncherWidgetHolder.WidgetHolderFactory
+import com.android.launcher3.widget.LauncherWidgetHolder.WidgetHolderFactoryImpl
+import dagger.Binds
import dagger.Module
private object Modules {}
@@ -24,6 +27,12 @@
@Module abstract class ApiWrapperModule {}
+@Module
+abstract class WidgetModule {
+ @Binds
+ abstract fun bindWidgetHolderFactory(factor: WidgetHolderFactoryImpl): WidgetHolderFactory
+}
+
@Module abstract class PluginManagerWrapperModule {}
@Module object StaticObjectModule {}
diff --git a/tests/multivalentTests/src/com/android/launcher3/AbstractDeviceProfileTest.kt b/tests/multivalentTests/src/com/android/launcher3/AbstractDeviceProfileTest.kt
index a30261e..dc49ba0 100644
--- a/tests/multivalentTests/src/com/android/launcher3/AbstractDeviceProfileTest.kt
+++ b/tests/multivalentTests/src/com/android/launcher3/AbstractDeviceProfileTest.kt
@@ -39,7 +39,6 @@
import com.android.launcher3.util.SandboxContext
import com.android.launcher3.util.WindowBounds
import com.android.launcher3.util.rule.TestStabilityRule
-import com.android.launcher3.util.rule.ZipFilesRule
import com.android.launcher3.util.rule.setFlags
import com.android.launcher3.util.window.CachedDisplayInfo
import com.android.launcher3.util.window.WindowManagerProxy
@@ -52,7 +51,6 @@
import java.io.StringWriter
import kotlin.math.max
import kotlin.math.min
-import org.junit.ClassRule
import org.junit.Rule
import org.mockito.kotlin.any
import org.mockito.kotlin.doReturn
@@ -82,13 +80,6 @@
@Rule @JvmField val limitDevicesRule = LimitDevicesRule()
- companion object {
- @ClassRule
- @JvmField
- val resultZipRule =
- ZipFilesRule(InstrumentationRegistry.getInstrumentation().targetContext, "DumpTest")
- }
-
class DeviceSpec(
val naturalSize: Pair<Int, Int>,
var densityDpi: Int,
@@ -375,7 +366,6 @@
private fun writeToDevice(context: Context, fileName: String, content: String) {
val file = File(context.getDir("dumpTests", Context.MODE_PRIVATE), fileName)
file.writeText(content)
- resultZipRule.write(file)
}
protected fun Float.dpToPx(): Float {
diff --git a/tests/multivalentTests/src/com/android/launcher3/celllayout/FavoriteItemsTransaction.java b/tests/multivalentTests/src/com/android/launcher3/celllayout/FavoriteItemsTransaction.java
index 47110fa..f772339 100644
--- a/tests/multivalentTests/src/com/android/launcher3/celllayout/FavoriteItemsTransaction.java
+++ b/tests/multivalentTests/src/com/android/launcher3/celllayout/FavoriteItemsTransaction.java
@@ -15,7 +15,6 @@
*/
package com.android.launcher3.celllayout;
-import static com.android.launcher3.LauncherSettings.Favorites.TABLE_NAME;
import static com.android.launcher3.util.Executors.MAIN_EXECUTOR;
import static com.android.launcher3.util.Executors.MODEL_EXECUTOR;
import static com.android.launcher3.util.TestUtil.runOnExecutorSync;
@@ -89,7 +88,7 @@
item.onAddToDatabase(writer);
writer.put(LauncherSettings.Favorites._ID, i);
- controller.insert(TABLE_NAME, writer.getValues(mContext));
+ controller.insert(writer.getValues(mContext));
}
for (int i = 0; i < containerItems.size(); i++) {
@@ -97,7 +96,7 @@
ItemInfo item = containerItems.get(i);
item.onAddToDatabase(writer);
writer.put(LauncherSettings.Favorites._ID, count + i);
- controller.insert(TABLE_NAME, writer.getValues(mContext));
+ controller.insert(writer.getValues(mContext));
}
transaction.commit();
}
diff --git a/tests/multivalentTests/src/com/android/launcher3/celllayout/board/TestWorkspaceBuilder.kt b/tests/multivalentTests/src/com/android/launcher3/celllayout/board/TestWorkspaceBuilder.kt
index 2e556e8..3405cae 100644
--- a/tests/multivalentTests/src/com/android/launcher3/celllayout/board/TestWorkspaceBuilder.kt
+++ b/tests/multivalentTests/src/com/android/launcher3/celllayout/board/TestWorkspaceBuilder.kt
@@ -44,7 +44,7 @@
private fun fillWithWidgets(
widgetRect: WidgetRect,
transaction: FavoriteItemsTransaction,
- screenId: Int
+ screenId: Int,
): FavoriteItemsTransaction {
val initX = widgetRect.cellX
val initY = widgetRect.cellY
@@ -76,7 +76,7 @@
appComponentName =
ComponentName(
InstrumentationRegistry.getInstrumentation().context.packageName,
- TEST_ACTIVITY_PACKAGE_PREFIX + testAppName
+ TEST_ACTIVITY_PACKAGE_PREFIX + testAppName,
)
}
@@ -92,7 +92,7 @@
private fun addCorrespondingWidgetRect(
widgetRect: WidgetRect,
transaction: FavoriteItemsTransaction,
- screenId: Int
+ screenId: Int,
) {
if (widgetRect.type == 'x') {
fillWithWidgets(widgetRect, transaction, screenId)
@@ -105,7 +105,7 @@
fun buildFromBoard(
board: CellLayoutBoard,
transaction: FavoriteItemsTransaction,
- screenId: Int
+ screenId: Int,
): FavoriteItemsTransaction {
board.widgets.forEach { addCorrespondingWidgetRect(it, transaction, screenId) }
board.icons.forEach { transaction.addItem { createIconInCell(it, screenId) } }
@@ -130,7 +130,7 @@
WidgetUtils.createWidgetInfo(
TestViewHelpers.findWidgetProvider(false),
ApplicationProvider.getApplicationContext(),
- true
+ true,
)
.apply {
cellX = widgetRect.cellX
@@ -154,7 +154,7 @@
minSpanY = 1
setOption(FolderInfo.FLAG_MULTI_PAGE_ANIMATION, true, null)
for (i in 0 until folderPoint.numberIconsInside) {
- add(getDefaultWorkspaceItem(paramScreenId), false)
+ add(getDefaultWorkspaceItem(paramScreenId))
}
}
diff --git a/tests/multivalentTests/src/com/android/launcher3/folder/FolderTest.kt b/tests/multivalentTests/src/com/android/launcher3/folder/FolderTest.kt
index bcf5f0d..e825995 100644
--- a/tests/multivalentTests/src/com/android/launcher3/folder/FolderTest.kt
+++ b/tests/multivalentTests/src/com/android/launcher3/folder/FolderTest.kt
@@ -298,12 +298,13 @@
val dragObject = DragObject(context)
dragObject.dragInfo = Mockito.mock(ItemInfo::class.java)
folder.mContent = Mockito.mock(FolderPagedView::class.java)
+ folder.mFolderIcon = Mockito.mock(FolderIcon::class.java)
dragObject.dragSource = folder
folder.onDragStart(dragObject, DragOptions())
verify(folder.mContent, times(1)).removeItem(folder.currentDragView)
- verify(folder.mInfo, times(1)).remove(dragObject.dragInfo, true)
+ verify(folder, times(1)).removeFolderContent(true, dragObject.dragInfo)
assertTrue(folder.itemsInvalidated)
assertTrue(folder.isDragInProgress)
assertFalse(folder.itemAddedBackToSelfViaIcon)
@@ -827,19 +828,19 @@
@Test
fun `onRemove should call removeItem with the correct views`() {
+ val folderInfo =
+ workspaceBuilder.createFolderInCell(FolderPoint(Point(1, 0), TWO_ICON_FOLDER_TYPE), 0)
+ val items = folderInfo.getContents().toTypedArray()
+ folder.mInfo = folderInfo
+ folder.mFolderIcon = Mockito.mock(FolderIcon::class.java)
folder.mContent = Mockito.mock(FolderPagedView::class.java)
- val items =
- arrayListOf<ItemInfo>(
- Mockito.mock(ItemInfo::class.java),
- Mockito.mock(ItemInfo::class.java),
- )
val view1 = Mockito.mock(View::class.java)
val view2 = Mockito.mock(View::class.java)
doReturn(view1).whenever(folder).getViewForInfo(items[0])
doReturn(view2).whenever(folder).getViewForInfo(items[1])
doReturn(2).whenever(folder).itemCount
- folder.onRemove(items)
+ folder.removeFolderContent(false, *items)
verify(folder.mContent, times(1)).removeItem(view1)
verify(folder.mContent, times(1)).removeItem(view2)
@@ -847,20 +848,20 @@
@Test
fun `onRemove should set mRearrangeOnClose to true and not call rearrangeChildren if animating`() {
+ val folderInfo =
+ workspaceBuilder.createFolderInCell(FolderPoint(Point(1, 0), TWO_ICON_FOLDER_TYPE), 0)
+ val items = folderInfo.getContents().toTypedArray()
+ folder.mInfo = folderInfo
+ folder.mFolderIcon = Mockito.mock(FolderIcon::class.java)
folder.mContent = Mockito.mock(FolderPagedView::class.java)
folder.state = STATE_ANIMATING
- val items =
- arrayListOf<ItemInfo>(
- Mockito.mock(ItemInfo::class.java),
- Mockito.mock(ItemInfo::class.java),
- )
val view1 = Mockito.mock(View::class.java)
val view2 = Mockito.mock(View::class.java)
doReturn(view1).whenever(folder).getViewForInfo(items[0])
doReturn(view2).whenever(folder).getViewForInfo(items[1])
doReturn(2).whenever(folder).itemCount
- folder.onRemove(items)
+ folder.removeFolderContent(true, *items)
assertTrue(folder.rearrangeOnClose)
verify(folder, times(0)).rearrangeChildren()
@@ -868,21 +869,21 @@
@Test
fun `onRemove should set not change mRearrangeOnClose and not call rearrangeChildren if not animating`() {
+ val folderInfo =
+ workspaceBuilder.createFolderInCell(FolderPoint(Point(1, 0), TWO_ICON_FOLDER_TYPE), 0)
+ val items = folderInfo.getContents().toTypedArray()
+ folder.mInfo = folderInfo
+ folder.mFolderIcon = Mockito.mock(FolderIcon::class.java)
folder.mContent = Mockito.mock(FolderPagedView::class.java)
folder.state = STATE_CLOSED
folder.rearrangeOnClose = false
- val items =
- arrayListOf<ItemInfo>(
- Mockito.mock(ItemInfo::class.java),
- Mockito.mock(ItemInfo::class.java),
- )
val view1 = Mockito.mock(View::class.java)
val view2 = Mockito.mock(View::class.java)
doReturn(view1).whenever(folder).getViewForInfo(items[0])
doReturn(view2).whenever(folder).getViewForInfo(items[1])
doReturn(2).whenever(folder).itemCount
- folder.onRemove(items)
+ folder.removeFolderContent(false, *items)
assertFalse(folder.rearrangeOnClose)
verify(folder, times(1)).rearrangeChildren()
@@ -890,12 +891,12 @@
@Test
fun `onRemove should call close if mIsOpen is true and item count is less than or equal to one`() {
+ val folderInfo =
+ workspaceBuilder.createFolderInCell(FolderPoint(Point(1, 0), TWO_ICON_FOLDER_TYPE), 0)
+ val items = folderInfo.getContents().toTypedArray()
+ folder.mInfo = folderInfo
+ folder.mFolderIcon = Mockito.mock(FolderIcon::class.java)
folder.mContent = Mockito.mock(FolderPagedView::class.java)
- val items =
- arrayListOf<ItemInfo>(
- Mockito.mock(ItemInfo::class.java),
- Mockito.mock(ItemInfo::class.java),
- )
val view1 = Mockito.mock(View::class.java)
val view2 = Mockito.mock(View::class.java)
doReturn(view1).whenever(folder).getViewForInfo(items[0])
@@ -904,19 +905,19 @@
folder.setIsOpen(true)
doNothing().`when`(folder).close(true)
- folder.onRemove(items)
+ folder.removeFolderContent(false, *items)
verify(folder, times(1)).close(true)
}
@Test
fun `onRemove should call replaceFolderWithFinalItem if mIsOpen is false and item count is less than or equal to one`() {
+ val folderInfo =
+ workspaceBuilder.createFolderInCell(FolderPoint(Point(1, 0), TWO_ICON_FOLDER_TYPE), 0)
+ val items = folderInfo.getContents().toTypedArray()
+ folder.mInfo = folderInfo
+ folder.mFolderIcon = Mockito.mock(FolderIcon::class.java)
folder.mContent = Mockito.mock(FolderPagedView::class.java)
- val items =
- arrayListOf<ItemInfo>(
- Mockito.mock(ItemInfo::class.java),
- Mockito.mock(ItemInfo::class.java),
- )
val view1 = Mockito.mock(View::class.java)
val view2 = Mockito.mock(View::class.java)
doReturn(view1).whenever(folder).getViewForInfo(items[0])
@@ -924,7 +925,7 @@
doReturn(1).whenever(folder).itemCount
folder.setIsOpen(false)
- folder.onRemove(items)
+ folder.removeFolderContent(false, *items)
verify(folder, times(1)).replaceFolderWithFinalItem()
}
diff --git a/tests/multivalentTests/src/com/android/launcher3/model/DatabaseHelperTest.kt b/tests/multivalentTests/src/com/android/launcher3/model/DatabaseHelperTest.kt
index 09752b8..89e676f 100644
--- a/tests/multivalentTests/src/com/android/launcher3/model/DatabaseHelperTest.kt
+++ b/tests/multivalentTests/src/com/android/launcher3/model/DatabaseHelperTest.kt
@@ -11,6 +11,7 @@
import com.android.launcher3.LauncherSettings.Favorites.addTableToDb
import com.android.launcher3.pm.UserCache
import com.android.launcher3.provider.LauncherDbUtils
+import com.android.launcher3.util.ModelTestExtensions
import java.util.function.ToLongFunction
import org.junit.After
import org.junit.Assert.assertEquals
@@ -33,7 +34,7 @@
@Before
fun setUp() {
- db = FactitiousDbController(context, INSERTION_SQL).inMemoryDb
+ db = ModelTestExtensions.createInMemoryDb(INSERTION_SQL)
}
@After
diff --git a/tests/multivalentTests/src/com/android/launcher3/model/FactitiousDbController.kt b/tests/multivalentTests/src/com/android/launcher3/model/FactitiousDbController.kt
deleted file mode 100644
index 711e1d2..0000000
--- a/tests/multivalentTests/src/com/android/launcher3/model/FactitiousDbController.kt
+++ /dev/null
@@ -1,60 +0,0 @@
-package com.android.launcher3.model
-
-import android.content.Context
-import android.database.Cursor
-import android.database.sqlite.SQLiteDatabase
-import androidx.test.platform.app.InstrumentationRegistry
-import java.io.BufferedReader
-import java.io.InputStreamReader
-
-private val All_COLUMNS =
- arrayOf(
- "_id",
- "title",
- "intent",
- "container",
- "screen",
- "cellX",
- "cellY",
- "spanX",
- "spanY",
- "itemType",
- "appWidgetId",
- "icon",
- "appWidgetProvider",
- "modified",
- "restored",
- "profileId",
- "rank",
- "options",
- "appWidgetSource"
- )
-
-class FactitiousDbController(context: Context, insertFile: String) : ModelDbController(context) {
-
- val inMemoryDb: SQLiteDatabase by lazy {
- SQLiteDatabase.createInMemory(SQLiteDatabase.OpenParams.Builder().build()).also { db ->
- BufferedReader(
- InputStreamReader(
- InstrumentationRegistry.getInstrumentation().context.assets.open(insertFile)
- )
- )
- .lines()
- .forEach { sqlStatement -> db.execSQL(sqlStatement) }
- }
- }
-
- override fun query(
- table: String,
- projection: Array<out String>?,
- selection: String?,
- selectionArgs: Array<out String>?,
- sortOrder: String?
- ): Cursor {
- return inMemoryDb.query(table, All_COLUMNS, selection, selectionArgs, null, null, sortOrder)
- }
-
- override fun loadDefaultFavoritesIfNecessary() {
- // No-Op
- }
-}
diff --git a/tests/multivalentTests/src/com/android/launcher3/provider/RestoreDbTaskTest.java b/tests/multivalentTests/src/com/android/launcher3/provider/RestoreDbTaskTest.java
index c30b730..0f4940e 100644
--- a/tests/multivalentTests/src/com/android/launcher3/provider/RestoreDbTaskTest.java
+++ b/tests/multivalentTests/src/com/android/launcher3/provider/RestoreDbTaskTest.java
@@ -24,8 +24,6 @@
import static com.android.launcher3.LauncherPrefs.RESTORE_DEVICE;
import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_DESKTOP;
import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_APPLICATION;
-import static com.android.launcher3.LauncherSettings.Favorites.TABLE_NAME;
-import static com.android.launcher3.widget.LauncherWidgetHolder.APPWIDGET_HOST_ID;
import static com.google.common.truth.Truth.assertThat;
@@ -50,7 +48,6 @@
import android.database.sqlite.SQLiteDatabase;
import android.os.UserHandle;
import android.os.UserManager;
-import android.util.LongSparseArray;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;
@@ -60,9 +57,17 @@
import com.android.launcher3.LauncherSettings;
import com.android.launcher3.LauncherSettings.Favorites;
import com.android.launcher3.backuprestore.LauncherRestoreEventLogger;
+import com.android.launcher3.dagger.LauncherAppComponent;
+import com.android.launcher3.dagger.LauncherAppSingleton;
import com.android.launcher3.model.ModelDbController;
+import com.android.launcher3.pm.UserCache;
+import com.android.launcher3.util.AllModulesForTest;
import com.android.launcher3.util.IntArray;
import com.android.launcher3.util.LauncherModelHelper;
+import com.android.launcher3.util.LauncherModelHelper.SandboxModelContext;
+
+import dagger.BindsInstance;
+import dagger.Component;
import org.junit.After;
import org.junit.Before;
@@ -85,7 +90,9 @@
private final UserHandle mWorkUser = UserHandle.getUserHandleForUid(PER_USER_RANGE);
private LauncherModelHelper mModelHelper;
- private Context mContext;
+ private SandboxModelContext mContext;
+ private UserCache mUserCacheSpy;
+
private RestoreDbTask mTask;
private ModelDbController mMockController;
private SQLiteDatabase mMockDb;
@@ -94,10 +101,17 @@
private LauncherRestoreEventLogger mMockRestoreEventLogger;
private SQLiteDatabase mDb;
+ private AppWidgetHost mWidgetHost;
+
@Before
public void setup() {
mModelHelper = new LauncherModelHelper();
mContext = mModelHelper.sandboxContext;
+ mUserCacheSpy = spy(UserCache.getInstance(getInstrumentation().getTargetContext()));
+
+ mContext.initDaggerComponent(
+ DaggerRestoreDbTaskTest_TestComponent.builder().bindUserCache(mUserCacheSpy));
+
mTask = new RestoreDbTask();
mMockController = Mockito.mock(ModelDbController.class);
mMockDb = mock(SQLiteDatabase.class);
@@ -106,24 +120,34 @@
mMockRestoreEventLogger = mock(LauncherRestoreEventLogger.class);
}
+ private synchronized AppWidgetHost getWidgetHostLazy() {
+ if (mWidgetHost == null) {
+ mWidgetHost = new AppWidgetHost(mContext, 1012);
+ }
+ return mWidgetHost;
+ }
+
@After
public void teardown() {
if (mDb != null) {
mDb.close();
}
+ if (mWidgetHost != null) {
+ mWidgetHost.deleteHost();
+ }
mModelHelper.destroy();
LauncherPrefs.get(mContext).removeSync(RESTORE_DEVICE);
}
@Test
public void testGetProfileId() throws Exception {
- mDb = new MyModelDbController(23).getDb();
+ mDb = getModelDbController(23).getDb();
assertEquals(23, new RestoreDbTask().getDefaultProfileId(mDb));
}
@Test
public void testMigrateProfileId() throws Exception {
- mDb = new MyModelDbController(42).getDb();
+ mDb = getModelDbController(42).getDb();
// Add some mock data
for (int i = 0; i < 5; i++) {
ContentValues values = new ContentValues();
@@ -143,7 +167,7 @@
@Test
public void testChangeDefaultColumn() throws Exception {
- mDb = new MyModelDbController(42).getDb();
+ mDb = getModelDbController(42).getDb();
// Add some mock data
for (int i = 0; i < 5; i++) {
ContentValues values = new ContentValues();
@@ -173,12 +197,12 @@
long workProfileId = myProfileId + 2;
long workProfileId_old = myProfileId + 3;
- MyModelDbController controller = new MyModelDbController(myProfileId);
+ ModelDbController controller = getModelDbController(myProfileId);
mDb = controller.getDb();
BackupManager bm = spy(new BackupManager(mContext));
doReturn(myUserHandle()).when(bm).getUserForAncestralSerialNumber(eq(myProfileId_old));
doReturn(mWorkUser).when(bm).getUserForAncestralSerialNumber(eq(workProfileId_old));
- controller.users.put(workProfileId, mWorkUser);
+ doReturn(workProfileId).when(mUserCacheSpy).getSerialNumberForUser(mWorkUser);
addIconsBulk(controller, 10, 1, myProfileId_old);
addIconsBulk(controller, 6, 2, workProfileId_old);
@@ -202,7 +226,7 @@
long myProfileId_old = myProfileId + 1;
long workProfileId_old = myProfileId + 3;
- MyModelDbController controller = new MyModelDbController(myProfileId);
+ ModelDbController controller = getModelDbController(myProfileId);
mDb = controller.getDb();
BackupManager bm = spy(new BackupManager(mContext));
doReturn(myUserHandle()).when(bm).getUserForAncestralSerialNumber(eq(myProfileId_old));
@@ -226,7 +250,8 @@
@Test
public void givenLauncherPrefsHasNoIds_whenRestoreAppWidgetIdsIfExists_thenIdsAreRemoved() {
// When
- mTask.restoreAppWidgetIdsIfExists(mContext, mMockController, mMockRestoreEventLogger);
+ mTask.restoreAppWidgetIdsIfExists(mContext, mMockController, mMockRestoreEventLogger,
+ this::getWidgetHostLazy);
// Then
assertThat(mPrefs.has(OLD_APP_WIDGET_IDS, APP_WIDGET_IDS)).isFalse();
}
@@ -234,7 +259,7 @@
@Test
public void givenNoPendingRestore_WhenRestoreAppWidgetIds_ThenRemoveNewWidgetIds() {
// Given
- AppWidgetHost expectedHost = new AppWidgetHost(mContext, APPWIDGET_HOST_ID);
+ AppWidgetHost expectedHost = getWidgetHostLazy();
int[] expectedOldIds = generateOldWidgetIds(expectedHost);
int[] expectedNewIds = generateNewWidgetIds(expectedHost, expectedOldIds);
when(mMockController.getDb()).thenReturn(mMockDb);
@@ -242,7 +267,8 @@
// When
setRestoredAppWidgetIds(mContext, expectedOldIds, expectedNewIds);
- mTask.restoreAppWidgetIdsIfExists(mContext, mMockController, mMockRestoreEventLogger);
+ mTask.restoreAppWidgetIdsIfExists(mContext, mMockController, mMockRestoreEventLogger,
+ this::getWidgetHostLazy);
// Then
assertThat(expectedHost.getAppWidgetIds()).isEqualTo(expectedOldIds);
@@ -254,7 +280,7 @@
@Test
public void givenRestoreWithNonExistingWidgets_WhenRestoreAppWidgetIds_ThenRemoveNewIds() {
// Given
- AppWidgetHost expectedHost = new AppWidgetHost(mContext, APPWIDGET_HOST_ID);
+ AppWidgetHost expectedHost = getWidgetHostLazy();
int[] expectedOldIds = generateOldWidgetIds(expectedHost);
int[] expectedNewIds = generateNewWidgetIds(expectedHost, expectedOldIds);
when(mMockController.getDb()).thenReturn(mMockDb);
@@ -265,18 +291,19 @@
// When
setRestoredAppWidgetIds(mContext, expectedOldIds, expectedNewIds);
- mTask.restoreAppWidgetIdsIfExists(mContext, mMockController, mMockRestoreEventLogger);
+ mTask.restoreAppWidgetIdsIfExists(mContext, mMockController, mMockRestoreEventLogger,
+ this::getWidgetHostLazy);
// Then
assertThat(expectedHost.getAppWidgetIds()).isEqualTo(expectedOldIds);
assertThat(mPrefs.has(OLD_APP_WIDGET_IDS, APP_WIDGET_IDS)).isFalse();
- verify(mMockController, times(expectedOldIds.length)).update(any(), any(), any(), any());
+ verify(mMockController, times(expectedOldIds.length)).update(any(), any(), any());
}
@Test
public void givenRestore_WhenRestoreAppWidgetIds_ThenAddNewIds() {
// Given
- AppWidgetHost expectedHost = new AppWidgetHost(mContext, APPWIDGET_HOST_ID);
+ AppWidgetHost expectedHost = getWidgetHostLazy();
int[] expectedOldIds = generateOldWidgetIds(expectedHost);
int[] expectedNewIds = generateNewWidgetIds(expectedHost, expectedOldIds);
int[] allExpectedIds = IntStream.concat(
@@ -294,15 +321,16 @@
// When
setRestoredAppWidgetIds(mContext, expectedOldIds, expectedNewIds);
- mTask.restoreAppWidgetIdsIfExists(mContext, mMockController, mMockRestoreEventLogger);
+ mTask.restoreAppWidgetIdsIfExists(mContext, mMockController, mMockRestoreEventLogger,
+ this::getWidgetHostLazy);
// Then
assertThat(expectedHost.getAppWidgetIds()).isEqualTo(allExpectedIds);
assertThat(mPrefs.has(OLD_APP_WIDGET_IDS, APP_WIDGET_IDS)).isFalse();
- verify(mMockController, times(expectedOldIds.length)).update(any(), any(), any(), any());
+ verify(mMockController, times(expectedOldIds.length)).update(any(), any(), any());
}
- private void addIconsBulk(MyModelDbController controller,
+ private void addIconsBulk(ModelDbController controller,
int count, int screen, long profileId) {
int columns = LauncherAppState.getIDP(mContext).numColumns;
String packageName = getInstrumentation().getContext().getPackageName();
@@ -320,7 +348,7 @@
values.put(LauncherSettings.Favorites.INTENT,
new Intent(Intent.ACTION_MAIN).setPackage(packageName).toUri(0));
- controller.insert(TABLE_NAME, values);
+ controller.insert(values);
}
}
@@ -346,7 +374,7 @@
}
private void runRemoveScreenIdGapsTest(int[] screenIds, int[] expectedScreenIds) {
- mDb = new MyModelDbController(42).getDb();
+ mDb = getModelDbController(42).getDb();
// Add some mock data
for (int i = 0; i < screenIds.length; i++) {
ContentValues values = new ContentValues();
@@ -397,25 +425,29 @@
.map(id -> host.allocateAppWidgetId()).toArray();
}
- private class MyModelDbController extends ModelDbController {
-
- public final LongSparseArray<UserHandle> users = new LongSparseArray<>();
-
- MyModelDbController(long profileId) {
- super(mContext);
- users.put(profileId, myUserHandle());
- }
-
- @Override
- public long getSerialNumberForUser(UserHandle user) {
- int index = users.indexOfValue(user);
- return index >= 0 ? users.keyAt(index) : -1;
- }
- }
-
private void setRestoredAppWidgetIds(Context context, int[] oldIds, int[] newIds) {
LauncherPrefs.get(context).putSync(
OLD_APP_WIDGET_IDS.to(IntArray.wrap(oldIds).toConcatString()),
APP_WIDGET_IDS.to(IntArray.wrap(newIds).toConcatString()));
}
+
+ private ModelDbController getModelDbController(long profileId) {
+ doReturn(profileId).when(mUserCacheSpy).getSerialNumberForUser(myUserHandle());
+ return ((TestComponent) mContext.getAppComponent()).getDbController();
+ }
+
+ @LauncherAppSingleton
+ @Component(modules = AllModulesForTest.class)
+ public interface TestComponent extends LauncherAppComponent {
+
+ ModelDbController getDbController();
+
+ @Component.Builder
+ interface Builder extends LauncherAppComponent.Builder {
+
+ @BindsInstance Builder bindUserCache(UserCache userCache);
+
+ TestComponent build();
+ }
+ }
}
diff --git a/tests/multivalentTests/src/com/android/launcher3/util/DaggerGraphs.kt b/tests/multivalentTests/src/com/android/launcher3/util/DaggerGraphs.kt
index b66a9d3..a76ccf0 100644
--- a/tests/multivalentTests/src/com/android/launcher3/util/DaggerGraphs.kt
+++ b/tests/multivalentTests/src/com/android/launcher3/util/DaggerGraphs.kt
@@ -21,6 +21,7 @@
import com.android.launcher3.dagger.ApiWrapperModule
import com.android.launcher3.dagger.AppModule
import com.android.launcher3.dagger.StaticObjectModule
+import com.android.launcher3.dagger.WidgetModule
import com.android.launcher3.dagger.WindowManagerProxyModule
import dagger.Binds
import dagger.Module
@@ -39,15 +40,27 @@
ApiWrapperModule::class,
WindowManagerProxyModule::class,
StaticObjectModule::class,
+ WidgetModule::class,
AppModule::class,
]
)
class AllModulesForTest
/** All modules except the WMProxy */
-@Module(includes = [ApiWrapperModule::class, StaticObjectModule::class, AppModule::class])
+@Module(
+ includes =
+ [ApiWrapperModule::class, StaticObjectModule::class, AppModule::class, WidgetModule::class]
+)
class AllModulesMinusWMProxy
/** All modules except the ApiWrapper */
-@Module(includes = [WindowManagerProxyModule::class, StaticObjectModule::class, AppModule::class])
+@Module(
+ includes =
+ [
+ WindowManagerProxyModule::class,
+ StaticObjectModule::class,
+ AppModule::class,
+ WidgetModule::class,
+ ]
+)
class AllModulesMinusApiWrapper
diff --git a/tests/multivalentTests/src/com/android/launcher3/util/ModelTestExtensions.kt b/tests/multivalentTests/src/com/android/launcher3/util/ModelTestExtensions.kt
index ceefb0d..524acff 100644
--- a/tests/multivalentTests/src/com/android/launcher3/util/ModelTestExtensions.kt
+++ b/tests/multivalentTests/src/com/android/launcher3/util/ModelTestExtensions.kt
@@ -1,10 +1,11 @@
package com.android.launcher3.util
import android.content.ContentValues
+import android.database.sqlite.SQLiteDatabase
import android.os.Process
+import androidx.test.platform.app.InstrumentationRegistry
import com.android.launcher3.Flags
import com.android.launcher3.LauncherModel
-import com.android.launcher3.LauncherSettings.Favorites
import com.android.launcher3.LauncherSettings.Favorites.APPWIDGET_ID
import com.android.launcher3.LauncherSettings.Favorites.APPWIDGET_PROVIDER
import com.android.launcher3.LauncherSettings.Favorites.APPWIDGET_SOURCE
@@ -24,6 +25,8 @@
import com.android.launcher3.LauncherSettings.Favorites._ID
import com.android.launcher3.model.BgDataModel
import com.android.launcher3.model.ModelDbController
+import java.io.BufferedReader
+import java.io.InputStreamReader
object ModelTestExtensions {
/** Clears and reloads Launcher db to cleanup the workspace */
@@ -68,7 +71,6 @@
spanY: Int = 1,
id: Int = 0,
profileId: Int = Process.myUserHandle().identifier,
- tableName: String = Favorites.TABLE_NAME,
appWidgetId: Int = -1,
appWidgetSource: Int = -1,
appWidgetProvider: String? = null,
@@ -97,9 +99,21 @@
values[APPWIDGET_PROVIDER] = appWidgetProvider
}
// Migrate any previous data so that the DB state is correct
- controller.insert(tableName, values)
+ controller.insert(values)
transaction.commit()
}
}
}
+
+ /** Creates an in-memory sqlite DB and initializes with the data in [insertFile] */
+ fun createInMemoryDb(insertFile: String): SQLiteDatabase =
+ SQLiteDatabase.createInMemory(SQLiteDatabase.OpenParams.Builder().build()).also { db ->
+ BufferedReader(
+ InputStreamReader(
+ InstrumentationRegistry.getInstrumentation().context.assets.open(insertFile)
+ )
+ )
+ .lines()
+ .forEach { sqlStatement -> db.execSQL(sqlStatement) }
+ }
}
diff --git a/tests/multivalentTests/src/com/android/launcher3/widget/LauncherAppWidgetHostTest.kt b/tests/multivalentTests/src/com/android/launcher3/widget/LauncherAppWidgetHostTest.kt
index 79b493a..d5d1f4a 100644
--- a/tests/multivalentTests/src/com/android/launcher3/widget/LauncherAppWidgetHostTest.kt
+++ b/tests/multivalentTests/src/com/android/launcher3/widget/LauncherAppWidgetHostTest.kt
@@ -21,32 +21,22 @@
import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation
import com.android.launcher3.util.ActivityContextWrapper
import com.android.launcher3.util.Executors
+import com.android.launcher3.util.TestUtil
import java.util.function.IntConsumer
import org.junit.Assert.assertNotSame
import org.junit.Assert.assertNull
import org.junit.Assert.assertSame
-import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
-import org.mockito.Mock
import org.mockito.Mockito.mock
import org.mockito.Mockito.verify
-import org.mockito.MockitoAnnotations
@SmallTest
@RunWith(AndroidJUnit4::class)
class LauncherAppWidgetHostTest {
- @Mock private lateinit var onAppWidgetRemovedCallback: IntConsumer
-
private val context = ActivityContextWrapper(getInstrumentation().targetContext)
- private lateinit var underTest: LauncherAppWidgetHost
-
- @Before
- fun setUp() {
- MockitoAnnotations.initMocks(this)
- underTest = LauncherAppWidgetHost(context, onAppWidgetRemovedCallback, emptyList())
- }
+ private var underTest = LauncherAppWidgetHost(context, HOST_ID)
@Test
fun `Host set view to recycle`() {
@@ -74,15 +64,20 @@
@Test
fun `Runnable called when app widget removed`() {
+ val holder = LauncherWidgetHolder(context, underTest)
+ holder.setAppWidgetRemovedCallback(mock(IntConsumer::class.java))
+ TestUtil.runOnExecutorSync(Executors.MAIN_EXECUTOR) {}
+
underTest.onAppWidgetRemoved(WIDGET_ID)
Executors.MODEL_EXECUTOR.submit {}.get()
getInstrumentation().waitForIdleSync()
- verify(onAppWidgetRemovedCallback).accept(WIDGET_ID)
+ verify(holder.mAppWidgetRemovedCallback!!).accept(WIDGET_ID)
}
companion object {
+ const val HOST_ID = 2233
const val WIDGET_ID = 10001
}
}
diff --git a/tests/multivalentTests/src/com/android/launcher3/widget/LauncherWidgetHolderTest.kt b/tests/multivalentTests/src/com/android/launcher3/widget/LauncherWidgetHolderTest.kt
index 1a659e2..44f29d6 100644
--- a/tests/multivalentTests/src/com/android/launcher3/widget/LauncherWidgetHolderTest.kt
+++ b/tests/multivalentTests/src/com/android/launcher3/widget/LauncherWidgetHolderTest.kt
@@ -47,7 +47,7 @@
fun setUp() {
assertTrue(WIDGETS_ENABLED)
widgetHolder =
- LauncherWidgetHolder(ActivityContextWrapper(getInstrumentation().targetContext)) {}
+ LauncherWidgetHolder(ActivityContextWrapper(getInstrumentation().targetContext))
}
@After
@@ -62,7 +62,7 @@
widgetHolder.setListeningFlag(false)
assertFalse(widgetHolder.isListening)
widgetHolder.startListening()
- widgetHolder.widgetHolderExecutor.submit {}.get()
+ ListenableAppWidgetHost.widgetHolderExecutor.submit {}.get()
getInstrumentation().waitForIdleSync()
assertTrue(widgetHolder.isListening)
verify(testView, times(1)).reInflate()
@@ -73,10 +73,10 @@
fun holder_start_listening_after_activity_start() {
widgetHolder.setShouldListenFlag(FLAG_STATE_IS_NORMAL or FLAG_ACTIVITY_RESUMED, true)
widgetHolder.setActivityStarted(false)
- widgetHolder.widgetHolderExecutor.submit {}.get()
+ ListenableAppWidgetHost.widgetHolderExecutor.submit {}.get()
assertFalse(widgetHolder.shouldListen(widgetHolder.mFlags.get()))
widgetHolder.setActivityStarted(true)
- widgetHolder.widgetHolderExecutor.submit {}.get()
+ ListenableAppWidgetHost.widgetHolderExecutor.submit {}.get()
assertTrue(widgetHolder.shouldListen(widgetHolder.mFlags.get()))
}
@@ -84,10 +84,10 @@
fun holder_start_listening_after_activity_resume() {
widgetHolder.setShouldListenFlag(FLAG_STATE_IS_NORMAL or FLAG_ACTIVITY_STARTED, true)
widgetHolder.setActivityResumed(false)
- widgetHolder.widgetHolderExecutor.submit {}.get()
+ ListenableAppWidgetHost.widgetHolderExecutor.submit {}.get()
assertFalse(widgetHolder.shouldListen(widgetHolder.mFlags.get()))
widgetHolder.setActivityResumed(true)
- widgetHolder.widgetHolderExecutor.submit {}.get()
+ ListenableAppWidgetHost.widgetHolderExecutor.submit {}.get()
assertTrue(widgetHolder.shouldListen(widgetHolder.mFlags.get()))
}
@@ -95,10 +95,10 @@
fun holder_start_listening_after_state_normal() {
widgetHolder.setShouldListenFlag(FLAG_ACTIVITY_RESUMED or FLAG_ACTIVITY_STARTED, true)
widgetHolder.setStateIsNormal(false)
- widgetHolder.widgetHolderExecutor.submit {}.get()
+ ListenableAppWidgetHost.widgetHolderExecutor.submit {}.get()
assertFalse(widgetHolder.shouldListen(widgetHolder.mFlags.get()))
widgetHolder.setStateIsNormal(true)
- widgetHolder.widgetHolderExecutor.submit {}.get()
+ ListenableAppWidgetHost.widgetHolderExecutor.submit {}.get()
assertTrue(widgetHolder.shouldListen(widgetHolder.mFlags.get()))
}
@@ -117,7 +117,7 @@
@Test
fun holder_add_provider_change_listener() {
- val listener = LauncherWidgetHolder.ProviderChangedListener {}
+ val listener = ListenableAppWidgetHost.ProviderChangedListener {}
widgetHolder.addProviderChangeListener(listener)
getInstrumentation().waitForIdleSync()
assertEquals(1, widgetHolder.mProviderChangedListeners.size)
@@ -127,7 +127,7 @@
@Test
fun holder_remove_provider_change_listener() {
- val listener = LauncherWidgetHolder.ProviderChangedListener {}
+ val listener = ListenableAppWidgetHost.ProviderChangedListener {}
widgetHolder.addProviderChangeListener(listener)
widgetHolder.removeProviderChangeListener(listener)
getInstrumentation().waitForIdleSync()
@@ -139,7 +139,7 @@
widgetHolder.setListeningFlag(true)
assertTrue(widgetHolder.isListening)
widgetHolder.stopListening()
- widgetHolder.widgetHolderExecutor.submit {}.get()
+ ListenableAppWidgetHost.widgetHolderExecutor.submit {}.get()
assertFalse(widgetHolder.isListening)
}
diff --git a/tests/src/com/android/launcher3/backuprestore/BackupAndRestoreDBSelectionTest.kt b/tests/src/com/android/launcher3/backuprestore/BackupAndRestoreDBSelectionTest.kt
index 38fad6b..34d9d40 100644
--- a/tests/src/com/android/launcher3/backuprestore/BackupAndRestoreDBSelectionTest.kt
+++ b/tests/src/com/android/launcher3/backuprestore/BackupAndRestoreDBSelectionTest.kt
@@ -23,8 +23,8 @@
import androidx.test.filters.MediumTest
import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation
import com.android.launcher3.Flags
+import com.android.launcher3.LauncherAppState
import com.android.launcher3.LauncherPrefs
-import com.android.launcher3.model.ModelDbController
import com.android.launcher3.model.ModelDelegate
import com.android.launcher3.provider.RestoreDbTask
import com.android.launcher3.util.Executors.MODEL_EXECUTOR
@@ -45,11 +45,8 @@
@MediumTest
class BackupAndRestoreDBSelectionTest {
- @JvmField @Rule var backAndRestoreRule = BackAndRestoreRule()
-
- @JvmField
- @Rule
- val setFlagsRule = SetFlagsRule(SetFlagsRule.DefaultInitValueType.DEVICE_DEFAULT)
+ @get:Rule var backAndRestoreRule = BackAndRestoreRule()
+ @get:Rule val setFlagsRule = SetFlagsRule()
val modelDelegate = mock<ModelDelegate>()
@@ -70,7 +67,8 @@
@Test
fun oldDatabasesNotPresentAfterRestore() {
- val dbController = ModelDbController(getInstrumentation().targetContext)
+ val dbController =
+ LauncherAppState.getInstance(getInstrumentation().targetContext).model.modelDbController
if (Flags.gridMigrationRefactor()) {
dbController.attemptMigrateDb(null, modelDelegate)
} else {
diff --git a/tests/src/com/android/launcher3/model/LoaderTaskTest.kt b/tests/src/com/android/launcher3/model/LoaderTaskTest.kt
index 7f9b7a0..560d306 100644
--- a/tests/src/com/android/launcher3/model/LoaderTaskTest.kt
+++ b/tests/src/com/android/launcher3/model/LoaderTaskTest.kt
@@ -5,6 +5,7 @@
import android.content.Intent
import android.content.pm.ApplicationInfo
import android.content.pm.LauncherActivityInfo
+import android.database.sqlite.SQLiteDatabase
import android.os.Process
import android.os.UserHandle
import android.platform.test.annotations.DisableFlags
@@ -25,6 +26,7 @@
import com.android.launcher3.LauncherSettings.Favorites.CONTAINER_HOTSEAT
import com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_APP_PAIR
import com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_FOLDER
+import com.android.launcher3.LauncherSettings.Favorites.TABLE_NAME
import com.android.launcher3.dagger.LauncherAppComponent
import com.android.launcher3.dagger.LauncherAppSingleton
import com.android.launcher3.icons.IconCache
@@ -41,6 +43,7 @@
import com.android.launcher3.util.Executors.MODEL_EXECUTOR
import com.android.launcher3.util.LauncherModelHelper.SandboxModelContext
import com.android.launcher3.util.LooperIdleLock
+import com.android.launcher3.util.ModelTestExtensions
import com.android.launcher3.util.TestUtil
import com.android.launcher3.util.UserIconInfo
import com.google.common.truth.Truth.assertThat
@@ -63,6 +66,7 @@
import org.mockito.Spy
import org.mockito.kotlin.any
import org.mockito.kotlin.anyOrNull
+import org.mockito.kotlin.doAnswer
import org.mockito.kotlin.doReturn
import org.mockito.kotlin.mock
import org.mockito.kotlin.verify
@@ -94,6 +98,7 @@
@Mock private lateinit var launcherModel: LauncherModel
@Mock private lateinit var iconCache: IconCache
@Mock private lateinit var userCache: UserCache
+ @Mock private lateinit var modelDbController: ModelDbController
@Mock private lateinit var launcherBinder: BaseLauncherBinder
@Mock private lateinit var transaction: LoaderTransaction
@@ -110,6 +115,10 @@
private val bgDataModel: BgDataModel
get() = testComponent.getDataModel()
+ private val inMemoryDb: SQLiteDatabase by lazy {
+ ModelTestExtensions.createInMemoryDb(INSERTION_STATEMENT_FILE)
+ }
+
@Before
fun setup() {
MockitoAnnotations.initMocks(this)
@@ -123,8 +132,23 @@
.getAppWidgetInfo(any())
`when`(launcherModel.beginLoader(any())).thenReturn(transaction)
- `when`(launcherModel.modelDbController)
- .thenReturn(FactitiousDbController(context, INSERTION_STATEMENT_FILE))
+
+ `when`(launcherModel.modelDbController).thenReturn(modelDbController)
+ doAnswer {}.whenever(modelDbController).loadDefaultFavoritesIfNecessary()
+ doAnswer { i ->
+ inMemoryDb.query(
+ TABLE_NAME,
+ i.getArgument(0),
+ i.getArgument(1),
+ i.getArgument(2),
+ null,
+ null,
+ i.getArgument(3),
+ )
+ }
+ .whenever(modelDbController)
+ .query(anyOrNull(), anyOrNull(), anyOrNull(), anyOrNull())
+
`when`(launcherModel.modelDelegate).thenReturn(modelDelegate)
`when`(launcherBinder.newIdleLock(any())).thenReturn(idleLock)
`when`(idleLock.awaitLocked(1000)).thenReturn(false)
@@ -149,6 +173,7 @@
fun tearDown() {
LauncherPrefs.get(context).removeSync(RESTORE_DEVICE)
LauncherPrefs.get(context).putSync(IS_FIRST_LOAD_AFTER_RESTORE.to(false))
+ inMemoryDb.close()
context.onDestroy()
mockitoSession.finishMocking()
}
diff --git a/tests/src/com/android/launcher3/ui/widget/BindWidgetTest.java b/tests/src/com/android/launcher3/ui/widget/BindWidgetTest.java
index 8846d65..67ee1ac 100644
--- a/tests/src/com/android/launcher3/ui/widget/BindWidgetTest.java
+++ b/tests/src/com/android/launcher3/ui/widget/BindWidgetTest.java
@@ -15,7 +15,6 @@
*/
package com.android.launcher3.ui.widget;
-import static com.android.launcher3.LauncherSettings.Favorites.TABLE_NAME;
import static com.android.launcher3.WorkspaceLayoutManager.FIRST_SCREEN_ID;
import static com.android.launcher3.model.data.LauncherAppWidgetInfo.FLAG_ID_NOT_VALID;
import static com.android.launcher3.model.data.LauncherAppWidgetInfo.FLAG_PROVIDER_NOT_READY;
@@ -318,7 +317,7 @@
try {
return MODEL_EXECUTOR.submit(() ->
mModel.getModelDbController().query(
- TABLE_NAME, null, itemIdMatch(0), null, null)).get();
+ null, itemIdMatch(0), null, null)).get();
} catch (Exception e) {
throw new RuntimeException(e);
}