diff options
259 files changed, 4731 insertions, 841 deletions
diff --git a/Android.bp b/Android.bp index e730c9d57c..a7edf2a9b9 100644 --- a/Android.bp +++ b/Android.bp @@ -79,7 +79,7 @@ android_library { "androidx.test.uiautomator_uiautomator", "androidx.preference_preference", "SystemUISharedLib", - "SystemUIAnimationLib", + "animationlib", "launcher-testing-shared", ], srcs: [ @@ -243,7 +243,7 @@ android_library { "lottie", "SystemUISharedLib", "SystemUI-statsd", - "SystemUIAnimationLib", + "animationlib", ], manifest: "quickstep/AndroidManifest.xml", min_sdk_version: "current", @@ -305,7 +305,7 @@ android_library { "SystemUISharedLib", "Launcher3CommonDepsLib", "QuickstepResLib", - "SystemUIAnimationLib", + "animationlib", ], manifest: "quickstep/AndroidManifest.xml", platform_apis: true, diff --git a/quickstep/res/color/menu_item_hover_state_color.xml b/quickstep/res/color/menu_item_hover_state_color.xml new file mode 100644 index 0000000000..269b9f1c68 --- /dev/null +++ b/quickstep/res/color/menu_item_hover_state_color.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8"?> +<selector xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> + <item android:state_hovered="false" android:color="?androidprv:attr/colorSurface" /> + <item android:state_hovered="true" android:color="?androidprv:attr/colorSurfaceVariant" /> +</selector>
\ No newline at end of file diff --git a/quickstep/res/drawable/task_menu_item_bg.xml b/quickstep/res/drawable/task_menu_item_bg.xml index 16c13ebebc..588fe9ec25 100644 --- a/quickstep/res/drawable/task_menu_item_bg.xml +++ b/quickstep/res/drawable/task_menu_item_bg.xml @@ -15,8 +15,7 @@ limitations under the License. --> -<shape xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"> - <solid android:color="?androidprv:attr/colorSurface" /> +<shape xmlns:android="http://schemas.android.com/apk/res/android"> + <solid android:color="@color/menu_item_hover_state_color" /> <corners android:radius="@dimen/task_menu_item_corner_radius" /> </shape> diff --git a/res/drawable/taskbar_divider_bg.xml b/quickstep/res/drawable/taskbar_divider_bg.xml index a8c2ae7032..52e230dadd 100644 --- a/res/drawable/taskbar_divider_bg.xml +++ b/quickstep/res/drawable/taskbar_divider_bg.xml @@ -14,8 +14,7 @@ limitations under the License. --> <shape xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" android:shape="rectangle" > - <solid android:color="?androidprv:attr/colorSurfaceVariant"/> + <solid android:color="@color/taskbar_divider_background"/> <corners android:radius="1dp" /> </shape> diff --git a/quickstep/res/layout/taskbar_edu_features.xml b/quickstep/res/layout/taskbar_edu_features.xml index 5cd7aaf7a7..efbe7f82fe 100644 --- a/quickstep/res/layout/taskbar_edu_features.xml +++ b/quickstep/res/layout/taskbar_edu_features.xml @@ -13,29 +13,36 @@ See the License for the specific language governing permissions and limitations under the License. --> -<merge xmlns:android="http://schemas.android.com/apk/res/android" +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto"> + xmlns:app="http://schemas.android.com/apk/res-auto" + android:layout_width="match_parent" + android:layout_height="wrap_content"> <TextView android:id="@+id/title" style="@style/TextAppearance.TaskbarEduTooltip.Title" android:layout_width="0dp" android:layout_height="wrap_content" + android:paddingBottom="@dimen/taskbar_edu_tooltip_vertical_margin" android:text="@string/taskbar_edu_features" + app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintBottom_toTopOf="@id/splitscreen_animation"/> <com.airbnb.lottie.LottieAnimationView android:id="@+id/splitscreen_animation" android:layout_width="@dimen/taskbar_edu_features_lottie_width" android:layout_height="@dimen/taskbar_edu_features_lottie_height" - android:layout_marginTop="@dimen/taskbar_edu_tooltip_vertical_margin" - app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toBottomOf="@id/title" + app:lottie_autoPlay="true" - app:lottie_loop="true" /> + app:lottie_loop="true" + + app:layout_constraintEnd_toEndOf="@id/splitscreen_text" + app:layout_constraintStart_toStartOf="@id/splitscreen_text" + app:layout_constraintTop_toBottomOf="@id/title" /> <TextView android:id="@+id/splitscreen_text" @@ -43,8 +50,9 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:text="@string/taskbar_edu_splitscreen" - app:layout_constraintEnd_toEndOf="@id/splitscreen_animation" - app:layout_constraintStart_toStartOf="@id/splitscreen_animation" + + app:layout_constraintEnd_toStartOf="@id/settings_text" + app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/splitscreen_animation" /> <androidx.constraintlayout.widget.Group @@ -57,13 +65,14 @@ android:id="@+id/settings_animation" android:layout_width="@dimen/taskbar_edu_features_lottie_width" android:layout_height="@dimen/taskbar_edu_features_lottie_height" - android:layout_marginStart="@dimen/taskbar_edu_features_horizontal_spacing" - android:layout_marginTop="@dimen/taskbar_edu_tooltip_vertical_margin" - app:layout_constraintStart_toEndOf="@id/splitscreen_animation" - app:layout_constraintTop_toBottomOf="@id/title" + app:lottie_autoPlay="true" app:lottie_loop="true" - app:lottie_rawRes="@raw/taskbar_edu_settings" /> + app:lottie_rawRes="@raw/taskbar_edu_settings" + + app:layout_constraintEnd_toEndOf="@id/settings_text" + app:layout_constraintStart_toStartOf="@id/settings_text" + app:layout_constraintTop_toBottomOf="@id/title" /> <TextView android:id="@+id/settings_text" @@ -71,21 +80,23 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:text="@string/taskbar_edu_settings_persistent" - app:layout_constraintEnd_toEndOf="@id/settings_animation" - app:layout_constraintStart_toStartOf="@id/settings_animation" + android:layout_marginStart="@dimen/taskbar_edu_features_horizontal_spacing" + + app:layout_constraintEnd_toStartOf="@id/suggestions_text" + app:layout_constraintStart_toEndOf="@id/splitscreen_text" app:layout_constraintTop_toBottomOf="@id/settings_animation" /> <com.airbnb.lottie.LottieAnimationView android:id="@+id/suggestions_animation" android:layout_width="@dimen/taskbar_edu_features_lottie_width" android:layout_height="@dimen/taskbar_edu_features_lottie_height" - android:layout_marginStart="@dimen/taskbar_edu_features_horizontal_spacing" - android:layout_marginTop="@dimen/taskbar_edu_tooltip_vertical_margin" - app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toEndOf="@id/settings_animation" - app:layout_constraintTop_toBottomOf="@id/title" + app:lottie_autoPlay="true" - app:lottie_loop="true" /> + app:lottie_loop="true" + + app:layout_constraintEnd_toEndOf="@id/suggestions_text" + app:layout_constraintStart_toStartOf="@id/suggestions_text" + app:layout_constraintTop_toBottomOf="@id/title" /> <TextView android:id="@+id/suggestions_text" @@ -93,8 +104,10 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:text="@string/taskbar_edu_suggestions" - app:layout_constraintEnd_toEndOf="@id/suggestions_animation" - app:layout_constraintStart_toStartOf="@id/suggestions_animation" + android:layout_marginStart="@dimen/taskbar_edu_features_horizontal_spacing" + + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toEndOf="@id/settings_text" app:layout_constraintTop_toBottomOf="@id/suggestions_animation" /> <androidx.constraintlayout.widget.Barrier @@ -108,11 +121,12 @@ android:id="@+id/done_button" style="@style/TaskbarEdu.Button.Done" android:layout_width="wrap_content" - android:layout_height="36dp" + android:layout_height="wrap_content" android:layout_marginTop="32dp" android:text="@string/taskbar_edu_done" android:textColor="?androidprv:attr/textColorOnAccent" + app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@id/edu_barrier_bottom" /> -</merge>
\ No newline at end of file +</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file diff --git a/quickstep/res/layout/taskbar_edu_swipe.xml b/quickstep/res/layout/taskbar_edu_swipe.xml index ebdfbb1e01..3f5e81919e 100644 --- a/quickstep/res/layout/taskbar_edu_swipe.xml +++ b/quickstep/res/layout/taskbar_edu_swipe.xml @@ -13,8 +13,10 @@ See the License for the specific language governing permissions and limitations under the License. --> -<merge xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto"> +<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:layout_width="wrap_content" + android:layout_height="wrap_content"> <TextView android:id="@+id/title" @@ -39,4 +41,4 @@ app:lottie_loop="true" app:lottie_rawRes="@raw/taskbar_edu_stashing" /> -</merge>
\ No newline at end of file +</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file diff --git a/quickstep/res/layout/taskbar_edu_tooltip.xml b/quickstep/res/layout/taskbar_edu_tooltip.xml index 657066c108..f3da8b0d66 100644 --- a/quickstep/res/layout/taskbar_edu_tooltip.xml +++ b/quickstep/res/layout/taskbar_edu_tooltip.xml @@ -17,7 +17,8 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|center" - android:layout_marginBottom="16dp" + android:layout_marginHorizontal="24dp" + android:paddingBottom="16dp" android:clipChildren="false" android:clipToPadding="false" android:focusable="true" @@ -25,7 +26,7 @@ android:gravity="center" android:orientation="vertical"> - <androidx.constraintlayout.widget.ConstraintLayout + <FrameLayout android:id="@+id/content" android:layout_width="wrap_content" android:layout_height="wrap_content" diff --git a/quickstep/res/values-af/strings.xml b/quickstep/res/values-af/strings.xml index bca1e8c52a..2dc0a1e1ba 100644 --- a/quickstep/res/values-af/strings.xml +++ b/quickstep/res/values-af/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Taakbalk word gewys"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Taakbalk is versteek"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Navigasiebalk"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Wys Taakbalk altyd"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Verander navigasiemodus"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Taakbalkverdeler"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Skuif na links bo"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Skuif na regs onder"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Wys nog # app.}other{Wys nog # apps.}}"</string> diff --git a/quickstep/res/values-am/strings.xml b/quickstep/res/values-am/strings.xml index 50efb014cd..36a8bda2db 100644 --- a/quickstep/res/values-am/strings.xml +++ b/quickstep/res/values-am/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"የተግባር አሞሌ ይታያል"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"የተግባር አሞሌ ተደብቋል"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"የአሰሳ አሞሌ"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"ሁልጊዜ የተግባር አሞሌ ያሳዩ"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"የአሰሳ ሁነታን ይለውጡ"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"የተግባር አሞሌ አካፋይ"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"ወደ ላይ/ግራ ይውሰዱ"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"ወደ ታች/ቀኝ ይውሰዱ"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{ተጨማሪ # መተግበሪያ አሳይ።}one{ተጨማሪ # መተግበሪያ አሳይ።}other{ተጨማሪ # መተግበሪያዎች አሳይ።}}"</string> diff --git a/quickstep/res/values-ar/strings.xml b/quickstep/res/values-ar/strings.xml index 560f1c2c27..4e3cd17ed2 100644 --- a/quickstep/res/values-ar/strings.xml +++ b/quickstep/res/values-ar/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"تم إظهار شريط التطبيقات"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"تم إخفاء شريط التطبيقات"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"شريط التنقل"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"إظهار شريط التطبيقات دائمًا"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"تغيير وضع التنقل"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"مقسِّم شريط التطبيقات"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"الانتقال إلى يمين الشاشة أو أعلاها"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"الانتقال إلى يسار الشاشة أو أسفلها"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{إظهار تطبيق واحد آخر}zero{إظهار # تطبيق آخر}two{إظهار تطبيقَين آخرَين}few{إظهار # تطبيقات أخرى}many{إظهار # تطبيقًا آخر}other{إظهار # تطبيق آخر}}"</string> diff --git a/quickstep/res/values-as/strings.xml b/quickstep/res/values-as/strings.xml index 825a396f33..aab660d22f 100644 --- a/quickstep/res/values-as/strings.xml +++ b/quickstep/res/values-as/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"টাস্কবাৰ দেখুওৱা হৈছে"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"টাস্কবাৰ লুকুৱাই থোৱা হৈছে"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"নেভিগেশ্বনৰ দণ্ড"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"টাস্কবাৰ সদায় দেখুৱাওক"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"নেভিগেশ্বন ম’ড সলনি কৰক"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"টাস্কবাৰ বিভাজক"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"ওপৰৰ বাঁওফাললৈ নিয়ক"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"তলৰ সোঁফাললৈ নিয়ক"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{আৰু # টা এপ্ দেখুৱাওক।}one{আৰু # টা এপ্ দেখুৱাওক।}other{আৰু # টা এপ্ দেখুৱাওক।}}"</string> diff --git a/quickstep/res/values-az/strings.xml b/quickstep/res/values-az/strings.xml index 096299120a..d6cf4acbce 100644 --- a/quickstep/res/values-az/strings.xml +++ b/quickstep/res/values-az/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"İşləmə paneli göstərilir"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"İşləmə paneli gizlədilib"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Naviqasiya paneli"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"İşləmə paneli həmişə görünsün"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Naviqasiya rejimini dəyişin"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"İşləmə paneli ayırıcısı"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Yuxarı/sola köçürün"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Aşağı/sağa köçürün"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Daha # tətbiqi göstərin.}other{Daha # tətbiqi göstərin.}}"</string> diff --git a/quickstep/res/values-b+sr+Latn/strings.xml b/quickstep/res/values-b+sr+Latn/strings.xml index 23dd072c97..9fc7a74c30 100644 --- a/quickstep/res/values-b+sr+Latn/strings.xml +++ b/quickstep/res/values-b+sr+Latn/strings.xml @@ -98,7 +98,7 @@ <string name="accessibility_rotate_button" msgid="4771825231336502943">"Rotirajte ekran"</string> <string name="taskbar_edu_a11y_title" msgid="5417986057866415355">"Uputstva na traci zadataka"</string> <string name="taskbar_edu_splitscreen" msgid="5605512479258053350">"Prevucite na stranu da biste koristili 2 aplikacije odjednom"</string> - <string name="taskbar_edu_stashing" msgid="5645461372669217294">"Nakratko prevucite nagore da biste prikazali traku zadataka"</string> + <string name="taskbar_edu_stashing" msgid="5645461372669217294">"Sporo prevucite nagore da biste prikazali traku zadataka"</string> <string name="taskbar_edu_suggestions" msgid="8215044496435527982">"Dobijajte predloge aplikacija na osnovu rutine"</string> <string name="taskbar_edu_settings_persistent" msgid="1387372982791296151">"Uključite navigaciju pomoću pokreta u Podešavanjima radi automatskog skrivanja trake zadataka"</string> <string name="taskbar_edu_features" msgid="3320337287472848162">"Uradite više pomoću trake zadataka"</string> @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Traka zadataka je prikazana"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Traka zadataka je skrivena"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Traka za navigaciju"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Uvek prikazuj traku zadataka"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Promeni režim navigacije"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Razdelnik trake zadataka"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Premesti gore levo"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Premesti dole desno"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Prikaži još # aplikaciju.}one{Prikaži još # aplikaciju.}few{Prikaži još # aplikacije.}other{Prikaži još # aplikacija.}}"</string> diff --git a/quickstep/res/values-be/strings.xml b/quickstep/res/values-be/strings.xml index a5c218b9aa..685c921eb7 100644 --- a/quickstep/res/values-be/strings.xml +++ b/quickstep/res/values-be/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Панэль задач паказана"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Панэль задач схавана"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Панэль навігацыі"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Заўсёды паказваць панэль задач"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Змяніць рэжым навігацыі"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Раздзяляльнік панэлі задач"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Перамясціць уверх/улева"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Перамясціць уніз/управа"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Паказаць ячшэ # праграму.}one{Паказаць ячшэ # праграму.}few{Паказаць ячшэ # праграмы.}many{Паказаць ячшэ # праграм.}other{Паказаць ячшэ # праграмы.}}"</string> diff --git a/quickstep/res/values-bg/strings.xml b/quickstep/res/values-bg/strings.xml index 1222afa385..ad875735f8 100644 --- a/quickstep/res/values-bg/strings.xml +++ b/quickstep/res/values-bg/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Лентата на задачите се показва"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Лентата на задачите е скрита"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Лента за навигация"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Лентата на задачите винаги да се показва"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Промяна на режима на навигация"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Разделител на лентата на задачите"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Преместване горе/вляво"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Преместване долу/вдясно"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Показване на още # приложение.}other{Показване на още # приложения.}}"</string> diff --git a/quickstep/res/values-bn/strings.xml b/quickstep/res/values-bn/strings.xml index 8f9fbee864..97dbeaec6e 100644 --- a/quickstep/res/values-bn/strings.xml +++ b/quickstep/res/values-bn/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"\'টাস্কবার\' দেখানো হয়েছে"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"\'টাস্কবার\' লুকানো রয়েছে"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"নেভিগেশন বার"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"সবসময় টাস্কবার দেখুন"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"\'নেভিগেশন\' মোড পরিবর্তন করুন"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"টাস্কবার ডিভাইডার"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"উপরে/বাঁদিকে সরান"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"নিচে/ডানদিকে সরান"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{আরও #টি অ্যাপ দেখুন।}one{আরও #টি অ্যাপ দেখুন।}other{আরও #টি অ্যাপ দেখুন।}}"</string> diff --git a/quickstep/res/values-bs/strings.xml b/quickstep/res/values-bs/strings.xml index 691c72091e..fea5b6affe 100644 --- a/quickstep/res/values-bs/strings.xml +++ b/quickstep/res/values-bs/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Traka zadataka je prikazana"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Traka zadataka je sakrivena"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Navigaciona traka"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Uvijek prikaži traku zadataka"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Promijeni način navigacije"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Razdjelnik trake zadataka"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Premjesti gore lijevo"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Premjesti dolje desno"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Prikaži još # aplikaciju.}one{Prikaži još # aplikaciju.}few{Prikaži još # aplikacije.}other{Prikaži još # aplikacija.}}"</string> diff --git a/quickstep/res/values-ca/strings.xml b/quickstep/res/values-ca/strings.xml index 919712aaaa..011b12132b 100644 --- a/quickstep/res/values-ca/strings.xml +++ b/quickstep/res/values-ca/strings.xml @@ -97,11 +97,11 @@ <string name="gesture_tutorial_action_button_label_skip" msgid="394452764989751960">"Omet"</string> <string name="accessibility_rotate_button" msgid="4771825231336502943">"Gira la pantalla"</string> <string name="taskbar_edu_a11y_title" msgid="5417986057866415355">"Informació sobre Barra de tasques"</string> - <string name="taskbar_edu_splitscreen" msgid="5605512479258053350">"Arrossega una app al costat per utilitzar 2 apps alhora"</string> + <string name="taskbar_edu_splitscreen" msgid="5605512479258053350">"Arrossega una aplicació al costat per utilitzar-ne dues alhora"</string> <string name="taskbar_edu_stashing" msgid="5645461372669217294">"Llisca lentament cap amunt per mostrar la Barra de tasques"</string> <string name="taskbar_edu_suggestions" msgid="8215044496435527982">"Obtén suggeriments d\'aplicacions basats en la teva rutina"</string> <string name="taskbar_edu_settings_persistent" msgid="1387372982791296151">"A Configuració, activa la navegació amb gestos per amagar la Barra de tasques automàticament"</string> - <string name="taskbar_edu_features" msgid="3320337287472848162">"Fes més coses amb la Barra de tasques"</string> + <string name="taskbar_edu_features" msgid="3320337287472848162">"Treu més partit de la Barra de tasques"</string> <string name="taskbar_edu_close" msgid="887022990168191073">"Tanca"</string> <string name="taskbar_edu_done" msgid="6880178093977704569">"Fet"</string> <string name="taskbar_button_home" msgid="2151398979630664652">"Inici"</string> @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Es mostra la Barra de tasques"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"S\'ha amagat la Barra de tasques"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Barra de navegació"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Mostra sempre Barra de tasques"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Canvia el mode de navegació"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Separador de la Barra de tasques"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Mou a la part superior o a l\'esquerra"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Mou a la part inferior o a la dreta"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Mostra # aplicació més.}other{Mostra # aplicacions més.}}"</string> diff --git a/quickstep/res/values-cs/strings.xml b/quickstep/res/values-cs/strings.xml index 5ac7e7eaa8..c27585a606 100644 --- a/quickstep/res/values-cs/strings.xml +++ b/quickstep/res/values-cs/strings.xml @@ -99,9 +99,9 @@ <string name="taskbar_edu_a11y_title" msgid="5417986057866415355">"Informace o panelu aplikací"</string> <string name="taskbar_edu_splitscreen" msgid="5605512479258053350">"Přetáhněte aplikaci na stranu a používejte tak dvě najednou"</string> <string name="taskbar_edu_stashing" msgid="5645461372669217294">"Panel aplikací zobrazíte pomalým přejetím prstem nahoru"</string> - <string name="taskbar_edu_suggestions" msgid="8215044496435527982">"Získejte návrhy aplikací na základě vašeho používání"</string> + <string name="taskbar_edu_suggestions" msgid="8215044496435527982">"Dostávejte návrhy aplikací podle toho, jaké používáte"</string> <string name="taskbar_edu_settings_persistent" msgid="1387372982791296151">"Pokud chcete panel aplikací automaticky skrýt, zapněte v Nastavení navigaci gesty"</string> - <string name="taskbar_edu_features" msgid="3320337287472848162">"Pomocí panelu aplikací můžete dělat více věcí"</string> + <string name="taskbar_edu_features" msgid="3320337287472848162">"Více možností s panelem aplikací"</string> <string name="taskbar_edu_close" msgid="887022990168191073">"Zavřít"</string> <string name="taskbar_edu_done" msgid="6880178093977704569">"Hotovo"</string> <string name="taskbar_button_home" msgid="2151398979630664652">"Domů"</string> @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Panel aplikací je zobrazen"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Panel aplikací je skrytý"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Navigační panel"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Vždy zobrazovat panel aplikací"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Změnit režim navigace"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Rozdělovač panelu aplikací"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Přesunout doleva nahoru"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Přesunout doprava dolů"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Zobrazit # další aplikaci.}few{Zobrazit # další aplikace.}many{Zobrazit # další aplikace.}other{Zobrazit # dalších aplikací.}}"</string> diff --git a/quickstep/res/values-da/strings.xml b/quickstep/res/values-da/strings.xml index d0cea4c874..bde4fe1868 100644 --- a/quickstep/res/values-da/strings.xml +++ b/quickstep/res/values-da/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Proceslinjen vises"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Proceslinjen er skjult"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Navigationslinje"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Vis altid proceslinjen"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Skift navigationstilstand"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Opdeling af proceslinjen"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Flyt til toppen eller venstre side"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Flyt til bunden eller højre side"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Vis # app mere.}one{Vis # app mere.}other{Vis # apps mere.}}"</string> diff --git a/quickstep/res/values-de/strings.xml b/quickstep/res/values-de/strings.xml index 0e959a47b3..a5766f7900 100644 --- a/quickstep/res/values-de/strings.xml +++ b/quickstep/res/values-de/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Taskleiste eingeblendet"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Taskleiste ausgeblendet"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Navigationsleiste"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Taskleiste immer anzeigen"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Navigationsmodus ändern"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Taskleisten-Teiler"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Nach oben / Nach links verschieben"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Nach unten / Nach rechts verschieben"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{# weitere App anzeigen.}other{# weitere Apps anzeigen.}}"</string> diff --git a/quickstep/res/values-el/strings.xml b/quickstep/res/values-el/strings.xml index 0fa67fe972..03774c2ef5 100644 --- a/quickstep/res/values-el/strings.xml +++ b/quickstep/res/values-el/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Η γραμμή εργαλείων εμφανίζεται"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Η γραμμή εργαλείων είναι κρυφή"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Γραμμή πλοήγησης"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Εμφ. πάντα σε Γραμμή εργαλείων"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Αλλαγή τρόπου πλοήγησης"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Διαχωριστικό Γραμμής εργαλείων"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Μετακίνηση επάνω/αριστερά"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Μετακίνηση κάτω/δεξιά"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Εμφάνιση # ακόμα εφαρμογής.}other{Εμφάνιση # ακόμα εφαρμογών.}}"</string> diff --git a/quickstep/res/values-en-rAU/strings.xml b/quickstep/res/values-en-rAU/strings.xml index ec90faf5a8..f5d7e7300b 100644 --- a/quickstep/res/values-en-rAU/strings.xml +++ b/quickstep/res/values-en-rAU/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Taskbar shown"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Taskbar hidden"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Navigation bar"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Always show Taskbar"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Change navigation mode"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Taskbar divider"</string> <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="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Show # more app.}other{Show # more apps.}}"</string> diff --git a/quickstep/res/values-en-rCA/strings.xml b/quickstep/res/values-en-rCA/strings.xml index 01599c4ec3..9adb0f4c4a 100644 --- a/quickstep/res/values-en-rCA/strings.xml +++ b/quickstep/res/values-en-rCA/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Taskbar shown"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Taskbar hidden"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Navigation bar"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Always show Taskbar"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Change navigation mode"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Taskbar Divider"</string> <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="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Show # more app.}other{Show # more apps.}}"</string> diff --git a/quickstep/res/values-en-rGB/strings.xml b/quickstep/res/values-en-rGB/strings.xml index ec90faf5a8..f5d7e7300b 100644 --- a/quickstep/res/values-en-rGB/strings.xml +++ b/quickstep/res/values-en-rGB/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Taskbar shown"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Taskbar hidden"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Navigation bar"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Always show Taskbar"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Change navigation mode"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Taskbar divider"</string> <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="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Show # more app.}other{Show # more apps.}}"</string> diff --git a/quickstep/res/values-en-rIN/strings.xml b/quickstep/res/values-en-rIN/strings.xml index ec90faf5a8..f5d7e7300b 100644 --- a/quickstep/res/values-en-rIN/strings.xml +++ b/quickstep/res/values-en-rIN/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Taskbar shown"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Taskbar hidden"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Navigation bar"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Always show Taskbar"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Change navigation mode"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Taskbar divider"</string> <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="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Show # more app.}other{Show # more apps.}}"</string> diff --git a/quickstep/res/values-en-rXC/strings.xml b/quickstep/res/values-en-rXC/strings.xml index c8f344edc4..853684d4e1 100644 --- a/quickstep/res/values-en-rXC/strings.xml +++ b/quickstep/res/values-en-rXC/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Taskbar shown"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Taskbar hidden"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Navigation bar"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Always show Taskbar"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Change navigation mode"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Taskbar Divider"</string> <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="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Show # more app.}other{Show # more apps.}}"</string> diff --git a/quickstep/res/values-es-rUS/strings.xml b/quickstep/res/values-es-rUS/strings.xml index eb2a2960e5..e31466a2e5 100644 --- a/quickstep/res/values-es-rUS/strings.xml +++ b/quickstep/res/values-es-rUS/strings.xml @@ -101,7 +101,7 @@ <string name="taskbar_edu_stashing" msgid="5645461372669217294">"Desliza despacio hacia arriba para ver la Barra de tareas"</string> <string name="taskbar_edu_suggestions" msgid="8215044496435527982">"Recibe sugerencias de aplicaciones basadas en tu rutina"</string> <string name="taskbar_edu_settings_persistent" msgid="1387372982791296151">"Activa la navegación por gestos en la Configuración y la Barra de tareas se ocultará sola"</string> - <string name="taskbar_edu_features" msgid="3320337287472848162">"Haz más con la Barra de tareas"</string> + <string name="taskbar_edu_features" msgid="3320337287472848162">"Aprovecha mejor la Barra de tareas"</string> <string name="taskbar_edu_close" msgid="887022990168191073">"Cerrar"</string> <string name="taskbar_edu_done" msgid="6880178093977704569">"Listo"</string> <string name="taskbar_button_home" msgid="2151398979630664652">"Botón de inicio"</string> @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Barra de tareas visible"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Barra de tareas oculta"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Barra de navegación"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Ver siempre la Barra de tareas"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Cambiar el modo de navegación"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Divisor de la Barra de tareas"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Mover a la parte superior o izquierda"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Mover a la parte inferior o derecha"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Mostrar # app más.}other{Mostrar # apps más.}}"</string> diff --git a/quickstep/res/values-es/strings.xml b/quickstep/res/values-es/strings.xml index d8beb80126..43fe5b1db4 100644 --- a/quickstep/res/values-es/strings.xml +++ b/quickstep/res/values-es/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Barra de tareas visible"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Barra de tareas oculta"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Barra de navegación"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Ver siempre Barra de Tareas"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Cambiar el modo de navegación"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Divisor de Barra de Tareas"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Mover arriba/a la izquierda"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Mover abajo/a la derecha"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Mostrar # aplicación más.}other{Mostrar # aplicaciones más.}}"</string> diff --git a/quickstep/res/values-et/strings.xml b/quickstep/res/values-et/strings.xml index 15943379dc..0095d519f7 100644 --- a/quickstep/res/values-et/strings.xml +++ b/quickstep/res/values-et/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Tegumiriba on kuvatud"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Tegumiriba on peidetud"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Navigeerimisriba"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Kuva tööriistariba alati"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Navigeerimisrežiimi muutmine"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Tegumiriba jagaja"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Teisalda üles/vasakule"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Teisalda alla/paremale"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Kuva veel # rakendus.}other{Kuva veel # rakendust.}}"</string> diff --git a/quickstep/res/values-eu/strings.xml b/quickstep/res/values-eu/strings.xml index 1eba2b7eeb..9f6e8e187d 100644 --- a/quickstep/res/values-eu/strings.xml +++ b/quickstep/res/values-eu/strings.xml @@ -98,7 +98,7 @@ <string name="accessibility_rotate_button" msgid="4771825231336502943">"Biratu pantaila"</string> <string name="taskbar_edu_a11y_title" msgid="5417986057866415355">"Zereginen barra erabiltzeko argibideak"</string> <string name="taskbar_edu_splitscreen" msgid="5605512479258053350">"Bi aplikazio batera erabiltzeko, arrastatu bat albo batera"</string> - <string name="taskbar_edu_stashing" msgid="5645461372669217294">"Zereginen barra ikusteko, pasatu hatza motel gora"</string> + <string name="taskbar_edu_stashing" msgid="5645461372669217294">"Zereginen barra ikusteko, pasatu hatza gora poliki"</string> <string name="taskbar_edu_suggestions" msgid="8215044496435527982">"Jaso aplikazioen iradokizunak erabileran oinarrituta"</string> <string name="taskbar_edu_settings_persistent" msgid="1387372982791296151">"Zereginen barra automatikoki ezkutatzeko, aktibatu keinu bidezko nabigazioa ezarpenetan"</string> <string name="taskbar_edu_features" msgid="3320337287472848162">"Egin gauza gehiago zereginen barrarekin"</string> @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Zereginen barra ikusgai dago"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Zereginen barra itxita dago"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Nabigazio-barra"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Erakutsi beti zereginen barra"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Aldatu nabigatzeko modua"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Zereginen barraren zatitzailea"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Eraman gora, ezkerretara"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Eraman behera, eskuinetara"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Erakutsi beste # aplikazio.}other{Erakutsi beste # aplikazio.}}"</string> diff --git a/quickstep/res/values-fa/strings.xml b/quickstep/res/values-fa/strings.xml index 1a35f9c94e..e520acdb58 100644 --- a/quickstep/res/values-fa/strings.xml +++ b/quickstep/res/values-fa/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"نوار وظیفه نمایان است"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"نوار وظیفه پنهان است"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"نوار پیمایش"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"نوار وظیفه همیشه نشان داده شود"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"تغییر حالت پیمایش"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"جداکننده نوار وظیفه"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"انتقال به بالا/ چپ"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"انتقال به پایین/ راست"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{نمایش # برنامه دیگر.}one{نمایش # برنامه دیگر.}other{نمایش # برنامه دیگر.}}"</string> diff --git a/quickstep/res/values-fi/strings.xml b/quickstep/res/values-fi/strings.xml index 428011b180..5c04d684c9 100644 --- a/quickstep/res/values-fi/strings.xml +++ b/quickstep/res/values-fi/strings.xml @@ -97,7 +97,7 @@ <string name="gesture_tutorial_action_button_label_skip" msgid="394452764989751960">"Ohita"</string> <string name="accessibility_rotate_button" msgid="4771825231336502943">"Käännä näyttö"</string> <string name="taskbar_edu_a11y_title" msgid="5417986057866415355">"Tehtäväpalkin ohje"</string> - <string name="taskbar_edu_splitscreen" msgid="5605512479258053350">"Vedä sovellus sivuun, niin voit käyttää samalla 2 sellaista"</string> + <string name="taskbar_edu_splitscreen" msgid="5605512479258053350">"Vedä sovellus sivuun, ja voit käyttää kahta sovellusta"</string> <string name="taskbar_edu_stashing" msgid="5645461372669217294">"Näytä tehtäväpalkki pyyhkäisemällä ylös hitaasti"</string> <string name="taskbar_edu_suggestions" msgid="8215044496435527982">"Sovellussuosituksia käytön perusteella"</string> <string name="taskbar_edu_settings_persistent" msgid="1387372982791296151">"Laita eleillä navigointi päälle Asetuksista Tehtäväpalkin piilottamiseksi automaattisesti"</string> @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Tehtäväpalkki näkyvissä"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Tehtäväpalkki piilotettu"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Navigointipalkki"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Näytä tehtäväpalkki aina"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Vaihda navigointitilaa"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Tehtäväpalkin jakaja"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Siirrä ylös tai vasemmalle"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Siirrä alas tai oikealle"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Näytä # muu sovellus.}other{Näytä # muuta sovellusta.}}"</string> diff --git a/quickstep/res/values-fr-rCA/strings.xml b/quickstep/res/values-fr-rCA/strings.xml index af89ae5c91..56e5047724 100644 --- a/quickstep/res/values-fr-rCA/strings.xml +++ b/quickstep/res/values-fr-rCA/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Barre des tâches affichée"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Barre des tâches masquée"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Barre de navigation"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Touj. afficher barre des tâches"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Changer de mode de navigation"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Séparateur de la barre des tâches"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Déplacer vers le coin supérieur gauche de l\'écran"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Déplacer vers le coin inférieur droit de l\'écran"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Afficher # autre application.}one{Afficher # autre application.}other{Afficher # autres applications.}}"</string> diff --git a/quickstep/res/values-fr/strings.xml b/quickstep/res/values-fr/strings.xml index 3b08b8969c..31068f7db0 100644 --- a/quickstep/res/values-fr/strings.xml +++ b/quickstep/res/values-fr/strings.xml @@ -97,8 +97,8 @@ <string name="gesture_tutorial_action_button_label_skip" msgid="394452764989751960">"Passer"</string> <string name="accessibility_rotate_button" msgid="4771825231336502943">"Faire pivoter l\'écran"</string> <string name="taskbar_edu_a11y_title" msgid="5417986057866415355">"Fonctionnement de la barre des tâches"</string> - <string name="taskbar_edu_splitscreen" msgid="5605512479258053350">"Faites glisser une appli sur le côté pour utiliser 2 applis"</string> - <string name="taskbar_edu_stashing" msgid="5645461372669217294">"Balayez lentement vers le haut pour l\'afficher"</string> + <string name="taskbar_edu_splitscreen" msgid="5605512479258053350">"Faites glisser une appli sur le côté pour en utiliser 2 à la fois"</string> + <string name="taskbar_edu_stashing" msgid="5645461372669217294">"Balayez lentement vers haut pour afficher barre des tâches"</string> <string name="taskbar_edu_suggestions" msgid="8215044496435527982">"Obtenez des suggestions d\'applis basées sur vos habitudes"</string> <string name="taskbar_edu_settings_persistent" msgid="1387372982791296151">"Activez la navigation par gestes dans paramètres pour masquage auto de la barre des tâches"</string> <string name="taskbar_edu_features" msgid="3320337287472848162">"Faites-en plus avec la barre des tâches"</string> @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Barre des tâches affichée"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Barre des tâches masquée"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Barre de navigation"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Toujours voir barre des tâches"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Modifier le mode de navigation"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Séparateur de barre des tâches"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Déplacer en haut ou à gauche"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Déplacer en bas ou à droite"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Afficher # autre appli.}one{Afficher # autre appli.}other{Afficher # autre applis.}}"</string> diff --git a/quickstep/res/values-gl/strings.xml b/quickstep/res/values-gl/strings.xml index d5e7550599..ebec206098 100644 --- a/quickstep/res/values-gl/strings.xml +++ b/quickstep/res/values-gl/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Estase mostrando a barra de tarefas"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Non se está mostrando a barra de tarefas"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Barra de navegación"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Manter Barra de tarefas"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Cambiar modo de navegación"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Divisor da Barra de tarefas"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Mover á parte superior ou á esquerda"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Mover á parte inferior ou á dereita"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Mostrar # aplicación máis.}other{Mostrar # aplicacións máis.}}"</string> diff --git a/quickstep/res/values-gu/strings.xml b/quickstep/res/values-gu/strings.xml index 0924b681c8..2e1c289581 100644 --- a/quickstep/res/values-gu/strings.xml +++ b/quickstep/res/values-gu/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"ટાસ્કબાર બતાવવામાં આવ્યો"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"ટાસ્કબાર છુપાવવામાં આવ્યો"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"નૅવિગેશન બાર"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"હંમેશાં ટાસ્કબાર બતાવો"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"નૅવિગેશન મોડ બદલો"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"ટાસ્કબાર વિભાજક"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"સૌથી ઉપર ડાબી બાજુએ ખસેડો"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"સૌથી નીચે જમણી બાજુએ ખસેડો"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{વધુ # ઍપ બતાવો.}one{વધુ # ઍપ બતાવો.}other{વધુ # ઍપ બતાવો.}}"</string> diff --git a/quickstep/res/values-hi/strings.xml b/quickstep/res/values-hi/strings.xml index b108371f21..2dc6603e4c 100644 --- a/quickstep/res/values-hi/strings.xml +++ b/quickstep/res/values-hi/strings.xml @@ -19,7 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="recent_task_option_pin" msgid="7929860679018978258">"पिन करना"</string> + <string name="recent_task_option_pin" msgid="7929860679018978258">"पिन करें"</string> <string name="recent_task_option_freeform" msgid="48863056265284071">"फ़्रीफ़ॉर्म"</string> <string name="recents_empty_message" msgid="7040467240571714191">"हाल ही में इस्तेमाल किया गया कोई ऐप्लिकेशन नहीं है"</string> <string name="accessibility_app_usage_settings" msgid="6312864233673544149">"ऐप्लिकेशन इस्तेमाल की सेटिंग"</string> @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"टास्कबार दिखाया गया"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"टास्कबार छिपाया गया"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"नेविगेशन बार"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"टास्कबार हमेशा दिखाएं"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"नेविगेशन का मोड बदलें"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"टास्कबार डिवाइडर"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"ऊपर/बाईं तरफ़ ले जाएं"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"नीचे/दाईं तरफ़ ले जाएं"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{# और ऐप्लिकेशन दिखाएं.}one{# और ऐप्लिकेशन दिखाएं.}other{# और ऐप्लिकेशन दिखाएं.}}"</string> diff --git a/quickstep/res/values-hr/strings.xml b/quickstep/res/values-hr/strings.xml index 1aadeeac3a..2a18704bb3 100644 --- a/quickstep/res/values-hr/strings.xml +++ b/quickstep/res/values-hr/strings.xml @@ -97,11 +97,11 @@ <string name="gesture_tutorial_action_button_label_skip" msgid="394452764989751960">"Preskoči"</string> <string name="accessibility_rotate_button" msgid="4771825231336502943">"Zakretanje zaslona"</string> <string name="taskbar_edu_a11y_title" msgid="5417986057866415355">"Upute za traku sa zadacima"</string> - <string name="taskbar_edu_splitscreen" msgid="5605512479258053350">"Povucite apl. u stranu radi istodobne upotrebe 2 aplikacije"</string> + <string name="taskbar_edu_splitscreen" msgid="5605512479258053350">"Povucite aplikaciju u stranu radi istodobne upotrebe dviju aplikacija"</string> <string name="taskbar_edu_stashing" msgid="5645461372669217294">"Polako prijeđite prstom prema gore za prikaz trake sa zadacima"</string> <string name="taskbar_edu_suggestions" msgid="8215044496435527982">"Primajte prijedloge aplikacija na temelju svoje rutine"</string> <string name="taskbar_edu_settings_persistent" msgid="1387372982791296151">"Uključite navigaciju pokretima u postavkama da bi se traka sa zadacima automatski sakrila"</string> - <string name="taskbar_edu_features" msgid="3320337287472848162">"Učinite više uz pomoć trake sa zadacima"</string> + <string name="taskbar_edu_features" msgid="3320337287472848162">"Učinite više pomoću trake sa zadacima"</string> <string name="taskbar_edu_close" msgid="887022990168191073">"Zatvori"</string> <string name="taskbar_edu_done" msgid="6880178093977704569">"Gotovo"</string> <string name="taskbar_button_home" msgid="2151398979630664652">"Početna"</string> @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Traka sa zadacima prikazana"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Traka sa zadacima skrivena"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Navigacijska traka"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Uvijek prikaži traku zadataka"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Promijeni način navigacije"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Razdjelnik trake sa zadacima"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Premjesti gore/lijevo"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Premjesti dolje/desno"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Prikaži više aplikacija (još #).}one{Prikaži više aplikacija (još #).}few{Prikaži više aplikacija (još #).}other{Prikaži više aplikacija (još #).}}"</string> diff --git a/quickstep/res/values-hu/strings.xml b/quickstep/res/values-hu/strings.xml index ba75d4f00a..27f5efab95 100644 --- a/quickstep/res/values-hu/strings.xml +++ b/quickstep/res/values-hu/strings.xml @@ -98,7 +98,7 @@ <string name="accessibility_rotate_button" msgid="4771825231336502943">"Képernyő elforgatása"</string> <string name="taskbar_edu_a11y_title" msgid="5417986057866415355">"Tálca használatának ismertetése"</string> <string name="taskbar_edu_splitscreen" msgid="5605512479258053350">"Húzzon egy appot oldalra, ha kettőt használna egyidejűleg"</string> - <string name="taskbar_edu_stashing" msgid="5645461372669217294">"Csúsztassa ujját lassan fel a Feladatsáv megjelenítéséhez"</string> + <string name="taskbar_edu_stashing" msgid="5645461372669217294">"Lassan csúsztassa fel az ujját a Feladatsáv megjelenítéséhez"</string> <string name="taskbar_edu_suggestions" msgid="8215044496435527982">"Alkalmazásjavaslatokat kaphat a rutinja alapján"</string> <string name="taskbar_edu_settings_persistent" msgid="1387372982791296151">"A Feladatsáv automatikus elrejtéséhez aktiválja a navigációs kézmozdulatokat a beállításokban"</string> <string name="taskbar_edu_features" msgid="3320337287472848162">"Jobban kihasználhatja a Feladatsávot"</string> @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Feladatsáv megjelenítve"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Feladatsáv elrejtve"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Navigációs sáv"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Mindig megjelenő feladatsáv"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Navigációs mód módosítása"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Feladatsáv-elválasztó"</string> <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="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{# további alkalmazás megjelenítése.}other{# további alkalmazás megjelenítése.}}"</string> diff --git a/quickstep/res/values-hy/strings.xml b/quickstep/res/values-hy/strings.xml index 43a7c5d4a1..80e6750a43 100644 --- a/quickstep/res/values-hy/strings.xml +++ b/quickstep/res/values-hy/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Խնդրագոտին ցուցադրվում է"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Խնդրագոտին թաքցված է"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Նավիգացիայի գոտի"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Միշտ ցուցադրել հավելվածները"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Փոխել նավիգացիայի ռեժիմը"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Հավելվածների վահանակի բաժանիչ"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Տեղափոխել վերևի ձախ անկյուն"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Տեղափոխել ներքևի աջ անկյուն"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Ցուցադրել ևս # հավելված։}one{Ցուցադրել ևս # հավելված։}other{Ցուցադրել ևս # հավելված։}}"</string> diff --git a/quickstep/res/values-in/strings.xml b/quickstep/res/values-in/strings.xml index 6f9d7c6840..db880b3a26 100644 --- a/quickstep/res/values-in/strings.xml +++ b/quickstep/res/values-in/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Taskbar ditampilkan"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Taskbar disembunyikan"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Menu navigasi"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Selalu tampilkan Taskbar"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Ubah mode navigasi"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Pemisah Taskbar"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Pindahkan ke atas/kiri"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Pindahkan ke bawah/kanan"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Tampilkan # aplikasi lain.}other{Tampilkan # aplikasi lain.}}"</string> diff --git a/quickstep/res/values-is/strings.xml b/quickstep/res/values-is/strings.xml index f58e6de718..08b5e99f6f 100644 --- a/quickstep/res/values-is/strings.xml +++ b/quickstep/res/values-is/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Forritastika sýnd"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Forritastika falin"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Yfirlitsstika"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Alltaf sýna forritastiku"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Breyta leiðsagnarstillingu"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Skipting forritastiku"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Færa efst/til vinstri"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Færa neðst/til hægri"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Sýna # forrit í viðbót.}one{Sýna # forrit í viðbót.}other{Sýna # forrit í viðbót.}}"</string> diff --git a/quickstep/res/values-it/strings.xml b/quickstep/res/values-it/strings.xml index 17e379fe2f..6f2f9546e8 100644 --- a/quickstep/res/values-it/strings.xml +++ b/quickstep/res/values-it/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Barra delle app visualizzata"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Barra delle app nascosta"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Barra di navigazione"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Mostra sempre barra delle app"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Cambia modalità di navigazione"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Divisore barra delle app"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Sposta in alto/a sinistra"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Sposta in basso/a destra"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Mostra # altra app.}other{Mostra altre # app.}}"</string> diff --git a/quickstep/res/values-iw/strings.xml b/quickstep/res/values-iw/strings.xml index dc30dc686a..e1588699a3 100644 --- a/quickstep/res/values-iw/strings.xml +++ b/quickstep/res/values-iw/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"סרגל האפליקציות מוצג"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"סרגל האפליקציות מוסתר"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"סרגל הניווט"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"סרגל האפליקציות מוצג תמיד"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"שינוי מצב הניווט"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"המחיצה בסרגל האפליקציות"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"העברה לפינה השמאלית/העליונה"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"העברה לפינה הימנית/התחתונה"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{הצגת אפליקציה אחת (#) נוספת.}one{הצגת # אפליקציות נוספות.}two{הצגת # אפליקציות נוספות.}other{הצגת # אפליקציות נוספות.}}"</string> diff --git a/quickstep/res/values-ja/strings.xml b/quickstep/res/values-ja/strings.xml index 75e3bf8a1d..d55a2c01d1 100644 --- a/quickstep/res/values-ja/strings.xml +++ b/quickstep/res/values-ja/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"タスクバー表示"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"タスクバー非表示"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"ナビゲーション バー"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"常にタスクバーを表示"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"ナビゲーション モードを変更"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"タスクバーの区切り"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"上 / 左に移動"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"下 / 右に移動"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{他 # 件のアプリを表示できます。}other{他 # 件のアプリを表示できます。}}"</string> diff --git a/quickstep/res/values-ka/strings.xml b/quickstep/res/values-ka/strings.xml index 13232da1cd..c1df53c313 100644 --- a/quickstep/res/values-ka/strings.xml +++ b/quickstep/res/values-ka/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"ამოცანათა ზოლი ნაჩვენებია"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"ამოცანათა ზოლი დამალულია"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"ნავიგაციის ზოლი"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"ამოცანათა ზოლის მუდამ ჩვენება"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"შეცვალეთ ნავიგაციის რეჟიმი"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"ამოცანათა ზოლის გამყოფი"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"ზემოთ/მარცხნივ გადატანა"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"ქვემოთ/მარჯვნივ გადატანა"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{#-ით მეტი აპის ჩენება}other{#-ით მეტი აპის ჩვენება.}}"</string> diff --git a/quickstep/res/values-kk/strings.xml b/quickstep/res/values-kk/strings.xml index 9f006a9eeb..68141aad9c 100644 --- a/quickstep/res/values-kk/strings.xml +++ b/quickstep/res/values-kk/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Тапсырмалар жолағы көрсетілді"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Тапсырмалар жолағы жасырылды"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Навигация жолағы"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Тапсырма жолағын үнемі көрсету"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Навигация режимін өзгерту"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Тапсырмалар жолағын бөлгіш"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Жоғары/солға жылжыту"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Төмен/оңға жылжыту"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Тағы # қолданбаны көрсету.}other{Тағы # қолданбаны көрсету.}}"</string> diff --git a/quickstep/res/values-km/strings.xml b/quickstep/res/values-km/strings.xml index 738e454469..aa20709e51 100644 --- a/quickstep/res/values-km/strings.xml +++ b/quickstep/res/values-km/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"បានបង្ហាញរបារកិច្ចការ"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"បានលាក់របារកិច្ចការ"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"របាររុករក"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"បង្ហាញរបារកិច្ចការជានិច្ច"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"ប្ដូរមុខងាររុករក"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"បន្ទាត់ខណ្ឌចែករបារកិច្ចការ"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"ផ្លាស់ទីទៅខាងលើ/ឆ្វេង"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"ផ្លាស់ទីទៅខាងក្រោម/ស្ដាំ"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{បង្ហាញកម្មវិធី # ទៀត។}other{បង្ហាញកម្មវិធី # ទៀត។}}"</string> diff --git a/quickstep/res/values-kn/strings.xml b/quickstep/res/values-kn/strings.xml index 37e0acdf15..9bb18faa50 100644 --- a/quickstep/res/values-kn/strings.xml +++ b/quickstep/res/values-kn/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"ಟಾಸ್ಕ್ಬಾರ್ ತೋರಿಸಲಾಗಿದೆ"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"ಟಾಸ್ಕ್ಬಾರ್ ಮರೆಮಾಡಲಾಗಿದೆ"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"ನ್ಯಾವಿಗೇಷನ್ ಬಾರ್"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"ಯಾವಾಗಲೂ ಟಾಸ್ಕ್ಬಾರ್ ತೋರಿಸಿ"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"ನ್ಯಾವಿಗೇಶನ್ ಮೋಡ್ ಬದಲಾಯಿಸಿ"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"ಟಾಸ್ಕ್ಬಾರ್ ಡಿವೈಡರ್"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"ಮೇಲಿನ/ಎಡಭಾಗಕ್ಕೆ ಸರಿಸಿ"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"ಕೆಳಗಿನ/ಬಲಭಾಗಕ್ಕೆ ಸರಿಸಿ"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{ಇನ್ನೂ # ಆ್ಯಪ್ ಅನ್ನು ತೋರಿಸಿ.}one{ಇನ್ನೂ # ಆ್ಯಪ್ಗಳನ್ನು ತೋರಿಸಿ.}other{ಇನ್ನೂ # ಆ್ಯಪ್ಗಳನ್ನು ತೋರಿಸಿ.}}"</string> diff --git a/quickstep/res/values-ko/strings.xml b/quickstep/res/values-ko/strings.xml index cff87a13b9..4cef3cab3e 100644 --- a/quickstep/res/values-ko/strings.xml +++ b/quickstep/res/values-ko/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"태스크 바 표시"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"태스크 바 숨김"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"탐색 메뉴"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"태스크 바 항상 표시"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"탐색 모드 변경"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"태스크 바 분할"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"상단/왼쪽으로 이동"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"하단/오른쪽으로 이동"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{앱 #개 더 표시}other{앱 #개 더 표시}}"</string> diff --git a/quickstep/res/values-ky/strings.xml b/quickstep/res/values-ky/strings.xml index 4cb31fddf5..64a1c9039e 100644 --- a/quickstep/res/values-ky/strings.xml +++ b/quickstep/res/values-ky/strings.xml @@ -49,7 +49,7 @@ <string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Артка кайтуу үчүн экранды оңдон солго карай сүрүүнү үйрөндүңүз. Эми колдонмолорду которуштурганды үйрөнүп алыңыз."</string> <string name="back_gesture_feedback_complete_without_follow_up" msgid="6405649621667113830">"\"Артка\" жаңсоосун үйрөндүңүз."</string> <string name="back_gesture_feedback_swipe_in_nav_bar" msgid="1148198467090405643">"Манжаңызды экрандын ылдый жагына өтө жакындатпай сүрүңүз."</string> - <string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"\"Артка\" жаң-нун сезгичтигин өзгөртүү үчүн жөндөөлөргө өтүңүз"</string> + <string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"\"Артка\" жаң-нун сезгичтигин өзгөртүү үчүн параметрлерге өтүңүз"</string> <string name="back_gesture_intro_title" msgid="19551256430224428">"Артка кайтуу үчүн сүрүңүз"</string> <string name="back_gesture_intro_subtitle" msgid="7912576483031802797">"Акыркы экранга кайтуу үчүн экранды сол же оң жагынан ортосуна карай сүрүңүз."</string> <string name="back_gesture_spoken_intro_subtitle" msgid="2162043199263088592">"Акыркы экранга кайтуу үчүн экранды сол же оң жагынан ортосуна карай 2 манжаңыз менен сүрүңүз."</string> @@ -67,7 +67,7 @@ <string name="overview_gesture_feedback_swipe_too_far_from_edge" msgid="3032757898111577225">"Экранды ылдыйдан өйдө сүрүңүз."</string> <string name="overview_gesture_feedback_home_detected" msgid="1411130969354020489">"Манжаңызды алуудан мурун экранда узагыраак кармаңыз."</string> <string name="overview_gesture_feedback_wrong_swipe_direction" msgid="6725820500906747925">"Экранды өйдө карай сүрүп, токтоп туруңуз."</string> - <string name="overview_gesture_feedback_complete_with_follow_up" msgid="3544611727467765026">"Жаңсоолорду колдонгонду үйрөндүңүз. Жаңсоолорду өчүрүү үчүн жөндөөлөргө өтүңүз."</string> + <string name="overview_gesture_feedback_complete_with_follow_up" msgid="3544611727467765026">"Жаңсоолорду колдонгонду үйрөндүңүз. Жаңсоолорду өчүрүү үчүн параметрлерге өтүңүз."</string> <string name="overview_gesture_feedback_complete_without_follow_up" msgid="3199486203448379152">"\"Колдонмолорду которуштуруу\" жаңсоосун үйрөндүңүз."</string> <string name="overview_gesture_intro_title" msgid="2902054412868489378">"Колдонмолорду которуштуруу үчүн сүрүңүз"</string> <string name="overview_gesture_intro_subtitle" msgid="4968091015637850859">"Бир колдонмодон экинчисине өтүү үчүн экранды ылдыйдан өйдө карай сүрүп, бир аз коё бербей туруңуз."</string> @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Тапшырмалар панели көрсөтүлдү"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Тапшырмалар панели жашырылды"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Чабыттоо тилкеси"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Тапшырмалар панелин ар дайым көрсөтүү"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Өтүү режимин өзгөртүү"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Тапшырмалар панелин бөлгүч"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Жогорку/сол бурчка жылдыруу"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Төмөнкү/оң бурчка жылдыруу"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Дагы # колдонмону көрсөтүү.}other{Дагы # колдонмону көрсөтүү.}}"</string> diff --git a/quickstep/res/values-lo/strings.xml b/quickstep/res/values-lo/strings.xml index be5d894c06..72201f258a 100644 --- a/quickstep/res/values-lo/strings.xml +++ b/quickstep/res/values-lo/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"ແຖບໜ້າວຽກທີ່ສະແດງຢູ່"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"ແຖບໜ້າວຽກທີ່ເຊື່ອງໄວ້ຢູ່"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"ແຖບການນຳທາງ"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"ສະແດງແຖບໜ້າວຽກສະເໝີ"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"ປ່ຽນໂໝດການນຳທາງ"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"ເສັ້ນແບ່ງແຖບໜ້າວຽກ"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"ຍ້າຍໄປຊ້າຍ/ເທິງ"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"ຍ້າຍໄປຂວາ/ລຸ່ມ"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{ສະແດງອີກ # ແອັບ.}other{ສະແດງອີກ # ແອັບ.}}"</string> diff --git a/quickstep/res/values-lt/strings.xml b/quickstep/res/values-lt/strings.xml index 06c4f79088..ba0df27168 100644 --- a/quickstep/res/values-lt/strings.xml +++ b/quickstep/res/values-lt/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Užduočių juosta rodoma"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Užduočių juosta paslėpta"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Naršymo juosta"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Visada rodyti užduočių juostą"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Keisti naršymo režimą"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Užduočių juostos daliklis"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Perkelti aukštyn, kairėn"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Perkelti žemyn, dešinėn"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Rodyti dar # programą.}one{Rodyti dar # programą.}few{Rodyti dar # programas.}many{Rodyti dar # programos.}other{Rodyti dar # programų.}}"</string> diff --git a/quickstep/res/values-lv/strings.xml b/quickstep/res/values-lv/strings.xml index 9ab8259c15..3992ebd67f 100644 --- a/quickstep/res/values-lv/strings.xml +++ b/quickstep/res/values-lv/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Uzdevumu josla tiek rādīta"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Uzdevumu josla paslēpta"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Navigācijas josla"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Vienmēr rādīt uzdevumu joslu"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Mainīt navigācijas režīmu"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Uzdevumu joslas atdalītājs"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Pārvietot uz augšējo/kreiso stūri"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Pārvietot uz apakšējo/labo stūri"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Rādīt vēl # lietotni}zero{Rādīt vēl # lietotnes}one{Rādīt vēl # lietotni}other{Rādīt vēl # lietotnes}}"</string> diff --git a/quickstep/res/values-mk/strings.xml b/quickstep/res/values-mk/strings.xml index bd6b12a722..8e11a2dcd6 100644 --- a/quickstep/res/values-mk/strings.xml +++ b/quickstep/res/values-mk/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Лентата со задачи е прикажана"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Лентата со задачи е сокриена"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Лента за навигација"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Секогаш прикажувај „Лента“"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Променете режим на навигација"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Разделник на „Лента со задачи“"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Премести горе лево"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Премести долу десно"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Прикажи уште # апликација.}one{Прикажи уште # апликација.}other{Прикажи уште # апликации.}}"</string> diff --git a/quickstep/res/values-ml/strings.xml b/quickstep/res/values-ml/strings.xml index 74fdd756d1..ab7731785b 100644 --- a/quickstep/res/values-ml/strings.xml +++ b/quickstep/res/values-ml/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"ടാസ്ക്ബാർ കാണിച്ചിരിക്കുന്നു"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"ടാസ്ക്ബാർ മറച്ചിരിക്കുന്നു"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"നാവിഗേഷൻ ബാർ"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"ടാസ്ക്ബാർ എപ്പോഴും കാണിക്കൂ"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"നാവിഗേഷൻ മോഡ് മാറ്റുക"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"ടാസ്ക്ബാർ ഡിവൈഡർ"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"മുകളിലേക്കോ ഇടത്തേക്കോ നീക്കുക"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"താഴേക്കോ വലത്തേക്കോ നീക്കുക"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{# ആപ്പ് കൂടി കാണിക്കുക.}other{# ആപ്പുകൾ കൂടി കാണിക്കുക.}}"</string> diff --git a/quickstep/res/values-mn/strings.xml b/quickstep/res/values-mn/strings.xml index 7c6314e7ab..40d14f4439 100644 --- a/quickstep/res/values-mn/strings.xml +++ b/quickstep/res/values-mn/strings.xml @@ -23,7 +23,7 @@ <string name="recent_task_option_freeform" msgid="48863056265284071">"Чөлөөтэй хувьсах"</string> <string name="recents_empty_message" msgid="7040467240571714191">"Сүүлийн үеийн зүйл алга"</string> <string name="accessibility_app_usage_settings" msgid="6312864233673544149">"Апп ашиглалтын тохиргоо"</string> - <string name="recents_clear_all" msgid="5328176793634888831">"Бүгдийг устгах"</string> + <string name="recents_clear_all" msgid="5328176793634888831">"Бүгдийг арилгах"</string> <string name="accessibility_recent_apps" msgid="4058661986695117371">"Саяхны аппууд"</string> <string name="task_view_closed" msgid="9170038230110856166">"Ажлыг хаасан"</string> <string name="task_contents_description_with_remaining_time" msgid="4479688746574672685">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="REMAINING_TIME">%2$s</xliff:g>"</string> @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Ажлын хэсгийг харуулсан"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Ажлын хэсгийг нуусан"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Навигацын самбар"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Ажлын хэсгийг үргэлж харуулах"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Навигацын горимыг өөрчлөх"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Ажлын хэсгийг хуваагч"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Зүүн дээд хэсэг рүү зөөх"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Баруун доод хэсэг рүү зөөх"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Өөр # аппыг харуулна уу.}other{Өөр # аппыг харуулна уу.}}"</string> diff --git a/quickstep/res/values-mr/strings.xml b/quickstep/res/values-mr/strings.xml index cfaf2d8864..c2ddaf5b39 100644 --- a/quickstep/res/values-mr/strings.xml +++ b/quickstep/res/values-mr/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"टास्कबार दाखवलेला आहे"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"टास्कबार लपवलेले आहे"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"नेव्हिगेशन बार"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"नेहमी टास्कबार दाखवा"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"नेव्हिगेशन मोड बदला"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"टास्कबार विभाजक"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"सर्वात वरती/डावीकडे हलवा"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"तळाशी/उजवीकडे हलवा"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{आणखी # अॅप दाखवा.}other{आणखी # अॅप्स दाखवा.}}"</string> diff --git a/quickstep/res/values-ms/strings.xml b/quickstep/res/values-ms/strings.xml index 4ed6493b84..129462d9ee 100644 --- a/quickstep/res/values-ms/strings.xml +++ b/quickstep/res/values-ms/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Bar Tugas dipaparkan"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Bar Tugas disembunyikan"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Bar navigasi"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Sentiasa paparkan Bar Tugas"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Tukar mod navigasi"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Pembahagi Bar Tugas"</string> <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="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Tunjukkan # lagi apl.}other{Tunjukkan # lagi apl.}}"</string> diff --git a/quickstep/res/values-my/strings.xml b/quickstep/res/values-my/strings.xml index 617473c66f..287e4a02d0 100644 --- a/quickstep/res/values-my/strings.xml +++ b/quickstep/res/values-my/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Taskbar ပြထားသည်"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Taskbar ဖျောက်ထားသည်"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"လမ်းညွှန်ဘား"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"‘လုပ်ဆောင်စရာဘား’ အမြဲပြပါ"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"ရွှေ့ကြည့်သည့်မုဒ် ပြောင်းရန်"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"လုပ်ဆောင်စရာဘား ပိုင်းခြားစနစ်"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"အပေါ်/ဘယ်ဘက်သို့ ရွှေ့ရန်"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"အောက်ခြေ/ညာဘက်သို့ ရွှေ့ရန်"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{နောက်ထပ်အက်ပ် # ခု ပြပါ။}other{နောက်ထပ်အက်ပ် # ခု ပြပါ။}}"</string> diff --git a/quickstep/res/values-nb/strings.xml b/quickstep/res/values-nb/strings.xml index e4d75bebcd..064eaf3c90 100644 --- a/quickstep/res/values-nb/strings.xml +++ b/quickstep/res/values-nb/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Oppgavelinjen vises"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Oppgavelinjen er skjult"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Navigasjonsrad"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Vis alltid oppgavelinjen"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Endre navigasjonsmodus"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Skille for oppgavelinjen"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Flytt til øverst/venstre"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Flytt til nederst/høyre"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Vis # app til.}other{Vis # apper til.}}"</string> diff --git a/quickstep/res/values-ne/strings.xml b/quickstep/res/values-ne/strings.xml index b9e8e1cb8e..f4df28bc6e 100644 --- a/quickstep/res/values-ne/strings.xml +++ b/quickstep/res/values-ne/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"टास्कबार देखाइएको छ"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"टास्कबार लुकाइएको छ"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"नेभिगेसन बार"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"टास्कबार सधैँ देखाइयोस्"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"नेभिगेसन मोड बदल्नुहोस्"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"टास्कबार डिभाइडर"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"सिरान/बायाँतिर सार्नुहोस्"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"फेद/दायाँतिर सार्नुहोस्"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{थप # एप देखाइयोस्।}other{थप # वटा एप देखाइयोस्।}}"</string> diff --git a/quickstep/res/values-nl/strings.xml b/quickstep/res/values-nl/strings.xml index f2a9d88fe0..140b4aeeab 100644 --- a/quickstep/res/values-nl/strings.xml +++ b/quickstep/res/values-nl/strings.xml @@ -98,7 +98,7 @@ <string name="accessibility_rotate_button" msgid="4771825231336502943">"Scherm draaien"</string> <string name="taskbar_edu_a11y_title" msgid="5417986057866415355">"Taakbalk Onderwijs"</string> <string name="taskbar_edu_splitscreen" msgid="5605512479258053350">"Sleep een app naar de zijkant om 2 apps tegelijk te gebruiken"</string> - <string name="taskbar_edu_stashing" msgid="5645461372669217294">"Swipe kort omhoog om de taakbalk te tonen"</string> + <string name="taskbar_edu_stashing" msgid="5645461372669217294">"Swipe langzaam omhoog om de taakbalk te tonen"</string> <string name="taskbar_edu_suggestions" msgid="8215044496435527982">"Krijg app-suggesties op basis van je routine"</string> <string name="taskbar_edu_settings_persistent" msgid="1387372982791296151">"Zet navigatie met gebaren aan bij Instellingen om de Taakbalk automatisch te verbergen"</string> <string name="taskbar_edu_features" msgid="3320337287472848162">"Doe meer met de taakbalk"</string> @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Taakbalk wordt getoond"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Taakbalk is verborgen"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Navigatiebalk"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Taakbalk altijd tonen"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Navigatiemodus wijzigen"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Scheiding voor Taakbalk"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Naar boven/links verplaatsen"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Naar beneden/rechts verplaatsen"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Nog # app tonen.}other{Nog # apps tonen.}}"</string> diff --git a/quickstep/res/values-or/strings.xml b/quickstep/res/values-or/strings.xml index 2affa6f5d9..5a04d97ef6 100644 --- a/quickstep/res/values-or/strings.xml +++ b/quickstep/res/values-or/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"ଟାସ୍କବାର ଦେଖାଯାଇଛି"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"ଟାସ୍କବାର ଲୁଚାଯାଇଛି"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"ନାଭିଗେସନ ବାର"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"ସର୍ବଦା ଟାସ୍କବାର ଦେଖାନ୍ତୁ"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"ନାଭିଗେସନ ମୋଡ ପରିବର୍ତ୍ତନ କରନ୍ତୁ"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"ଟାସ୍କବାର ଡିଭାଇଡର"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"ଶୀର୍ଷ/ବାମକୁ ମୁଭ କରନ୍ତୁ"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"ନିମ୍ନ/ଡାହାଣକୁ ମୁଭ କରନ୍ତୁ"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{ଅଧିକ #ଟି ଆପ ଦେଖାନ୍ତୁ।}other{ଅଧିକ #ଟି ଆପ୍ସ ଦେଖାନ୍ତୁ।}}"</string> diff --git a/quickstep/res/values-pa/strings.xml b/quickstep/res/values-pa/strings.xml index df9cc35279..939f699329 100644 --- a/quickstep/res/values-pa/strings.xml +++ b/quickstep/res/values-pa/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"ਟਾਸਕਬਾਰ ਨੂੰ ਦਿਖਾਇਆ ਗਿਆ"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"ਟਾਸਕਬਾਰ ਨੂੰ ਲੁਕਾਇਆ ਗਿਆ"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"ਨੈਵੀਗੇਸ਼ਨ ਵਾਲੀ ਪੱਟੀ"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"ਹਮੇਸ਼ਾਂ ਟਾਸਕਬਾਰ ਦਿਖਾਓ"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"ਨੈਵੀਗੇਸ਼ਨ ਮੋਡ ਬਦਲੋ"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"ਟਾਸਕਬਾਰ ਵਿਭਾਜਕ"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"ਸਿਖਰਲੇ/ਖੱਬੇ ਪਾਸੇ ਲੈ ਕੇ ਜਾਓ"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"ਹੇਠਾਂ/ਸੱਜੇ ਪਾਸੇ ਲੈ ਕੇ ਜਾਓ"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{# ਹੋਰ ਐਪ ਦਿਖਾਓ।}one{# ਹੋਰ ਐਪ ਦਿਖਾਓ।}other{# ਹੋਰ ਐਪਾਂ ਦਿਖਾਓ।}}"</string> diff --git a/quickstep/res/values-pl/strings.xml b/quickstep/res/values-pl/strings.xml index f09e41224a..2ee14ff80c 100644 --- a/quickstep/res/values-pl/strings.xml +++ b/quickstep/res/values-pl/strings.xml @@ -88,7 +88,7 @@ <string name="action_share" msgid="2648470652637092375">"Udostępnij"</string> <string name="action_screenshot" msgid="8171125848358142917">"Zrzut ekranu"</string> <string name="action_split" msgid="2098009717623550676">"Podziel"</string> - <string name="toast_split_select_app" msgid="8464310533320556058">"Kliknij drugą aplikację, aby podzielić ekran"</string> + <string name="toast_split_select_app" msgid="8464310533320556058">"Aby podzielić ekran, kliknij drugą aplikację"</string> <string name="toast_split_app_unsupported" msgid="2360229567007828914">"Wybierz drugą aplikację, aby podzielić ekran"</string> <string name="blocked_by_policy" msgid="2071401072261365546">"Nie możesz wykonać tego działania, bo nie zezwala na to aplikacja lub Twoja organizacja"</string> <string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Pominąć samouczek nawigacji?"</string> @@ -98,7 +98,7 @@ <string name="accessibility_rotate_button" msgid="4771825231336502943">"Obróć ekran"</string> <string name="taskbar_edu_a11y_title" msgid="5417986057866415355">"Informacje o pasku aplikacji"</string> <string name="taskbar_edu_splitscreen" msgid="5605512479258053350">"Przeciągnij aplikację w bok, aby używać 2 aplikacji naraz"</string> - <string name="taskbar_edu_stashing" msgid="5645461372669217294">"Przesuń palcem krótko w górę, aby wyświetlić pasek aplikacji"</string> + <string name="taskbar_edu_stashing" msgid="5645461372669217294">"Aby wyświetlić pasek aplikacji, przesuń palcem krótko w górę"</string> <string name="taskbar_edu_suggestions" msgid="8215044496435527982">"Otrzymuj sugestie aplikacji na podstawie rutyny"</string> <string name="taskbar_edu_settings_persistent" msgid="1387372982791296151">"Włącz nawigację przy użyciu gestów w Ustawieniach, aby automatycznie ukrywać pasek aplikacji"</string> <string name="taskbar_edu_features" msgid="3320337287472848162">"Wykorzystaj potencjał paska aplikacji"</string> @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Pasek aplikacji widoczny"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Pasek aplikacji ukryty"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Pasek nawigacyjny"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Zawsze pokazuj pasek aplikacji"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Zmień tryb nawigacji"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Linia dzielenia paska aplikacji"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Przesuń w górny lewy róg"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Przesuń w dolny prawy róg"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Pokaż jeszcze # aplikację.}few{Pokaż jeszcze # aplikacje.}many{Pokaż jeszcze # aplikacji.}other{Pokaż jeszcze # aplikacji.}}"</string> diff --git a/quickstep/res/values-pt-rPT/strings.xml b/quickstep/res/values-pt-rPT/strings.xml index 2b287b3bdf..c5aad16d3a 100644 --- a/quickstep/res/values-pt-rPT/strings.xml +++ b/quickstep/res/values-pt-rPT/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Barra de tarefas apresentada"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Barra de tarefas ocultada"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Barra de navegação"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Mostr. sempre Barra de tarefas"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Alterar modo de navegação"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Divisor da Barra de tarefas"</string> <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="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Mostrar mais # app.}other{Mostrar mais # apps.}}"</string> diff --git a/quickstep/res/values-pt/strings.xml b/quickstep/res/values-pt/strings.xml index 4092c06690..8cf6837b18 100644 --- a/quickstep/res/values-pt/strings.xml +++ b/quickstep/res/values-pt/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Barra de tarefas visível"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Barra de tarefas oculta"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Barra de navegação"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Sempre mostrar a Barra de tarefas"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Mudar o modo de navegação"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Separador da Barra de tarefas"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Mover para cima/para a esquerda"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Mover para baixo/para a direita"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Mostrar mais # app.}one{Mostrar mais # app.}other{Mostrar mais # apps.}}"</string> diff --git a/quickstep/res/values-ro/strings.xml b/quickstep/res/values-ro/strings.xml index 003b867815..8559f61ec1 100644 --- a/quickstep/res/values-ro/strings.xml +++ b/quickstep/res/values-ro/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Bara de activități este afișată"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Bara de activități este ascunsă"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Bară de navigare"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Afișează întotdeauna bara de activități"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Schimbă modul de navigare"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Separator pentru bara de activități"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Mută în stânga sus"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Mută în dreapta jos"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Afișează încă # aplicație}few{Afișează încă # aplicații}other{Afișează încă # de aplicații}}"</string> diff --git a/quickstep/res/values-ru/strings.xml b/quickstep/res/values-ru/strings.xml index 166fe7c66f..0634d8b52c 100644 --- a/quickstep/res/values-ru/strings.xml +++ b/quickstep/res/values-ru/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Панель задач показана"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Панель задач скрыта"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Панель навигации"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Всегда показывать панель задач"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Изменить режим навигации"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Разделитель панели задач"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Переместить вверх или влево"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Переместить вниз или вправо"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Показать ещё # приложение}one{Показать ещё # приложение}few{Показать ещё # приложения}many{Показать ещё # приложений}other{Показать ещё # приложения}}"</string> diff --git a/quickstep/res/values-si/strings.xml b/quickstep/res/values-si/strings.xml index 1b850efe90..376427b8b4 100644 --- a/quickstep/res/values-si/strings.xml +++ b/quickstep/res/values-si/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"කාර්ය තීරුව පෙන්වා ඇත"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"කාර්ය තීරුව සඟවා ඇත"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"සංචලන තීරුව"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"සෑම විටම කාර්ය තීරුව පෙන්වන්න"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"සංචාලන ප්රකාරය වෙනස් කරන්න"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"කාර්ය තීරු බෙදනය"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"ඉහළ/වම වෙත ගෙන යන්න"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"පහළ/දකුණ වෙත ගෙන යන්න"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{තවත් # යෙදුමක් පෙන්වන්න.}one{තවත් යෙදුම් #ක් පෙන්වන්න.}other{තවත් යෙදුම් #ක් පෙන්වන්න.}}"</string> diff --git a/quickstep/res/values-sk/strings.xml b/quickstep/res/values-sk/strings.xml index b2dff2e2e6..1577f4acd8 100644 --- a/quickstep/res/values-sk/strings.xml +++ b/quickstep/res/values-sk/strings.xml @@ -97,7 +97,7 @@ <string name="gesture_tutorial_action_button_label_skip" msgid="394452764989751960">"Preskočiť"</string> <string name="accessibility_rotate_button" msgid="4771825231336502943">"Otočiť obrazovku"</string> <string name="taskbar_edu_a11y_title" msgid="5417986057866415355">"Panel vzdelávacích aplikácií"</string> - <string name="taskbar_edu_splitscreen" msgid="5605512479258053350">"Ak chcete použ. dve aplikácie naraz, presuňte aplik. nabok"</string> + <string name="taskbar_edu_splitscreen" msgid="5605512479258053350">"Ak chcete použiť dve aplikácie naraz, presuňte aplikáciu nabok"</string> <string name="taskbar_edu_stashing" msgid="5645461372669217294">"Panel aplikácií zobrazíte pomalým potiahnutím nahor"</string> <string name="taskbar_edu_suggestions" msgid="8215044496435527982">"Získavajte návrhy aplikácií na základe svojich zvykov"</string> <string name="taskbar_edu_settings_persistent" msgid="1387372982791296151">"Ak chcete, aby sa panel aplikácií autom. skrýval, zapnite v Nastaveniach navigáciu gestami"</string> @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Panel aplikácií je zobrazený"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Panel aplikácií je skrytý"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Navigačný panel"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Zobrazovať panel aplikácií"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Zmeniť režim navigácie"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Rozdeľovač panela aplikácií"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Presunúť hore alebo doľava"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Presunúť dole alebo doprava"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Zobraziť # ďalšiu aplikáciu.}few{Zobraziť # ďalšie aplikácie.}many{Show # more apps.}other{Zobraziť # ďalších aplikácií.}}"</string> diff --git a/quickstep/res/values-sl/strings.xml b/quickstep/res/values-sl/strings.xml index e0f1f92b9e..38792bdad9 100644 --- a/quickstep/res/values-sl/strings.xml +++ b/quickstep/res/values-sl/strings.xml @@ -98,7 +98,7 @@ <string name="accessibility_rotate_button" msgid="4771825231336502943">"Sukanje zaslona"</string> <string name="taskbar_edu_a11y_title" msgid="5417986057866415355">"Poučni nasveti o opravilni vrstici"</string> <string name="taskbar_edu_splitscreen" msgid="5605512479258053350">"Povlecite aplikacijo na stran za uporabo 2 aplikacij hkrati."</string> - <string name="taskbar_edu_stashing" msgid="5645461372669217294">"Počasi povlecite navzgor za prikaz opravilne vrstice."</string> + <string name="taskbar_edu_stashing" msgid="5645461372669217294">"Počasi povlecite navzgor za prikaz opravilne vrstice"</string> <string name="taskbar_edu_suggestions" msgid="8215044496435527982">"Prejemajte predloge aplikacij na podlagi svojih navad."</string> <string name="taskbar_edu_settings_persistent" msgid="1387372982791296151">"V nastavitvah vklopite krmarjenje s potezami, da se bo opravilna vrstica samodejno skrila."</string> <string name="taskbar_edu_features" msgid="3320337287472848162">"Naredite več z opravilno vrstico"</string> @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Opravilna vrstica je prikazana"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Opravilna vrstica je skrita"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Vrstica za krmarjenje"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Stalen prikaz opravilne vrstice"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Spreminjanje načina navigacije"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Razdelilnik opravilne vrstice"</string> <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="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Pokaži še # aplikacijo.}one{Pokaži še # aplikacijo.}two{Pokaži še # aplikaciji.}few{Pokaži še # aplikacije.}other{Pokaži še # aplikacij.}}"</string> diff --git a/quickstep/res/values-sq/strings.xml b/quickstep/res/values-sq/strings.xml index c0d550be35..ad9f951a11 100644 --- a/quickstep/res/values-sq/strings.xml +++ b/quickstep/res/values-sq/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Shiriti i detyrave i shfaqur"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Shiriti i detyrave i fshehur"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Shiriti i navigimit"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Shfaq gjithmonë shiritin e detyrave"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Ndrysho modalitetin e navigimit"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Ndarësi i shiritit të detyrave"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Lëviz në krye/majtas"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Lëviz në fund/djathtas"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Shfaq # aplikacion tjetër.}other{Shfaq # aplikacione të tjera.}}"</string> diff --git a/quickstep/res/values-sr/strings.xml b/quickstep/res/values-sr/strings.xml index 17802836bc..f443a689fe 100644 --- a/quickstep/res/values-sr/strings.xml +++ b/quickstep/res/values-sr/strings.xml @@ -98,7 +98,7 @@ <string name="accessibility_rotate_button" msgid="4771825231336502943">"Ротирајте екран"</string> <string name="taskbar_edu_a11y_title" msgid="5417986057866415355">"Упутства на траци задатака"</string> <string name="taskbar_edu_splitscreen" msgid="5605512479258053350">"Превуците на страну да бисте користили 2 апликације одједном"</string> - <string name="taskbar_edu_stashing" msgid="5645461372669217294">"Накратко превуците нагоре да бисте приказали траку задатака"</string> + <string name="taskbar_edu_stashing" msgid="5645461372669217294">"Споро превуците нагоре да бисте приказали траку задатака"</string> <string name="taskbar_edu_suggestions" msgid="8215044496435527982">"Добијајте предлоге апликација на основу рутине"</string> <string name="taskbar_edu_settings_persistent" msgid="1387372982791296151">"Укључите навигацију помоћу покрета у Подешавањима ради аутоматског скривања траке задатака"</string> <string name="taskbar_edu_features" msgid="3320337287472848162">"Урадите више помоћу траке задатака"</string> @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Трака задатака је приказана"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Трака задатака је скривена"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Трака за навигацију"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Увек приказуј траку задатака"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Промени режим навигације"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Разделник траке задатака"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Премести горе лево"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Премести доле десно"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Прикажи још # апликацију.}one{Прикажи још # апликацију.}few{Прикажи још # апликације.}other{Прикажи још # апликација.}}"</string> diff --git a/quickstep/res/values-sv/strings.xml b/quickstep/res/values-sv/strings.xml index 5e8467514d..738b362697 100644 --- a/quickstep/res/values-sv/strings.xml +++ b/quickstep/res/values-sv/strings.xml @@ -21,7 +21,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="recent_task_option_pin" msgid="7929860679018978258">"Fäst"</string> <string name="recent_task_option_freeform" msgid="48863056265284071">"Fritt format"</string> - <string name="recents_empty_message" msgid="7040467240571714191">"Listan med de senaste åtgärderna är tom"</string> + <string name="recents_empty_message" msgid="7040467240571714191">"Listan är tom"</string> <string name="accessibility_app_usage_settings" msgid="6312864233673544149">"Inställningar för appanvändning"</string> <string name="recents_clear_all" msgid="5328176793634888831">"Rensa alla"</string> <string name="accessibility_recent_apps" msgid="4058661986695117371">"Senaste apparna"</string> @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Aktivitetsfältet visas"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Aktivitetsfältet är dolt"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Navigeringsfält"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Visa alltid aktivitetsfältet"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Ändra navigeringsläge"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Avdelare för aktivitetsfältet"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Flytta högst upp/till vänster"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Flytta längst ned/till höger"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Visa # app till.}other{Visa # appar till.}}"</string> diff --git a/quickstep/res/values-sw/strings.xml b/quickstep/res/values-sw/strings.xml index bc7cfb8269..c5b588d711 100644 --- a/quickstep/res/values-sw/strings.xml +++ b/quickstep/res/values-sw/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Upauzana umeonyeshwa"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Upauzana umefichwa"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Sehemu ya viungo muhimu"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Onyesha Upauzana kila wakati"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Badilisha hali ya usogezaji"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Kitenganishi cha Upauzana"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Sogeza juu/kushoto"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Sogeza chini/kulia"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Onyesha programu # zaidi.}other{Onyesha programu # zaidi.}}"</string> diff --git a/quickstep/res/values-ta/strings.xml b/quickstep/res/values-ta/strings.xml index 5ccbc17767..ea3974975a 100644 --- a/quickstep/res/values-ta/strings.xml +++ b/quickstep/res/values-ta/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"செயல் பட்டி காட்டப்படுகிறது"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"செயல் பட்டி மறைக்கப்பட்டுள்ளது"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"வழிசெலுத்தல் பட்டி"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"செயல் பட்டியை எப்போதும் காட்டு"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"வழிசெலுத்தல் பயன்முறையை மாற்று"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"செயல் பட்டிப் பிரிப்பான்"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"மேலே/இடதுபுறம் நகர்த்தும்"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"கீழே/வலதுபுறம் நகர்த்தும்"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{மேலும் # ஆப்ஸைக் காட்டு.}other{மேலும் # ஆப்ஸைக் காட்டு.}}"</string> diff --git a/quickstep/res/values-te/strings.xml b/quickstep/res/values-te/strings.xml index ad0c851ca8..9fe46efe0f 100644 --- a/quickstep/res/values-te/strings.xml +++ b/quickstep/res/values-te/strings.xml @@ -19,7 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="recent_task_option_pin" msgid="7929860679018978258">"పిన్ చేయి"</string> + <string name="recent_task_option_pin" msgid="7929860679018978258">"పిన్ చేయండి"</string> <string name="recent_task_option_freeform" msgid="48863056265284071">"సంప్రదాయేతర"</string> <string name="recents_empty_message" msgid="7040467240571714191">"ఇటీవలి అంశాలు ఏవీ లేవు"</string> <string name="accessibility_app_usage_settings" msgid="6312864233673544149">"యాప్ వినియోగ సెట్టింగ్లు"</string> @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"టాస్క్బార్ చూపబడింది"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"టాస్క్బార్ దాచబడింది"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"నావిగేషన్ బార్"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"ఎప్పుడూ టాస్క్బార్ చూపించండి"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"నావిగేషన్ మోడ్ను మార్చండి"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"టాస్క్బార్ డివైడర్"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"ఎగువ/ఎడమ వైపునకు తరలించండి"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"దిగువ/కుడి వైపునకు తరలించండి"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{మరో # యాప్ను చూడండి.}other{మరో # యాప్లను చూడండి.}}"</string> diff --git a/quickstep/res/values-th/strings.xml b/quickstep/res/values-th/strings.xml index 8cba9b9117..fe8e37f7d1 100644 --- a/quickstep/res/values-th/strings.xml +++ b/quickstep/res/values-th/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"แถบงานแสดงอยู่"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"แถบงานซ่อนอยู่"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"แถบนำทาง"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"แสดงแถบงานเสมอ"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"เปลี่ยนโหมดการนําทาง"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"ตัวแบ่งแถบงาน"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"ย้ายไปที่ด้านบนหรือด้านซ้าย"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"ย้ายไปที่ด้านล่างหรือด้านขวา"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{แสดงเพิ่มเติมอีก # แอป}other{แสดงเพิ่มเติมอีก # แอป}}"</string> diff --git a/quickstep/res/values-tl/strings.xml b/quickstep/res/values-tl/strings.xml index ae6dd45e40..bf62a38d04 100644 --- a/quickstep/res/values-tl/strings.xml +++ b/quickstep/res/values-tl/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Ipinapakita ang taskbar"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Nakatago ang taskbar"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Navigation bar"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Palaging ipakita ang Taskbar"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Magpalit ng navigation mode"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Divider ng Taskbar"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Ilipat sa itaas/kaliwa"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Ilipat sa ibaba/kanan"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Magpakita ng # pang app.}one{Magpakita ng # pang app.}other{Magpakita ng # pang app.}}"</string> diff --git a/quickstep/res/values-tr/strings.xml b/quickstep/res/values-tr/strings.xml index e5d5b6d68f..772ad8bcb3 100644 --- a/quickstep/res/values-tr/strings.xml +++ b/quickstep/res/values-tr/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Görev çubuğu gösteriliyor"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Görev çubuğu gizlendi"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Gezinme çubuğu"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Görev çubuğunu daima göster"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Gezinme modunu değiştir"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Görev Çubuğu Ayırıcısı"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Sol üste taşı"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Sağ alta taşı"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{# uygulama daha göster.}other{# uygulama daha göster}}"</string> diff --git a/quickstep/res/values-uk/strings.xml b/quickstep/res/values-uk/strings.xml index 36c5bbb6cb..0104798c8b 100644 --- a/quickstep/res/values-uk/strings.xml +++ b/quickstep/res/values-uk/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Панель завдань показано"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Панель завдань приховано"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Панель навігації"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Завжди показув. панель завдань"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Змінити режим навігації"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Розділювач панелі завдань"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Перемістити вгору або вліво"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Перемістити вниз або вправо"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Показати ще # додаток.}one{Показати ще # додаток.}few{Показати ще # додатки.}many{Показати ще # додатків.}other{Показати ще # додатка.}}"</string> diff --git a/quickstep/res/values-ur/strings.xml b/quickstep/res/values-ur/strings.xml index 9d1efe49a9..7e9b34c9c9 100644 --- a/quickstep/res/values-ur/strings.xml +++ b/quickstep/res/values-ur/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"ٹاشک بار دکھایا گیا"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"ٹاسک بار چھپایا گیا"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"نیویگیشن بار"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"ہمیشہ ٹاسک بار دکھائیں"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"نیویگیشن موڈ تبدیل کریں"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"ٹاسک بار ڈیوائیڈر"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"اوپر/بائیں طرف منتقل کریں"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"نیچے/دائیں طرف منتقل کریں"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{# مزید ایپ دکھائیں۔}other{# مزید ایپس دکھائیں۔}}"</string> diff --git a/quickstep/res/values-uz/strings.xml b/quickstep/res/values-uz/strings.xml index cf70ebdde8..73ad2f392f 100644 --- a/quickstep/res/values-uz/strings.xml +++ b/quickstep/res/values-uz/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Vazifalar paneli ochiq"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Vazifalar paneli yopiq"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Navigatsiya paneli"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Doim vazifalar paneli chiqsin"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Navigatsiya rejimini oʻzgartirish"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Vazifalar panelini ajratkich"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Yuqoriga yoki chapga oʻtkazish"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Pastga yoki oʻngga oʻtkazish"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Yana # ta ilovani chiqarish}other{Yana # ta ilovani chiqarish}}"</string> diff --git a/quickstep/res/values-vi/strings.xml b/quickstep/res/values-vi/strings.xml index ada07bd046..5b7f12e531 100644 --- a/quickstep/res/values-vi/strings.xml +++ b/quickstep/res/values-vi/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Đã hiện thanh thao tác"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Đã ẩn thanh thao tác"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Thanh điều hướng"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Luôn hiển thị Taskbar"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Thay đổi chế độ điều hướng"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Đường phân chia Taskbar"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Chuyển lên trên cùng/sang bên trái"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Chuyển xuống dưới cùng/sang bên phải"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Hiện thêm # ứng dụng.}other{Hiện thêm # ứng dụng.}}"</string> diff --git a/quickstep/res/values-zh-rCN/strings.xml b/quickstep/res/values-zh-rCN/strings.xml index 1e3c4ab0e4..b88899b5d7 100644 --- a/quickstep/res/values-zh-rCN/strings.xml +++ b/quickstep/res/values-zh-rCN/strings.xml @@ -97,7 +97,7 @@ <string name="gesture_tutorial_action_button_label_skip" msgid="394452764989751960">"跳过"</string> <string name="accessibility_rotate_button" msgid="4771825231336502943">"旋转屏幕"</string> <string name="taskbar_edu_a11y_title" msgid="5417986057866415355">"任务栏教程"</string> - <string name="taskbar_edu_splitscreen" msgid="5605512479258053350">"将一个应用拖动到一侧,即可一次使用两个应用"</string> + <string name="taskbar_edu_splitscreen" msgid="5605512479258053350">"将一个应用拖到一侧,即可一次使用两个应用"</string> <string name="taskbar_edu_stashing" msgid="5645461372669217294">"缓慢向上滑动即可显示任务栏"</string> <string name="taskbar_edu_suggestions" msgid="8215044496435527982">"根据您的日常安排获取应用建议"</string> <string name="taskbar_edu_settings_persistent" msgid="1387372982791296151">"在设置中开启手势导航后,任务栏会自动隐藏"</string> @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"任务栏已显示"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"任务栏已隐藏"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"导航栏"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"始终显示任务栏"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"更改导航模式"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"任务栏分隔线"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"移到顶部/左侧"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"移到底部/右侧"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{显示另外 # 个应用。}other{显示另外 # 个应用。}}"</string> diff --git a/quickstep/res/values-zh-rHK/strings.xml b/quickstep/res/values-zh-rHK/strings.xml index 16b56d39f8..e6de624598 100644 --- a/quickstep/res/values-zh-rHK/strings.xml +++ b/quickstep/res/values-zh-rHK/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"顯示咗工作列"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"隱藏咗工作列"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"導覽列"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"一律顯示工作列"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"變更導覽模式"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"工作列分隔線"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"移至上方/左側"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"移至底部/右側"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{顯示另外 # 個應用程式。}other{顯示另外 # 個應用程式。}}"</string> diff --git a/quickstep/res/values-zh-rTW/strings.xml b/quickstep/res/values-zh-rTW/strings.xml index 6926ec5603..2987a876bd 100644 --- a/quickstep/res/values-zh-rTW/strings.xml +++ b/quickstep/res/values-zh-rTW/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"已顯示工作列"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"已隱藏工作列"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"導覽列"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"一律顯示工作列"</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"變更操作模式"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"工作列分隔線"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"移到上方/左側"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"移到底部/右側"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{顯示另外 # 個應用程式。}other{顯示另外 # 個應用程式。}}"</string> diff --git a/quickstep/res/values-zu/strings.xml b/quickstep/res/values-zu/strings.xml index 246b1216b2..2d78ebc30e 100644 --- a/quickstep/res/values-zu/strings.xml +++ b/quickstep/res/values-zu/strings.xml @@ -115,6 +115,9 @@ <string name="taskbar_a11y_shown_title" msgid="6842833581088937713">"Ibha yomsebenzi ibonisiwe"</string> <string name="taskbar_a11y_hidden_title" msgid="9154903639589659284">"Ibha yomsebenzi ifihliwe"</string> <string name="taskbar_phone_a11y_title" msgid="4933360237131229395">"Ibha yokufuna"</string> + <string name="always_show_taskbar" msgid="3608801276107751229">"Bonisa i-Taskbar njalo."</string> + <string name="change_navigation_mode" msgid="9088393078736808968">"Shintsha imodi yokufuna"</string> + <string name="taskbar_divider_a11y_title" msgid="6608690309720242080">"Isihlukanisi se-Taskbar"</string> <string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Hamba phezulu/kwesokunxele"</string> <string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Hamba phansi/kwesokudla"</string> <string name="quick_switch_overflow" msgid="6935266023013283353">"{count,plural, =1{Bonisa i-app e-# ngaphezulu.}one{Bonisa ama-app angu-# ngaphezulu.}other{Bonisa ama-app angu-# ngaphezulu.}}"</string> diff --git a/quickstep/res/values/dimens.xml b/quickstep/res/values/dimens.xml index 959fea7572..5d2df70f79 100644 --- a/quickstep/res/values/dimens.xml +++ b/quickstep/res/values/dimens.xml @@ -292,6 +292,8 @@ <dimen name="taskbar_stashed_small_screen">108dp</dimen> <dimen name="taskbar_unstash_input_area">316dp</dimen> <dimen name="taskbar_stashed_handle_height">4dp</dimen> + <dimen name="taskbar_stashed_screen_edge_hover_deadzone_height">10dp</dimen> + <dimen name="taskbar_stashed_below_hover_deadzone_height">1dp</dimen> <dimen name="taskbar_edu_horizontal_margin">112dp</dimen> <dimen name="taskbar_nav_buttons_width_kids">88dp</dimen> <dimen name="taskbar_nav_buttons_height_kids">40dp</dimen> @@ -340,6 +342,8 @@ <dimen name="taskbar_edu_features_lottie_width">170dp</dimen> <dimen name="taskbar_edu_features_lottie_height">106dp</dimen> <dimen name="taskbar_edu_features_horizontal_spacing">24dp</dimen> + <dimen name="taskbar_edu_features_tooltip_width_persistent">624dp</dimen> + <dimen name="taskbar_edu_features_tooltip_width_transient">428dp</dimen> <!--- Taskbar Pinning --> <dimen name="taskbar_pinning_popup_menu_width">300dp</dimen> diff --git a/quickstep/res/values/styles.xml b/quickstep/res/values/styles.xml index 6c12f11bcb..e1afb265ee 100644 --- a/quickstep/res/values/styles.xml +++ b/quickstep/res/values/styles.xml @@ -200,7 +200,7 @@ <item name="android:background">@drawable/button_taskbar_edu_colored</item> <item name="android:stateListAnimator">@null</item> <item name="android:textSize">16sp</item> - <item name="android:padding">4dp</item> + <item name="android:minHeight">36dp</item> </style> <style name="TextAppearance.TaskbarEduTooltip.Title" parent="@android:style/TextAppearance.DeviceDefault.DialogWindowTitle"> diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java index 7e0530bcc0..37f62841bf 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java @@ -929,6 +929,13 @@ public class TaskbarActivityContext extends BaseTaskbarContext { } /** + * Returns whether the taskbar is currently visually stashed. + */ + public boolean isTaskbarStashed() { + return mControllers.taskbarStashController.isStashed(); + } + + /** * Called when we detect a long press in the nav region before passing the gesture slop. * @return Whether taskbar handled the long press, and thus should cancel the gesture. */ @@ -972,10 +979,23 @@ public class TaskbarActivityContext extends BaseTaskbarContext { /** * Called when we detect a motion down or up/cancel in the nav region while stashed. + * * @param animateForward Whether to animate towards the unstashed hint state or back to stashed. */ public void startTaskbarUnstashHint(boolean animateForward) { - mControllers.taskbarStashController.startUnstashHint(animateForward); + // TODO(b/270395798): Clean up forceUnstash after removing long-press unstashing code. + startTaskbarUnstashHint(animateForward, /* forceUnstash = */ false); + } + + /** + * Called when we detect a motion down or up/cancel in the nav region while stashed. + * + * @param animateForward Whether to animate towards the unstashed hint state or back to stashed. + * @param forceUnstash Whether we force the unstash hint. + */ + public void startTaskbarUnstashHint(boolean animateForward, boolean forceUnstash) { + // TODO(b/270395798): Clean up forceUnstash after removing long-press unstashing code. + mControllers.taskbarStashController.startUnstashHint(animateForward, forceUnstash); } /** @@ -1123,4 +1143,9 @@ public class TaskbarActivityContext extends BaseTaskbarContext { public int getTaskbarAllAppsScroll() { return mControllers.taskbarAllAppsController.getTaskbarAllAppsScroll(); } + + @VisibleForTesting + public float getStashedTaskbarScale() { + return mControllers.stashedHandleViewController.getStashedHandleHintScale().value; + } } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarEduTooltip.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarEduTooltip.kt index 7dda73f274..bcae06cd23 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarEduTooltip.kt +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarEduTooltip.kt @@ -25,16 +25,18 @@ import android.view.MotionEvent import android.view.MotionEvent.ACTION_DOWN import android.view.View import android.view.ViewGroup +import android.view.ViewGroup.LayoutParams.MATCH_PARENT import android.view.animation.Interpolator +import androidx.core.view.updateLayoutParams +import com.android.app.animation.Interpolators.EMPHASIZED_ACCELERATE +import com.android.app.animation.Interpolators.EMPHASIZED_DECELERATE +import com.android.app.animation.Interpolators.STANDARD import com.android.launcher3.AbstractFloatingView import com.android.launcher3.R import com.android.launcher3.anim.AnimatorListeners import com.android.launcher3.popup.RoundedArrowDrawable import com.android.launcher3.util.Themes import com.android.launcher3.views.ActivityContext -import com.android.systemui.animation.Interpolators.EMPHASIZED_ACCELERATE -import com.android.systemui.animation.Interpolators.EMPHASIZED_DECELERATE -import com.android.systemui.animation.Interpolators.STANDARD private const val ENTER_DURATION_MS = 300L private const val EXIT_DURATION_MS = 150L @@ -77,6 +79,18 @@ constructor( } mIsOpen = true activityContext.dragLayer.addView(this) + + // Make sure we have enough height to display all of the content, which can be an issue on + // large text and display scaling configurations. If we run out of height, remove the width + // constraint to reduce the number of lines of text and hopefully free up some height. + activityContext.dragLayer.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED) + if ( + measuredHeight + activityContext.deviceProfile.taskbarHeight >= + activityContext.deviceProfile.availableHeightPx + ) { + updateLayoutParams { width = MATCH_PARENT } + } + openCloseAnimator = createOpenCloseAnimator(isOpening = true).apply { start() } } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarEduTooltipController.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarEduTooltipController.kt index 2c686b8a13..e99fa50e61 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarEduTooltipController.kt +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarEduTooltipController.kt @@ -19,11 +19,13 @@ import android.os.Bundle import android.view.View import android.view.View.GONE import android.view.View.VISIBLE -import android.view.ViewGroup +import android.view.ViewGroup.LayoutParams.MATCH_PARENT +import android.view.ViewGroup.MarginLayoutParams import android.view.accessibility.AccessibilityEvent import android.view.accessibility.AccessibilityNodeInfo import androidx.annotation.IntDef import androidx.annotation.LayoutRes +import androidx.core.view.updateLayoutParams import com.airbnb.lottie.LottieAnimationView import com.android.launcher3.R import com.android.launcher3.Utilities @@ -127,11 +129,24 @@ class TaskbarEduTooltipController(val activityContext: TaskbarActivityContext) : settingsEdu.visibility = VISIBLE } - findViewById<View>(R.id.done_button)?.setOnClickListener { hide() } - if (DisplayController.isTransientTaskbar(activityContext)) { - (layoutParams as ViewGroup.MarginLayoutParams).bottomMargin += - activityContext.deviceProfile.taskbarHeight + // Set up layout parameters. + content.updateLayoutParams { width = MATCH_PARENT } + updateLayoutParams<MarginLayoutParams> { + if (DisplayController.isTransientTaskbar(activityContext)) { + width = + resources.getDimensionPixelSize( + R.dimen.taskbar_edu_features_tooltip_width_transient + ) + bottomMargin += activityContext.deviceProfile.taskbarHeight + } else { + width = + resources.getDimensionPixelSize( + R.dimen.taskbar_edu_features_tooltip_width_persistent + ) + } } + + findViewById<View>(R.id.done_button)?.setOnClickListener { hide() } show() } } diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java index 59b5e743f6..ed78e2d238 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java @@ -15,13 +15,13 @@ */ package com.android.launcher3.taskbar; +import static com.android.app.animation.Interpolators.EMPHASIZED; import static com.android.launcher3.taskbar.TaskbarKeyguardController.MASK_ANY_SYSUI_LOCKED; import static com.android.launcher3.taskbar.TaskbarStashController.FLAG_IN_APP; import static com.android.launcher3.taskbar.TaskbarStashController.FLAG_IN_STASHED_LAUNCHER_STATE; import static com.android.launcher3.taskbar.TaskbarViewController.ALPHA_INDEX_HOME; import static com.android.launcher3.util.FlagDebugUtils.appendFlag; import static com.android.launcher3.util.FlagDebugUtils.formatFlagChange; -import static com.android.systemui.animation.Interpolators.EMPHASIZED; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_AWAKE; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_DEVICE_DREAMING; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_WAKEFULNESS_MASK; diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java index b2f93787e0..5de5904638 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java @@ -856,15 +856,18 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba /** * Creates and starts a partial unstash animation, hinting at the new state that will trigger * when long press is detected. + * * @param animateForward Whether we are going towards the new unstashed state or returning to * the stashed state. + * @param forceUnstash Whether we force the unstash hint to animate. */ - public void startUnstashHint(boolean animateForward) { + protected void startUnstashHint(boolean animateForward, boolean forceUnstash) { if (!isStashed()) { // Already unstashed, no need to hint in that direction. return; } - if (!canCurrentlyManuallyUnstash()) { + // TODO(b/270395798): Clean up after removing long-press unstashing code path. + if (!canCurrentlyManuallyUnstash() && !forceUnstash) { // If any other flags are causing us to be stashed, long press won't cause us to // unstash, so don't hint that it will. return; diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashViaTouchController.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashViaTouchController.kt index 2373142074..1cc667211c 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashViaTouchController.kt +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashViaTouchController.kt @@ -25,7 +25,7 @@ import com.android.launcher3.touch.SingleAxisSwipeDetector.DIRECTION_NEGATIVE import com.android.launcher3.touch.SingleAxisSwipeDetector.VERTICAL import com.android.launcher3.util.DisplayController import com.android.launcher3.util.TouchController -import com.android.quickstep.inputconsumers.TaskbarStashInputConsumer +import com.android.quickstep.inputconsumers.TaskbarUnstashInputConsumer /** * A helper [TouchController] for [TaskbarDragLayerController], specifically to handle touch events @@ -34,7 +34,7 @@ import com.android.quickstep.inputconsumers.TaskbarStashInputConsumer * or [MotionEvent.ACTION_OUTSIDE]. * - Touches inside Transient Taskbar bounds will stash if it is detected as a swipe down gesture. * - * Note: touches to *unstash* Taskbar are handled by [TaskbarStashInputConsumer]. + * Note: touches to *unstash* Taskbar are handled by [TaskbarUnstashInputConsumer]. */ class TaskbarStashViaTouchController(val controllers: TaskbarControllers) : TouchController { diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java index f099e0636f..bc1a2c8b22 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java @@ -515,6 +515,14 @@ public class TaskbarView extends FrameLayout implements FolderIcon.FolderIconPar } /** + * Returns the taskbar divider in the taskbar. + */ + @Nullable + public View getTaskbarDividerView() { + return mTaskbarDivider; + } + + /** * Returns the QSB in the taskbar. */ public View getQsb() { diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java index ec3d1bcc0a..a7e2daa7d9 100644 --- a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java +++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java @@ -459,12 +459,14 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar for (int i = 0; i < mTaskbarView.getChildCount(); i++) { View child = mTaskbarView.getChildAt(i); boolean isAllAppsButton = child == mTaskbarView.getAllAppsButtonView(); + boolean isTaskbarDividerView = child == mTaskbarView.getTaskbarDividerView(); if (!mIsHotseatIconOnTopWhenAligned) { // When going to home, the EMPHASIZED interpolator in TaskbarLauncherStateController // plays iconAlignment to 1 really fast, therefore moving the fading towards the end // to avoid icons disappearing rather than fading out visually. setter.setViewAlpha(child, 0, Interpolators.clampToProgress(LINEAR, 0.8f, 1f)); - } else if ((isAllAppsButton && !FeatureFlags.ENABLE_ALL_APPS_BUTTON_IN_HOTSEAT.get())) { + } else if ((isAllAppsButton && !FeatureFlags.ENABLE_ALL_APPS_BUTTON_IN_HOTSEAT.get()) + || (isTaskbarDividerView && FeatureFlags.ENABLE_TASKBAR_PINNING.get())) { if (!isToHome && mIsHotseatIconOnTopWhenAligned && mControllers.taskbarStashController.isStashed()) { diff --git a/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsContainerView.java b/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsContainerView.java index 623e23412d..b4b83f6f24 100644 --- a/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsContainerView.java +++ b/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsContainerView.java @@ -19,15 +19,21 @@ import android.content.Context; import android.util.AttributeSet; import android.view.View; +import androidx.annotation.Nullable; + import com.android.launcher3.R; import com.android.launcher3.allapps.ActivityAllAppsContainerView; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.taskbar.overlay.TaskbarOverlayContext; +import java.util.Optional; + /** All apps container accessible from taskbar. */ public class TaskbarAllAppsContainerView extends ActivityAllAppsContainerView<TaskbarOverlayContext> { + private @Nullable OnInvalidateHeaderListener mOnInvalidateHeaderListener; + public TaskbarAllAppsContainerView(Context context, AttributeSet attrs) { this(context, attrs, 0); } @@ -36,6 +42,10 @@ public class TaskbarAllAppsContainerView extends super(context, attrs, defStyleAttr); } + void setOnInvalidateHeaderListener(OnInvalidateHeaderListener onInvalidateHeaderListener) { + mOnInvalidateHeaderListener = onInvalidateHeaderListener; + } + @Override protected View inflateSearchBox() { if (isSearchSupported()) { @@ -54,6 +64,13 @@ public class TaskbarAllAppsContainerView extends } @Override + public void invalidateHeader() { + super.invalidateHeader(); + Optional.ofNullable(mOnInvalidateHeaderListener).ifPresent( + OnInvalidateHeaderListener::onInvalidateHeader); + } + + @Override protected boolean isSearchSupported() { return FeatureFlags.ENABLE_ALL_APPS_SEARCH_IN_TASKBAR.get(); } @@ -63,4 +80,8 @@ public class TaskbarAllAppsContainerView extends // All apps is always open return true; } + + interface OnInvalidateHeaderListener { + void onInvalidateHeader(); + } } diff --git a/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsSlideInView.java b/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsSlideInView.java index f0d28dfd05..cfa1027dcc 100644 --- a/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsSlideInView.java +++ b/quickstep/src/com/android/launcher3/taskbar/allapps/TaskbarAllAppsSlideInView.java @@ -19,6 +19,7 @@ import static com.android.launcher3.anim.Interpolators.EMPHASIZED; import android.animation.PropertyValuesHolder; import android.content.Context; +import android.graphics.Canvas; import android.graphics.Rect; import android.util.AttributeSet; import android.view.MotionEvent; @@ -99,12 +100,13 @@ public class TaskbarAllAppsSlideInView extends AbstractSlideInView<TaskbarOverla mAppsView = findViewById(R.id.apps_view); mContent = mAppsView; + // Setup header protection for search bar, if enabled. + if (FeatureFlags.ENABLE_ALL_APPS_SEARCH_IN_TASKBAR.get()) { + mAppsView.setOnInvalidateHeaderListener(this::invalidate); + } + DeviceProfile dp = mActivityContext.getDeviceProfile(); setShiftRange(dp.allAppsShiftRange); - - setContentBackgroundWithParent( - getContext().getDrawable(R.drawable.bg_rounded_corner_bottom_sheet), - mAppsView.getBottomSheetBackground()); } @Override @@ -137,6 +139,12 @@ public class TaskbarAllAppsSlideInView extends AbstractSlideInView<TaskbarOverla } @Override + protected void dispatchDraw(Canvas canvas) { + mAppsView.drawOnScrimWithScale(canvas, mSlideInViewScale.value); + super.dispatchDraw(canvas); + } + + @Override protected void onScaleProgressChanged() { super.onScaleProgressChanged(); mAppsView.setClipChildren(!mIsBackProgressing); diff --git a/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayController.java b/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayController.java index 476e0a8bab..8de0e4079a 100644 --- a/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayController.java +++ b/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayController.java @@ -36,6 +36,7 @@ import com.android.launcher3.AbstractFloatingView; import com.android.launcher3.DeviceProfile; import com.android.launcher3.taskbar.TaskbarActivityContext; import com.android.launcher3.taskbar.TaskbarControllers; +import com.android.quickstep.views.DesktopTaskView; import com.android.systemui.shared.system.TaskStackChangeListener; import com.android.systemui.shared.system.TaskStackChangeListeners; @@ -65,7 +66,9 @@ public final class TaskbarOverlayController { @Override public void onTaskMovedToFront(int taskId) { - mProxyView.close(false); + if (DesktopTaskView.DESKTOP_MODE_SUPPORTED) { + mProxyView.close(false); + } } }; diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java index 549c50b8f8..65f449caba 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java +++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java @@ -1063,7 +1063,8 @@ public class QuickstepLauncher extends Launcher { } @Override - public void onInitialBindComplete(IntSet boundPages, RunnableList pendingTasks) { + public void onInitialBindComplete(IntSet boundPages, RunnableList pendingTasks, + int workspaceItemCount, boolean isBindSync) { pendingTasks.add(() -> { // This is added in pending task as we need to wait for views to be positioned // correctly before registering them for the animation. @@ -1073,7 +1074,7 @@ public class QuickstepLauncher extends Launcher { mLauncherUnfoldAnimationController.updateRegisteredViewsIfNeeded(); } }); - super.onInitialBindComplete(boundPages, pendingTasks); + super.onInitialBindComplete(boundPages, pendingTasks, workspaceItemCount, isBindSync); } @Override diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepWidgetHolder.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepWidgetHolder.java index 36e78fba80..39543b0d7d 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepWidgetHolder.java +++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepWidgetHolder.java @@ -95,7 +95,11 @@ public final class QuickstepWidgetHolder extends LauncherWidgetHolder { i -> MAIN_EXECUTOR.execute(() -> sHolders.forEach(h -> h.mAppWidgetRemovedCallback.accept(i))), () -> MAIN_EXECUTOR.execute(() -> - sHolders.forEach(h -> h.mProviderChangedListeners.forEach( + 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))), UI_HELPER_EXECUTOR.getLooper()); if (!WidgetsModel.GO_DISABLE_WIDGETS) { diff --git a/quickstep/src/com/android/launcher3/uioverrides/flags/DeveloperOptionsFragment.java b/quickstep/src/com/android/launcher3/uioverrides/flags/DeveloperOptionsFragment.java index 89aba90335..e1ce9b1d64 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/flags/DeveloperOptionsFragment.java +++ b/quickstep/src/com/android/launcher3/uioverrides/flags/DeveloperOptionsFragment.java @@ -359,17 +359,6 @@ public class DeveloperOptionsFragment extends PreferenceFragmentCompat { return true; }); sandboxCategory.addPreference(launchOverviewTutorialPreference); - Preference launchAssistantTutorialPreference = new Preference(context); - launchAssistantTutorialPreference.setKey("launchAssistantTutorial"); - launchAssistantTutorialPreference.setTitle("Launch Assistant Tutorial"); - launchAssistantTutorialPreference.setSummary("Learn how to use the Assistant gesture"); - launchAssistantTutorialPreference.setOnPreferenceClickListener(preference -> { - startActivity(launchSandboxIntent - .putExtra("use_tutorial_menu", false) - .putExtra("tutorial_steps", new String[] {"ASSISTANT"})); - return true; - }); - sandboxCategory.addPreference(launchAssistantTutorialPreference); Preference launchSandboxModeTutorialPreference = new Preference(context); launchSandboxModeTutorialPreference.setKey("launchSandboxMode"); launchSandboxModeTutorialPreference.setTitle("Launch Sandbox Mode"); diff --git a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java index b7a29e0034..5333cbe919 100644 --- a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java +++ b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java @@ -177,7 +177,7 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>, protected @Nullable RecentsAnimationController mDeferredCleanupRecentsAnimationController; protected RecentsAnimationTargets mRecentsAnimationTargets; protected T mActivity; - protected Q mRecentsView; + protected @Nullable Q mRecentsView; protected Runnable mGestureEndCallback; protected MultiStateCallback mStateCallback; protected boolean mCanceled; @@ -1895,7 +1895,9 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>, private void invalidateHandlerWithLauncher() { endLauncherTransitionController(); - mRecentsView.onGestureAnimationEnd(); + if (mRecentsView != null) { + mRecentsView.onGestureAnimationEnd(); + } resetLauncherListeners(); } @@ -1922,7 +1924,9 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>, private void resetLauncherListeners() { mActivity.getRootView().setOnApplyWindowInsetsListener(null); - mRecentsView.removeOnScrollChangedListener(mOnRecentsScrollListener); + if (mRecentsView != null) { + mRecentsView.removeOnScrollChangedListener(mOnRecentsScrollListener); + } } private void resetStateForAnimationCancel() { @@ -1981,8 +1985,10 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>, private boolean updateThumbnail(int runningTaskId, boolean refreshView) { boolean finishTransitionPosted = false; final TaskView taskView; - if (mGestureState.getEndTarget() == HOME || mGestureState.getEndTarget() == NEW_TASK - || mGestureState.getEndTarget() == ALL_APPS) { + if (mGestureState.getEndTarget() == HOME + || mGestureState.getEndTarget() == NEW_TASK + || mGestureState.getEndTarget() == ALL_APPS + || mRecentsView == null) { // Capture the screenshot before finishing the transition to home or quickswitching to // ensure it's taken in the correct orientation, but no need to update the thumbnail. taskView = null; @@ -2135,7 +2141,7 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>, protected void startNewTask(Consumer<Boolean> resultCallback) { // Launch the task user scrolled to (mRecentsView.getNextPage()). if (!mCanceled) { - TaskView nextTask = mRecentsView.getNextPageTaskView(); + TaskView nextTask = mRecentsView == null ? null : mRecentsView.getNextPageTaskView(); if (nextTask != null) { Task.TaskKey nextTaskKey = nextTask.getTask().key; int taskId = nextTaskKey.id; @@ -2237,7 +2243,8 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>, return; } RemoteAnimationTarget taskTarget = taskTargetOptional.get(); - TaskView taskView = mRecentsView.getTaskViewByTaskId(taskTarget.taskId); + TaskView taskView = mRecentsView == null + ? null : mRecentsView.getTaskViewByTaskId(taskTarget.taskId); if (taskView == null || !taskView.getThumbnail().shouldShowSplashView()) { finishRecentsAnimationOnTasksAppeared(null /* onFinishComplete */); return; @@ -2296,9 +2303,11 @@ public abstract class AbsSwipeUpHandler<T extends StatefulActivity<S>, * resume if we finish the controller. */ protected int getLastAppearedTaskIndex() { - return mGestureState.getLastAppearedTaskId() != -1 - ? mRecentsView.getTaskIndexForId(mGestureState.getLastAppearedTaskId()) - : mRecentsView.getRunningTaskIndex(); + return mRecentsView == null + ? -1 + : mGestureState.getLastAppearedTaskId() != -1 + ? mRecentsView.getTaskIndexForId(mGestureState.getLastAppearedTaskId()) + : mRecentsView.getRunningTaskIndex(); } /** diff --git a/quickstep/src/com/android/quickstep/InputConsumer.java b/quickstep/src/com/android/quickstep/InputConsumer.java index 64c92959e4..6b189cf4d6 100644 --- a/quickstep/src/com/android/quickstep/InputConsumer.java +++ b/quickstep/src/com/android/quickstep/InputConsumer.java @@ -41,6 +41,7 @@ public interface InputConsumer { int TYPE_ONE_HANDED = 1 << 11; int TYPE_TASKBAR_STASH = 1 << 12; int TYPE_STATUS_BAR = 1 << 13; + int TYPE_CURSOR_HOVER = 1 << 14; String[] NAMES = new String[] { "TYPE_NO_OP", // 0 @@ -57,6 +58,7 @@ public interface InputConsumer { "TYPE_ONE_HANDED", // 11 "TYPE_TASKBAR_STASH", // 12 "TYPE_STATUS_BAR", // 13 + "TYPE_CURSOR_HOVER", // 14 }; InputConsumer NO_OP = () -> TYPE_NO_OP; diff --git a/quickstep/src/com/android/quickstep/QuickstepTestInformationHandler.java b/quickstep/src/com/android/quickstep/QuickstepTestInformationHandler.java index 4e892e2722..4c9cf8b897 100644 --- a/quickstep/src/com/android/quickstep/QuickstepTestInformationHandler.java +++ b/quickstep/src/com/android/quickstep/QuickstepTestInformationHandler.java @@ -116,6 +116,16 @@ public class QuickstepTestInformationHandler extends TestInformationHandler { return response; } + case TestProtocol.REQUEST_STASHED_TASKBAR_SCALE: { + runOnTISBinder(tisBinder -> { + response.putFloat(TestProtocol.TEST_INFO_RESPONSE_FIELD, + tisBinder.getTaskbarManager() + .getCurrentActivityContext() + .getStashedTaskbarScale()); + }); + return response; + } + case TestProtocol.REQUEST_TASKBAR_ALL_APPS_TOP_PADDING: { return getTISBinderUIProperty(Bundle::putInt, tisBinder -> tisBinder.getTaskbarManager() @@ -149,6 +159,11 @@ public class QuickstepTestInformationHandler extends TestInformationHandler { case TestProtocol.REQUEST_DISABLE_TRANSIENT_TASKBAR: enableTransientTaskbar(false); return response; + + case TestProtocol.REQUEST_SHELL_DRAG_READY: + response.putBoolean(TestProtocol.TEST_INFO_RESPONSE_FIELD, + SystemUiProxy.INSTANCE.get(mContext).isDragAndDropReady()); + return response; } return super.call(method, arg, extras); diff --git a/quickstep/src/com/android/quickstep/RecentsAnimationCallbacks.java b/quickstep/src/com/android/quickstep/RecentsAnimationCallbacks.java index b82ff03b34..523a98ec4b 100644 --- a/quickstep/src/com/android/quickstep/RecentsAnimationCallbacks.java +++ b/quickstep/src/com/android/quickstep/RecentsAnimationCallbacks.java @@ -15,6 +15,8 @@ */ package com.android.quickstep; +import static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER; + import static com.android.launcher3.util.Executors.MAIN_EXECUTOR; import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.CANCEL_RECENTS_ANIMATION; import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.START_RECENTS_ANIMATION; @@ -34,6 +36,7 @@ import com.android.quickstep.util.ActiveGestureLog; import com.android.systemui.shared.recents.model.ThumbnailData; import com.android.systemui.shared.system.RecentsAnimationControllerCompat; +import java.util.ArrayList; import java.util.HashMap; import java.util.Set; @@ -105,8 +108,16 @@ public class RecentsAnimationCallbacks implements Utilities.postAsyncCallback(MAIN_EXECUTOR.getHandler(), mController::finishAnimationToApp); } else { - RemoteAnimationTarget[] nonAppTargets = - mSystemUiProxy.onGoingToRecentsLegacy(appTargets); + RemoteAnimationTarget[] nonAppTargets; + if (!TaskAnimationManager.ENABLE_SHELL_TRANSITIONS) { + nonAppTargets = mSystemUiProxy.onGoingToRecentsLegacy(appTargets); + } else { + final ArrayList<RemoteAnimationTarget> apps = new ArrayList<>(); + final ArrayList<RemoteAnimationTarget> nonApps = new ArrayList<>(); + classifyTargets(appTargets, apps, nonApps); + appTargets = apps.toArray(new RemoteAnimationTarget[apps.size()]); + nonAppTargets = nonApps.toArray(new RemoteAnimationTarget[nonApps.size()]); + } if (nonAppTargets == null) { nonAppTargets = new RemoteAnimationTarget[0]; } @@ -176,6 +187,18 @@ public class RecentsAnimationCallbacks implements return mListeners.toArray(new RecentsAnimationListener[mListeners.size()]); } + private void classifyTargets(RemoteAnimationTarget[] appTargets, + ArrayList<RemoteAnimationTarget> apps, ArrayList<RemoteAnimationTarget> nonApps) { + for (int i = 0; i < appTargets.length; i++) { + RemoteAnimationTarget target = appTargets[i]; + if (target.windowType == TYPE_DOCK_DIVIDER) { + nonApps.add(target); + } else { + apps.add(target); + } + } + } + /** * Listener for the recents animation callbacks. */ diff --git a/quickstep/src/com/android/quickstep/SystemUiProxy.java b/quickstep/src/com/android/quickstep/SystemUiProxy.java index 616ddef748..89f06f6895 100644 --- a/quickstep/src/com/android/quickstep/SystemUiProxy.java +++ b/quickstep/src/com/android/quickstep/SystemUiProxy.java @@ -70,6 +70,7 @@ import com.android.systemui.unfold.progress.IUnfoldAnimation; import com.android.systemui.unfold.progress.IUnfoldTransitionListener; import com.android.wm.shell.back.IBackAnimation; import com.android.wm.shell.desktopmode.IDesktopMode; +import com.android.wm.shell.draganddrop.IDragAndDrop; import com.android.wm.shell.onehanded.IOneHanded; import com.android.wm.shell.pip.IPip; import com.android.wm.shell.pip.IPipAnimationListener; @@ -128,6 +129,7 @@ public class SystemUiProxy implements ISystemUiProxy { private IBinder mOriginalTransactionToken = null; private IOnBackInvokedCallback mBackToLauncherCallback; private IRemoteAnimationRunner mBackToLauncherRunner; + private IDragAndDrop mDragAndDrop; // Used to dedupe calls to SystemUI private int mLastShelfHeight; @@ -203,7 +205,7 @@ public class SystemUiProxy implements ISystemUiProxy { IStartingWindow startingWindow, IRecentTasks recentTasks, ISysuiUnlockAnimationController sysuiUnlockAnimationController, IBackAnimation backAnimation, IDesktopMode desktopMode, - IUnfoldAnimation unfoldAnimation) { + IUnfoldAnimation unfoldAnimation, IDragAndDrop dragAndDrop) { unlinkToDeath(); mSystemUiProxy = proxy; mPip = pip; @@ -216,6 +218,7 @@ public class SystemUiProxy implements ISystemUiProxy { mBackAnimation = backAnimation; mDesktopMode = desktopMode; mUnfoldAnimation = unfoldAnimation; + mDragAndDrop = dragAndDrop; linkToDeath(); // re-attach the listeners once missing due to setProxy has not been initialized yet. setPipAnimationListener(mPipAnimationListener); @@ -230,7 +233,7 @@ public class SystemUiProxy implements ISystemUiProxy { } public void clearProxy() { - setProxy(null, null, null, null, null, null, null, null, null, null, null); + setProxy(null, null, null, null, null, null, null, null, null, null, null, null); } // TODO(141886704): Find a way to remove this @@ -1099,6 +1102,11 @@ public class SystemUiProxy implements ISystemUiProxy { Log.e(TAG, "Failed call setUnfoldAnimationListener", e); } } + + // + // Recents + // + /** * Starts the recents activity. The caller should manage the thread on which this is called. */ @@ -1131,10 +1139,30 @@ public class SystemUiProxy implements ISystemUiProxy { try { mRecentTasks.startRecentsTransition(mRecentsPendingIntent, intent, optsBundle, mContext.getIApplicationThread(), runner); + return true; } catch (RemoteException e) { Log.e(TAG, "Error starting recents via shell", e); return false; } - return true; + } + + // + // Drag and drop + // + + /** + * For testing purposes. Returns `true` only if the shell drop target has shown and + * drawn and is ready to handle drag events and the subsequent drop. + */ + public boolean isDragAndDropReady() { + if (mDragAndDrop == null) { + return false; + } + try { + return mDragAndDrop.isReadyToHandleDrag(); + } catch (RemoteException e) { + Log.e(TAG, "Error querying drag state", e); + return false; + } } } diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java index 038c6743dd..66aeee7d43 100644 --- a/quickstep/src/com/android/quickstep/TouchInteractionService.java +++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java @@ -29,6 +29,7 @@ import static com.android.launcher3.config.FeatureFlags.ENABLE_TRACKPAD_GESTURE; import static com.android.launcher3.util.Executors.MAIN_EXECUTOR; 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.util.ActiveGestureErrorDetector.GestureEvent.FLAG_USING_OTHER_ACTIVITY_INPUT_CONSUMER; import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.MOTION_DOWN; import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.MOTION_MOVE; @@ -43,6 +44,7 @@ import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_Q import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_TRACING_ENABLED; import static com.android.wm.shell.sysui.ShellSharedConstants.KEY_EXTRA_SHELL_BACK_ANIMATION; import static com.android.wm.shell.sysui.ShellSharedConstants.KEY_EXTRA_SHELL_DESKTOP_MODE; +import static com.android.wm.shell.sysui.ShellSharedConstants.KEY_EXTRA_SHELL_DRAG_AND_DROP; import static com.android.wm.shell.sysui.ShellSharedConstants.KEY_EXTRA_SHELL_ONE_HANDED; import static com.android.wm.shell.sysui.ShellSharedConstants.KEY_EXTRA_SHELL_PIP; import static com.android.wm.shell.sysui.ShellSharedConstants.KEY_EXTRA_SHELL_RECENT_TASKS; @@ -109,7 +111,7 @@ import com.android.quickstep.inputconsumers.ResetGestureInputConsumer; import com.android.quickstep.inputconsumers.ScreenPinnedInputConsumer; import com.android.quickstep.inputconsumers.StatusBarInputConsumer; import com.android.quickstep.inputconsumers.SysUiOverlayInputConsumer; -import com.android.quickstep.inputconsumers.TaskbarStashInputConsumer; +import com.android.quickstep.inputconsumers.TaskbarUnstashInputConsumer; import com.android.quickstep.util.ActiveGestureLog; import com.android.quickstep.util.ActiveGestureLog.CompoundString; import com.android.quickstep.util.ProtoTracer; @@ -125,6 +127,7 @@ import com.android.systemui.shared.tracing.ProtoTraceable; import com.android.systemui.unfold.progress.IUnfoldAnimation; import com.android.wm.shell.back.IBackAnimation; import com.android.wm.shell.desktopmode.IDesktopMode; +import com.android.wm.shell.draganddrop.IDragAndDrop; import com.android.wm.shell.onehanded.IOneHanded; import com.android.wm.shell.pip.IPip; import com.android.wm.shell.recents.IRecentTasks; @@ -185,11 +188,13 @@ public class TouchInteractionService extends Service bundle.getBinder(KEY_EXTRA_SHELL_DESKTOP_MODE)); IUnfoldAnimation unfoldTransition = IUnfoldAnimation.Stub.asInterface( bundle.getBinder(KEY_EXTRA_UNFOLD_ANIMATION_FORWARDER)); + IDragAndDrop dragAndDrop = IDragAndDrop.Stub.asInterface( + bundle.getBinder(KEY_EXTRA_SHELL_DRAG_AND_DROP)); MAIN_EXECUTOR.execute(() -> { SystemUiProxy.INSTANCE.get(TouchInteractionService.this).setProxy(proxy, pip, splitscreen, onehanded, shellTransitions, startingWindow, recentTasks, launcherUnlockAnimationController, backAnimation, desktopMode, - unfoldTransition); + unfoldTransition, dragAndDrop); TouchInteractionService.this.initInputMonitor("TISBinder#onInitialize()"); preloadOverview(true /* fromInit */); }); @@ -637,12 +642,17 @@ public class TouchInteractionService extends Service TraceHelper.FLAG_ALLOW_BINDER_TRACKING); final int action = event.getActionMasked(); - if (action == ACTION_DOWN) { + // Note this will create a new consumer every mouse click, as after ACTION_UP from the click + // an ACTION_HOVER_ENTER will fire as well. + boolean isHoverActionWithoutConsumer = + event.isHoverEvent() && (mUncheckedConsumer.getType() & TYPE_CURSOR_HOVER) == 0; + if (action == ACTION_DOWN || isHoverActionWithoutConsumer) { mRotationTouchHelper.setOrientationTransformIfNeeded(event); - if (!mDeviceState.isOneHandedModeActive() + if ((!mDeviceState.isOneHandedModeActive() && mRotationTouchHelper.isInSwipeUpTouchRegion(event, - mOverviewComponentObserver.getActivityInterface())) { + mOverviewComponentObserver.getActivityInterface())) + || isHoverActionWithoutConsumer) { // Clone the previous gesture state since onConsumerAboutToBeSwitched might trigger // onConsumerInactive and wipe the previous gesture state GestureState prevGestureState = new GestureState(mGestureState); @@ -719,6 +729,8 @@ public class TouchInteractionService extends Service if (action == ACTION_POINTER_DOWN) { mGestureState.setTrackpadGestureType(getTrackpadGestureType(event)); } + } else if (event.isHoverEvent()) { + mUncheckedConsumer.onHoverEvent(event); } else { mUncheckedConsumer.onMotionEvent(event); } @@ -842,7 +854,7 @@ public class TouchInteractionService extends Service base = tryCreateAssistantInputConsumer(base, newGestureState, event, reasonString); } - // If Taskbar is present, we listen for long press to unstash it. + // If Taskbar is present, we listen for long press or cursor hover events to unstash it. TaskbarActivityContext tac = mTaskbarManager.getCurrentActivityContext(); if (tac != null) { // Present always on large screen or on small screen w/ flag @@ -853,8 +865,8 @@ public class TouchInteractionService extends Service .append(reasonPrefix) .append(SUBSTRING_PREFIX) .append("TaskbarActivityContext != null, " - + "using TaskbarStashInputConsumer"); - base = new TaskbarStashInputConsumer(this, base, mInputMonitorCompat, tac); + + "using TaskbarUnstashInputConsumer"); + base = new TaskbarUnstashInputConsumer(this, base, mInputMonitorCompat, tac); } } diff --git a/quickstep/src/com/android/quickstep/inputconsumers/OverviewInputConsumer.java b/quickstep/src/com/android/quickstep/inputconsumers/OverviewInputConsumer.java index cd98e7abdc..64165b66e4 100644 --- a/quickstep/src/com/android/quickstep/inputconsumers/OverviewInputConsumer.java +++ b/quickstep/src/com/android/quickstep/inputconsumers/OverviewInputConsumer.java @@ -61,14 +61,6 @@ public class OverviewInputConsumer<S extends BaseState<S>, T extends StatefulAct mTarget = activity.getDragLayer(); mTarget.getLocationOnScreen(mLocationOnScreen); - - // When Overview is launched via meta+tab or swipe up from an app, - // the touch mode somehow is not changed to false by the Android framework. - // The subsequent key events (e.g. DPAD_LEFT, DPAD_RIGHT) can only be dispatched to - // focused views, while focus can only be requested in - // {@link View#requestFocusNoSearch(int, Rect)} when touch mode is false. To note, - // here we launch overview with live tile. - mActivity.getRootView().getViewRootImpl().touchModeChanged(false); } @Override diff --git a/quickstep/src/com/android/quickstep/inputconsumers/TaskbarStashInputConsumer.java b/quickstep/src/com/android/quickstep/inputconsumers/TaskbarUnstashInputConsumer.java index 51c2b4829a..65c825c0f6 100644 --- a/quickstep/src/com/android/quickstep/inputconsumers/TaskbarStashInputConsumer.java +++ b/quickstep/src/com/android/quickstep/inputconsumers/TaskbarUnstashInputConsumer.java @@ -19,17 +19,20 @@ import static android.view.MotionEvent.INVALID_POINTER_ID; import static com.android.launcher3.MotionEventsUtils.isTrackpadMotionEvent; import static com.android.launcher3.Utilities.squaredHypot; +import static com.android.launcher3.config.FeatureFlags.ENABLE_CURSOR_HOVER_STATES; import static com.android.launcher3.taskbar.TaskbarAutohideSuspendController.FLAG_AUTOHIDE_SUSPEND_TOUCHING; import android.content.Context; import android.content.res.Resources; import android.graphics.PointF; +import android.graphics.Rect; import android.view.GestureDetector; import android.view.GestureDetector.SimpleOnGestureListener; import android.view.MotionEvent; import androidx.annotation.Nullable; +import com.android.launcher3.DeviceProfile; import com.android.launcher3.R; import com.android.launcher3.Utilities; import com.android.launcher3.taskbar.TaskbarActivityContext; @@ -40,9 +43,11 @@ import com.android.quickstep.InputConsumer; import com.android.systemui.shared.system.InputMonitorCompat; /** - * Listens for a long press, and cancels the current gesture if that causes Taskbar to be unstashed. + * Listens for touch and hover events to unstash the Taskbar. + * + * <p>Cancels the current gesture if the long press causes the Taskbar to be unstashed. */ -public class TaskbarStashInputConsumer extends DelegateInputConsumer { +public class TaskbarUnstashInputConsumer extends DelegateInputConsumer { private final TaskbarActivityContext mTaskbarActivityContext; private final GestureDetector mLongPressDetector; @@ -64,9 +69,15 @@ public class TaskbarStashInputConsumer extends DelegateInputConsumer { private final boolean mIsTransientTaskbar; + private boolean mIsStashedTaskbarHovered = false; + private final Rect mStashedTaskbarHandleBounds = new Rect(); + private final Rect mBottomEdgeBounds = new Rect(); + private final int mBottomScreenEdge; + private final int mStashedTaskbarBottomEdge; + private final @Nullable TransitionCallback mTransitionCallback; - public TaskbarStashInputConsumer(Context context, InputConsumer delegate, + public TaskbarUnstashInputConsumer(Context context, InputConsumer delegate, InputMonitorCompat inputMonitor, TaskbarActivityContext taskbarActivityContext) { super(delegate, inputMonitor); mTaskbarActivityContext = taskbarActivityContext; @@ -90,6 +101,11 @@ public class TaskbarStashInputConsumer extends DelegateInputConsumer { } }); + mBottomScreenEdge = res.getDimensionPixelSize( + R.dimen.taskbar_stashed_screen_edge_hover_deadzone_height); + mStashedTaskbarBottomEdge = + res.getDimensionPixelSize(R.dimen.taskbar_stashed_below_hover_deadzone_height); + mTransitionCallback = mIsTransientTaskbar ? taskbarActivityContext.getTranslationCallbacks() : null; @@ -97,7 +113,7 @@ public class TaskbarStashInputConsumer extends DelegateInputConsumer { @Override public int getType() { - return TYPE_TASKBAR_STASH | mDelegate.getType(); + return TYPE_TASKBAR_STASH | TYPE_CURSOR_HOVER | mDelegate.getType(); } @Override @@ -213,4 +229,73 @@ public class TaskbarStashInputConsumer extends DelegateInputConsumer { } } } + + /** + * Listen for hover events for the stashed taskbar. + * + * <p>When hovered over the stashed taskbar handle, show the unstash hint. + * <p>When the cursor is touching the bottom edge below the stashed taskbar, unstash it. + * <p>When the cursor is within a defined threshold of the screen's bottom edge outside of + * the stashed taskbar, unstash it. + */ + @Override + public void onHoverEvent(MotionEvent ev) { + if (!ENABLE_CURSOR_HOVER_STATES.get() || mTaskbarActivityContext == null + || !mTaskbarActivityContext.isTaskbarStashed()) { + return; + } + + if (mIsStashedTaskbarHovered) { + updateHoveredTaskbarState((int) ev.getX(), (int) ev.getY()); + } else { + updateUnhoveredTaskbarState((int) ev.getX(), (int) ev.getY()); + } + } + + private void updateHoveredTaskbarState(int x, int y) { + DeviceProfile dp = mTaskbarActivityContext.getDeviceProfile(); + mStashedTaskbarHandleBounds.set( + (dp.widthPx - (int) mUnstashArea) / 2, + dp.heightPx - dp.stashedTaskbarHeight, + (int) (((dp.widthPx - mUnstashArea) / 2) + mUnstashArea), + dp.heightPx); + mBottomEdgeBounds.set(mStashedTaskbarHandleBounds); + mBottomEdgeBounds.top = dp.heightPx - mStashedTaskbarBottomEdge; + + if (mBottomEdgeBounds.contains(x, y)) { + // If hovering stashed taskbar and then hover screen bottom edge, unstash it. + mTaskbarActivityContext.onSwipeToUnstashTaskbar(); + mIsStashedTaskbarHovered = false; + } else if (!mStashedTaskbarHandleBounds.contains(x, y)) { + // If exit hovering stashed taskbar, remove hint. + startStashedTaskbarHover(/* isHovered = */ false); + } + } + + private void updateUnhoveredTaskbarState(int x, int y) { + DeviceProfile dp = mTaskbarActivityContext.getDeviceProfile(); + mStashedTaskbarHandleBounds.set( + (dp.widthPx - (int) mUnstashArea) / 2, + dp.heightPx - dp.stashedTaskbarHeight, + (int) (((dp.widthPx - mUnstashArea) / 2) + mUnstashArea), + dp.heightPx); + mBottomEdgeBounds.set( + 0, + dp.heightPx - mBottomScreenEdge, + dp.widthPx, + dp.heightPx); + + if (mStashedTaskbarHandleBounds.contains(x, y)) { + // If enter hovering stashed taskbar, start hint. + startStashedTaskbarHover(/* isHovered = */ true); + } else if (mBottomEdgeBounds.contains(x, y)) { + // If hover screen's bottom edge not below the stashed taskbar, unstash it. + mTaskbarActivityContext.onSwipeToUnstashTaskbar(); + } + } + + private void startStashedTaskbarHover(boolean isHovered) { + mTaskbarActivityContext.startTaskbarUnstashHint(isHovered, /* forceUnstash = */ true); + mIsStashedTaskbarHovered = isHovered; + } } diff --git a/quickstep/src/com/android/quickstep/interaction/AssistantGestureTutorialController.java b/quickstep/src/com/android/quickstep/interaction/AssistantGestureTutorialController.java deleted file mode 100644 index 40c600f512..0000000000 --- a/quickstep/src/com/android/quickstep/interaction/AssistantGestureTutorialController.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (C) 2020 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.interaction; - -import android.graphics.PointF; - -import com.android.launcher3.R; -import com.android.quickstep.interaction.EdgeBackGestureHandler.BackGestureResult; -import com.android.quickstep.interaction.NavBarGestureHandler.NavBarGestureResult; - -/** A {@link TutorialController} for the Assistant tutorial. */ -final class AssistantGestureTutorialController extends TutorialController { - - AssistantGestureTutorialController(AssistantGestureTutorialFragment fragment, - TutorialType tutorialType) { - super(fragment, tutorialType); - } - - @Override - public void onBackGestureAttempted(BackGestureResult result) { - switch (mTutorialType) { - case ASSISTANT: - switch (result) { - case BACK_COMPLETED_FROM_LEFT: - case BACK_COMPLETED_FROM_RIGHT: - case BACK_CANCELLED_FROM_LEFT: - case BACK_CANCELLED_FROM_RIGHT: - showFeedback(R.string.assistant_gesture_feedback_swipe_too_far_from_corner); - break; - } - break; - case ASSISTANT_COMPLETE: - if (result == BackGestureResult.BACK_COMPLETED_FROM_LEFT - || result == BackGestureResult.BACK_COMPLETED_FROM_RIGHT) { - mTutorialFragment.close(); - } - break; - } - } - - - @Override - public void onNavBarGestureAttempted(NavBarGestureResult result, PointF finalVelocity) { - switch (mTutorialType) { - case ASSISTANT: - switch (result) { - case HOME_GESTURE_COMPLETED: - case OVERVIEW_GESTURE_COMPLETED: - case HOME_NOT_STARTED_TOO_FAR_FROM_EDGE: - case OVERVIEW_NOT_STARTED_TOO_FAR_FROM_EDGE: - case HOME_OR_OVERVIEW_NOT_STARTED_WRONG_SWIPE_DIRECTION: - case HOME_OR_OVERVIEW_CANCELLED: - showFeedback(R.string.assistant_gesture_feedback_swipe_too_far_from_corner); - break; - case ASSISTANT_COMPLETED: - showRippleEffect(null); - showFeedback(R.string.assistant_gesture_tutorial_playground_subtitle); - break; - case ASSISTANT_NOT_STARTED_BAD_ANGLE: - showFeedback(R.string.assistant_gesture_feedback_swipe_not_diagonal); - break; - case ASSISTANT_NOT_STARTED_SWIPE_TOO_SHORT: - showFeedback(R.string.assistant_gesture_feedback_swipe_not_long_enough); - break; - } - break; - case ASSISTANT_COMPLETE: - if (result == NavBarGestureResult.HOME_GESTURE_COMPLETED) { - mTutorialFragment.close(); - } - break; - } - } - - @Override - public void setAssistantProgress(float progress) { - // TODO: Create an animation. - } -} diff --git a/quickstep/src/com/android/quickstep/interaction/AssistantGestureTutorialFragment.java b/quickstep/src/com/android/quickstep/interaction/AssistantGestureTutorialFragment.java deleted file mode 100644 index 90a1c36dc4..0000000000 --- a/quickstep/src/com/android/quickstep/interaction/AssistantGestureTutorialFragment.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (C) 2020 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.interaction; - -import android.view.MotionEvent; -import android.view.View; - -import androidx.annotation.NonNull; - -import com.android.launcher3.logging.StatsLogManager; -import com.android.quickstep.interaction.TutorialController.TutorialType; - -/** Shows the Home gesture interactive tutorial. */ -public class AssistantGestureTutorialFragment extends TutorialFragment { - - public AssistantGestureTutorialFragment(boolean fromTutorialMenu) { - super(fromTutorialMenu); - } - - @Override - TutorialController createController(TutorialType type) { - return new AssistantGestureTutorialController(this, type); - } - - @Override - Class<? extends TutorialController> getControllerClass() { - return AssistantGestureTutorialController.class; - } - - @Override - public boolean onTouch(View view, MotionEvent motionEvent) { - if (motionEvent.getAction() == MotionEvent.ACTION_DOWN && mTutorialController != null) { - mTutorialController.setRippleHotspot(motionEvent.getX(), motionEvent.getY()); - } - return super.onTouch(view, motionEvent); - } - - @Override - void logTutorialStepShown(@NonNull StatsLogManager statsLogManager) { - // No-Op: tutorial step not currently shown to users - } - - @Override - void logTutorialStepCompleted(@NonNull StatsLogManager statsLogManager) { - // No-Op: tutorial step not currently shown to users - } -} diff --git a/quickstep/src/com/android/quickstep/interaction/BackGestureTutorialController.java b/quickstep/src/com/android/quickstep/interaction/BackGestureTutorialController.java index e1f0924e03..ab76fb422e 100644 --- a/quickstep/src/com/android/quickstep/interaction/BackGestureTutorialController.java +++ b/quickstep/src/com/android/quickstep/interaction/BackGestureTutorialController.java @@ -205,9 +205,6 @@ final class BackGestureTutorialController extends TutorialController { case HOME_GESTURE_COMPLETED: case OVERVIEW_GESTURE_COMPLETED: case HOME_OR_OVERVIEW_NOT_STARTED_WRONG_SWIPE_DIRECTION: - case ASSISTANT_COMPLETED: - case ASSISTANT_NOT_STARTED_BAD_ANGLE: - case ASSISTANT_NOT_STARTED_SWIPE_TOO_SHORT: default: showFeedback(R.string.back_gesture_feedback_swipe_in_nav_bar); diff --git a/quickstep/src/com/android/quickstep/interaction/NavBarGestureHandler.java b/quickstep/src/com/android/quickstep/interaction/NavBarGestureHandler.java index 57874d9deb..6cee6906d4 100644 --- a/quickstep/src/com/android/quickstep/interaction/NavBarGestureHandler.java +++ b/quickstep/src/com/android/quickstep/interaction/NavBarGestureHandler.java @@ -15,11 +15,7 @@ */ package com.android.quickstep.interaction; -import static com.android.launcher3.Utilities.squaredHypot; import static com.android.launcher3.util.VibratorWrapper.OVERVIEW_HAPTIC; -import static com.android.quickstep.interaction.NavBarGestureHandler.NavBarGestureResult.ASSISTANT_COMPLETED; -import static com.android.quickstep.interaction.NavBarGestureHandler.NavBarGestureResult.ASSISTANT_NOT_STARTED_BAD_ANGLE; -import static com.android.quickstep.interaction.NavBarGestureHandler.NavBarGestureResult.ASSISTANT_NOT_STARTED_SWIPE_TOO_SHORT; import static com.android.quickstep.interaction.NavBarGestureHandler.NavBarGestureResult.HOME_GESTURE_COMPLETED; import static com.android.quickstep.interaction.NavBarGestureHandler.NavBarGestureResult.HOME_NOT_STARTED_TOO_FAR_FROM_EDGE; import static com.android.quickstep.interaction.NavBarGestureHandler.NavBarGestureResult.HOME_OR_OVERVIEW_CANCELLED; @@ -27,24 +23,16 @@ import static com.android.quickstep.interaction.NavBarGestureHandler.NavBarGestu import static com.android.quickstep.interaction.NavBarGestureHandler.NavBarGestureResult.OVERVIEW_GESTURE_COMPLETED; import static com.android.quickstep.interaction.NavBarGestureHandler.NavBarGestureResult.OVERVIEW_NOT_STARTED_TOO_FAR_FROM_EDGE; -import android.animation.ValueAnimator; import android.content.Context; import android.content.res.Resources; import android.graphics.Point; import android.graphics.PointF; -import android.graphics.RectF; -import android.os.SystemClock; -import android.view.Display; -import android.view.GestureDetector; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; -import android.view.ViewConfiguration; import androidx.annotation.Nullable; -import com.android.launcher3.R; -import com.android.launcher3.anim.Interpolators; import com.android.launcher3.testing.shared.ResourceUtils; import com.android.launcher3.util.DisplayController; import com.android.launcher3.util.NavigationMode; @@ -52,46 +40,25 @@ import com.android.launcher3.util.VibratorWrapper; import com.android.quickstep.util.MotionPauseDetector; import com.android.quickstep.util.NavBarPosition; import com.android.quickstep.util.TriggerSwipeUpTouchTracker; -import com.android.systemui.shared.system.QuickStepContract; -/** Utility class to handle Home and Assistant gestures. */ +/** Utility class to handle Home gesture. */ public class NavBarGestureHandler implements OnTouchListener, TriggerSwipeUpTouchTracker.OnSwipeUpListener, MotionPauseDetector.OnMotionPauseListener { private static final String LOG_TAG = "NavBarGestureHandler"; - private static final long RETRACT_GESTURE_ANIMATION_DURATION_MS = 300; - private final Context mContext; private final Point mDisplaySize = new Point(); private final TriggerSwipeUpTouchTracker mSwipeUpTouchTracker; private final int mBottomGestureHeight; - private final GestureDetector mAssistantGestureDetector; - private final int mAssistantAngleThreshold; - private final RectF mAssistantLeftRegion = new RectF(); - private final RectF mAssistantRightRegion = new RectF(); - private final float mAssistantDragDistThreshold; - private final float mAssistantFlingDistThreshold; - private final long mAssistantTimeThreshold; - private final float mAssistantSquaredSlop; - private final PointF mAssistantStartDragPos = new PointF(); private final PointF mDownPos = new PointF(); private final PointF mLastPos = new PointF(); private final MotionPauseDetector mMotionPauseDetector; - private boolean mTouchCameFromAssistantCorner; private boolean mTouchCameFromNavBar; - private boolean mPassedAssistantSlop; - private boolean mAssistantGestureActive; - private boolean mLaunchedAssistant; - private long mAssistantDragStartTime; - private float mAssistantDistance; - private float mAssistantTimeFraction; - private float mAssistantLastProgress; @Nullable private NavBarGestureAttemptCallback mGestureCallback; NavBarGestureHandler(Context context) { mContext = context; - final Display display = mContext.getDisplay(); DisplayController.Info displayInfo = DisplayController.INSTANCE.get(mContext).getInfo(); final int displayRotation = displayInfo.rotation; Point currentSize = displayInfo.currentSize; @@ -105,27 +72,6 @@ public class NavBarGestureHandler implements OnTouchListener, final Resources resources = context.getResources(); mBottomGestureHeight = ResourceUtils.getNavbarSize(ResourceUtils.NAVBAR_BOTTOM_GESTURE_SIZE, resources); - mAssistantDragDistThreshold = - resources.getDimension(R.dimen.gestures_assistant_drag_threshold); - mAssistantFlingDistThreshold = - resources.getDimension(R.dimen.gestures_assistant_fling_threshold); - mAssistantTimeThreshold = - resources.getInteger(R.integer.assistant_gesture_min_time_threshold); - mAssistantAngleThreshold = - resources.getInteger(R.integer.assistant_gesture_corner_deg_threshold); - - mAssistantGestureDetector = new GestureDetector(context, new AssistantGestureListener()); - int assistantWidth = resources.getDimensionPixelSize(R.dimen.gestures_assistant_width); - final float assistantHeight = Math.max(mBottomGestureHeight, - QuickStepContract.getWindowCornerRadius(context)); - mAssistantLeftRegion.bottom = mAssistantRightRegion.bottom = mDisplaySize.y; - mAssistantLeftRegion.top = mAssistantRightRegion.top = mDisplaySize.y - assistantHeight; - mAssistantLeftRegion.left = 0; - mAssistantLeftRegion.right = assistantWidth; - mAssistantRightRegion.right = mDisplaySize.x; - mAssistantRightRegion.left = mDisplaySize.x - assistantWidth; - float slop = ViewConfiguration.get(context).getScaledTouchSlop(); - mAssistantSquaredSlop = slop * slop; } void registerNavBarGestureAttemptCallback(NavBarGestureAttemptCallback callback) { @@ -138,7 +84,7 @@ public class NavBarGestureHandler implements OnTouchListener, @Override public void onSwipeUp(boolean wasFling, PointF finalVelocity) { - if (mGestureCallback == null || mAssistantGestureActive) { + if (mGestureCallback == null) { return; } if (mTouchCameFromNavBar) { @@ -153,7 +99,7 @@ public class NavBarGestureHandler implements OnTouchListener, @Override public void onSwipeUpCancelled() { - if (mGestureCallback != null && !mAssistantGestureActive) { + if (mGestureCallback != null) { mGestureCallback.onNavBarGestureAttempted(HOME_OR_OVERVIEW_CANCELLED, new PointF()); } } @@ -166,52 +112,16 @@ public class NavBarGestureHandler implements OnTouchListener, case MotionEvent.ACTION_DOWN: mDownPos.set(event.getX(), event.getY()); mLastPos.set(mDownPos); - mTouchCameFromAssistantCorner = - mAssistantLeftRegion.contains(event.getX(), event.getY()) - || mAssistantRightRegion.contains(event.getX(), event.getY()); - mAssistantGestureActive = mTouchCameFromAssistantCorner; - mTouchCameFromNavBar = !mTouchCameFromAssistantCorner - && mDownPos.y >= mDisplaySize.y - mBottomGestureHeight; + mTouchCameFromNavBar = mDownPos.y >= mDisplaySize.y - mBottomGestureHeight; if (!mTouchCameFromNavBar && mGestureCallback != null) { mGestureCallback.setNavBarGestureProgress(null); } - mLaunchedAssistant = false; mSwipeUpTouchTracker.init(); mMotionPauseDetector.clear(); mMotionPauseDetector.setOnMotionPauseListener(this); break; case MotionEvent.ACTION_MOVE: mLastPos.set(event.getX(), event.getY()); - if (!mAssistantGestureActive) { - break; - } - - if (!mPassedAssistantSlop) { - // Normal gesture, ensure we pass the slop before we start tracking the gesture - if (squaredHypot(mLastPos.x - mDownPos.x, mLastPos.y - mDownPos.y) - > mAssistantSquaredSlop) { - - mPassedAssistantSlop = true; - mAssistantStartDragPos.set(mLastPos.x, mLastPos.y); - mAssistantDragStartTime = SystemClock.uptimeMillis(); - - mAssistantGestureActive = isValidAssistantGestureAngle( - mDownPos.x - mLastPos.x, mDownPos.y - mLastPos.y); - if (!mAssistantGestureActive && mGestureCallback != null) { - mGestureCallback.onNavBarGestureAttempted( - ASSISTANT_NOT_STARTED_BAD_ANGLE, new PointF()); - } - } - } else { - // Movement - mAssistantDistance = (float) Math.hypot(mLastPos.x - mAssistantStartDragPos.x, - mLastPos.y - mAssistantStartDragPos.y); - if (mAssistantDistance >= 0) { - final long diff = SystemClock.uptimeMillis() - mAssistantDragStartTime; - mAssistantTimeFraction = Math.min(diff * 1f / mAssistantTimeThreshold, 1); - updateAssistantProgress(); - } - } break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: @@ -222,35 +132,19 @@ public class NavBarGestureHandler implements OnTouchListener, intercepted = true; break; } - if (mAssistantGestureActive && !mLaunchedAssistant && mGestureCallback != null) { - mGestureCallback.onNavBarGestureAttempted( - ASSISTANT_NOT_STARTED_SWIPE_TOO_SHORT, new PointF()); - ValueAnimator animator = ValueAnimator.ofFloat(mAssistantLastProgress, 0) - .setDuration(RETRACT_GESTURE_ANIMATION_DURATION_MS); - animator.addUpdateListener(valueAnimator -> { - float progress = (float) valueAnimator.getAnimatedValue(); - mGestureCallback.setAssistantProgress(progress); - }); - animator.setInterpolator(Interpolators.DEACCEL_2); - animator.start(); - } - mPassedAssistantSlop = false; break; } if (mTouchCameFromNavBar && mGestureCallback != null) { mGestureCallback.setNavBarGestureProgress(event.getY() - mDownPos.y); } mSwipeUpTouchTracker.onMotionEvent(event); - mAssistantGestureDetector.onTouchEvent(event); mMotionPauseDetector.addPosition(event); mMotionPauseDetector.setDisallowPause(mLastPos.y >= mDisplaySize.y - mBottomGestureHeight); return intercepted; } boolean onInterceptTouch(MotionEvent event) { - return mAssistantLeftRegion.contains(event.getX(), event.getY()) - || mAssistantRightRegion.contains(event.getX(), event.getY()) - || event.getY() >= mDisplaySize.y - mBottomGestureHeight; + return event.getY() >= mDisplaySize.y - mBottomGestureHeight; } @Override @@ -263,39 +157,6 @@ public class NavBarGestureHandler implements OnTouchListener, VibratorWrapper.INSTANCE.get(mContext).vibrate(OVERVIEW_HAPTIC); } - /** - * Determine if angle is larger than threshold for assistant detection - */ - private boolean isValidAssistantGestureAngle(float deltaX, float deltaY) { - float angle = (float) Math.toDegrees(Math.atan2(deltaY, deltaX)); - - // normalize so that angle is measured clockwise from horizontal in the bottom right corner - // and counterclockwise from horizontal in the bottom left corner - angle = angle > 90 ? 180 - angle : angle; - return (angle > mAssistantAngleThreshold && angle < 90); - } - - private void updateAssistantProgress() { - if (!mLaunchedAssistant) { - mAssistantLastProgress = - Math.min(mAssistantDistance * 1f / mAssistantDragDistThreshold, 1) - * mAssistantTimeFraction; - if (mAssistantDistance >= mAssistantDragDistThreshold && mAssistantTimeFraction >= 1) { - startAssistant(new PointF()); - } else if (mGestureCallback != null) { - mGestureCallback.setAssistantProgress(mAssistantLastProgress); - } - } - } - - private void startAssistant(PointF velocity) { - if (mGestureCallback != null) { - mGestureCallback.onNavBarGestureAttempted(ASSISTANT_COMPLETED, velocity); - } - VibratorWrapper.INSTANCE.get(mContext).vibrate(VibratorWrapper.EFFECT_CLICK); - mLaunchedAssistant = true; - } - enum NavBarGestureResult { UNKNOWN, HOME_GESTURE_COMPLETED, @@ -304,9 +165,6 @@ public class NavBarGestureHandler implements OnTouchListener, OVERVIEW_NOT_STARTED_TOO_FAR_FROM_EDGE, HOME_OR_OVERVIEW_NOT_STARTED_WRONG_SWIPE_DIRECTION, // Side swipe on nav bar. HOME_OR_OVERVIEW_CANCELLED, - ASSISTANT_COMPLETED, - ASSISTANT_NOT_STARTED_BAD_ANGLE, - ASSISTANT_NOT_STARTED_SWIPE_TOO_SHORT, } /** Callback to let the UI react to attempted nav bar gestures. */ @@ -319,27 +177,5 @@ public class NavBarGestureHandler implements OnTouchListener, /** Indicates how far a touch originating in the nav bar has moved from the nav bar. */ default void setNavBarGestureProgress(@Nullable Float displacement) {} - - /** Indicates the progress of an Assistant gesture. */ - default void setAssistantProgress(float progress) {} - } - - private class AssistantGestureListener extends GestureDetector.SimpleOnGestureListener { - @Override - public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { - if (!mLaunchedAssistant && mTouchCameFromAssistantCorner) { - PointF velocity = new PointF(velocityX, velocityY); - if (!isValidAssistantGestureAngle(velocityX, -velocityY)) { - if (mGestureCallback != null) { - mGestureCallback.onNavBarGestureAttempted(ASSISTANT_NOT_STARTED_BAD_ANGLE, - velocity); - } - } else if (mAssistantDistance >= mAssistantFlingDistThreshold) { - mAssistantLastProgress = 1; - startAssistant(velocity); - } - } - return true; - } } } diff --git a/quickstep/src/com/android/quickstep/interaction/OverviewGestureTutorialController.java b/quickstep/src/com/android/quickstep/interaction/OverviewGestureTutorialController.java index 160e431b13..dfbcf4d14a 100644 --- a/quickstep/src/com/android/quickstep/interaction/OverviewGestureTutorialController.java +++ b/quickstep/src/com/android/quickstep/interaction/OverviewGestureTutorialController.java @@ -111,6 +111,7 @@ final class OverviewGestureTutorialController extends SwipeUpGestureTutorialCont case BACK_COMPLETED_FROM_RIGHT: case BACK_CANCELLED_FROM_LEFT: case BACK_CANCELLED_FROM_RIGHT: + case BACK_NOT_STARTED_TOO_FAR_FROM_EDGE: showFeedback(R.string.overview_gesture_feedback_swipe_too_far_from_edge); break; } diff --git a/quickstep/src/com/android/quickstep/interaction/SandboxModeTutorialController.java b/quickstep/src/com/android/quickstep/interaction/SandboxModeTutorialController.java index 19b7933e24..f0bd4f903d 100644 --- a/quickstep/src/com/android/quickstep/interaction/SandboxModeTutorialController.java +++ b/quickstep/src/com/android/quickstep/interaction/SandboxModeTutorialController.java @@ -49,10 +49,6 @@ public class SandboxModeTutorialController extends SwipeUpGestureTutorialControl @Override public void onNavBarGestureAttempted(NavBarGestureResult result, PointF finalVelocity) { switch (result) { - case ASSISTANT_COMPLETED: - showRippleEffect(null); - showFeedback(R.string.sandbox_mode_assistant_gesture_feedback_successful); - break; case HOME_GESTURE_COMPLETED: animateFakeTaskViewHome(finalVelocity, () -> { showFeedback(R.string.sandbox_mode_home_gesture_feedback_successful); diff --git a/quickstep/src/com/android/quickstep/interaction/TutorialFragment.java b/quickstep/src/com/android/quickstep/interaction/TutorialFragment.java index 3faa7e477a..25de6051e0 100644 --- a/quickstep/src/com/android/quickstep/interaction/TutorialFragment.java +++ b/quickstep/src/com/android/quickstep/interaction/TutorialFragment.java @@ -117,9 +117,6 @@ abstract class TutorialFragment extends GestureSandboxFragment implements OnTouc case OVERVIEW_NAVIGATION: case OVERVIEW_NAVIGATION_COMPLETE: return new OverviewGestureTutorialFragment(fromTutorialMenu); - case ASSISTANT: - case ASSISTANT_COMPLETE: - return new AssistantGestureTutorialFragment(fromTutorialMenu); case SANDBOX_MODE: return new SandboxModeTutorialFragment(fromTutorialMenu); default: diff --git a/quickstep/src/com/android/quickstep/util/BaseDepthController.java b/quickstep/src/com/android/quickstep/util/BaseDepthController.java index b5c582a3e0..23cfb39ec2 100644 --- a/quickstep/src/com/android/quickstep/util/BaseDepthController.java +++ b/quickstep/src/com/android/quickstep/util/BaseDepthController.java @@ -75,7 +75,7 @@ public class BaseDepthController { // marking the launcher surface as opaque. Only used in certain Launcher states. private boolean mHasContentBehindLauncher; - /** Pause applying depth and blur, can be used when something behind the Launcher. */ + /** Pause blur but allow transparent, can be used when launch something behind the Launcher. */ protected boolean mPauseBlurs; /** @@ -132,7 +132,7 @@ public class BaseDepthController { return; } boolean hasOpaqueBg = mLauncher.getScrimView().isFullyOpaque(); - boolean isSurfaceOpaque = mPauseBlurs || (!mHasContentBehindLauncher && hasOpaqueBg); + boolean isSurfaceOpaque = !mHasContentBehindLauncher && hasOpaqueBg && !mPauseBlurs; mCurrentBlur = !mCrossWindowBlursEnabled || hasOpaqueBg || mPauseBlurs ? 0 : (int) (depth * mMaxBlurRadius); diff --git a/quickstep/src/com/android/quickstep/util/BaseUnfoldMoveFromCenterAnimator.java b/quickstep/src/com/android/quickstep/util/BaseUnfoldMoveFromCenterAnimator.java index ad11b7e953..328a7270eb 100644 --- a/quickstep/src/com/android/quickstep/util/BaseUnfoldMoveFromCenterAnimator.java +++ b/quickstep/src/com/android/quickstep/util/BaseUnfoldMoveFromCenterAnimator.java @@ -43,6 +43,10 @@ public abstract class BaseUnfoldMoveFromCenterAnimator implements TransitionProg new UnfoldMoveFromCenterRotationListener(); private boolean mAnimationInProgress = false; + // Save the last transition progress so we can re-apply it in case we re-register the view for + // the animation (by calling onPrepareViewsForAnimation) + private Float mLastTransitionProgress = null; + public BaseUnfoldMoveFromCenterAnimator(WindowManager windowManager, RotationChangeProvider rotationChangeProvider) { mMoveFromCenterAnimation = new UnfoldMoveFromCenterAnimator(windowManager, @@ -63,11 +67,13 @@ public abstract class BaseUnfoldMoveFromCenterAnimator implements TransitionProg @Override public void onTransitionProgress(float progress) { mMoveFromCenterAnimation.onTransitionProgress(progress); + mLastTransitionProgress = progress; } @CallSuper @Override public void onTransitionFinished() { + mLastTransitionProgress = null; mAnimationInProgress = false; mRotationChangeProvider.removeCallback(mRotationListener); mMoveFromCenterAnimation.onTransitionFinished(); @@ -93,8 +99,11 @@ public abstract class BaseUnfoldMoveFromCenterAnimator implements TransitionProg mOriginalClipToPadding.clear(); } + @CallSuper protected void onPrepareViewsForAnimation() { - + if (mLastTransitionProgress != null) { + mMoveFromCenterAnimation.onTransitionProgress(mLastTransitionProgress); + } } protected void registerViewForAnimation(View view) { diff --git a/quickstep/src/com/android/quickstep/util/LauncherUnfoldAnimationController.java b/quickstep/src/com/android/quickstep/util/LauncherUnfoldAnimationController.java index 8fdafc6059..6d15e8be98 100644 --- a/quickstep/src/com/android/quickstep/util/LauncherUnfoldAnimationController.java +++ b/quickstep/src/com/android/quickstep/util/LauncherUnfoldAnimationController.java @@ -27,10 +27,15 @@ import android.view.WindowManager; import androidx.core.view.OneShotPreDrawListener; +import com.android.launcher3.DeviceProfile; +import com.android.launcher3.DeviceProfile.OnDeviceProfileChangeListener; import com.android.launcher3.Hotseat; import com.android.launcher3.Launcher; import com.android.launcher3.Workspace; +import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.util.HorizontalInsettableView; +import com.android.quickstep.SystemUiProxy; +import com.android.quickstep.util.unfold.PreemptiveUnfoldTransitionProgressProvider; import com.android.systemui.unfold.UnfoldTransitionProgressProvider; import com.android.systemui.unfold.UnfoldTransitionProgressProvider.TransitionProgressListener; import com.android.systemui.unfold.updates.RotationChangeProvider; @@ -40,7 +45,7 @@ import com.android.systemui.unfold.util.ScopedUnfoldTransitionProgressProvider; /** * Controls animations that are happening during unfolding foldable devices */ -public class LauncherUnfoldAnimationController { +public class LauncherUnfoldAnimationController implements OnDeviceProfileChangeListener { // Percentage of the width of the quick search bar that will be reduced // from the both sides of the bar when progress is 0 @@ -55,9 +60,11 @@ public class LauncherUnfoldAnimationController { private final NaturalRotationUnfoldProgressProvider mNaturalOrientationProgressProvider; private final UnfoldMoveFromCenterHotseatAnimator mUnfoldMoveFromCenterHotseatAnimator; private final UnfoldMoveFromCenterWorkspaceAnimator mUnfoldMoveFromCenterWorkspaceAnimator; + private PreemptiveUnfoldTransitionProgressProvider mPreemptiveProgressProvider = null; + private Boolean mIsTablet = null; private static final String TRACE_WAIT_TO_HANDLE_UNFOLD_TRANSITION = - "waitingOneFrameBeforeHandlingUnfoldAnimation"; + "LauncherUnfoldAnimationController#waitingForTheNextFrame"; @Nullable private HorizontalInsettableView mQsbInsettable; @@ -68,8 +75,19 @@ public class LauncherUnfoldAnimationController { UnfoldTransitionProgressProvider unfoldTransitionProgressProvider, RotationChangeProvider rotationChangeProvider) { mLauncher = launcher; - mProgressProvider = new ScopedUnfoldTransitionProgressProvider( - unfoldTransitionProgressProvider); + + if (FeatureFlags.PREEMPTIVE_UNFOLD_ANIMATION_START.get()) { + mPreemptiveProgressProvider = new PreemptiveUnfoldTransitionProgressProvider( + unfoldTransitionProgressProvider, launcher.getMainThreadHandler()); + mPreemptiveProgressProvider.init(); + + mProgressProvider = new ScopedUnfoldTransitionProgressProvider( + mPreemptiveProgressProvider); + } else { + mProgressProvider = new ScopedUnfoldTransitionProgressProvider( + unfoldTransitionProgressProvider); + } + mUnfoldMoveFromCenterHotseatAnimator = new UnfoldMoveFromCenterHotseatAnimator(launcher, windowManager, rotationChangeProvider); mUnfoldMoveFromCenterWorkspaceAnimator = new UnfoldMoveFromCenterWorkspaceAnimator(launcher, @@ -85,6 +103,8 @@ public class LauncherUnfoldAnimationController { // Animated only in natural orientation mNaturalOrientationProgressProvider.addCallback(new QsbAnimationListener()); mNaturalOrientationProgressProvider.addCallback(mUnfoldMoveFromCenterHotseatAnimator); + + mLauncher.addOnDeviceProfileChangeListener(this); } /** @@ -96,17 +116,21 @@ public class LauncherUnfoldAnimationController { mQsbInsettable = (HorizontalInsettableView) hotseat.getQsb(); } - handleTransitionOnNextFrame(); + mProgressProvider.setReadyToHandleTransition(true); } - private void handleTransitionOnNextFrame() { + private void preemptivelyStartAnimationOnNextFrame() { Trace.asyncTraceBegin(Trace.TRACE_TAG_APP, TRACE_WAIT_TO_HANDLE_UNFOLD_TRANSITION, /* cookie= */ 0); + + // Start the animation (and apply the transformations) in pre-draw listener to make sure + // that the views are laid out as some transformations depend on the view sizes and position OneShotPreDrawListener.add(mLauncher.getWorkspace(), () -> { Trace.asyncTraceEnd(Trace.TRACE_TAG_APP, TRACE_WAIT_TO_HANDLE_UNFOLD_TRANSITION, /* cookie= */ 0); - mProgressProvider.setReadyToHandleTransition(true); + mPreemptiveProgressProvider.preemptivelyStartTransition( + /* initialProgress= */ 0f); }); } @@ -124,14 +148,34 @@ public class LauncherUnfoldAnimationController { public void onDestroy() { mProgressProvider.destroy(); mNaturalOrientationProgressProvider.destroy(); + mLauncher.removeOnDeviceProfileChangeListener(this); } - /** Called when launcher finished binding its items. */ + /** + * Called when launcher has finished binding its items + */ public void updateRegisteredViewsIfNeeded() { mUnfoldMoveFromCenterHotseatAnimator.updateRegisteredViewsIfNeeded(); mUnfoldMoveFromCenterWorkspaceAnimator.updateRegisteredViewsIfNeeded(); } + @Override + public void onDeviceProfileChanged(DeviceProfile dp) { + if (!FeatureFlags.PREEMPTIVE_UNFOLD_ANIMATION_START.get()) { + return; + } + + if (mIsTablet != null && dp.isTablet != mIsTablet) { + if (dp.isTablet && SystemUiProxy.INSTANCE.get(mLauncher).isActive()) { + // Preemptively start the unfold animation to make sure that we have drawn + // the first frame of the animation before the screen gets unblocked + preemptivelyStartAnimationOnNextFrame(); + } + } + + mIsTablet = dp.isTablet; + } + private class QsbAnimationListener implements TransitionProgressListener { @Override diff --git a/quickstep/src/com/android/quickstep/util/UnfoldMoveFromCenterHotseatAnimator.java b/quickstep/src/com/android/quickstep/util/UnfoldMoveFromCenterHotseatAnimator.java index 70a12d6435..c8141b4642 100644 --- a/quickstep/src/com/android/quickstep/util/UnfoldMoveFromCenterHotseatAnimator.java +++ b/quickstep/src/com/android/quickstep/util/UnfoldMoveFromCenterHotseatAnimator.java @@ -48,6 +48,8 @@ public class UnfoldMoveFromCenterHotseatAnimator extends BaseUnfoldMoveFromCente View child = hotseatIcons.getChildAt(i); registerViewForAnimation(child); } + + super.onPrepareViewsForAnimation(); } @Override diff --git a/quickstep/src/com/android/quickstep/util/UnfoldMoveFromCenterWorkspaceAnimator.java b/quickstep/src/com/android/quickstep/util/UnfoldMoveFromCenterWorkspaceAnimator.java index 7da103ee58..c05b38f5f2 100644 --- a/quickstep/src/com/android/quickstep/util/UnfoldMoveFromCenterWorkspaceAnimator.java +++ b/quickstep/src/com/android/quickstep/util/UnfoldMoveFromCenterWorkspaceAnimator.java @@ -58,6 +58,8 @@ public class UnfoldMoveFromCenterWorkspaceAnimator extends BaseUnfoldMoveFromCen setClipChildren(workspace, false); setClipToPadding(workspace, true); + + super.onPrepareViewsForAnimation(); } @Override diff --git a/quickstep/src/com/android/quickstep/util/unfold/PreemptiveUnfoldTransitionProgressProvider.kt b/quickstep/src/com/android/quickstep/util/unfold/PreemptiveUnfoldTransitionProgressProvider.kt new file mode 100644 index 0000000000..a9cd0484fd --- /dev/null +++ b/quickstep/src/com/android/quickstep/util/unfold/PreemptiveUnfoldTransitionProgressProvider.kt @@ -0,0 +1,161 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.quickstep.util.unfold + +import android.os.Handler +import android.os.Trace +import android.util.Log +import com.android.systemui.unfold.UnfoldTransitionProgressProvider +import com.android.systemui.unfold.UnfoldTransitionProgressProvider.TransitionProgressListener + +/** + * Transition progress provider wrapper that can preemptively start the transition on demand + * without relying on the source provider. When the source provider has started the animation + * it switches to it. + * + * This might be useful when we want to synchronously start the unfold animation and render + * the first frame during turning on the screen. For example, this is used in Launcher where + * we need to render the first frame of the animation immediately after receiving a configuration + * change event so Window Manager will wait for this frame to be rendered before unblocking + * the screen. We can't rely on the original transition progress as it starts the animation + * after the screen fully turned on (and unblocked), at this moment it is already too late to + * start the animation. + * + * Using this provider we could render the first frame preemptively by sending 'transition started' + * and '0' transition progress before the original progress provider sends these events. + */ +class PreemptiveUnfoldTransitionProgressProvider( + private val source: UnfoldTransitionProgressProvider, + private val handler: Handler +) : UnfoldTransitionProgressProvider, TransitionProgressListener { + + private val timeoutRunnable = Runnable { + if (isRunning) { + listeners.forEach { it.onTransitionFinished() } + onPreemptiveStartFinished() + Log.wtf(TAG, "Timeout occurred when waiting for the source transition to start") + } + } + + private val listeners = arrayListOf<TransitionProgressListener>() + private var isPreemptivelyRunning = false + private var isSourceRunning = false + + private val isRunning: Boolean + get() = isPreemptivelyRunning || isSourceRunning + + private val sourceListener = + object : TransitionProgressListener { + override fun onTransitionStarted() { + handler.removeCallbacks(timeoutRunnable) + + if (!isRunning) { + listeners.forEach { it.onTransitionStarted() } + } + + onPreemptiveStartFinished() + isSourceRunning = true + } + + override fun onTransitionProgress(progress: Float) { + if (isRunning) { + listeners.forEach { it.onTransitionProgress(progress) } + isSourceRunning = true + } + } + + override fun onTransitionFinishing() { + if (isRunning) { + listeners.forEach { it.onTransitionFinishing() } + isSourceRunning = true + } + } + + override fun onTransitionFinished() { + if (isRunning) { + listeners.forEach { it.onTransitionFinished() } + } + + isSourceRunning = false + onPreemptiveStartFinished() + handler.removeCallbacks(timeoutRunnable) + } + } + + fun init() { + source.addCallback(sourceListener) + } + + /** + * Starts the animation preemptively. + * + * - If the source provider is already running, this method won't change any behavior + * - If the source provider has not started running yet, it will call onTransitionStarted + * for all listeners and optionally onTransitionProgress(initialProgress) if supplied. + * When the source provider starts the animation it will switch to send progress and finished + * events from it. + * If the source provider won't start the animation within a timeout, the animation will be + * cancelled and onTransitionFinished will be delivered to the current listeners. + */ + @JvmOverloads + fun preemptivelyStartTransition(initialProgress: Float? = null) { + if (!isRunning) { + Trace.beginAsyncSection("$TAG#startedPreemptively", 0) + + listeners.forEach { it.onTransitionStarted() } + initialProgress?.let { progress -> + listeners.forEach { it.onTransitionProgress(progress) } + } + + handler.removeCallbacks(timeoutRunnable) + handler.postDelayed(timeoutRunnable, PREEMPTIVE_UNFOLD_TIMEOUT_MS) + } + + isPreemptivelyRunning = true + } + + fun cancelPreemptiveStart() { + handler.removeCallbacks(timeoutRunnable) + if (isRunning) { + listeners.forEach { it.onTransitionFinished() } + } + onPreemptiveStartFinished() + } + + private fun onPreemptiveStartFinished() { + if (isPreemptivelyRunning) { + Trace.endAsyncSection("$TAG#startedPreemptively", 0) + isPreemptivelyRunning = false + } + } + + override fun destroy() { + handler.removeCallbacks(timeoutRunnable) + source.removeCallback(sourceListener) + source.destroy() + } + + override fun addCallback(listener: TransitionProgressListener) { + listeners += listener + } + + override fun removeCallback(listener: TransitionProgressListener) { + listeners -= listener + } +} + +const val TAG = "PreemptiveUnfoldTransitionProgressProvider" +const val PREEMPTIVE_UNFOLD_TIMEOUT_MS = 1700L diff --git a/quickstep/tests/src/com/android/quickstep/TaplTestsSplitscreen.java b/quickstep/tests/src/com/android/quickstep/TaplTestsSplitscreen.java index 2ae512a1f4..e8cadabe72 100644 --- a/quickstep/tests/src/com/android/quickstep/TaplTestsSplitscreen.java +++ b/quickstep/tests/src/com/android/quickstep/TaplTestsSplitscreen.java @@ -23,7 +23,6 @@ import android.content.Intent; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.ui.TaplTestsLauncher3; -import com.android.launcher3.util.rule.TestStabilityRule; import com.android.quickstep.TaskbarModeSwitchRule.TaskbarModeSwitch; import org.junit.After; @@ -61,10 +60,6 @@ public class TaplTestsSplitscreen extends AbstractQuickStepTest { } @Test - // TODO (b/270201357): When this test is proven stable, remove this TestStabilityRule and - // introduce into presubmit as well. - @TestStabilityRule.Stability( - flavors = TestStabilityRule.LOCAL | TestStabilityRule.PLATFORM_POSTSUBMIT) @PortraitLandscape @TaskbarModeSwitch public void testSplitAppFromHomeWithItself() throws Exception { diff --git a/quickstep/tests/src/com/android/quickstep/TaplTestsTaskbar.java b/quickstep/tests/src/com/android/quickstep/TaplTestsTaskbar.java index 4540eee936..f5c78f6278 100644 --- a/quickstep/tests/src/com/android/quickstep/TaplTestsTaskbar.java +++ b/quickstep/tests/src/com/android/quickstep/TaplTestsTaskbar.java @@ -17,6 +17,7 @@ package com.android.quickstep; import static androidx.test.InstrumentationRegistry.getInstrumentation; +import static com.android.launcher3.config.FeatureFlags.ENABLE_CURSOR_HOVER_STATES; import static com.android.quickstep.TaskbarModeSwitchRule.Mode.PERSISTENT; import static com.android.quickstep.TaskbarModeSwitchRule.Mode.TRANSIENT; @@ -27,7 +28,6 @@ import android.content.Intent; import androidx.test.filters.LargeTest; import androidx.test.runner.AndroidJUnit4; -import com.android.launcher3.tapl.Overview; import com.android.launcher3.tapl.Taskbar; import com.android.launcher3.ui.TaplTestsLauncher3; import com.android.launcher3.util.LauncherLayoutBuilder; @@ -64,10 +64,6 @@ public class TaplTestsTaskbar extends AbstractQuickStepTest { "com.android.launcher3.testcomponent.BaseTestingActivity"); mLauncherLayout = TestUtil.setLauncherDefaultLayout(mTargetContext, layoutBuilder); TaplTestsLauncher3.initialize(this); - Overview overview = mLauncher.getWorkspace().switchToOverview(); - if (overview.hasTasks()) { - overview.dismissAllTasks(); - } startAppFast(CALCULATOR_APP_PACKAGE); mLauncher.enableBlockTimeout(true); @@ -269,6 +265,39 @@ public class TaplTestsTaskbar extends AbstractQuickStepTest { .dragToSplitscreen(TEST_APP_PACKAGE, CALCULATOR_APP_PACKAGE); } + @Test + @TaskbarModeSwitch(mode = TRANSIENT) + public void testShowTaskbarUnstashHintOnHover() { + try (AutoCloseable flag = TestUtil.overrideFlag(ENABLE_CURSOR_HOVER_STATES, true)) { + getTaskbar().getAppIcon(TEST_APP_NAME).launch(TEST_APP_PACKAGE); + mLauncher.getLaunchedAppState().hoverToShowTaskbarUnstashHint(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Test + @TaskbarModeSwitch(mode = TRANSIENT) + public void testUnstashTaskbarOnScreenBottomEdgeHover() { + try (AutoCloseable flag = TestUtil.overrideFlag(ENABLE_CURSOR_HOVER_STATES, true)) { + getTaskbar().getAppIcon(TEST_APP_NAME).launch(TEST_APP_PACKAGE); + mLauncher.getLaunchedAppState().hoverScreenBottomEdgeToUnstashTaskbar(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Test + @TaskbarModeSwitch(mode = TRANSIENT) + public void testHoverBelowHintedTaskbarToUnstash() { + try (AutoCloseable flag = TestUtil.overrideFlag(ENABLE_CURSOR_HOVER_STATES, true)) { + getTaskbar().getAppIcon(TEST_APP_NAME).launch(TEST_APP_PACKAGE); + mLauncher.getLaunchedAppState().hoverBelowHintedTaskbarToUnstash(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + private Taskbar getTaskbar() { Taskbar taskbar = mLauncher.getLaunchedAppState().getTaskbar(); List<String> taskbarIconNames = taskbar.getIconNames(); diff --git a/quickstep/tests/src/com/android/quickstep/util/unfold/PreemptiveUnfoldTransitionProgressProviderTest.kt b/quickstep/tests/src/com/android/quickstep/util/unfold/PreemptiveUnfoldTransitionProgressProviderTest.kt new file mode 100644 index 0000000000..f73be7269d --- /dev/null +++ b/quickstep/tests/src/com/android/quickstep/util/unfold/PreemptiveUnfoldTransitionProgressProviderTest.kt @@ -0,0 +1,261 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.quickstep.util.unfold + +import android.os.Handler +import android.testing.AndroidTestingRunner +import android.testing.TestableLooper +import android.testing.TestableLooper.RunWithLooper +import android.util.Log +import androidx.test.filters.SmallTest +import com.android.launcher3.util.any +import com.android.launcher3.util.mock +import com.android.systemui.unfold.UnfoldTransitionProgressProvider +import com.android.systemui.unfold.UnfoldTransitionProgressProvider.TransitionProgressListener +import org.junit.After +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mockito.anyBoolean +import org.mockito.Mockito.anyFloat +import org.mockito.Mockito.inOrder +import org.mockito.Mockito.never +import org.mockito.Mockito.verify + +@SmallTest +@RunWith(AndroidTestingRunner::class) +@RunWithLooper +class PreemptiveUnfoldTransitionProgressProviderTest { + + private lateinit var testableLooper: TestableLooper + private lateinit var source: TransitionProgressListener + private lateinit var handler: Handler + private lateinit var oldWtfHandler: Log.TerribleFailureHandler + private val listener: TransitionProgressListener = mock() + private val testWtfHandler: Log.TerribleFailureHandler = mock() + + private lateinit var provider: PreemptiveUnfoldTransitionProgressProvider + + @Before + fun before() { + testableLooper = TestableLooper.get(this) + handler = Handler(testableLooper.looper) + + val testSource = createSource() + source = testSource as TransitionProgressListener + + oldWtfHandler = Log.setWtfHandler(testWtfHandler) + + provider = PreemptiveUnfoldTransitionProgressProvider(testSource, handler) + provider.init() + provider.addCallback(listener) + } + + @After + fun after() { + Log.setWtfHandler(oldWtfHandler) + } + + @Test + fun preemptiveStartInitialProgressNull_transitionStarts() { + provider.preemptivelyStartTransition(initialProgress = null) + + verify(listener).onTransitionStarted() + verify(listener, never()).onTransitionProgress(anyFloat()) + } + + @Test + fun preemptiveStartWithInitialProgress_startsAnimationAndSendsProgress() { + provider.preemptivelyStartTransition(initialProgress = 0.5f) + + verify(listener).onTransitionStarted() + verify(listener).onTransitionProgress(0.5f) + } + + @Test + fun preemptiveStartAndCancel_finishesAnimation() { + provider.preemptivelyStartTransition() + provider.cancelPreemptiveStart() + + with(inOrder(listener)) { + verify(listener).onTransitionStarted() + verify(listener).onTransitionFinished() + } + } + + @Test + fun preemptiveStartAndThenSourceStartsTransition_transitionStarts() { + provider.preemptivelyStartTransition() + source.onTransitionStarted() + + verify(listener).onTransitionStarted() + } + + @Test + fun preemptiveStartAndThenSourceStartsAndFinishesTransition_transitionFinishes() { + provider.preemptivelyStartTransition() + + source.onTransitionStarted() + source.onTransitionFinished() + + with(inOrder(listener)) { + verify(listener).onTransitionStarted() + verify(listener).onTransitionFinished() + } + } + + @Test + fun preemptiveStartAndThenSourceStartsAnimationAndSendsProgress_sendsProgress() { + provider.preemptivelyStartTransition() + + source.onTransitionStarted() + source.onTransitionProgress(0.4f) + + verify(listener).onTransitionProgress(0.4f) + } + + @Test + fun preemptiveStartAndThenSourceSendsProgress_sendsProgress() { + provider.preemptivelyStartTransition() + + source.onTransitionProgress(0.4f) + + verify(listener).onTransitionProgress(0.4f) + } + + @Test + fun preemptiveStartAfterTransitionRunning_transitionStarted() { + source.onTransitionStarted() + + provider.preemptivelyStartTransition() + + verify(listener).onTransitionStarted() + } + + @Test + fun preemptiveStartAfterTransitionRunningAndThenFinished_transitionFinishes() { + source.onTransitionStarted() + + provider.preemptivelyStartTransition() + source.onTransitionFinished() + + with(inOrder(listener)) { + verify(listener).onTransitionStarted() + verify(listener).onTransitionFinished() + } + } + + @Test + fun preemptiveStart_transitionDoesNotFinishAfterTimeout_finishesTransition() { + provider.preemptivelyStartTransition() + + testableLooper.moveTimeForward(PREEMPTIVE_UNFOLD_TIMEOUT_MS + 1) + testableLooper.processAllMessages() + + with(inOrder(listener)) { + verify(listener).onTransitionStarted() + verify(listener).onTransitionFinished() + } + } + + @Test + fun preemptiveStart_transitionFinishAfterTimeout_logsWtf() { + provider.preemptivelyStartTransition() + + testableLooper.moveTimeForward(PREEMPTIVE_UNFOLD_TIMEOUT_MS + 1) + testableLooper.processAllMessages() + + verify(testWtfHandler).onTerribleFailure(any(), any(), anyBoolean()) + } + + @Test + fun preemptiveStart_transitionDoesNotFinishBeforeTimeout_doesNotFinishTransition() { + provider.preemptivelyStartTransition() + + testableLooper.moveTimeForward(PREEMPTIVE_UNFOLD_TIMEOUT_MS - 1) + testableLooper.processAllMessages() + + verify(listener).onTransitionStarted() + } + + @Test + fun preemptiveStart_transitionStarted_timeoutHappened_doesNotFinishTransition() { + provider.preemptivelyStartTransition() + + source.onTransitionStarted() + testableLooper.moveTimeForward(PREEMPTIVE_UNFOLD_TIMEOUT_MS + 1) + testableLooper.processAllMessages() + + verify(listener).onTransitionStarted() + } + + @Test + fun noPreemptiveStart_transitionStarted_startsTransition() { + source.onTransitionStarted() + + verify(listener).onTransitionStarted() + } + + @Test + fun noPreemptiveStart_transitionProgress_sendsProgress() { + source.onTransitionStarted() + + source.onTransitionProgress(0.5f) + + verify(listener).onTransitionProgress(0.5f) + } + + @Test + fun noPreemptiveStart_transitionFinishes_finishesTransition() { + source.onTransitionStarted() + source.onTransitionProgress(0.5f) + + source.onTransitionFinished() + + with(inOrder(listener)) { + verify(listener).onTransitionStarted() + verify(listener).onTransitionFinished() + } + } + + private fun createSource(): UnfoldTransitionProgressProvider = + object : TransitionProgressListener, UnfoldTransitionProgressProvider { + + private val listeners = arrayListOf<TransitionProgressListener>() + + override fun addCallback(listener: TransitionProgressListener) { + listeners += listener + } + + override fun removeCallback(listener: TransitionProgressListener) { + listeners -= listener + } + + override fun destroy() {} + + override fun onTransitionStarted() = + listeners.forEach(TransitionProgressListener::onTransitionStarted) + + override fun onTransitionFinishing() = + listeners.forEach(TransitionProgressListener::onTransitionFinishing) + + override fun onTransitionFinished() = + listeners.forEach(TransitionProgressListener::onTransitionFinished) + + override fun onTransitionProgress(progress: Float) = + listeners.forEach { it.onTransitionProgress(progress) } + } +} diff --git a/res/color-night-v31/taskbar_divider_background.xml b/res/color-night-v31/taskbar_divider_background.xml new file mode 100644 index 0000000000..1981eecac1 --- /dev/null +++ b/res/color-night-v31/taskbar_divider_background.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2023 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:color="#797869" android:lStar="60" /> +</selector> diff --git a/res/color-v31/taskbar_divider_background.xml b/res/color-v31/taskbar_divider_background.xml new file mode 100644 index 0000000000..487e791cad --- /dev/null +++ b/res/color-v31/taskbar_divider_background.xml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2023 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:color="#797869" android:lStar="50" /> +</selector> diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml index 377025a49c..ceae5672ab 100644 --- a/res/values-af/strings.xml +++ b/res/values-af/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Persoonlik"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Werk"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Gesprekke"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Neem notas"</string> <string name="widget_education_header" msgid="4874760613775913787">"Nuttige inligting binne jou bereik"</string> <string name="widget_education_content" msgid="1731667670753497052">"Jy kan legstukke by jou tuisskerm voeg om inligting te kry sonder om programme oop te maak"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Tik om legstukinstellings te verander"</string> diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml index 3d0b3d59dc..57fafc8dc7 100644 --- a/res/values-am/strings.xml +++ b/res/values-am/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"የግል"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"ስራ"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"ውይይቶች"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"የማስታወሻ አያያዝ"</string> <string name="widget_education_header" msgid="4874760613775913787">"በጣቶችዎ ጫፎች ላይ ጠቃሚ መረጃ"</string> <string name="widget_education_content" msgid="1731667670753497052">"መተግበሪያዎችን ሳይከፍቱ መረጃ ለማግኘት በመነሻ ማያ ገጽዎ ላይ ምግብሮችን ማከል ይችላሉ"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"የምግብር ቅንብሮችን ለመለወጥ መታ ያድርጉ"</string> diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml index cca2e970e0..b2ad597265 100644 --- a/res/values-ar/strings.xml +++ b/res/values-ar/strings.xml @@ -50,6 +50,8 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"الأدوات الشخصية"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"أدوات العمل"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"المحادثات"</string> + <!-- no translation found for widget_category_note_taking (3469689394504266039) --> + <skip /> <string name="widget_education_header" msgid="4874760613775913787">"معلومات مفيدة في متناول يديك"</string> <string name="widget_education_content" msgid="1731667670753497052">"للحصول على معلومات بدون فتح التطبيقات، يمكنك إضافة التطبيقات المصغّرة إلى الشاشة الرئيسية."</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"انقر لتغيير إعدادات الأداة"</string> @@ -82,7 +84,7 @@ <string name="permlab_write_settings" msgid="4820028712156303762">"تعديل الإعدادات والاختصارات على الشاشة الرئيسية"</string> <string name="permdesc_write_settings" msgid="726859348127868466">"يسمح هذا الإذن للتطبيق بتغيير الإعدادات والاختصارات على الشاشة الرئيسية."</string> <string name="gadget_error_text" msgid="740356548025791839">"يتعذّر تحميل الأداة."</string> - <string name="gadget_setup_text" msgid="8348374825537681407">"إعدادات الأداة"</string> + <string name="gadget_setup_text" msgid="8348374825537681407">"إعدادات التطبيق المصغّر"</string> <string name="gadget_complete_setup_text" msgid="309040266978007925">"انقر لإكمال الإعداد."</string> <string name="uninstall_system_app_text" msgid="4172046090762920660">"هذا تطبيق نظام وتتعذر إزالته."</string> <string name="folder_hint_text" msgid="5174843001373488816">"تعديل الاسم"</string> diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml index 583a5c4bbd..587b377b95 100644 --- a/res/values-as/strings.xml +++ b/res/values-as/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"ব্যক্তিগত"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"কৰ্মস্থান"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"বাৰ্তালাপ"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"টোকা গ্ৰহণ কৰা"</string> <string name="widget_education_header" msgid="4874760613775913787">"আপোনাৰ আঙুলিৰে টিপতে উপযোগী তথ্য পাওক"</string> <string name="widget_education_content" msgid="1731667670753497052">"এপ্ নোখোলাকৈ তথ্য পাবলৈ আপুনি নিজৰ গৃহ স্ক্ৰীনত ৱিজেট যোগ দিব পাৰে"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"ৱিজেটৰ ছেটিং সলনি কৰিবলৈ টিপক"</string> diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml index c5ceac60fa..1e1b63448a 100644 --- a/res/values-az/strings.xml +++ b/res/values-az/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Şəxsi"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"İş"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Söhbətlər"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Qeydgötürmə"</string> <string name="widget_education_header" msgid="4874760613775913787">"Faydalı məlumatlar barmaqlarınızın ucunda"</string> <string name="widget_education_content" msgid="1731667670753497052">"Tətbiqləri açmadan məlumat almaq üçün Əsas ekrana vidcet əlavə edə bilərsiniz"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Vidcet ayarlarını dəyişmək üçün toxunun"</string> diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml index 4b7392b7b9..f6f9a442ce 100644 --- a/res/values-b+sr+Latn/strings.xml +++ b/res/values-b+sr+Latn/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Lično"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Posao"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Konverzacije"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Pravljenje beležaka"</string> <string name="widget_education_header" msgid="4874760613775913787">"Korisne informacije nadohvat ruke"</string> <string name="widget_education_content" msgid="1731667670753497052">"Da biste pronašli informacije bez otvaranja aplikacija, možete da dodate vidžete na početni ekran"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Dodirnite da biste promenili podešavanja vidžeta"</string> diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml index 2231f88642..1eee242194 100644 --- a/res/values-be/strings.xml +++ b/res/values-be/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Асабістыя"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Працоўныя"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Размовы"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Стварэнне нататак"</string> <string name="widget_education_header" msgid="4874760613775913787">"Карысная інфармацыя ў вас пад рукой"</string> <string name="widget_education_content" msgid="1731667670753497052">"Каб не адкрываць праграмы для прагляду патрэбнай інфармацыі, дадайце віджэты на галоўны экран"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Націсніце, каб змяніць налады віджэта"</string> diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml index 992abeb214..f59dcfbca4 100644 --- a/res/values-bg/strings.xml +++ b/res/values-bg/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Лични"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Служебни"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Разговори"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Водене на бележки"</string> <string name="widget_education_header" msgid="4874760613775913787">"Лесен достъп до полезна информация"</string> <string name="widget_education_content" msgid="1731667670753497052">"За да получавате информация, без да отваряте приложенията, можете да добавите приспособления към началния екран"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Докоснете, за да промените настройките на приспособлението"</string> diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml index a2ba82b4d0..326fc7b1c3 100644 --- a/res/values-bn/strings.xml +++ b/res/values-bn/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"ব্যক্তিগত"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"অফিস"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"কথোপকথন"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"নোট নেওয়া"</string> <string name="widget_education_header" msgid="4874760613775913787">"সহজেই দরকারি তথ্য পান"</string> <string name="widget_education_content" msgid="1731667670753497052">"অ্যাপ না খুলেই তথ্য পাওয়ার জন্য, হোম স্ক্রিনে উইজেট যোগ করতে পারবেন"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"উইজেট সেটিংস পরিবর্তন করতে ট্যাপ করুন"</string> @@ -159,7 +160,7 @@ <string name="all_apps_personal_tab" msgid="4190252696685155002">"ব্যক্তিগত"</string> <string name="all_apps_work_tab" msgid="4884822796154055118">"অফিস"</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_work_apps" msgid="7895468576497746520">"অফিস অ্যাপে ব্যাজ যোগ করা হয়েছে এবং আপনার আইটি অ্যাডমিন সেগুলি দেখতে পাবেন"</string> <string name="work_profile_edu_accept" msgid="6069788082535149071">"বুঝেছি"</string> <string name="work_apps_paused_title" msgid="3040901117349444598">"অফিস অ্যাপ বন্ধ করা আছে"</string> <string name="work_apps_paused_info_body" msgid="1687828929959237477">"আপনার অফিসের অ্যাপ থেকে আপনি কোনও বিজ্ঞপ্তি পাবেন না"</string> diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml index 20fc18a6cc..34b92fe053 100644 --- a/res/values-bs/strings.xml +++ b/res/values-bs/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Lično"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Posao"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Razgovori"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Pisanje bilješki"</string> <string name="widget_education_header" msgid="4874760613775913787">"Korisne informacije nadohvat ruke"</string> <string name="widget_education_content" msgid="1731667670753497052">"Da dobijete informacije bez otvaranja aplikacija, možete dodati vidžete na početni ekran"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Dodirnite da promijenite postavke vidžeta"</string> diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml index 885a55e943..9fe81dd6a6 100644 --- a/res/values-ca/strings.xml +++ b/res/values-ca/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Personal"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Treball"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Converses"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Presa de notes"</string> <string name="widget_education_header" msgid="4874760613775913787">"Informació útil a l\'abast de la mà"</string> <string name="widget_education_content" msgid="1731667670753497052">"Per obtenir informació sense obrir les aplicacions, pots afegir widgets a la pantalla d\'inici"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Toca per canviar la configuració del widget"</string> diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml index 25f7f0f0b8..6e19e15858 100644 --- a/res/values-cs/strings.xml +++ b/res/values-cs/strings.xml @@ -50,6 +50,8 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Osobní"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Práce"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Konverzace"</string> + <!-- no translation found for widget_category_note_taking (3469689394504266039) --> + <skip /> <string name="widget_education_header" msgid="4874760613775913787">"Užitečné informace na dosah"</string> <string name="widget_education_content" msgid="1731667670753497052">"Pokud chcete mít informace k dispozici bez otevírání aplikací, můžete si na plochu přidat widgety"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Klepnutím změníte nastavení widgetu"</string> diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml index 40fb99e994..2ccdded4c1 100644 --- a/res/values-da/strings.xml +++ b/res/values-da/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Personlige"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Arbejde"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Samtaler"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Notetagning"</string> <string name="widget_education_header" msgid="4874760613775913787">"Nyttige oplysninger lige ved hånden"</string> <string name="widget_education_content" msgid="1731667670753497052">"Hvis du vil have oplysninger uden at åbne apps, kan du føje widgets til din startskærm"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Tryk for at ændre widgetindstillinger"</string> diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml index fd0de654b5..2664988a16 100644 --- a/res/values-de/strings.xml +++ b/res/values-de/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Privat"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Geschäftlich"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Unterhaltungen"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Notizen"</string> <string name="widget_education_header" msgid="4874760613775913787">"Praktische Informationen – immer zur Hand"</string> <string name="widget_education_content" msgid="1731667670753497052">"Wenn du Informationen erhalten möchtest, ohne Apps zu öffnen, kannst du deinem Startbildschirm Widgets hinzufügen"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Tippen, um die Widget-Einstellungen zu ändern"</string> diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml index a399a4e7f8..6b6f249407 100644 --- a/res/values-el/strings.xml +++ b/res/values-el/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Προσωπικά"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Εργασίας"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Συζητήσεις"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Δημιουργία σημειώσεων"</string> <string name="widget_education_header" msgid="4874760613775913787">"Χρήσιμες πληροφορίες στη διάθεσή σας"</string> <string name="widget_education_content" msgid="1731667670753497052">"Για να λάβετε πληροφορίες χωρίς να ανοίξετε εφαρμογές, μπορείτε να προσθέσετε γραφικά στοιχεία στην αρχική οθόνη."</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Πατήστε για αλλαγή των ρυθμίσεων του γραφικού στοιχείου"</string> diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml index eea6581f36..aa926df6d4 100644 --- a/res/values-en-rAU/strings.xml +++ b/res/values-en-rAU/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Personal"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Work"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Conversations"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Note-taking"</string> <string name="widget_education_header" msgid="4874760613775913787">"Useful info at your fingertips"</string> <string name="widget_education_content" msgid="1731667670753497052">"To get info without opening apps, you can add widgets to your home screen"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Tap to change widget settings"</string> diff --git a/res/values-en-rCA/strings.xml b/res/values-en-rCA/strings.xml index 32efb8cca5..40534ca74e 100644 --- a/res/values-en-rCA/strings.xml +++ b/res/values-en-rCA/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Personal"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Work"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Conversations"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Note-taking"</string> <string name="widget_education_header" msgid="4874760613775913787">"Useful info at your fingertips"</string> <string name="widget_education_content" msgid="1731667670753497052">"To get info without opening apps, you can add widgets to your home screen"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Tap to change widget settings"</string> diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml index eea6581f36..aa926df6d4 100644 --- a/res/values-en-rGB/strings.xml +++ b/res/values-en-rGB/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Personal"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Work"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Conversations"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Note-taking"</string> <string name="widget_education_header" msgid="4874760613775913787">"Useful info at your fingertips"</string> <string name="widget_education_content" msgid="1731667670753497052">"To get info without opening apps, you can add widgets to your home screen"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Tap to change widget settings"</string> diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml index eea6581f36..aa926df6d4 100644 --- a/res/values-en-rIN/strings.xml +++ b/res/values-en-rIN/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Personal"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Work"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Conversations"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Note-taking"</string> <string name="widget_education_header" msgid="4874760613775913787">"Useful info at your fingertips"</string> <string name="widget_education_content" msgid="1731667670753497052">"To get info without opening apps, you can add widgets to your home screen"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Tap to change widget settings"</string> diff --git a/res/values-en-rXC/strings.xml b/res/values-en-rXC/strings.xml index 31fea4b7be..d7a5d95adc 100644 --- a/res/values-en-rXC/strings.xml +++ b/res/values-en-rXC/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Personal"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Work"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Conversations"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Note-taking"</string> <string name="widget_education_header" msgid="4874760613775913787">"Useful info at your fingertips"</string> <string name="widget_education_content" msgid="1731667670753497052">"To get info without opening apps, you can add widgets to your home screen"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Tap to change widget settings"</string> diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml index ee322ea5a8..bffa3f81f9 100644 --- a/res/values-es-rUS/strings.xml +++ b/res/values-es-rUS/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Personales"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Trabajo"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Conversaciones"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Tomar notas"</string> <string name="widget_education_header" msgid="4874760613775913787">"Información útil a tu alcance"</string> <string name="widget_education_content" msgid="1731667670753497052">"Para recibir información de apps sin abrirlas, puedes agregar widgets a la pantalla principal"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Presiona para cambiar la configuración del widget"</string> diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml index e7b40b4011..2ebefc0491 100644 --- a/res/values-es/strings.xml +++ b/res/values-es/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Personales"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Trabajo"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Conversaciones"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Toma de notas"</string> <string name="widget_education_header" msgid="4874760613775913787">"Información útil al alcance de la mano"</string> <string name="widget_education_content" msgid="1731667670753497052">"Para ver información sin abrir una aplicación, puedes añadir widgets a la pantalla de inicio"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Toca para cambiar los ajustes del widget"</string> @@ -105,7 +106,7 @@ <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> - <string name="notification_dots_title" msgid="9062440428204120317">"Puntos de notificación"</string> + <string name="notification_dots_title" msgid="9062440428204120317">"Burbujas de notificación"</string> <string name="notification_dots_desc_on" msgid="1679848116452218908">"Activado"</string> <string name="notification_dots_desc_off" msgid="1760796511504341095">"Desactivadas"</string> <string name="title_missing_notification_access" msgid="7503287056163941064">"Se necesita acceso a las notificaciones"</string> diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml index f0ff7a8dc6..4b00f7bd71 100644 --- a/res/values-et/strings.xml +++ b/res/values-et/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Isiklikud"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Töö"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Vestlused"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Märkmete tegemine"</string> <string name="widget_education_header" msgid="4874760613775913787">"Kasulik teave on teie käeulatuses"</string> <string name="widget_education_content" msgid="1731667670753497052">"Teabe saamiseks rakendusi avamata võite oma avakuvale lisada vidinaid"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Puudutage vidina seadete muutmiseks"</string> @@ -71,7 +72,7 @@ <string name="all_apps_button_work_label" msgid="7270707118948892488">"Töörakenduste loend"</string> <string name="remove_drop_target_label" msgid="7812859488053230776">"Eemalda"</string> <string name="uninstall_drop_target_label" msgid="4722034217958379417">"Desinstalli"</string> - <string name="app_info_drop_target_label" msgid="692894985365717661">"Rakenduste teave"</string> + <string name="app_info_drop_target_label" msgid="692894985365717661">"Rakenduse teave"</string> <string name="install_drop_target_label" msgid="2539096853673231757">"Installimine"</string> <string name="dismiss_prediction_label" msgid="3357562989568808658">"Ära soovita rakendust"</string> <string name="pin_prediction" msgid="4196423321649756498">"Kinnita ennustus"</string> diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml index 642eb6bd00..1b211f1e47 100644 --- a/res/values-eu/strings.xml +++ b/res/values-eu/strings.xml @@ -50,6 +50,8 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Pertsonalak"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Lanekoak"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Elkarrizketak"</string> + <!-- no translation found for widget_category_note_taking (3469689394504266039) --> + <skip /> <string name="widget_education_header" msgid="4874760613775913787">"Informazio erabilgarria beti eskura"</string> <string name="widget_education_content" msgid="1731667670753497052">"Aplikaziorik ireki beharrik gabe informazioa zuzenean jasotzeko, gehitu widgetak hasierako pantailan"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Sakatu hau widgeten ezarpenak aldatzeko"</string> diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml index 6708519c14..091211adc6 100644 --- a/res/values-fa/strings.xml +++ b/res/values-fa/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"ابزارکهای شخصی"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"کار"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"مکالمهها"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"یادداشتبرداری"</string> <string name="widget_education_header" msgid="4874760613775913787">"دسترسی آسان به اطلاعات سودمند"</string> <string name="widget_education_content" msgid="1731667670753497052">"با افزودن ابزارکها به صفحه اصلی میتوانید اطلاعات را بدون باز کردن برنامهها دریافت کنید"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"برای تغییر تنظیمات ابزارک، ضربه بزنید"</string> diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml index adf4cb8df8..a1aa48c169 100644 --- a/res/values-fi/strings.xml +++ b/res/values-fi/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Henkilökohtaiset"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Työ"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Keskustelut"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Muistiinpanojen tekeminen"</string> <string name="widget_education_header" msgid="4874760613775913787">"Hyödyllisiä tietoja käden ulottuvilla"</string> <string name="widget_education_content" msgid="1731667670753497052">"Jos haluat nähdä tietoja avaamatta sovelluksia, voit lisätä aloitusnäytölle widgetejä"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Napauta, niin voit muuttaa widgetin asetuksia"</string> diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml index 213df55f9e..8416815925 100644 --- a/res/values-fr-rCA/strings.xml +++ b/res/values-fr-rCA/strings.xml @@ -50,6 +50,8 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Personnels"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Professionnels"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Conversations"</string> + <!-- no translation found for widget_category_note_taking (3469689394504266039) --> + <skip /> <string name="widget_education_header" msgid="4874760613775913787">"Renseignements utiles à portée de main"</string> <string name="widget_education_content" msgid="1731667670753497052">"Pour obtenir des informations sans ouvrir d\'applications, vous pouvez ajouter des widgets à votre écran d\'accueil"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Touchez pour modifier les paramètres du widget"</string> diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml index 3a95a5740f..9a1a37a7ec 100644 --- a/res/values-fr/strings.xml +++ b/res/values-fr/strings.xml @@ -50,6 +50,8 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Personnels"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Professionnels"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Conversations"</string> + <!-- no translation found for widget_category_note_taking (3469689394504266039) --> + <skip /> <string name="widget_education_header" msgid="4874760613775913787">"Infos utiles à portée de main"</string> <string name="widget_education_content" msgid="1731667670753497052">"Pour obtenir des infos sans ouvrir d\'applis, vous pouvez ajouter des widgets à votre écran d\'accueil"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Appuyez pour modifier les paramètres du widget"</string> @@ -107,7 +109,7 @@ <string name="allow_rotation_desc" msgid="8662546029078692509">"Lorsque vous faites pivoter le téléphone"</string> <string name="notification_dots_title" msgid="9062440428204120317">"Pastilles de notification"</string> <string name="notification_dots_desc_on" msgid="1679848116452218908">"Activé"</string> - <string name="notification_dots_desc_off" msgid="1760796511504341095">"Désactivées"</string> + <string name="notification_dots_desc_off" msgid="1760796511504341095">"Désactivé"</string> <string name="title_missing_notification_access" msgid="7503287056163941064">"Accès aux notifications requis"</string> <string name="msg_missing_notification_access" msgid="281113995110910548">"Pour afficher les pastilles de notification, activez les notifications de l\'application <xliff:g id="NAME">%1$s</xliff:g>"</string> <string name="title_change_settings" msgid="1376365968844349552">"Modifier les paramètres"</string> diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml index e8863d9df8..ab68e22be7 100644 --- a/res/values-gl/strings.xml +++ b/res/values-gl/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Widgets persoais"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Widgets do traballo"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Conversas"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Toma de notas"</string> <string name="widget_education_header" msgid="4874760613775913787">"Información útil ao teu alcance"</string> <string name="widget_education_content" msgid="1731667670753497052">"Se queres obter información sen abrir as aplicacións, podes engadir widgets á pantalla de inicio"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Toca para cambiar a configuración do widget"</string> diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml index 166f446cf0..c3cf295ae5 100644 --- a/res/values-gu/strings.xml +++ b/res/values-gu/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"વ્યક્તિગત"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"ઑફિસ"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"વાતચીતો"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"નોંધ લેવી"</string> <string name="widget_education_header" msgid="4874760613775913787">"ઉપયોગી માહિતી તમારી આંગળીના ટેરવે"</string> <string name="widget_education_content" msgid="1731667670753497052">"ઍપને ખોલ્યા વિના માહિતી મેળવવા માટે, તમે તમારી હોમ સ્ક્રીનમાં વિજેટ ઉમેરી શકો છો"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"વિજેટના સેટિંગ બદલવા માટે ટૅપ કરો"</string> @@ -156,7 +157,7 @@ <string name="action_dismiss_notification" msgid="5909461085055959187">"છોડી દો"</string> <string name="accessibility_close" msgid="2277148124685870734">"બંધ કરો"</string> <string name="notification_dismissed" msgid="6002233469409822874">"સૂચના છોડી દીધી"</string> - <string name="all_apps_personal_tab" msgid="4190252696685155002">"મનગમતી ઍપ"</string> + <string name="all_apps_personal_tab" msgid="4190252696685155002">"વ્યક્તિગત ઍપ"</string> <string name="all_apps_work_tab" msgid="4884822796154055118">"ઑફિસની ઍપ"</string> <string name="work_profile_toggle_label" msgid="3081029915775481146">"ઑફિસની પ્રોફાઇલ"</string> <string name="work_profile_edu_work_apps" msgid="7895468576497746520">"ઑફિસની ઍપને બૅજ આપેલા હોય છે અને તમારા IT ઍડમિન તેમને જોઈ શકે છે"</string> diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml index 5d351d7150..9f74bfca57 100644 --- a/res/values-hi/strings.xml +++ b/res/values-hi/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"निजी विजेट"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"ऑफ़िस"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"बातचीत"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"नोट बनाने से जुड़े विजेट"</string> <string name="widget_education_header" msgid="4874760613775913787">"काम की जानकारी आसानी से पाएं"</string> <string name="widget_education_content" msgid="1731667670753497052">"ऐप्लिकेशन को खोले बिना उनकी जानकारी पाने के लिए, होम स्क्रीन पर विजेट जोड़े जा सकते हैं"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"विजेट की सेटिंग में बदलाव करने के लिए टैप करें"</string> @@ -101,7 +102,7 @@ <string name="wallpaper_button_text" msgid="8404103075899945851">"वॉलपेपर"</string> <string name="styles_wallpaper_button_text" msgid="8216961355289236794">"वॉलपेपर और स्टाइल"</string> <string name="edit_home_screen" msgid="8947858375782098427">"होम स्क्रीन में बदलाव करें"</string> - <string name="settings_button_text" msgid="8873672322605444408">"होम पेज की सेटिंग"</string> + <string name="settings_button_text" msgid="8873672322605444408">"होम स्क्रीन की सेटिंग"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"आपके एडमिन ने बंद किया हुआ है"</string> <string name="allow_rotation_title" msgid="7222049633713050106">"होम स्क्रीन घुमाने की अनुमति दें"</string> <string name="allow_rotation_desc" msgid="8662546029078692509">"फ़ोन घुुमाए जाने पर"</string> @@ -159,7 +160,7 @@ <string name="all_apps_personal_tab" msgid="4190252696685155002">"निजी ऐप्लिकेशन"</string> <string name="all_apps_work_tab" msgid="4884822796154055118">"वर्क ऐप्लिकेशन"</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_work_apps" msgid="7895468576497746520">"वर्क ऐप्लिकेशन बैज किए गए हैं. आईटी एडमिन इन्हें देख सकता है"</string> <string name="work_profile_edu_accept" msgid="6069788082535149071">"ठीक है"</string> <string name="work_apps_paused_title" msgid="3040901117349444598">"वर्क ऐप्लिकेशन रोके गए"</string> <string name="work_apps_paused_info_body" msgid="1687828929959237477">"आपको वर्क ऐप्लिकेशन से सूचनाएं नहीं मिलेंगी"</string> diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml index 73e366f04c..3e52b18f2f 100644 --- a/res/values-hr/strings.xml +++ b/res/values-hr/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Osobni"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Posao"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Razgovori"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Pisanje bilježaka"</string> <string name="widget_education_header" msgid="4874760613775913787">"Korisne informacije nadohvat ruke"</string> <string name="widget_education_content" msgid="1731667670753497052">"Da biste dobili informacije bez otvaranja aplikacija, možete dodati widgete na početni zaslon"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Dodirnite da biste promijenili postavke widgeta"</string> diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml index 84134ba980..979539d8bb 100644 --- a/res/values-hu/strings.xml +++ b/res/values-hu/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Személyes"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Munka"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Beszélgetések"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Jegyzetelés"</string> <string name="widget_education_header" msgid="4874760613775913787">"Hasznos információk egy koppintásnyira"</string> <string name="widget_education_content" msgid="1731667670753497052">"Ha az alkalmazások megnyitása nélkül szeretne információhoz jutni, felvehet modulokat a kezdőképernyőre"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Ide koppintva módosíthatja a modulbeállításokat"</string> diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml index 5fee7a8fec..454c4543a5 100644 --- a/res/values-hy/strings.xml +++ b/res/values-hy/strings.xml @@ -50,6 +50,8 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Անձնական"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Աշխատանքային"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Զրույցներ"</string> + <!-- no translation found for widget_category_note_taking (3469689394504266039) --> + <skip /> <string name="widget_education_header" msgid="4874760613775913787">"Բոլոր կարևոր տեղեկությունները՝ ձեռքի տակ"</string> <string name="widget_education_content" msgid="1731667670753497052">"Ավելացրեք վիջեթներ ձեր հիմնական էկրանին, որպեսզի տեղեկություններ ստանաք՝ առանց հավելվածները բացելու։"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Հպեք՝ վիջեթի կարգավորումները փոփոխելու համար"</string> diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml index 7b33e9d042..0c0eef2bec 100644 --- a/res/values-in/strings.xml +++ b/res/values-in/strings.xml @@ -35,7 +35,7 @@ <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string> <string name="widget_accessible_dims_format" msgid="3640149169885301790">"lebar %1$d x tinggi %2$d"</string> <string name="widget_preview_context_description" msgid="9045841361655787574">"Widget <xliff:g id="WIDGET_NAME">%1$s</xliff:g>"</string> - <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Sentuh lama widget untuk memindahkannya di sekitar layar utama"</string> + <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Sentuh lama widget untuk memindah-mindahkannya di layar utama"</string> <string name="add_to_home_screen" msgid="9168649446635919791">"Tambahkan ke layar utama"</string> <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"Widget <xliff:g id="WIDGET_NAME">%1$s</xliff:g> ditambahkan ke layar utama"</string> <string name="suggested_widgets_header_title" msgid="1844314680798145222">"Saran"</string> @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Pribadi"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Kerja"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Percakapan"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Pembuatan catatan"</string> <string name="widget_education_header" msgid="4874760613775913787">"Info bermanfaat mudah dilihat"</string> <string name="widget_education_content" msgid="1731667670753497052">"Untuk mendapatkan info tanpa membuka aplikasi, Anda dapat menambahkan widget ke layar utama"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Ketuk untuk mengubah setelan widget"</string> diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml index 5e7af5f988..fc574cbf02 100644 --- a/res/values-is/strings.xml +++ b/res/values-is/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Persónulegt"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Vinna"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Samtöl"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Glósugerð"</string> <string name="widget_education_header" msgid="4874760613775913787">"Gagnlegar upplýsingar innan seilingar"</string> <string name="widget_education_content" msgid="1731667670753497052">"Þú getur bætt við græjum á heimaskjáinn til að fá upplýsingar án þess að opna forrit"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Ýttu til að breyta græjustillingum"</string> diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml index 3699c1d1c3..59c0cb771a 100644 --- a/res/values-it/strings.xml +++ b/res/values-it/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Personali"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Lavoro"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Conversazioni"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Aggiunta di note"</string> <string name="widget_education_header" msgid="4874760613775913787">"Informazioni utili a portata di mano"</string> <string name="widget_education_content" msgid="1731667670753497052">"Per ricevere informazioni senza aprire le app, puoi aggiungere dei widget alla schermata Home"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Tocca per modificare le impostazioni del widget"</string> diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml index cbbd156993..92f5d1d59b 100644 --- a/res/values-iw/strings.xml +++ b/res/values-iw/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"ווידג\'טים אישיים"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"עבודה"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"שיחות"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"כתיבת הערות"</string> <string name="widget_education_header" msgid="4874760613775913787">"קבלת מידע שימושי בהקשה"</string> <string name="widget_education_content" msgid="1731667670753497052">"רוצה לקבל מידע בלי לפתוח אפליקציות? אפשר להוסיף ווידג\'טים למסך הבית"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"אפשר לשנות את הגדרות הווידג\'ט בהקשה"</string> @@ -104,7 +105,7 @@ <string name="settings_button_text" msgid="8873672322605444408">"הגדרות של מסך הבית"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"הושבת על ידי מנהל המערכת שלך"</string> <string name="allow_rotation_title" msgid="7222049633713050106">"אישור לסיבוב מסך הבית"</string> - <string name="allow_rotation_desc" msgid="8662546029078692509">"כאשר הטלפון מסובב"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"כאשר מסובבים את הטלפון"</string> <string name="notification_dots_title" msgid="9062440428204120317">"סימני ההתראות"</string> <string name="notification_dots_desc_on" msgid="1679848116452218908">"מופעל"</string> <string name="notification_dots_desc_off" msgid="1760796511504341095">"כבוי"</string> diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml index 7552eaf01d..43cc1e3bf0 100644 --- a/res/values-ja/strings.xml +++ b/res/values-ja/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"個人用"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"仕事用"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"会話"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"メモ"</string> <string name="widget_education_header" msgid="4874760613775913787">"ウィジェットで情報を得る"</string> <string name="widget_education_content" msgid="1731667670753497052">"ホーム画面にウィジェットを追加すると、アプリを開かずに情報を入手できます"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"タップしてウィジェットの設定を変更する"</string> diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml index 602df8ec47..7553f6a7b4 100644 --- a/res/values-ka/strings.xml +++ b/res/values-ka/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"პირადი"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"სამსახური"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"მიმოწერები"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"ჩანიშვნა"</string> <string name="widget_education_header" msgid="4874760613775913787">"ადვილად მისაწვდომი სასარგებლო ინფორმაცია"</string> <string name="widget_education_content" msgid="1731667670753497052">"იმისთვის, რომ ინფორმაცია აპების გაუხსნელად მიიღოთ, შეგიძლიათ, მთავარ ეკრანზე ვიჯეტები დაამატოთ"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"შეეხეთ ვიჯეტის პარამეტრების შესაცვლელად"</string> diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml index 7012e2a036..00babfd2d3 100644 --- a/res/values-kk/strings.xml +++ b/res/values-kk/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Жеке виджеттер"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Жұмыс виджеттері"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Әңгімелер"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Ескертпе жазу"</string> <string name="widget_education_header" msgid="4874760613775913787">"Саусақпен түртсеңіз болғаны – пайдалы ақпарат көз алдыңызда"</string> <string name="widget_education_content" msgid="1731667670753497052">"Қолданбаларды ашпай-ақ ақпарат алу үшін негізгі экранға тиісті виджеттерді қосыңыз."</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Виджет параметрлерін өзгерту үшін түртіңіз."</string> diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml index 6aa399b95c..42e0d4bb1f 100644 --- a/res/values-km/strings.xml +++ b/res/values-km/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"ផ្ទាល់ខ្លួន"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"ការងារ"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"ការសន្ទនា"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"ការកត់ត្រា"</string> <string name="widget_education_header" msgid="4874760613775913787">"ទទួលបានព័ត៌មានដែលមានប្រយោជន៍យ៉ាងងាយស្រួល"</string> <string name="widget_education_content" msgid="1731667670753497052">"ដើម្បីទទួលបានព័ត៌មានដោយមិនចាំបាច់បើកកម្មវិធី អ្នកអាចបញ្ចូលធាតុក្រាហ្វិកទៅក្នុងអេក្រង់ដើមរបស់អ្នក"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"ចុចដើម្បីប្ដូរការកំណត់ធាតុក្រាហ្វិក"</string> diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml index e27483e503..fdc73da156 100644 --- a/res/values-kn/strings.xml +++ b/res/values-kn/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"ವೈಯಕ್ತಿಕ"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"ಕೆಲಸ"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"ಸಂಭಾಷಣೆಗಳು"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"ಟಿಪ್ಪಣಿ ತೆಗೆದುಕೊಳ್ಳುವುದು"</string> <string name="widget_education_header" msgid="4874760613775913787">"ನಿಮ್ಮ ಬೆರಳ ತುದಿಯಲ್ಲಿ ಉಪಯುಕ್ತ ಮಾಹಿತಿ"</string> <string name="widget_education_content" msgid="1731667670753497052">"ಆ್ಯಪ್ಗಳನ್ನು ತೆರೆಯದೆಯೇ ಮಾಹಿತಿಯನ್ನು ಪಡೆಯಲು, ನಿಮ್ಮ ಹೋಮ್ ಸ್ಕ್ರೀನ್ನಲ್ಲಿ ನೀವು ವಿಜೆಟ್ಗಳನ್ನು ಸೇರಿಸಬಹುದು"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"ವಿಜೆಟ್ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಬದಲಾಯಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string> @@ -108,7 +109,7 @@ <string name="notification_dots_title" msgid="9062440428204120317">"ಅಧಿಸೂಚನೆ ಡಾಟ್ಗಳು"</string> <string name="notification_dots_desc_on" msgid="1679848116452218908">"ಆನ್ ಆಗಿದೆ"</string> <string name="notification_dots_desc_off" msgid="1760796511504341095">"ಆಫ್ ಆಗಿದೆ"</string> - <string name="title_missing_notification_access" msgid="7503287056163941064">"ಅಧಿಸೂಚನೆ ಪ್ರವೇಶ ಅಗತ್ಯವಿದೆ"</string> + <string name="title_missing_notification_access" msgid="7503287056163941064">"ನೋಟಿಫಿಕೇಶನ್ ಆ್ಯಕ್ಸೆಸ್ ಅಗತ್ಯವಿದೆ"</string> <string name="msg_missing_notification_access" msgid="281113995110910548">"ಅಧಿಸೂಚನೆ ಚುಕ್ಕೆಗಳನ್ನು ತೋರಿಸಲು, <xliff:g id="NAME">%1$s</xliff:g> ಗೆ ಅಪ್ಲಿಕೇಶನ್ ಅಧಿಸೂಚನೆಗಳನ್ನು ಆನ್ ಮಾಡಿ"</string> <string name="title_change_settings" msgid="1376365968844349552">"ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಬದಲಾಯಿಸಿ"</string> <string name="notification_dots_service_title" msgid="4284221181793592871">"ಅಧಿಸೂಚನೆ ಡಾಟ್ಗಳನ್ನು ತೋರಿಸಿ"</string> diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml index 95be8e96ac..ab682a4862 100644 --- a/res/values-ko/strings.xml +++ b/res/values-ko/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"개인 위젯"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"직장 위젯"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"대화"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"메모"</string> <string name="widget_education_header" msgid="4874760613775913787">"빠르게 유용한 정보 확인"</string> <string name="widget_education_content" msgid="1731667670753497052">"앱을 열지 않고 정보를 확인하려면 홈 화면에 위젯을 추가하세요."</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"탭하여 위젯 설정 변경"</string> diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml index d0048aca31..20476912a1 100644 --- a/res/values-ky/strings.xml +++ b/res/values-ky/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Жеке виджеттер"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Жумуш"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Сүйлөшүүлөр"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Эскертме жазуу"</string> <string name="widget_education_header" msgid="4874760613775913787">"Керектүү маалымат манжаңыздын учунда"</string> <string name="widget_education_content" msgid="1731667670753497052">"Бир нерсе билүү үчүн колдонмолорду улам ачып убара болбостон, башкы экранга виджеттерди кошуп коюңуз."</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Виджеттин параметрлерин өзгөртүү үчүн таптап коюңуз"</string> diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml index 21481787a5..166c37005b 100644 --- a/res/values-lo/strings.xml +++ b/res/values-lo/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"ສ່ວນຕົວ"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"ວຽກ"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"ການສົນທະນາ"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"ການຈົດບັນທຶກ"</string> <string name="widget_education_header" msgid="4874760613775913787">"ຂໍ້ມູນທີ່ເປັນປະໂຫຍດຢູ່ປາຍນິ້ວຂອງທ່ານ"</string> <string name="widget_education_content" msgid="1731667670753497052">"ເພື່ອຮັບຂໍ້ມູນໂດຍບໍ່ຕ້ອງເປີດແອັບ, ທ່ານສາມາດເພີ່ມວິດເຈັດໃສ່ໂຮມສະກຣີນຂອງທ່ານໄດ້"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"ແຕະເພື່ອປ່ຽນການຕັ້ງຄ່າວິດເຈັດ"</string> diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml index 2ea7174933..4c674981eb 100644 --- a/res/values-lt/strings.xml +++ b/res/values-lt/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Asmeniniai"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Darbas"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Pokalbiai"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Užrašų kūrimas"</string> <string name="widget_education_header" msgid="4874760613775913787">"Lengvai pasiekiama naudinga informacija"</string> <string name="widget_education_content" msgid="1731667670753497052">"Jei norite gauti informacijos neatidarę programų, galite pridėti valdiklių pagrindiniame ekrane"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Palieskite, kad pakeistumėte valdiklio nustatymus"</string> @@ -69,7 +70,7 @@ <string name="all_apps_search_results" msgid="5889367432531296759">"Paieškos rezultatai"</string> <string name="all_apps_button_personal_label" msgid="1315764287305224468">"Asmeninių programų sąrašas"</string> <string name="all_apps_button_work_label" msgid="7270707118948892488">"Darbo programų sąrašas"</string> - <string name="remove_drop_target_label" msgid="7812859488053230776">"Ištrinti"</string> + <string name="remove_drop_target_label" msgid="7812859488053230776">"Pašalinti"</string> <string name="uninstall_drop_target_label" msgid="4722034217958379417">"Pašalinti"</string> <string name="app_info_drop_target_label" msgid="692894985365717661">"Programos inform."</string> <string name="install_drop_target_label" msgid="2539096853673231757">"Įdiegti"</string> diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml index d0011e043f..ad7af542f2 100644 --- a/res/values-lv/strings.xml +++ b/res/values-lv/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Personīgs"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Darba"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Sarunas"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Piezīmju pierakstīšana"</string> <string name="widget_education_header" msgid="4874760613775913787">"Ērta piekļuve noderīgai informācijai"</string> <string name="widget_education_content" msgid="1731667670753497052">"Lai iegūtu informāciju, neatverot lietotnes, varat pievienot sākuma ekrānam logrīkus"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Pieskarieties, lai mainītu logrīka iestatījumus."</string> diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml index 47127a7e7d..de60f3ae08 100644 --- a/res/values-mk/strings.xml +++ b/res/values-mk/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Лични"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Работни"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Разговори"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Фаќање белешки"</string> <string name="widget_education_header" msgid="4874760613775913787">"Корисни информации на дофат на прстите"</string> <string name="widget_education_content" msgid="1731667670753497052">"За да добивате информации без да ги отворате апликациите, може да додадете виџети на почетниот екран"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Допрете за да ги промените поставките за виџетот"</string> @@ -170,7 +171,7 @@ <string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Паузирај ги работните апликации"</string> <string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Прекини ја паузата"</string> <string name="developer_options_filter_hint" msgid="5896817443635989056">"Филтер"</string> - <string name="search_pref_screen_title" msgid="3258959643336315962">"Пребарувајте на телефонот"</string> - <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Пребарувајте на таблетот"</string> + <string name="search_pref_screen_title" msgid="3258959643336315962">"Пребарување низ телефонот"</string> + <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Пребарување низ таблетот"</string> <string name="remote_action_failed" msgid="1383965239183576790">"Не успеа: <xliff:g id="WHAT">%1$s</xliff:g>"</string> </resources> diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml index 59827f28eb..3600eddf53 100644 --- a/res/values-ml/strings.xml +++ b/res/values-ml/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"വ്യക്തിപരം"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"ജോലി"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"സംഭാഷണങ്ങൾ"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"കുറിപ്പ് രേഖപ്പെടുത്തൽ"</string> <string name="widget_education_header" msgid="4874760613775913787">"ഉപകാരപ്രദമായ വിവരങ്ങൾ നിങ്ങളുടെ വിരൽത്തുമ്പിൽ"</string> <string name="widget_education_content" msgid="1731667670753497052">"ആപ്പുകൾ തുറക്കാതെ വിവരങ്ങൾ ലഭിക്കാൻ, നിങ്ങൾക്ക് ഹോം സ്ക്രീനിലേക്ക് വിജറ്റുകൾ ചേർക്കാം"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"വിജറ്റ് ക്രമീകരണം മാറ്റാൻ ടാപ്പ് ചെയ്യുക"</string> @@ -119,7 +120,7 @@ <string name="abandoned_clean_this" msgid="7610119707847920412">"നീക്കംചെയ്യുക"</string> <string name="abandoned_search" msgid="891119232568284442">"തിരയുക"</string> <string name="abandoned_promises_title" msgid="7096178467971716750">"ഈ അപ്ലിക്കേഷൻ ഇൻസ്റ്റാളുചെയ്തിട്ടില്ല"</string> - <string name="abandoned_promise_explanation" msgid="3990027586878167529">"ഈ ഐക്കണുവേണ്ടി അപ്ലിക്കേഷൻ ഇൻസ്റ്റാളുചെയ്തിട്ടില്ല. നിങ്ങൾക്കത് നീക്കംചെയ്യാനാകും അല്ലെങ്കിൽ അപ്ലിക്കേഷനുവേണ്ടി തിരഞ്ഞുകൊണ്ട് അത് സ്വമേധയാ ഇൻസ്റ്റാളുചെയ്യുക."</string> + <string name="abandoned_promise_explanation" msgid="3990027586878167529">"ഈ ഐക്കണുവേണ്ടി അപ്ലിക്കേഷൻ ഇൻസ്റ്റാളുചെയ്തിട്ടില്ല. നിങ്ങൾക്കത് നീക്കംചെയ്യാനാകും അല്ലെങ്കിൽ അപ്ലിക്കേഷനുവേണ്ടി തിരഞ്ഞുകൊണ്ട് അത് സ്വയമേവ ഇൻസ്റ്റാളുചെയ്യുക."</string> <string name="app_installing_title" msgid="5864044122733792085">"<xliff:g id="NAME">%1$s</xliff:g> ഇൻസ്റ്റാൾ ചെയ്യുന്നു, <xliff:g id="PROGRESS">%2$s</xliff:g> പൂർത്തിയായി"</string> <string name="app_downloading_title" msgid="8336702962104482644">"<xliff:g id="NAME">%1$s</xliff:g> ഡൗൺലോഡ് ചെയ്യുന്നു, <xliff:g id="PROGRESS">%2$s</xliff:g> പൂർത്തിയായി"</string> <string name="app_waiting_download_title" msgid="7053938513995617849">"ഇൻസ്റ്റാൾ ചെയ്യാൻ <xliff:g id="NAME">%1$s</xliff:g> കാക്കുന്നു"</string> diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml index d24f5fe15b..430e80d669 100644 --- a/res/values-mn/strings.xml +++ b/res/values-mn/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Хувийн виджетүүд"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Ажил"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Харилцан яриа"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Тэмдэглэл хөтлөх"</string> <string name="widget_education_header" msgid="4874760613775913787">"Хэрэгтэй мэдээллээ хурууныхаа үзүүрээр аваарай"</string> <string name="widget_education_content" msgid="1731667670753497052">"Аппуудыг нээлгүйгээр мэдээлэл авахын тулд та үндсэн нүүрэндээ виджетүүд нэмэх боломжтой"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Жижиг хэрэгслийн тохиргоог өөрчлөхийн тулд товшино уу"</string> diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml index b74a8f50ed..e968d71151 100644 --- a/res/values-mr/strings.xml +++ b/res/values-mr/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"वैयक्तिक"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"ऑफिस"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"संभाषणे"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"टिपा घेणे"</string> <string name="widget_education_header" msgid="4874760613775913787">"तुमच्यासाठी सहज उपलब्ध असलेली माहिती"</string> <string name="widget_education_content" msgid="1731667670753497052">"ॲप्स न उघडता माहिती मिळवण्यासाठी, तुम्ही तुमच्या होम स्क्रीनवर विजेट जोडू शकता"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"विजेट सेटिंग्ज बदलण्यासाठी टॅप करा"</string> diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml index 7d1a4d172a..5dcc913a7a 100644 --- a/res/values-ms/strings.xml +++ b/res/values-ms/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Peribadi"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Tempat kerja"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Perbualan"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Pengambilan nota"</string> <string name="widget_education_header" msgid="4874760613775913787">"Maklumat berguna di hujung jari anda"</string> <string name="widget_education_content" msgid="1731667670753497052">"Untuk mendapatkan maklumat tanpa membuka apl, anda boleh menambahkan widget pada skrin utama anda"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Ketik untuk menukar tetapan widget"</string> @@ -99,7 +100,7 @@ <string name="folder_name_format_exact" msgid="8626242716117004803">"Folder: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> item"</string> <string name="folder_name_format_overflow" msgid="4270108890534995199">"Folder: <xliff:g id="NAME">%1$s</xliff:g>, <xliff:g id="SIZE">%2$d</xliff:g> atau lebih banyak item"</string> <string name="wallpaper_button_text" msgid="8404103075899945851">"Hiasan latar"</string> - <string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Kertas dinding & gaya"</string> + <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> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"Dilumpuhkan oleh pentadbir anda"</string> @@ -170,7 +171,7 @@ <string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Jeda apl kerja"</string> <string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Nyahjeda"</string> <string name="developer_options_filter_hint" msgid="5896817443635989056">"Tapis"</string> - <string name="search_pref_screen_title" msgid="3258959643336315962">"Cari telefon anda"</string> - <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Cari tablet anda"</string> + <string name="search_pref_screen_title" msgid="3258959643336315962">"Cari pada telefon"</string> + <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"Cari pada tablet anda"</string> <string name="remote_action_failed" msgid="1383965239183576790">"Gagal: <xliff:g id="WHAT">%1$s</xliff:g>"</string> </resources> diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml index 1a6b0de1e6..86d7a1a8e8 100644 --- a/res/values-my/strings.xml +++ b/res/values-my/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"ကိုယ်ပိုင်"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"အလုပ်"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"စကားဝိုင်းများ"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"မှတ်စုလိုက်ခြင်း"</string> <string name="widget_education_header" msgid="4874760613775913787">"အသုံးဝင်သော အချက်အလက်များကို အလွယ်တကူ ရယူလိုက်ပါ"</string> <string name="widget_education_content" msgid="1731667670753497052">"အက်ပ်မဖွင့်ဘဲ အချက်အလက်များရယူရန် ပင်မစာမျက်နှာတွင် ဝိဂျက်များ ထည့်နိုင်သည်"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"ဝိဂျက် ဆက်တင်များကို ပြောင်းရန် တို့ပါ"</string> @@ -168,7 +169,7 @@ <string name="work_apps_paused_edu_banner" msgid="8872412121608402058">"အလုပ်သုံးအက်ပ်များကို တံဆိပ်တပ်ထားပြီး သင်၏ IT စီမံခန့်ခွဲသူက မြင်နိုင်ပါသည်"</string> <string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"နားလည်ပြီ"</string> <string name="work_apps_pause_btn_text" msgid="4669288269140620646">"အလုပ်သုံးအက်ပ်များကို ခဏရပ်ရန်"</string> - <string name="work_apps_enable_btn_text" msgid="1736198302467317371">"ပြန်ဖွင့်ရန်"</string> + <string name="work_apps_enable_btn_text" msgid="1736198302467317371">"ပြန်စရန်"</string> <string name="developer_options_filter_hint" msgid="5896817443635989056">"စစ်ထုတ်ရန်"</string> <string name="search_pref_screen_title" msgid="3258959643336315962">"သင့်ဖုန်းတွင် ရှာခြင်း"</string> <string name="search_pref_screen_title_tablet" msgid="5220319680451343959">"သင့်တက်ဘလက်ကို ရှာခြင်း"</string> diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml index dbcff53c05..485f8458e5 100644 --- a/res/values-nb/strings.xml +++ b/res/values-nb/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Personlige"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Jobb"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Samtaler"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Notatskriving"</string> <string name="widget_education_header" msgid="4874760613775913787">"Lett tilgjengelig nyttig informasjon"</string> <string name="widget_education_content" msgid="1731667670753497052">"For å se informasjon uten å åpne apper kan du legge til moduler på startskjermen"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Trykk for å endre modulinnstillinger"</string> diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml index 81095c8bed..58df374bfc 100644 --- a/res/values-ne/strings.xml +++ b/res/values-ne/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"व्यक्तिगत"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"कामसम्बन्धी"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"वार्तालापहरू"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"नोट लेख्ने कार्य"</string> <string name="widget_education_header" msgid="4874760613775913787">"उपयोगी जानकारी सजिलै प्राप्त गर्नुहोस्"</string> <string name="widget_education_content" msgid="1731667670753497052">"एपहरू नखोलिकनै जानकारी प्राप्त गर्न तपाईं आफ्नो होम स्क्रिनमा विजेटहरू हाल्न सक्नुहुन्छ"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"विजेटका सेटिङ बदल्न ट्याप गर्नुहोस्"</string> @@ -104,7 +105,7 @@ <string name="settings_button_text" msgid="8873672322605444408">"होम पेजका सेटिङहरू"</string> <string name="msg_disabled_by_admin" msgid="6898038085516271325">"तपाईँको प्रशासकद्वारा असक्षम गरिएको"</string> <string name="allow_rotation_title" msgid="7222049633713050106">"होम स्क्रिन रोटेट हुन दिइयोस्"</string> - <string name="allow_rotation_desc" msgid="8662546029078692509">"फोनलाई घुमाइँदा"</string> + <string name="allow_rotation_desc" msgid="8662546029078692509">"फोन घुमाउँदा"</string> <string name="notification_dots_title" msgid="9062440428204120317">"सूचनाको प्रतीक जनाउने थोप्लाहरू"</string> <string name="notification_dots_desc_on" msgid="1679848116452218908">"सक्रिय"</string> <string name="notification_dots_desc_off" msgid="1760796511504341095">"निष्क्रिय"</string> diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml index 2241a58b87..416d82d1be 100644 --- a/res/values-nl/strings.xml +++ b/res/values-nl/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Persoonlijk"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Werk"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Gesprekken"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Aantekeningen maken"</string> <string name="widget_education_header" msgid="4874760613775913787">"Nuttige informatie binnen handbereik"</string> <string name="widget_education_content" msgid="1731667670753497052">"Als je informatie wilt krijgen zonder apps te openen, kun je widgets toevoegen aan je startscherm"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Tik om de widgetinstellingen te wijzigen"</string> diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml index abb33cde79..027b285e7a 100644 --- a/res/values-or/strings.xml +++ b/res/values-or/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"ବ୍ୟକ୍ତିଗତ"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"ୱାର୍କ"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"ବାର୍ତ୍ତାଳାପଗୁଡ଼ିକ"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"ନୋଟ-ଟେକିଂ"</string> <string name="widget_education_header" msgid="4874760613775913787">"ଉପଯୋଗୀ ସୂଚନା ଆପଣଙ୍କ ପାଖରେ ସହଜରେ ଉପଲବ୍ଧ"</string> <string name="widget_education_content" msgid="1731667670753497052">"ଆପ୍ସକୁ ନଖୋଲି ସୂଚନା ପାଇବା ପାଇଁ, ଆପଣ ଆପଣଙ୍କ ହୋମ ସ୍କ୍ରିନରେ ୱିଜେଟଗୁଡ଼ିକୁ ଯୋଗ କରିପାରିବେ"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"ୱିଜେଟ ସେଟିଂସ ପରିବର୍ତ୍ତନ କରିବାକୁ ଟାପ କରନ୍ତୁ"</string> @@ -159,7 +160,7 @@ <string name="all_apps_personal_tab" msgid="4190252696685155002">"ବ୍ୟକ୍ତିଗତ"</string> <string name="all_apps_work_tab" msgid="4884822796154055118">"ୱାର୍କ"</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_work_apps" msgid="7895468576497746520">"ୱାର୍କ ଆପ୍ସକୁ ବେଜ କରାଯାଇଛି ଏବଂ ସେଗୁଡ଼ିକ ଆପଣଙ୍କ IT ଆଡମିନଙ୍କୁ ଦେଖାଯାଉଛି"</string> <string name="work_profile_edu_accept" msgid="6069788082535149071">"ବୁଝିଗଲି"</string> <string name="work_apps_paused_title" msgid="3040901117349444598">"ୱାର୍କ ଆପ୍ସ ବିରତ କରାଯାଇଛି"</string> <string name="work_apps_paused_info_body" msgid="1687828929959237477">"ଆପଣ ଆପଣଙ୍କ ୱାର୍କ ଆପ୍ସରୁ ବିଜ୍ଞପ୍ତି ପାଇବେ ନାହିଁ"</string> diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml index d8e68dc59f..f9a66dfdbf 100644 --- a/res/values-pa/strings.xml +++ b/res/values-pa/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"ਨਿੱਜੀ"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"ਕਾਰਜ-ਸਥਾਨ"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"ਗੱਲਾਂਬਾਤਾਂ"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"ਨੋਟ ਬਣਾਉਣਾ"</string> <string name="widget_education_header" msgid="4874760613775913787">"ਮਹੱਤਵਪੂਰਨ ਜਾਣਕਾਰੀ ਤੁਰੰਤ ਪ੍ਰਾਪਤ ਕਰੋ"</string> <string name="widget_education_content" msgid="1731667670753497052">"ਐਪਾਂ ਨੂੰ ਖੋਲ੍ਹੇ ਬਿਨਾਂ ਜਾਣਕਾਰੀ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ, ਤੁਸੀਂ ਆਪਣੀ ਹੋਮ ਸਕ੍ਰੀਨ \'ਤੇ ਵਿਜੇਟ ਸ਼ਾਮਲ ਕਰ ਸਕਦੇ ਹੋ"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"ਵਿਜੇਟ ਸੈਟਿੰਗਾਂ ਨੂੰ ਬਦਲਣ ਲਈ ਟੈਪ ਕਰੋ"</string> diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml index 464a058a05..4f3abe3356 100644 --- a/res/values-pl/strings.xml +++ b/res/values-pl/strings.xml @@ -35,7 +35,7 @@ <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string> <string name="widget_accessible_dims_format" msgid="3640149169885301790">"Szerokość %1$d, wysokość %2$d"</string> <string name="widget_preview_context_description" msgid="9045841361655787574">"Widżet <xliff:g id="WIDGET_NAME">%1$s</xliff:g>"</string> - <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Kliknij i przytrzymaj widżet, aby poruszać nim po ekranie głównym"</string> + <string name="add_item_request_drag_hint" msgid="8730547755622776606">"Aby poruszać widżetem po ekranie głównym, kliknij go i przytrzymaj"</string> <string name="add_to_home_screen" msgid="9168649446635919791">"Dodaj do ekranu głównego"</string> <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"Widżet <xliff:g id="WIDGET_NAME">%1$s</xliff:g> został dodany do ekranu głównego"</string> <string name="suggested_widgets_header_title" msgid="1844314680798145222">"Sugestie"</string> @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Osobiste"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Służbowe"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Rozmowy"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Notatki"</string> <string name="widget_education_header" msgid="4874760613775913787">"Użyteczne informacje w zasięgu ręki"</string> <string name="widget_education_content" msgid="1731667670753497052">"Możesz dodać widżety do ekranu głównego, aby uzyskiwać informacje bez otwierania aplikacji"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Kliknij, aby zmienić ustawienia widżetu"</string> diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml index dcbbe1dd3c..0acf63ecd9 100644 --- a/res/values-pt-rPT/strings.xml +++ b/res/values-pt-rPT/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Pessoais"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Trabalho"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Conversas"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Tomar notas"</string> <string name="widget_education_header" msgid="4874760613775913787">"Informações úteis à sua disposição"</string> <string name="widget_education_content" msgid="1731667670753497052">"Para obter informações sem abrir apps, pode adicionar widgets ao seu ecrã principal"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Toque para alterar as definições do widget"</string> diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml index d63406cd1d..e0c9b84a62 100644 --- a/res/values-pt/strings.xml +++ b/res/values-pt/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Pessoais"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Trabalho"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Conversas"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Anotações"</string> <string name="widget_education_header" msgid="4874760613775913787">"Informações úteis ao seu alcance"</string> <string name="widget_education_content" msgid="1731667670753497052">"Para ver informações sem precisar abrir os apps, adicione widgets à sua tela inicial"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Toque para mudar as configurações do widget"</string> diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml index 7a63581c59..d6c5e5e5d7 100644 --- a/res/values-ro/strings.xml +++ b/res/values-ro/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Personale"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Serviciu"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Conversații"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Luare de notițe"</string> <string name="widget_education_header" msgid="4874760613775913787">"Informații utile la îndemâna ta"</string> <string name="widget_education_content" msgid="1731667670753497052">"Pentru a primi informații fără să deschizi aplicațiile, poți adăuga widgeturi pe ecranul de pornire"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Atinge ca să schimbi setările pentru widgeturi"</string> diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml index 5735ba45ed..6315ee5713 100644 --- a/res/values-ru/strings.xml +++ b/res/values-ru/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Личные виджеты"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Рабочие виджеты"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Разговоры"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Создание заметок"</string> <string name="widget_education_header" msgid="4874760613775913787">"Вся нужная информация перед глазами"</string> <string name="widget_education_content" msgid="1731667670753497052">"Чтобы не открывать приложения каждый раз, когда нужна информация, добавьте виджеты на главный экран."</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Нажмите, чтобы изменить настройки виджета"</string> diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml index a7ea98be0c..15bc4a7594 100644 --- a/res/values-si/strings.xml +++ b/res/values-si/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"පුද්ගලික"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"කාර්යාලය"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"සංවාද"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"සටහන් කර ගැනීම"</string> <string name="widget_education_header" msgid="4874760613775913787">"ප්රයෝජනවත් තොරතුරු ඔබගේ ඇඟිලි තුඩු අග"</string> <string name="widget_education_content" msgid="1731667670753497052">"යෙදුම් විවෘත නොකර තොරතුරු ලබා ගැනීම සඳහා, ඔබට ඔබගේ මුල් තිරයට විජට් එක් කළ හැකිය"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"විජට් සැකසීම් වෙනස් කිරීමට තට්ටු කරන්න"</string> diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml index 434e416327..2028c35a99 100644 --- a/res/values-sk/strings.xml +++ b/res/values-sk/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Osobné"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Práca"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Konverzácie"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Zapisovanie poznámok"</string> <string name="widget_education_header" msgid="4874760613775913787">"Užitočné informácie poruke"</string> <string name="widget_education_content" msgid="1731667670753497052">"Ak chcete získavať informácie bez otvárania aplikácií, môžete si na plochu pridať miniaplikácie"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Klepnutím zmeňte nastavenia miniaplikácie"</string> diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml index cad7f40064..e6197c7aa3 100644 --- a/res/values-sl/strings.xml +++ b/res/values-sl/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Osebni"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Služba"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Pogovori"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Ustvarjanje zapiskov"</string> <string name="widget_education_header" msgid="4874760613775913787">"Koristne informacije na dosegu prstov"</string> <string name="widget_education_content" msgid="1731667670753497052">"Če si želite podatke ogledati brez odpiranja aplikacij, lahko na začetni zaslon dodate pripomočke."</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Dotaknite se, če želite spremeniti nastavitve pripomočka."</string> diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml index ff97f00143..c6b8e7ca9d 100644 --- a/res/values-sq/strings.xml +++ b/res/values-sq/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Personale"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Puna"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Bisedat"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Mbajtja e shënimeve"</string> <string name="widget_education_header" msgid="4874760613775913787">"Informacione të dobishme në majë të gishtave të tu"</string> <string name="widget_education_content" msgid="1731667670753497052">"Për të marrë informacione pa i hapur aplikacionet, mund të shtosh miniaplikacione në ekranin bazë"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Trokit për të ndryshuar cilësimet e miniaplikacionit"</string> diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml index 668ce5a0fa..f754bee859 100644 --- a/res/values-sr/strings.xml +++ b/res/values-sr/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Лично"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Посао"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Конверзације"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Прављење бележака"</string> <string name="widget_education_header" msgid="4874760613775913787">"Корисне информације надохват руке"</string> <string name="widget_education_content" msgid="1731667670753497052">"Да бисте пронашли информације без отварања апликација, можете да додате виџете на почетни екран"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Додирните да бисте променили подешавања виџета"</string> diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml index dba173d195..cd946e78d2 100644 --- a/res/values-sv/strings.xml +++ b/res/values-sv/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Privata"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Arbete"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Konversationer"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Anteckna"</string> <string name="widget_education_header" msgid="4874760613775913787">"Användbar information nära till hands"</string> <string name="widget_education_content" msgid="1731667670753497052">"Om du vill ha information utan att öppna appar kan du lägga till widgetar på startskärmen"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Tryck för att ändra inställningarna för widgeten"</string> diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml index b992037748..2686f8a8e3 100644 --- a/res/values-sw/strings.xml +++ b/res/values-sw/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Binafsi"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Kazini"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Mazungumzo"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Kuandika madokezo"</string> <string name="widget_education_header" msgid="4874760613775913787">"Maelezo muhimu, popote ulipo"</string> <string name="widget_education_content" msgid="1731667670753497052">"Ili upate maelezo bila kufungua programu, unaweza kuweka wijeti kwenye skrini yako ya kwanza"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Gusa ili ubadilishe mipangilio ya wijeti"</string> diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml index 29f1206275..8d9b2cc06a 100644 --- a/res/values-ta/strings.xml +++ b/res/values-ta/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"தனிப்பட்டவை"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"பணி"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"உரையாடல்கள்"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"குறிப்பெடுத்தல்"</string> <string name="widget_education_header" msgid="4874760613775913787">"விரல்நுனியில் பயனுள்ள தகவல்களைப் பெறுங்கள்"</string> <string name="widget_education_content" msgid="1731667670753497052">"முகப்புத் திரையில் விட்ஜெட்டுகளைச் சேர்த்து ஆப்ஸைத் திறக்காமலேயே தகவல்களைப் பெறலாம்"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"விட்ஜெட் அமைப்புகளை மாற்றத் தட்டவும்"</string> diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml index 35b5c16ae0..08e633d0f2 100644 --- a/res/values-te/strings.xml +++ b/res/values-te/strings.xml @@ -27,7 +27,7 @@ <string name="safemode_widget_error" msgid="4863470563535682004">"సురక్షిత మోడ్లో విడ్జెట్లు నిలిపివేయబడ్డాయి"</string> <string name="shortcut_not_available" msgid="2536503539825726397">"షార్ట్కట్ అందుబాటులో లేదు"</string> <string name="home_screen" msgid="5629429142036709174">"మొదటి ట్యాబ్"</string> - <string name="recent_task_option_split_screen" msgid="6690461455618725183">"స్క్రీన్ను విభజించు"</string> + <string name="recent_task_option_split_screen" msgid="6690461455618725183">"స్ప్లిట్ స్క్రీన్"</string> <string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s కోసం యాప్ సమాచారం"</string> <string name="save_app_pair" msgid="5647523853662686243">"యాప్ పెయిర్ను సేవ్ చేయండి"</string> <string name="long_press_widget_to_add" msgid="3587712543577675817">"విడ్జెట్ను తరలించడానికి తాకి & నొక్కి ఉంచండి."</string> @@ -35,7 +35,7 @@ <string name="widget_dims_format" msgid="2370757736025621599">"%1$d × %2$d"</string> <string name="widget_accessible_dims_format" msgid="3640149169885301790">"%1$d వెడల్పు X %2$d ఎత్తు"</string> <string name="widget_preview_context_description" msgid="9045841361655787574">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> విడ్జెట్"</string> - <string name="add_item_request_drag_hint" msgid="8730547755622776606">"విడ్జెట్ను మొదటి స్క్రీన్ చుట్టూ తిప్పడానికి దాన్ని తాకి, & నొక్కి ఉంచండి"</string> + <string name="add_item_request_drag_hint" msgid="8730547755622776606">"విడ్జెట్ను మొదటి స్క్రీన్లో తిప్పడానికి దాన్ని తాకి, & నొక్కి పట్టుకోండి"</string> <string name="add_to_home_screen" msgid="9168649446635919791">"మొదటి స్క్రీన్కు జోడించండి"</string> <string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"మొదటి స్క్రీన్కు <xliff:g id="WIDGET_NAME">%1$s</xliff:g> విడ్జెట్ జోడించబడింది"</string> <string name="suggested_widgets_header_title" msgid="1844314680798145222">"సూచనలు"</string> @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"వ్యక్తిగత గ్యాడ్జెట్స్"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"ఆఫీస్"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"సంభాషణలు"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"నోట్-టేకింగ్"</string> <string name="widget_education_header" msgid="4874760613775913787">"మీ చేతివేళ్ల మీద ఉపయోగకరమైన సమాచారం"</string> <string name="widget_education_content" msgid="1731667670753497052">"యాప్లను తెరవకుండా సమాచారాన్ని పొందడానికి, మీరు మీ మొదటి స్క్రీన్కు విడ్జెట్లను జోడించవచ్చు"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"విడ్జెట్ సెట్టింగ్లను మార్చడానికి ట్యాప్ చేయండి"</string> diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml index 35cab0dd60..4b64993bf3 100644 --- a/res/values-th/strings.xml +++ b/res/values-th/strings.xml @@ -27,7 +27,7 @@ <string name="safemode_widget_error" msgid="4863470563535682004">"มีการปิดใช้งานวิดเจ็ตในเซฟโหมด"</string> <string name="shortcut_not_available" msgid="2536503539825726397">"ทางลัดไม่พร้อมใช้งาน"</string> <string name="home_screen" msgid="5629429142036709174">"หน้าแรก"</string> - <string name="recent_task_option_split_screen" msgid="6690461455618725183">"แบ่งหน้าจอ"</string> + <string name="recent_task_option_split_screen" msgid="6690461455618725183">"แยกหน้าจอ"</string> <string name="split_app_info_accessibility" msgid="5475288491241414932">"ข้อมูลแอปสำหรับ %1$s"</string> <string name="save_app_pair" msgid="5647523853662686243">"บันทึกคู่แอป"</string> <string name="long_press_widget_to_add" msgid="3587712543577675817">"แตะค้างไว้เพื่อย้ายวิดเจ็ต"</string> @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"ส่วนตัว"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"งาน"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"การสนทนา"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"การจดบันทึก"</string> <string name="widget_education_header" msgid="4874760613775913787">"เข้าถึงข้อมูลที่เป็นประโยชน์ได้จากปลายนิ้ว"</string> <string name="widget_education_content" msgid="1731667670753497052">"หากต้องการรับข้อมูลโดยไม่เปิดแอป ให้เพิ่มวิดเจ็ตลงในหน้าจอหลัก"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"แตะเพื่อเปลี่ยนการตั้งค่าวิดเจ็ต"</string> diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml index b91d67e8be..61f92273aa 100644 --- a/res/values-tl/strings.xml +++ b/res/values-tl/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Personal"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Trabaho"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Mga Pag-uusap"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Pagtatala"</string> <string name="widget_education_header" msgid="4874760613775913787">"Abot-kamay na mahalagang impormasyon"</string> <string name="widget_education_content" msgid="1731667670753497052">"Para makakuha ng impormasyon nang hindi nagbubukas ng mga app, puwede kang magdagdag ng mga widget sa iyong home screen"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"I-tap para baguhin ang mga setting ng widget"</string> diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml index d439162ad0..6025aa7d74 100644 --- a/res/values-tr/strings.xml +++ b/res/values-tr/strings.xml @@ -50,6 +50,8 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Kişisel"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"İş"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Görüşmeler"</string> + <!-- no translation found for widget_category_note_taking (3469689394504266039) --> + <skip /> <string name="widget_education_header" msgid="4874760613775913787">"Faydalı bilgiler parmaklarınızın ucunda"</string> <string name="widget_education_content" msgid="1731667670753497052">"Uygulama açmadan bilgi almak için ana ekranınıza widget ekleyebilirsiniz"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Widget ayarlarını değiştirmek için dokunun"</string> diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml index dcf60a90b5..5127d3b82e 100644 --- a/res/values-uk/strings.xml +++ b/res/values-uk/strings.xml @@ -50,6 +50,8 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Особисті"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Робочі"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Розмови"</string> + <!-- no translation found for widget_category_note_taking (3469689394504266039) --> + <skip /> <string name="widget_education_header" msgid="4874760613775913787">"Корисна інформація завжди під рукою"</string> <string name="widget_education_content" msgid="1731667670753497052">"Щоб отримувати інформацію, не відкриваючи додатки, ви можете додати на головний екран віджети"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Натисніть, щоб змінити налаштування віджета"</string> diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml index 5b10dd21ee..1fffcfd1a1 100644 --- a/res/values-ur/strings.xml +++ b/res/values-ur/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"ذاتی"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"دفتری ویجیٹس"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"گفتگوئیں"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"نوٹ لکھنا"</string> <string name="widget_education_header" msgid="4874760613775913787">"مفید معلومات کو آسانی سے حاصل کریں"</string> <string name="widget_education_content" msgid="1731667670753497052">"ایپس کو کھولے بغیر معلومات حاصل کرنے کے لیے آپ اپنی ہوم اسکرین پر ویجیٹس شامل کر سکتے ہیں"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"ویجیٹ ترتیبات تبدیل کرنے کے لیے تھپتھپائیں"</string> diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml index 81ad4dce90..db381caa04 100644 --- a/res/values-uz/strings.xml +++ b/res/values-uz/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Shaxsiy"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Ish"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Suhbatlar"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Qayd olish"</string> <string name="widget_education_header" msgid="4874760613775913787">"Barcha kerakli axborot doim yoningizda"</string> <string name="widget_education_content" msgid="1731667670753497052">"Kerakli ilovalarni ochmasdan turib ulardan axborot olish uchun vidjetlarni bosh ekranga chiqaring"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Vidjet sozlamalarini oʻzgartirish uchun bosing"</string> diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml index 7940ba378a..b73bc615da 100644 --- a/res/values-vi/strings.xml +++ b/res/values-vi/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Cá nhân"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Công việc"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Cuộc trò chuyện"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Ghi chú"</string> <string name="widget_education_header" msgid="4874760613775913787">"Thông tin hữu ích ngay trong tầm tay bạn"</string> <string name="widget_education_content" msgid="1731667670753497052">"Để nhận thông tin mà không cần mở các ứng dụng, bạn có thể thêm tiện ích vào màn hình chính"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Nhấn để thay đổi chế độ cài đặt tiện ích"</string> diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml index 415f5fa93d..5c3bcafca5 100644 --- a/res/values-zh-rCN/strings.xml +++ b/res/values-zh-rCN/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"个人"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"工作"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"对话"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"记事"</string> <string name="widget_education_header" msgid="4874760613775913787">"实用信息触手可及"</string> <string name="widget_education_content" msgid="1731667670753497052">"要想不打开应用就能获取信息,您可以将相应微件添加到主屏幕"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"点按即可更改微件设置"</string> diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml index f71da28ff1..a01b2634b1 100644 --- a/res/values-zh-rHK/strings.xml +++ b/res/values-zh-rHK/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"個人"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"工作"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"對話"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"做筆記"</string> <string name="widget_education_header" msgid="4874760613775913787">"實用資訊,唾手可得"</string> <string name="widget_education_content" msgid="1731667670753497052">"只要將小工具新增至主畫面,就可以直接查看資料,無需開啟應用程式"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"輕按即可變更小工具設定"</string> diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml index 7f949e8e41..69d1d90417 100644 --- a/res/values-zh-rTW/strings.xml +++ b/res/values-zh-rTW/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"個人"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"工作"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"對話"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"做筆記"</string> <string name="widget_education_header" msgid="4874760613775913787">"實用資訊隨手可得"</string> <string name="widget_education_content" msgid="1731667670753497052">"只要將小工具新增到主畫面,就可以直接查看資訊,不必開啟應用程式"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"輕觸即可變更小工具設定"</string> diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml index 18cd74ca1e..d9ed3f03af 100644 --- a/res/values-zu/strings.xml +++ b/res/values-zu/strings.xml @@ -50,6 +50,7 @@ <string name="widgets_full_sheet_personal_tab" msgid="2743540105607120182">"Okwabantu siqu"</string> <string name="widgets_full_sheet_work_tab" msgid="3767150027110633765">"Umsebenzi"</string> <string name="widget_category_conversations" msgid="8894438636213590446">"Izingxoxo"</string> + <string name="widget_category_note_taking" msgid="3469689394504266039">"Ukuthatha amanothi"</string> <string name="widget_education_header" msgid="4874760613775913787">"Ulwazi oluwusizo phambi nje kwakho"</string> <string name="widget_education_content" msgid="1731667670753497052">"Ukuze uthole ulwazi ngaphandle kokuvula ama-app, ungakwazi ukwengeza amawijethi kusikrini sakho sasekhaya"</string> <string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Thepha ukuze ushintshe amasethingi ewijethi"</string> diff --git a/res/values/dimens.xml b/res/values/dimens.xml index 1aa1871ac5..786088ef6e 100644 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -32,12 +32,6 @@ <dimen name="dynamic_grid_hotseat_bottom_tall_padding">0dp</dimen> <dimen name="spring_loaded_hotseat_top_margin">76dp</dimen> - <!-- Qsb --> - <!-- Used for adjusting the position of QSB when placed in hotseat. This is a ratio and a higher - number signifies that the QSB is close to the hotseat icons and a lower number signifies that - it is close to the bottom of the screen --> - <item name="qsb_center_factor" format="float" type="dimen">0.325</item> - <dimen name="dynamic_grid_hotseat_side_padding">0dp</dimen> <!-- Scalable Grid --> diff --git a/src/com/android/launcher3/AppWidgetResizeFrame.java b/src/com/android/launcher3/AppWidgetResizeFrame.java index bc4a5c343f..71314525bb 100644 --- a/src/com/android/launcher3/AppWidgetResizeFrame.java +++ b/src/com/android/launcher3/AppWidgetResizeFrame.java @@ -1,7 +1,5 @@ package com.android.launcher3; -import static android.appwidget.AppWidgetHostView.getDefaultPaddingForWidget; - import static com.android.launcher3.CellLayout.SPRING_LOADED_PROGRESS; import static com.android.launcher3.LauncherAnimUtils.LAYOUT_HEIGHT; import static com.android.launcher3.LauncherAnimUtils.LAYOUT_WIDTH; @@ -77,8 +75,6 @@ public class AppWidgetResizeFrame extends AbstractFloatingView implements View.O private DragLayer mDragLayer; private ImageButton mReconfigureButton; - private Rect mWidgetPadding; - private final int mBackgroundPadding; private final int mTouchTargetWidth; @@ -218,9 +214,6 @@ public class AppWidgetResizeFrame extends AbstractFloatingView implements View.O mMaxHSpan = info.maxSpanX; mMaxVSpan = info.maxSpanY; - mWidgetPadding = getDefaultPaddingForWidget(getContext(), - widgetView.getAppWidgetInfo().provider, null); - // Only show resize handles for the directions in which resizing is possible. InvariantDeviceProfile idp = LauncherAppState.getIDP(cellLayout.getContext()); mVerticalResizeActive = (info.resizeMode & AppWidgetProviderInfo.RESIZE_VERTICAL) != 0 @@ -517,16 +510,12 @@ public class AppWidgetResizeFrame extends AbstractFloatingView implements View.O */ private void getSnappedRectRelativeToDragLayer(Rect out) { float scale = mWidgetView.getScaleToFit(); - mDragLayer.getViewRectRelativeToSelf(mWidgetView, out); - int width = 2 * mBackgroundPadding - + (int) (scale * (out.width() - mWidgetPadding.left - mWidgetPadding.right)); - int height = 2 * mBackgroundPadding - + (int) (scale * (out.height() - mWidgetPadding.top - mWidgetPadding.bottom)); - - int x = (int) (out.left - mBackgroundPadding + scale * mWidgetPadding.left); - int y = (int) (out.top - mBackgroundPadding + scale * mWidgetPadding.top); + int width = 2 * mBackgroundPadding + Math.round(scale * out.width()); + int height = 2 * mBackgroundPadding + Math.round(scale * out.height()); + int x = out.left - mBackgroundPadding; + int y = out.top - mBackgroundPadding; out.left = x; out.top = y; diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java index 09887697b5..5163ede509 100644 --- a/src/com/android/launcher3/CellLayout.java +++ b/src/com/android/launcher3/CellLayout.java @@ -85,6 +85,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; +import java.util.List; import java.util.Stack; public class CellLayout extends ViewGroup { @@ -891,7 +892,7 @@ public class CellLayout extends ViewGroup { * * @param result Array of 2 ints to hold the x and y coordinate of the point */ - void regionToCenterPoint(int cellX, int cellY, int spanX, int spanY, int[] result) { + public void regionToCenterPoint(int cellX, int cellY, int spanX, int spanY, int[] result) { cellToRect(cellX, cellY, spanX, spanY, mTempRect); result[0] = mTempRect.centerX(); result[1] = mTempRect.centerY(); @@ -2340,7 +2341,16 @@ public class CellLayout extends ViewGroup { } Rect r0 = new Rect(cellX, cellY, cellX + spanX, cellY + spanY); Rect r1 = new Rect(); - for (View child: solution.map.keySet()) { + // The views need to be sorted so that the results are deterministic on the views positions + // and not by the views hash which is "random". + // The views are sorted twice, once for the X position and a second time for the Y position + // to ensure same order everytime. + Comparator comparator = Comparator.comparing(view -> + ((CellLayoutLayoutParams) ((View) view).getLayoutParams()).getCellX()) + .thenComparing(view -> + ((CellLayoutLayoutParams) ((View) view).getLayoutParams()).getCellY()); + List<View> views = solution.map.keySet().stream().sorted(comparator).toList(); + for (View child : views) { if (child == ignoreView) continue; CellAndSpan c = solution.map.get(child); CellLayoutLayoutParams lp = (CellLayoutLayoutParams) child.getLayoutParams(); diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java index 86c9f1617e..867522699f 100644 --- a/src/com/android/launcher3/DeviceProfile.java +++ b/src/com/android/launcher3/DeviceProfile.java @@ -67,14 +67,12 @@ public class DeviceProfile { private static final int DEFAULT_DOT_SIZE = 100; private static final float ALL_APPS_TABLET_MAX_ROWS = 5.5f; private static final float MIN_FOLDER_TEXT_SIZE_SP = 16f; + private static final float MIN_WIDGET_PADDING_DP = 6f; public static final PointF DEFAULT_SCALE = new PointF(1.0f, 1.0f); public static final ViewScaleProvider DEFAULT_PROVIDER = itemInfo -> DEFAULT_SCALE; public static final Consumer<DeviceProfile> DEFAULT_DIMENSION_PROVIDER = dp -> {}; - // Ratio of empty space, qsb should take up to appear visually centered. - private final float mQsbCenterFactor; - public final InvariantDeviceProfile inv; private final Info mInfo; private final DisplayMetrics mMetrics; @@ -252,6 +250,10 @@ public class DeviceProfile { // Insets private final Rect mInsets = new Rect(); public final Rect workspacePadding = new Rect(); + // Additional padding added to the widget inside its cellSpace. It is applied outside + // the widgetView, such that the actual view size is same as the widget size. + public final Rect widgetPadding = new Rect(); + // When true, nav bar is on the left side of the screen. private boolean mIsSeascape; @@ -314,9 +316,6 @@ public class DeviceProfile { availableHeightPx = windowBounds.availableSize.y; aspectRatio = ((float) Math.max(widthPx, heightPx)) / Math.min(widthPx, heightPx); - boolean isTallDevice = Float.compare(aspectRatio, TALL_DEVICE_ASPECT_RATIO_THRESHOLD) >= 0; - mQsbCenterFactor = res.getFloat(R.dimen.qsb_center_factor); - if (isTwoPanels) { if (isLandscape) { mTypeIndex = INDEX_TWO_PANEL_LANDSCAPE; @@ -730,22 +729,6 @@ public class DeviceProfile { return mInfo; } - /** - * We inset the widget padding added by the system and instead rely on the border spacing - * between cells to create reliable consistency between widgets - */ - public boolean shouldInsetWidgets() { - Rect widgetPadding = inv.defaultWidgetPadding; - - // Check all sides to ensure that the widget won't overlap into another cell, or into - // status bar. - return workspaceTopPadding > widgetPadding.top - && cellLayoutBorderSpacePx.x > widgetPadding.left - && cellLayoutBorderSpacePx.y > widgetPadding.top - && cellLayoutBorderSpacePx.x > widgetPadding.right - && cellLayoutBorderSpacePx.y > widgetPadding.bottom; - } - public Builder toBuilder(Context context) { WindowBounds bounds = new WindowBounds( widthPx, heightPx, availableWidthPx, availableHeightPx, rotationHint); @@ -999,6 +982,18 @@ public class DeviceProfile { // Folder icon folderIconSizePx = IconNormalizer.getNormalizedCircleSize(iconSizePx); folderIconOffsetYPx = (iconSizePx - folderIconSizePx) / 2; + + // Update widget padding: + float minSpacing = pxFromDp(MIN_WIDGET_PADDING_DP, mMetrics); + if (cellLayoutBorderSpacePx.x < minSpacing + || cellLayoutBorderSpacePx.y < minSpacing) { + widgetPadding.left = widgetPadding.right = + Math.round(Math.max(0, minSpacing - cellLayoutBorderSpacePx.x)); + widgetPadding.top = widgetPadding.bottom = + Math.round(Math.max(0, minSpacing - cellLayoutBorderSpacePx.y)); + } else { + widgetPadding.setEmpty(); + } } /** diff --git a/src/com/android/launcher3/InvariantDeviceProfile.java b/src/com/android/launcher3/InvariantDeviceProfile.java index 5e07a3c52f..3aa582d074 100644 --- a/src/com/android/launcher3/InvariantDeviceProfile.java +++ b/src/com/android/launcher3/InvariantDeviceProfile.java @@ -26,8 +26,6 @@ import static com.android.launcher3.util.DisplayController.CHANGE_SUPPORTED_BOUN import static com.android.launcher3.util.Executors.MAIN_EXECUTOR; import android.annotation.TargetApi; -import android.appwidget.AppWidgetHostView; -import android.content.ComponentName; import android.content.Context; import android.content.res.Configuration; import android.content.res.Resources; @@ -35,7 +33,6 @@ import android.content.res.TypedArray; import android.content.res.XmlResourceParser; import android.graphics.Point; import android.graphics.PointF; -import android.graphics.Rect; import android.text.TextUtils; import android.util.AttributeSet; import android.util.DisplayMetrics; @@ -192,7 +189,6 @@ public class InvariantDeviceProfile { public List<DeviceProfile> supportedProfiles = Collections.EMPTY_LIST; public Point defaultWallpaperSize; - public Rect defaultWidgetPadding; private final ArrayList<OnIDPChangeListener> mChangeListeners = new ArrayList<>(); @@ -443,9 +439,6 @@ public class InvariantDeviceProfile { deviceProfile.numShownHotseatIcons = numMinShownHotseatIconsForTablet; deviceProfile.recalculateHotseatWidthAndBorderSpace(); }); - - ComponentName cn = new ComponentName(context.getPackageName(), getClass().getName()); - defaultWidgetPadding = AppWidgetHostView.getDefaultPaddingForWidget(context, cn, null); } public void addOnChangeListener(OnIDPChangeListener listener) { diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 4dfd91820c..4764d72b80 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -56,6 +56,14 @@ import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCH import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_SWIPELEFT; import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_SWIPERIGHT; import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_WIDGET_RECONFIGURED; +import static com.android.launcher3.logging.StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_ACTIVITY_ON_CREATE; +import static com.android.launcher3.logging.StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION; +import static com.android.launcher3.logging.StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_VIEW_INFLATION; +import static com.android.launcher3.logging.StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_ASYNC; +import static com.android.launcher3.logging.StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_SYNC; +import static com.android.launcher3.logging.StatsLogManager.StatsLatencyLogger.LatencyType.COLD; +import static com.android.launcher3.logging.StatsLogManager.StatsLatencyLogger.LatencyType.COLD_DEVICE_REBOOTING; +import static com.android.launcher3.logging.StatsLogManager.StatsLatencyLogger.LatencyType.WARM; import static com.android.launcher3.model.ItemInstallQueue.FLAG_ACTIVITY_PAUSED; import static com.android.launcher3.model.ItemInstallQueue.FLAG_DRAG_AND_DROP; import static com.android.launcher3.popup.SystemShortcut.APP_INFO; @@ -64,7 +72,6 @@ import static com.android.launcher3.popup.SystemShortcut.WIDGETS; import static com.android.launcher3.states.RotationHelper.REQUEST_LOCK; import static com.android.launcher3.states.RotationHelper.REQUEST_NONE; import static com.android.launcher3.util.Executors.MAIN_EXECUTOR; -import static com.android.launcher3.util.Executors.MODEL_EXECUTOR; import static com.android.launcher3.util.ItemInfoMatcher.forFolderMatch; import android.animation.Animator; @@ -111,6 +118,7 @@ import android.view.Menu; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; +import android.view.ViewTreeObserver; import android.view.ViewTreeObserver.OnPreDrawListener; import android.view.WindowManager.LayoutParams; import android.view.accessibility.AccessibilityEvent; @@ -157,6 +165,7 @@ import com.android.launcher3.logger.LauncherAtom.WorkspaceContainer; import com.android.launcher3.logging.FileLog; import com.android.launcher3.logging.InstanceId; import com.android.launcher3.logging.InstanceIdSequence; +import com.android.launcher3.logging.StartupLatencyLogger; import com.android.launcher3.logging.StatsLogManager; import com.android.launcher3.model.BgDataModel.Callbacks; import com.android.launcher3.model.ItemInstallQueue; @@ -190,6 +199,7 @@ import com.android.launcher3.util.ActivityTracker; import com.android.launcher3.util.ComponentKey; import com.android.launcher3.util.IntArray; import com.android.launcher3.util.IntSet; +import com.android.launcher3.util.LockedUserState; import com.android.launcher3.util.OnboardingPrefs; import com.android.launcher3.util.PackageUserKey; import com.android.launcher3.util.PendingRequestArgs; @@ -293,6 +303,8 @@ public class Launcher extends StatefulActivity<LauncherState> public static final String ON_RESUME_EVT = "Launcher.onResume"; public static final String ON_NEW_INTENT_EVT = "Launcher.onNewIntent"; + private static boolean sIsNewProcess = true; + private StateManager<LauncherState> mStateManager; private static final int ON_ACTIVITY_RESULT_ANIMATION_DELAY = 500; @@ -404,12 +416,22 @@ public class Launcher extends StatefulActivity<LauncherState> private StringCache mStringCache; private BaseSearchConfig mBaseSearchConfig; - + private StartupLatencyLogger mStartupLatencyLogger; private CellPosMapper mCellPosMapper = CellPosMapper.DEFAULT; @Override @TargetApi(Build.VERSION_CODES.S) protected void onCreate(Bundle savedInstanceState) { + mStartupLatencyLogger = createStartupLatencyLogger( + sIsNewProcess + ? LockedUserState.get(this).isUserUnlockedAtLauncherStartup() + ? COLD + : COLD_DEVICE_REBOOTING + : WARM); + sIsNewProcess = false; + mStartupLatencyLogger + .logStart(LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION) + .logStart(LAUNCHER_LATENCY_STARTUP_ACTIVITY_ON_CREATE); // Only use a hard-coded cookie since we only want to trace this once. if (Utilities.ATLEAST_S) { Trace.beginAsyncSection( @@ -518,6 +540,7 @@ public class Launcher extends StatefulActivity<LauncherState> } } + mStartupLatencyLogger.logWorkspaceLoadStartTime(); if (!mModel.addCallbacksAndLoad(this)) { if (!internalStateHandled) { // If we are not binding synchronously, pause drawing until initial bind complete, @@ -557,6 +580,17 @@ public class Launcher extends StatefulActivity<LauncherState> getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_ADJUST_NOTHING); } setTitle(R.string.home_screen); + mStartupLatencyLogger.logEnd(LAUNCHER_LATENCY_STARTUP_ACTIVITY_ON_CREATE); + } + + /** + * Create {@link StartupLatencyLogger} that only collects launcher startup latency metrics + * without sending them anywhere. Child class can override this method to create logger + * that overrides {@link StartupLatencyLogger#log()} to report those metrics. + */ + protected StartupLatencyLogger createStartupLatencyLogger( + StatsLogManager.StatsLatencyLogger.LatencyType latencyType) { + return new StartupLatencyLogger(latencyType); } /** @@ -1290,7 +1324,10 @@ public class Launcher extends StatefulActivity<LauncherState> * Finds all the views we need and configure them properly. */ protected void setupViews() { + mStartupLatencyLogger.logStart(LAUNCHER_LATENCY_STARTUP_VIEW_INFLATION); inflateRootView(R.layout.launcher); + mStartupLatencyLogger.logEnd(LAUNCHER_LATENCY_STARTUP_VIEW_INFLATION); + mDragLayer = findViewById(R.id.drag_layer); mFocusHandler = mDragLayer.getFocusIndicatorHelper(); mWorkspace = mDragLayer.findViewById(R.id.workspace); @@ -2695,7 +2732,8 @@ public class Launcher extends StatefulActivity<LauncherState> @Override @TargetApi(Build.VERSION_CODES.S) - public void onInitialBindComplete(IntSet boundPages, RunnableList pendingTasks) { + public void onInitialBindComplete(IntSet boundPages, RunnableList pendingTasks, + int workspaceItemCount, boolean isBindSync) { mSynchronouslyBoundPages = boundPages; mPagesToBindSynchronously = new IntSet(); @@ -2719,6 +2757,26 @@ public class Launcher extends StatefulActivity<LauncherState> Trace.endAsyncSection(DISPLAY_WORKSPACE_TRACE_METHOD_NAME, DISPLAY_WORKSPACE_TRACE_COOKIE); } + mStartupLatencyLogger + .logCardinality(workspaceItemCount) + .logEnd(isBindSync + ? LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_SYNC + : LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_ASYNC); + // In the first rootview's onDraw after onInitialBindComplete(), log end of startup latency. + getRootView().getViewTreeObserver().addOnDrawListener( + new ViewTreeObserver.OnDrawListener() { + + @Override + public void onDraw() { + mStartupLatencyLogger + .logEnd(LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION) + .log() + .reset(); + MAIN_EXECUTOR.getHandler().postAtFrontOfQueue( + () -> getRootView().getViewTreeObserver() + .removeOnDrawListener(this)); + } + }); } /** @@ -3102,6 +3160,16 @@ public class Launcher extends StatefulActivity<LauncherState> } @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_ESCAPE) { + // Close any open floating views. + closeOpenViews(); + return true; + } + return super.onKeyDown(keyCode, event); + } + + @Override public boolean onKeyUp(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_MENU) { // KEYCODE_MENU is sent by some tests, for example diff --git a/src/com/android/launcher3/LauncherModel.java b/src/com/android/launcher3/LauncherModel.java index 6798667d64..d3e94e13e8 100644 --- a/src/com/android/launcher3/LauncherModel.java +++ b/src/com/android/launcher3/LauncherModel.java @@ -417,7 +417,7 @@ public class LauncherModel extends LauncherApps.Callback implements InstallSessi if (bindDirectly) { // Divide the set of loaded items into those that we are binding synchronously, // and everything else that is to be bound normally (asynchronously). - launcherBinder.bindWorkspace(bindAllCallbacks); + launcherBinder.bindWorkspace(bindAllCallbacks, /* isBindSync= */ true); // For now, continue posting the binding of AllApps as there are other // issues that arise from that. launcherBinder.bindAllApps(); diff --git a/src/com/android/launcher3/ShortcutAndWidgetContainer.java b/src/com/android/launcher3/ShortcutAndWidgetContainer.java index b00199f362..a0ceefb733 100644 --- a/src/com/android/launcher3/ShortcutAndWidgetContainer.java +++ b/src/com/android/launcher3/ShortcutAndWidgetContainer.java @@ -46,8 +46,6 @@ public class ShortcutAndWidgetContainer extends ViewGroup implements FolderIcon. // return an (x, y) value from helper functions. Do NOT use them to maintain other state. private final int[] mTmpCellXY = new int[2]; - private final Rect mTempRect = new Rect(); - @ContainerType private final int mContainerType; private final WallpaperManager mWallpaperManager; @@ -124,13 +122,12 @@ public class ShortcutAndWidgetContainer extends ViewGroup implements FolderIcon. CellLayoutLayoutParams lp = (CellLayoutLayoutParams) child.getLayoutParams(); if (child instanceof NavigableAppWidgetHostView) { DeviceProfile profile = mActivity.getDeviceProfile(); - ((NavigableAppWidgetHostView) child).getWidgetInset(profile, mTempRect); final PointF appWidgetScale = profile.getAppWidgetScale((ItemInfo) child.getTag()); lp.setup(mCellWidth, mCellHeight, invertLayoutHorizontally(), mCountX, mCountY, - appWidgetScale.x, appWidgetScale.y, mBorderSpace, mTempRect); + appWidgetScale.x, appWidgetScale.y, mBorderSpace, profile.widgetPadding); } else { lp.setup(mCellWidth, mCellHeight, invertLayoutHorizontally(), mCountX, mCountY, - mBorderSpace, null); + mBorderSpace); } } @@ -149,13 +146,12 @@ public class ShortcutAndWidgetContainer extends ViewGroup implements FolderIcon. final DeviceProfile dp = mActivity.getDeviceProfile(); if (child instanceof NavigableAppWidgetHostView) { - ((NavigableAppWidgetHostView) child).getWidgetInset(dp, mTempRect); final PointF appWidgetScale = dp.getAppWidgetScale((ItemInfo) child.getTag()); lp.setup(mCellWidth, mCellHeight, invertLayoutHorizontally(), mCountX, mCountY, - appWidgetScale.x, appWidgetScale.y, mBorderSpace, mTempRect); + appWidgetScale.x, appWidgetScale.y, mBorderSpace, dp.widgetPadding); } else { lp.setup(mCellWidth, mCellHeight, invertLayoutHorizontally(), mCountX, mCountY, - mBorderSpace, null); + mBorderSpace); // Center the icon/folder int cHeight = getCellContentHeight(); int cellPaddingY = dp.isScalableGrid && mContainerType == WORKSPACE diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 6e6f1ac7c6..98016f67fa 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -2912,9 +2912,8 @@ public class Workspace<T extends View & PageIndicator> extends PagedView<T> Rect r = estimateItemPosition(layout, targetCell[0], targetCell[1], spanX, spanY); if (info.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPWIDGET) { DeviceProfile profile = mLauncher.getDeviceProfile(); - if (profile.shouldInsetWidgets() && finalView instanceof NavigableAppWidgetHostView) { - Rect widgetPadding = new Rect(); - ((NavigableAppWidgetHostView) finalView).getWidgetInset(profile, widgetPadding); + if (finalView instanceof NavigableAppWidgetHostView) { + Rect widgetPadding = profile.widgetPadding; r.left -= widgetPadding.left; r.right += widgetPadding.right; r.top -= widgetPadding.top; diff --git a/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java b/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java index 01a4876b49..21dfbe1d0c 100644 --- a/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java +++ b/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java @@ -871,8 +871,8 @@ public class ActivityAllAppsContainerView<T extends Context & ActivityContext> boolean visible = deviceProfile.isTablet || mForceBottomSheetVisible; mBottomSheetBackground.setVisibility(visible ? View.VISIBLE : View.GONE); // Note: For tablets, the opaque background and header protection are added in drawOnScrim. - // For the taskbar entrypoint, the scrim is drawn differently, so a static background is - // added in TaskbarAllAppsContainerView and header protection is not yet supported. + // For the taskbar entrypoint, the scrim is drawn by its abstract slide in view container, + // so its header protection is derived from this scrim instead. } private void setBottomSheetAlpha(float alpha) { diff --git a/src/com/android/launcher3/celllayout/CellLayoutLayoutParams.java b/src/com/android/launcher3/celllayout/CellLayoutLayoutParams.java index 4b6a062046..bdf764376d 100644 --- a/src/com/android/launcher3/celllayout/CellLayoutLayoutParams.java +++ b/src/com/android/launcher3/celllayout/CellLayoutLayoutParams.java @@ -113,13 +113,13 @@ public class CellLayoutLayoutParams extends ViewGroup.MarginLayoutParams { * full/invariant device profile sizes. */ public void setup(int cellWidth, int cellHeight, boolean invertHorizontally, int colCount, - int rowCount, Point borderSpace, @Nullable Rect inset) { + int rowCount, Point borderSpace) { setup(cellWidth, cellHeight, invertHorizontally, colCount, rowCount, 1.0f, 1.0f, - borderSpace, inset); + borderSpace, null); } /** - * Use this method, as opposed to {@link #setup(int, int, boolean, int, int, Point, Rect)}, + * Use this method, as opposed to {@link #setup(int, int, boolean, int, int, Point)}, * if the view needs to be scaled. * * ie. In multi-window mode, we setup widgets so that they are measured and laid out @@ -150,10 +150,10 @@ public class CellLayoutLayoutParams extends ViewGroup.MarginLayoutParams { y = topMargin + (myCellY * cellHeight) + (myCellY * borderSpace.y); if (inset != null) { - x -= inset.left; - y -= inset.top; - width += inset.left + inset.right; - height += inset.top + inset.bottom; + x += inset.left; + y += inset.top; + width -= inset.left + inset.right; + height -= inset.top + inset.bottom; } } } diff --git a/src/com/android/launcher3/config/FeatureFlags.java b/src/com/android/launcher3/config/FeatureFlags.java index 331ae5da65..fef66390a4 100644 --- a/src/com/android/launcher3/config/FeatureFlags.java +++ b/src/com/android/launcher3/config/FeatureFlags.java @@ -314,6 +314,12 @@ public final class FeatureFlags { "Enables receiving unfold animation events from sysui instead of calculating " + "them in launcher process using hinge sensor values."); + public static final BooleanFlag PREEMPTIVE_UNFOLD_ANIMATION_START = getDebugFlag(270397209, + "PREEMPTIVE_UNFOLD_ANIMATION_START", ENABLED, + "Enables starting the unfold animation preemptively when unfolding, without" + + "waiting for SystemUI and then merging the SystemUI progress whenever we " + + "start receiving the events"); + // TODO(Block 23): Clean up flags public static final BooleanFlag ENABLE_GRID_ONLY_OVERVIEW = getDebugFlag(270397206, "ENABLE_GRID_ONLY_OVERVIEW", DISABLED, diff --git a/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java b/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java index 7f49aa9cc1..b438e86bf8 100644 --- a/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java +++ b/src/com/android/launcher3/graphics/LauncherPreviewRenderer.java @@ -451,26 +451,8 @@ public class LauncherPreviewRenderer extends ContextWrapper final Size origSize = WidgetSizes.getWidgetSizePx(mDpOrig, launcherWidgetSize.getWidth(), launcherWidgetSize.getHeight()); final Size newSize = WidgetSizes.getWidgetSizePx(mDp, info.spanX, info.spanY); - final Rect previewInset = new Rect(); - final Rect origInset = new Rect(); - // When the setup() is called for the LayoutParams, insets are added to the width - // and height of the view. This is not accounted for in WidgetSizes and is handled - // here. - if (mDp.shouldInsetWidgets()) { - previewInset.set(mDp.inv.defaultWidgetPadding); - } else { - previewInset.setEmpty(); - } - if (mDpOrig.shouldInsetWidgets()) { - origInset.set(mDpOrig.inv.defaultWidgetPadding); - } else { - origInset.setEmpty(); - } - - return new PointF((float) newSize.getWidth() / (origSize.getWidth() - + origInset.left + origInset.right), - (float) newSize.getHeight() / (origSize.getHeight() - + origInset.top + origInset.bottom)); + return new PointF((float) newSize.getWidth() / origSize.getWidth(), + (float) newSize.getHeight() / origSize.getHeight()); } private void inflateAndAddPredictedIcon(WorkspaceItemInfo info) { diff --git a/src/com/android/launcher3/logging/StartupLatencyLogger.kt b/src/com/android/launcher3/logging/StartupLatencyLogger.kt new file mode 100644 index 0000000000..27b8c3bfcb --- /dev/null +++ b/src/com/android/launcher3/logging/StartupLatencyLogger.kt @@ -0,0 +1,193 @@ +package com.android.launcher3.logging + +import android.os.SystemClock +import android.util.Log +import android.util.SparseLongArray +import androidx.annotation.MainThread +import androidx.annotation.VisibleForTesting +import androidx.core.util.contains +import androidx.core.util.isEmpty +import com.android.launcher3.BuildConfig +import com.android.launcher3.logging.StatsLogManager.LauncherLatencyEvent +import com.android.launcher3.logging.StatsLogManager.StatsLatencyLogger.LatencyType +import com.android.launcher3.util.Preconditions + +/** Logger for logging Launcher activity's startup latency. */ +open class StartupLatencyLogger(val latencyType: LatencyType) { + + companion object { + const val TAG = "LauncherStartupLatencyLogger" + const val UNSET_INT = -1 + const val UNSET_LONG = -1L + } + + @VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE) + val startTimeByEvent = SparseLongArray() + @VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE) + val endTimeByEvent = SparseLongArray() + + @VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE) + var cardinality: Int = UNSET_INT + @VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE) + var workspaceLoadStartTime: Long = UNSET_LONG + + private var isInTest = false + + /** Subclass can override this method to handle collected latency metrics. */ + @MainThread + open fun log(): StartupLatencyLogger { + return this + } + + @MainThread + fun logWorkspaceLoadStartTime() = logWorkspaceLoadStartTime(SystemClock.elapsedRealtime()) + + @VisibleForTesting + @MainThread + fun logWorkspaceLoadStartTime(startTimeMs: Long): StartupLatencyLogger { + Preconditions.assertUIThread() + workspaceLoadStartTime = startTimeMs + return this + } + + /** + * Log size of workspace. Larger number of workspace items (icons, folders, widgets) means + * longer latency to initialize workspace. + */ + @MainThread + fun logCardinality(cardinality: Int): StartupLatencyLogger { + Preconditions.assertUIThread() + this.cardinality = cardinality + return this + } + + @MainThread + fun logStart(event: LauncherLatencyEvent) = logStart(event, SystemClock.elapsedRealtime()) + + @MainThread + fun logStart(event: LauncherLatencyEvent, startTimeMs: Long): StartupLatencyLogger { + // In unit test no looper is attached to current thread + Preconditions.assertUIThread() + if (validateLoggingEventAtStart(event)) { + startTimeByEvent.put(event.id, startTimeMs) + } + return this + } + + @MainThread + fun logEnd(event: LauncherLatencyEvent) = logEnd(event, SystemClock.elapsedRealtime()) + + @MainThread + fun logEnd(event: LauncherLatencyEvent, endTimeMs: Long): StartupLatencyLogger { + // In unit test no looper is attached to current thread + Preconditions.assertUIThread() + maybeLogStartOfWorkspaceLoadTime(event) + if (validateLoggingEventAtEnd(event)) { + endTimeByEvent.put(event.id, endTimeMs) + } + + return this + } + + @MainThread + fun reset() { + // In unit test no looper is attached to current thread + Preconditions.assertUIThread() + startTimeByEvent.clear() + endTimeByEvent.clear() + cardinality = UNSET_INT + workspaceLoadStartTime = UNSET_LONG + } + + @MainThread + private fun maybeLogStartOfWorkspaceLoadTime(event: LauncherLatencyEvent) { + if (workspaceLoadStartTime == UNSET_LONG) { + return + } + if ( + event == LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_SYNC || + event == LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_ASYNC + ) { + logStart(event, workspaceLoadStartTime) + workspaceLoadStartTime = UNSET_LONG + } + } + + /** @return true if we can log start of [LauncherLatencyEvent] and vice versa. */ + @MainThread + private fun validateLoggingEventAtStart(event: LauncherLatencyEvent): Boolean { + if (!BuildConfig.IS_STUDIO_BUILD && !isInTest) { + return true + } + if (startTimeByEvent.contains(event.id)) { + Log.e(TAG, "Cannot restart same ${event.name} event") + return false + } else if ( + startTimeByEvent.isEmpty() && + event != LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION + ) { + Log.e( + TAG, + "The first log start event must be " + + "${LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION.name}.", + ) + return false + } else if ( + event == LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_SYNC && + startTimeByEvent.get( + LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_ASYNC.id + ) != 0L + ) { + Log.e( + TAG, + "Cannot start ${LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_SYNC.name} event after ${LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_ASYNC.name} starts", + ) + return false + } else if ( + event == LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_ASYNC && + startTimeByEvent.get( + LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_SYNC.id + ) != 0L + ) { + Log.e( + TAG, + "Cannot start ${LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_ASYNC.name} event after ${LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_SYNC.name} starts", + ) + return false + } + + return true + } + + /** @return true if we can log end of [LauncherLatencyEvent] and vice versa. */ + @MainThread + private fun validateLoggingEventAtEnd(event: LauncherLatencyEvent): Boolean { + if (!BuildConfig.IS_STUDIO_BUILD && !isInTest) { + return true + } + if (!startTimeByEvent.contains(event.id)) { + Log.e(TAG, "Cannot end ${event.name} event before starting it") + return false + } else if (endTimeByEvent.contains(event.id)) { + Log.e(TAG, "Cannot end same ${event.name} event again") + return false + } else if ( + event != LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION && + endTimeByEvent.contains( + LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION.id + ) + ) { + Log.e( + TAG, + "Cannot end ${event.name} event after ${LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION.name}", + ) + return false + } + return true + } + + @VisibleForTesting + fun setIsInTest() { + isInTest = true + } +} diff --git a/src/com/android/launcher3/logging/StatsLogManager.java b/src/com/android/launcher3/logging/StatsLogManager.java index 5b4a02b296..8197b7322b 100644 --- a/src/com/android/launcher3/logging/StatsLogManager.java +++ b/src/com/android/launcher3/logging/StatsLogManager.java @@ -657,6 +657,39 @@ public class StatsLogManager implements ResourceBasedOverride { } } + /** Launcher's latency events. */ + public enum LauncherLatencyEvent implements EventEnum { + // Details of below 6 events with prefix of "LAUNCHER_LATENCY_STARTUP_" are discussed in + // go/launcher-startup-latency + @UiEvent(doc = "The total duration of launcher startup latency.") + LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION(1362), + + @UiEvent(doc = "The duration of launcher activity's onCreate().") + LAUNCHER_LATENCY_STARTUP_ACTIVITY_ON_CREATE(1363), + + @UiEvent(doc = + "The duration to inflate launcher root view in launcher activity's onCreate().") + LAUNCHER_LATENCY_STARTUP_VIEW_INFLATION(1364), + + @UiEvent(doc = "The duration of synchronous loading workspace") + LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_SYNC(1366), + + @UiEvent(doc = "The duration of asynchronous loading workspace") + LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_ASYNC(1367), + ; + + private final int mId; + + LauncherLatencyEvent(int id) { + mId = id; + } + + @Override + public int getId() { + return mId; + } + } + /** * Launcher specific ranking related events. */ @@ -807,7 +840,10 @@ public class StatsLogManager implements ResourceBasedOverride { CONTROLLED(7), CACHED(8), // example: device is rebooting via power key or shell command `adb reboot` - COLD_DEVICE_REBOOTING(9); + COLD_DEVICE_REBOOTING(9), + // Tracking warm startup latency: + // https://developer.android.com/topic/performance/vitals/launch-time#warm + WARM(10); private final int mId; LatencyType(int id) { diff --git a/src/com/android/launcher3/model/BaseLauncherBinder.java b/src/com/android/launcher3/model/BaseLauncherBinder.java index c946e2c2e2..ba9eb20073 100644 --- a/src/com/android/launcher3/model/BaseLauncherBinder.java +++ b/src/com/android/launcher3/model/BaseLauncherBinder.java @@ -78,14 +78,14 @@ public abstract class BaseLauncherBinder { /** * Binds all loaded data to actual views on the main thread. */ - public void bindWorkspace(boolean incrementBindId) { + public void bindWorkspace(boolean incrementBindId, boolean isBindSync) { if (FeatureFlags.ENABLE_WORKSPACE_LOADING_OPTIMIZATION.get()) { DisjointWorkspaceBinder workspaceBinder = initWorkspaceBinder(incrementBindId, mBgDataModel.collectWorkspaceScreens()); - workspaceBinder.bindCurrentWorkspacePages(); + workspaceBinder.bindCurrentWorkspacePages(isBindSync); workspaceBinder.bindOtherWorkspacePages(); } else { - bindWorkspaceAllAtOnce(incrementBindId); + bindWorkspaceAllAtOnce(incrementBindId, isBindSync); } } @@ -108,13 +108,13 @@ public abstract class BaseLauncherBinder { } } - private void bindWorkspaceAllAtOnce(boolean incrementBindId) { + private void bindWorkspaceAllAtOnce(boolean incrementBindId, boolean isBindSync) { // Save a copy of all the bg-thread collections ArrayList<ItemInfo> workspaceItems = new ArrayList<>(); ArrayList<LauncherAppWidgetInfo> appWidgets = new ArrayList<>(); final IntArray orderedScreenIds = new IntArray(); ArrayList<FixedContainerItems> extraItems = new ArrayList<>(); - + final int workspaceItemCount; synchronized (mBgDataModel) { workspaceItems.addAll(mBgDataModel.workspaceItems); appWidgets.addAll(mBgDataModel.appWidgets); @@ -124,11 +124,13 @@ public abstract class BaseLauncherBinder { mBgDataModel.lastBindId++; } mMyBindingId = mBgDataModel.lastBindId; + workspaceItemCount = mBgDataModel.itemsIdMap.size(); } for (Callbacks cb : mCallbacksList) { new UnifiedWorkspaceBinder(cb, mUiExecutor, mApp, mBgDataModel, mMyBindingId, - workspaceItems, appWidgets, extraItems, orderedScreenIds).bind(); + workspaceItems, appWidgets, extraItems, orderedScreenIds) + .bind(isBindSync, workspaceItemCount); } } @@ -246,7 +248,7 @@ public abstract class BaseLauncherBinder { mOrderedScreenIds = orderedScreenIds; } - private void bind() { + private void bind(boolean isBindSync, int workspaceItemCount) { final IntSet currentScreenIds = mCallbacks.getPagesToBindSynchronously(mOrderedScreenIds); Objects.requireNonNull(currentScreenIds, "Null screen ids provided by " + mCallbacks); @@ -297,7 +299,8 @@ public abstract class BaseLauncherBinder { executeCallbacksTask( c -> { MODEL_EXECUTOR.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); - c.onInitialBindComplete(currentScreenIds, pendingTasks); + c.onInitialBindComplete( + currentScreenIds, pendingTasks, workspaceItemCount, isBindSync); }, mUiExecutor); mCallbacks.bindStringCache(mBgDataModel.stringCache.clone()); @@ -361,18 +364,19 @@ public abstract class BaseLauncherBinder { * loaded, it will bind all workspace items immediately, and bindOtherWorkspacePages() will * not bind any items. */ - protected void bindCurrentWorkspacePages() { + protected void bindCurrentWorkspacePages(boolean isBindSync) { // Save a copy of all the bg-thread collections ArrayList<ItemInfo> workspaceItems; ArrayList<LauncherAppWidgetInfo> appWidgets; ArrayList<FixedContainerItems> fciList = new ArrayList<>(); - + final int workspaceItemCount; synchronized (mBgDataModel) { workspaceItems = new ArrayList<>(mBgDataModel.workspaceItems); appWidgets = new ArrayList<>(mBgDataModel.appWidgets); if (!FeatureFlags.CHANGE_MODEL_DELEGATE_LOADING_ORDER.get()) { mBgDataModel.extraItems.forEach(fciList::add); } + workspaceItemCount = mBgDataModel.itemsIdMap.size(); } workspaceItems.forEach(it -> mBoundItemIds.add(it.id)); @@ -395,10 +399,10 @@ public abstract class BaseLauncherBinder { bindWorkspaceItems(workspaceItems); bindAppWidgets(appWidgets); - executeCallbacksTask(c -> { MODEL_EXECUTOR.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); - c.onInitialBindComplete(mCurrentScreenIds, new RunnableList()); + c.onInitialBindComplete( + mCurrentScreenIds, new RunnableList(), workspaceItemCount, isBindSync); }, mUiExecutor); } diff --git a/src/com/android/launcher3/model/BgDataModel.java b/src/com/android/launcher3/model/BgDataModel.java index 0e3b06c20f..0861e9d51a 100644 --- a/src/com/android/launcher3/model/BgDataModel.java +++ b/src/com/android/launcher3/model/BgDataModel.java @@ -484,7 +484,9 @@ public class BgDataModel { default void bindWorkspaceComponentsRemoved(Predicate<ItemInfo> matcher) { } default void bindAllWidgets(List<WidgetsListBaseEntry> widgets) { } - default void onInitialBindComplete(IntSet boundPages, RunnableList pendingTasks) { + /** Called when workspace has been bound. */ + default void onInitialBindComplete(IntSet boundPages, RunnableList pendingTasks, + int workspaceItemCount, boolean isBindSync) { pendingTasks.executeAllAndDestroy(); } diff --git a/src/com/android/launcher3/model/LoaderTask.java b/src/com/android/launcher3/model/LoaderTask.java index 481cc6e322..9053d19f84 100644 --- a/src/com/android/launcher3/model/LoaderTask.java +++ b/src/com/android/launcher3/model/LoaderTask.java @@ -232,7 +232,7 @@ public class LoaderTask implements Runnable { } verifyNotStopped(); - mLauncherBinder.bindWorkspace(true /* incrementBindId */); + mLauncherBinder.bindWorkspace(true /* incrementBindId */, /* isBindSync= */ false); logASplit(timingLogger, "bindWorkspace"); mModelDelegate.workspaceLoadComplete(); diff --git a/src/com/android/launcher3/util/LockedUserState.kt b/src/com/android/launcher3/util/LockedUserState.kt index f5e13d2487..1231604780 100644 --- a/src/com/android/launcher3/util/LockedUserState.kt +++ b/src/com/android/launcher3/util/LockedUserState.kt @@ -7,6 +7,7 @@ import android.os.UserManager import androidx.annotation.VisibleForTesting class LockedUserState(private val mContext: Context) : SafeCloseable { + val isUserUnlockedAtLauncherStartup: Boolean var isUserUnlocked: Boolean private set private val mUserUnlockedActions: RunnableList = RunnableList() @@ -20,10 +21,17 @@ class LockedUserState(private val mContext: Context) : SafeCloseable { } init { + // 1) when user reboots devices, launcher process starts at lock screen and both + // isUserUnlocked and isUserUnlockedAtLauncherStartup are init as false. After user unlocks + // screen, isUserUnlocked will be updated to true via Intent.ACTION_USER_UNLOCKED, + // yet isUserUnlockedAtLauncherStartup will remains as false. + // 2) when launcher process restarts after user has unlocked screen, both variable are + // init as true and will not change. isUserUnlocked = mContext .getSystemService(UserManager::class.java)!! .isUserUnlocked(Process.myUserHandle()) + isUserUnlockedAtLauncherStartup = isUserUnlocked if (isUserUnlocked) { notifyUserUnlocked() } else { diff --git a/src/com/android/launcher3/util/LogConfig.java b/src/com/android/launcher3/util/LogConfig.java index 5abf95c000..04f83b9707 100644 --- a/src/com/android/launcher3/util/LogConfig.java +++ b/src/com/android/launcher3/util/LogConfig.java @@ -55,4 +55,9 @@ public class LogConfig { * When turned on, we enable quick launch v2 related logging. */ public static final String QUICK_LAUNCH_V2 = "QuickLaunchV2"; + + /** + * When turned on, we enable Gms Play related logging. + */ + public static final String GMS_PLAY = "GmsPlay"; } diff --git a/src/com/android/launcher3/views/AbstractSlideInView.java b/src/com/android/launcher3/views/AbstractSlideInView.java index 99616f15b9..ec7ec0b6c0 100644 --- a/src/com/android/launcher3/views/AbstractSlideInView.java +++ b/src/com/android/launcher3/views/AbstractSlideInView.java @@ -99,7 +99,7 @@ public abstract class AbstractSlideInView<T extends Context & ActivityContext> protected @Nullable OnCloseListener mOnCloseBeginListener; protected List<OnCloseListener> mOnCloseListeners = new ArrayList<>(); - private final AnimatedFloat mSlideInViewScale = + protected final AnimatedFloat mSlideInViewScale = new AnimatedFloat(this::onScaleProgressChanged, VIEW_NO_SCALE); protected boolean mIsBackProgressing; @Nullable private Drawable mContentBackground; diff --git a/src/com/android/launcher3/widget/DatabaseWidgetPreviewLoader.java b/src/com/android/launcher3/widget/DatabaseWidgetPreviewLoader.java index 7030f6dede..6f74fd965a 100644 --- a/src/com/android/launcher3/widget/DatabaseWidgetPreviewLoader.java +++ b/src/com/android/launcher3/widget/DatabaseWidgetPreviewLoader.java @@ -146,8 +146,7 @@ public class DatabaseWidgetPreviewLoader { previewWidth = drawable.getIntrinsicWidth(); previewHeight = drawable.getIntrinsicHeight(); } else { - Size widgetSize = WidgetSizes.getWidgetPaddedSizePx(mContext, info.provider, dp, spanX, - spanY); + Size widgetSize = WidgetSizes.getWidgetSizePx(dp, spanX, spanY); previewWidth = widgetSize.getWidth(); previewHeight = widgetSize.getHeight(); } diff --git a/src/com/android/launcher3/widget/LauncherAppWidgetProviderInfo.java b/src/com/android/launcher3/widget/LauncherAppWidgetProviderInfo.java index bba1016f34..10aef9ac66 100644 --- a/src/com/android/launcher3/widget/LauncherAppWidgetProviderInfo.java +++ b/src/com/android/launcher3/widget/LauncherAppWidgetProviderInfo.java @@ -2,7 +2,6 @@ package com.android.launcher3.widget; import static com.android.launcher3.Utilities.ATLEAST_S; -import android.appwidget.AppWidgetHostView; import android.appwidget.AppWidgetProviderInfo; import android.content.ComponentName; import android.content.Context; @@ -105,44 +104,35 @@ public class LauncherAppWidgetProviderInfo extends AppWidgetProviderInfo int spanX = 0; int spanY = 0; - Rect widgetPadding = new Rect(); - Rect localPadding = new Rect(); - AppWidgetHostView.getDefaultPaddingForWidget(context, provider, widgetPadding); Point cellSize = new Point(); for (DeviceProfile dp : idp.supportedProfiles) { dp.getCellSize(cellSize); - // We want to account for the extra amount of padding that we are adding to the widget - // to ensure that it gets the full amount of space that it has requested. - // If grids supports insetting widgets, we do not account for widget padding. - if (dp.shouldInsetWidgets()) { - localPadding.setEmpty(); - } else { - localPadding.set(widgetPadding); - } + Rect widgetPadding = dp.widgetPadding; + minSpanX = Math.max(minSpanX, - getSpanX(localPadding, minResizeWidth, dp.cellLayoutBorderSpacePx.x, + getSpanX(widgetPadding, minResizeWidth, dp.cellLayoutBorderSpacePx.x, cellSize.x)); minSpanY = Math.max(minSpanY, - getSpanY(localPadding, minResizeHeight, dp.cellLayoutBorderSpacePx.y, + getSpanY(widgetPadding, minResizeHeight, dp.cellLayoutBorderSpacePx.y, cellSize.y)); if (ATLEAST_S) { if (maxResizeWidth > 0) { - maxSpanX = Math.min(maxSpanX, getSpanX(localPadding, maxResizeWidth, + maxSpanX = Math.min(maxSpanX, getSpanX(widgetPadding, maxResizeWidth, dp.cellLayoutBorderSpacePx.x, cellSize.x)); } if (maxResizeHeight > 0) { - maxSpanY = Math.min(maxSpanY, getSpanY(localPadding, maxResizeHeight, + maxSpanY = Math.min(maxSpanY, getSpanY(widgetPadding, maxResizeHeight, dp.cellLayoutBorderSpacePx.y, cellSize.y)); } } spanX = Math.max(spanX, - getSpanX(localPadding, minWidth, dp.cellLayoutBorderSpacePx.x, + getSpanX(widgetPadding, minWidth, dp.cellLayoutBorderSpacePx.x, cellSize.x)); spanY = Math.max(spanY, - getSpanY(localPadding, minHeight, dp.cellLayoutBorderSpacePx.y, + getSpanY(widgetPadding, minHeight, dp.cellLayoutBorderSpacePx.y, cellSize.y)); } @@ -184,15 +174,22 @@ public class LauncherAppWidgetProviderInfo extends AppWidgetProviderInfo } private int getSpanX(Rect widgetPadding, int widgetWidth, int cellSpacing, float cellWidth) { - return Math.max(1, (int) Math.ceil( - (widgetWidth + widgetPadding.left + widgetPadding.right + cellSpacing) / (cellWidth - + cellSpacing))); + return getSpan(widgetPadding.left + widgetPadding.right, + widgetWidth, cellSpacing, cellWidth); } private int getSpanY(Rect widgetPadding, int widgetHeight, int cellSpacing, float cellHeight) { + return getSpan(widgetPadding.top + widgetPadding.bottom, widgetHeight, + cellSpacing, cellHeight); + } + + /** + * Solving the equation: + * n * cellSize + (n - 1) * cellSpacing - widgetPadding = widgetSize + */ + private int getSpan(int widgetPadding, int widgetSize, int cellSpacing, float cellSize) { return Math.max(1, (int) Math.ceil( - (widgetHeight + widgetPadding.top + widgetPadding.bottom + cellSpacing) / ( - cellHeight + cellSpacing))); + (widgetSize + widgetPadding + cellSpacing) / (cellSize + cellSpacing))); } public String getLabel(PackageManager packageManager) { diff --git a/src/com/android/launcher3/widget/NavigableAppWidgetHostView.java b/src/com/android/launcher3/widget/NavigableAppWidgetHostView.java index 3389fb121f..f46b2146a8 100644 --- a/src/com/android/launcher3/widget/NavigableAppWidgetHostView.java +++ b/src/com/android/launcher3/widget/NavigableAppWidgetHostView.java @@ -25,7 +25,6 @@ import android.view.View; import android.view.ViewDebug; import android.view.ViewGroup; -import com.android.launcher3.DeviceProfile; import com.android.launcher3.Reorderable; import com.android.launcher3.dragndrop.DraggableView; import com.android.launcher3.util.MultiTranslateDelegate; @@ -48,13 +47,13 @@ public abstract class NavigableAppWidgetHostView extends AppWidgetHostView private float mScaleForReorderBounce = 1f; - private final Rect mTempRect = new Rect(); - @ViewDebug.ExportedProperty(category = "launcher") private boolean mChildrenFocused; protected final ActivityContext mActivity; + private boolean mDisableSetPadding = false; + public NavigableAppWidgetHostView(Context context) { super(context); mActivity = ActivityContext.lookupContext(context); @@ -147,6 +146,22 @@ public abstract class NavigableAppWidgetHostView extends AppWidgetHostView } @Override + public void setAppWidget(int appWidgetId, AppWidgetProviderInfo info) { + // Prevent default padding being set on the view based on provider info. Launcher manages + // its own widget spacing + mDisableSetPadding = true; + super.setAppWidget(appWidgetId, info); + mDisableSetPadding = false; + } + + @Override + public void setPadding(int left, int top, int right, int bottom) { + if (!mDisableSetPadding) { + super.setPadding(left, top, right, bottom); + } + } + + @Override public boolean dispatchUnhandledMove(View focused, int direction) { return mChildrenFocused; } @@ -195,26 +210,6 @@ public abstract class NavigableAppWidgetHostView extends AppWidgetHostView public void getWorkspaceVisualDragBounds(Rect bounds) { int width = (int) (getMeasuredWidth() * mScaleToFit); int height = (int) (getMeasuredHeight() * mScaleToFit); - - getWidgetInset(mActivity.getDeviceProfile(), mTempRect); - bounds.set(mTempRect.left, mTempRect.top, width - mTempRect.right, - height - mTempRect.bottom); - } - - /** - * Widgets have padding added by the system. We may choose to inset this padding if the grid - * supports it. - */ - public void getWidgetInset(DeviceProfile grid, Rect out) { - if (!grid.shouldInsetWidgets()) { - out.setEmpty(); - return; - } - AppWidgetProviderInfo info = getAppWidgetInfo(); - if (info == null) { - out.set(grid.inv.defaultWidgetPadding); - } else { - AppWidgetHostView.getDefaultPaddingForWidget(getContext(), info.provider, out); - } + bounds.set(0, 0, width, height); } } diff --git a/src/com/android/launcher3/widget/PendingItemDragHelper.java b/src/com/android/launcher3/widget/PendingItemDragHelper.java index 410a555896..67d21f7608 100644 --- a/src/com/android/launcher3/widget/PendingItemDragHelper.java +++ b/src/com/android/launcher3/widget/PendingItemDragHelper.java @@ -16,6 +16,8 @@ package com.android.launcher3.widget; +import static com.android.launcher3.widget.util.WidgetSizes.getWidgetSizePx; + import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; @@ -43,7 +45,6 @@ import com.android.launcher3.icons.FastBitmapDrawable; import com.android.launcher3.icons.LauncherIcons; import com.android.launcher3.icons.RoundDrawableWrapper; import com.android.launcher3.widget.dragndrop.AppWidgetHostViewDragListener; -import com.android.launcher3.widget.util.WidgetSizes; /** * Extension of {@link DragPreviewProvider} with logic specific to pending widgets/shortcuts @@ -121,13 +122,8 @@ public class PendingItemDragHelper extends DragPreviewProvider { mAppWidgetHostViewPreview.setAppWidget(/* appWidgetId= */ -1, ((PendingAddWidgetInfo) mAddInfo).info); DeviceProfile deviceProfile = launcher.getDeviceProfile(); - Rect padding = new Rect(); - mAppWidgetHostViewPreview.getWidgetInset(deviceProfile, padding); - mAppWidgetHostViewPreview.setPadding(padding.left, padding.top, padding.right, - padding.bottom); mAppWidgetHostViewPreview.updateAppWidget(/* remoteViews= */ mRemoteViewsPreview); - Size widgetSizes = WidgetSizes.getWidgetPaddedSizePx(launcher, - mAddInfo.componentName, deviceProfile, mAddInfo.spanX, mAddInfo.spanY); + Size widgetSizes = getWidgetSizePx(deviceProfile, mAddInfo.spanX, mAddInfo.spanY); mAppWidgetHostViewPreview.measure( MeasureSpec.makeMeasureSpec(widgetSizes.getWidth(), MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(widgetSizes.getHeight(), MeasureSpec.EXACTLY)); diff --git a/src/com/android/launcher3/widget/util/WidgetSizes.java b/src/com/android/launcher3/widget/util/WidgetSizes.java index 601c1b543e..7049509bd2 100644 --- a/src/com/android/launcher3/widget/util/WidgetSizes.java +++ b/src/com/android/launcher3/widget/util/WidgetSizes.java @@ -15,8 +15,6 @@ */ package com.android.launcher3.widget.util; -import static android.appwidget.AppWidgetHostView.getDefaultPaddingForWidget; - import android.appwidget.AppWidgetHostView; import android.appwidget.AppWidgetManager; import android.content.ComponentName; @@ -28,8 +26,6 @@ import android.util.Log; import android.util.Size; import android.util.SizeF; -import androidx.annotation.Nullable; - import com.android.launcher3.DeviceProfile; import com.android.launcher3.LauncherAppState; import com.android.launcher3.R; @@ -43,24 +39,13 @@ public final class WidgetSizes { /** * Returns the list of all possible sizes, in dp, for a widget of given spans on this device. - * - * <p>The returned sizes already take into account the system padding, and whether it is applied - * or not in that specific configuration. */ - public static ArrayList<SizeF> getWidgetPaddedSizes(Context context, ComponentName provider, - int spanX, int spanY) { - Rect padding = getDefaultPaddingForWidget(context, provider, /* padding= */ null); - + public static ArrayList<SizeF> getWidgetSizesDp(Context context, int spanX, int spanY) { ArrayList<SizeF> sizes = new ArrayList<>(2); final float density = context.getResources().getDisplayMetrics().density; - final Point cellSize = new Point(); for (DeviceProfile profile : LauncherAppState.getIDP(context).supportedProfiles) { - Size widgetSizePx = getWidgetSizePx(profile, spanX, spanY, cellSize); - if (!profile.shouldInsetWidgets()) { - widgetSizePx = new Size(widgetSizePx.getWidth() - padding.left - padding.right, - widgetSizePx.getHeight() - padding.top - padding.bottom); - } + Size widgetSizePx = getWidgetSizePx(profile, spanX, spanY); sizes.add(new SizeF(widgetSizePx.getWidth() / density, widgetSizePx.getHeight() / density)); } @@ -69,21 +54,15 @@ public final class WidgetSizes { /** Returns the size, in pixels, a widget of given spans & {@code profile}. */ public static Size getWidgetSizePx(DeviceProfile profile, int spanX, int spanY) { - return getWidgetSizePx(profile, spanX, spanY, /* recycledCellSize= */ null); - } + final int hBorderSpacing = (spanX - 1) * profile.cellLayoutBorderSpacePx.x; + final int vBorderSpacing = (spanY - 1) * profile.cellLayoutBorderSpacePx.y; - /** - * Returns the size, in pixels and removing padding, a widget of given spans & {@code profile}. - */ - public static Size getWidgetPaddedSizePx(Context context, ComponentName component, - DeviceProfile profile, int spanX, int spanY) { - Size size = getWidgetSizePx(profile, spanX, spanY); - if (profile.shouldInsetWidgets()) { - return size; - } - Rect padding = getDefaultPaddingForWidget(context, component, /* padding= */ null); - return new Size(size.getWidth() - padding.left - padding.right, - size.getHeight() - padding.top - padding.bottom); + Point cellSize = profile.getCellSize(); + Rect padding = profile.widgetPadding; + + return new Size( + (spanX * cellSize.x) + hBorderSpacing - padding.left - padding.right, + (spanY * cellSize.y) + vBorderSpacing - padding.top - padding.bottom); } /** @@ -92,8 +71,7 @@ public final class WidgetSizes { * <p>This size is used by the widget picker. It should NEVER be shared with app widgets. * * <p>For sizes shared with app widgets, please refer to - * {@link #getWidgetPaddedSizes(Context, ComponentName, int, int)} & - * {@link #getWidgetPaddedSizePx(Context, ComponentName, DeviceProfile, int, int)}. + * {@link #getWidgetSizesDp(Context, int, int)} & */ public static Size getWidgetItemSizePx(Context context, DeviceProfile profile, WidgetItem widgetItem) { @@ -102,27 +80,7 @@ public final class WidgetSizes { .getDimensionPixelSize(R.dimen.widget_preview_shortcut_padding); return new Size(dimension, dimension); } - Size widgetItemSize = getWidgetSizePx(profile, widgetItem.spanX, - widgetItem.spanY, /* recycledCellSize= */ null); - if (profile.shouldInsetWidgets()) { - Rect inset = new Rect(); - AppWidgetHostView.getDefaultPaddingForWidget(context, widgetItem.componentName, inset); - return new Size(widgetItemSize.getWidth() + inset.left + inset.right, - widgetItemSize.getHeight() + inset.top + inset.bottom); - } - return widgetItemSize; - } - - private static Size getWidgetSizePx(DeviceProfile profile, int spanX, int spanY, - @Nullable Point recycledCellSize) { - final int hBorderSpacing = (spanX - 1) * profile.cellLayoutBorderSpacePx.x; - final int vBorderSpacing = (spanY - 1) * profile.cellLayoutBorderSpacePx.y; - if (recycledCellSize == null) { - recycledCellSize = new Point(); - } - profile.getCellSize(recycledCellSize); - return new Size(((spanX * recycledCellSize.x) + hBorderSpacing), - ((spanY * recycledCellSize.y) + vBorderSpacing)); + return getWidgetSizePx(profile, widgetItem.spanX, widgetItem.spanY); } /** @@ -154,7 +112,7 @@ public final class WidgetSizes { */ public static Bundle getWidgetSizeOptions(Context context, ComponentName provider, int spanX, int spanY) { - ArrayList<SizeF> paddedSizes = getWidgetPaddedSizes(context, provider, spanX, spanY); + ArrayList<SizeF> paddedSizes = getWidgetSizesDp(context, spanX, spanY); Rect rect = getMinMaxSizes(paddedSizes); Bundle options = new Bundle(); diff --git a/tests/assets/ReorderAlgorithmUnitTest/reorder_algorithm_test_cases b/tests/assets/ReorderAlgorithmUnitTest/reorder_algorithm_test_cases new file mode 100644 index 0000000000..6f92d6c7a8 --- /dev/null +++ b/tests/assets/ReorderAlgorithmUnitTest/reorder_algorithm_test_cases @@ -0,0 +1,1804 @@ +################################################################################################### +# This file contains test case composed of the following tags: +# * # (coments): Lines starting with this character would be ignored. +# * arguments: is set of words separated by spaces that can later be parsed +# * board: represent a workspace, the first line is the dimensions of the board width x height (wxh) +# There are different characters on the board that represent different things: +# * x: The x character represents spaces that would be ignored, for example it can be used in +# the first row if we don't know how wide the smartspace is. +# * i: Represents an icon on the workspace, none in particular just an icon +# * [a-z]: Represents a widget and it can be any number or character +# except any other already in use. The whole continuos are of the same character is the +# area of the widget. +# * [A-Z]: Represents a folder and number of icons in the folder is represented by the order of +# letter in the alphabet, A=2, B=3, C=4 ... etc. +# +# The "arguments:" tag represents where you want to add an item, the format is: +# "x y spanX spanY minSpanX minSpanY type<widget/icon/folder> ifSolutionIsPossible<valid/invalid>" +# +# Test are parsed by CellLayoutTestCaseReader.java and boards are parsed by CellLayoutBoard.java +################################################################################################### +# Test 0 +board: 7x10 +-----de +-----de +-----di +-----ii +-----ii +-----ci +-----ci +-----ii +aaaaaai +iibbbbi +# This represents where you want to add an item, the format is "x y spanX spanY minSpanX minSpanY type<widget/icon/folder> ifSolutionIsPossible<valid/invalid>" +arguments: 1 3 5 4 4 1 widget valid +board: 7x10 +-----cb +-----cb +-----ci +izzzzzi +izzzzzi +azzzzzi +azzzzzi +-----ii +ddddddi +iieeeei +# Test 1 +board: 9x10 +aaaaaaaai +i-----hhj +c-----hhj +c-----hhi +c-----iii +i-----iii +beddddddi +befffffii +iifffffii +iiggggggi +arguments: 3 3 4 6 1 2 widget valid +board: 9x10 +ggggggggi +i-zzzzffe +h-zzzzffe +h-zzzzffi +h-zzzziii +i-zzzziii +dcbbbbbbi +dcaaaaaii +iiaaaaaii +iijjjjjji +# Test 2 +board: 7x6 +aiii--f +acci--f +addi--f +iebi--i +iebiiii +iiiiiii +arguments: 1 1 1 1 1 1 icon valid +board: 7x6 +aiii--f +azeei-f +abbi--f +icdi--i +icdiiii +iiiiiii +# Test 3 +board: 4x10 +-ibg +-ibg +-ibi +-idf +-cdf +-cdi +-cei +-cei +-iii +aaai +arguments: 2 1 1 5 1 1 widget valid +board: 4x10 +if-c +ifzc +ifzi +igzb +egzb +egzi +e-di +e-di +-iii +aaai +# Test 4 +board: 8x8 +i---c--- +a---c--- +a---i--- +ibbbi--- +-------- +-------- +----i--- +ii--i--- +arguments: 1 1 3 6 1 4 widget valid +board: 8x8 +i---c--- +azzzc--- +azzzi--- +izzzbbbi +-zzz---- +-zzz---- +-zzzi--- +ii--i--- +# Test 5 +board: 10x8 +aaaaaaaaai +bbbbbcciii +---------f +---------f +---------f +---------i +iiddddddii +iieeiiiiii +arguments: 2 5 7 1 3 1 widget valid +board: 10x8 +bbbbbbbbbi +eeeeecciii +---------a +---------a +---------a +--zzzzzzzi +iiddddddii +iiffiiiiii +# Test 6 +board: 8x7 +-------i +bbcaaaah +bbcaaaah +bbcaaaai +bbcddddi +bbieeeii +iiiffggi +arguments: 5 1 1 2 1 1 icon valid +board: 8x7 +-----z-i +bbfaaaad +bbfaaaad +bbfaaaai +bbfhhhhi +bbigggii +iiieecci +# Test 7 +board: 10x3 +ii-------i +---------- +-ii----iii +arguments: 1 0 7 1 2 1 widget valid +board: 10x3 +izzzzzzzii +---------- +-ii----iii +# Test 8 +board: 8x9 +aaaaaiii +ibbbbbii +-----ffi +-----eei +-----hhi +-----ggi +-----jji +iiccccii +iidddddi +arguments: 2 2 5 2 3 1 widget valid +board: 8x9 +fffffiii +ihhhhhii +bbzzzzzi +jjzzzzzi +-----ggi +-----cci +-----aai +iiddddii +iieeeeei +# Test 9 +board: 4x8 +--ci +--cd +--cd +--ci +--ii +aaai +aaai +bbbi +arguments: 1 4 2 1 2 1 widget valid +board: 4x8 +--bi +--bc +--bc +--bi +izzi +aaai +aaai +dddi +# Test 10 +board: 8x3 +i----cci +iaaaaaai +iiibbbbi +arguments: 2 1 2 1 1 1 widget valid +board: 8x3 +i-zz-cci +ibbbbbbi +iiiaaaai +# Test 11 +board: 5x10 +----- +----- +----- +----- +----- +----- +----- +----- +i---i +iaaai +arguments: 0 3 3 6 1 2 widget valid +board: 5x10 +----- +----- +----- +zzz-- +zzz-- +zzz-- +zzz-- +zzz-- +zzzii +iaaai +# Test 12 +board: 6x10 +aad-ii +aad-ii +aai-eg +aac-eg +aac-ei +aac-ef +aai-ef +aai-ei +aai-ii +bbiiii +arguments: 1 5 1 4 1 3 widget valid +board: 6x10 +ccb-ii +ccb-ii +cci-fa +cce-fa +cce-fi +ccezfg +ccizfg +ccizfi +ccizii +ddiiii +# Test 13 +board: 10x10 +iaaaaaaiii +i-------ii +i-------ii +i-------ei +i-------ei +b-------ei +b-------ei +b-------ii +biccccccci +iiddddddii +arguments: 0 2 6 1 3 1 widget valid +board: 10x10 +iaaaaaaiii +i-------ii +zzzzzzi-ii +i-------ci +i-------ci +e-------ci +e-------ci +e-------ii +eibbbbbbbi +iiddddddii +# Test 14 +board: 3x6 +--a +--a +--a +--a +--i +iii +arguments: 0 2 1 3 1 3 widget valid +board: 3x6 +--a +--a +z-a +z-a +z-i +iii +# Test 15 +board: 6x7 +------ +-i---i +-i---c +ia---c +ia---i +ia---i +iibbbi +arguments: 2 0 2 3 2 1 widget valid +board: 6x7 +--zz-- +-izz-i +-izz-b +ia---b +ia---i +ia---i +iiccci +# Test 16 +board: 8x6 +bbbiiddi +icccccci +aaaggiii +eeeeeffi +ii----ii +iiihhhhi +arguments: 3 3 2 1 1 1 widget valid +board: 8x6 +ccciiffi +ieeeeeei +ggghhiii +aaaaaddi +ii-zz-ii +iiibbbbi +# Test 17 +board: 4x9 +---i +---i +---d +---d +---i +---i +ibbi +iaai +icci +arguments: 0 2 1 6 1 1 widget valid +board: 4x9 +i--i +i--i +z--d +z--d +z--i +z--i +zaai +zbbi +icci +# Test 18 +board: 7x5 +iaaaaai +----iii +----iii +iiibbbi +iiiccii +arguments: 2 0 4 1 3 1 widget valid +board: 7x5 +ibbbbbi +zzzziii +----iii +iiiccci +iiiaaii +# Test 19 +board: 6x4 +aaaaii +bbi--i +cci--i +iiiddi +arguments: 4 0 1 2 1 1 widget valid +board: 6x4 +cccczi +aai-zi +bbi-ii +iiiddi +# Test 20 +board: 8x5 +bbiaeeei +bbiaiffi +cciddddi +----hhii +iigggggi +arguments: 0 1 1 3 1 1 widget valid +board: 8x5 +bbieccci +bbieiddi +z-iffffi +zaa-ggii +iihhhhhi +# Test 21 +board: 5x4 +i--ii +a--ii +aicci +iibbi +arguments: 1 2 2 1 1 1 widget valid +board: 5x4 +iaaii +bi-ii +bzz-i +iicci +# Test 22 +board: 4x10 +---i +---d +---d +---d +---i +aaai +aaai +aaai +bbbi +ccci +arguments: 2 0 1 1 1 1 icon valid +board: 4x10 +--zi +---d +---d +---d +---i +bbbi +bbbi +bbbi +ccci +aaai +# Test 23 +board: 10x10 +---------- +---------- +---------- +---------- +---------- +---------- +---------- +---------- +---------- +--aaai---i +arguments: 0 0 8 5 5 4 widget valid +board: 10x10 +zzzzzzzz-- +zzzzzzzz-- +zzzzzzzz-- +zzzzzzzz-- +zzzzzzzz-- +---------- +---------- +---------- +---------- +--aaai---i +# Test 24 +board: 4x9 +---b +---b +---b +---b +---b +---c +---c +---i +iaai +arguments: 2 0 1 2 1 1 widget valid +board: 4x9 +--zc +--zc +---c +---c +---c +---a +---a +---i +ibbi +# Test 25 +board: 4x5 +-cci +-bbi +-bbi +-iii +iaai +arguments: 0 1 1 1 1 1 icon valid +board: 4x5 +-bbi +zaai +-aai +-iii +icci +# Test 26 +board: 7x3 +a-----i +a-----i +ibbbbbi +arguments: 0 0 2 1 1 1 widget valid +board: 7x3 +zza---i +--a---i +ibbbbbi +# Test 27 +board: 8x6 +i-----di +------di +------ii +--bbbbii +i-iiccci +i--iiaai +arguments: 5 1 2 3 1 1 widget valid +board: 8x6 +i---d--i +----dzzi +----izzi +aaaaizzi +i-iiccci +i--iibbi +# Test 28 +board: 4x7 +---i +---i +---a +---a +---a +---i +iiii +arguments: 1 2 1 3 1 3 widget valid +board: 4x7 +---i +---i +-z-a +-z-a +-z-a +---i +iiii +# Test 29 +board: 5x10 +ii--b +ii--b +ai--i +ai--i +iiiii +----- +----- +----- +----- +----- +arguments: 1 2 2 5 1 4 widget valid +board: 5x10 +ii--a +ii--a +bzz-i +bzz-i +izzii +-zz-- +-zz-- +-i--- +-i--- +-ii-- +# Test 30 +board: 10x4 +a--------i +a--------i +i--------i +ibbbbbicci +arguments: 7 1 1 2 1 2 widget valid +board: 10x4 +b--------i +b------z-i +i------z-i +iaaaaaicci +# Test 31 +board: 5x3 +a--ii +a--ii +iiiii +arguments: 1 0 3 1 2 1 widget valid +board: 5x3 +azzzi +a-iii +iiiii +# Test 32 +board: 5x9 +----- +----- +----- +----- +----i +----b +----b +----i +aaaii +arguments: 1 0 2 7 2 1 widget valid +board: 5x9 +-zz-- +-zz-- +-zz-- +-zz-- +-zz-i +-zz-a +-zz-a +----i +bbbii +# Test 33 +board: 4x8 +icci +aaai +aaai +iiii +ibbi +---i +---i +dddi +arguments: 2 1 1 6 1 5 icon invalid +board: 4x8 +---- +---- +---- +---- +---- +---- +---- +---- +# Test 34 +board: 7x3 +------i +------i +iaaiiii +arguments: 0 1 4 1 1 1 widget valid +board: 7x3 +------i +zzzz--i +iaaiiii +# Test 35 +board: 5x4 +ii-bi +ai-bi +ai-ii +iiiii +arguments: 1 1 2 1 2 1 widget valid +board: 5x4 +iiiai +bzzai +bi-ii +iiiii +# Test 36 +board: 9x7 +iii--iiii +aai--bbbi +aai--bbbi +aai--ccii +iiiiiiiii +--------- +--------- +arguments: 1 1 6 2 4 2 widget valid +board: 9x7 +iii--iiii +-zzzzzz-i +-zzzzzz-i +bbi--aaai +bbiiiaaai +bbi--cci- +iii--iii- +# Test 37 +board: 6x9 +aai--i +-iii-i +iiiiii +-i---- +-ibbbi +-ibbbi +-iccci +-i---i +iidddi +arguments: 2 2 3 1 2 1 widget valid +board: 6x9 +ddi--i +-iii-i +iizzzi +-iiii- +-iaaai +-iaaai +-iccci +-i---i +iibbbi +# Test 38 +board: 10x6 +---------- +---------- +---------- +---------- +---------- +---------- +arguments: 0 0 6 4 1 2 widget valid +board: 10x6 +zzzzzz---- +zzzzzz---- +zzzzzz---- +zzzzzz---- +---------- +---------- +# Test 39 +board: 3x9 +-bc +-bc +-bd +-bd +-bi +-bi +-ii +aai +iii +arguments: 0 1 1 6 1 4 widget valid +board: 3x9 +-bd +zbd +zbc +zbc +zbi +zbi +zii +aai +iii +# Test 40 +board: 3x3 +--i +--i +aai +arguments: 1 0 1 1 1 1 icon valid +board: 3x3 +-zi +--i +aai +# Test 41 +board: 6x3 +-----i +------ +--i--- +arguments: 0 1 4 1 3 1 widget valid +board: 6x3 +-----i +zzzz-- +--i--- +# Test 42 +board: 5x5 +iaaai +---ii +iibbi +iicci +iiiii +arguments: 1 0 1 2 1 2 icon invalid +board: 5x5 +----- +----- +----- +----- +----- +# Test 43 +board: 3x6 +--i +--i +--b +--b +--i +aai +arguments: 1 2 1 3 1 3 widget valid +board: 3x6 +--i +--i +-za +-za +-zi +bbi +# Test 44 +board: 4x8 +---a +---a +---a +---a +---a +---i +iiii +iiii +arguments: 2 2 1 3 1 3 widget valid +board: 4x8 +---a +---a +--za +--za +--za +---i +iiii +iiii +# Test 45 +board: 9x9 +i-----kki +i-----kki +a-----kki +a-----kki +i-----lli +iicccibbj +idiffibbj +ideeiibbi +iigggihhi +arguments: 2 1 5 3 4 2 widget valid +board: 9x9 +i-----lli +izzzzzlli +fzzzzzlli +fzzzzzlli +i-----jji +iihhhikke +igiccikke +igbbiikki +iiaaaiddi +# Test 46 +board: 9x5 +ab---iggi +ab---iffi +ab---eeei +aicccccci +iiiidddii +arguments: 1 0 2 3 1 3 widget valid +board: 9x5 +bzze-iffi +bzze-iaai +bzze-dddi +bicccccci +iiiigggii +# Test 47 +board: 5x6 +ai--b +ai--b +ai--i +ai--i +iiiii +iiiii +arguments: 2 4 2 1 2 1 widget valid +board: 5x6 +bi--a +bi--a +bi--i +biiii +iizzi +iiiii +# Test 48 +board: 5x4 +----- +-i--- +----i +-iiii +arguments: 1 0 3 2 2 1 widget valid +board: 5x4 +-zzz- +-zzzi +----i +-iiii +# Test 49 +board: 6x3 +i---ii +i---ii +iiaaai +arguments: 2 0 1 1 1 1 icon valid +board: 6x3 +i-z-ii +i---ii +iiaaai +# Test 50 +board: 8x9 +-------- +-------- +-------- +-------- +-------- +-------- +-------- +-------- +-------- +arguments: 1 1 6 7 3 1 widget valid +board: 8x9 +-------- +-zzzzzz- +-zzzzzz- +-zzzzzz- +-zzzzzz- +-zzzzzz- +-zzzzzz- +-zzzzzz- +-------- +# Test 51 +board: 3x6 +--b +--b +--b +--i +iii +aai +arguments: 0 3 1 2 1 2 widget valid +board: 3x6 +--a +--a +i-a +z-i +zii +bbi +# Test 52 +board: 5x8 +a--df +a--df +a--di +a--ei +i--ei +i--ii +ibbbi +iccci +arguments: 1 3 1 3 1 2 widget valid +board: 5x8 +e--cb +e--cb +e--ci +ez-di +iz-di +iz-ii +iaaai +ifffi +# Test 53 +board: 8x3 +aaaai--i +iccci--i +bbbiiiii +arguments: 1 1 3 1 3 1 icon invalid +board: 8x3 +-------- +-------- +-------- +# Test 54 +board: 8x9 +------di +------di +------di +------ii +iaaaaaai +baaaaaai +baaaaaai +baaaaaai +iiccccci +arguments: 3 3 2 1 1 1 widget valid +board: 8x9 +------ai +------ai +------ai +---zz-ii +icccccci +bcccccci +bcccccci +bcccccci +iidddddi +# Test 55 +board: 4x8 +ibbi +iaai +iaai +caai +ciii +iddi +--ii +ieei +arguments: 1 4 1 1 1 1 icon valid +board: 4x8 +iaai +icci +icci +ecci +ezii +ibbi +-iii +iddi +# Test 56 +board: 6x9 +-----i +------ +-i---i +i----i +-----i +--icci +-i-bbi +-i-iii +iiaaai +arguments: 1 0 4 2 4 2 widget valid +board: 6x9 +-zzzzi +-zzzz- +-i---i +i----i +-----i +--icci +-i-bbi +-i-iii +iiaaai +# Test 57 +board: 4x9 +aaai +ibbi +c-ii +c-ei +c-ei +c-ii +c-ii +ciii +iddi +arguments: 1 6 2 2 2 2 widget valid +board: 4x9 +eeei +icci +d-ii +dibi +dibi +diii +dzzi +dzzi +iaai +# Test 58 +board: 3x6 +aai +iii +--b +--b +--i +iii +arguments: 0 1 1 1 1 1 icon valid +board: 3x6 +aai +zii +i-b +--b +--i +iii +# Test 59 +board: 9x6 +iiiiii--i +iaaeii--g +baaeii--g +baaiii--i +icciiiiii +iddiiiffi +arguments: 3 3 5 1 4 1 widget valid +board: 9x6 +iiiiii--i +ibbdiii-a +ebbdiiiia +ebbzzzzzi +icciiiiii +iffiiiggi +# Test 60 +board: 5x8 +iiiii +ii-ii +ai-ii +ai-ii +ai-ii +aibbi +iicci +iiiii +arguments: 2 0 2 2 1 2 widget valid +board: 5x8 +iizzi +iizzi +biiii +biiii +biiii +bicci +iiaai +iiiii +# Test 61 +board: 7x10 +------- +------- +------- +------- +------- +------- +------- +------- +------- +------- +arguments: 2 0 3 8 2 7 widget valid +board: 7x10 +--zzz-- +--zzz-- +--zzz-- +--zzz-- +--zzz-- +--zzz-- +--zzz-- +--zzz-- +------- +------- +# Test 62 +board: 8x8 +aaiiiiii +iiibbbbi +dddi---i +iiii---i +ccci---h +ccci---h +eeei---i +fffigggi +arguments: 1 4 4 2 1 1 widget valid +board: 8x8 +eeiiiiii +iiiaaaai +fffigggi +iiiigggi +-zzzzi-c +-zzzz--c +hhhii--i +dddibbbi +# Test 63 +board: 8x5 +ibbii--d +iiiii--d +aaaii--d +aaaii--i +cccciiii +arguments: 3 2 2 1 2 1 widget valid +board: 8x5 +ibbii--d +iiiii--d +ccczziid +cccii--i +aaaaiiii +# Test 64 +board: 9x5 +iiac--iii +iiac--ffi +biac--eei +biai--iii +iiiiddddi +arguments: 3 1 2 3 2 1 widget valid +board: 9x5 +iif--eiii +iifzzebbi +cifzzeaai +cifzziiii +iiiiddddi +# Test 65 +board: 6x7 +aaaiii +aaaiii +ibbcci +i----f +d----f +d----i +iieeei +arguments: 2 1 1 5 1 4 widget valid +board: 6x7 +aaaiii +aaaiii +i-zbbi +i-zeec +d-z--c +d-z--i +iifffi +# Test 66 +board: 10x10 +aaaaaaaaii +i---ijjjni +i---ijjjni +b---kjjjni +b---kjjjii +b---klliii +b---immmmi +bcccccccci +ieeiddiiii +iffiigghhi +arguments: 2 4 3 4 3 1 widget valid +board: 10x10 +aaaaaaaaii +i---innnci +i---innnci +hzzzknnnci +hzzzknnnii +hzzzkeeiii +hzzziffffi +hddddddddi +ijjilliiii +iggiimmbbi +# Test 67 +board: 3x8 +--i +--i +--i +bai +bai +iai +iai +iii +arguments: 0 0 1 2 1 1 widget valid +board: 3x8 +z-i +z-i +--i +bai +bai +iai +iai +iii +# Test 68 +board: 6x5 +i---ii +ibcaei +ibcaei +ibiaii +iiiddi +arguments: 4 1 1 3 1 1 icon valid +board: 6x5 +i--zii +icadbi +icadbi +icidii +iiieei +# Test 69 +board: 3x7 +a-i +a-b +a-b +a-b +a-i +i-i +iii +arguments: 0 0 1 4 1 1 widget valid +board: 3x7 +zbi +zba +zba +zba +-bi +i-i +iii +# Test 70 +board: 5x10 +---ii +---ii +---ii +aaaai +----- +----- +----- +----- +----- +----- +arguments: 0 5 3 4 3 1 widget valid +board: 5x10 +---ii +---ii +---ii +aaaai +----- +zzz-- +zzz-- +zzz-- +zzz-- +----- +# Test 71 +board: 8x9 +-----i-i +-------- +-------- +-------- +-------- +-------- +-------- +-------- +-------- +arguments: 2 3 5 5 1 4 widget valid +board: 8x9 +-----i-i +-------- +-------- +--zzzzz- +--zzzzz- +--zzzzz- +--zzzzz- +--zzzzz- +-------- +# Test 72 +board: 4x6 +i--d +a--d +a--i +acbi +acbi +iiii +arguments: 0 2 1 3 1 2 widget valid +board: 4x6 +iz-b +cz-b +cz-i +cadi +cadi +iiii +# Test 73 +board: 3x7 +--c +--c +--c +--i +bai +bai +iii +arguments: 1 0 1 2 1 1 widget valid +board: 3x7 +-zb +-zb +--b +--i +cai +cai +iii +# Test 74 +board: 4x7 +---i +---i +---b +---b +---b +---i +iaai +arguments: 2 2 1 3 1 1 widget valid +board: 4x7 +---i +---i +--zb +--zb +--zb +---i +iaai +# Test 75 +board: 4x3 +a--i +a--i +ibbi +arguments: 1 0 1 1 1 1 icon valid +board: 4x3 +bz-i +b--i +iaai +# Test 76 +board: 10x5 +--ai------ +--aii----i +--iii----i +--iii----i +iiiiiibbbi +arguments: 5 2 4 2 3 2 widget valid +board: 10x5 +--bi------ +--bii----i +--iiizzzzi +--iiizzzzi +iiiiiiaaai +# Test 77 +board: 8x10 +-------i +-------e +-------e +-------e +-------e +-------e +-------i +ccibbbii +iaaaaaai +iiiddddi +arguments: 4 2 3 5 3 1 widget valid +board: 8x10 +-------i +-------c +----zzzc +----zzzc +----zzzc +----zzzc +----zzzi +aaibbbii +iddddddi +iiieeeei +# Test 78 +board: 3x9 +aai +i-i +iii +--i +--- +--i +b-i +bii +iii +arguments: 1 1 1 7 1 6 widget valid +board: 3x9 +aai +izi +izi +izi +-z- +izi +bzi +bzi +iii +# Test 79 +board: 6x5 +aaii-i +--i--- +--i--i +iii--i +iiiiii +arguments: 2 3 3 1 3 1 widget valid +board: 6x5 +aaii-i +--i--- +--ii-i +iizzzi +iiiiii +# Test 80 +board: 6x4 +------ +------ +----ii +------ +arguments: 0 0 4 2 3 1 widget valid +board: 6x4 +zzzz-- +zzzz-- +----ii +------ +# Test 81 +board: 5x6 +aaaai +i--ii +b--ii +b--ii +b--ii +iiiii +arguments: 2 3 2 1 1 1 widget valid +board: 5x6 +aaaai +i--ii +b--ii +bizzi +b--ii +iiiii +# Test 82 +board: 6x8 +aaaaii +bbbbbi +icciii +-----i +-----i +ddfffi +ddgggi +eeeeei +arguments: 1 3 2 2 1 1 widget valid +board: 6x8 +bbbbii +gggggi +icciii +-zz--i +-zz--i +eedddi +eefffi +aaaaai +# Test 83 +board: 8x10 +iiaaaaai +------cd +------cd +------ci +------ii +iiiiibbi +-------- +-------- +-------- +-------- +arguments: 2 0 5 3 5 1 widget valid +board: 8x10 +iizzzzzi +--zzzzza +--zzzzza +--dddddi +------bi +iiiii-bi +------b- +------i- +-----cc- +-------- +# Test 84 +board: 6x6 +---aii +---aii +---bbi +---iii +--iiii +i----i +arguments: 2 0 3 4 1 3 widget valid +board: 6x6 +bizzzi +bizzzi +aazzzi +iizzzi +--iiii +i----i +# Test 85 +board: 4x7 +iaai +ii-i +ii-i +ii-i +iiii +---- +---i +arguments: 2 2 1 4 1 2 widget valid +board: 4x7 +iaai +ii-i +iizi +iizi +iizi +--z- +--ii +# Test 86 +board: 4x9 +---- +a--i +a--i +i--i +i--c +i--c +b--i +b--i +iiii +arguments: 0 0 2 7 2 7 widget valid +board: 4x9 +zz-- +zzbi +zzbi +zzii +zzia +zzia +zzci +--ci +iiii +# Test 87 +board: 5x6 +----- +-i--i +----- +----- +----- +----- +arguments: 0 0 3 3 1 2 widget valid +board: 5x6 +zzz-- +zzzii +zzz-- +----- +----- +----- +# Test 88 +board: 5x5 +ii--a +ii--a +-i--i +-i-ii +ii--i +arguments: 0 1 2 3 2 1 widget valid +board: 5x5 +iiiia +zz-ia +zz-ii +zz-ii +ii--i +# Test 89 +board: 5x10 +ccddi +bbbii +eeeei +iajji +faiii +fgggi +fgggi +ihhhi +----i +iikki +arguments: 1 3 1 4 1 2 icon invalid +board: 5x10 +----- +----- +----- +----- +----- +----- +----- +----- +----- +----- +# Test 90 +board: 3x6 +--i +--b +--b +--b +--i +aai +arguments: 1 0 1 2 1 1 widget valid +board: 3x6 +-zi +-za +--a +--a +--i +bbi +# Test 91 +board: 4x8 +---i +---c +---c +---c +---c +---i +aaai +bbbi +arguments: 1 1 1 2 1 2 widget valid +board: 4x8 +---i +-z-c +-z-c +---c +---c +---i +bbbi +aaai +# Test 92 +board: 5x7 +----c +----c +----c +----c +----i +aaaai +ibbii +arguments: 1 1 2 4 1 2 widget valid +board: 5x7 +----b +-zz-b +-zz-b +-zz-b +-zz-i +aaaai +iccii +# Test 93 +board: 5x4 +i--ii +i--ii +i--ii +iiiii +arguments: 2 1 1 2 1 2 widget valid +board: 5x4 +i--ii +i-zii +i-zii +iiiii +# Test 94 +board: 10x5 +aabc---iii +aabc---eei +aabi---ffi +aaii---ggi +iiiiiddddi +arguments: 4 1 3 3 1 3 widget valid +board: 10x5 +ggfe---iii +ggfezzzddi +ggfizzzbbi +ggiizzzaai +iiiiicccci +# Test 95 +board: 9x5 +baffi---i +baeei---i +caiii---i +ciddi---i +iiiiiggii +arguments: 0 0 4 3 3 1 widget valid +board: 9x5 +ezzzdccii +ezzzdggii +fzzzdiiii +fibbi---i +iiiiiaaii +# Test 96 +board: 7x7 +------- +--i---i +------- +------- +------i +------- +------i +arguments: 0 1 5 2 3 1 widget valid +board: 7x7 +------- +zzzzzii +zzzzz-- +------- +------i +------- +------i +# Test 97 +board: 10x4 +i-----ccii +a-----ccii +a-----iddi +iibbbiiiii +arguments: 7 2 1 1 1 1 icon valid +board: 10x4 +i-----ccii +d-----ccii +d---ibbz-i +iiaaaiiiii +# Test 98 +board: 7x9 +--i-iii +ai-icci +ai-iiii +iibbbbi +ii-iiii +-i-ii-i +-i-ii-i +ii-iiii +ii----i +arguments: 1 6 3 2 3 2 widget valid +board: 7x9 +--i-iii +bi-iaai +bi-iiii +iicccci +ii-iiii +-iiii-i +izzzi-i +izzziii +iiii--i +# Test 99 +board: 4x10 +aaii +iiii +---c +---c +---c +---d +---d +---i +ibbi +iiii +arguments: 0 0 2 6 1 2 widget valid +board: 4x10 +zzii +zzii +zz-c +zz-c +zz-c +zz-b +aa-b +ii-i +iddi +iiii +# Test 100 +board: 8x4 +iittt--- +yyyy---i +yyyyi--i +yyyy---i +# This represents where you want to add an item, the format is "x y spanX spanY minSpanX minSpanY type<widget/icon/folder> ifSolutionIsPossible<valid/invalid>" +arguments: 5 1 2 3 1 1 widget valid +board: 8x4 +iittt--- +yyyy-hhi +yyyyihhi +yyyy-hhi
\ No newline at end of file diff --git a/tests/shared/com/android/launcher3/testing/shared/TestProtocol.java b/tests/shared/com/android/launcher3/testing/shared/TestProtocol.java index 36255b4628..601b07e771 100644 --- a/tests/shared/com/android/launcher3/testing/shared/TestProtocol.java +++ b/tests/shared/com/android/launcher3/testing/shared/TestProtocol.java @@ -90,6 +90,7 @@ public final class TestProtocol { public static final String REQUEST_DISABLE_TRANSIENT_TASKBAR = "disable-transient-taskbar"; public static final String REQUEST_UNSTASH_TASKBAR_IF_STASHED = "unstash-taskbar-if-stashed"; public static final String REQUEST_STASHED_TASKBAR_HEIGHT = "stashed-taskbar-height"; + public static final String REQUEST_STASHED_TASKBAR_SCALE = "taskbar-stash-handle-scale"; public static final String REQUEST_RECREATE_TASKBAR = "recreate-taskbar"; public static final String REQUEST_APP_LIST_FREEZE_FLAGS = "app-list-freeze-flags"; public static final String REQUEST_APPS_LIST_SCROLL_Y = "apps-list-scroll-y"; @@ -111,6 +112,7 @@ public final class TestProtocol { public static final String REQUEST_IS_TABLET = "is-tablet"; public static final String REQUEST_IS_TWO_PANELS = "is-two-panel"; public static final String REQUEST_START_DRAG_THRESHOLD = "start-drag-threshold"; + public static final String REQUEST_SHELL_DRAG_READY = "shell-drag-ready"; public static final String REQUEST_GET_ACTIVITIES_CREATED_COUNT = "get-activities-created-count"; public static final String REQUEST_GET_ACTIVITIES = "get-activities"; diff --git a/tests/src/com/android/launcher3/celllayout/CellLayoutBoard.java b/tests/src/com/android/launcher3/celllayout/CellLayoutBoard.java index cf96f04e37..3c2b49ac3b 100644 --- a/tests/src/com/android/launcher3/celllayout/CellLayoutBoard.java +++ b/tests/src/com/android/launcher3/celllayout/CellLayoutBoard.java @@ -171,6 +171,8 @@ public class CellLayoutBoard implements Comparable<CellLayoutBoard> { } } + private HashSet<Character> mUsedWidgetTypes = new HashSet<>(); + static final int INFINITE = 99999; char[][] mWidget = new char[30][30]; @@ -182,6 +184,8 @@ public class CellLayoutBoard implements Comparable<CellLayoutBoard> { WidgetRect mMain = null; + int mWidth, mHeight; + CellLayoutBoard() { for (int x = 0; x < mWidget.length; x++) { for (int y = 0; y < mWidget[0].length; y++) { @@ -190,6 +194,17 @@ public class CellLayoutBoard implements Comparable<CellLayoutBoard> { } } + CellLayoutBoard(int width, int height) { + mWidget = new char[width][height]; + this.mWidth = width; + this.mHeight = height; + for (int x = 0; x < mWidget.length; x++) { + for (int y = 0; y < mWidget[0].length; y++) { + mWidget[x][y] = CellType.EMPTY; + } + } + } + public List<WidgetRect> getWidgets() { return mWidgetsRects; } @@ -256,6 +271,16 @@ public class CellLayoutBoard implements Comparable<CellLayoutBoard> { }).collect(Collectors.toList()); } + private char getNextWidgetType() { + for (char type = 'a'; type <= 'z'; type++) { + if (type == 'i') continue; + if (mUsedWidgetTypes.contains(type)) continue; + mUsedWidgetTypes.add(type); + return type; + } + return 'z'; + } + public void addWidget(int x, int y, int spanX, int spanY, char type) { Rect rect = new Rect(x, y + spanY - 1, x + spanX - 1, y); removeOverlappingItems(rect); @@ -268,6 +293,10 @@ public class CellLayoutBoard implements Comparable<CellLayoutBoard> { } } + public void addWidget(int x, int y, int spanX, int spanY) { + addWidget(x, y, spanX, spanY, getNextWidgetType()); + } + public void addIcon(int x, int y) { Point iconCoord = new Point(x, y); removeOverlappingItems(iconCoord); @@ -367,6 +396,8 @@ public class CellLayoutBoard implements Comparable<CellLayoutBoard> { } } } + board.mHeight = lines.length; + board.mWidth = lines[0].length(); board.mWidgetsRects = getRects(board.mWidget); board.mWidgetsRects.forEach(widgetRect -> { if (widgetRect.mType == CellType.MAIN_WIDGET) { @@ -380,6 +411,11 @@ public class CellLayoutBoard implements Comparable<CellLayoutBoard> { public String toString(int maxX, int maxY) { StringBuilder s = new StringBuilder(); + s.append("board: "); + s.append(maxX); + s.append("x"); + s.append(maxY); + s.append("\n"); maxX = Math.min(maxX, mWidget.length); maxY = Math.min(maxY, mWidget[0].length); for (int y = 0; y < maxY; y++) { @@ -391,6 +427,11 @@ public class CellLayoutBoard implements Comparable<CellLayoutBoard> { return s.toString(); } + @Override + public String toString() { + return toString(mWidth, mHeight); + } + public static List<CellLayoutBoard> boardListFromString(String boardsStr) { String[] lines = boardsStr.split("\n"); ArrayList<String> individualBoards = new ArrayList<>(); @@ -410,4 +451,12 @@ public class CellLayoutBoard implements Comparable<CellLayoutBoard> { } return boards; } + + public int getWidth() { + return mWidth; + } + + public int getHeight() { + return mHeight; + } } diff --git a/tests/src/com/android/launcher3/celllayout/CellLayoutTestUtils.java b/tests/src/com/android/launcher3/celllayout/CellLayoutTestUtils.java index e3d07a99f1..0d2f252b07 100644 --- a/tests/src/com/android/launcher3/celllayout/CellLayoutTestUtils.java +++ b/tests/src/com/android/launcher3/celllayout/CellLayoutTestUtils.java @@ -24,12 +24,12 @@ import com.android.launcher3.Launcher; import com.android.launcher3.views.DoubleShadowBubbleTextView; import java.util.ArrayList; +import java.util.List; public class CellLayoutTestUtils { public static ArrayList<CellLayoutBoard> workspaceToBoards(Launcher launcher) { ArrayList<CellLayoutBoard> boards = new ArrayList<>(); - int widgetCount = 0; for (CellLayout cellLayout : launcher.getWorkspace().mWorkspaceScreens) { int count = cellLayout.getShortcutsAndWidgets().getChildCount(); @@ -52,11 +52,29 @@ public class CellLayoutTestUtils { } else { // is widget board.addWidget(params.getCellX(), params.getCellY(), params.cellHSpan, - params.cellVSpan, (char) ('a' + widgetCount)); - widgetCount++; + params.cellVSpan); } } } return boards; } + + public static CellLayoutBoard viewsToBoard(List<View> views, int width, int height) { + CellLayoutBoard board = new CellLayoutBoard(); + board.mWidth = width; + board.mHeight = height; + + for (View callView : views) { + CellLayoutLayoutParams params = (CellLayoutLayoutParams) callView.getLayoutParams(); + // is icon + if (callView instanceof DoubleShadowBubbleTextView) { + board.addIcon(params.getCellX(), params.getCellY()); + } else { + // is widget + board.addWidget(params.getCellX(), params.getCellY(), params.cellHSpan, + params.cellVSpan); + } + } + return board; + } } diff --git a/tests/src/com/android/launcher3/celllayout/ReorderAlgorithmUnitTest.java b/tests/src/com/android/launcher3/celllayout/ReorderAlgorithmUnitTest.java new file mode 100644 index 0000000000..e3de500bde --- /dev/null +++ b/tests/src/com/android/launcher3/celllayout/ReorderAlgorithmUnitTest.java @@ -0,0 +1,269 @@ +/* + * Copyright (C) 2023 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.celllayout; + +import static androidx.test.core.app.ApplicationProvider.getApplicationContext; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import android.content.Context; +import android.graphics.Point; +import android.graphics.Rect; +import android.view.View; + +import androidx.test.ext.junit.runners.AndroidJUnit4; +import androidx.test.filters.SmallTest; + +import com.android.launcher3.CellLayout; +import com.android.launcher3.DeviceProfile; +import com.android.launcher3.InvariantDeviceProfile; +import com.android.launcher3.util.ActivityContextWrapper; +import com.android.launcher3.views.DoubleShadowBubbleTextView; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.Iterator; +import java.util.List; +import java.util.Random; + +@SmallTest +@RunWith(AndroidJUnit4.class) +public class ReorderAlgorithmUnitTest { + private Context mApplicationContext; + + private int mPrevNumColumns, mPrevNumRows; + + @Test + public void testAllCases() throws IOException { + List<ReorderAlgorithmUnitTestCase> testCases = getTestCases( + "ReorderAlgorithmUnitTest/reorder_algorithm_test_cases"); + mApplicationContext = new ActivityContextWrapper(getApplicationContext()); + List<Integer> failingCases = new ArrayList<>(); + for (int i = 0; i < testCases.size(); i++) { + try { + evaluateTestCase(testCases.get(i)); + } catch (AssertionError e) { + e.printStackTrace(); + failingCases.add(i); + } + } + assertEquals("Some test cases failed " + Arrays.toString(failingCases.toArray()), 0, + failingCases.size()); + } + + private void addViewInCellLayout(CellLayout cellLayout, int cellX, int cellY, int spanX, + int spanY, boolean isWidget) { + View cell = isWidget ? new View(mApplicationContext) : new DoubleShadowBubbleTextView( + mApplicationContext); + cell.setLayoutParams(new CellLayoutLayoutParams(cellX, cellY, spanX, spanY)); + cellLayout.addViewToCellLayout(cell, -1, cell.getId(), + (CellLayoutLayoutParams) cell.getLayoutParams(), true); + } + + public CellLayout createCellLayout(int width, int height) { + Context c = mApplicationContext; + DeviceProfile dp = InvariantDeviceProfile.INSTANCE.get(c).getDeviceProfile(c).copy(c); + // modify the device profile. + dp.inv.numColumns = width; + dp.inv.numRows = height; + + CellLayout cl = new CellLayout(getWrappedContext(c, dp)); + // I put a very large number for width and height so that all the items can fit, it doesn't + // need to be exact, just bigger than the sum of cell border + cl.measure(View.MeasureSpec.makeMeasureSpec(10000, View.MeasureSpec.EXACTLY), + View.MeasureSpec.makeMeasureSpec(10000, View.MeasureSpec.EXACTLY)); + + cl.measure(View.MeasureSpec.makeMeasureSpec(cl.getDesiredWidth(), View.MeasureSpec.EXACTLY), + View.MeasureSpec.makeMeasureSpec(cl.getDesiredHeight(), View.MeasureSpec.EXACTLY)); + return cl; + } + + private Context getWrappedContext(Context context, DeviceProfile dp) { + return new ActivityContextWrapper(context) { + public DeviceProfile getDeviceProfile() { + return dp; + } + }; + } + + public CellLayout.ItemConfiguration solve(CellLayoutBoard board, int x, int y, int spanX, + int spanY, int minSpanX, int minSpanY) { + CellLayout cl = createCellLayout(board.getWidth(), board.getHeight()); + + // The views have to be sorted or the result can vary + board.getIcons() + .stream() + .map(CellLayoutBoard.IconPoint::getCoord) + .sorted(Comparator.comparing(p -> ((Point) p).x).thenComparing(p -> ((Point) p).y)) + .forEach(p -> addViewInCellLayout(cl, p.x, p.y, 1, 1, false)); + board.getWidgets().stream() + .sorted(Comparator.comparing(CellLayoutBoard.WidgetRect::getCellX) + .thenComparing(CellLayoutBoard.WidgetRect::getCellY)) + .forEach(widget -> addViewInCellLayout(cl, widget.getCellX(), widget.getCellY(), + widget.getSpanX(), widget.getSpanY(), true)); + + int[] testCaseXYinPixels = new int[2]; + cl.regionToCenterPoint(x, y, spanX, spanY, testCaseXYinPixels); + CellLayout.ItemConfiguration solution = cl.createReorderAlgorithm().calculateReorder( + testCaseXYinPixels[0], testCaseXYinPixels[1], minSpanX, minSpanY, spanX, spanY, + null); + if (solution == null) { + solution = new CellLayout.ItemConfiguration(); + solution.isSolution = false; + } + return solution; + } + + public CellLayoutBoard boardFromSolution(CellLayout.ItemConfiguration solution, int width, + int height) { + // Update the views with solution value + solution.map.forEach((key, val) -> key.setLayoutParams( + new CellLayoutLayoutParams(val.cellX, val.cellY, val.spanX, val.spanY))); + CellLayoutBoard board = CellLayoutTestUtils.viewsToBoard( + new ArrayList<>(solution.map.keySet()), width, height); + board.addWidget(solution.cellX, solution.cellY, solution.spanX, solution.spanY, + 'z'); + return board; + } + + public void evaluateTestCase(ReorderAlgorithmUnitTestCase testCase) { + CellLayout.ItemConfiguration solution = solve(testCase.startBoard, testCase.x, + testCase.y, testCase.spanX, testCase.spanY, testCase.minSpanX, + testCase.minSpanY); + assertEquals("should be a valid solution", solution.isSolution, + testCase.isValidSolution); + if (testCase.isValidSolution) { + CellLayoutBoard finishBoard = boardFromSolution(solution, + testCase.startBoard.getWidth(), testCase.startBoard.getHeight()); + assertTrue("End result and test case result board doesn't match ", + finishBoard.compareTo(testCase.endBoard) == 0); + } + } + + @Before + public void storePreviousValues() { + Context c = new ActivityContextWrapper(getApplicationContext()); + DeviceProfile dp = InvariantDeviceProfile.INSTANCE.get(c).getDeviceProfile(c).copy(c); + mPrevNumColumns = dp.inv.numColumns; + mPrevNumRows = dp.inv.numColumns; + } + + @After + public void restorePreviousValues() { + Context c = new ActivityContextWrapper(getApplicationContext()); + DeviceProfile dp = InvariantDeviceProfile.INSTANCE.get(c).getDeviceProfile(c).copy(c); + dp.inv.numColumns = mPrevNumColumns; + dp.inv.numRows = mPrevNumRows; + } + + @SuppressWarnings("UnusedMethod") + /** + * Utility function used to generate all the test cases + */ + private ReorderAlgorithmUnitTestCase generateRandomTestCase() { + ReorderAlgorithmUnitTestCase testCase = new ReorderAlgorithmUnitTestCase(); + + int width = getRandom(3, 8); + int height = getRandom(3, 8); + + int targetWidth = getRandom(1, width - 2); + int targetHeight = getRandom(1, height - 2); + + int minTargetWidth = getRandom(1, targetWidth); + int minTargetHeight = getRandom(1, targetHeight); + + int x = getRandom(0, width - targetWidth); + int y = getRandom(0, height - targetHeight); + + CellLayoutBoard board = generateBoard(new CellLayoutBoard(width, height), + new Rect(0, 0, width, height), targetWidth * targetHeight); + + CellLayout.ItemConfiguration solution = solve(board, x, y, targetWidth, targetHeight, + minTargetWidth, minTargetHeight); + + CellLayoutBoard finishBoard = solution.isSolution ? boardFromSolution(solution, + board.getWidth(), board.getHeight()) : new CellLayoutBoard(board.getWidth(), + board.getHeight()); + + + testCase.startBoard = board; + testCase.endBoard = finishBoard; + testCase.isValidSolution = solution.isSolution; + testCase.x = x; + testCase.y = y; + testCase.spanX = targetWidth; + testCase.spanY = targetHeight; + testCase.minSpanX = minTargetWidth; + testCase.minSpanY = minTargetHeight; + testCase.type = solution.area() == 1 ? "icon" : "widget"; + + return testCase; + } + + private int getRandom(int start, int end) { + int random = end == 0 ? 0 : new Random().nextInt(end); + return start + random; + } + + private CellLayoutBoard generateBoard(CellLayoutBoard board, Rect area, + int emptySpaces) { + if (area.height() * area.width() <= 0) return board; + + int width = getRandom(1, area.width() - 1); + int height = getRandom(1, area.height() - 1); + + int x = area.left + getRandom(0, area.width() - width); + int y = area.top + getRandom(0, area.height() - height); + + if (emptySpaces > 0) { + emptySpaces -= width * height; + } else if (width * height > 1) { + board.addWidget(x, y, width, height); + } else { + board.addIcon(x, y); + } + + generateBoard(board, + new Rect(area.left, area.top, area.right, y), emptySpaces); + generateBoard(board, + new Rect(area.left, y, x, area.bottom), emptySpaces); + generateBoard(board, + new Rect(x, y + height, area.right, area.bottom), emptySpaces); + generateBoard(board, + new Rect(x + width, y, area.right, y + height), emptySpaces); + + return board; + } + + private static List<ReorderAlgorithmUnitTestCase> getTestCases(String testPath) + throws IOException { + List<ReorderAlgorithmUnitTestCase> cases = new ArrayList<>(); + Iterator<CellLayoutTestCaseReader.TestSection> iterableSection = + CellLayoutTestCaseReader.readFromFile(testPath).parse().iterator(); + while (iterableSection.hasNext()) { + cases.add(ReorderAlgorithmUnitTestCase.readNextCase(iterableSection)); + } + return cases; + } +} diff --git a/tests/src/com/android/launcher3/celllayout/ReorderAlgorithmUnitTestCase.java b/tests/src/com/android/launcher3/celllayout/ReorderAlgorithmUnitTestCase.java new file mode 100644 index 0000000000..4274130702 --- /dev/null +++ b/tests/src/com/android/launcher3/celllayout/ReorderAlgorithmUnitTestCase.java @@ -0,0 +1,151 @@ +/* + * Copyright (C) 2023 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.celllayout; + +import java.util.Iterator; + +/** + * Represents a test case for {@code ReorderAlgorithmUnitTest}. The test cases are generated from + * text, an example of a test is the following: + * + * board: 10x8 + * aaaaaaaaai + * bbbbbcciii + * ---------f + * ---------f + * ---------f + * ---------i + * iiddddddii + * iieeiiiiii + * arguments: 2 5 7 1 3 1 widget valid + * board: 10x8 + * bbbbbbbbbi + * eeeeecciii + * ---------a + * ---------a + * ---------a + * --zzzzzzzi + * iiddddddii + * iiffiiiiii + * + * + * This represents a Workspace boards and a dragged widget that wants to be dropped on the + * workspace. The endBoard represents the result from such drag + * The first board is the startBoard, the arguments are as follow: cellX, cellY, widget spanX, + * widget spanY, minimum spanX, minimum spanX, type of object being drag (icon, widget, folder ), + * if the resulting board is a valid solution or not reorder was found. + * + * For more information on how to read the board please go to the text file + * reorder_algorithm_test_cases + */ +public class ReorderAlgorithmUnitTestCase { + + CellLayoutBoard startBoard; + + int x, y, spanX, spanY, minSpanX, minSpanY; + String type; + boolean isValidSolution; + CellLayoutBoard endBoard; + + public static ReorderAlgorithmUnitTestCase readNextCase( + Iterator<CellLayoutTestCaseReader.TestSection> sections) { + ReorderAlgorithmUnitTestCase testCase = new ReorderAlgorithmUnitTestCase(); + CellLayoutTestCaseReader.Board startBoard = + (CellLayoutTestCaseReader.Board) sections.next(); + testCase.startBoard = CellLayoutBoard.boardFromString(startBoard.board); + CellLayoutTestCaseReader.Arguments arguments = + (CellLayoutTestCaseReader.Arguments) sections.next(); + testCase.x = Integer.parseInt(arguments.arguments[0]); + testCase.y = Integer.parseInt(arguments.arguments[1]); + testCase.spanX = Integer.parseInt(arguments.arguments[2]); + testCase.spanY = Integer.parseInt(arguments.arguments[3]); + testCase.minSpanX = Integer.parseInt(arguments.arguments[4]); + testCase.minSpanY = Integer.parseInt(arguments.arguments[5]); + testCase.type = arguments.arguments[6]; + testCase.isValidSolution = arguments.arguments[7].compareTo("valid") == 0; + + CellLayoutTestCaseReader.Board endBoard = (CellLayoutTestCaseReader.Board) sections.next(); + testCase.endBoard = CellLayoutBoard.boardFromString(endBoard.board); + return testCase; + } + + public CellLayoutBoard getStartBoard() { + return startBoard; + } + + public int getX() { + return x; + } + + public void setX(int x) { + this.x = x; + } + + public int getY() { + return y; + } + + public void setY(int y) { + this.y = y; + } + + public int getSpanX() { + return spanX; + } + + public void setSpanX(int spanX) { + this.spanX = spanX; + } + + public int getSpanY() { + return spanY; + } + + public void setSpanY(int spanY) { + this.spanY = spanY; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public boolean isValidSolution() { + return isValidSolution; + } + + public void setValidSolution(boolean validSolution) { + isValidSolution = validSolution; + } + + public CellLayoutBoard getEndBoard() { + return endBoard; + } + + public void setEndBoard(CellLayoutBoard endBoard) { + this.endBoard = endBoard; + } + + @Override + public String toString() { + String valid = isValidSolution ? "valid" : "invalid"; + return startBoard + "arguments: " + x + " " + y + " " + spanX + " " + spanY + " " + minSpanX + + " " + minSpanY + " " + type + " " + valid + "\n" + endBoard; + } +} diff --git a/tests/src/com/android/launcher3/logging/StartupLatencyLoggerTest.kt b/tests/src/com/android/launcher3/logging/StartupLatencyLoggerTest.kt new file mode 100644 index 0000000000..fffa6d7b08 --- /dev/null +++ b/tests/src/com/android/launcher3/logging/StartupLatencyLoggerTest.kt @@ -0,0 +1,368 @@ +package com.android.launcher3.logging + +import androidx.core.util.isEmpty +import androidx.test.annotation.UiThreadTest +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.SmallTest +import com.google.common.truth.Truth.assertThat +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith + +/** Unit test for [StartupLatencyLogger]. */ +@SmallTest +@RunWith(AndroidJUnit4::class) +class StartupLatencyLoggerTest { + + private val underTest: StartupLatencyLogger = + StartupLatencyLogger(StatsLogManager.StatsLatencyLogger.LatencyType.COLD) + + @Before + fun setup() { + underTest.setIsInTest() + } + + @Test + @UiThreadTest + fun logTotalDurationStart() { + underTest.logStart( + StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, + 100 + ) + + val startTime = + underTest.startTimeByEvent.get( + StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION.id + ) + assertThat(startTime).isEqualTo(100) + assertThat(underTest.endTimeByEvent.isEmpty()).isTrue() + } + + @Test + @UiThreadTest + fun logTotalDurationEnd() { + underTest.logStart( + StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, + 100 + ) + + underTest.logEnd( + StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, + 100 + ) + + val endTime = + underTest.endTimeByEvent.get( + StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION.id + ) + assertThat(endTime).isEqualTo(100) + } + + @Test + @UiThreadTest + fun logStartOfOtherEvents_withoutLogStartOfTotalDuration_noOp() { + underTest + .logStart( + StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_ACTIVITY_ON_CREATE, + 100 + ) + .logStart( + StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_VIEW_INFLATION, + 101 + ) + .logStart( + StatsLogManager.LauncherLatencyEvent + .LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_ASYNC, + 102 + ) + + assertThat(underTest.startTimeByEvent.isEmpty()).isTrue() + } + + @Test + @UiThreadTest + fun logStartOfOtherEvents_afterLogStartOfTotalDuration_logged() { + underTest.logStart( + StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, + 100 + ) + + underTest + .logStart( + StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_ACTIVITY_ON_CREATE, + 100 + ) + .logStart( + StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_VIEW_INFLATION, + 101 + ) + .logStart( + StatsLogManager.LauncherLatencyEvent + .LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_ASYNC, + 102 + ) + + assertThat(underTest.startTimeByEvent.size()).isEqualTo(4) + } + + @Test + @UiThreadTest + fun logDuplicatedStartEvent_2ndEvent_notLogged() { + underTest.logStart( + StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, + 100 + ) + + underTest.logStart( + StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, + 101 + ) + + assertThat(underTest.startTimeByEvent.size()).isEqualTo(1) + assertThat( + underTest.startTimeByEvent.get( + StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION.id + ) + ) + .isEqualTo(100) + } + + @Test + @UiThreadTest + fun loadStartOfWorkspace_thenEndWithAsync_logAsyncStart() { + underTest + .logStart( + StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, + 100 + ) + .logWorkspaceLoadStartTime(111) + + underTest.logEnd( + StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_ASYNC, + 120 + ) + + assertThat(underTest.startTimeByEvent.size()).isEqualTo(2) + assertThat( + underTest.startTimeByEvent.get( + StatsLogManager.LauncherLatencyEvent + .LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_ASYNC + .id + ) + ) + .isEqualTo(111) + } + + @Test + @UiThreadTest + fun loadStartOfWorkspace_thenEndWithSync_logSyncStart() { + underTest + .logStart( + StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, + 100 + ) + .logWorkspaceLoadStartTime(111) + + underTest.logEnd( + StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_SYNC, + 120 + ) + + assertThat(underTest.startTimeByEvent.size()).isEqualTo(2) + assertThat( + underTest.startTimeByEvent.get( + StatsLogManager.LauncherLatencyEvent + .LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_SYNC + .id + ) + ) + .isEqualTo(111) + } + + @Test + @UiThreadTest + fun loadStartOfWorkspaceLoadSync_thenAsync_asyncNotLogged() { + underTest + .logStart( + StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, + 100 + ) + .logStart( + StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_SYNC, + 110 + ) + + underTest.logStart( + StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_ASYNC, + 111 + ) + + assertThat(underTest.startTimeByEvent.size()).isEqualTo(2) + assertThat( + underTest.startTimeByEvent.get( + StatsLogManager.LauncherLatencyEvent + .LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_SYNC + .id + ) + ) + .isEqualTo(110) + assertThat( + underTest.startTimeByEvent.get( + StatsLogManager.LauncherLatencyEvent + .LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_ASYNC + .id + ) + ) + .isEqualTo(0) + } + + @Test + @UiThreadTest + fun loadStartOfWorkspaceLoadAsync_thenSync_syncNotLogged() { + underTest.logStart( + StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, + 100 + ) + underTest.logStart( + StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_ASYNC, + 111 + ) + + underTest.logStart( + StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_SYNC, + 112 + ) + + assertThat(underTest.startTimeByEvent.size()).isEqualTo(2) + assertThat( + underTest.startTimeByEvent.get( + StatsLogManager.LauncherLatencyEvent + .LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_ASYNC + .id + ) + ) + .isEqualTo(111) + assertThat( + underTest.startTimeByEvent.get( + StatsLogManager.LauncherLatencyEvent + .LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_SYNC + .id + ) + ) + .isEqualTo(0) + } + + @Test + @UiThreadTest + fun logEndOfEvent_withoutStartEvent_notLogged() { + underTest.logStart( + StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, + 100 + ) + + underTest.logEnd( + StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_SYNC, + 120 + ) + + assertThat(underTest.endTimeByEvent.size()).isEqualTo(0) + assertThat( + underTest.endTimeByEvent.get( + StatsLogManager.LauncherLatencyEvent + .LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_SYNC + .id + ) + ) + .isEqualTo(0) + } + + @Test + @UiThreadTest + fun logEndOfEvent_afterEndOfTotalDuration_notLogged() { + underTest + .logStart( + StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, + 100 + ) + .logEnd( + StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, + 120 + ) + + underTest.logEnd( + StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_SYNC, + 121 + ) + + assertThat(underTest.endTimeByEvent.size()).isEqualTo(1) + assertThat( + underTest.endTimeByEvent.get( + StatsLogManager.LauncherLatencyEvent + .LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_SYNC + .id + ) + ) + .isEqualTo(0) + } + + @Test + @UiThreadTest + fun logCardinality_setCardinality() { + underTest.logCardinality(-1) + underTest.logStart( + StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, + 100 + ) + + underTest.logCardinality(235) + + assertThat(underTest.cardinality).isEqualTo(235) + } + + @Test + @UiThreadTest + fun reset_clearState() { + underTest + .logStart( + StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, + 100 + ) + .logStart( + StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_ACTIVITY_ON_CREATE, + 100 + ) + .logStart( + StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_VIEW_INFLATION, + 110 + ) + .logEnd( + StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_VIEW_INFLATION, + 115 + ) + .logWorkspaceLoadStartTime(120) + .logCardinality(235) + .logEnd( + StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_ACTIVITY_ON_CREATE, + 100 + ) + .logEnd( + StatsLogManager.LauncherLatencyEvent + .LAUNCHER_LATENCY_STARTUP_WORKSPACE_LOADER_ASYNC, + 140 + ) + .logEnd( + StatsLogManager.LauncherLatencyEvent.LAUNCHER_LATENCY_STARTUP_TOTAL_DURATION, + 160 + ) + assertThat(underTest.startTimeByEvent.size()).isEqualTo(4) + assertThat(underTest.endTimeByEvent.size()).isEqualTo(4) + assertThat(underTest.cardinality).isEqualTo(235) + + underTest.reset() + + assertThat(underTest.startTimeByEvent.isEmpty()).isTrue() + assertThat(underTest.endTimeByEvent.isEmpty()).isTrue() + assertThat(underTest.cardinality).isEqualTo(StartupLatencyLogger.UNSET_INT) + assertThat(underTest.workspaceLoadStartTime).isEqualTo(StartupLatencyLogger.UNSET_LONG) + } +} diff --git a/tests/src/com/android/launcher3/model/ModelMultiCallbacksTest.java b/tests/src/com/android/launcher3/model/ModelMultiCallbacksTest.java index 42c9f11a52..b9da16ac41 100644 --- a/tests/src/com/android/launcher3/model/ModelMultiCallbacksTest.java +++ b/tests/src/com/android/launcher3/model/ModelMultiCallbacksTest.java @@ -180,7 +180,8 @@ public class ModelMultiCallbacksTest { } @Override - public void onInitialBindComplete(IntSet boundPages, RunnableList pendingTasks) { + public void onInitialBindComplete(IntSet boundPages, RunnableList pendingTasks, + int workspaceItemCount, boolean isBindSync) { mPageBoundSync = boundPages; mPendingTasks = pendingTasks; } diff --git a/tests/src/com/android/launcher3/ui/widget/AddConfigWidgetTest.java b/tests/src/com/android/launcher3/ui/widget/AddConfigWidgetTest.java index d7f354722e..7312dab9fc 100644 --- a/tests/src/com/android/launcher3/ui/widget/AddConfigWidgetTest.java +++ b/tests/src/com/android/launcher3/ui/widget/AddConfigWidgetTest.java @@ -15,25 +15,27 @@ */ package com.android.launcher3.ui.widget; +import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; + +import static com.android.launcher3.util.LauncherBindableItemsContainer.ItemOperator; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotSame; -import static org.junit.Assert.assertNull; import android.appwidget.AppWidgetManager; import android.content.Intent; -import android.util.Log; +import android.view.View; import androidx.test.filters.LargeTest; import androidx.test.runner.AndroidJUnit4; +import com.android.launcher3.model.data.ItemInfo; import com.android.launcher3.model.data.LauncherAppWidgetInfo; -import com.android.launcher3.tapl.Widget; -import com.android.launcher3.tapl.WidgetResizeFrame; -import com.android.launcher3.tapl.Widgets; import com.android.launcher3.testcomponent.WidgetConfigActivity; import com.android.launcher3.ui.AbstractLauncherUiTest; import com.android.launcher3.ui.TestViewHelpers; +import com.android.launcher3.util.Wait; import com.android.launcher3.util.rule.ScreenRecordRule.ScreenRecord; import com.android.launcher3.util.rule.ShellCommandRule; import com.android.launcher3.widget.LauncherAppWidgetProviderInfo; @@ -50,7 +52,6 @@ import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class AddConfigWidgetTest extends AbstractLauncherUiTest { - private static final String WIDGET_PROVIDER_INFO = "b/276794291"; @Rule public ShellCommandRule mGrantWidgetRule = ShellCommandRule.grantWidgetBind(); @@ -88,33 +89,51 @@ public class AddConfigWidgetTest extends AbstractLauncherUiTest { clearHomescreen(); mDevice.pressHome(); - final Widgets widgets = mLauncher.getWorkspace().openAllWidgets(); - // Drag widget to homescreen WidgetConfigStartupMonitor monitor = new WidgetConfigStartupMonitor(); - WidgetResizeFrame resizeFrame = - widgets.getWidget(mWidgetInfo.getLabel(mTargetContext.getPackageManager())) - .dragConfigWidgetToWorkspace(acceptConfig); + mLauncher.getWorkspace() + .openAllWidgets() + .getWidget(mWidgetInfo.getLabel(mTargetContext.getPackageManager())) + .dragToWorkspace(true, false); // Widget id for which the config activity was opened mWidgetId = monitor.getWidgetId(); - Log.e(WIDGET_PROVIDER_INFO, - "InstalledProviders count: " + mAppWidgetManager.getInstalledProviders().size()); - // Verify that the widget id is valid and bound assertNotNull(mAppWidgetManager.getAppWidgetInfo(mWidgetId)); + setResult(acceptConfig); if (acceptConfig) { - assertNotNull("Widget resize frame not shown after widget added", resizeFrame); - resizeFrame.dismiss(); - - final Widget widget = - mLauncher.getWorkspace().tryGetWidget(mWidgetInfo.label, DEFAULT_UI_TIMEOUT); - assertNotNull("Widget not found on the workspace", widget); + Wait.atMost("", new WidgetSearchCondition(), DEFAULT_ACTIVITY_TIMEOUT, mLauncher); + assertNotNull(mAppWidgetManager.getAppWidgetInfo(mWidgetId)); } else { - final Widget widget = - mLauncher.getWorkspace().tryGetWidget(mWidgetInfo.label, DEFAULT_UI_TIMEOUT); - assertNull("Widget unexpectedly found on the workspace", widget); + // Verify that the widget id is deleted. + Wait.atMost("", () -> mAppWidgetManager.getAppWidgetInfo(mWidgetId) == null, + DEFAULT_ACTIVITY_TIMEOUT, mLauncher); + } + } + + private void setResult(boolean success) { + getInstrumentation().getTargetContext().sendBroadcast( + WidgetConfigActivity.getCommandIntent(WidgetConfigActivity.class, + success ? "clickOK" : "clickCancel")); + } + + /** + * Condition for searching widget id + */ + private class WidgetSearchCondition implements Wait.Condition, ItemOperator { + + @Override + public boolean isTrue() throws Throwable { + return mMainThreadExecutor.submit(mActivityMonitor.itemExists(this)).get(); + } + + @Override + public boolean evaluate(ItemInfo info, View view) { + return info instanceof LauncherAppWidgetInfo + && ((LauncherAppWidgetInfo) info).providerName.getClassName().equals( + mWidgetInfo.provider.getClassName()) + && ((LauncherAppWidgetInfo) info).appWidgetId == mWidgetId; } } diff --git a/tests/src/com/android/launcher3/widget/LauncherAppWidgetProviderInfoTest.java b/tests/src/com/android/launcher3/widget/LauncherAppWidgetProviderInfoTest.java index b534a41175..48cf3df0e5 100644 --- a/tests/src/com/android/launcher3/widget/LauncherAppWidgetProviderInfoTest.java +++ b/tests/src/com/android/launcher3/widget/LauncherAppWidgetProviderInfoTest.java @@ -32,6 +32,7 @@ import androidx.test.filters.SmallTest; import com.android.launcher3.DeviceProfile; import com.android.launcher3.InvariantDeviceProfile; +import com.android.launcher3.LauncherAppState; import org.junit.Before; import org.junit.Test; @@ -161,7 +162,6 @@ public final class LauncherAppWidgetProviderInfoTest { int maxPadding = Math.max(Math.max(padding.left, padding.right), Math.max(padding.top, padding.bottom)); dp.cellLayoutBorderSpacePx.x = dp.cellLayoutBorderSpacePx.y = maxPadding + 1; - Mockito.when(dp.shouldInsetWidgets()).thenReturn(true); LauncherAppWidgetProviderInfo info = new LauncherAppWidgetProviderInfo(); info.minWidth = CELL_SIZE * 3; @@ -184,7 +184,6 @@ public final class LauncherAppWidgetProviderInfoTest { int maxPadding = Math.max(Math.max(padding.left, padding.right), Math.max(padding.top, padding.bottom)); dp.cellLayoutBorderSpacePx.x = dp.cellLayoutBorderSpacePx.y = maxPadding - 1; - Mockito.when(dp.shouldInsetWidgets()).thenReturn(false); LauncherAppWidgetProviderInfo info = new LauncherAppWidgetProviderInfo(); info.minWidth = CELL_SIZE * 3; info.minHeight = CELL_SIZE * 3; @@ -257,14 +256,16 @@ public final class LauncherAppWidgetProviderInfoTest { } private InvariantDeviceProfile createIDP() { - DeviceProfile profile = Mockito.mock(DeviceProfile.class); + DeviceProfile dp = LauncherAppState.getIDP(mContext) + .getDeviceProfile(mContext).copy(mContext); + DeviceProfile profile = Mockito.spy(dp); doAnswer(i -> { ((Point) i.getArgument(0)).set(CELL_SIZE, CELL_SIZE); return null; }).when(profile).getCellSize(any(Point.class)); Mockito.when(profile.getCellSize()).thenReturn(new Point(CELL_SIZE, CELL_SIZE)); profile.cellLayoutBorderSpacePx = new Point(SPACE_SIZE, SPACE_SIZE); - Mockito.when(profile.shouldInsetWidgets()).thenReturn(true); + profile.widgetPadding.setEmpty(); InvariantDeviceProfile idp = new InvariantDeviceProfile(); List<DeviceProfile> supportedProfiles = new ArrayList<>(idp.supportedProfiles); diff --git a/tests/src/com/android/launcher3/widget/picker/util/WidgetsTableUtilsTest.java b/tests/src/com/android/launcher3/widget/picker/util/WidgetsTableUtilsTest.java index d2c2fd7217..834f8517a2 100644 --- a/tests/src/com/android/launcher3/widget/picker/util/WidgetsTableUtilsTest.java +++ b/tests/src/com/android/launcher3/widget/picker/util/WidgetsTableUtilsTest.java @@ -38,6 +38,7 @@ import androidx.test.filters.SmallTest; import com.android.launcher3.DeviceProfile; import com.android.launcher3.InvariantDeviceProfile; +import com.android.launcher3.LauncherAppState; import com.android.launcher3.icons.ComponentWithLabel; import com.android.launcher3.icons.IconCache; import com.android.launcher3.model.WidgetItem; @@ -50,6 +51,7 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; +import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import java.util.ArrayList; @@ -68,7 +70,6 @@ public final class WidgetsTableUtilsTest { @Mock private IconCache mIconCache; - @Mock private DeviceProfile mTestDeviceProfile; private Context mContext; @@ -198,13 +199,18 @@ public final class WidgetsTableUtilsTest { } private void initDP() { + DeviceProfile dp = LauncherAppState.getIDP(mContext) + .getDeviceProfile(mContext).copy(mContext); + mTestDeviceProfile = Mockito.spy(dp); + doAnswer(i -> { ((Point) i.getArgument(0)).set(CELL_SIZE, CELL_SIZE); return null; }).when(mTestDeviceProfile).getCellSize(any(Point.class)); when(mTestDeviceProfile.getCellSize()).thenReturn(new Point(CELL_SIZE, CELL_SIZE)); mTestDeviceProfile.cellLayoutBorderSpacePx = new Point(SPACE_SIZE, SPACE_SIZE); - when(mTestDeviceProfile.shouldInsetWidgets()).thenReturn(false); + mTestDeviceProfile.widgetPadding.setEmpty(); + mTestDeviceProfile.allAppsIconSizePx = 0; } private void initTestWidgets() { diff --git a/tests/tapl/com/android/launcher3/tapl/LaunchedAppState.java b/tests/tapl/com/android/launcher3/tapl/LaunchedAppState.java index 4a3507ed69..f52b82de1b 100644 --- a/tests/tapl/com/android/launcher3/tapl/LaunchedAppState.java +++ b/tests/tapl/com/android/launcher3/tapl/LaunchedAppState.java @@ -16,19 +16,26 @@ package com.android.launcher3.tapl; +import static com.android.launcher3.tapl.LauncherInstrumentation.DEFAULT_POLL_INTERVAL; import static com.android.launcher3.tapl.LauncherInstrumentation.TASKBAR_RES_ID; +import static com.android.launcher3.tapl.LauncherInstrumentation.WAIT_TIME_MS; import static com.android.launcher3.testing.shared.TestProtocol.REQUEST_DISABLE_BLOCK_TIMEOUT; import static com.android.launcher3.testing.shared.TestProtocol.REQUEST_DISABLE_MANUAL_TASKBAR_STASHING; import static com.android.launcher3.testing.shared.TestProtocol.REQUEST_ENABLE_BLOCK_TIMEOUT; import static com.android.launcher3.testing.shared.TestProtocol.REQUEST_ENABLE_MANUAL_TASKBAR_STASHING; +import static com.android.launcher3.testing.shared.TestProtocol.REQUEST_SHELL_DRAG_READY; import static com.android.launcher3.testing.shared.TestProtocol.REQUEST_STASHED_TASKBAR_HEIGHT; +import static com.android.launcher3.testing.shared.TestProtocol.REQUEST_STASHED_TASKBAR_SCALE; import android.graphics.Point; import android.graphics.Rect; import android.os.SystemClock; import android.view.MotionEvent; +import android.view.ViewConfiguration; import androidx.test.uiautomator.By; +import androidx.test.uiautomator.Condition; +import androidx.test.uiautomator.UiDevice; import com.android.launcher3.testing.shared.TestProtocol; @@ -40,6 +47,18 @@ public final class LaunchedAppState extends Background { // More drag steps than Launchables to give the window manager time to register the drag. private static final int DEFAULT_DRAG_STEPS = 35; + // UNSTASHED_TASKBAR_HANDLE_HINT_SCALE value from TaskbarStashController. + private static final float UNSTASHED_TASKBAR_HANDLE_HINT_SCALE = 1.1f; + + private final Condition<UiDevice, Boolean> mStashedTaskbarHintScaleCondition = + device -> mLauncher.getTestInfo(REQUEST_STASHED_TASKBAR_SCALE).getFloat( + TestProtocol.TEST_INFO_RESPONSE_FIELD) - UNSTASHED_TASKBAR_HANDLE_HINT_SCALE + < 0.00001f; + + private final Condition<UiDevice, Boolean> mStashedTaskbarDefaultScaleCondition = + device -> mLauncher.getTestInfo(REQUEST_STASHED_TASKBAR_SCALE).getFloat( + TestProtocol.TEST_INFO_RESPONSE_FIELD) - 1f < 0.00001f; + LaunchedAppState(LauncherInstrumentation launcher) { super(launcher); } @@ -146,6 +165,12 @@ public final class LaunchedAppState extends Background { try (LauncherInstrumentation.Closable c2 = launcher.addContextLayer( "started item drag")) { + launcher.assertTrue("Shell drag not marked as ready", launcher.waitAndGet(() -> { + LauncherInstrumentation.log("Checking shell drag ready"); + return launcher.getTestInfo(REQUEST_SHELL_DRAG_READY) + .getBoolean(TestProtocol.TEST_INFO_RESPONSE_FIELD, false); + }, WAIT_TIME_MS, DEFAULT_POLL_INTERVAL)); + launcher.movePointer( dragStart, endPoint, @@ -178,4 +203,86 @@ public final class LaunchedAppState extends Background { } } } + + /** + * Emulate the cursor hovering the screen edge to unstash the taskbar. + * + * <p>This unstashing occurs when not actively hovering the taskbar. + */ + public void hoverScreenBottomEdgeToUnstashTaskbar() { + try (LauncherInstrumentation.Closable e = mLauncher.eventsCheck(); + LauncherInstrumentation.Closable c = mLauncher.addContextLayer( + "cursor hover entering screen edge to unstash taskbar")) { + mLauncher.getDevice().wait(mStashedTaskbarDefaultScaleCondition, + ViewConfiguration.DEFAULT_LONG_PRESS_TIMEOUT); + + long downTime = SystemClock.uptimeMillis(); + int leftEdge = 10; + Point taskbarUnstashArea = new Point(leftEdge, mLauncher.getRealDisplaySize().y - 1); + mLauncher.sendPointer(downTime, downTime, MotionEvent.ACTION_HOVER_ENTER, + new Point(taskbarUnstashArea.x, taskbarUnstashArea.y), null); + + mLauncher.waitForSystemLauncherObject(TASKBAR_RES_ID); + } + } + + /** + * Emulate the cursor hovering the taskbar to get unstash hint, then hovering below to unstash. + */ + public void hoverBelowHintedTaskbarToUnstash() { + try (LauncherInstrumentation.Closable e = mLauncher.eventsCheck(); + LauncherInstrumentation.Closable c = mLauncher.addContextLayer( + "cursor hover entering stashed taskbar")) { + long downTime = SystemClock.uptimeMillis(); + Point stashedTaskbarHintArea = new Point(mLauncher.getRealDisplaySize().x / 2, + mLauncher.getRealDisplaySize().y - 1); + mLauncher.sendPointer(downTime, downTime, MotionEvent.ACTION_HOVER_ENTER, + new Point(stashedTaskbarHintArea.x, stashedTaskbarHintArea.y), null); + + mLauncher.getDevice().wait(mStashedTaskbarHintScaleCondition, + LauncherInstrumentation.WAIT_TIME_MS); + + try (LauncherInstrumentation.Closable c1 = mLauncher.addContextLayer( + "cursor hover enter below taskbar to unstash")) { + downTime = SystemClock.uptimeMillis(); + Point taskbarUnstashArea = new Point(mLauncher.getRealDisplaySize().x / 2, + mLauncher.getRealDisplaySize().y - 1); + mLauncher.sendPointer(downTime, downTime, MotionEvent.ACTION_HOVER_EXIT, + new Point(taskbarUnstashArea.x, taskbarUnstashArea.y), null); + + mLauncher.waitForSystemLauncherObject(TASKBAR_RES_ID); + } + } + } + + /** + * Emulate the cursor entering and exiting a hover over the taskbar. + */ + public void hoverToShowTaskbarUnstashHint() { + try (LauncherInstrumentation.Closable e = mLauncher.eventsCheck(); + LauncherInstrumentation.Closable c = mLauncher.addContextLayer( + "cursor hover entering stashed taskbar")) { + long downTime = SystemClock.uptimeMillis(); + Point stashedTaskbarHintArea = new Point(mLauncher.getRealDisplaySize().x / 2, + mLauncher.getRealDisplaySize().y - 1); + mLauncher.sendPointer(downTime, downTime, MotionEvent.ACTION_HOVER_ENTER, + new Point(stashedTaskbarHintArea.x, stashedTaskbarHintArea.y), null); + + mLauncher.getDevice().wait(mStashedTaskbarHintScaleCondition, + LauncherInstrumentation.WAIT_TIME_MS); + + try (LauncherInstrumentation.Closable c1 = mLauncher.addContextLayer( + "cursor hover exiting stashed taskbar")) { + Point outsideStashedTaskbarHintArea = new Point( + mLauncher.getRealDisplaySize().x / 2, + mLauncher.getRealDisplaySize().y - 500); + mLauncher.sendPointer(downTime, downTime, MotionEvent.ACTION_HOVER_EXIT, + new Point(outsideStashedTaskbarHintArea.x, outsideStashedTaskbarHintArea.y), + null); + + mLauncher.getDevice().wait(mStashedTaskbarDefaultScaleCondition, + LauncherInstrumentation.WAIT_TIME_MS); + } + } + } } diff --git a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java index c4f82695d5..80fded5872 100644 --- a/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java +++ b/tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java @@ -107,6 +107,8 @@ public final class LauncherInstrumentation { static final Pattern EVENT_TOUCH_DOWN_TIS = getTouchEventPatternTIS("ACTION_DOWN"); static final Pattern EVENT_TOUCH_UP_TIS = getTouchEventPatternTIS("ACTION_UP"); static final Pattern EVENT_TOUCH_CANCEL_TIS = getTouchEventPatternTIS("ACTION_CANCEL"); + static final Pattern EVENT_HOVER_ENTER_TIS = getTouchEventPatternTIS("ACTION_HOVER_ENTER"); + static final Pattern EVENT_HOVER_EXIT_TIS = getTouchEventPatternTIS("ACTION_HOVER_EXIT"); private static final Pattern EVENT_KEY_BACK_DOWN = getKeyEventPattern("ACTION_DOWN", "KEYCODE_BACK"); @@ -140,7 +142,9 @@ public final class LauncherInstrumentation { * Represents a point in the code at which a callback can run. */ public enum CALLBACK_RUN_POINT { - CALLBACK_HOLD_BEFORE_DROP + CALLBACK_HOLD_BEFORE_DROP, + CALLBACK_HOVER_ENTER, + CALLBACK_HOVER_EXIT, } private Consumer<CALLBACK_RUN_POINT> mCallbackAtRunPoint = null; @@ -1682,6 +1686,12 @@ public final class LauncherInstrumentation { ? EVENT_TOUCH_CANCEL_TIS : EVENT_TOUCH_UP_TIS); } break; + case MotionEvent.ACTION_HOVER_ENTER: + expectEvent(TestProtocol.SEQUENCE_TIS, EVENT_HOVER_ENTER_TIS); + break; + case MotionEvent.ACTION_HOVER_EXIT: + expectEvent(TestProtocol.SEQUENCE_TIS, EVENT_HOVER_EXIT_TIS); + break; } final MotionEvent event = getMotionEvent(downTime, currentTime, action, point.x, point.y); diff --git a/tests/tapl/com/android/launcher3/tapl/OverviewTaskMenu.java b/tests/tapl/com/android/launcher3/tapl/OverviewTaskMenu.java index 54be3c324d..e349620e28 100644 --- a/tests/tapl/com/android/launcher3/tapl/OverviewTaskMenu.java +++ b/tests/tapl/com/android/launcher3/tapl/OverviewTaskMenu.java @@ -55,4 +55,12 @@ public class OverviewTaskMenu { UiObject2 menuItem = mLauncher.findObjectInContainer(mMenu, By.text(expectedMenuItemText)); return menuItem != null; } + + /** + * Returns the menu item specified by name if present. + */ + public OverviewTaskMenuItem getMenuItemByName(String menuItemName) { + return new OverviewTaskMenuItem(mLauncher, + mLauncher.waitForObjectInContainer(mMenu, By.text(menuItemName))); + } } diff --git a/tests/tapl/com/android/launcher3/tapl/OverviewTaskMenuItem.java b/tests/tapl/com/android/launcher3/tapl/OverviewTaskMenuItem.java new file mode 100644 index 0000000000..b2cc92de09 --- /dev/null +++ b/tests/tapl/com/android/launcher3/tapl/OverviewTaskMenuItem.java @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2023 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.tapl; + +import static com.android.launcher3.tapl.LauncherInstrumentation.CALLBACK_RUN_POINT.CALLBACK_HOVER_ENTER; +import static com.android.launcher3.tapl.LauncherInstrumentation.CALLBACK_RUN_POINT.CALLBACK_HOVER_EXIT; + +import android.graphics.Point; +import android.graphics.Rect; +import android.os.SystemClock; +import android.view.MotionEvent; + +import androidx.test.uiautomator.UiObject2; + +/** Represents an item in the overview task menu. */ +public class OverviewTaskMenuItem { + + private final LauncherInstrumentation mLauncher; + private final UiObject2 mMenuItem; + + OverviewTaskMenuItem(LauncherInstrumentation launcher, UiObject2 menuItem) { + mLauncher = launcher; + mMenuItem = menuItem; + } + + /** + * Returns this menu item's visible bounds. + */ + public Rect getVisibleBounds() { + return mMenuItem.getVisibleBounds(); + } + + /** + * Emulate the cursor entering and exiting a hover over this menu item. + */ + public void hoverCursor() { + try (LauncherInstrumentation.Closable e = mLauncher.eventsCheck(); + LauncherInstrumentation.Closable c = mLauncher.addContextLayer( + "cursor hover entering menu item")) { + long downTime = SystemClock.uptimeMillis(); + mLauncher.sendPointer(downTime, downTime, MotionEvent.ACTION_HOVER_ENTER, + new Point(mMenuItem.getVisibleCenter().x, mMenuItem.getVisibleCenter().y), + null); + mLauncher.runCallbackIfActive(CALLBACK_HOVER_ENTER); + + try (LauncherInstrumentation.Closable c1 = mLauncher.addContextLayer( + "cursor hover exiting menu item")) { + downTime = SystemClock.uptimeMillis(); + mLauncher.sendPointer(downTime, downTime, MotionEvent.ACTION_HOVER_EXIT, + new Point(mMenuItem.getVisibleCenter().x, mMenuItem.getVisibleCenter().y), + null); + mLauncher.runCallbackIfActive(CALLBACK_HOVER_EXIT); + } + } + } +} diff --git a/tests/tapl/com/android/launcher3/tapl/Widget.java b/tests/tapl/com/android/launcher3/tapl/Widget.java index d440903eb6..e7016a33ea 100644 --- a/tests/tapl/com/android/launcher3/tapl/Widget.java +++ b/tests/tapl/com/android/launcher3/tapl/Widget.java @@ -17,11 +17,7 @@ package com.android.launcher3.tapl; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.test.uiautomator.By; -import androidx.test.uiautomator.BySelector; import androidx.test.uiautomator.UiObject2; -import androidx.test.uiautomator.Until; import com.android.launcher3.testing.shared.TestProtocol; @@ -69,10 +65,7 @@ public final class Widget extends Launchable implements WorkspaceDragSource { */ @NonNull public WidgetResizeFrame dragWidgetToWorkspace() { - try (LauncherInstrumentation.Closable e = mLauncher.eventsCheck()) { - return dragWidgetToWorkspace(/* configurable= */ false, /* acceptsConfig= */ false, -1, - -1, 1, 1); - } + return dragWidgetToWorkspace(-1, -1, 1, 1); } /** @@ -84,22 +77,19 @@ public final class Widget extends Launchable implements WorkspaceDragSource { try (LauncherInstrumentation.Closable e = mLauncher.eventsCheck(); LauncherInstrumentation.Closable c = mLauncher.addContextLayer( "Dragging widget to workspace cell " + cellX + "," + cellY)) { - return dragWidgetToWorkspace(/* configurable= */ false, /* acceptsConfig= */ false, - cellX, cellY, spanX, spanY); - } - } + if (cellX == -1 || cellY == -1) { + internalDragToWorkspace(/* startsActivity= */ false, /* isWidgetShortcut= */ + false); + } else { + dragToWorkspaceCellPosition(/* startsActivity= */ false, /* isWidgetShortcut= */ + false, cellX, cellY, spanX, spanY); + } - /** - * Drags a configurable widget from the widgets container to the workspace, either accepts or - * cancels the configuration based on {@code acceptsConfig}, and returns the resize frame that - * is shown if the widget is added. - */ - @Nullable - public WidgetResizeFrame dragConfigWidgetToWorkspace(boolean acceptsConfig) { - // TODO(b/239438337, fransebas) add correct event checking for this case - //try (LauncherInstrumentation.Closable e = mLauncher.eventsCheck()) { - return dragWidgetToWorkspace(/* configurable= */ true, acceptsConfig, -1, -1, 1, 1); - //} + try (LauncherInstrumentation.Closable closable = mLauncher.addContextLayer( + "want to get widget resize frame")) { + return new WidgetResizeFrame(mLauncher); + } + } } /** @@ -122,53 +112,4 @@ public final class Widget extends Launchable implements WorkspaceDragSource { isWidgetShortcut, launchable::addExpectedEventsForLongClick); } - - /** - * Drags a widget from the widgets container to the workspace and returns the resize frame that - * is shown after the widget is added. - * - * <p> If {@code configurable} is true, then either accepts or cancels the configuration based - * on {@code acceptsConfig}. - * <p> If either {@code cellX} or {@code cellY} are negative, then a default location would be - * chosen - * - * @param configurable if the widget has a configuration activity. - * @param acceptsConfig if the widget has a configuration, then if we should accept it or - * cancel it - * @param cellX X position to drop the widget in the workspace - * @param cellY Y position to drop the widget in the workspace - * @return returns the given resize frame of the widget after being dropped, if - * configurable is true and acceptsConfig is false then the widget would not be places and will - * be cancel and it returns null. - */ - @Nullable - private WidgetResizeFrame dragWidgetToWorkspace(boolean configurable, boolean acceptsConfig, - int cellX, int cellY, int spanX, int spanY) { - if (cellX == -1 || cellY == -1) { - internalDragToWorkspace(/* startsActivity= */ configurable, /* isWidgetShortcut= */ - false); - } else { - dragToWorkspaceCellPosition(/* startsActivity= */ configurable, /* isWidgetShortcut= */ - false, cellX, cellY, spanX, spanY); - } - - if (configurable) { - // Configure the widget. - BySelector selector = By.text(acceptsConfig ? "OK" : "Cancel"); - mLauncher.getDevice() - .wait(Until.findObject(selector), LauncherInstrumentation.WAIT_TIME_MS) - .click(); - - // If the widget configuration was cancelled, then the widget wasn't added to the home - // screen. In that case, we cannot return a resize frame. - if (!acceptsConfig) { - return null; - } - } - - try (LauncherInstrumentation.Closable c = mLauncher.addContextLayer( - "want to get widget resize frame")) { - return new WidgetResizeFrame(mLauncher); - } - } } |