diff options
Diffstat (limited to 'libs')
171 files changed, 3575 insertions, 1341 deletions
diff --git a/libs/WindowManager/Shell/Android.bp b/libs/WindowManager/Shell/Android.bp index e493ed1110c8..4642fe59bcb2 100644 --- a/libs/WindowManager/Shell/Android.bp +++ b/libs/WindowManager/Shell/Android.bp @@ -234,10 +234,6 @@ android_library { // *.kt sources are inside a filegroup. "kotlin-annotations", ], - required: [ - "wmshell.protolog.json.gz", - "wmshell.protolog.pb", - ], flags_packages: [ "com_android_wm_shell_flags", ], @@ -246,3 +242,11 @@ android_library { plugins: ["dagger2-compiler"], use_resource_processor: true, } + +java_defaults { + name: "wmshell_defaults", + required: [ + "wmshell.protolog.json.gz", + "wmshell.protolog.pb", + ], +} diff --git a/libs/WindowManager/Shell/AndroidManifest.xml b/libs/WindowManager/Shell/AndroidManifest.xml index 3b739c3d5817..1260796810c2 100644 --- a/libs/WindowManager/Shell/AndroidManifest.xml +++ b/libs/WindowManager/Shell/AndroidManifest.xml @@ -24,6 +24,7 @@ <uses-permission android:name="android.permission.WAKEUP_SURFACE_FLINGER" /> <uses-permission android:name="android.permission.READ_FRAME_BUFFER" /> <uses-permission android:name="android.permission.SUBSCRIBE_TO_KEYGUARD_LOCKED_STATE" /> + <uses-permission android:name="android.permission.UPDATE_DOMAIN_VERIFICATION_USER_SELECTION" /> <application> <activity diff --git a/libs/WindowManager/Shell/res/drawable/open_by_default_settings_dialog_dismiss_button_background.xml b/libs/WindowManager/Shell/res/drawable/open_by_default_settings_dialog_confirm_button_background.xml index 2b2e9df07dce..2b2e9df07dce 100644 --- a/libs/WindowManager/Shell/res/drawable/open_by_default_settings_dialog_dismiss_button_background.xml +++ b/libs/WindowManager/Shell/res/drawable/open_by_default_settings_dialog_confirm_button_background.xml diff --git a/libs/WindowManager/Shell/res/layout/open_by_default_settings_dialog.xml b/libs/WindowManager/Shell/res/layout/open_by_default_settings_dialog.xml index 8ff382bbc7b4..b5bceda9a623 100644 --- a/libs/WindowManager/Shell/res/layout/open_by_default_settings_dialog.xml +++ b/libs/WindowManager/Shell/res/layout/open_by_default_settings_dialog.xml @@ -111,7 +111,7 @@ </RadioGroup> <Button - android:id="@+id/open_by_default_settings_dialog_dismiss_button" + android:id="@+id/open_by_default_settings_dialog_confirm_button" android:layout_width="wrap_content" android:layout_height="36dp" android:text="@string/open_by_default_dialog_dismiss_button_text" @@ -122,7 +122,7 @@ android:textSize="14sp" android:textFontWeight="500" android:textColor="?androidprv:attr/materialColorOnPrimary" - android:background="@drawable/open_by_default_settings_dialog_dismiss_button_background"/> + android:background="@drawable/open_by_default_settings_dialog_confirm_button_background"/> </LinearLayout> </ScrollView> </FrameLayout> diff --git a/libs/WindowManager/Shell/res/layout/pip2_menu_action.xml b/libs/WindowManager/Shell/res/layout/pip2_menu_action.xml new file mode 100644 index 000000000000..04ece31cb820 --- /dev/null +++ b/libs/WindowManager/Shell/res/layout/pip2_menu_action.xml @@ -0,0 +1,39 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (C) 2024 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. +--> +<com.android.wm.shell.pip2.phone.PipMenuActionView + xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="@dimen/pip_action_size" + android:layout_height="@dimen/pip_action_size" + android:background="?android:selectableItemBackgroundBorderless" + android:forceHasOverlappingRendering="false"> + + <ImageView + android:id="@+id/custom_close_bg" + android:layout_width="@dimen/pip_custom_close_bg_size" + android:layout_height="@dimen/pip_custom_close_bg_size" + android:layout_gravity="center" + android:src="@drawable/pip_custom_close_bg" + android:visibility="gone"/> + + <ImageView + android:id="@+id/image" + android:layout_width="@dimen/pip_action_inner_size" + android:layout_height="@dimen/pip_action_inner_size" + android:layout_gravity="center" + android:scaleType="fitXY"/> + +</com.android.wm.shell.pip2.phone.PipMenuActionView> diff --git a/libs/WindowManager/Shell/res/values-af/strings.xml b/libs/WindowManager/Shell/res/values-af/strings.xml index 50aa4ca1a1f1..582c1a22a203 100644 --- a/libs/WindowManager/Shell/res/values-af/strings.xml +++ b/libs/WindowManager/Shell/res/values-af/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Kamerakwessies?\nTik om aan te pas"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nie opgelos nie?\nTik om terug te stel"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Geen kamerakwessies nie? Tik om toe te maak."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Tik om die appkieslys oop te maak"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Tik om verskeie apps saam te wys"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Keer terug na volskerm van die appkieslys af"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Sien en doen meer"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Sleep ’n ander app in vir verdeelde skerm"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Dubbeltik buite ’n program om dit te herposisioneer"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Bestuur vensters"</string> <string name="close_text" msgid="4986518933445178928">"Maak toe"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Maak kieslys toe"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Maak kieslys oop"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maksimeer skerm"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Gryp skerm vas"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Hierdie app se grootte kan nie verander word nie"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"App kan nie hierheen geskuif word nie"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maksimeer"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Spring na links"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Spring na regs"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-am/strings.xml b/libs/WindowManager/Shell/res/values-am/strings.xml index 281e313d328f..0798c9a8fbe0 100644 --- a/libs/WindowManager/Shell/res/values-am/strings.xml +++ b/libs/WindowManager/Shell/res/values-am/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"የካሜራ ችግሮች አሉ?\nዳግም ለማበጀት መታ ያድርጉ"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"አልተስተካከለም?\nለማህደር መታ ያድርጉ"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ምንም የካሜራ ችግሮች የሉም? ለማሰናበት መታ ያድርጉ።"</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"የመተግበሪያ ምናሌውን ለመክፈት መታ ያድርጉ"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"በርካታ መተግበሪያዎችን በአንድ ላይ ለማየት መታ ያድርጉ"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"ከመተግበሪያ ምናሌው ወደ ሙሉ ማያ ገፅ ይመለሱ"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"ተጨማሪ ይመልከቱ እና ያድርጉ"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"ለተከፈለ ማያ ገፅ ሌላ መተግበሪያ ይጎትቱ"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"ቦታውን ለመቀየር ከመተግበሪያው ውጭ ሁለቴ መታ ያድርጉ"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"መስኮቶችን አስተዳድር"</string> <string name="close_text" msgid="4986518933445178928">"ዝጋ"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"ምናሌ ዝጋ"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"ምናሌን ክፈት"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"የማያ ገጹ መጠን አሳድግ"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"ማያ ገጹን አሳድግ"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"ይህ መተግበሪያ መጠኑ ሊቀየር አይችልም"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"መተግበሪያ ወደዚህ መንቀሳቀስ አይችልም"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"አሳድግ"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"ወደ ግራ አሳድግ"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"ወደ ቀኝ አሳድግ"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-ar/strings.xml b/libs/WindowManager/Shell/res/values-ar/strings.xml index 2c0b34a604a9..9dcb5ec26273 100644 --- a/libs/WindowManager/Shell/res/values-ar/strings.xml +++ b/libs/WindowManager/Shell/res/values-ar/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"هل هناك مشاكل في الكاميرا؟\nانقر لإعادة الضبط."</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"ألم يتم حل المشكلة؟\nانقر للعودة"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"أليس هناك مشاكل في الكاميرا؟ انقر للإغلاق."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"انقر لفتح قائمة التطبيق"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"انقر لعرض عدة تطبيقات معًا"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"الرجوع إلى وضع ملء الشاشة من قائمة التطبيق"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"استخدام تطبيقات متعدّدة في وقت واحد"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"اسحب تطبيقًا آخر لاستخدام وضع تقسيم الشاشة."</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"انقر مرّتين خارج تطبيق لتغيير موضعه."</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"إدارة النوافذ"</string> <string name="close_text" msgid="4986518933445178928">"إغلاق"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"إغلاق القائمة"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"فتح القائمة"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"تكبير الشاشة إلى أقصى حدّ"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"التقاط صورة للشاشة"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"لا يمكن تغيير حجم نافذة هذا التطبيق"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"لا يمكن نقل التطبيق إلى هنا"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"تكبير"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"المحاذاة إلى اليسار"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"المحاذاة إلى اليمين"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-as/strings.xml b/libs/WindowManager/Shell/res/values-as/strings.xml index c5e37162e2d9..484eef53e087 100644 --- a/libs/WindowManager/Shell/res/values-as/strings.xml +++ b/libs/WindowManager/Shell/res/values-as/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"কেমেৰাৰ কোনো সমস্যা হৈছে নেকি?\nপুনৰ খাপ খোৱাবলৈ টিপক"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"এইটো সমাধান কৰা নাই নেকি?\nপূৰ্বাৱস্থালৈ নিবলৈ টিপক"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"কেমেৰাৰ কোনো সমস্যা নাই নেকি? অগ্ৰাহ্য কৰিবলৈ টিপক।"</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"এপৰ মেনুখন খুলিবলৈ টিপক"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"একাধিক এপ্ একেলগে দেখুৱাবলৈ টিপক"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"এপৰ মেনুখনৰ পৰা পূৰ্ণ স্ক্ৰীনলৈ উভতি যাওক"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"চাওক আৰু অধিক কৰক"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"বিভাজিত স্ক্ৰীনৰ বাবে অন্য এটা এপ্ টানি আনি এৰক"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"এপ্টোৰ স্থান সলনি কৰিবলৈ ইয়াৰ বাহিৰত দুবাৰ টিপক"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"ৱিণ্ড’ পৰিচালনা কৰক"</string> <string name="close_text" msgid="4986518933445178928">"বন্ধ কৰক"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"মেনু বন্ধ কৰক"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"মেনু খোলক"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"স্ক্ৰীন মেক্সিমাইজ কৰক"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"স্ক্ৰীন স্নেপ কৰক"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"এই এপ্টোৰ আকাৰ সলনি কৰিব নোৱাৰি"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"ইয়ালৈ এপ্টো আনিব নোৱাৰি"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"মেক্সিমাইজ কৰক"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"বাওঁফাললৈ স্নেপ কৰক"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"সোঁফাললৈ স্নেপ কৰক"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-az/strings.xml b/libs/WindowManager/Shell/res/values-az/strings.xml index e23e8d049a8f..ded6da80464d 100644 --- a/libs/WindowManager/Shell/res/values-az/strings.xml +++ b/libs/WindowManager/Shell/res/values-az/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Kamera problemi var?\nBərpa etmək üçün toxunun"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Düzəltməmisiniz?\nGeri qaytarmaq üçün toxunun"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Kamera problemi yoxdur? Qapatmaq üçün toxunun."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Tətbiq menyusunu açmaq üçün toxunun"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Bir neçə tətbiqi birlikdə göstərmək üçün toxunun"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Tətbiq menyusundan tam ekrana qayıdın"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Ardını görün və edin"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Bölünmüş ekran üçün başqa tətbiq sürüşdürün"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Tətbiqin yerini dəyişmək üçün kənarına iki dəfə toxunun"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Pəncərələri idarə edin"</string> <string name="close_text" msgid="4986518933445178928">"Bağlayın"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Menyunu bağlayın"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Menyunu açın"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Ekranı maksimum böyüdün"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Ekranı çəkin"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Bu tətbiqin ölçüsünü dəyişmək olmur"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Tətbiqi bura köçürmək mümkün deyil"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Böyüdün"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Sola tərəf çəkin"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Sağa tərəf çəkin"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml b/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml index 283d1f5578cf..415547c790f4 100644 --- a/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml +++ b/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Imate problema sa kamerom?\nDodirnite da biste ponovo uklopili"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Problem nije rešen?\nDodirnite da biste vratili"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nemate problema sa kamerom? Dodirnite da biste odbacili."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Dodirnite da biste otvorili meni aplikacije"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Dodirnite da biste prikazali više aplikacija zajedno"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Vratite se iz menija aplikacije na prikaz preko celog ekrana"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Vidite i uradite više"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Prevucite drugu aplikaciju da biste koristili podeljeni ekran"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Dvaput dodirnite izvan aplikacije da biste promenili njenu poziciju"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Upravljajte prozorima"</string> <string name="close_text" msgid="4986518933445178928">"Zatvorite"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Zatvorite meni"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Otvorite meni"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Povećaj ekran"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Uklopi ekran"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Veličina ove aplikacije ne može da se promeni"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Aplikacija ne može da se premesti ovde"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Uvećajte"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Prikačite levo"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Prikačite desno"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-be/strings.xml b/libs/WindowManager/Shell/res/values-be/strings.xml index 48914f1eb27c..aded647d43a1 100644 --- a/libs/WindowManager/Shell/res/values-be/strings.xml +++ b/libs/WindowManager/Shell/res/values-be/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Праблемы з камерай?\nНацісніце, каб пераабсталяваць"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Не ўдалося выправіць?\nНацісніце, каб аднавіць"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Ніякіх праблем з камерай? Націсніце, каб адхіліць."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Адкрыць меню праграмы"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Паказаць некалькі праграм разам"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Вярнуцца ў поўнаэкранны рэжым з меню праграмы"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Адначасова выконвайце розныя задачы"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Перацягніце іншую праграму, каб выкарыстоўваць падзелены экран"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Двойчы націсніце экран па-за праграмай, каб перамясціць яе"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Кіраваць вокнамі"</string> <string name="close_text" msgid="4986518933445178928">"Закрыць"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Закрыць меню"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Адкрыць меню"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Разгарнуць на ўвесь экран"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Размясціць на палавіне экрана"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Немагчыма змяніць памер праграмы"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Нельга перамясціць сюды праграму"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Разгарнуць"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Размясціць злева"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Размясціць справа"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-bg/strings.xml b/libs/WindowManager/Shell/res/values-bg/strings.xml index f5e94da56055..8a69176f2b6f 100644 --- a/libs/WindowManager/Shell/res/values-bg/strings.xml +++ b/libs/WindowManager/Shell/res/values-bg/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Имате проблеми с камерата?\nДокоснете за ремонтиране"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Проблемът не се отстрани?\nДокоснете за връщане в предишното състояние"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Нямате проблеми с камерата? Докоснете, за да отхвърлите."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Докоснете, за да отворите менюто на приложението"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Докоснете, за да видите няколко приложения заедно"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Връщане към цял екран от менюто на приложението"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Преглеждайте и правете повече неща"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Преместете друго приложение с плъзгане, за да преминете в режим за разделен екран"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Докоснете два пъти извън дадено приложение, за да промените позицията му"</string> @@ -129,8 +132,18 @@ <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Отваряне на менюто"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Увеличаване на екрана"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Прилепване на екрана"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Това приложение не може да бъде преоразмерено"</string> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Приложението не може да бъде преместено тук"</string> <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Увеличаване"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Прилепване наляво"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Прилепване надясно"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> + <skip /> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-bn/strings.xml b/libs/WindowManager/Shell/res/values-bn/strings.xml index 5d6374403662..3799c9fd1dca 100644 --- a/libs/WindowManager/Shell/res/values-bn/strings.xml +++ b/libs/WindowManager/Shell/res/values-bn/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"ক্যামেরা সংক্রান্ত সমস্যা?\nরিফিট করতে ট্যাপ করুন"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"এখনও সমাধান হয়নি?\nরিভার্ট করার জন্য ট্যাপ করুন"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ক্যামেরা সংক্রান্ত সমস্যা নেই? বাতিল করতে ট্যাপ করুন।"</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"অ্যাপ মেনু খুলতে ট্যাপ করুন"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"একাধিক অ্যাপ একসাথে দেখতে ট্যাপ করুন"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"অ্যাপ মেনু থেকে ফুল-স্ক্রিন মোডে ফিরে যান"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"দেখুন ও আরও অনেক কিছু করুন"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"স্প্লিট স্ক্রিনের ক্ষেত্রে অন্য কোনও অ্যাপ টেনে আনুন"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"কোনও অ্যাপের স্থান পরিবর্তন করতে তার বাইরে ডবল ট্যাপ করুন"</string> @@ -129,8 +132,18 @@ <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"মেনু খুলুন"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"স্ক্রিন বড় করুন"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"স্ক্রিনে অ্যাপ মানানসই হিসেবে ছোট বড় করুন"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"এই অ্যাপ ছোট বড় করা যাবে না"</string> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"অ্যাপটি এখানে সরানো যাবে না"</string> <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"বড় করুন"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"বাঁদিকে স্ন্যাপ করুন"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"ডানদিকে স্ন্যাপ করুন"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> + <skip /> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-bs/strings.xml b/libs/WindowManager/Shell/res/values-bs/strings.xml index 95362bbfeab5..f0d172ad20d0 100644 --- a/libs/WindowManager/Shell/res/values-bs/strings.xml +++ b/libs/WindowManager/Shell/res/values-bs/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problemi s kamerom?\nDodirnite da ponovo namjestite"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nije popravljeno?\nDodirnite da vratite"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nema problema s kamerom? Dodirnite da odbacite."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Otvaranje menija aplikacije dodirom"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Istovremeni prikaz više aplikacija dodirom"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Povratak na prikaz preko cijelog ekrana putem menija aplikacije"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Pogledajte i učinite više"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Prevucite još jednu aplikaciju za podijeljeni ekran"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Dvaput dodirnite izvan aplikacije da promijenite njen položaj"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Upravljanje prozorima"</string> <string name="close_text" msgid="4986518933445178928">"Zatvaranje"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Zatvaranje menija"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Otvaranje menija"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maksimiziraj ekran"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Snimi ekran"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Nije moguće promijeniti veličinu aplikacije"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Ne možete premjestiti aplikaciju ovdje"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maksimiziranje"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Pomicanje ulijevo"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Pomicanje udesno"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-ca/strings.xml b/libs/WindowManager/Shell/res/values-ca/strings.xml index e0b25389e6f1..bf35c90f89ab 100644 --- a/libs/WindowManager/Shell/res/values-ca/strings.xml +++ b/libs/WindowManager/Shell/res/values-ca/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Tens problemes amb la càmera?\nToca per resoldre\'ls"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"El problema no s\'ha resolt?\nToca per desfer els canvis"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"No tens cap problema amb la càmera? Toca per ignorar."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Toca per obrir el menú de l\'aplicació"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Toca per mostrar diverses aplicacions alhora"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Torna a la pantalla completa des del menú de l\'aplicació"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Consulta i fes més coses"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Arrossega una altra aplicació per utilitzar la pantalla dividida"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Fes doble toc fora d\'una aplicació per canviar-ne la posició"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Gestiona les finestres"</string> <string name="close_text" msgid="4986518933445178928">"Tanca"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Tanca el menú"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Obre el menú"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximitza la pantalla"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Ajusta la pantalla"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"No es pot canviar la mida d\'aquesta aplicació"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"L\'aplicació no es pot moure aquí"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maximitza"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Ajusta a l\'esquerra"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Ajusta a la dreta"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-cs/strings.xml b/libs/WindowManager/Shell/res/values-cs/strings.xml index 716491020c65..7fc1033b71be 100644 --- a/libs/WindowManager/Shell/res/values-cs/strings.xml +++ b/libs/WindowManager/Shell/res/values-cs/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problémy s fotoaparátem?\nKlepnutím vyřešíte"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nepomohlo to?\nKlepnutím se vrátíte"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Žádné problémy s fotoaparátem? Klepnutím zavřete."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Klepnutím otevřete nabídku aplikace"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Klepnutím zobrazíte několik aplikací najednou"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Návrat na celou obrazovku z nabídky aplikace"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Lepší zobrazení a více možností"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Přetáhnutím druhé aplikace použijete rozdělenou obrazovku"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Dvojitým klepnutím mimo aplikaci změníte její umístění"</string> @@ -129,8 +132,18 @@ <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Otevřít nabídku"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximalizovat obrazovku"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Rozpůlit obrazovku"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Velikost aplikace nelze změnit"</string> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Aplikaci sem nelze přesunout"</string> <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maximalizovat"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Přichytit vlevo"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Přichytit vpravo"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> + <skip /> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-da/strings.xml b/libs/WindowManager/Shell/res/values-da/strings.xml index fdc59137dd5e..717e6c42dd51 100644 --- a/libs/WindowManager/Shell/res/values-da/strings.xml +++ b/libs/WindowManager/Shell/res/values-da/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Har du problemer med dit kamera?\nTryk for at gendanne det oprindelige format"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Løste det ikke problemet?\nTryk for at fortryde"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Har du ingen problemer med dit kamera? Tryk for at afvise."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Tryk for at åbne appmenuen"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Tryk for at se flere apps på én gang"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Gå tilbage til fuld skærm via appmenuen"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Se og gør mere"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Træk en anden app hertil for at bruge opdelt skærm"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Tryk to gange uden for en app for at justere dens placering"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Administrer vinduer"</string> <string name="close_text" msgid="4986518933445178928">"Luk"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Luk menu"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Åbn menu"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maksimér skærm"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Tilpas skærm"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Størrelsen på denne app kan ikke justeres"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Apps kan ikke flyttes hertil"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maksimér"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Fastgør til venstre"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Fastgør til højre"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-de/strings.xml b/libs/WindowManager/Shell/res/values-de/strings.xml index 913e3d0abf0f..bccd4ae1d6df 100644 --- a/libs/WindowManager/Shell/res/values-de/strings.xml +++ b/libs/WindowManager/Shell/res/values-de/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Probleme mit der Kamera?\nZum Anpassen tippen."</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Das Problem ist nicht behoben?\nZum Rückgängigmachen tippen."</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Keine Probleme mit der Kamera? Zum Schließen tippen."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Zum Öffnen des App-Menüs tippen"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Tippen, um mehrere Apps gleichzeitig anzuzeigen"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Über das App-Menü zum Vollbildmodus zurückkehren"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Mehr sehen und erledigen"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Für Splitscreen-Modus weitere App hineinziehen"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Außerhalb einer App doppeltippen, um die Position zu ändern"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Fenster verwalten"</string> <string name="close_text" msgid="4986518933445178928">"Schließen"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Menü schließen"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Menü öffnen"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Bildschirm maximieren"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Bildschirm teilen"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Die Größe dieser App kann nicht geändert werden"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Die App kann nicht hierher verschoben werden"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maximieren"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Links andocken"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Rechts andocken"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-el/strings.xml b/libs/WindowManager/Shell/res/values-el/strings.xml index 564fa910fdcd..1039273978e1 100644 --- a/libs/WindowManager/Shell/res/values-el/strings.xml +++ b/libs/WindowManager/Shell/res/values-el/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Προβλήματα με την κάμερα;\nΠατήστε για επιδιόρθωση."</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Δεν διορθώθηκε;\nΠατήστε για επαναφορά."</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Δεν αντιμετωπίζετε προβλήματα με την κάμερα; Πατήστε για παράβλεψη."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Πατήστε για άνοιγμα του μενού της εφαρμογής"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Πατήστε για εμφάνιση πολλών εφαρμογών μαζί"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Επιστρέψτε στην πλήρη οθόνη από το μενού της εφαρμογής"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Δείτε και κάντε περισσότερα"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Σύρετε σε μια άλλη εφαρμογή για διαχωρισμό οθόνης."</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Πατήστε δύο φορές έξω από μια εφαρμογή για να αλλάξετε τη θέση της"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Διαχείριση παραθύρων"</string> <string name="close_text" msgid="4986518933445178928">"Κλείσιμο"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Κλείσιμο μενού"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Άνοιγμα μενού"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Μεγιστοποίηση οθόνης"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Προβολή στο μισό της οθόνης"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Δεν είναι δυνατή η αλλαγή μεγέθους αυτής της εφαρμογής"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Δεν είναι δυνατή η μετακίνηση της εφαρμογής εδώ"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Μεγιστοποίηση"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Κούμπωμα αριστερά"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Κούμπωμα δεξιά"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-en-rAU/strings.xml b/libs/WindowManager/Shell/res/values-en-rAU/strings.xml index 766852d4b1f0..98da627a4434 100644 --- a/libs/WindowManager/Shell/res/values-en-rAU/strings.xml +++ b/libs/WindowManager/Shell/res/values-en-rAU/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Camera issues?\nTap to refit"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Didn’t fix it?\nTap to revert"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"No camera issues? Tap to dismiss."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Tap to open the app menu"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Tap to show multiple apps together"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Return to fullscreen from the app menu"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"See and do more"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Drag in another app for split screen"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Double-tap outside an app to reposition it"</string> @@ -129,8 +132,18 @@ <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Open menu"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximise screen"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Snap screen"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"This app can\'t be resized"</string> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"App can\'t be moved here"</string> <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maximise"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Snap left"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Snap right"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> + <skip /> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-en-rCA/strings.xml b/libs/WindowManager/Shell/res/values-en-rCA/strings.xml index aa3a484079f8..e928fe02fbcf 100644 --- a/libs/WindowManager/Shell/res/values-en-rCA/strings.xml +++ b/libs/WindowManager/Shell/res/values-en-rCA/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Camera issues?\nTap to refit"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Didn’t fix it?\nTap to revert"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"No camera issues? Tap to dismiss."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Tap to open the app menu"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Tap to show multiple apps together"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Return to fullscreen from the app menu"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"See and do more"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Drag in another app for split screen"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Double-tap outside an app to reposition it"</string> @@ -129,8 +132,18 @@ <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Open Menu"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximize Screen"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Snap Screen"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"This app can\'t be resized"</string> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"App can\'t be moved here"</string> <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maximize"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Snap left"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Snap right"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> + <skip /> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-en-rGB/strings.xml b/libs/WindowManager/Shell/res/values-en-rGB/strings.xml index d5b97037496a..98da627a4434 100644 --- a/libs/WindowManager/Shell/res/values-en-rGB/strings.xml +++ b/libs/WindowManager/Shell/res/values-en-rGB/strings.xml @@ -97,12 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Camera issues?\nTap to refit"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Didn’t fix it?\nTap to revert"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"No camera issues? Tap to dismiss."</string> - <!-- no translation found for windowing_app_handle_education_tooltip (6398482412956375783) --> - <skip /> - <!-- no translation found for windowing_desktop_mode_image_button_education_tooltip (6285279585554484957) --> - <skip /> - <!-- no translation found for windowing_desktop_mode_exit_education_tooltip (6685429075790085337) --> - <skip /> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Tap to open the app menu"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Tap to show multiple apps together"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Return to fullscreen from the app menu"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"See and do more"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Drag in another app for split screen"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Double-tap outside an app to reposition it"</string> @@ -135,9 +132,18 @@ <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Open menu"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximise screen"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Snap screen"</string> - <!-- no translation found for desktop_mode_non_resizable_snap_text (3771776422751387878) --> - <skip /> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"App can\'t be moved here"</string> <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maximise"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Snap left"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Snap right"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> + <skip /> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-en-rIN/strings.xml b/libs/WindowManager/Shell/res/values-en-rIN/strings.xml index 766852d4b1f0..98da627a4434 100644 --- a/libs/WindowManager/Shell/res/values-en-rIN/strings.xml +++ b/libs/WindowManager/Shell/res/values-en-rIN/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Camera issues?\nTap to refit"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Didn’t fix it?\nTap to revert"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"No camera issues? Tap to dismiss."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Tap to open the app menu"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Tap to show multiple apps together"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Return to fullscreen from the app menu"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"See and do more"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Drag in another app for split screen"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Double-tap outside an app to reposition it"</string> @@ -129,8 +132,18 @@ <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Open menu"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximise screen"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Snap screen"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"This app can\'t be resized"</string> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"App can\'t be moved here"</string> <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maximise"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Snap left"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Snap right"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> + <skip /> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-en-rXC/strings.xml b/libs/WindowManager/Shell/res/values-en-rXC/strings.xml index bda5132156cd..e48a9dbc2ebb 100644 --- a/libs/WindowManager/Shell/res/values-en-rXC/strings.xml +++ b/libs/WindowManager/Shell/res/values-en-rXC/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Camera issues?\nTap to refit"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Didn’t fix it?\nTap to revert"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"No camera issues? Tap to dismiss."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Tap to open the app menu"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Tap to show multiple apps together"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Return to fullscreen from the app menu"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"See and do more"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Drag in another app for split screen"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Double-tap outside an app to reposition it"</string> @@ -129,8 +132,18 @@ <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Open Menu"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximize Screen"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Snap Screen"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"This app can\'t be resized"</string> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"App can\'t be moved here"</string> <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maximize"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Snap left"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Snap right"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> + <skip /> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-es-rUS/strings.xml b/libs/WindowManager/Shell/res/values-es-rUS/strings.xml index a4c03632cbe4..f349cbb1aeed 100644 --- a/libs/WindowManager/Shell/res/values-es-rUS/strings.xml +++ b/libs/WindowManager/Shell/res/values-es-rUS/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"¿Tienes problemas con la cámara?\nPresiona para reajustarla"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"¿No se resolvió?\nPresiona para revertir los cambios"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"¿No tienes problemas con la cámara? Presionar para descartar."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Presiona para abrir el menú de la app"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Presiona para mostrar varias apps juntas"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Regresa a pantalla completa desde el menú de la app"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Aprovecha más"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Arrastra otra app para el modo de pantalla dividida"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Presiona dos veces fuera de una app para cambiar su ubicación"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Administrar ventanas"</string> <string name="close_text" msgid="4986518933445178928">"Cerrar"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Cerrar menú"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Abrir el menú"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximizar pantalla"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Ajustar pantalla"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"No se puede cambiar el tamaño de esta app"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"No se puede mover la app aquí"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maximizar"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Ajustar a la izquierda"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Ajustar a la derecha"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-es/strings.xml b/libs/WindowManager/Shell/res/values-es/strings.xml index 69f7d7b020d6..9f6b2e65c27c 100644 --- a/libs/WindowManager/Shell/res/values-es/strings.xml +++ b/libs/WindowManager/Shell/res/values-es/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"¿Problemas con la cámara?\nToca para reajustar"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"¿No se ha solucionado?\nToca para revertir"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"¿No hay problemas con la cámara? Toca para cerrar."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Toca para abrir el menú de aplicaciones"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Toca para mostrar varias aplicaciones a la vez"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Vuelve a pantalla completa desde el menú de aplicaciones"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Consulta más información y haz más"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Arrastra otra aplicación para activar la pantalla dividida"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Toca dos veces fuera de una aplicación para cambiarla de posición"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Gestionar ventanas"</string> <string name="close_text" msgid="4986518933445178928">"Cerrar"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Cerrar menú"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Abrir menú"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximizar pantalla"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Ajustar pantalla"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"No se puede cambiar el tamaño de esta aplicación"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"La aplicación no se puede mover aquí"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maximizar"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Acoplar a la izquierda"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Acoplar a la derecha"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-et/strings.xml b/libs/WindowManager/Shell/res/values-et/strings.xml index 3d929f6cd8d3..b2b06d6db5d2 100644 --- a/libs/WindowManager/Shell/res/values-et/strings.xml +++ b/libs/WindowManager/Shell/res/values-et/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Kas teil on kaameraprobleeme?\nPuudutage ümberpaigutamiseks."</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Kas probleemi ei lahendatud?\nPuudutage ennistamiseks."</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Kas kaameraprobleeme pole? Puudutage loobumiseks."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Puudutage rakenduse menüü avamiseks"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Puudutage mitme rakenduse koos kuvamiseks"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Minge rakenduse menüüst tagasi täisekraanile"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Vaadake ja tehke rohkem"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Lohistage muusse rakendusse, et jagatud ekraanikuva kasutada"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Topeltpuudutage rakendusest väljaspool, et selle asendit muuta"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Akende haldamine"</string> <string name="close_text" msgid="4986518933445178928">"Sule"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Sule menüü"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Ava menüü"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Kuva täisekraanil"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Kuva poolel ekraanil"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Selle rakenduse aknasuurust ei saa muuta"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Rakendust ei saa siia teisaldada"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maksimeeri"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Tõmmake vasakule"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Tõmmake paremale"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-eu/strings.xml b/libs/WindowManager/Shell/res/values-eu/strings.xml index 39bcf080fcf3..4a71c49b8d8a 100644 --- a/libs/WindowManager/Shell/res/values-eu/strings.xml +++ b/libs/WindowManager/Shell/res/values-eu/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Arazoak dauzkazu kamerarekin?\nBerriro doitzeko, sakatu hau."</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Ez al da konpondu?\nLeheneratzeko, sakatu hau."</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Ez daukazu arazorik kamerarekin? Baztertzeko, sakatu hau."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Sakatu hau aplikazioen menua irekitzeko"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Sakatu hau aplikazio bat baino gehiago aldi berean erakusteko"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Itzuli pantaila osora aplikazioen menutik"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Ikusi eta egin gauza gehiago"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Pantaila zatitua ikusteko, arrastatu beste aplikazio bat"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Aplikazioaren posizioa aldatzeko, sakatu birritan haren kanpoaldea"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Kudeatu leihoak"</string> <string name="close_text" msgid="4986518933445178928">"Itxi"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Itxi menua"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Ireki menua"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Handitu pantaila"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Zatitu pantaila"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Ezin zaio aldatu tamaina aplikazio honi"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Aplikazioa ezin da hona ekarri"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maximizatu"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Ezarri ezkerrean"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Ezarri eskuinean"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-fa/strings.xml b/libs/WindowManager/Shell/res/values-fa/strings.xml index 9f607bf89656..941ff84b7799 100644 --- a/libs/WindowManager/Shell/res/values-fa/strings.xml +++ b/libs/WindowManager/Shell/res/values-fa/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"دوربین مشکل دارد؟\nبرای تنظیم مجدد اندازه تکضرب بزنید"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"مشکل برطرف نشد؟\nبرای برگرداندن تکضرب بزنید"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"دوربین مشکلی ندارد؟ برای بستن تکضرب بزنید."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"برای باز کردن منو برنامه، تکضرب بزنید"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"برای نمایش چند برنامه با هم، تکضرب بزنید"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"از منو برنامه به تمامصفحه برگردید"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"از چندین برنامه بهطور همزمان استفاده کنید"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"برای حالت صفحهٔ دونیمه، در برنامهای دیگر بکشید"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"برای جابهجا کردن برنامه، بیرون از آن دو تکضرب بزنید"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"مدیریت کردن پنجرهها"</string> <string name="close_text" msgid="4986518933445178928">"بستن"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"بستن منو"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"باز کردن منو"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"بزرگ کردن صفحه"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"بزرگ کردن صفحه"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"اندازه این برنامه را نمیتوان تغییر داد"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"برنامه را نمیتوان به اینجا منتقل کرد"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"بزرگ کردن"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"کشیدن بهچپ"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"کشیدن بهراست"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-fi/strings.xml b/libs/WindowManager/Shell/res/values-fi/strings.xml index 04b6241ca90b..a45e9afeabfc 100644 --- a/libs/WindowManager/Shell/res/values-fi/strings.xml +++ b/libs/WindowManager/Shell/res/values-fi/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Onko kameran kanssa ongelmia?\nKorjaa napauttamalla"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Eikö ongelma ratkennut?\nKumoa napauttamalla"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Ei ongelmia kameran kanssa? Hylkää napauttamalla."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Avaa sovellusvalikko napauttamalla"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Näytä useita sovelluksia yhdessä napauttamalla"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Palaa koko näytön tilaan sovellusvalikosta"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Näe ja tee enemmän"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Käytä jaettua näyttöä vetämällä tähän toinen sovellus"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Kaksoisnapauta sovelluksen ulkopuolella, jos haluat siirtää sitä"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Hallinnoi ikkunoita"</string> <string name="close_text" msgid="4986518933445178928">"Sulje"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Sulje valikko"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Avaa valikko"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Suurenna näyttö"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Jaa näyttö"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Tämän sovellusikkunan kokoa ei voi muuttaa"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Sovellusta ei voi siirtää tänne"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Suurenna"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Siirrä vasemmalle"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Siirrä oikealle"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml b/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml index 73129525ebdd..c163165a8296 100644 --- a/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml +++ b/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problèmes d\'appareil photo?\nTouchez pour réajuster"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Problème non résolu?\nTouchez pour rétablir"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Aucun problème d\'appareil photo? Touchez pour ignorer."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Toucher ici pour ouvrir le menu de l\'appli"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Toucher ici pour afficher plusieurs applis ensemble"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Revenir au mode Plein écran à partir du menu de l\'appli"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Voir et en faire plus"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Faites glisser une autre appli pour utiliser l\'écran partagé"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Touchez deux fois à côté d\'une appli pour la repositionner"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Gérer les fenêtres"</string> <string name="close_text" msgid="4986518933445178928">"Fermer"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Fermer le menu"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Ouvrir le menu"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Agrandir l\'écran"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Aligner l\'écran"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Impossible de redimensionner cette appli"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Impossible de déplacer l\'appli ici"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Agrandir"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Épingler à gauche"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Épingler à droite"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-fr/strings.xml b/libs/WindowManager/Shell/res/values-fr/strings.xml index 8f4e58f99a13..b2a6f16733b3 100644 --- a/libs/WindowManager/Shell/res/values-fr/strings.xml +++ b/libs/WindowManager/Shell/res/values-fr/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problèmes d\'appareil photo ?\nAppuyez pour réajuster"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Problème non résolu ?\nAppuyez pour rétablir"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Aucun problème d\'appareil photo ? Appuyez pour ignorer."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Appuyer pour ouvrir le menu de l\'appli"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Appuyer pour afficher plusieurs applis simultanément"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Revenir en plein écran depuis le menu de l\'appli"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Voir et interagir plus"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Faites glisser une autre appli pour utiliser l\'écran partagé"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Appuyez deux fois en dehors d\'une appli pour la repositionner"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Gérer les fenêtres"</string> <string name="close_text" msgid="4986518933445178928">"Fermer"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Fermer le menu"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Ouvrir le menu"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Mettre en plein écran"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Fractionner l\'écran"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Impossible de redimensionner cette appli"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Impossible de déplacer l\'appli ici"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Agrandir"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Ancrer à gauche"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Ancrer à droite"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-gl/strings.xml b/libs/WindowManager/Shell/res/values-gl/strings.xml index 5c0aa074b329..ab972f94af22 100644 --- a/libs/WindowManager/Shell/res/values-gl/strings.xml +++ b/libs/WindowManager/Shell/res/values-gl/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Tes problemas coa cámara?\nToca para reaxustala"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Non se solucionaron os problemas?\nToca para reverter o seu tratamento"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Non hai problemas coa cámara? Tocar para ignorar."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Toca para abrir o menú da aplicación"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Toca para mostrar varias aplicacións xuntas"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Volve á pantalla completa desde o menú da aplicación"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Ver e facer máis"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Arrastra outra aplicación para usar a pantalla dividida"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Toca dúas veces fóra da aplicación para cambiala de posición"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Xestionar as ventás"</string> <string name="close_text" msgid="4986518933445178928">"Pechar"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Pechar o menú"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Abrir o menú"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximizar pantalla"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Encaixar pantalla"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Non se pode cambiar o tamaño desta aplicación"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Non se pode mover aquí a aplicación"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maximizar"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Axustar á esquerda"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Axustar á dereita"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-gu/strings.xml b/libs/WindowManager/Shell/res/values-gu/strings.xml index a382d0b41652..0dc2f73f1134 100644 --- a/libs/WindowManager/Shell/res/values-gu/strings.xml +++ b/libs/WindowManager/Shell/res/values-gu/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"કૅમેરામાં સમસ્યાઓ છે?\nફરીથી ફિટ કરવા માટે ટૅપ કરો"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"સુધારો નથી થયો?\nપહેલાંના પર પાછું ફેરવવા માટે ટૅપ કરો"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"કૅમેરામાં કોઈ સમસ્યા નથી? છોડી દેવા માટે ટૅપ કરો."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"ઍપ મેનૂ ખોલવા માટે ટૅપ કરો"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"એકથી વધુ ઍપ એકસાથે બતાવવા માટે ટૅપ કરો"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"ઍપ મેનૂમાંથી પૂર્ણસ્ક્રીન પર પાછા ફરો"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"જુઓ અને બીજું ઘણું કરો"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"વિભાજિત સ્ક્રીન માટે કોઈ અન્ય ઍપમાં ખેંચો"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"કોઈ ઍપની જગ્યા બદલવા માટે, તેની બહાર બે વાર ટૅપ કરો"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"વિન્ડો મેનેજ કરો"</string> <string name="close_text" msgid="4986518933445178928">"બંધ કરો"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"મેનૂ બંધ કરો"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"મેનૂ ખોલો"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"સ્ક્રીન કરો મોટી કરો"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"સ્ક્રીન સ્નૅપ કરો"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"આ ઍપના કદમાં વધઘટ કરી શકાતો નથી"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"ઍપ અહીં ખસેડી શકાતી નથી"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"મોટું કરો"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"ડાબે સ્નૅપ કરો"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"જમણે સ્નૅપ કરો"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-hi/strings.xml b/libs/WindowManager/Shell/res/values-hi/strings.xml index 37608207b721..679d800a4dd2 100644 --- a/libs/WindowManager/Shell/res/values-hi/strings.xml +++ b/libs/WindowManager/Shell/res/values-hi/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"क्या कैमरे से जुड़ी कोई समस्या है?\nफिर से फ़िट करने के लिए टैप करें"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"क्या समस्या ठीक नहीं हुई?\nपहले जैसा करने के लिए टैप करें"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"क्या कैमरे से जुड़ी कोई समस्या नहीं है? खारिज करने के लिए टैप करें."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"ऐप्लिकेशन मेन्यू खोलने के लिए टैप करें"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"कई ऐप्लिकेशन एक साथ दिखाने के लिए टैप करें"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"ऐप्लिकेशन मेन्यू से फ़ुलस्क्रीन मोड पर वापस जाएं"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"पूरी जानकारी लेकर, बेहतर तरीके से काम करें"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"स्प्लिट स्क्रीन का इस्तेमाल करने के लिए, किसी अन्य ऐप्लिकेशन को खींचें और छोड़ें"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"किसी ऐप्लिकेशन की जगह बदलने के लिए, उसके बाहर दो बार टैप करें"</string> @@ -129,8 +132,18 @@ <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"मेन्यू खोलें"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"स्क्रीन को बड़ा करें"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"स्नैप स्क्रीन"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"इस ऐप्लिकेशन का साइज़ नहीं बदला जा सकता"</string> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"ऐप्लिकेशन को यहां मूव नहीं किया जा सकता"</string> <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"बड़ा करें"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"बाईं ओर स्नैप करें"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"दाईं ओर स्नैप करें"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> + <skip /> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-hr/strings.xml b/libs/WindowManager/Shell/res/values-hr/strings.xml index f233c029c752..1e5ffc858b86 100644 --- a/libs/WindowManager/Shell/res/values-hr/strings.xml +++ b/libs/WindowManager/Shell/res/values-hr/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problemi s fotoaparatom?\nDodirnite za popravak"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Problem nije riješen?\nDodirnite za vraćanje"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nemate problema s fotoaparatom? Dodirnite za odbacivanje."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Dodirnite za otvaranje izbornika aplikacije"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Dodirnite za prikaz više aplikacija zajedno"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Vratite se na cijeli zaslon iz izbornika aplikacije"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Gledajte i učinite više"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Povucite drugu aplikaciju unutra da biste podijelili zaslon"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Dvaput dodirnite izvan aplikacije da biste je premjestili"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Upravljanje prozorima"</string> <string name="close_text" msgid="4986518933445178928">"Zatvorite"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Zatvorite izbornik"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Otvaranje izbornika"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maksimalno povećaj zaslon"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Izradi snimku zaslona"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Nije moguće promijeniti veličinu aplikacije"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Aplikacija se ne može premjestiti ovdje"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maksimiziraj"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Poravnaj lijevo"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Poravnaj desno"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-hu/strings.xml b/libs/WindowManager/Shell/res/values-hu/strings.xml index fb44cd855a7b..7c90a1924214 100644 --- a/libs/WindowManager/Shell/res/values-hu/strings.xml +++ b/libs/WindowManager/Shell/res/values-hu/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Kamerával kapcsolatos problémába ütközött?\nKoppintson a megoldáshoz."</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nem sikerült a hiba kijavítása?\nKoppintson a visszaállításhoz."</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nincsenek problémái kamerával? Koppintson az elvetéshez."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Koppintson az alkalmazásmenü megnyitásához"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Koppintson több alkalmazás együttes megjelenítéséhez"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"A teljes képernyőre az alkalmazásmenüben térhet vissza"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Több mindent láthat és tehet"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Húzzon ide egy másik alkalmazást az osztott képernyő használatához"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Koppintson duplán az alkalmazáson kívül az áthelyezéséhez"</string> @@ -129,8 +132,18 @@ <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Menü megnyitása"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Képernyő méretének maximalizálása"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Igazodás a képernyő adott részéhez"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Ezt az alkalmazást nem lehet átméretezni"</string> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Az alkalmazás nem helyezhető át ide"</string> <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Teljes méret"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Balra igazítás"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Jobbra igazítás"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> + <skip /> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-hy/strings.xml b/libs/WindowManager/Shell/res/values-hy/strings.xml index cd21faab45c2..e8ed4ac9c9a4 100644 --- a/libs/WindowManager/Shell/res/values-hy/strings.xml +++ b/libs/WindowManager/Shell/res/values-hy/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Տեսախցիկի հետ կապված խնդիրնե՞ր կան։\nՀպեք՝ վերակարգավորելու համար։"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Չհաջողվե՞ց շտկել։\nՀպեք՝ փոփոխությունները չեղարկելու համար։"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Տեսախցիկի հետ կապված խնդիրներ չկա՞ն։ Փակելու համար հպեք։"</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Հպեք՝ հավելվածի ընտրացանկը բացելու համար"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Հպեք՝ էկրանին մի քանի հավելված միասին դիտելու համար"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Հավելվածի ընտրացանկից վերադառնալ լիաէկրան ռեժիմ"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Միաժամանակ կատարեք մի քանի առաջադրանք"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Քաշեք մյուս հավելվածի մեջ՝ էկրանի տրոհումն օգտագործելու համար"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Կրկնակի հպեք հավելվածի կողքին՝ այն տեղափոխելու համար"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Կառավարել պատուհանները"</string> <string name="close_text" msgid="4986518933445178928">"Փակել"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Փակել ընտրացանկը"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Բացել ընտրացանկը"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Ծավալել էկրանը"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Ծալել էկրանը"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Այս հավելվածի չափը հնարավոր չէ փոխել"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Հավելվածը հնարավոր չէ տեղափոխել այստեղ"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Ծավալել"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Ամրացնել ձախ կողմում"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Ամրացնել աջ կողմում"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-in/strings.xml b/libs/WindowManager/Shell/res/values-in/strings.xml index ba0683deecd8..06b1634917e9 100644 --- a/libs/WindowManager/Shell/res/values-in/strings.xml +++ b/libs/WindowManager/Shell/res/values-in/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Masalah kamera?\nKetuk untuk memperbaiki"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Tidak dapat diperbaiki?\nKetuk untuk mengembalikan"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Tidak ada masalah kamera? Ketuk untuk menutup."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Ketuk untuk membuka menu aplikasi"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Ketuk untuk menampilkan beberapa aplikasi secara bersamaan"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Kembali ke layar penuh dari menu aplikasi"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Lihat dan lakukan lebih banyak hal"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Tarik aplikasi lain untuk menggunakan layar terpisah"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Ketuk dua kali di luar aplikasi untuk mengubah posisinya"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Kelola Jendela"</string> <string name="close_text" msgid="4986518933445178928">"Tutup"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Tutup Menu"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Buka Menu"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Perbesar Layar"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Gabungkan Layar"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Ukuran aplikasi ini tidak dapat diubah"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Aplikasi tidak dapat dipindahkan ke sini"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maksimalkan"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Maksimalkan ke kiri"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Maksimalkan ke kanan"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-is/strings.xml b/libs/WindowManager/Shell/res/values-is/strings.xml index b427eaf23290..2d447771de25 100644 --- a/libs/WindowManager/Shell/res/values-is/strings.xml +++ b/libs/WindowManager/Shell/res/values-is/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Myndavélavesen?\nÝttu til að breyta stærð"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Ennþá vesen?\nÝttu til að afturkalla"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Ekkert myndavélavesen? Ýttu til að hunsa."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Ýttu til að opna forritavalmyndina"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Ýttu til að sjá mörg forrit saman"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Opnaðu allan skjáinn aftur á forritavalmyndinni"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Sjáðu og gerðu meira"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Dragðu annað forrit inn til að nota skjáskiptingu"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Ýttu tvisvar utan við forrit til að færa það"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Stjórna gluggum"</string> <string name="close_text" msgid="4986518933445178928">"Loka"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Loka valmynd"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Opna valmynd"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Stækka skjá"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Smelluskjár"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Ekki er hægt að breyta stærð þessa forrits"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Ekki er hægt að færa forritið hingað"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Stækka"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Smella til vinstri"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Smella til hægri"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-it/strings.xml b/libs/WindowManager/Shell/res/values-it/strings.xml index 9eb9d4e3a403..b56424594f29 100644 --- a/libs/WindowManager/Shell/res/values-it/strings.xml +++ b/libs/WindowManager/Shell/res/values-it/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problemi con la fotocamera?\nTocca per risolverli"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Il problema non si è risolto?\nTocca per ripristinare"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nessun problema con la fotocamera? Tocca per ignorare."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Tocca per aprire il menu dell\'app"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Tocca per mostrare più app insieme"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Torna allo schermo intero dal menu dell\'app"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Visualizza più contenuti e fai di più"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Trascina in un\'altra app per usare lo schermo diviso"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Tocca due volte fuori da un\'app per riposizionarla"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Gestisci finestre"</string> <string name="close_text" msgid="4986518933445178928">"Chiudi"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Chiudi il menu"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Apri il menu"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Massimizza schermo"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Aggancia schermo"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Non è possibile ridimensionare questa app"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Impossibile spostare l\'app qui"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Ingrandisci"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Aggancia a sinistra"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Aggancia a destra"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-iw/strings.xml b/libs/WindowManager/Shell/res/values-iw/strings.xml index 3e82198201b9..fa072639f089 100644 --- a/libs/WindowManager/Shell/res/values-iw/strings.xml +++ b/libs/WindowManager/Shell/res/values-iw/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"בעיות במצלמה?\nאפשר להקיש כדי לבצע התאמה מחדש"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"הבעיה לא נפתרה?\nאפשר להקיש כדי לחזור לגרסה הקודמת"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"אין בעיות במצלמה? אפשר להקיש כדי לסגור."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"צריך להקיש כדי לפתוח את תפריט האפליקציה"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"אפשר להקיש כדי להציג כמה אפליקציות יחד"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"חזרה למסך מלא מתפריט האפליקציה"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"רוצה לראות ולעשות יותר?"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"צריך לגרור אפליקציה אחרת כדי להשתמש במסך המפוצל"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"צריך להקיש הקשה כפולה מחוץ לאפליקציה כדי למקם אותה מחדש"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"ניהול החלונות"</string> <string name="close_text" msgid="4986518933445178928">"סגירה"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"סגירת התפריט"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"פתיחת התפריט"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"הגדלת המסך"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"כיווץ המסך"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"לא ניתן לשנות את גודל החלון של האפליקציה הזו"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"לא ניתן להעביר את האפליקציה לכאן"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"הגדלה"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"הצמדה לשמאל"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"הצמדה לימין"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-ja/strings.xml b/libs/WindowManager/Shell/res/values-ja/strings.xml index 1225b62c96d9..91667c00ce12 100644 --- a/libs/WindowManager/Shell/res/values-ja/strings.xml +++ b/libs/WindowManager/Shell/res/values-ja/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"カメラに関する問題の場合は、\nタップすると修正できます"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"修正されなかった場合は、\nタップすると元に戻ります"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"カメラに関する問題でない場合は、タップすると閉じます。"</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"タップするとアプリメニューが開きます"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"タップすると複数のアプリが同時に表示されます"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"アプリメニューから全画面表示に戻ります"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"表示を拡大して機能を強化"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"分割画面にするにはもう 1 つのアプリをドラッグしてください"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"位置を変えるにはアプリの外側をダブルタップしてください"</string> @@ -129,8 +132,18 @@ <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"メニューを開く"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"画面の最大化"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"画面のスナップ"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"このアプリはサイズ変更できません"</string> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"アプリはここに移動できません"</string> <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"最大化"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"左にスナップ"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"右にスナップ"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> + <skip /> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-ka/strings.xml b/libs/WindowManager/Shell/res/values-ka/strings.xml index 3e1f726ca0ef..2208348485af 100644 --- a/libs/WindowManager/Shell/res/values-ka/strings.xml +++ b/libs/WindowManager/Shell/res/values-ka/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"კამერად პრობლემები აქვს?\nშეეხეთ გამოსასწორებლად"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"არ გამოსწორდა?\nშეეხეთ წინა ვერსიის დასაბრუნებლად"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"კამერას პრობლემები არ აქვს? შეეხეთ უარყოფისთვის."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"შეეხეთ აპის მენიუს გასახსნელად"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"შეეხეთ რამდენიმე აპის ერთად საჩვენებლად"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"სრულეკრანიან რეჟიმზე დაბრუნდით აპის მენიუდან"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"მეტის ნახვა და გაკეთება"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"ეკრანის გასაყოფად ჩავლებით გადაიტანეთ სხვა აპში"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"ორმაგად შეეხეთ აპის გარშემო სივრცეს, რათა ის სხვაგან გადაიტანოთ"</string> @@ -129,8 +132,18 @@ <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"მენიუს გახსნა"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"აპლიკაციის გაშლა სრულ ეკრანზე"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"აპლიკაციის დაპატარავება ეკრანზე"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"აპის ზომის შეცვლა შეუძლებელია"</string> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"აპის აქ გადატანა შეუძლებელია"</string> <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"მაქსიმალურად გაშლა"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"მარცხნივ გადატანა"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"მარჯვნივ გადატანა"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> + <skip /> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-kk/strings.xml b/libs/WindowManager/Shell/res/values-kk/strings.xml index dd4e5c94fc27..416a84c86281 100644 --- a/libs/WindowManager/Shell/res/values-kk/strings.xml +++ b/libs/WindowManager/Shell/res/values-kk/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Камерада қателер шықты ма?\nЖөндеу үшін түртіңіз."</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Жөнделмеді ме?\nҚайтару үшін түртіңіз."</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Камерада қателер шықпады ма? Жабу үшін түртіңіз."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Қолданба мәзірін ашу үшін түртіңіз"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Бірнеше қолданбаны қатар көрсету үшін түртіңіз"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Қолданба мәзірінен толық экран режиміне қайту"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Қосымша ақпаратты қарап, әрекеттер жасау"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Экранды бөлу үшін басқа қолданбаға өтіңіз."</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Қолданбаның орнын өзгерту үшін одан тыс жерді екі рет түртіңіз."</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Терезелерді басқару"</string> <string name="close_text" msgid="4986518933445178928">"Жабу"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Мәзірді жабу"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Мәзірді ашу"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Экранды ұлғайту"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Экранды бөлу"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Бұл қолданбаның өлшемі өзгертілмейді."</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Қолданба бұл жерге қойылмайды."</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Жаю"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Солға тіркеу"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Оңға тіркеу"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-km/strings.xml b/libs/WindowManager/Shell/res/values-km/strings.xml index 96fe62e4f034..b074d65700f4 100644 --- a/libs/WindowManager/Shell/res/values-km/strings.xml +++ b/libs/WindowManager/Shell/res/values-km/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"មានបញ្ហាពាក់ព័ន្ធនឹងកាមេរ៉ាឬ?\nចុចដើម្បីដោះស្រាយ"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"មិនបានដោះស្រាយបញ្ហានេះទេឬ?\nចុចដើម្បីត្រឡប់"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"មិនមានបញ្ហាពាក់ព័ន្ធនឹងកាមេរ៉ាទេឬ? ចុចដើម្បីច្រានចោល។"</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"ចុចដើម្បីបើកម៉ឺនុយកម្មវិធី"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"ចុចដើម្បីបង្ហាញកម្មវិធីច្រើនរួមគ្នា"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"ត្រឡប់ទៅអេក្រង់ពេញវិញពីម៉ឺនុយកម្មវិធី"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"មើលឃើញ និងធ្វើបានកាន់តែច្រើន"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"អូសកម្មវិធីមួយទៀតចូល ដើម្បីប្រើមុខងារបំបែកអេក្រង់"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"ចុចពីរដងនៅក្រៅកម្មវិធី ដើម្បីប្ដូរទីតាំងកម្មវិធីនោះ"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"គ្រប់គ្រងវិនដូ"</string> <string name="close_text" msgid="4986518933445178928">"បិទ"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"បិទម៉ឺនុយ"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"បើកម៉ឺនុយ"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"ពង្រីកអេក្រង់"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"ថតអេក្រង់"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"មិនអាចប្ដូរទំហំកម្មវិធីនេះបានទេ"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"មិនអាចផ្លាស់ទីកម្មវិធីមកទីនេះបានទេ"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"ពង្រីក"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"ផ្លាស់ទីទៅឆ្វេង"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"ផ្លាស់ទីទៅស្ដាំ"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-kn/strings.xml b/libs/WindowManager/Shell/res/values-kn/strings.xml index b38f74411db2..9c22241f5037 100644 --- a/libs/WindowManager/Shell/res/values-kn/strings.xml +++ b/libs/WindowManager/Shell/res/values-kn/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"ಕ್ಯಾಮರಾ ಸಮಸ್ಯೆಗಳಿವೆಯೇ?\nಮರುಹೊಂದಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"ಅದನ್ನು ಸರಿಪಡಿಸಲಿಲ್ಲವೇ?\nಹಿಂತಿರುಗಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ಕ್ಯಾಮರಾ ಸಮಸ್ಯೆಗಳಿಲ್ಲವೇ? ವಜಾಗೊಳಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"ಆ್ಯಪ್ ಮೆನುವನ್ನು ತೆರೆಯಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"ಅನೇಕ ಆ್ಯಪ್ಗಳನ್ನು ಒಟ್ಟಿಗೆ ತೋರಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"ಆ್ಯಪ್ ಮೆನುವಿನಿಂದ ಫುಲ್ಸ್ಕ್ರೀನ್ಗೆ ಹಿಂತಿರುಗಿ"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"ನೋಡಿ ಮತ್ತು ಹೆಚ್ಚಿನದನ್ನು ಮಾಡಿ"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"ಸ್ಪ್ಲಿಟ್ ಸ್ಕ್ರೀನ್ಗಾಗಿ ಮತ್ತೊಂದು ಆ್ಯಪ್ನಲ್ಲಿ ಡ್ರ್ಯಾಗ್ ಮಾಡಿ"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"ಆ್ಯಪ್ ಒಂದರ ಸ್ಥಾನವನ್ನು ಬದಲಾಯಿಸಲು ಅದರ ಹೊರಗೆ ಡಬಲ್-ಟ್ಯಾಪ್ ಮಾಡಿ"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"ವಿಂಡೋಗಳನ್ನು ನಿರ್ವಹಿಸಿ"</string> <string name="close_text" msgid="4986518933445178928">"ಮುಚ್ಚಿ"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"ಮೆನು ಮುಚ್ಚಿ"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"ಮೆನು ತೆರೆಯಿರಿ"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"ಸ್ಕ್ರೀನ್ ಅನ್ನು ಮ್ಯಾಕ್ಸಿಮೈಸ್ ಮಾಡಿ"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"ಸ್ನ್ಯಾಪ್ ಸ್ಕ್ರೀನ್"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"ಈ ಆ್ಯಪ್ ಅನ್ನು ಮರುಗಾತ್ರಗೊಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"ಆ್ಯಪ್ ಅನ್ನು ಇಲ್ಲಿಗೆ ಸರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"ಮ್ಯಾಕ್ಸಿಮೈಸ್ ಮಾಡಿ"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"ಎಡಕ್ಕೆ ಸ್ನ್ಯಾಪ್ ಮಾಡಿ"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"ಬಲಕ್ಕೆ ಸ್ನ್ಯಾಪ್ ಮಾಡಿ"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-ko/strings.xml b/libs/WindowManager/Shell/res/values-ko/strings.xml index 421d4666911e..58dd6f8e7e99 100644 --- a/libs/WindowManager/Shell/res/values-ko/strings.xml +++ b/libs/WindowManager/Shell/res/values-ko/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"카메라 문제가 있나요?\n해결하려면 탭하세요."</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"해결되지 않았나요?\n되돌리려면 탭하세요."</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"카메라에 문제가 없나요? 닫으려면 탭하세요."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"탭하여 앱 메뉴 열기"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"탭하여 여러 앱을 함께 표시하기"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"앱 메뉴에서 전체 화면으로 돌아가기"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"더 많은 정보를 보고 더 많은 작업을 처리하세요"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"화면 분할을 사용하려면 다른 앱을 드래그해 가져옵니다."</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"앱 위치를 조정하려면 앱 외부를 두 번 탭합니다."</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"창 관리"</string> <string name="close_text" msgid="4986518933445178928">"닫기"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"메뉴 닫기"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"메뉴 열기"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"화면 최대화"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"화면 분할"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"이 앱은 크기를 조절할 수 없습니다."</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"앱을 여기로 이동할 수 없음"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"최대화하기"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"왼쪽으로 맞추기"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"오른쪽으로 맞추기"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-ky/strings.xml b/libs/WindowManager/Shell/res/values-ky/strings.xml index abafd7ac0330..75feedea1b89 100644 --- a/libs/WindowManager/Shell/res/values-ky/strings.xml +++ b/libs/WindowManager/Shell/res/values-ky/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Камерада маселелер келип чыктыбы?\nОңдоо үчүн таптаңыз"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Оңдолгон жокпу?\nАртка кайтаруу үчүн таптаңыз"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Камерада маселе жокпу? Этибарга албоо үчүн таптаңыз."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Колдонмонун менюсун ачуу үчүн таптап коюңуз"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Бир нече колдонмону чогуу көрүү үчүн таптап коюңуз"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Колдонмонун менюсунан толук экранга кайтыңыз"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Көрүп, көбүрөөк нерселерди жасаңыз"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Экранды бөлүү үчүн башка колдонмону сүйрөңүз"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Колдонмону жылдыруу үчүн сырт жагын эки жолу таптаңыз"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Терезелерди тескөө"</string> <string name="close_text" msgid="4986518933445178928">"Жабуу"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Менюну жабуу"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Менюну ачуу"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Экранды чоңойтуу"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Экранды сүрөткө тартып алуу"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Бул колдонмонун өлчөмүн өзгөртүүгө болбойт"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Колдонмону бул жерге жылдырууга болбойт"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Чоңойтуу"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Солго жылдыруу"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Оңго жылдыруу"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-lo/strings.xml b/libs/WindowManager/Shell/res/values-lo/strings.xml index 4e10621c719b..8f28504b41b4 100644 --- a/libs/WindowManager/Shell/res/values-lo/strings.xml +++ b/libs/WindowManager/Shell/res/values-lo/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"ມີບັນຫາກ້ອງຖ່າຍຮູບບໍ?\nແຕະເພື່ອປັບໃໝ່"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"ບໍ່ໄດ້ແກ້ໄຂມັນບໍ?\nແຕະເພື່ອແປງກັບຄືນ"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ບໍ່ມີບັນຫາກ້ອງຖ່າຍຮູບບໍ? ແຕະເພື່ອປິດໄວ້."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"ແຕະເພື່ອເປີດເມນູແອັບ"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"ແຕະເພື່ອສະແດງແອັບຫຼາຍລາຍການພ້ອມກັນ"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"ກັບຄືນໄປຫາໂໝດເຕັມຈໍຈາກເມນູແອັບ"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"ເບິ່ງ ແລະ ເຮັດຫຼາຍຂຶ້ນ"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"ລາກໄປໄວ້ໃນແອັບອື່ນເພື່ອແບ່ງໜ້າຈໍ"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"ແຕະສອງເທື່ອໃສ່ນອກແອັບໃດໜຶ່ງເພື່ອຈັດຕຳແໜ່ງຂອງມັນຄືນໃໝ່"</string> @@ -129,8 +132,18 @@ <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"ເປີດເມນູ"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"ປັບຈໍໃຫຍ່ສຸດ"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"ສະແນັບໜ້າຈໍ"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"ບໍ່ສາມາດປັບຂະໜາດແອັບນີ້ໄດ້"</string> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"ບໍ່ສາມາດຍ້າຍແອັບມາບ່ອນນີ້ໄດ້"</string> <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"ຂະຫຍາຍໃຫຍ່ສຸດ"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"ແນບຊ້າຍ"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"ແນບຂວາ"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> + <skip /> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-lt/strings.xml b/libs/WindowManager/Shell/res/values-lt/strings.xml index 6d3c58cf01bb..b97b8787ed10 100644 --- a/libs/WindowManager/Shell/res/values-lt/strings.xml +++ b/libs/WindowManager/Shell/res/values-lt/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Iškilo problemų dėl kameros?\nPalieskite, kad pritaikytumėte iš naujo"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nepavyko pataisyti?\nPalieskite, kad grąžintumėte"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nėra jokių problemų dėl kameros? Palieskite, kad atsisakytumėte."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Palieskite, kad atidarytumėte programos meniu"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Palieskite, kad būtų rodomos kelios programos kartu"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Grįžkite į viso ekrano režimą iš programos meniu"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Daugiau turinio ir funkcijų"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Vilkite kitoje programoje, kad galėtumėte naudoti išskaidyto ekrano režimą"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Dukart palieskite už programos ribų, kad pakeistumėte jos poziciją"</string> @@ -129,8 +132,18 @@ <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Atidaryti meniu"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Išskleisti ekraną"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Sutraukti ekraną"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Negalima keisti šios programos dydžio"</string> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Programos negalima perkelti čia"</string> <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Padidinti"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Pritraukti kairėje"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Pritraukti dešinėje"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> + <skip /> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-lv/strings.xml b/libs/WindowManager/Shell/res/values-lv/strings.xml index 2f235babd721..de200d816e7a 100644 --- a/libs/WindowManager/Shell/res/values-lv/strings.xml +++ b/libs/WindowManager/Shell/res/values-lv/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Vai ir problēmas ar kameru?\nPieskarieties, lai tās novērstu."</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Vai problēma netika novērsta?\nPieskarieties, lai atjaunotu."</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Vai nav problēmu ar kameru? Pieskarieties, lai nerādītu."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Lai atvērtu lietotnes izvēlni, pieskarieties."</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Lai parādītu vairākas lietotnes kopā, pieskarieties."</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Varat atgriezties pilnekrāna režīmā no lietotnes izvēlnes."</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Uzziniet un paveiciet vairāk"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Lai izmantotu sadalītu ekrānu, ievelciet vēl vienu lietotni"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Lai pārvietotu lietotni, veiciet dubultskārienu ārpus lietotnes"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Pārvaldīt logus"</string> <string name="close_text" msgid="4986518933445178928">"Aizvērt"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Aizvērt izvēlni"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Atvērt izvēlni"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maksimizēt ekrānu"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Fiksēt ekrānu"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Šīs lietotnes loga lielumu nevar mainīt."</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Lietotni nevar pārvietot šeit."</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maksimizēt"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Piestiprināt pa kreisi"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Piestiprināt pa labi"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-mk/strings.xml b/libs/WindowManager/Shell/res/values-mk/strings.xml index e58d8fc945f4..4922d042c6ac 100644 --- a/libs/WindowManager/Shell/res/values-mk/strings.xml +++ b/libs/WindowManager/Shell/res/values-mk/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Проблеми со камерата?\nДопрете за да се совпадне повторно"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Не се поправи?\nДопрете за враќање"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Нема проблеми со камерата? Допрете за отфрлање."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Допрете за да го отворите менито со апликации"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Допрете за да се прикажат повеќе апликации заедно"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Вратете се на цел екран од менито со апликации"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Погледнете и направете повеќе"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Повлечете друга апликација за поделен екран"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Допрете двапати надвор од некоја апликација за да ја преместите"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Управувајте со прозорци"</string> <string name="close_text" msgid="4986518933445178928">"Затворете"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Затворете го менито"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Отвори го менито"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Максимизирај го екранот"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Подели го екранот на половина"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Не може да се промени големината на апликацијава"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Апликацијата не може да се премести овде"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Максимизирај"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Фотографирај лево"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Фотографирај десно"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-ml/strings.xml b/libs/WindowManager/Shell/res/values-ml/strings.xml index a48df0b71b1b..61277d6765fd 100644 --- a/libs/WindowManager/Shell/res/values-ml/strings.xml +++ b/libs/WindowManager/Shell/res/values-ml/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"ക്യാമറ പ്രശ്നങ്ങളുണ്ടോ?\nശരിയാക്കാൻ ടാപ്പ് ചെയ്യുക"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"അത് പരിഹരിച്ചില്ലേ?\nപുനഃസ്ഥാപിക്കാൻ ടാപ്പ് ചെയ്യുക"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ക്യാമറാ പ്രശ്നങ്ങളൊന്നുമില്ലേ? നിരസിക്കാൻ ടാപ്പ് ചെയ്യുക."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"ആപ്പ് മെനു തുറക്കാൻ ടാപ്പ് ചെയ്യുക"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"ഒന്നിലധികം ആപ്പുകൾ ഒരുമിച്ച് കാണിക്കാൻ ടാപ്പ് ചെയ്യുക"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"ആപ്പ് മെനുവിൽ നിന്ന് പൂർണ്ണസ്ക്രീനിലേക്ക് മടങ്ങുക"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"കൂടുതൽ കാണുക, ചെയ്യുക"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"സ്ക്രീൻ വിഭജന മോഡിന്, മറ്റൊരു ആപ്പ് വലിച്ചിടുക"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"ആപ്പിന്റെ സ്ഥാനം മാറ്റാൻ അതിന് പുറത്ത് ഡബിൾ ടാപ്പ് ചെയ്യുക"</string> @@ -129,8 +132,18 @@ <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"മെനു തുറക്കുക"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"സ്ക്രീൻ വലുതാക്കുക"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"സ്ക്രീൻ സ്നാപ്പ് ചെയ്യുക"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"ഈ ആപ്പിന്റെ വലുപ്പം മാറ്റാനാകില്ല"</string> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"ആപ്പ് ഇവിടേക്ക് നീക്കാനാകില്ല"</string> <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"വലുതാക്കുക"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"ഇടതുവശത്തേക്ക് സ്നാപ്പ് ചെയ്യുക"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"വലതുവശത്തേക്ക് സ്നാപ്പ് ചെയ്യുക"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> + <skip /> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-mn/strings.xml b/libs/WindowManager/Shell/res/values-mn/strings.xml index f7e6a6c87890..2b313a2be17c 100644 --- a/libs/WindowManager/Shell/res/values-mn/strings.xml +++ b/libs/WindowManager/Shell/res/values-mn/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Камерын асуудал гарсан уу?\nДахин тааруулахын тулд товшино уу"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Үүнийг засаагүй юу?\nБуцаахын тулд товшино уу"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Камерын асуудал байхгүй юу? Хаахын тулд товшино уу."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Аппын цэсийг нээхийн тулд товшино уу"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Олон аппыг хамтад нь харуулахын товшино уу"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Аппын цэсээс бүтэн дэлгэц рүү буцна уу"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Харж илүү ихийг хий"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Дэлгэц хуваах горимд ашиглахын тулд өөр аппыг чирнэ үү"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Аппыг дахин байрлуулахын тулд гадна талд нь хоёр товшино"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Windows-г удирдах"</string> <string name="close_text" msgid="4986518933445178928">"Хаах"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Цэсийг хаах"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Цэсийг нээх"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Дэлгэцийг томруулах"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Дэлгэцийг таллах"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Энэ аппын хэмжээг өөрчлөх боломжгүй"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Аппыг ийш зөөх боломжгүй"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Томруулах"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Зүүн тийш зэрэгцүүлэх"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Баруун тийш зэрэгцүүлэх"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-mr/strings.xml b/libs/WindowManager/Shell/res/values-mr/strings.xml index 483228424d44..9778dcd0a166 100644 --- a/libs/WindowManager/Shell/res/values-mr/strings.xml +++ b/libs/WindowManager/Shell/res/values-mr/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"कॅमेराशी संबंधित काही समस्या आहेत का?\nपुन्हा फिट करण्यासाठी टॅप करा"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"निराकरण झाले नाही?\nरिव्हर्ट करण्यासाठी कृपया टॅप करा"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"कॅमेराशी संबंधित कोणत्याही समस्या नाहीत का? डिसमिस करण्यासाठी टॅप करा."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"अॅप मेनू उघडण्यासाठी टॅप करा"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"एकाहून अधिक ॲप्स एकत्र दाखवण्यासाठी टॅप करा"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"ॲप मेनूमधून फुलस्क्रीनवर परत या"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"पहा आणि आणखी बरेच काही करा"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"स्प्लिट स्क्रीन वापरण्यासाठी दुसरे ॲप ड्रॅग करा"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"ॲपची स्थिती पुन्हा बदलण्यासाठी, त्याच्या बाहेर दोनदा टॅप करा"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"विंडो व्यवस्थापित करा"</string> <string name="close_text" msgid="4986518933445178928">"बंद करा"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"मेनू बंद करा"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"मेनू उघडा"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"स्क्रीन मोठी करा"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"स्क्रीन स्नॅप करा"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"या अॅपचा आकार बदलला जाऊ शकत नाही"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"अॅप इथे हलवू शकत नाही"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"मोठे करा"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"डावीकडे स्नॅप करा"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"उजवीकडे स्नॅप करा"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-ms/strings.xml b/libs/WindowManager/Shell/res/values-ms/strings.xml index 15ccfbbad39f..0ee439657e2a 100644 --- a/libs/WindowManager/Shell/res/values-ms/strings.xml +++ b/libs/WindowManager/Shell/res/values-ms/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Isu kamera?\nKetik untuk memuatkan semula"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Isu tidak dibetulkan?\nKetik untuk kembali"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Tiada isu kamera? Ketik untuk mengetepikan."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Ketik untuk membuka menu apl"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Ketik untuk memaparkan berbilang apl serentak"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Kembali kepada skrin penuh daripada menu apl"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Lihat dan lakukan lebih"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Seret masuk apl lain untuk menggunakan skrin pisah"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Ketik dua kali di luar apl untuk menempatkan semula apl itu"</string> @@ -129,8 +132,18 @@ <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Buka Menu"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maksimumkan Skrin"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Tangkap Skrin"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Apl ini tidak boleh diubah saiz"</string> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Apl tidak boleh dialihkan ke sini"</string> <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maksimumkan"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Autojajar ke kiri"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Autojajar ke kanan"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> + <skip /> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-my/strings.xml b/libs/WindowManager/Shell/res/values-my/strings.xml index aac6f8420d7a..57d09500b3bf 100644 --- a/libs/WindowManager/Shell/res/values-my/strings.xml +++ b/libs/WindowManager/Shell/res/values-my/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"ကင်မရာပြဿနာလား။\nပြင်ဆင်ရန် တို့ပါ"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"ကောင်းမသွားဘူးလား။\nပြန်ပြောင်းရန် တို့ပါ"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ကင်မရာပြဿနာ မရှိဘူးလား။ ပယ်ရန် တို့ပါ။"</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"အက်ပ်မီနူးကိုဖွင့်ရန် တို့ပါ"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"အက်ပ်များစွာကို အတူတကွပြရန် တို့ပါ"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"အက်ပ်မီနူးမှ ဖန်သားပြင်အပြည့်သို့ ပြန်သွားပါ"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"ကြည့်ပြီး ပိုမိုလုပ်ဆောင်ပါ"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"မျက်နှာပြင် ခွဲ၍ပြသခြင်းအတွက် အက်ပ်နောက်တစ်ခုကို ဖိဆွဲပါ"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"နေရာပြန်ချရန် အက်ပ်အပြင်ဘက်ကို နှစ်ချက်တို့ပါ"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"ဝင်းဒိုးများ စီမံရန်"</string> <string name="close_text" msgid="4986518933445178928">"ပိတ်ရန်"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"မီနူး ပိတ်ရန်"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"မီနူး ဖွင့်ရန်"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"စခရင်ကို ချဲ့မည်"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"စခရင်ကို ချုံ့မည်"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"ဤအက်ပ်ကို အရွယ်ပြင်၍ မရပါ"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"အက်ပ်ကို ဤနေရာသို့ ရွှေ့၍မရပါ"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"ချဲ့ရန်"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"ဘယ်တွင် ချဲ့ရန်"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"ညာတွင် ချဲ့ရန်"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-nb/strings.xml b/libs/WindowManager/Shell/res/values-nb/strings.xml index 175133d1744a..eb505ec43a65 100644 --- a/libs/WindowManager/Shell/res/values-nb/strings.xml +++ b/libs/WindowManager/Shell/res/values-nb/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Har du kameraproblemer?\nTrykk for å tilpasse"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Ble ikke problemet løst?\nTrykk for å gå tilbake"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Har du ingen kameraproblemer? Trykk for å lukke."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Trykk for å åpne appmenyen"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Trykk for å vise flere apper sammen"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Gå tilbake til fullskjerm fra appmenyen"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Se og gjør mer"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Dra inn en annen app for å bruke delt skjerm"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Dobbelttrykk utenfor en app for å flytte den"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Administrer vinduene"</string> <string name="close_text" msgid="4986518933445178928">"Lukk"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Lukk menyen"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Åpne menyen"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maksimer skjermen"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Fest skjermen"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Du kan ikke endre størrelse på denne appen"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Appen kan ikke flyttes hit"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maksimer"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Fest til venstre"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Fest til høyre"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-ne/strings.xml b/libs/WindowManager/Shell/res/values-ne/strings.xml index d3a7e12c0df4..47d66d5deec8 100644 --- a/libs/WindowManager/Shell/res/values-ne/strings.xml +++ b/libs/WindowManager/Shell/res/values-ne/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"क्यामेरासम्बन्धी समस्या देखियो?\nसमस्या हल गर्न ट्याप गर्नुहोस्"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"समस्या हल भएन?\nपहिलेको जस्तै बनाउन ट्याप गर्नुहोस्"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"क्यामेरासम्बन्धी कुनै पनि समस्या छैन? खारेज गर्न ट्याप गर्नुहोस्।"</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"एपको मेनु खोल्न ट्याप गर्नुहोस्"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"एकभन्दा बढी एपहरू सँगै देखाउन ट्याप गर्नुहोस्"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"एपको मेनुबाट फुल स्क्रिनमा फर्कनुहोस्"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"थप कुरा हेर्नुहोस् र गर्नुहोस्"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"स्प्लिट स्क्रिन मोड प्रयोग गर्न अर्को एप ड्रयाग एन्ड ड्रप गर्नुहोस्"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"तपाईं जुन एपको स्थिति मिलाउन चाहनुहुन्छ सोही एपको बाहिर डबल ट्याप गर्नुहोस्"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"विन्डोहरू व्यवस्थापन गर्नुहोस्"</string> <string name="close_text" msgid="4986518933445178928">"बन्द गर्नुहोस्"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"मेनु बन्द गर्नुहोस्"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"मेनु खोल्नुहोस्"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"स्क्रिन ठुलो बनाउनुहोस्"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"स्क्रिन स्न्याप गर्नुहोस्"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"यो एपको आकार बदल्न मिल्दैन"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"एप सारेर यहाँ ल्याउन सकिएन"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"ठुलो बनाउनुहोस्"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"बायाँतिर स्न्याप गर्नुहोस्"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"दायाँतिर स्न्याप गर्नुहोस्"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-nl/strings.xml b/libs/WindowManager/Shell/res/values-nl/strings.xml index 747afe3eb034..e3e344124e0b 100644 --- a/libs/WindowManager/Shell/res/values-nl/strings.xml +++ b/libs/WindowManager/Shell/res/values-nl/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Cameraproblemen?\nTik om opnieuw passend te maken."</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Is dit geen oplossing?\nTik om terug te zetten."</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Geen cameraproblemen? Tik om te sluiten."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Tik om het app-menu te openen"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Tik om meerdere apps tegelijk te tonen"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Terug naar volledig scherm vanuit het app-menu"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Zie en doe meer"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Sleep een andere app hier naartoe om het scherm te splitsen"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Dubbeltik naast een app om deze opnieuw te positioneren"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Vensters beheren"</string> <string name="close_text" msgid="4986518933445178928">"Sluiten"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Menu sluiten"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Menu openen"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Scherm maximaliseren"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Scherm halveren"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Het formaat van deze app kan niet worden aangepast"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Kan de app niet hierheen verplaatsen"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maximaliseren"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Links uitlijnen"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Rechts uitlijnen"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-or/strings.xml b/libs/WindowManager/Shell/res/values-or/strings.xml index a5adcbe36db1..baf009e8f28c 100644 --- a/libs/WindowManager/Shell/res/values-or/strings.xml +++ b/libs/WindowManager/Shell/res/values-or/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"କ୍ୟାମେରାରେ ସମସ୍ୟା ଅଛି?\nପୁଣି ଫିଟ କରିବାକୁ ଟାପ କରନ୍ତୁ"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"ଏହାର ସମାଧାନ ହୋଇନାହିଁ?\nଫେରିଯିବା ପାଇଁ ଟାପ କରନ୍ତୁ"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"କ୍ୟାମେରାରେ କିଛି ସମସ୍ୟା ନାହିଁ? ଖାରଜ କରିବାକୁ ଟାପ କରନ୍ତୁ।"</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"ଆପ ମେନୁ ଖୋଲିବାକୁ ଟାପ କରନ୍ତୁ"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"ଏକାଠି ଏକାଧିକ ଆପ୍ସ ଦେଖାଇବା ପାଇଁ ଟାପ କରନ୍ତୁ"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"ଆପ ମେନୁରୁ ପୂର୍ଣ୍ଣସ୍କ୍ରିନକୁ ଫେରନ୍ତୁ"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"ଦେଖନ୍ତୁ ଏବଂ ଆହୁରି ଅନେକ କିଛି କରନ୍ତୁ"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"ସ୍ପ୍ଲିଟ ସ୍କ୍ରିନ ପାଇଁ ଅନ୍ୟ ଏକ ଆପକୁ ଡ୍ରାଗ କରନ୍ତୁ"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"ଏକ ଆପକୁ ରିପୋଜିସନ କରିବା ପାଇଁ ଏହାର ବାହାରେ ଦୁଇଥର-ଟାପ କରନ୍ତୁ"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"ୱିଣ୍ଡୋଗୁଡ଼ିକୁ ପରିଚାଳନା କରନ୍ତୁ"</string> <string name="close_text" msgid="4986518933445178928">"ବନ୍ଦ କରନ୍ତୁ"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"ମେନୁ ବନ୍ଦ କରନ୍ତୁ"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"ମେନୁ ଖୋଲନ୍ତୁ"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"ସ୍କ୍ରିନକୁ ବଡ଼ କରନ୍ତୁ"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"ସ୍କ୍ରିନକୁ ସ୍ନାପ କରନ୍ତୁ"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"ଏହି ଆପକୁ ରିସାଇଜ କରାଯାଇପାରିବ ନାହିଁ"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"ଆପକୁ ଏଠାକୁ ମୁଭ କରାଯାଇପାରିବ ନାହିଁ"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"ବଡ଼ କରନ୍ତୁ"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"ବାମରେ ସ୍ନାପ କରନ୍ତୁ"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"ଡାହାଣରେ ସ୍ନାପ କରନ୍ତୁ"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-pa/strings.xml b/libs/WindowManager/Shell/res/values-pa/strings.xml index e11cc1c1f76d..2c29c7f80411 100644 --- a/libs/WindowManager/Shell/res/values-pa/strings.xml +++ b/libs/WindowManager/Shell/res/values-pa/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"ਕੀ ਕੈਮਰੇ ਸੰਬੰਧੀ ਸਮੱਸਿਆਵਾਂ ਹਨ?\nਮੁੜ-ਫਿੱਟ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"ਕੀ ਇਹ ਠੀਕ ਨਹੀਂ ਹੋਈ?\nਵਾਪਸ ਉਹੀ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"ਕੀ ਕੈਮਰੇ ਸੰਬੰਧੀ ਕੋਈ ਸਮੱਸਿਆ ਨਹੀਂ ਹੈ? ਖਾਰਜ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"ਐਪ ਮੀਨੂ ਨੂੰ ਖੋਲ੍ਹਣ ਲਈ ਟੈਪ ਕਰੋ"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"ਕਈ ਐਪਾਂ ਇਕੱਠੀਆਂ ਦਿਖਾਉਣ ਲਈ ਟੈਪ ਕਰੋ"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"ਐਪ ਮੀਨੂ ਤੋਂ ਪੂਰੀ-ਸਕ੍ਰੀਨ ਮੋਡ \'ਤੇ ਵਾਪਸ ਜਾਓ"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"ਦੇਖੋ ਅਤੇ ਹੋਰ ਬਹੁਤ ਕੁਝ ਕਰੋ"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਦੇ ਲਈ ਕਿਸੇ ਹੋਰ ਐਪ ਵਿੱਚ ਘਸੀਟੋ"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"ਕਿਸੇ ਐਪ ਦੀ ਜਗ੍ਹਾ ਬਦਲਣ ਲਈ ਉਸ ਦੇ ਬਾਹਰ ਡਬਲ ਟੈਪ ਕਰੋ"</string> @@ -129,8 +132,18 @@ <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"ਮੀਨੂ ਖੋਲ੍ਹੋ"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"ਸਕ੍ਰੀਨ ਦਾ ਆਕਾਰ ਵਧਾਓ"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"ਸਕ੍ਰੀਨ ਨੂੰ ਸਨੈਪ ਕਰੋ"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"ਇਸ ਐਪ ਦਾ ਆਕਾਰ ਬਦਲਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ"</string> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"ਐਪ ਨੂੰ ਇੱਥੇ ਨਹੀਂ ਲਿਜਾਇਆ ਜਾ ਸਕਦਾ"</string> <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"ਵੱਡਾ ਕਰੋ"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"ਖੱਬੇ ਪਾਸੇ ਸਨੈਪ ਕਰੋ"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"ਸੱਜੇ ਪਾਸੇ ਸਨੈਪ ਕਰੋ"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> + <skip /> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-pl/strings.xml b/libs/WindowManager/Shell/res/values-pl/strings.xml index 2640c0f368a8..1e7b18117812 100644 --- a/libs/WindowManager/Shell/res/values-pl/strings.xml +++ b/libs/WindowManager/Shell/res/values-pl/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problemy z aparatem?\nKliknij, aby dopasować"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Naprawa się nie udała?\nKliknij, aby cofnąć"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Brak problemów z aparatem? Kliknij, aby zamknąć"</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Kliknij, aby otworzyć menu aplikacji"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Kliknij, aby wyświetlić jednocześnie kilka aplikacji"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Wróć do trybu pełnoekranowego z menu aplikacji"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Zobacz i zrób więcej"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Aby podzielić ekran, przeciągnij drugą aplikację"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Kliknij dwukrotnie poza aplikacją, aby ją przenieść"</string> @@ -129,8 +132,18 @@ <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Otwórz menu"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maksymalizuj ekran"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Przyciągnij ekran"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Nie można zmienić rozmiaru tej aplikacji"</string> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Nie można przenieść aplikacji tutaj"</string> <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maksymalizuj"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Przyciągnij do lewej"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Przyciągnij do prawej"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> + <skip /> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml b/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml index 18048ff045b5..7d728a03b4ec 100644 --- a/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml +++ b/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml @@ -97,12 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problemas com a câmera?\nToque para ajustar o enquadramento"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"O problema não foi corrigido?\nToque para reverter"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Não tem problemas com a câmera? Toque para dispensar."</string> - <!-- no translation found for windowing_app_handle_education_tooltip (6398482412956375783) --> - <skip /> - <!-- no translation found for windowing_desktop_mode_image_button_education_tooltip (6285279585554484957) --> - <skip /> - <!-- no translation found for windowing_desktop_mode_exit_education_tooltip (6685429075790085337) --> - <skip /> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Toque para abrir o menu do app"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Toque para mostrar vários apps juntos"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Volte para a tela cheia no menu do app"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Veja e faça mais"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Arraste outro app para dividir a tela"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Toque duas vezes fora de um app para reposicionar"</string> @@ -135,9 +132,18 @@ <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Abrir o menu"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Ampliar tela"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Ajustar tela"</string> - <!-- no translation found for desktop_mode_non_resizable_snap_text (3771776422751387878) --> - <skip /> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Não é possível mover o app para cá"</string> <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maximizar"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Ajustar à esquerda"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Ajustar à direita"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> + <skip /> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml b/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml index 46f8b38dd621..752fd6fb8970 100644 --- a/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml +++ b/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problemas com a câmara?\nToque aqui para reajustar"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Não foi corrigido?\nToque para reverter"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nenhum problema com a câmara? Toque para ignorar."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Toque para abrir o menu de apps"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Toque para mostrar várias apps em conjunto"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Regresse ao ecrã inteiro a partir do menu de apps"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Veja e faça mais"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Arraste outra app para usar o ecrã dividido"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Toque duas vezes fora de uma app para a reposicionar"</string> @@ -129,8 +132,18 @@ <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Abrir menu"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximizar ecrã"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Encaixar ecrã"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Não é possível redimensionar esta app"</string> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Não é possível mover a app para aqui"</string> <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maximizar"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Encaixar à esquerda"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Encaixar à direita"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> + <skip /> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-pt/strings.xml b/libs/WindowManager/Shell/res/values-pt/strings.xml index 75c445c6f35c..7d728a03b4ec 100644 --- a/libs/WindowManager/Shell/res/values-pt/strings.xml +++ b/libs/WindowManager/Shell/res/values-pt/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problemas com a câmera?\nToque para ajustar o enquadramento"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"O problema não foi corrigido?\nToque para reverter"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Não tem problemas com a câmera? Toque para dispensar."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Toque para abrir o menu do app"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Toque para mostrar vários apps juntos"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Volte para a tela cheia no menu do app"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Veja e faça mais"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Arraste outro app para dividir a tela"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Toque duas vezes fora de um app para reposicionar"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Gerenciar janelas"</string> <string name="close_text" msgid="4986518933445178928">"Fechar"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Fechar menu"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Abrir o menu"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Ampliar tela"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Ajustar tela"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Não é possível redimensionar o app"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Não é possível mover o app para cá"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maximizar"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Ajustar à esquerda"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Ajustar à direita"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-ro/strings.xml b/libs/WindowManager/Shell/res/values-ro/strings.xml index 3c763ea8a6a4..3985d9bc792a 100644 --- a/libs/WindowManager/Shell/res/values-ro/strings.xml +++ b/libs/WindowManager/Shell/res/values-ro/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Ai probleme cu camera foto?\nAtinge pentru a reîncadra"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nu ai remediat problema?\nAtinge pentru a reveni"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nu ai probleme cu camera foto? Atinge pentru a închide."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Atinge pentru a deschide meniul aplicației"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Atinge pentru a afișa mai multe aplicații împreună"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Revino la ecranul complet din meniul aplicației"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Vezi și fă mai multe"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Trage în altă aplicație pentru a folosi ecranul împărțit"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Atinge de două ori lângă o aplicație pentru a o repoziționa"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Gestionează ferestrele"</string> <string name="close_text" msgid="4986518933445178928">"Închide"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Închide meniul"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Deschide meniul"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximizează fereastra"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Micșorează fereastra și fixeaz-o"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Aplicația nu poate fi redimensionată"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Aplicația nu poate fi mutată aici"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maximizează"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Trage la stânga"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Trage la dreapta"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-ru/strings.xml b/libs/WindowManager/Shell/res/values-ru/strings.xml index affd0cb0853a..58a196b4eecb 100644 --- a/libs/WindowManager/Shell/res/values-ru/strings.xml +++ b/libs/WindowManager/Shell/res/values-ru/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Проблемы с камерой?\nНажмите, чтобы исправить."</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Не помогло?\nНажмите, чтобы отменить изменения."</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Нет проблем с камерой? Нажмите, чтобы закрыть."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Нажмите, чтобы открыть меню приложения"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Нажмите, чтобы на экране размещались сразу несколько приложений"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Вернуться из меню приложения в режим полного экрана"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Выполняйте несколько задач одновременно"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Перетащите сюда другое приложение, чтобы использовать разделение экрана."</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Чтобы переместить приложение, дважды нажмите рядом с ним."</string> @@ -129,8 +132,18 @@ <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Открыть меню"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Развернуть на весь экран"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Свернуть"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Изменить размер приложения нельзя."</string> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Приложение нельзя сюда переместить"</string> <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Развернуть"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Привязать слева"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Привязать справа"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> + <skip /> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-si/strings.xml b/libs/WindowManager/Shell/res/values-si/strings.xml index ed762699bc49..6682b017f2cc 100644 --- a/libs/WindowManager/Shell/res/values-si/strings.xml +++ b/libs/WindowManager/Shell/res/values-si/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"කැමරා ගැටලුද?\nයළි සවි කිරීමට තට්ටු කරන්න"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"එය විසඳුවේ නැතිද?\nප්රතිවර්තනය කිරීමට තට්ටු කරන්න"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"කැමරා ගැටලු නොමැතිද? ඉවත දැමීමට තට්ටු කරන්න"</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"යෙදුම් මෙනුව විවෘත කිරීමට තට්ටු කරන්න"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"යෙදුම් කිහිපයක් එකට පෙන්වීමට තට්ටු කරන්න"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"යෙදුම් මෙනුවෙන් පූර්ණ තිරය වෙත ආපසු යන්න"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"බලන්න සහ තවත් දේ කරන්න"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"බෙදුම් තිරය සඳහා වෙනත් යෙදුමකට අදින්න"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"යෙදුමක් නැවත ස්ථානගත කිරීමට පිටතින් දෙවරක් තට්ටු කරන්න"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"කවුළු කළමනාකරණය කරන්න"</string> <string name="close_text" msgid="4986518933445178928">"වසන්න"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"මෙනුව වසන්න"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"මෙනුව විවෘත කරන්න"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"තිරය උපරිම කරන්න"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"ස්නැප් තිරය"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"මෙම යෙදුම ප්රතිප්රමාණ කළ නොහැක"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"යෙදුම මෙතැනට ගෙන යා නොහැක"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"විහිදන්න"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"වමට ස්නැප් කරන්න"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"දකුණට ස්නැප් කරන්න"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-sk/strings.xml b/libs/WindowManager/Shell/res/values-sk/strings.xml index 529a6932c9ce..96e54f1caa68 100644 --- a/libs/WindowManager/Shell/res/values-sk/strings.xml +++ b/libs/WindowManager/Shell/res/values-sk/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problémy s kamerou?\nKlepnutím znova upravte."</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nevyriešilo sa to?\nKlepnutím sa vráťte."</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nemáte problémy s kamerou? Klepnutím zatvoríte."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Klepnúť a otvoriť tak ponuku aplikácií"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Klepnúť a zobraziť tak viacero aplikácií naraz"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Prejsť späť na celú obrazovku z ponuky aplikácií"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Zobrazte si a zvládnite toho viac"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Rozdelenú obrazovku môžete použiť presunutím do inej aplikácie"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Dvojitým klepnutím mimo aplikácie zmeníte jej pozíciu"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Správa okien"</string> <string name="close_text" msgid="4986518933445178928">"Zavrieť"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Zavrieť ponuku"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Otvoriť ponuku"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximalizovať obrazovku"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Zobraziť polovicu obrazovky"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Veľkosť tejto aplikácie sa nedá zmeniť"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Aplikácia sa sem nedá presunúť"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maximalizovať"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Prichytiť vľavo"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Prichytiť vpravo"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-sl/strings.xml b/libs/WindowManager/Shell/res/values-sl/strings.xml index 280346d0559a..66c9b26de54e 100644 --- a/libs/WindowManager/Shell/res/values-sl/strings.xml +++ b/libs/WindowManager/Shell/res/values-sl/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Težave s fotoaparatom?\nDotaknite se za vnovično prilagoditev"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"To ni odpravilo težave?\nDotaknite se za povrnitev"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nimate težav s fotoaparatom? Dotaknite se za opustitev."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Dotaknite se, če želite odpreti meni aplikacije"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Dotaknite se, če želite prikazati več aplikacij hkrati"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Nazaj v celozaslonski način iz menija aplikacije"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Oglejte si in naredite več"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Za razdeljeni zaslon povlecite sem še eno aplikacijo."</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Dvakrat se dotaknite zunaj aplikacije, če jo želite prestaviti."</string> @@ -129,8 +132,18 @@ <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Odpri meni"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maksimiraj zaslon"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Pripni zaslon"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Velikosti te aplikacije ni mogoče spremeniti"</string> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Aplikacije ni mogoče premakniti sem"</string> <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maksimiraj"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Pripni levo"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Pripni desno"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> + <skip /> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-sq/strings.xml b/libs/WindowManager/Shell/res/values-sq/strings.xml index a4a7e744c426..6e49999545a8 100644 --- a/libs/WindowManager/Shell/res/values-sq/strings.xml +++ b/libs/WindowManager/Shell/res/values-sq/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Ka probleme me kamerën?\nTrokit për ta ripërshtatur"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Nuk u rregullua?\nTrokit për ta rikthyer"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Nuk ka probleme me kamerën? Trokit për ta shpërfillur."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Trokit për të hapur menynë e aplikacionit"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Trokit për të shfaqur disa aplikacone bashkë"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Kthehu tek ekrani i plotë nga menyja e aplikacionit"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Shiko dhe bëj më shumë"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Zvarrite në një aplikacion tjetër për ekranin e ndarë"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Trokit dy herë jashtë një aplikacioni për ta ripozicionuar"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Menaxho dritaret"</string> <string name="close_text" msgid="4986518933445178928">"Mbyll"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Mbyll menynë"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Hap menynë"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maksimizo ekranin"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Regjistro ekranin"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Përmasat e këtij aplikacioni nuk mund të ndryshohen"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Aplikacioni nuk mund të zhvendoset këtu"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Maksimizo"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Zhvendos majtas"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Zhvendos djathtas"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-sr/strings.xml b/libs/WindowManager/Shell/res/values-sr/strings.xml index 9545ccf7a810..bd2fb8c442f3 100644 --- a/libs/WindowManager/Shell/res/values-sr/strings.xml +++ b/libs/WindowManager/Shell/res/values-sr/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Имате проблема са камером?\nДодирните да бисте поново уклопили"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Проблем није решен?\nДодирните да бисте вратили"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Немате проблема са камером? Додирните да бисте одбацили."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Додирните да бисте отворили мени апликације"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Додирните да бисте приказали више апликација заједно"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Вратите се из менија апликације на приказ преко целог екрана"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Видите и урадите више"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Превуците другу апликацију да бисте користили подељени екран"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Двапут додирните изван апликације да бисте променили њену позицију"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Управљајте прозорима"</string> <string name="close_text" msgid="4986518933445178928">"Затворите"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Затворите мени"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Отворите мени"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Повећај екран"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Уклопи екран"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Величина ове апликације не може да се промени"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Апликација не може да се премести овде"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Увећајте"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Прикачите лево"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Прикачите десно"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-sv/strings.xml b/libs/WindowManager/Shell/res/values-sv/strings.xml index aa74bdef0140..2184ac6bfca7 100644 --- a/libs/WindowManager/Shell/res/values-sv/strings.xml +++ b/libs/WindowManager/Shell/res/values-sv/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Problem med kameran?\nTryck för att anpassa på nytt"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Löstes inte problemet?\nTryck för att återställa"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Inga problem med kameran? Tryck för att ignorera."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Tryck för att öppna appmenyn"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Tryck för att visa flera appar tillsammans"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Återgå till helskärm från appmenyn"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Se och gör mer"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Dra till en annan app för att dela upp skärmen"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Tryck snabbt två gånger utanför en app för att flytta den"</string> @@ -129,8 +132,18 @@ <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Öppna menyn"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Maximera skärmen"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Fäst skärmen"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Det går inte att ändra storlek på appen"</string> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Det går inte att flytta appen hit"</string> <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Utöka"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Fäst till vänster"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Fäst till höger"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> + <skip /> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-sw/strings.xml b/libs/WindowManager/Shell/res/values-sw/strings.xml index c6ce023a5ca7..6068bf00a6df 100644 --- a/libs/WindowManager/Shell/res/values-sw/strings.xml +++ b/libs/WindowManager/Shell/res/values-sw/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Je, kuna hitilafu za kamera?\nGusa ili urekebishe"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Umeshindwa kurekebisha?\nGusa ili urejeshe nakala ya awali"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Je, hakuna hitilafu za kamera? Gusa ili uondoe."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Gusa ili ufungue menyu ya programu"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Gusa ili uonyeshe programu nyingi kwa pamoja"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Rudi kwenye skrini nzima katika menyu ya programu"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Angalia na ufanye zaidi"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Buruta katika programu nyingine ili utumie skrini iliyogawanywa"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Gusa mara mbili nje ya programu ili uihamishe"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Dhibiti Windows"</string> <string name="close_text" msgid="4986518933445178928">"Funga"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Funga Menyu"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Fungua Menyu"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Panua Dirisha kwenye Skrini"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Panga Madirisha kwenye Skrini"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Huwezi kubadilisha ukubwa wa programu hii"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Imeshindwa kuhamishia programu hapa"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Panua"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Telezesha kushoto"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Telezesha kulia"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-ta/strings.xml b/libs/WindowManager/Shell/res/values-ta/strings.xml index 2c2f31978b0f..a14abac75245 100644 --- a/libs/WindowManager/Shell/res/values-ta/strings.xml +++ b/libs/WindowManager/Shell/res/values-ta/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"கேமரா தொடர்பான சிக்கல்களா?\nமீண்டும் பொருத்த தட்டவும்"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"சிக்கல்கள் சரிசெய்யப்படவில்லையா?\nமாற்றியமைக்க தட்டவும்"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"கேமரா தொடர்பான சிக்கல்கள் எதுவும் இல்லையா? நிராகரிக்க தட்டவும்."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"ஆப்ஸ் மெனுவைத் திறக்க தட்டவும்"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"பல ஆப்ஸை ஒன்றாகக் காட்ட தட்டவும்"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"ஆப்ஸ் மெனுவில் இருந்து முழுத்திரைக்குச் செல்லும்"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"பலவற்றைப் பார்த்தல் மற்றும் செய்தல்"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"திரைப் பிரிப்புக்கு மற்றொரு ஆப்ஸை இழுக்கலாம்"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"ஆப்ஸை இடம் மாற்ற அதன் வெளியில் இருமுறை தட்டலாம்"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"சாளரங்களை நிர்வகிக்கலாம்"</string> <string name="close_text" msgid="4986518933445178928">"மூடும்"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"மெனுவை மூடும்"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"மெனுவைத் திறக்கும்"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"திரையைப் பெரிதாக்கு"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"திரையை ஸ்னாப் செய்"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"இந்த ஆப்ஸின் அளவை மாற்ற முடியாது"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"ஆப்ஸை இங்கே நகர்த்த முடியாது"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"பெரிதாக்கும்"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"இடதுபுறம் நகர்த்தும்"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"வலதுபுறம் நகர்த்தும்"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-te/strings.xml b/libs/WindowManager/Shell/res/values-te/strings.xml index 8691c9d5aa26..84e76a8cc361 100644 --- a/libs/WindowManager/Shell/res/values-te/strings.xml +++ b/libs/WindowManager/Shell/res/values-te/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"కెమెరా సమస్యలు ఉన్నాయా?\nరీఫిట్ చేయడానికి ట్యాప్ చేయండి"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"దాని సమస్యను పరిష్కరించలేదా?\nపూర్వస్థితికి మార్చడానికి ట్యాప్ చేయండి"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"కెమెరా సమస్యలు లేవా? తీసివేయడానికి ట్యాప్ చేయండి."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"యాప్ మెనూని తెరవడానికి ట్యాప్ చేయండి"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"పలు యాప్లను కలిపి చూడటానికి ట్యాప్ చేయండి"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"యాప్ మెనూ నుండి ఫుల్ స్క్రీన్కు తిరిగి రండి"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"చూసి, మరిన్ని చేయండి"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"స్ప్లిట్ స్క్రీన్ కోసం మరొక యాప్లోకి లాగండి"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"యాప్ స్థానాన్ని మార్చడానికి దాని వెలుపల డబుల్-ట్యాప్ చేయండి"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"విండోలను మేనేజ్ చేయండి"</string> <string name="close_text" msgid="4986518933445178928">"మూసివేయండి"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"మెనూను మూసివేయండి"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"మెనూను తెరవండి"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"స్క్రీన్ సైజ్ను పెంచండి"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"స్క్రీన్ను స్నాప్ చేయండి"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"ఈ యాప్ సైజ్ను మార్చడం సాధ్యపడదు"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"యాప్ను ఇక్కడకి తరలించడం సాధ్యం కాదు"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"మ్యాగ్జిమైజ్ చేయండి"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"ఎడమ వైపున స్నాప్ చేయండి"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"కుడి వైపున స్నాప్ చేయండి"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-th/strings.xml b/libs/WindowManager/Shell/res/values-th/strings.xml index 07e141601d08..856893f83955 100644 --- a/libs/WindowManager/Shell/res/values-th/strings.xml +++ b/libs/WindowManager/Shell/res/values-th/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"หากพบปัญหากับกล้อง\nแตะเพื่อแก้ไข"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"หากไม่ได้แก้ไข\nแตะเพื่อเปลี่ยนกลับ"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"หากไม่พบปัญหากับกล้อง แตะเพื่อปิด"</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"แตะเพื่อเปิดเมนูแอป"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"แตะเพื่อแสดงแอปหลายรายการพร้อมกัน"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"กลับไปที่เต็มหน้าจอจากเมนูแอป"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"รับชมและทำสิ่งต่างๆ ได้มากขึ้น"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"ลากไปไว้ในแอปอื่นเพื่อแยกหน้าจอ"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"แตะสองครั้งด้านนอกแอปเพื่อเปลี่ยนตำแหน่ง"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"จัดการหน้าต่าง"</string> <string name="close_text" msgid="4986518933445178928">"ปิด"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"ปิดเมนู"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"เปิดเมนู"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"ขยายหน้าจอให้ใหญ่สุด"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"สแนปหน้าจอ"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"ปรับขนาดแอปนี้ไม่ได้"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"ย้ายแอปมาที่นี่ไม่ได้"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"ขยายใหญ่สุด"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"จัดพอดีกับทางซ้าย"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"จัดพอดีกับทางขวา"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-tl/strings.xml b/libs/WindowManager/Shell/res/values-tl/strings.xml index 477700e7bbdf..dc92efd8e18f 100644 --- a/libs/WindowManager/Shell/res/values-tl/strings.xml +++ b/libs/WindowManager/Shell/res/values-tl/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"May mga isyu sa camera?\nI-tap para i-refit"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Hindi ito naayos?\nI-tap para i-revert"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Walang isyu sa camera? I-tap para i-dismiss."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"I-tap para buksan ang menu ng app"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"I-tap para ipakita nang magkakasama ang maraming app"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Bumalik sa fullscreen mula sa menu ng app"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Tumingin at gumawa ng higit pa"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Mag-drag ng isa pang app para sa split screen"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Mag-double tap sa labas ng app para baguhin ang posisyon nito"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Pamahalaan ang Mga Window"</string> <string name="close_text" msgid="4986518933445178928">"Isara"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Isara ang Menu"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Buksan ang Menu"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"I-maximize ang Screen"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"I-snap ang Screen"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Hindi nare-resize ang app na ito"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Hindi mailipat dito ang app"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"I-maximize"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"I-snap pakaliwa"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"I-snap pakanan"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-tr/strings.xml b/libs/WindowManager/Shell/res/values-tr/strings.xml index b0c253965970..e206cd6cd10c 100644 --- a/libs/WindowManager/Shell/res/values-tr/strings.xml +++ b/libs/WindowManager/Shell/res/values-tr/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Kameranızda sorun mu var?\nDüzeltmek için dokunun"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Bu işlem sorunu düzeltmedi mi?\nİşlemi geri almak için dokunun"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Kameranızda sorun yok mu? Kapatmak için dokunun."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Uygulama menüsünü açmak için dokunun"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Birden fazla uygulamayı birlikte göstermek için dokunun"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Uygulama menüsünden tam ekrana dönün"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Daha fazlasını görün ve yapın"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Bölünmüş ekran için başka bir uygulamayı sürükleyin"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Yeniden konumlandırmak için uygulamanın dışına iki kez dokunun"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Pencereleri yönet"</string> <string name="close_text" msgid="4986518933445178928">"Kapat"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Menüyü kapat"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Menüyü aç"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Ekranı Büyüt"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Ekranın Yarısına Tuttur"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Bu uygulama yeniden boyutlandırılamaz"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Uygulama buraya taşınamıyor"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Ekranı kapla"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Sola tuttur"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Sağa tuttur"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-uk/strings.xml b/libs/WindowManager/Shell/res/values-uk/strings.xml index dd64c6642104..90a3bc33b3e2 100644 --- a/libs/WindowManager/Shell/res/values-uk/strings.xml +++ b/libs/WindowManager/Shell/res/values-uk/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Проблеми з камерою?\nНатисніть, щоб пристосувати"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Проблему не вирішено?\nНатисніть, щоб скасувати зміни"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Немає проблем із камерою? Торкніться, щоб закрити."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Натисніть, щоб відкрити меню додатка"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Натисніть, щоб переглянути кілька додатків одночасно"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Повернутися з меню додатка в повноекранний режим"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Більше простору та можливостей"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Щоб перейти в режим розділення екрана, перетягніть сюди інший додаток"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Щоб перемістити додаток, двічі торкніться області поза ним"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Керувати вікнами"</string> <string name="close_text" msgid="4986518933445178928">"Закрити"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Закрити меню"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Відкрити меню"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Розгорнути екран"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Зафіксувати екран"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Розмір вікна цього додатка не можна змінити"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Сюди не можна перемістити додаток"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Розгорнути"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Закріпити ліворуч"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Закріпити праворуч"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-ur/strings.xml b/libs/WindowManager/Shell/res/values-ur/strings.xml index aa311c2978c8..2006b0ba6929 100644 --- a/libs/WindowManager/Shell/res/values-ur/strings.xml +++ b/libs/WindowManager/Shell/res/values-ur/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"کیمرے کے مسائل؟\nدوبارہ فٹ کرنے کیلئے تھپتھپائیں"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"یہ حل نہیں ہوا؟\nلوٹانے کیلئے تھپتھپائیں"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"کوئی کیمرے کا مسئلہ نہیں ہے؟ برخاست کرنے کیلئے تھپتھپائیں۔"</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"ایپ مینو کھولنے کیلئے تھپتھپائیں"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"متعدد ایپس ایک ساتھ دکھانے کیلئے تھپتھپائیں"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"ایپ مینو سے مکمل اسکرین پر واپس جائیں"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"دیکھیں اور بہت کچھ کریں"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"اسپلٹ اسکرین کے ليے دوسری ایپ میں گھسیٹیں"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"کسی ایپ کی پوزیشن تبدیل کرنے کے لیے اس ایپ کے باہر دو بار تھپتھپائیں"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Windows کا نظم کریں"</string> <string name="close_text" msgid="4986518933445178928">"بند کریں"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"مینیو بند کریں"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"مینو کھولیں"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"اسکرین کو بڑا کریں"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"اسکرین کا اسناپ شاٹ لیں"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"اس ایپ کا سائز تبدیل نہیں کیا جا سکتا"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"ایپ کو یہاں منتقل نہیں کیا جا سکتا"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"بڑا کریں"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"دائیں منتقل کریں"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"بائیں منتقل کریں"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-uz/strings.xml b/libs/WindowManager/Shell/res/values-uz/strings.xml index cd0ca82ff563..4b163f79f970 100644 --- a/libs/WindowManager/Shell/res/values-uz/strings.xml +++ b/libs/WindowManager/Shell/res/values-uz/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Kamera nosozmi?\nQayta moslash uchun bosing"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Tuzatilmadimi?\nQaytarish uchun bosing"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Kamera muammosizmi? Yopish uchun bosing."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Ilova menyusini ochish uchun bosing"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Bir nechta ilovani birga chiqarish uchun bosing"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Ilova menyusidan butun ekranga qayting"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Yana boshqa amallar"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Ekranni ikkiga ajratish uchun boshqa ilovani bu yerga torting"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Qayta joylash uchun ilova tashqarisiga ikki marta bosing"</string> @@ -129,8 +132,18 @@ <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Menyuni ochish"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Ekranni yoyish"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Ekranni biriktirish"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Bu ilova hajmini oʻzgartirish imkonsiz"</string> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Ilova bu yerga surilmaydi"</string> <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Yoyish"</string> <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Chapga tortish"</string> <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Oʻngga tortish"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> + <skip /> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-vi/strings.xml b/libs/WindowManager/Shell/res/values-vi/strings.xml index abac3fe824bb..db86498130d8 100644 --- a/libs/WindowManager/Shell/res/values-vi/strings.xml +++ b/libs/WindowManager/Shell/res/values-vi/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Có vấn đề với máy ảnh?\nHãy nhấn để sửa lỗi"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Bạn chưa khắc phục vấn đề?\nHãy nhấn để hủy bỏ"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Không có vấn đề với máy ảnh? Hãy nhấn để đóng."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Nhấn để mở trình đơn ứng dụng"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Nhấn để hiển thị nhiều ứng dụng cùng lúc"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Quay lại chế độ toàn màn hình từ trình đơn ứng dụng"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Xem và làm được nhiều việc hơn"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Kéo một ứng dụng khác vào để chia đôi màn hình"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Nhấn đúp bên ngoài ứng dụng để đặt lại vị trí"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Quản lý cửa sổ"</string> <string name="close_text" msgid="4986518933445178928">"Đóng"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Đóng trình đơn"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Mở Trình đơn"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Mở rộng màn hình"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Điều chỉnh kích thước màn hình"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Không thể đổi kích thước của ứng dụng này"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"Không di chuyển được ứng dụng đến đây"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Phóng to tối đa"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Di chuyển nhanh sang trái"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Di chuyển nhanh sang phải"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml b/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml index 5a61decdcfb9..ebf4b038b098 100644 --- a/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml +++ b/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"相机有问题?\n点按即可整修"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"没有解决此问题?\n点按即可恢复"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"相机没有问题?点按即可忽略。"</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"点按可打开应用菜单"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"点按可同时显示多个应用"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"从应用菜单可返回到全屏"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"查看和处理更多任务"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"拖入另一个应用,即可使用分屏模式"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"在某个应用外连续点按两次,即可调整它的位置"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"管理窗口"</string> <string name="close_text" msgid="4986518933445178928">"关闭"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"关闭菜单"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"打开菜单"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"最大化屏幕"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"屏幕快照"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"无法调整此应用的大小"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"无法将应用移至此处"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"最大化"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"贴靠左侧"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"贴靠右侧"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml b/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml index e1c303e198bb..f1d12fce0103 100644 --- a/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml +++ b/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"相機有問題?\n輕按即可修正"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"未能修正問題?\n輕按即可還原"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"相機冇問題?㩒一下就可以即可閂咗佢。"</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"輕按即可開啟應用程式選單"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"輕按即可同時顯示多個應用程式"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"從應用程式選單返回全螢幕"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"瀏覽更多內容及執行更多操作"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"拖入另一個應用程式即可分割螢幕"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"在應用程式外輕按兩下即可調整位置"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"管理視窗"</string> <string name="close_text" msgid="4986518933445178928">"關閉"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"關閉選單"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"打開選單"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"畫面最大化"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"貼齊畫面"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"此應用程式無法調整大小"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"應用程式無法移至這裡"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"最大化"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"貼齊左邊"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"貼齊右邊"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml b/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml index 97e36c300a4a..b5c28d347acb 100644 --- a/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml +++ b/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"相機有問題嗎?\n輕觸即可修正"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"未修正問題嗎?\n輕觸即可還原"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"相機沒問題嗎?輕觸即可關閉。"</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"輕觸即可開啟應用程式選單"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"輕觸即可一次顯示多個應用程式"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"從應用程式選單返回全螢幕"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"瀏覽更多內容及執行更多操作"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"拖進另一個應用程式即可使用分割畫面模式"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"在應用程式外輕觸兩下即可調整位置"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"管理視窗"</string> <string name="close_text" msgid="4986518933445178928">"關閉"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"關閉選單"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"開啟選單"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"畫面最大化"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"貼齊畫面"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"這個應用程式無法調整大小"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"應用程式無法移至此處"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"最大化"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"靠左對齊"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"靠右對齊"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-zu/strings.xml b/libs/WindowManager/Shell/res/values-zu/strings.xml index 74c7169fefa3..f54d0ed01ea8 100644 --- a/libs/WindowManager/Shell/res/values-zu/strings.xml +++ b/libs/WindowManager/Shell/res/values-zu/strings.xml @@ -97,6 +97,9 @@ <string name="camera_compat_treatment_suggested_button_description" msgid="8103916969024076767">"Izinkinga zekhamera?\nThepha ukuze uyilinganise kabusha"</string> <string name="camera_compat_treatment_applied_button_description" msgid="2944157113330703897">"Akuyilungisanga?\nThepha ukuze ubuyele"</string> <string name="camera_compat_dismiss_button_description" msgid="2795364433503817511">"Azikho izinkinga zekhamera? Thepha ukuze ucashise."</string> + <string name="windowing_app_handle_education_tooltip" msgid="6398482412956375783">"Thepha ukuze uvule imenyu ye-app"</string> + <string name="windowing_desktop_mode_image_button_education_tooltip" msgid="6285279585554484957">"Thepha ukuze ubonise ama-app amaningi ndawonye"</string> + <string name="windowing_desktop_mode_exit_education_tooltip" msgid="6685429075790085337">"Buyela esikrinini esigcwele ukusuka kumenyu ye-app"</string> <string name="letterbox_education_dialog_title" msgid="7739895354143295358">"Bona futhi wenze okuningi"</string> <string name="letterbox_education_split_screen_text" msgid="449233070804658627">"Hudula kwenye i-app mayelana nokuhlukanisa isikrini"</string> <string name="letterbox_education_reposition_text" msgid="4589957299813220661">"Thepha kabili ngaphandle kwe-app ukuze uyimise kabusha"</string> @@ -126,15 +129,21 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Phatha Amawindi"</string> <string name="close_text" msgid="4986518933445178928">"Vala"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Vala Imenyu"</string> - <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> - <skip /> + <string name="desktop_mode_app_header_chip_text" msgid="6366422614991687237">"Vula Imenyu"</string> <string name="desktop_mode_maximize_menu_maximize_text" msgid="3275717276171114411">"Khulisa Isikrini Sifike Ekugcineni"</string> <string name="desktop_mode_maximize_menu_snap_text" msgid="2065251022783880154">"Thwebula Isikrini"</string> - <string name="desktop_mode_non_resizable_snap_text" msgid="1049800446363800707">"Le app ayikwazi ukushintshwa usayizi"</string> - <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <string name="desktop_mode_non_resizable_snap_text" msgid="3771776422751387878">"I-app ayikwazi ukuhanjiswa lapha"</string> + <string name="desktop_mode_maximize_menu_maximize_button_text" msgid="3090199175564175845">"Khulisa"</string> + <string name="desktop_mode_maximize_menu_snap_left_button_text" msgid="8077452201179893424">"Chofoza kwesobunxele"</string> + <string name="desktop_mode_maximize_menu_snap_right_button_text" msgid="7117751068945657304">"Chofoza kwesokudla"</string> + <!-- no translation found for open_by_default_settings_text (2526548548598185500) --> + <skip /> + <!-- no translation found for open_by_default_dialog_subheader_text (1729599730664063881) --> + <skip /> + <!-- no translation found for open_by_default_dialog_in_app_text (6978022419634199806) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <!-- no translation found for open_by_default_dialog_in_browser_text (8042769465958497081) --> <skip /> - <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <!-- no translation found for open_by_default_dialog_dismiss_button_text (3487238795534582291) --> <skip /> </resources> diff --git a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/FocusTransitionListener.java b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/FocusTransitionListener.java index 26aae2d2aa78..02a799189fa1 100644 --- a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/FocusTransitionListener.java +++ b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/FocusTransitionListener.java @@ -26,5 +26,11 @@ public interface FocusTransitionListener { /** * Called when a transition changes the top, focused display. */ - void onFocusedDisplayChanged(int displayId); + default void onFocusedDisplayChanged(int displayId) {} + + /** + * Called when the per-app or system-wide focus state has changed for a task. + */ + default void onFocusedTaskChanged(int taskId, boolean isFocusedOnDisplay, + boolean isFocusedGlobally) {} } diff --git a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/bubbles/FlyoutDrawableLoader.kt b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/bubbles/FlyoutDrawableLoader.kt new file mode 100644 index 000000000000..5a1733094019 --- /dev/null +++ b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/bubbles/FlyoutDrawableLoader.kt @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2024 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.wm.shell.shared.bubbles + +import android.content.Context +import android.content.Intent +import android.graphics.drawable.Drawable +import android.graphics.drawable.Icon +import android.util.Log + +object FlyoutDrawableLoader { + + private const val TAG = "FlyoutDrawableLoader" + + /** Loads the flyout icon as a [Drawable]. */ + @JvmStatic + fun Icon?.loadFlyoutDrawable(context: Context): Drawable? { + if (this == null) return null + try { + if (this.type == Icon.TYPE_URI || this.type == Icon.TYPE_URI_ADAPTIVE_BITMAP) { + context.grantUriPermission( + context.packageName, + this.uri, + Intent.FLAG_GRANT_READ_URI_PERMISSION + ) + } + return loadDrawable(context) + } catch (e: Exception) { + Log.w(TAG, "loadFlyoutDrawable failed: ${e.message}") + return null + } + } +} diff --git a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeStatus.java b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeStatus.java index 647a555ad169..0150bcdbd412 100644 --- a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeStatus.java +++ b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/DesktopModeStatus.java @@ -19,7 +19,7 @@ package com.android.wm.shell.shared.desktopmode; import android.annotation.NonNull; import android.content.Context; import android.os.SystemProperties; -import android.window.flags.DesktopModeFlags; +import android.window.DesktopModeFlags; import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/AppToWebUtils.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/AppToWebUtils.kt index 71bcb590ae23..65132fe89063 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/AppToWebUtils.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/AppToWebUtils.kt @@ -22,7 +22,13 @@ import android.content.Context import android.content.Intent import android.content.Intent.FLAG_ACTIVITY_NEW_TASK import android.content.pm.PackageManager +import android.content.pm.verify.domain.DomainVerificationManager +import android.content.pm.verify.domain.DomainVerificationUserState import android.net.Uri +import com.android.internal.protolog.ProtoLog +import com.android.wm.shell.protolog.ShellProtoLogGroup + +private const val TAG = "AppToWebUtils" private val GenericBrowserIntent = Intent() .setAction(Intent.ACTION_VIEW) @@ -58,4 +64,25 @@ fun getBrowserIntent(uri: Uri, packageManager: PackageManager): Intent? { val component = intent.resolveActivity(packageManager) ?: return null intent.setComponent(component) return intent -}
\ No newline at end of file +} + +/** + * Returns the [DomainVerificationUserState] of the user associated with the given + * [DomainVerificationManager] and the given package. + */ +fun getDomainVerificationUserState( + manager: DomainVerificationManager, + packageName: String +): DomainVerificationUserState? { + try { + return manager.getDomainVerificationUserState(packageName) + } catch (e: PackageManager.NameNotFoundException) { + ProtoLog.w( + ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE, + "%s: Failed to get domain verification user state: %s", + TAG, + e.message!! + ) + return null + } +} diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/OpenByDefaultDialog.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/OpenByDefaultDialog.kt index 4926cbdbe9fb..a727b54b3a3f 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/OpenByDefaultDialog.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/OpenByDefaultDialog.kt @@ -19,6 +19,7 @@ package com.android.wm.shell.apptoweb import android.app.ActivityManager.RunningTaskInfo import android.app.TaskInfo import android.content.Context +import android.content.pm.verify.domain.DomainVerificationManager import android.graphics.Bitmap import android.graphics.PixelFormat import android.view.LayoutInflater @@ -30,6 +31,7 @@ import android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL import android.view.WindowManager.LayoutParams.TYPE_APPLICATION_PANEL import android.view.WindowlessWindowManager import android.widget.ImageView +import android.widget.RadioButton import android.widget.TextView import android.window.TaskConstants import com.android.wm.shell.R @@ -58,8 +60,17 @@ internal class OpenByDefaultDialog( private lateinit var appIconView: ImageView private lateinit var appNameView: TextView + private lateinit var openInAppButton: RadioButton + private lateinit var openInBrowserButton: RadioButton + + private val domainVerificationManager = + context.getSystemService(DomainVerificationManager::class.java)!! + private val packageName = taskInfo.baseActivity?.packageName!! + + init { createDialog() + initializeRadioButtons() bindAppInfo(appIconBitmap, appName) } @@ -111,9 +122,30 @@ internal class OpenByDefaultDialog( closeMenu() } + dialog.setConfirmButtonClickListener { + setDefaultLinkHandlingSetting() + closeMenu() + } + listener.onDialogCreated() } + private fun initializeRadioButtons() { + openInAppButton = dialog.requireViewById(R.id.open_in_app_button) + openInBrowserButton = dialog.requireViewById(R.id.open_in_browser_button) + + val userState = + getDomainVerificationUserState(domainVerificationManager, packageName) ?: return + val openInApp = userState.isLinkHandlingAllowed + openInAppButton.isChecked = openInApp + openInBrowserButton.isChecked = !openInApp + } + + private fun setDefaultLinkHandlingSetting() { + domainVerificationManager.setDomainVerificationLinkHandlingAllowed( + packageName, openInAppButton.isChecked) + } + private fun closeMenu() { dialogContainer?.releaseView() dialogContainer = null diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/OpenByDefaultDialogView.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/OpenByDefaultDialogView.kt index d03a38e8699a..1b914f419d94 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/OpenByDefaultDialogView.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/apptoweb/OpenByDefaultDialogView.kt @@ -36,9 +36,6 @@ class OpenByDefaultDialogView @JvmOverloads constructor( private lateinit var backgroundDim: Drawable fun setDismissOnClickListener(callback: (View) -> Unit) { - val dismissButton = dialogContainer.requireViewById<Button>( - R.id.open_by_default_settings_dialog_dismiss_button) - dismissButton.setOnClickListener(callback) // Clicks on the background dim should also dismiss the dialog. setOnClickListener(callback) // We add a no-op on-click listener to the dialog container so that clicks on it won't @@ -46,6 +43,13 @@ class OpenByDefaultDialogView @JvmOverloads constructor( dialogContainer.setOnClickListener { } } + fun setConfirmButtonClickListener(callback: (View) -> Unit) { + val dismissButton = dialogContainer.requireViewById<Button>( + R.id.open_by_default_settings_dialog_confirm_button + ) + dismissButton.setOnClickListener(callback) + } + override fun onFinishInflate() { super.onFinishInflate() dialogContainer = requireViewById(R.id.open_by_default_dialog_container) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimation.java b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimation.java index df80946a99aa..7c5f71647843 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimation.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimation.java @@ -33,8 +33,6 @@ public interface BackAnimation { * * @param touchX the X touch position of the {@link MotionEvent}. * @param touchY the Y touch position of the {@link MotionEvent}. - * @param velocityX the X velocity computed from the {@link MotionEvent}. - * @param velocityY the Y velocity computed from the {@link MotionEvent}. * @param keyAction the original {@link KeyEvent#getAction()} when the event was dispatched to * the process. This is forwarded separately because the input pipeline may mutate * the {#event} action state later. @@ -43,8 +41,6 @@ public interface BackAnimation { void onBackMotion( float touchX, float touchY, - float velocityX, - float velocityY, int keyAction, @BackEvent.SwipeEdge int swipeEdge); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java index 5836085e0ddc..b90e6e2fab8a 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java @@ -352,16 +352,12 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont public void onBackMotion( float touchX, float touchY, - float velocityX, - float velocityY, int keyAction, @BackEvent.SwipeEdge int swipeEdge ) { mShellExecutor.execute(() -> onMotionEvent( /* touchX = */ touchX, /* touchY = */ touchY, - /* velocityX = */ velocityX, - /* velocityY = */ velocityY, /* keyAction = */ keyAction, /* swipeEdge = */ swipeEdge)); } @@ -500,14 +496,12 @@ public class BackAnimationController implements RemoteCallable<BackAnimationCont public void onMotionEvent( float touchX, float touchY, - float velocityX, - float velocityY, int keyAction, @BackEvent.SwipeEdge int swipeEdge) { BackTouchTracker activeTouchTracker = getActiveTracker(); if (activeTouchTracker != null) { - activeTouchTracker.update(touchX, touchY, velocityX, velocityY); + activeTouchTracker.update(touchX, touchY); } // two gestures are waiting to be processed at the moment, skip any further user touches diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleLogger.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleLogger.java index c88a58be1461..1abe11998500 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleLogger.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleLogger.java @@ -36,6 +36,8 @@ public class BubbleLogger { @VisibleForTesting public enum Event implements UiEventLogger.UiEventEnum { + // region bubble events + @UiEvent(doc = "User dismissed the bubble via gesture, add bubble to overflow.") BUBBLE_OVERFLOW_ADD_USER_GESTURE(483), @@ -64,7 +66,89 @@ public class BubbleLogger { BUBBLE_OVERFLOW_SELECTED(600), @UiEvent(doc = "Restore bubble to overflow after phone reboot.") - BUBBLE_OVERFLOW_RECOVER(691); + BUBBLE_OVERFLOW_RECOVER(691), + + // endregion + + // region bubble bar events + + @UiEvent(doc = "new bubble posted") + BUBBLE_BAR_BUBBLE_POSTED(1927), + + @UiEvent(doc = "existing bubble updated") + BUBBLE_BAR_BUBBLE_UPDATED(1928), + + @UiEvent(doc = "expanded a bubble from bubble bar") + BUBBLE_BAR_EXPANDED(1929), + + @UiEvent(doc = "bubble bar collapsed") + BUBBLE_BAR_COLLAPSED(1930), + + @UiEvent(doc = "dismissed single bubble from bubble bar by dragging it to dismiss target") + BUBBLE_BAR_BUBBLE_DISMISSED_DRAG_BUBBLE(1931), + + @UiEvent(doc = "dismissed single bubble from bubble bar by dragging the expanded view to " + + "dismiss target") + BUBBLE_BAR_BUBBLE_DISMISSED_DRAG_EXP_VIEW(1932), + + @UiEvent(doc = "dismiss bubble from app handle menu") + BUBBLE_BAR_BUBBLE_DISMISSED_APP_MENU(1933), + + @UiEvent(doc = "bubble is dismissed due to app finishing the bubble activity") + BUBBLE_BAR_BUBBLE_ACTIVITY_FINISH(1934), + + @UiEvent(doc = "dismissed the bubble bar by dragging it to dismiss target") + BUBBLE_BAR_DISMISSED_DRAG_BAR(1935), + + @UiEvent(doc = "bubble bar moved to the left edge of the screen by dragging from the " + + "expanded view") + BUBBLE_BAR_MOVED_LEFT_DRAG_EXP_VIEW(1936), + + @UiEvent(doc = "bubble bar moved to the left edge of the screen by dragging from a single" + + " bubble") + BUBBLE_BAR_MOVED_LEFT_DRAG_BUBBLE(1937), + + @UiEvent(doc = "bubble bar moved to the left edge of the screen by dragging the bubble bar") + BUBBLE_BAR_MOVED_LEFT_DRAG_BAR(1938), + + @UiEvent(doc = "bubble bar moved to the right edge of the screen by dragging from the " + + "expanded view") + BUBBLE_BAR_MOVED_RIGHT_DRAG_EXP_VIEW(1939), + + @UiEvent(doc = "bubble bar moved to the right edge of the screen by dragging from a " + + "single bubble") + BUBBLE_BAR_MOVED_RIGHT_DRAG_BUBBLE(1940), + + @UiEvent(doc = "bubble bar moved to the right edge of the screen by dragging the bubble " + + "bar") + BUBBLE_BAR_MOVED_RIGHT_DRAG_BAR(1941), + + @UiEvent(doc = "stop bubbling conversation from app handle menu") + BUBBLE_BAR_APP_MENU_OPT_OUT(1942), + + @UiEvent(doc = "open app settings from app handle menu") + BUBBLE_BAR_APP_MENU_GO_TO_SETTINGS(1943), + + @UiEvent(doc = "flyout shown for a bubble") + BUBBLE_BAR_FLYOUT(1944), + + @UiEvent(doc = "notification for the bubble was canceled") + BUBBLE_BAR_BUBBLE_REMOVED_CANCELED(1945), + + @UiEvent(doc = "user turned off bubbles from settings") + BUBBLE_BAR_BUBBLE_REMOVED_BLOCKED(1946), + + @UiEvent(doc = "bubble bar overflow opened") + BUBBLE_BAR_OVERFLOW_SELECTED(1947), + + @UiEvent(doc = "max number of bubbles was reached in bubble bar, move bubble to overflow") + BUBBLE_BAR_OVERFLOW_ADD_AGED(1948), + + @UiEvent(doc = "bubble promoted from overflow back to bubble bar") + BUBBLE_BAR_OVERFLOW_REMOVE_BACK_TO_BAR(1949), + + // endregion + ; private final int mId; diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java index c5e3afda34dd..39fb2f49c1ee 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTask.java @@ -21,11 +21,10 @@ import static com.android.wm.shell.bubbles.BadgedImageView.WHITE_SCRIM_ALPHA; import static com.android.wm.shell.bubbles.BubbleDebugConfig.TAG_BUBBLES; import static com.android.wm.shell.bubbles.BubbleDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_BUBBLES; +import static com.android.wm.shell.shared.bubbles.FlyoutDrawableLoader.loadFlyoutDrawable; -import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Context; -import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.ShortcutInfo; @@ -34,7 +33,6 @@ import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Path; import android.graphics.drawable.Drawable; -import android.graphics.drawable.Icon; import android.util.Log; import android.util.PathParser; import android.view.LayoutInflater; @@ -51,7 +49,6 @@ import com.android.wm.shell.bubbles.bar.BubbleBarLayerView; import com.android.wm.shell.shared.handles.RegionSamplingHelper; import java.lang.ref.WeakReference; -import java.util.Objects; import java.util.concurrent.Executor; import java.util.concurrent.atomic.AtomicBoolean; @@ -340,7 +337,7 @@ public class BubbleViewInfoTask { info.flyoutMessage = b.getFlyoutMessage(); if (info.flyoutMessage != null) { info.flyoutMessage.senderAvatar = - loadSenderAvatar(c, info.flyoutMessage.senderIcon); + loadFlyoutDrawable(info.flyoutMessage.senderIcon, c); } return info; } @@ -422,21 +419,4 @@ public class BubbleViewInfoTask { Color.WHITE, WHITE_SCRIM_ALPHA); return true; } - - @Nullable - static Drawable loadSenderAvatar(@NonNull final Context context, @Nullable final Icon icon) { - Objects.requireNonNull(context); - if (icon == null) return null; - try { - if (icon.getType() == Icon.TYPE_URI - || icon.getType() == Icon.TYPE_URI_ADAPTIVE_BITMAP) { - context.grantUriPermission(context.getPackageName(), - icon.getUri(), Intent.FLAG_GRANT_READ_URI_PERMISSION); - } - return icon.loadDrawable(context); - } catch (Exception e) { - Log.w(TAG, "loadSenderAvatar failed: " + e.getMessage()); - return null; - } - } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTaskLegacy.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTaskLegacy.java index c12822a27662..e9a593392dc2 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTaskLegacy.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleViewInfoTaskLegacy.java @@ -20,11 +20,10 @@ import static com.android.wm.shell.bubbles.BadgedImageView.DEFAULT_PATH_SIZE; import static com.android.wm.shell.bubbles.BadgedImageView.WHITE_SCRIM_ALPHA; import static com.android.wm.shell.bubbles.BubbleDebugConfig.TAG_BUBBLES; import static com.android.wm.shell.bubbles.BubbleDebugConfig.TAG_WITH_CLASS_NAME; +import static com.android.wm.shell.shared.bubbles.FlyoutDrawableLoader.loadFlyoutDrawable; -import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Context; -import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.ShortcutInfo; @@ -33,7 +32,6 @@ import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Path; import android.graphics.drawable.Drawable; -import android.graphics.drawable.Icon; import android.os.AsyncTask; import android.util.Log; import android.util.PathParser; @@ -50,7 +48,6 @@ import com.android.wm.shell.bubbles.bar.BubbleBarLayerView; import com.android.wm.shell.shared.handles.RegionSamplingHelper; import java.lang.ref.WeakReference; -import java.util.Objects; import java.util.concurrent.Executor; /** @@ -264,7 +261,7 @@ public class BubbleViewInfoTaskLegacy extends info.flyoutMessage = b.getFlyoutMessage(); if (info.flyoutMessage != null) { info.flyoutMessage.senderAvatar = - loadSenderAvatar(c, info.flyoutMessage.senderIcon); + loadFlyoutDrawable(info.flyoutMessage.senderIcon, c); } return info; } @@ -346,21 +343,4 @@ public class BubbleViewInfoTaskLegacy extends Color.WHITE, WHITE_SCRIM_ALPHA); return true; } - - @Nullable - static Drawable loadSenderAvatar(@NonNull final Context context, @Nullable final Icon icon) { - Objects.requireNonNull(context); - if (icon == null) return null; - try { - if (icon.getType() == Icon.TYPE_URI - || icon.getType() == Icon.TYPE_URI_ADAPTIVE_BITMAP) { - context.grantUriPermission(context.getPackageName(), - icon.getUri(), Intent.FLAG_GRANT_READ_URI_PERMISSION); - } - return icon.loadDrawable(context); - } catch (Exception e) { - Log.w(TAG, "loadSenderAvatar failed: " + e.getMessage()); - return null; - } - } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipUtils.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipUtils.kt index b3491baa629d..b83b5f341dda 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipUtils.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/pip/PipUtils.kt @@ -177,26 +177,84 @@ object PipUtils { } /** + * Calculates the transform to apply on a UNTRANSFORMED (config-at-end) Activity surface in + * order for it's hint-rect to occupy the same task-relative position/dimensions as it would + * have at the end of the transition (post-configuration). + * + * This is intended to be used in tandem with [calcStartTransform] below applied to the parent + * task. Applying both transforms simultaneously should result in the appearance of nothing + * having happened yet. + * + * Only the task should be animated (into it's identity state) and then WMCore will reset the + * activity transform in sync with its new configuration upon finish. + * + * Usage example: + * calcEndTransform(pipActivity, pipTask, scale, pos); + * t.setScale(pipActivity.getLeash(), scale.x, scale.y); + * t.setPosition(pipActivity.getLeash(), pos.x, pos.y); + * + * @see calcStartTransform + */ + @JvmStatic + fun calcEndTransform(pipActivity: TransitionInfo.Change, pipTask: TransitionInfo.Change, + outScale: PointF, outPos: PointF) { + val actStartBounds = pipActivity.startAbsBounds + val actEndBounds = pipActivity.endAbsBounds + val taskEndBounds = pipTask.endAbsBounds + + var hintRect = pipTask.taskInfo?.pictureInPictureParams?.sourceRectHint + if (hintRect == null) { + hintRect = Rect(actStartBounds) + hintRect.offsetTo(0, 0) + } + + // FA = final activity bounds (absolute) + // FT = final task bounds (absolute) + // SA = start activity bounds (absolute) + // H = source hint (relative to start activity bounds) + // We want to transform the activity so that when the task is at FT, H overlaps with FA + + // This scales the activity such that the hint rect has the same dimensions + // as the final activity bounds. + val hintToEndScaleX = (actEndBounds.width().toFloat()) / (hintRect.width().toFloat()) + val hintToEndScaleY = (actEndBounds.height().toFloat()) / (hintRect.height().toFloat()) + // top-left needs to be (FA.tl - FT.tl) - H.tl * hintToEnd . H is relative to the + // activity; so, for example, if shrinking H to FA (hintToEnd < 1), then the tl of the + // shrunk SA is closer to H than expected, so we need to reduce how much we offset SA + // to get H.tl to match. + val startActPosInTaskEndX = + (actEndBounds.left - taskEndBounds.left) - hintRect.left * hintToEndScaleX + val startActPosInTaskEndY = + (actEndBounds.top - taskEndBounds.top) - hintRect.top * hintToEndScaleY + outScale.set(hintToEndScaleX, hintToEndScaleY) + outPos.set(startActPosInTaskEndX, startActPosInTaskEndY) + } + + /** * Calculates the transform and crop to apply on a Task surface in order for the config-at-end * activity inside it (original-size activity transformed to match it's hint rect to the final * Task bounds) to occupy the same world-space position/dimensions as it had before the * transition. * + * Intended to be used in tandem with [calcEndTransform]. + * * Usage example: - * calcStartTransform(pipChange, scale, pos, crop); - * t.setScale(pipChange.getLeash(), scale.x, scale.y); - * t.setPosition(pipChange.getLeash(), pos.x, pos.y); - * t.setCrop(pipChange.getLeash(), crop); + * calcStartTransform(pipTask, scale, pos, crop); + * t.setScale(pipTask.getLeash(), scale.x, scale.y); + * t.setPosition(pipTask.getLeash(), pos.x, pos.y); + * t.setCrop(pipTask.getLeash(), crop); + * + * @see calcEndTransform */ @JvmStatic - fun calcStartTransform(pipChange: TransitionInfo.Change, outScale: PointF, + fun calcStartTransform(pipTask: TransitionInfo.Change, outScale: PointF, outPos: PointF, outCrop: Rect) { - val startBounds = pipChange.startAbsBounds - val taskEndBounds = pipChange.endAbsBounds + val startBounds = pipTask.startAbsBounds + val taskEndBounds = pipTask.endAbsBounds // For now, pip activity bounds always matches task bounds. If this ever changes, we'll // need to get the activity offset. val endBounds = taskEndBounds - var hintRect = pipChange.taskInfo?.pictureInPictureParams?.sourceRectHint + var hintRect = pipTask.taskInfo?.pictureInPictureParams?.sourceRectHint if (hintRect == null) { hintRect = Rect(startBounds) hintRect.offsetTo(0, 0) @@ -226,8 +284,8 @@ object PipUtils { + startBounds.left + hintRect.left) val endTaskPosForStartY = (-(endBounds.top - taskEndBounds.top) * endToHintScaleY + startBounds.top + hintRect.top) - outScale[endToHintScaleX] = endToHintScaleY - outPos[endTaskPosForStartX] = endTaskPosForStartY + outScale.set(endToHintScaleX, endToHintScaleY) + outPos.set(endTaskPosForStartX, endTaskPosForStartY) // now need to set crop to reveal the non-hint stuff. Again, hintrect is relative, so // we must apply outsets to reveal the *activity* content which is *inside* the task diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIWindowManager.java b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIWindowManager.java index 4d15605c756a..2128cbc144b5 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIWindowManager.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIWindowManager.java @@ -27,7 +27,7 @@ import android.graphics.Rect; import android.util.Pair; import android.view.LayoutInflater; import android.view.View; -import android.window.flags.DesktopModeFlags; +import android.window.DesktopModeFlags; import com.android.internal.annotations.VisibleForTesting; import com.android.window.flags.Flags; diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java index 79c31e01e365..52262e68c401 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java @@ -16,8 +16,8 @@ package com.android.wm.shell.dagger; -import static android.window.flags.DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_EXIT_TRANSITIONS; -import static android.window.flags.DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_TASK_LIMIT; +import static android.window.DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_EXIT_TRANSITIONS; +import static android.window.DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_TASK_LIMIT; import android.annotation.Nullable; import android.app.KeyguardManager; @@ -71,10 +71,10 @@ import com.android.wm.shell.desktopmode.DesktopModeDragAndDropTransitionHandler; import com.android.wm.shell.desktopmode.DesktopModeEventLogger; import com.android.wm.shell.desktopmode.DesktopModeLoggerTransitionObserver; import com.android.wm.shell.desktopmode.DesktopRepository; +import com.android.wm.shell.desktopmode.DesktopTaskChangeListener; import com.android.wm.shell.desktopmode.DesktopTasksController; import com.android.wm.shell.desktopmode.DesktopTasksLimiter; import com.android.wm.shell.desktopmode.DesktopTasksTransitionObserver; -import com.android.wm.shell.desktopmode.DesktopTaskChangeListener; import com.android.wm.shell.desktopmode.DragToDesktopTransitionHandler; import com.android.wm.shell.desktopmode.EnterDesktopTaskTransitionHandler; import com.android.wm.shell.desktopmode.ExitDesktopTaskTransitionHandler; @@ -92,9 +92,9 @@ import com.android.wm.shell.freeform.FreeformComponents; import com.android.wm.shell.freeform.FreeformTaskListener; import com.android.wm.shell.freeform.FreeformTaskTransitionHandler; import com.android.wm.shell.freeform.FreeformTaskTransitionObserver; -import com.android.wm.shell.freeform.TaskChangeListener; import com.android.wm.shell.freeform.FreeformTaskTransitionStarter; import com.android.wm.shell.freeform.FreeformTaskTransitionStarterInitializer; +import com.android.wm.shell.freeform.TaskChangeListener; import com.android.wm.shell.keyguard.KeyguardTransitionHandler; import com.android.wm.shell.onehanded.OneHandedController; import com.android.wm.shell.pip.PipTransitionController; @@ -111,6 +111,7 @@ import com.android.wm.shell.sysui.ShellController; import com.android.wm.shell.sysui.ShellInit; import com.android.wm.shell.taskview.TaskViewTransitions; import com.android.wm.shell.transition.DefaultMixedHandler; +import com.android.wm.shell.transition.FocusTransitionObserver; import com.android.wm.shell.transition.HomeTransitionObserver; import com.android.wm.shell.transition.MixedTransitionHandler; import com.android.wm.shell.transition.Transitions; @@ -263,7 +264,8 @@ public abstract class WMShellModule { Optional<DesktopTasksLimiter> desktopTasksLimiter, AppHandleEducationController appHandleEducationController, WindowDecorCaptionHandleRepository windowDecorCaptionHandleRepository, - Optional<DesktopActivityOrientationChangeHandler> desktopActivityOrientationHandler) { + Optional<DesktopActivityOrientationChangeHandler> desktopActivityOrientationHandler, + FocusTransitionObserver focusTransitionObserver) { if (DesktopModeStatus.canEnterDesktopMode(context)) { return new DesktopModeWindowDecorViewModel( context, @@ -290,7 +292,8 @@ public abstract class WMShellModule { desktopTasksLimiter, appHandleEducationController, windowDecorCaptionHandleRepository, - desktopActivityOrientationHandler); + desktopActivityOrientationHandler, + focusTransitionObserver); } return new CaptionWindowDecorViewModel( context, @@ -304,7 +307,8 @@ public abstract class WMShellModule { displayController, rootTaskDisplayAreaOrganizer, syncQueue, - transitions); + transitions, + focusTransitionObserver); } @WMSingleton @@ -391,10 +395,11 @@ public abstract class WMShellModule { Transitions transitions, Optional<DesktopFullImmersiveTransitionHandler> desktopImmersiveTransitionHandler, WindowDecorViewModel windowDecorViewModel, - Optional<TaskChangeListener> taskChangeListener) { + Optional<TaskChangeListener> taskChangeListener, + FocusTransitionObserver focusTransitionObserver) { return new FreeformTaskTransitionObserver( context, shellInit, transitions, desktopImmersiveTransitionHandler, - windowDecorViewModel, taskChangeListener); + windowDecorViewModel, taskChangeListener, focusTransitionObserver); } @WMSingleton @@ -693,10 +698,16 @@ public abstract class WMShellModule { static Optional<DesktopFullImmersiveTransitionHandler> provideDesktopImmersiveHandler( Context context, Transitions transitions, - @DynamicOverride DesktopRepository desktopRepository) { + @DynamicOverride DesktopRepository desktopRepository, + DisplayController displayController, + ShellTaskOrganizer shellTaskOrganizer) { if (DesktopModeStatus.canEnterDesktopMode(context)) { return Optional.of( - new DesktopFullImmersiveTransitionHandler(transitions, desktopRepository)); + new DesktopFullImmersiveTransitionHandler( + transitions, + desktopRepository, + displayController, + shellTaskOrganizer)); } return Optional.empty(); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/Pip2Module.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/Pip2Module.java index 702552e4eee8..3508ecee6d51 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/Pip2Module.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/pip/Pip2Module.java @@ -127,11 +127,9 @@ public abstract class Pip2Module { @Provides static PipScheduler providePipScheduler(Context context, PipBoundsState pipBoundsState, - PhonePipMenuController pipMenuController, @ShellMainThread ShellExecutor mainExecutor, PipTransitionState pipTransitionState) { - return new PipScheduler(context, pipBoundsState, pipMenuController, - mainExecutor, pipTransitionState); + return new PipScheduler(context, pipBoundsState, mainExecutor, pipTransitionState); } @WMSingleton @@ -140,10 +138,13 @@ public abstract class Pip2Module { PipBoundsState pipBoundsState, PipMediaController pipMediaController, SystemWindows systemWindows, PipUiEventLogger pipUiEventLogger, + PipTaskListener pipTaskListener, + @NonNull PipTransitionState pipTransitionState, @ShellMainThread ShellExecutor mainExecutor, @ShellMainThread Handler mainHandler) { return new PhonePipMenuController(context, pipBoundsState, pipMediaController, - systemWindows, pipUiEventLogger, mainExecutor, mainHandler); + systemWindows, pipUiEventLogger, pipTaskListener, pipTransitionState, mainExecutor, + mainHandler); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopFullImmersiveTransitionHandler.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopFullImmersiveTransitionHandler.kt index f749aa1edd92..679179a7ff68 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopFullImmersiveTransitionHandler.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopFullImmersiveTransitionHandler.kt @@ -27,8 +27,12 @@ import android.window.TransitionInfo import android.window.TransitionRequestInfo import android.window.WindowContainerTransaction import androidx.core.animation.addListener +import com.android.internal.annotations.VisibleForTesting import com.android.internal.protolog.ProtoLog -import com.android.wm.shell.protolog.ShellProtoLogGroup +import com.android.window.flags.Flags +import com.android.wm.shell.ShellTaskOrganizer +import com.android.wm.shell.common.DisplayController +import com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE import com.android.wm.shell.transition.Transitions import com.android.wm.shell.transition.Transitions.TransitionHandler import com.android.wm.shell.windowdecor.OnTaskResizeAnimationListener @@ -41,16 +45,29 @@ import com.android.wm.shell.windowdecor.OnTaskResizeAnimationListener class DesktopFullImmersiveTransitionHandler( private val transitions: Transitions, private val desktopRepository: DesktopRepository, + private val displayController: DisplayController, + private val shellTaskOrganizer: ShellTaskOrganizer, private val transactionSupplier: () -> SurfaceControl.Transaction, ) : TransitionHandler { constructor( transitions: Transitions, desktopRepository: DesktopRepository, - ) : this(transitions, desktopRepository, { SurfaceControl.Transaction() }) + displayController: DisplayController, + shellTaskOrganizer: ShellTaskOrganizer, + ) : this( + transitions, + desktopRepository, + displayController, + shellTaskOrganizer, + { SurfaceControl.Transaction() } + ) private var state: TransitionState? = null + @VisibleForTesting + val pendingExternalExitTransitions = mutableSetOf<ExternalPendingExit>() + /** Whether there is an immersive transition that hasn't completed yet. */ private val inProgress: Boolean get() = state != null @@ -61,15 +78,15 @@ class DesktopFullImmersiveTransitionHandler( var onTaskResizeAnimationListener: OnTaskResizeAnimationListener? = null /** Starts a transition to enter full immersive state inside the desktop. */ - fun enterImmersive(taskInfo: RunningTaskInfo, wct: WindowContainerTransaction) { + fun moveTaskToImmersive(taskInfo: RunningTaskInfo) { if (inProgress) { - ProtoLog.v( - ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE, - "FullImmersive: cannot start entry because transition already in progress." - ) + logV("Cannot start entry because transition already in progress.") return } - + val wct = WindowContainerTransaction().apply { + setBounds(taskInfo.token, Rect()) + } + logV("Moving task ${taskInfo.taskId} into immersive mode") val transition = transitions.startTransition(TRANSIT_CHANGE, wct, /* handler= */ this) state = TransitionState( transition = transition, @@ -79,15 +96,18 @@ class DesktopFullImmersiveTransitionHandler( ) } - fun exitImmersive(taskInfo: RunningTaskInfo, wct: WindowContainerTransaction) { + fun moveTaskToNonImmersive(taskInfo: RunningTaskInfo) { if (inProgress) { - ProtoLog.v( - ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE, - "$TAG: cannot start exit because transition already in progress." - ) + logV("Cannot start exit because transition already in progress.") return } + val displayLayout = displayController.getDisplayLayout(taskInfo.displayId) ?: return + val destinationBounds = calculateMaximizeBounds(displayLayout, taskInfo) + val wct = WindowContainerTransaction().apply { + setBounds(taskInfo.token, destinationBounds) + } + logV("Moving task ${taskInfo.taskId} out of immersive mode") val transition = transitions.startTransition(TRANSIT_CHANGE, wct, /* handler= */ this) state = TransitionState( transition = transition, @@ -97,6 +117,82 @@ class DesktopFullImmersiveTransitionHandler( ) } + /** + * Bring the immersive app of the given [displayId] out of immersive mode, if applicable. + * + * @param transition that will apply this transaction + * @param wct that will apply these changes + * @param displayId of the display that should exit immersive mode + */ + fun exitImmersiveIfApplicable( + transition: IBinder, + wct: WindowContainerTransaction, + displayId: Int + ) { + if (!Flags.enableFullyImmersiveInDesktop()) return + exitImmersiveIfApplicable(wct, displayId)?.invoke(transition) + } + + /** + * Bring the immersive app of the given [displayId] out of immersive mode, if applicable. + * + * @param wct that will apply these changes + * @param displayId of the display that should exit immersive mode + * @return a function to apply once the transition that will apply these changes is started + */ + fun exitImmersiveIfApplicable( + wct: WindowContainerTransaction, + displayId: Int + ): ((IBinder) -> Unit)? { + if (!Flags.enableFullyImmersiveInDesktop()) return null + val displayLayout = displayController.getDisplayLayout(displayId) ?: return null + val immersiveTask = desktopRepository.getTaskInFullImmersiveState(displayId) ?: return null + val taskInfo = shellTaskOrganizer.getRunningTaskInfo(immersiveTask) ?: return null + logV("Appending immersive exit for task: $immersiveTask in display: $displayId") + wct.setBounds(taskInfo.token, calculateMaximizeBounds(displayLayout, taskInfo)) + return { transition -> addPendingImmersiveExit(immersiveTask, displayId, transition) } + } + + /** + * Bring the given [taskInfo] out of immersive mode, if applicable. + * + * @param wct that will apply these changes + * @param taskInfo of the task that should exit immersive mode + * @return a function to apply once the transition that will apply these changes is started + */ + fun exitImmersiveIfApplicable( + wct: WindowContainerTransaction, + taskInfo: RunningTaskInfo + ): ((IBinder) -> Unit)? { + if (!Flags.enableFullyImmersiveInDesktop()) return null + if (desktopRepository.isTaskInFullImmersiveState(taskInfo.taskId)) { + // A full immersive task is being minimized, make sure the immersive state is broken + // (i.e. resize back to max bounds). + displayController.getDisplayLayout(taskInfo.displayId)?.let { displayLayout -> + wct.setBounds(taskInfo.token, calculateMaximizeBounds(displayLayout, taskInfo)) + logV("Appending immersive exit for task: ${taskInfo.taskId}") + return { transition -> + addPendingImmersiveExit( + taskId = taskInfo.taskId, + displayId = taskInfo.displayId, + transition = transition + ) + } + } + } + return null + } + + private fun addPendingImmersiveExit(taskId: Int, displayId: Int, transition: IBinder) { + pendingExternalExitTransitions.add( + ExternalPendingExit( + taskId = taskId, + displayId = displayId, + transition = transition + ) + ) + } + override fun startAnimation( transition: IBinder, info: TransitionInfo, @@ -190,15 +286,31 @@ class DesktopFullImmersiveTransitionHandler( * Called when any transition in the system is ready to play. This is needed to update the * repository state before window decorations are drawn (which happens immediately after * |onTransitionReady|, before this transition actually animates) because drawing decorations - * depends in whether the task is in full immersive state or not. + * depends on whether the task is in full immersive state or not. */ - fun onTransitionReady(transition: IBinder) { + fun onTransitionReady(transition: IBinder, info: TransitionInfo) { + // Check if this is a pending external exit transition. + val pendingExit = pendingExternalExitTransitions + .firstOrNull { pendingExit -> pendingExit.transition == transition } + if (pendingExit != null) { + pendingExternalExitTransitions.remove(pendingExit) + if (info.hasTaskChange(taskId = pendingExit.taskId)) { + if (desktopRepository.isTaskInFullImmersiveState(pendingExit.taskId)) { + logV("Pending external exit for task ${pendingExit.taskId} verified") + desktopRepository.setTaskInFullImmersiveState( + displayId = pendingExit.displayId, + taskId = pendingExit.taskId, + immersive = false + ) + } + } + return + } + + // Check if this is a direct immersive enter/exit transition. val state = this.state ?: return - // TODO: b/369443668 - this assumes invoking the exit transition is the only way to exit - // immersive, which isn't realistic. The app could crash, the user could dismiss it from - // overview, etc. This (or its caller) should search all transitions to look for any - // immersive task exiting that state to keep the repository properly updated. if (transition == state.transition) { + logV("Direct move for task ${state.taskId} in ${state.direction} direction verified") when (state.direction) { Direction.ENTER -> { desktopRepository.setTaskInFullImmersiveState( @@ -225,6 +337,9 @@ class DesktopFullImmersiveTransitionHandler( private fun requireState(): TransitionState = state ?: error("Expected non-null transition state") + private fun TransitionInfo.hasTaskChange(taskId: Int): Boolean = + changes.any { c -> c.taskInfo?.taskId == taskId } + /** The state of the currently running transition. */ private data class TransitionState( val transition: IBinder, @@ -233,12 +348,28 @@ class DesktopFullImmersiveTransitionHandler( val direction: Direction ) + /** + * Tracks state of a transition involving an immersive exit that is external to this class' own + * transitions. This usually means transitions that exit immersive mode as a side-effect and + * not the primary action (for example, minimizing the immersive task or launching a new task + * on top of the immersive task). + */ + data class ExternalPendingExit( + val taskId: Int, + val displayId: Int, + val transition: IBinder, + ) + private enum class Direction { ENTER, EXIT } + private fun logV(msg: String, vararg arguments: Any?) { + ProtoLog.v(WM_SHELL_DESKTOP_MODE, "%s: $msg", TAG, *arguments) + } + private companion object { - private const val TAG = "FullImmersiveHandler" + private const val TAG = "DesktopImmersive" private const val FULL_IMMERSIVE_ANIM_DURATION_MS = 336L } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeLoggerTransitionObserver.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeLoggerTransitionObserver.kt index 063747494a82..b8507e3b2764 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeLoggerTransitionObserver.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeLoggerTransitionObserver.kt @@ -68,9 +68,7 @@ class DesktopModeLoggerTransitionObserver( private val idSequence: InstanceIdSequence by lazy { InstanceIdSequence(Int.MAX_VALUE) } init { - if ( - Transitions.ENABLE_SHELL_TRANSITIONS && DesktopModeStatus.canEnterDesktopMode(context) - ) { + if (DesktopModeStatus.canEnterDesktopMode(context)) { shellInit.addInitCallback(this::onInit, this) } } @@ -101,6 +99,9 @@ class DesktopModeLoggerTransitionObserver( fun onInit() { transitions.registerObserver(this) + SystemProperties.set( + VISIBLE_TASKS_COUNTER_SYSTEM_PROPERTY, + VISIBLE_TASKS_COUNTER_SYSTEM_PROPERTY_DEFAULT_VALUE) } override fun onTransitionReady( @@ -441,5 +442,6 @@ class DesktopModeLoggerTransitionObserver( @VisibleForTesting const val VISIBLE_TASKS_COUNTER_SYSTEM_PROPERTY = "debug.tracing." + VISIBLE_TASKS_COUNTER_NAME + const val VISIBLE_TASKS_COUNTER_SYSTEM_PROPERTY_DEFAULT_VALUE = "0" } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeUtils.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeUtils.kt index bd6172226cf2..6d4792250be2 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeUtils.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeUtils.kt @@ -123,6 +123,29 @@ fun calculateInitialBounds( } /** + * Calculates the maximized bounds of a task given in the given [DisplayLayout], taking + * resizability into consideration. + */ +fun calculateMaximizeBounds( + displayLayout: DisplayLayout, + taskInfo: RunningTaskInfo, +): Rect { + val stableBounds = Rect() + displayLayout.getStableBounds(stableBounds) + if (taskInfo.isResizeable) { + // if resizable then expand to entire stable bounds (full display minus insets) + return Rect(stableBounds) + } else { + // if non-resizable then calculate max bounds according to aspect ratio + val activityAspectRatio = calculateAspectRatio(taskInfo) + val newSize = maximizeSizeGivenAspectRatio(taskInfo, + Size(stableBounds.width(), stableBounds.height()), activityAspectRatio) + return centerInArea( + newSize, stableBounds, stableBounds.left, stableBounds.top) + } +} + +/** * Calculates the largest size that can fit in a given area while maintaining a specific aspect * ratio. */ diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopRepository.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopRepository.kt index 7b2a5d343861..5ac4ef5cf049 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopRepository.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopRepository.kt @@ -80,6 +80,14 @@ class DesktopRepository ( freeformTasksInZOrder = ArrayList(freeformTasksInZOrder), fullImmersiveTaskId = fullImmersiveTaskId ) + fun clear() { + activeTasks.clear() + visibleTasks.clear() + minimizedTasks.clear() + closingTasks.clear() + freeformTasksInZOrder.clear() + fullImmersiveTaskId = null + } } /* Current wallpaper activity token to remove wallpaper activity when last task is removed. */ @@ -320,6 +328,10 @@ class DesktopRepository ( return desktopTaskDataSequence().any { taskId == it.fullImmersiveTaskId } } + /** Returns the task that is currently in immersive mode in this display, or null. */ + fun getTaskInFullImmersiveState(displayId: Int): Int? = + desktopTaskDataByDisplayId.getOrCreate(displayId).fullImmersiveTaskId + private fun notifyVisibleTaskListeners(displayId: Int, visibleTasksCount: Int) { visibleTasksListeners.forEach { (listener, executor) -> executor.execute { listener.onTasksVisibilityChanged(displayId, visibleTasksCount) } @@ -414,6 +426,19 @@ class DesktopRepository ( } /** + * Removes the desktop for the given [displayId] and returns the active tasks on that desktop. + */ + fun removeDesktop(displayId: Int): ArraySet<Int> { + if (!desktopTaskDataByDisplayId.contains(displayId)) { + logW("Could not find desktop to remove: displayId=%d", displayId) + return ArraySet() + } + val activeTasks = ArraySet(desktopTaskDataByDisplayId[displayId].activeTasks) + desktopTaskDataByDisplayId[displayId].clear() + return activeTasks + } + + /** * Updates active desktop gesture exclusion regions. * * If [desktopExclusionRegions] is accepted by [desktopGestureExclusionListener], updates it in diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt index 5b9d2fed2701..92535f37094a 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt @@ -16,8 +16,8 @@ package com.android.wm.shell.desktopmode -import android.app.ActivityManager.RunningTaskInfo import android.app.ActivityManager +import android.app.ActivityManager.RunningTaskInfo import android.app.ActivityOptions import android.app.KeyguardManager import android.app.PendingIntent @@ -44,9 +44,14 @@ import android.view.Display.DEFAULT_DISPLAY import android.view.DragEvent import android.view.SurfaceControl import android.view.WindowManager.TRANSIT_CHANGE +import android.view.WindowManager.TRANSIT_CLOSE import android.view.WindowManager.TRANSIT_NONE import android.view.WindowManager.TRANSIT_OPEN import android.view.WindowManager.TRANSIT_TO_FRONT +import android.window.DesktopModeFlags +import android.window.DesktopModeFlags.DISABLE_NON_RESIZABLE_APP_SNAP_RESIZE +import android.window.DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY +import android.window.DesktopModeFlags.ENABLE_WINDOWING_DYNAMIC_INITIAL_BOUNDS import android.window.RemoteTransition import android.window.TransitionInfo import android.window.TransitionRequestInfo @@ -86,10 +91,7 @@ import com.android.wm.shell.shared.ShellSharedConstants import com.android.wm.shell.shared.TransitionUtil import com.android.wm.shell.shared.annotations.ExternalThread import com.android.wm.shell.shared.annotations.ShellMainThread -import android.window.flags.DesktopModeFlags -import android.window.flags.DesktopModeFlags.DISABLE_NON_RESIZABLE_APP_SNAP_RESIZE -import android.window.flags.DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY -import android.window.flags.DesktopModeFlags.ENABLE_WINDOWING_DYNAMIC_INITIAL_BOUNDS +import com.android.wm.shell.freeform.FreeformTaskTransitionStarter import com.android.wm.shell.shared.desktopmode.DesktopModeStatus import com.android.wm.shell.shared.desktopmode.DesktopModeStatus.DESKTOP_DENSITY_OVERRIDE import com.android.wm.shell.shared.desktopmode.DesktopModeStatus.useDesktopOverrideDensity @@ -189,6 +191,7 @@ class DesktopTasksController( private var recentsAnimationRunning = false private lateinit var splitScreenController: SplitScreenController + lateinit var freeformTaskTransitionStarter: FreeformTaskTransitionStarter // Launch cookie used to identify a drag and drop transition to fullscreen after it has begun. // Used to prevent handleRequest from moving the new fullscreen task to freeform. private var dragAndDropFullscreenCookie: Binder? = null @@ -261,17 +264,12 @@ class DesktopTasksController( val wct = WindowContainerTransaction() bringDesktopAppsToFront(displayId, wct) - if (Transitions.ENABLE_SHELL_TRANSITIONS) { - val transitionType = transitionType(remoteTransition) - val handler = - remoteTransition?.let { - OneShotRemoteHandler(transitions.mainExecutor, remoteTransition) - } - transitions.startTransition(transitionType, wct, handler).also { t -> - handler?.setTransition(t) - } - } else { - shellTaskOrganizer.applyTransaction(wct) + val transitionType = transitionType(remoteTransition) + val handler = remoteTransition?.let { + OneShotRemoteHandler(transitions.mainExecutor, remoteTransition) + } + transitions.startTransition(transitionType, wct, handler).also { t -> + handler?.setTransition(t) } } @@ -358,6 +356,8 @@ class DesktopTasksController( // TODO(342378842): Instead of using default display, support multiple displays val taskToMinimize = bringDesktopAppsToFrontBeforeShowingNewTask( DEFAULT_DISPLAY, wct, taskId) + val runOnTransit = immersiveTransitionHandler + .exitImmersiveIfApplicable(wct, DEFAULT_DISPLAY) wct.startTask( taskId, ActivityOptions.makeBasic().apply { @@ -367,6 +367,7 @@ class DesktopTasksController( // TODO(343149901): Add DPI changes for task launch val transition = enterDesktopTaskTransitionHandler.moveToDesktop(wct, transitionSource) addPendingMinimizeTransition(transition, taskToMinimize) + runOnTransit?.invoke(transition) return true } @@ -383,17 +384,15 @@ class DesktopTasksController( } logV("moveRunningTaskToDesktop taskId=%d", task.taskId) exitSplitIfApplicable(wct, task) + val runOnTransit = immersiveTransitionHandler.exitImmersiveIfApplicable(wct, task.displayId) // Bring other apps to front first val taskToMinimize = bringDesktopAppsToFrontBeforeShowingNewTask(task.displayId, wct, task.taskId) addMoveToDesktopChanges(wct, task) - if (Transitions.ENABLE_SHELL_TRANSITIONS) { - val transition = enterDesktopTaskTransitionHandler.moveToDesktop(wct, transitionSource) - addPendingMinimizeTransition(transition, taskToMinimize) - } else { - shellTaskOrganizer.applyTransaction(wct) - } + val transition = enterDesktopTaskTransitionHandler.moveToDesktop(wct, transitionSource) + addPendingMinimizeTransition(transition, taskToMinimize) + runOnTransit?.invoke(transition) } /** @@ -430,8 +429,13 @@ class DesktopTasksController( val taskToMinimize = bringDesktopAppsToFrontBeforeShowingNewTask(taskInfo.displayId, wct, taskInfo.taskId) addMoveToDesktopChanges(wct, taskInfo) + val runOnTransit = immersiveTransitionHandler.exitImmersiveIfApplicable( + wct, taskInfo.displayId) val transition = dragToDesktopTransitionHandler.finishDragToDesktopTransition(wct) - transition?.let { addPendingMinimizeTransition(it, taskToMinimize) } + transition?.let { + addPendingMinimizeTransition(it, taskToMinimize) + runOnTransit?.invoke(transition) + } } /** @@ -461,20 +465,36 @@ class DesktopTasksController( removeWallpaperActivity(wct) } taskRepository.addClosingTask(displayId, taskId) + taskbarDesktopTaskListener?.onTaskbarCornerRoundingUpdate( + doesAnyTaskRequireTaskbarRounding( + displayId, + taskId + ) + ) } - /** - * Perform clean up of the desktop wallpaper activity if the minimized window task is the last - * active task. - * - * @param wct transaction to modify if the last active task is minimized - * @param taskId task id of the window that's being minimized - */ - fun onDesktopWindowMinimize(wct: WindowContainerTransaction, taskId: Int) { + fun minimizeTask(taskInfo: RunningTaskInfo) { + val taskId = taskInfo.taskId + val displayId = taskInfo.displayId + val wct = WindowContainerTransaction() if (taskRepository.isOnlyVisibleNonClosingTask(taskId)) { + // Perform clean up of the desktop wallpaper activity if the minimized window task is + // the last active task. removeWallpaperActivity(wct) } - // Do not call taskRepository.minimizeTask because it will be called by DekstopTasksLimiter. + // Notify immersive handler as it might need to exit immersive state. + val runOnTransit = immersiveTransitionHandler.exitImmersiveIfApplicable(wct, taskInfo) + + wct.reorder(taskInfo.token, false) + val transition = freeformTaskTransitionStarter.startMinimizedModeTransition(wct) + desktopTasksLimiter.ifPresent { + it.addPendingMinimizeChange( + transition = transition, + displayId = displayId, + taskId = taskId + ) + } + runOnTransit?.invoke(transition) } /** Move a task with given `taskId` to fullscreen */ @@ -499,11 +519,9 @@ class DesktopTasksController( // Rather than set windowing mode to multi-window at task level, set it to // undefined and inherit from split stage. wct.setWindowingMode(task.token, WINDOWING_MODE_UNDEFINED) - if (Transitions.ENABLE_SHELL_TRANSITIONS) { - transitions.startTransition(TRANSIT_CHANGE, wct, null /* handler */) - } else { - shellTaskOrganizer.applyTransaction(wct) - } + + transitions.startTransition(TRANSIT_CHANGE, wct, null /* handler */) + } private fun exitSplitIfApplicable(wct: WindowContainerTransaction, taskInfo: RunningTaskInfo) { @@ -537,17 +555,12 @@ class DesktopTasksController( val wct = WindowContainerTransaction() addMoveToFullscreenChanges(wct, task) - if (Transitions.ENABLE_SHELL_TRANSITIONS) { - exitDesktopTaskTransitionHandler.startTransition( + exitDesktopTaskTransitionHandler.startTransition( transitionSource, wct, position, mOnAnimationFinishedCallback ) - } else { - shellTaskOrganizer.applyTransaction(wct) - releaseVisualIndicator() - } } /** Move a task to the front */ @@ -567,6 +580,8 @@ class DesktopTasksController( // TODO: b/342378842 - Instead of using default display, support multiple displays val taskToMinimize: RunningTaskInfo? = addAndGetMinimizeChangesIfNeeded(DEFAULT_DISPLAY, wct, taskId) + val runOnTransit = immersiveTransitionHandler + .exitImmersiveIfApplicable(wct, DEFAULT_DISPLAY) wct.startTask( taskId, ActivityOptions.makeBasic().apply { @@ -575,21 +590,22 @@ class DesktopTasksController( ) val transition = transitions.startTransition(TRANSIT_OPEN, wct, null /* handler */) addPendingMinimizeTransition(transition, taskToMinimize) + runOnTransit?.invoke(transition) } /** Move a task to the front */ fun moveTaskToFront(taskInfo: RunningTaskInfo) { logV("moveTaskToFront taskId=%s", taskInfo.taskId) val wct = WindowContainerTransaction() - wct.reorder(taskInfo.token, true) + wct.reorder(taskInfo.token, true /* onTop */, true /* includingParents */) + val runOnTransit = immersiveTransitionHandler.exitImmersiveIfApplicable( + wct, taskInfo.displayId) val taskToMinimize = addAndGetMinimizeChangesIfNeeded(taskInfo.displayId, wct, taskInfo.taskId) - if (Transitions.ENABLE_SHELL_TRANSITIONS) { - val transition = transitions.startTransition(TRANSIT_TO_FRONT, wct, null /* handler */) - addPendingMinimizeTransition(transition, taskToMinimize) - } else { - shellTaskOrganizer.applyTransaction(wct) - } + + val transition = transitions.startTransition(TRANSIT_TO_FRONT, wct, null /* handler */) + addPendingMinimizeTransition(transition, taskToMinimize) + runOnTransit?.invoke(transition) } /** @@ -645,11 +661,9 @@ class DesktopTasksController( val wct = WindowContainerTransaction() wct.reparent(task.token, displayAreaInfo.token, true /* onTop */) - if (Transitions.ENABLE_SHELL_TRANSITIONS) { - transitions.startTransition(TRANSIT_CHANGE, wct, null /* handler */) - } else { - shellTaskOrganizer.applyTransaction(wct) - } + + transitions.startTransition(TRANSIT_CHANGE, wct, null /* handler */) + } /** Moves a task in/out of full immersive state within the desktop. */ @@ -663,22 +677,12 @@ class DesktopTasksController( private fun moveDesktopTaskToFullImmersive(taskInfo: RunningTaskInfo) { check(taskInfo.isFreeform) { "Task must already be in freeform" } - val wct = WindowContainerTransaction().apply { - setBounds(taskInfo.token, Rect()) - } - immersiveTransitionHandler.enterImmersive(taskInfo, wct) + immersiveTransitionHandler.moveTaskToImmersive(taskInfo) } private fun exitDesktopTaskFromFullImmersive(taskInfo: RunningTaskInfo) { check(taskInfo.isFreeform) { "Task must already be in freeform" } - val displayLayout = displayController.getDisplayLayout(taskInfo.displayId) ?: return - val stableBounds = Rect().apply { displayLayout.getStableBounds(this) } - val destinationBounds = getMaximizeBounds(taskInfo, stableBounds) - - val wct = WindowContainerTransaction().apply { - setBounds(taskInfo.token, destinationBounds) - } - immersiveTransitionHandler.exitImmersive(taskInfo, wct) + immersiveTransitionHandler.moveTaskToNonImmersive(taskInfo) } /** @@ -717,7 +721,7 @@ class DesktopTasksController( // and toggle to the stable bounds. taskRepository.saveBoundsBeforeMaximize(taskInfo.taskId, currentTaskBounds) - destinationBounds.set(getMaximizeBounds(taskInfo, stableBounds)) + destinationBounds.set(calculateMaximizeBounds(displayLayout, taskInfo)) } @@ -733,11 +737,9 @@ class DesktopTasksController( taskbarDesktopTaskListener?.onTaskbarCornerRoundingUpdate(doesAnyTaskRequireTaskbarRounding) val wct = WindowContainerTransaction().setBounds(taskInfo.token, destinationBounds) - if (Transitions.ENABLE_SHELL_TRANSITIONS) { - toggleResizeDesktopTaskTransitionHandler.startTransition(wct) - } else { - shellTaskOrganizer.applyTransaction(wct) - } + + toggleResizeDesktopTaskTransitionHandler.startTransition(wct) + } private fun getMaximizeBounds(taskInfo: RunningTaskInfo, stableBounds: Rect): Rect { @@ -847,11 +849,9 @@ class DesktopTasksController( taskbarDesktopTaskListener?.onTaskbarCornerRoundingUpdate(true) val wct = WindowContainerTransaction().setBounds(taskInfo.token, destinationBounds) - if (Transitions.ENABLE_SHELL_TRANSITIONS) { - toggleResizeDesktopTaskTransitionHandler.startTransition(wct, currentDragBounds) - } else { - shellTaskOrganizer.applyTransaction(wct) - } + + toggleResizeDesktopTaskTransitionHandler.startTransition(wct, currentDragBounds) + } @VisibleForTesting @@ -1309,8 +1309,10 @@ class DesktopTasksController( if (useDesktopOverrideDensity()) { wct.setDensityDpi(task.token, DESKTOP_DENSITY_OVERRIDE) } - // Desktop Mode is showing and we're launching a new Task - we might need to minimize - // a Task. + // Desktop Mode is showing and we're launching a new Task: + // 1) Exit immersive if needed. + immersiveTransitionHandler.exitImmersiveIfApplicable(transition, wct, task.displayId) + // 2) minimize a Task if needed. val taskToMinimize = addAndGetMinimizeChangesIfNeeded(task.displayId, wct, task.taskId) if (taskToMinimize != null) { addPendingMinimizeTransition(transition, taskToMinimize) @@ -1340,6 +1342,9 @@ class DesktopTasksController( val taskToMinimize = addAndGetMinimizeChangesIfNeeded(task.displayId, wct, task.taskId) addPendingMinimizeTransition(transition, taskToMinimize) + immersiveTransitionHandler.exitImmersiveIfApplicable( + transition, wct, task.displayId + ) } } return null @@ -1498,6 +1503,22 @@ class DesktopTasksController( } } + fun removeDesktop(displayId: Int) { + if (!DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION.isTrue()) return + + val tasksToRemove = taskRepository.removeDesktop(displayId) + val wct = WindowContainerTransaction() + tasksToRemove.forEach { + val task = shellTaskOrganizer.getRunningTaskInfo(it) + if (task != null) { + wct.removeTask(task.token) + } else { + recentTasksController?.removeBackgroundTask(it) + } + } + if (!wct.isEmpty) transitions.startTransition(TRANSIT_CLOSE, wct, null) + } + /** Enter split by using the focused desktop task in given `displayId`. */ fun enterSplit(displayId: Int, leftOrTop: Boolean) { getFocusedFreeformTask(displayId)?.let { requestSplit(it, leftOrTop) } @@ -2025,6 +2046,12 @@ class DesktopTasksController( c.moveTaskToDesktop(taskId, transitionSource = transitionSource) } } + + override fun removeDesktop(displayId: Int) { + executeRemoteCallWithTaskPermission(controller, "removeDesktop") { c -> + c.removeDesktop(displayId) + } + } } private fun logV(msg: String, vararg arguments: Any?) { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksLimiter.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksLimiter.kt index 37bec21730a6..d6b721253abf 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksLimiter.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksLimiter.kt @@ -24,7 +24,7 @@ import android.view.SurfaceControl import android.view.WindowManager.TRANSIT_TO_BACK import android.window.TransitionInfo import android.window.WindowContainerTransaction -import android.window.flags.DesktopModeFlags +import android.window.DesktopModeFlags import androidx.annotation.VisibleForTesting import com.android.internal.jank.Cuj.CUJ_DESKTOP_MODE_MINIMIZE_WINDOW import com.android.internal.jank.InteractionJankMonitor @@ -39,7 +39,7 @@ import com.android.wm.shell.transition.Transitions.TransitionObserver * Limits the number of tasks shown in Desktop Mode. * * This class should only be used if - * [android.window.flags.DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_TASK_LIMIT] + * [android.window.DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_TASK_LIMIT] * is enabled and [maxTasksLimit] is strictly greater than 0. */ class DesktopTasksLimiter ( diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksTransitionObserver.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksTransitionObserver.kt index da9c8a2bdf21..0b1bb8f36fa8 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksTransitionObserver.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksTransitionObserver.kt @@ -25,8 +25,8 @@ import android.view.WindowManager.TRANSIT_CLOSE import android.view.WindowManager.TRANSIT_TO_BACK import android.window.TransitionInfo import android.window.WindowContainerTransaction -import android.window.flags.DesktopModeFlags -import android.window.flags.DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY +import android.window.DesktopModeFlags +import android.window.DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY import com.android.internal.protolog.ProtoLog import com.android.wm.shell.ShellTaskOrganizer import com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE @@ -51,9 +51,7 @@ class DesktopTasksTransitionObserver( private var transitionToCloseWallpaper: IBinder? = null init { - if ( - Transitions.ENABLE_SHELL_TRANSITIONS && DesktopModeStatus.canEnterDesktopMode(context) - ) { + if (DesktopModeStatus.canEnterDesktopMode(context)) { shellInit.addInitCallback(::onInit, this) } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/IDesktopMode.aidl b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/IDesktopMode.aidl index b036e40e6e16..86351e364cdd 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/IDesktopMode.aidl +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/IDesktopMode.aidl @@ -49,4 +49,7 @@ interface IDesktopMode { /** Move a task with given `taskId` to desktop */ void moveToDesktop(int taskId, in DesktopModeTransitionSource transitionSource); + + /** Remove desktop on the given display */ + oneway void removeDesktop(int displayId); }
\ No newline at end of file diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskListener.java b/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskListener.java index fbd3c10368f7..a16446fffa15 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskListener.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskListener.java @@ -24,7 +24,7 @@ import android.app.ActivityManager.RunningTaskInfo; import android.content.Context; import android.util.SparseArray; import android.view.SurfaceControl; -import android.window.flags.DesktopModeFlags; +import android.window.DesktopModeFlags; import com.android.internal.protolog.ProtoLog; import com.android.wm.shell.ShellTaskOrganizer; @@ -99,11 +99,6 @@ public class FreeformTaskListener implements ShellTaskOrganizer.TaskListener, state.mTaskInfo = taskInfo; state.mLeash = leash; mTasks.put(taskInfo.taskId, state); - if (!Transitions.ENABLE_SHELL_TRANSITIONS) { - SurfaceControl.Transaction t = new SurfaceControl.Transaction(); - mWindowDecorationViewModel.onTaskOpening(taskInfo, leash, t, t); - t.apply(); - } if (DesktopModeStatus.canEnterDesktopMode(mContext)) { mDesktopRepository.ifPresent(repository -> { @@ -131,6 +126,7 @@ public class FreeformTaskListener implements ShellTaskOrganizer.TaskListener, || repository.isClosingTask(taskInfo.taskId)) { // A task that's vanishing should be removed: // - If it's closed by the X button which means it's marked as a closing task. + repository.removeClosingTask(taskInfo.taskId); repository.removeFreeformTask(taskInfo.displayId, taskInfo.taskId); } else { repository.updateTaskVisibility(taskInfo.displayId, taskInfo.taskId, false); @@ -139,9 +135,6 @@ public class FreeformTaskListener implements ShellTaskOrganizer.TaskListener, }); } mWindowDecorationViewModel.onTaskVanished(taskInfo); - if (!Transitions.ENABLE_SHELL_TRANSITIONS) { - mWindowDecorationViewModel.destroyWindowDecoration(taskInfo); - } updateLaunchAdjacentController(); } @@ -158,8 +151,6 @@ public class FreeformTaskListener implements ShellTaskOrganizer.TaskListener, mDesktopRepository.ifPresent(repository -> { if (taskInfo.isVisible) { repository.addActiveTask(taskInfo.displayId, taskInfo.taskId); - } else if (repository.isClosingTask(taskInfo.taskId)) { - repository.removeClosingTask(taskInfo.taskId); } repository.updateTaskVisibility(taskInfo.displayId, taskInfo.taskId, taskInfo.isVisible); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionObserver.java b/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionObserver.java index d6b920e5b010..771573d48e45 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionObserver.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionObserver.java @@ -30,6 +30,7 @@ import androidx.annotation.VisibleForTesting; import com.android.window.flags.Flags; import com.android.wm.shell.desktopmode.DesktopFullImmersiveTransitionHandler; import com.android.wm.shell.sysui.ShellInit; +import com.android.wm.shell.transition.FocusTransitionObserver; import com.android.wm.shell.transition.Transitions; import com.android.wm.shell.windowdecor.WindowDecorViewModel; @@ -50,6 +51,7 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs private final Optional<DesktopFullImmersiveTransitionHandler> mImmersiveTransitionHandler; private final WindowDecorViewModel mWindowDecorViewModel; private final Optional<TaskChangeListener> mTaskChangeListener; + private final FocusTransitionObserver mFocusTransitionObserver; private final Map<IBinder, List<ActivityManager.RunningTaskInfo>> mTransitionToTaskInfo = new HashMap<>(); @@ -60,12 +62,14 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs Transitions transitions, Optional<DesktopFullImmersiveTransitionHandler> immersiveTransitionHandler, WindowDecorViewModel windowDecorViewModel, - Optional<TaskChangeListener> taskChangeListener) { + Optional<TaskChangeListener> taskChangeListener, + FocusTransitionObserver focusTransitionObserver) { mTransitions = transitions; mImmersiveTransitionHandler = immersiveTransitionHandler; mWindowDecorViewModel = windowDecorViewModel; mTaskChangeListener = taskChangeListener; - if (Transitions.ENABLE_SHELL_TRANSITIONS && FreeformComponents.isFreeformEnabled(context)) { + mFocusTransitionObserver = focusTransitionObserver; + if (FreeformComponents.isFreeformEnabled(context)) { shellInit.addInitCallback(this::onInit, this); } } @@ -85,8 +89,11 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs // TODO(b/367268953): Remove when DesktopTaskListener is introduced and the repository // is updated from there **before** the |mWindowDecorViewModel| methods are invoked. // Otherwise window decoration relayout won't run with the immersive state up to date. - mImmersiveTransitionHandler.ifPresent(h -> h.onTransitionReady(transition)); + mImmersiveTransitionHandler.ifPresent(h -> h.onTransitionReady(transition, info)); } + // Update focus state first to ensure the correct state can be queried from listeners. + // TODO(371503964): Remove this once the unified task repository is ready. + mFocusTransitionObserver.updateFocusState(info); final ArrayList<ActivityManager.RunningTaskInfo> taskInfoList = new ArrayList<>(); final ArrayList<WindowContainerToken> taskParents = new ArrayList<>(); @@ -119,6 +126,9 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs case WindowManager.TRANSIT_TO_FRONT: onToFrontTransitionReady(change, startT, finishT); break; + case WindowManager.TRANSIT_TO_BACK: + onToBackTransitionReady(change, startT, finishT); + break; case WindowManager.TRANSIT_CLOSE: { taskInfoList.add(change.getTaskInfo()); onCloseTransitionReady(change, startT, finishT); @@ -173,6 +183,16 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs change.getTaskInfo(), change.getLeash(), startT, finishT); } + private void onToBackTransitionReady( + TransitionInfo.Change change, + SurfaceControl.Transaction startT, + SurfaceControl.Transaction finishT) { + mTaskChangeListener.ifPresent( + listener -> listener.onTaskMovingToBack(change.getTaskInfo())); + mWindowDecorViewModel.onTaskChanging( + change.getTaskInfo(), change.getLeash(), startT, finishT); + } + @Override public void onTransitionStarting(@NonNull IBinder transition) {} diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/keyguard/KeyguardTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/keyguard/KeyguardTransitionHandler.java index abec3b9c0c3b..f8d2011d0934 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/keyguard/KeyguardTransitionHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/keyguard/KeyguardTransitionHandler.java @@ -28,6 +28,8 @@ import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_LOCKED; import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_OCCLUDING; import static android.view.WindowManager.TRANSIT_FLAG_KEYGUARD_UNOCCLUDING; import static android.view.WindowManager.TRANSIT_SLEEP; +import static android.view.WindowManager.TRANSIT_TO_BACK; +import static android.view.WindowManager.TRANSIT_TO_FRONT; import static com.android.wm.shell.shared.TransitionUtil.isOpeningType; @@ -44,6 +46,7 @@ import android.view.SurfaceControl; import android.view.WindowManager; import android.window.IRemoteTransition; import android.window.IRemoteTransitionFinishedCallback; +import android.window.KeyguardState; import android.window.TransitionInfo; import android.window.TransitionRequestInfo; import android.window.WindowContainerToken; @@ -388,5 +391,18 @@ public class KeyguardTransitionHandler mMainExecutor.execute(() -> mIsLaunchingActivityOverLockscreen = isLaunchingActivityOverLockscreen); } + + @Override + public void startKeyguardTransition(boolean keyguardShowing, boolean aodShowing) { + final WindowContainerTransaction wct = new WindowContainerTransaction(); + final KeyguardState keyguardState = + new KeyguardState.Builder(android.view.Display.DEFAULT_DISPLAY) + .setKeyguardShowing(keyguardShowing).setAodShowing(aodShowing).build(); + wct.addKeyguardState(keyguardState); + mMainExecutor.execute(() -> { + mTransitions.startTransition(keyguardShowing ? TRANSIT_TO_FRONT : TRANSIT_TO_BACK, + wct, KeyguardTransitionHandler.this); + }); + } } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/keyguard/KeyguardTransitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/keyguard/KeyguardTransitions.java index b7245b91f36c..1d349e6c96e0 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/keyguard/KeyguardTransitions.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/keyguard/KeyguardTransitions.java @@ -44,4 +44,11 @@ public interface KeyguardTransitions { * Notify whether keyguard has created a remote animation runner for next app launch. */ default void setLaunchingActivityOverLockscreen(boolean isLaunchingActivityOverLockscreen) {} + + /** + * Notifies Shell to start a keyguard transition directly. + * @param keyguardShowing whether keyguard is showing or not. + * @param aodShowing whether aod is showing or not. + */ + default void startKeyguardTransition(boolean keyguardShowing, boolean aodShowing) {} } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/animation/PipEnterAnimator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/animation/PipEnterAnimator.java new file mode 100644 index 000000000000..f40a87c39aef --- /dev/null +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/animation/PipEnterAnimator.java @@ -0,0 +1,159 @@ +/* + * Copyright (C) 2024 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.wm.shell.pip2.animation; + +import android.animation.Animator; +import android.animation.RectEvaluator; +import android.animation.ValueAnimator; +import android.content.Context; +import android.graphics.PointF; +import android.graphics.Rect; +import android.view.Surface; +import android.view.SurfaceControl; +import android.window.TransitionInfo; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.android.wm.shell.R; +import com.android.wm.shell.common.pip.PipUtils; +import com.android.wm.shell.pip2.PipSurfaceTransactionHelper; +import com.android.wm.shell.shared.animation.Interpolators; + +/** + * Animator that handles bounds animations for entering PIP. + */ +public class PipEnterAnimator extends ValueAnimator + implements ValueAnimator.AnimatorUpdateListener, ValueAnimator.AnimatorListener { + @NonNull private final SurfaceControl mLeash; + private final SurfaceControl.Transaction mStartTransaction; + private final SurfaceControl.Transaction mFinishTransaction; + + // Bounds updated by the evaluator as animator is running. + private final Rect mAnimatedRect = new Rect(); + + private final RectEvaluator mRectEvaluator; + private final Rect mEndBounds = new Rect(); + @Nullable private final Rect mSourceRectHint; + private final @Surface.Rotation int mRotation; + @Nullable private Runnable mAnimationStartCallback; + @Nullable private Runnable mAnimationEndCallback; + + private final PipSurfaceTransactionHelper.SurfaceControlTransactionFactory + mSurfaceControlTransactionFactory; + + // Internal state representing initial transform - cached to avoid recalculation. + private final PointF mInitScale = new PointF(); + private final PointF mInitPos = new PointF(); + private final Rect mInitCrop = new Rect(); + + public PipEnterAnimator(Context context, + @NonNull SurfaceControl leash, + SurfaceControl.Transaction startTransaction, + SurfaceControl.Transaction finishTransaction, + @NonNull Rect endBounds, + @Nullable Rect sourceRectHint, + @Surface.Rotation int rotation) { + mLeash = leash; + mStartTransaction = startTransaction; + mFinishTransaction = finishTransaction; + mRectEvaluator = new RectEvaluator(mAnimatedRect); + mEndBounds.set(endBounds); + mSourceRectHint = sourceRectHint != null ? new Rect(sourceRectHint) : null; + mRotation = rotation; + mSurfaceControlTransactionFactory = + new PipSurfaceTransactionHelper.VsyncSurfaceControlTransactionFactory(); + + final int enterAnimationDuration = context.getResources() + .getInteger(R.integer.config_pipEnterAnimationDuration); + setDuration(enterAnimationDuration); + setFloatValues(0f, 1f); + setInterpolator(Interpolators.FAST_OUT_SLOW_IN); + addListener(this); + addUpdateListener(this); + } + + public void setAnimationStartCallback(@NonNull Runnable runnable) { + mAnimationStartCallback = runnable; + } + + public void setAnimationEndCallback(@NonNull Runnable runnable) { + mAnimationEndCallback = runnable; + } + + @Override + public void onAnimationStart(@NonNull Animator animation) { + if (mAnimationStartCallback != null) { + mAnimationStartCallback.run(); + } + if (mStartTransaction != null) { + onEnterAnimationUpdate(mInitScale, mInitPos, mInitCrop, + 0f /* fraction */, mStartTransaction); + mStartTransaction.apply(); + } + } + + @Override + public void onAnimationEnd(@NonNull Animator animation) { + if (mAnimationEndCallback != null) { + mAnimationEndCallback.run(); + } + } + + @Override + public void onAnimationUpdate(@NonNull ValueAnimator animation) { + final SurfaceControl.Transaction tx = mSurfaceControlTransactionFactory.getTransaction(); + final float fraction = getAnimatedFraction(); + onEnterAnimationUpdate(mInitScale, mInitPos, mInitCrop, fraction, tx); + tx.apply(); + } + + private void onEnterAnimationUpdate(PointF initScale, PointF initPos, Rect initCrop, + float fraction, SurfaceControl.Transaction tx) { + float scaleX = 1 + (initScale.x - 1) * (1 - fraction); + float scaleY = 1 + (initScale.y - 1) * (1 - fraction); + tx.setScale(mLeash, scaleX, scaleY); + + float posX = initPos.x + (mEndBounds.left - initPos.x) * fraction; + float posY = initPos.y + (mEndBounds.top - initPos.y) * fraction; + tx.setPosition(mLeash, posX, posY); + + Rect endCrop = new Rect(mEndBounds); + endCrop.offsetTo(0, 0); + mRectEvaluator.evaluate(fraction, initCrop, endCrop); + tx.setCrop(mLeash, mAnimatedRect); + } + + // no-ops + + @Override + public void onAnimationCancel(@NonNull Animator animation) {} + + @Override + public void onAnimationRepeat(@NonNull Animator animation) {} + + /** + * Caches the initial transform relevant values for the bounds enter animation. + * + * Since enter PiP makes use of a config-at-end transition, initial transform needs to be + * calculated differently from generic transitions. + * @param pipChange PiP change received as a transition target. + */ + public void setEnterStartState(@NonNull TransitionInfo.Change pipChange) { + PipUtils.calcStartTransform(pipChange, mInitScale, mInitPos, mInitCrop); + } +} diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/animation/PipEnterExitAnimator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/animation/PipExpandAnimator.java index 8ebdc96c21a3..8fa5aa933929 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/animation/PipEnterExitAnimator.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/animation/PipExpandAnimator.java @@ -19,7 +19,6 @@ package com.android.wm.shell.pip2.animation; import android.animation.Animator; import android.animation.RectEvaluator; import android.animation.ValueAnimator; -import android.annotation.IntDef; import android.content.Context; import android.graphics.Rect; import android.view.Surface; @@ -30,35 +29,22 @@ import androidx.annotation.Nullable; import com.android.wm.shell.R; import com.android.wm.shell.pip2.PipSurfaceTransactionHelper; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; +import com.android.wm.shell.shared.animation.Interpolators; /** - * Animator that handles bounds animations for entering / exiting PIP. + * Animator that handles bounds animations for exit-via-expanding PIP. */ -public class PipEnterExitAnimator extends ValueAnimator +public class PipExpandAnimator extends ValueAnimator implements ValueAnimator.AnimatorUpdateListener, ValueAnimator.AnimatorListener { - @IntDef(prefix = {"BOUNDS_"}, value = { - BOUNDS_ENTER, - BOUNDS_EXIT - }) - - @Retention(RetentionPolicy.SOURCE) - public @interface BOUNDS {} - - public static final int BOUNDS_ENTER = 0; - public static final int BOUNDS_EXIT = 1; - - @NonNull private final SurfaceControl mLeash; + @NonNull + private final SurfaceControl mLeash; private final SurfaceControl.Transaction mStartTransaction; private final SurfaceControl.Transaction mFinishTransaction; - private final int mEnterExitAnimationDuration; - private final @BOUNDS int mDirection; private final @Surface.Rotation int mRotation; // optional callbacks for tracking animation start and end - @Nullable private Runnable mAnimationStartCallback; + @Nullable + private Runnable mAnimationStartCallback; @Nullable private Runnable mAnimationEndCallback; private final Rect mBaseBounds = new Rect(); @@ -78,7 +64,7 @@ public class PipEnterExitAnimator extends ValueAnimator private final RectEvaluator mInsetEvaluator; private final PipSurfaceTransactionHelper mPipSurfaceTransactionHelper; - public PipEnterExitAnimator(Context context, + public PipExpandAnimator(Context context, @NonNull SurfaceControl leash, SurfaceControl.Transaction startTransaction, SurfaceControl.Transaction finishTransaction, @@ -86,7 +72,6 @@ public class PipEnterExitAnimator extends ValueAnimator @NonNull Rect startBounds, @NonNull Rect endBounds, @Nullable Rect sourceRectHint, - @BOUNDS int direction, @Surface.Rotation int rotation) { mLeash = leash; mStartTransaction = startTransaction; @@ -98,7 +83,6 @@ public class PipEnterExitAnimator extends ValueAnimator mRectEvaluator = new RectEvaluator(mAnimatedRect); mInsetEvaluator = new RectEvaluator(new Rect()); mPipSurfaceTransactionHelper = new PipSurfaceTransactionHelper(context); - mDirection = direction; mRotation = rotation; mSourceRectHint = sourceRectHint != null ? new Rect(sourceRectHint) : null; @@ -113,12 +97,14 @@ public class PipEnterExitAnimator extends ValueAnimator mSurfaceControlTransactionFactory = new PipSurfaceTransactionHelper.VsyncSurfaceControlTransactionFactory(); - mEnterExitAnimationDuration = context.getResources() + + final int enterAnimationDuration = context.getResources() .getInteger(R.integer.config_pipEnterAnimationDuration); + setDuration(enterAnimationDuration); setObjectValues(startBounds, endBounds); - setDuration(mEnterExitAnimationDuration); setEvaluator(mRectEvaluator); + setInterpolator(Interpolators.FAST_OUT_SLOW_IN); addListener(this); addUpdateListener(this); } @@ -147,9 +133,10 @@ public class PipEnterExitAnimator extends ValueAnimator // finishTransaction might override some state (eg. corner radii) so we want to // manually set the state to the end of the animation mPipSurfaceTransactionHelper.scaleAndCrop(mFinishTransaction, mLeash, mSourceRectHint, - mBaseBounds, mAnimatedRect, getInsets(1f), isInPipDirection(), 1f) - .round(mFinishTransaction, mLeash, isInPipDirection()) - .shadow(mFinishTransaction, mLeash, isInPipDirection()); + mBaseBounds, mAnimatedRect, getInsets(1f), + false /* isInPipDirection */, 1f) + .round(mFinishTransaction, mLeash, false /* applyCornerRadius */) + .shadow(mFinishTransaction, mLeash, false /* applyCornerRadius */); } if (mAnimationEndCallback != null) { mAnimationEndCallback.run(); @@ -160,32 +147,22 @@ public class PipEnterExitAnimator extends ValueAnimator public void onAnimationUpdate(@NonNull ValueAnimator animation) { final SurfaceControl.Transaction tx = mSurfaceControlTransactionFactory.getTransaction(); final float fraction = getAnimatedFraction(); - Rect insets = getInsets(fraction); // TODO (b/350801661): implement fixed rotation + Rect insets = getInsets(fraction); mPipSurfaceTransactionHelper.scaleAndCrop(tx, mLeash, mSourceRectHint, - mBaseBounds, mAnimatedRect, insets, isInPipDirection(), fraction) - .round(tx, mLeash, isInPipDirection()) - .shadow(tx, mLeash, isInPipDirection()); + mBaseBounds, mAnimatedRect, insets, false /* isInPipDirection */, fraction) + .round(tx, mLeash, false /* applyCornerRadius */) + .shadow(tx, mLeash, false /* applyCornerRadius */); tx.apply(); } - private Rect getInsets(float fraction) { - Rect startInsets = isInPipDirection() ? mZeroInsets : mSourceRectHintInsets; - Rect endInsets = isInPipDirection() ? mSourceRectHintInsets : mZeroInsets; - + final Rect startInsets = mSourceRectHintInsets; + final Rect endInsets = mZeroInsets; return mInsetEvaluator.evaluate(fraction, startInsets, endInsets); } - private boolean isInPipDirection() { - return mDirection == BOUNDS_ENTER; - } - - private boolean isOutPipDirection() { - return mDirection == BOUNDS_EXIT; - } - // no-ops @Override diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PhonePipMenuController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PhonePipMenuController.java index 9cfe1620a2ff..8c1e5e6a3e84 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PhonePipMenuController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PhonePipMenuController.java @@ -18,10 +18,12 @@ package com.android.wm.shell.pip2.phone; import static android.view.WindowManager.SHELL_ROOT_LAYER_PIP; +import android.annotation.NonNull; import android.annotation.Nullable; import android.app.RemoteAction; import android.content.Context; import android.graphics.Rect; +import android.os.Bundle; import android.os.Debug; import android.os.Handler; import android.os.RemoteException; @@ -52,7 +54,8 @@ import java.util.List; * The current media session provides actions whenever there are no valid actions provided by the * current PiP activity. Otherwise, those actions always take precedence. */ -public class PhonePipMenuController implements PipMenuController { +public class PhonePipMenuController implements PipMenuController, + PipTransitionState.PipTransitionStateChangedListener { private static final String TAG = "PhonePipMenuController"; private static final boolean DEBUG = false; @@ -113,6 +116,11 @@ public class PhonePipMenuController implements PipMenuController { private PipMenuView mPipMenuView; + private final PipTaskListener mPipTaskListener; + + @NonNull + private final PipTransitionState mPipTransitionState; + private SurfaceControl mLeash; private ActionListener mMediaActionListener = new ActionListener() { @@ -125,15 +133,27 @@ public class PhonePipMenuController implements PipMenuController { public PhonePipMenuController(Context context, PipBoundsState pipBoundsState, PipMediaController mediaController, SystemWindows systemWindows, - PipUiEventLogger pipUiEventLogger, - ShellExecutor mainExecutor, Handler mainHandler) { + PipUiEventLogger pipUiEventLogger, PipTaskListener pipTaskListener, + @NonNull PipTransitionState pipTransitionState, ShellExecutor mainExecutor, + Handler mainHandler) { mContext = context; mPipBoundsState = pipBoundsState; mMediaController = mediaController; mSystemWindows = systemWindows; + mPipTaskListener = pipTaskListener; + mPipTransitionState = pipTransitionState; mMainExecutor = mainExecutor; mMainHandler = mainHandler; mPipUiEventLogger = pipUiEventLogger; + + mPipTransitionState.addPipTransitionStateChangedListener(this); + + mPipTaskListener.addParamsChangedListener(new PipTaskListener.PipParamsChangedCallback() { + @Override + public void onActionsChanged(List<RemoteAction> actions, RemoteAction closeAction) { + setAppActions(actions, closeAction); + } + }); } public boolean isMenuVisible() { @@ -438,8 +458,7 @@ public class PhonePipMenuController implements PipMenuController { * Sets the menu actions to the actions provided by the current PiP menu. */ @Override - public void setAppActions(List<RemoteAction> appActions, - RemoteAction closeAction) { + public void setAppActions(List<RemoteAction> appActions, RemoteAction closeAction) { mAppActions = appActions; mCloseAction = closeAction; updateMenuActions(); @@ -468,8 +487,8 @@ public class PhonePipMenuController implements PipMenuController { */ private void updateMenuActions() { if (mPipMenuView != null) { - mPipMenuView.setActions(mPipBoundsState.getBounds(), - resolveMenuActions(), mCloseAction); + mPipMenuView.setActions(mPipBoundsState.getBounds(), resolveMenuActions(), + mCloseAction); } } @@ -567,6 +586,29 @@ public class PhonePipMenuController implements PipMenuController { } } + @Override + public void onPipTransitionStateChanged(@PipTransitionState.TransitionState int oldState, + @PipTransitionState.TransitionState int newState, Bundle extra) { + switch (newState) { + case PipTransitionState.ENTERED_PIP: + attach(mPipTransitionState.mPinnedTaskLeash); + break; + case PipTransitionState.EXITED_PIP: + detach(); + break; + case PipTransitionState.CHANGED_PIP_BOUNDS: + updateMenuLayout(mPipBoundsState.getBounds()); + hideMenu(); + break; + case PipTransitionState.CHANGING_PIP_BOUNDS: + hideMenu(); + break; + case PipTransitionState.SCHEDULED_BOUNDS_CHANGE: + hideMenu(); + break; + } + } + void dump(PrintWriter pw, String prefix) { final String innerPrefix = prefix + " "; pw.println(prefix + TAG); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipMenuView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipMenuView.java index a29104c4aafd..0910919b3064 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipMenuView.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipMenuView.java @@ -447,7 +447,7 @@ public class PipMenuView extends FrameLayout { final LayoutInflater inflater = LayoutInflater.from(mContext); while (mActionsGroup.getChildCount() < mActions.size()) { final PipMenuActionView actionView = (PipMenuActionView) inflater.inflate( - R.layout.pip_menu_action, mActionsGroup, false); + R.layout.pip2_menu_action, mActionsGroup, false); mActionsGroup.addView(actionView); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipMotionHelper.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipMotionHelper.java index 0324fdba0fbf..268c3a20a41a 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipMotionHelper.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipMotionHelper.java @@ -336,7 +336,7 @@ public class PipMotionHelper implements PipAppOpsListener.Callback, } cancelPhysicsAnimation(); mMenuController.hideMenu(ANIM_TYPE_NONE, false /* resize */); - // mPipTaskOrganizer.exitPip(skipAnimation ? 0 : LEAVE_PIP_DURATION, enterSplit); + mPipScheduler.scheduleExitPipViaExpand(); } /** diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipScheduler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipScheduler.java index f4defdc7963c..d4f190ebd2a2 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipScheduler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipScheduler.java @@ -52,7 +52,6 @@ public class PipScheduler { private final Context mContext; private final PipBoundsState mPipBoundsState; - private final PhonePipMenuController mPipMenuController; private final ShellExecutor mMainExecutor; private final PipTransitionState mPipTransitionState; private PipSchedulerReceiver mSchedulerReceiver; @@ -97,12 +96,10 @@ public class PipScheduler { public PipScheduler(Context context, PipBoundsState pipBoundsState, - PhonePipMenuController pipMenuController, ShellExecutor mainExecutor, PipTransitionState pipTransitionState) { mContext = context; mPipBoundsState = pipBoundsState; - mPipMenuController = pipMenuController; mMainExecutor = mainExecutor; mPipTransitionState = pipTransitionState; @@ -263,7 +260,6 @@ public class PipScheduler { return; } mPipBoundsState.setBounds(newBounds); - mPipMenuController.updateMenuLayout(newBounds); maybeUpdateMovementBounds(); } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTaskListener.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTaskListener.java index 262c14d2bfe3..c58de2c3512a 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTaskListener.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTaskListener.java @@ -20,6 +20,7 @@ import static com.android.wm.shell.pip2.phone.PipTransition.ANIMATING_BOUNDS_CHA import android.app.ActivityManager; import android.app.PictureInPictureParams; +import android.app.RemoteAction; import android.content.Context; import android.graphics.Rect; import android.os.Bundle; @@ -37,6 +38,9 @@ import com.android.wm.shell.common.pip.PipUtils; import com.android.wm.shell.pip2.animation.PipResizeAnimator; import com.android.wm.shell.shared.annotations.ShellMainThread; +import java.util.ArrayList; +import java.util.List; + /** * A Task Listener implementation used only for CUJs and trigger paths that cannot be initiated via * Transitions framework directly. @@ -57,6 +61,7 @@ public class PipTaskListener implements ShellTaskOrganizer.TaskListener, new PictureInPictureParams.Builder().build(); private boolean mWaitingForAspectRatioChange = false; + private final List<PipParamsChangedCallback> mPipParamsChangedListeners = new ArrayList<>(); public PipTaskListener(Context context, ShellTaskOrganizer shellTaskOrganizer, @@ -85,10 +90,25 @@ public class PipTaskListener implements ShellTaskOrganizer.TaskListener, if (mPictureInPictureParams.equals(params)) { return; } + if (PipUtils.remoteActionsChanged(params.getActions(), mPictureInPictureParams.getActions()) + || !PipUtils.remoteActionsMatch(params.getCloseAction(), + mPictureInPictureParams.getCloseAction())) { + for (PipParamsChangedCallback listener : mPipParamsChangedListeners) { + listener.onActionsChanged(params.getActions(), params.getCloseAction()); + } + } mPictureInPictureParams.copyOnlySet(params != null ? params : new PictureInPictureParams.Builder().build()); } + /** Add a PipParamsChangedCallback listener. */ + public void addParamsChangedListener(PipParamsChangedCallback listener) { + if (mPipParamsChangedListeners.contains(listener)) { + return; + } + mPipParamsChangedListeners.add(listener); + } + @NonNull public PictureInPictureParams getPictureInPictureParams() { return mPictureInPictureParams; @@ -164,4 +184,12 @@ public class PipTaskListener implements ShellTaskOrganizer.TaskListener, break; } } + + public interface PipParamsChangedCallback { + /** + * Called if either the actions or the close action changed. + */ + default void onActionsChanged(List<RemoteAction> actions, RemoteAction closeAction) { + } + } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTransition.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTransition.java index 62a60fab6603..b57f51aff176 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTransition.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip2/phone/PipTransition.java @@ -56,7 +56,8 @@ import com.android.wm.shell.common.pip.PipMenuController; import com.android.wm.shell.common.pip.PipUtils; import com.android.wm.shell.pip.PipTransitionController; import com.android.wm.shell.pip2.animation.PipAlphaAnimator; -import com.android.wm.shell.pip2.animation.PipEnterExitAnimator; +import com.android.wm.shell.pip2.animation.PipEnterAnimator; +import com.android.wm.shell.pip2.animation.PipExpandAnimator; import com.android.wm.shell.shared.TransitionUtil; import com.android.wm.shell.shared.pip.PipContentOverlay; import com.android.wm.shell.sysui.ShellInit; @@ -218,6 +219,7 @@ public class PipTransition extends PipTransitionController implements @NonNull SurfaceControl.Transaction startTransaction, @NonNull SurfaceControl.Transaction finishTransaction, @NonNull Transitions.TransitionFinishCallback finishCallback) { + mFinishCallback = finishCallback; if (transition == mEnterTransition || info.getType() == TRANSIT_PIP) { mEnterTransition = null; // If we are in swipe PiP to Home transition we are ENTERING_PIP as a jumpcut transition @@ -258,6 +260,7 @@ public class PipTransition extends PipTransitionController implements if (isRemovePipTransition(info)) { return removePipImmediately(info, startTransaction, finishTransaction, finishCallback); } + mFinishCallback = null; return false; } @@ -297,7 +300,6 @@ public class PipTransition extends PipTransitionController implements mBoundsChangeDuration = BOUNDS_CHANGE_JUMPCUT_DURATION; } - mFinishCallback = finishCallback; mPipTransitionState.setState(PipTransitionState.CHANGING_PIP_BOUNDS, extra); return true; } @@ -349,7 +351,6 @@ public class PipTransition extends PipTransitionController implements startTransaction.setMatrix(pipLeash, transformTensor, matrixTmp); } startTransaction.apply(); - finishCallback.onTransitionFinished(null /* finishWct */); finishInner(); return true; } @@ -386,14 +387,6 @@ public class PipTransition extends PipTransitionController implements return false; } - WindowContainerToken pipTaskToken = pipChange.getContainer(); - if (pipTaskToken == null) { - return false; - } - - WindowContainerTransaction finishWct = new WindowContainerTransaction(); - SurfaceControl.Transaction tx = new SurfaceControl.Transaction(); - Rect startBounds = pipChange.getStartAbsBounds(); Rect endBounds = pipChange.getEndAbsBounds(); SurfaceControl pipLeash = mPipTransitionState.mPinnedTaskLeash; @@ -405,29 +398,22 @@ public class PipTransition extends PipTransitionController implements sourceRectHint = pipChange.getTaskInfo().pictureInPictureParams.getSourceRectHint(); } - // For opening type transitions, if there is a non-pip change of mode TO_FRONT/OPEN, + // For opening type transitions, if there is a change of mode TO_FRONT/OPEN, // make sure that change has alpha of 1f, since it's init state might be set to alpha=0f // by the Transitions framework to simplify Task opening transitions. if (TransitionUtil.isOpeningType(info.getType())) { for (TransitionInfo.Change change : info.getChanges()) { - if (change.getLeash() == null || change == pipChange) continue; + if (change.getLeash() == null) continue; if (change.getMode() == TRANSIT_OPEN || change.getMode() == TRANSIT_TO_FRONT) { startTransaction.setAlpha(change.getLeash(), 1f); } } } - PipEnterExitAnimator animator = new PipEnterExitAnimator(mContext, pipLeash, - startTransaction, finishTransaction, startBounds, startBounds, endBounds, - sourceRectHint, PipEnterExitAnimator.BOUNDS_ENTER, Surface.ROTATION_0); - - tx.addTransactionCommittedListener(mPipScheduler.getMainExecutor(), - this::finishInner); - finishWct.setBoundsChangeTransaction(pipTaskToken, tx); - - animator.setAnimationEndCallback(() -> - finishCallback.onTransitionFinished(finishWct)); - + PipEnterAnimator animator = new PipEnterAnimator(mContext, pipLeash, + startTransaction, finishTransaction, endBounds, sourceRectHint, Surface.ROTATION_0); + animator.setAnimationStartCallback(() -> animator.setEnterStartState(pipChange)); + animator.setAnimationEndCallback(this::finishInner); animator.start(); return true; } @@ -452,11 +438,8 @@ public class PipTransition extends PipTransitionController implements PipAlphaAnimator animator = new PipAlphaAnimator(mContext, pipLeash, startTransaction, PipAlphaAnimator.FADE_IN); - animator.setAnimationEndCallback(() -> { - finishCallback.onTransitionFinished(null); - // This should update the pip transition state accordingly after we stop playing. - finishInner(); - }); + // This should update the pip transition state accordingly after we stop playing. + animator.setAnimationEndCallback(this::finishInner); animator.start(); return true; @@ -510,9 +493,9 @@ public class PipTransition extends PipTransitionController implements sourceRectHint = mPipTaskListener.getPictureInPictureParams().getSourceRectHint(); } - PipEnterExitAnimator animator = new PipEnterExitAnimator(mContext, pipLeash, + PipExpandAnimator animator = new PipExpandAnimator(mContext, pipLeash, startTransaction, finishTransaction, endBounds, startBounds, endBounds, - sourceRectHint, PipEnterExitAnimator.BOUNDS_EXIT, Surface.ROTATION_0); + sourceRectHint, Surface.ROTATION_0); animator.setAnimationEndCallback(() -> { mPipTransitionState.setState(PipTransitionState.EXITED_PIP); @@ -631,6 +614,7 @@ public class PipTransition extends PipTransitionController implements // private void finishInner() { + finishTransition(null /* tx */); if (mPipTransitionState.getSwipePipToHomeOverlay() != null) { startOverlayFadeoutAnimation(); } else if (mPipTransitionState.getState() == PipTransitionState.ENTERING_PIP) { @@ -652,6 +636,7 @@ public class PipTransition extends PipTransitionController implements } if (mFinishCallback != null) { mFinishCallback.onTransitionFinished(wct); + mFinishCallback = null; } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentTasksController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentTasksController.java index 95cb3df50977..6086801491e2 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentTasksController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/RecentTasksController.java @@ -38,8 +38,8 @@ import android.os.RemoteException; import android.util.Slog; import android.util.SparseArray; import android.util.SparseIntArray; +import android.window.DesktopModeFlags; import android.window.WindowContainerToken; -import android.window.flags.DesktopModeFlags; import androidx.annotation.BinderThread; import androidx.annotation.NonNull; @@ -540,6 +540,14 @@ public class RecentTasksController implements TaskStackListenerCallback, return null; } + /** + * Remove the background task that match the given taskId. This will remove the task regardless + * of whether it's active or recent. + */ + public boolean removeBackgroundTask(int taskId) { + return mActivityTaskManager.removeTask(taskId); + } + public void dump(@NonNull PrintWriter pw, String prefix) { final String innerPrefix = prefix + " "; pw.println(prefix + TAG); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/TaskStackTransitionObserver.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/TaskStackTransitionObserver.kt index e5bfccf0682e..1af99f974a28 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/recents/TaskStackTransitionObserver.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/recents/TaskStackTransitionObserver.kt @@ -17,14 +17,12 @@ package com.android.wm.shell.recents import android.app.ActivityManager.RunningTaskInfo -import android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM import android.os.IBinder import android.util.ArrayMap import android.view.SurfaceControl -import android.view.WindowManager import android.window.TransitionInfo +import android.window.DesktopModeFlags import com.android.wm.shell.shared.TransitionUtil -import android.window.flags.DesktopModeFlags import com.android.wm.shell.sysui.ShellInit import com.android.wm.shell.transition.Transitions import dagger.Lazy @@ -40,16 +38,11 @@ class TaskStackTransitionObserver( private val transitions: Lazy<Transitions>, shellInit: ShellInit ) : Transitions.TransitionObserver { - - private val transitionToTransitionChanges: MutableMap<IBinder, TransitionChanges> = - mutableMapOf() private val taskStackTransitionObserverListeners = ArrayMap<TaskStackTransitionObserverListener, Executor>() init { - if (Transitions.ENABLE_SHELL_TRANSITIONS) { - shellInit.addInitCallback(::onInit, this) - } + shellInit.addInitCallback(::onInit, this) } fun onInit() { @@ -63,9 +56,6 @@ class TaskStackTransitionObserver( finishTransaction: SurfaceControl.Transaction ) { if (DesktopModeFlags.ENABLE_TASK_STACK_OBSERVER_IN_SHELL.isTrue) { - val taskInfoList = mutableListOf<RunningTaskInfo>() - val transitionTypeList = mutableListOf<Int>() - for (change in info.changes) { if (change.flags and TransitionInfo.FLAG_IS_WALLPAPER != 0) { continue @@ -76,59 +66,21 @@ class TaskStackTransitionObserver( continue } - // Filter out changes that we care about - if (change.mode == WindowManager.TRANSIT_OPEN) { - change.taskInfo?.let { taskInfoList.add(it) } - transitionTypeList.add(change.mode) + // Find the first task that is opening, this should be the one at the front after + // the transition + if (TransitionUtil.isOpeningType(change.mode)) { + notifyTaskStackTransitionObserverListeners(taskInfo) + break } } - // Only add the transition to map if it has a change we care about - if (taskInfoList.isNotEmpty()) { - transitionToTransitionChanges.put( - transition, - TransitionChanges(taskInfoList, transitionTypeList) - ) - } } } override fun onTransitionStarting(transition: IBinder) {} - override fun onTransitionMerged(merged: IBinder, playing: IBinder) { - val mergedTransitionChanges = - transitionToTransitionChanges.get(merged) - ?: - // We are adding changes of the merged transition to changes of the playing - // transition so if there is no changes nothing to do. - return + override fun onTransitionMerged(merged: IBinder, playing: IBinder) {} - transitionToTransitionChanges.remove(merged) - val playingTransitionChanges = transitionToTransitionChanges.get(playing) - if (playingTransitionChanges != null) { - playingTransitionChanges.merge(mergedTransitionChanges) - } else { - transitionToTransitionChanges.put(playing, mergedTransitionChanges) - } - } - - override fun onTransitionFinished(transition: IBinder, aborted: Boolean) { - val taskInfoList = - transitionToTransitionChanges.getOrDefault(transition, TransitionChanges()).taskInfoList - val typeList = - transitionToTransitionChanges - .getOrDefault(transition, TransitionChanges()) - .transitionTypeList - transitionToTransitionChanges.remove(transition) - - for ((index, taskInfo) in taskInfoList.withIndex()) { - if ( - TransitionUtil.isOpeningType(typeList[index]) && - taskInfo.windowingMode == WINDOWING_MODE_FREEFORM - ) { - notifyTaskStackTransitionObserverListeners(taskInfo) - } - } - } + override fun onTransitionFinished(transition: IBinder, aborted: Boolean) {} fun addTaskStackTransitionObserverListener( taskStackTransitionObserverListener: TaskStackTransitionObserverListener, @@ -154,14 +106,4 @@ class TaskStackTransitionObserver( /** Called when a task is moved to front. */ fun onTaskMovedToFrontThroughTransition(taskInfo: RunningTaskInfo) {} } - - private data class TransitionChanges( - val taskInfoList: MutableList<RunningTaskInfo> = ArrayList(), - val transitionTypeList: MutableList<Int> = ArrayList(), - ) { - fun merge(transitionChanges: TransitionChanges) { - taskInfoList.addAll(transitionChanges.taskInfoList) - transitionTypeList.addAll(transitionChanges.transitionTypeList) - } - } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/FocusTransitionObserver.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/FocusTransitionObserver.java index 399e39a920fc..6d01e247b48d 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/FocusTransitionObserver.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/FocusTransitionObserver.java @@ -16,7 +16,8 @@ package com.android.wm.shell.transition; -import static android.view.Display.INVALID_DISPLAY; +import static android.view.Display.DEFAULT_DISPLAY; +import static android.view.WindowManager.TRANSIT_OPEN; import static android.window.TransitionInfo.FLAG_IS_DISPLAY; import static android.window.TransitionInfo.FLAG_MOVED_TO_TOP; @@ -24,10 +25,11 @@ import static com.android.window.flags.Flags.enableDisplayFocusInShellTransition import static com.android.wm.shell.transition.Transitions.TransitionObserver; import android.annotation.NonNull; -import android.os.IBinder; +import android.app.ActivityManager.RunningTaskInfo; import android.os.RemoteException; +import android.util.ArraySet; import android.util.Slog; -import android.view.SurfaceControl; +import android.util.SparseArray; import android.window.TransitionInfo; import com.android.wm.shell.shared.FocusTransitionListener; @@ -43,44 +45,64 @@ import java.util.concurrent.Executor; * It reports transitions to callers outside of the process via {@link IFocusTransitionListener}, * and callers within the process via {@link FocusTransitionListener}. */ -public class FocusTransitionObserver implements TransitionObserver { +public class FocusTransitionObserver { private static final String TAG = FocusTransitionObserver.class.getSimpleName(); private IFocusTransitionListener mRemoteListener; private final Map<FocusTransitionListener, Executor> mLocalListeners = new HashMap<>(); - private int mFocusedDisplayId = INVALID_DISPLAY; + private int mFocusedDisplayId = DEFAULT_DISPLAY; + private final SparseArray<RunningTaskInfo> mFocusedTaskOnDisplay = new SparseArray<>(); + + private final ArraySet<RunningTaskInfo> mTmpTasksToBeNotified = new ArraySet<>(); public FocusTransitionObserver() {} - @Override - public void onTransitionReady(@NonNull IBinder transition, - @NonNull TransitionInfo info, - @NonNull SurfaceControl.Transaction startTransaction, - @NonNull SurfaceControl.Transaction finishTransaction) { + /** + * Update display/window focus state from the given transition info and notifies changes if any. + */ + public void updateFocusState(@NonNull TransitionInfo info) { + if (!enableDisplayFocusInShellTransitions()) { + return; + } final List<TransitionInfo.Change> changes = info.getChanges(); for (int i = changes.size() - 1; i >= 0; i--) { final TransitionInfo.Change change = changes.get(i); + + final RunningTaskInfo task = change.getTaskInfo(); + if (task != null + && (change.hasFlags(FLAG_MOVED_TO_TOP) || change.getMode() == TRANSIT_OPEN)) { + final RunningTaskInfo lastFocusedTaskOnDisplay = + mFocusedTaskOnDisplay.get(task.displayId); + if (lastFocusedTaskOnDisplay != null) { + mTmpTasksToBeNotified.add(lastFocusedTaskOnDisplay); + } + mTmpTasksToBeNotified.add(task); + mFocusedTaskOnDisplay.put(task.displayId, task); + } + if (change.hasFlags(FLAG_IS_DISPLAY) && change.hasFlags(FLAG_MOVED_TO_TOP)) { if (mFocusedDisplayId != change.getEndDisplayId()) { + final RunningTaskInfo lastGloballyFocusedTask = + mFocusedTaskOnDisplay.get(mFocusedDisplayId); + if (lastGloballyFocusedTask != null) { + mTmpTasksToBeNotified.add(lastGloballyFocusedTask); + } mFocusedDisplayId = change.getEndDisplayId(); notifyFocusedDisplayChanged(); + final RunningTaskInfo currentGloballyFocusedTask = + mFocusedTaskOnDisplay.get(mFocusedDisplayId); + if (currentGloballyFocusedTask != null) { + mTmpTasksToBeNotified.add(currentGloballyFocusedTask); + } } - return; } } + mTmpTasksToBeNotified.forEach(this::notifyTaskFocusChanged); + mTmpTasksToBeNotified.clear(); } - @Override - public void onTransitionStarting(@NonNull IBinder transition) {} - - @Override - public void onTransitionMerged(@NonNull IBinder merged, @NonNull IBinder playing) {} - - @Override - public void onTransitionFinished(@NonNull IBinder transition, boolean aborted) {} - /** * Sets the focus transition listener that receives any transitions resulting in focus switch. * This is for calls from outside the Shell, within the host process. @@ -92,7 +114,10 @@ public class FocusTransitionObserver implements TransitionObserver { return; } mLocalListeners.put(listener, executor); - executor.execute(() -> listener.onFocusedDisplayChanged(mFocusedDisplayId)); + executor.execute(() -> { + listener.onFocusedDisplayChanged(mFocusedDisplayId); + mTmpTasksToBeNotified.forEach(this::notifyTaskFocusChanged); + }); } /** @@ -120,13 +145,20 @@ public class FocusTransitionObserver implements TransitionObserver { notifyFocusedDisplayChangedToRemote(); } - /** - * Notifies the listener that display focus has changed. - */ - public void notifyFocusedDisplayChanged() { + private void notifyTaskFocusChanged(RunningTaskInfo task) { + final boolean isFocusedOnDisplay = isFocusedOnDisplay(task); + final boolean isFocusedGlobally = hasGlobalFocus(task); + mLocalListeners.forEach((listener, executor) -> + executor.execute(() -> listener.onFocusedTaskChanged(task.taskId, + isFocusedOnDisplay, isFocusedGlobally))); + } + + private void notifyFocusedDisplayChanged() { notifyFocusedDisplayChangedToRemote(); mLocalListeners.forEach((listener, executor) -> - executor.execute(() -> listener.onFocusedDisplayChanged(mFocusedDisplayId))); + executor.execute(() -> { + listener.onFocusedDisplayChanged(mFocusedDisplayId); + })); } private void notifyFocusedDisplayChangedToRemote() { @@ -138,4 +170,23 @@ public class FocusTransitionObserver implements TransitionObserver { } } } + + private boolean isFocusedOnDisplay(@NonNull RunningTaskInfo task) { + if (!enableDisplayFocusInShellTransitions()) { + return task.isFocused; + } + final RunningTaskInfo focusedTaskOnDisplay = mFocusedTaskOnDisplay.get(task.displayId); + return focusedTaskOnDisplay != null && focusedTaskOnDisplay.taskId == task.taskId; + } + + /** + * Checks whether the given task has focused globally on the system. + * (Note {@link RunningTaskInfo#isFocused} represents per-display focus.) + */ + public boolean hasGlobalFocus(@NonNull RunningTaskInfo task) { + if (!enableDisplayFocusInShellTransitions()) { + return task.isFocused; + } + return task.displayId == mFocusedDisplayId && isFocusedOnDisplay(task); + } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java index d5e92e6a0e62..346f21b86e65 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java @@ -392,8 +392,6 @@ public class Transitions implements RemoteCallable<Transitions>, mShellCommandHandler.addCommandCallback("transitions", this, this); mShellCommandHandler.addDumpCallback(this::dump, this); - - registerObserver(mFocusTransitionObserver); } public boolean isRegistered() { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecorViewModel.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecorViewModel.java index f5b2340b87a7..be4fd7c5eeec 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecorViewModel.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecorViewModel.java @@ -58,9 +58,11 @@ import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.SyncTransactionQueue; import com.android.wm.shell.freeform.FreeformTaskTransitionStarter; +import com.android.wm.shell.shared.FocusTransitionListener; import com.android.wm.shell.shared.annotations.ShellBackgroundThread; import com.android.wm.shell.splitscreen.SplitScreenController; import com.android.wm.shell.sysui.ShellInit; +import com.android.wm.shell.transition.FocusTransitionObserver; import com.android.wm.shell.transition.Transitions; import com.android.wm.shell.windowdecor.extension.TaskInfoKt; @@ -68,7 +70,7 @@ import com.android.wm.shell.windowdecor.extension.TaskInfoKt; * View model for the window decoration with a caption and shadows. Works with * {@link CaptionWindowDecoration}. */ -public class CaptionWindowDecorViewModel implements WindowDecorViewModel { +public class CaptionWindowDecorViewModel implements WindowDecorViewModel, FocusTransitionListener { private static final String TAG = "CaptionWindowDecorViewModel"; private final ShellTaskOrganizer mTaskOrganizer; @@ -85,6 +87,7 @@ public class CaptionWindowDecorViewModel implements WindowDecorViewModel { private final Region mExclusionRegion = Region.obtain(); private final InputManager mInputManager; private TaskOperations mTaskOperations; + private FocusTransitionObserver mFocusTransitionObserver; /** * Whether to pilfer the next motion event to send cancellations to the windows below. @@ -121,7 +124,8 @@ public class CaptionWindowDecorViewModel implements WindowDecorViewModel { DisplayController displayController, RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer, SyncTransactionQueue syncQueue, - Transitions transitions) { + Transitions transitions, + FocusTransitionObserver focusTransitionObserver) { mContext = context; mMainExecutor = shellExecutor; mMainHandler = mainHandler; @@ -133,6 +137,7 @@ public class CaptionWindowDecorViewModel implements WindowDecorViewModel { mRootTaskDisplayAreaOrganizer = rootTaskDisplayAreaOrganizer; mSyncQueue = syncQueue; mTransitions = transitions; + mFocusTransitionObserver = focusTransitionObserver; if (!Transitions.ENABLE_SHELL_TRANSITIONS) { mTaskOperations = new TaskOperations(null, mContext, mSyncQueue); } @@ -148,6 +153,16 @@ public class CaptionWindowDecorViewModel implements WindowDecorViewModel { } catch (RemoteException e) { Log.e(TAG, "Failed to register window manager callbacks", e); } + mFocusTransitionObserver.setLocalFocusTransitionListener(this, mMainExecutor); + } + + @Override + public void onFocusedTaskChanged(int taskId, boolean isFocusedOnDisplay, + boolean isFocusedGlobally) { + final WindowDecoration decor = mWindowDecorByTaskId.get(taskId); + if (decor != null) { + decor.relayout(decor.mTaskInfo, isFocusedGlobally); + } } @Override @@ -180,7 +195,7 @@ public class CaptionWindowDecorViewModel implements WindowDecorViewModel { return; } - decoration.relayout(taskInfo); + decoration.relayout(taskInfo, decoration.mHasGlobalFocus); } @Override @@ -217,7 +232,8 @@ public class CaptionWindowDecorViewModel implements WindowDecorViewModel { createWindowDecoration(taskInfo, taskSurface, startT, finishT); } else { decoration.relayout(taskInfo, startT, finishT, false /* applyStartTransactionOnDraw */, - false /* setTaskCropAndPosition */); + false /* setTaskCropAndPosition */, + mFocusTransitionObserver.hasGlobalFocus(taskInfo)); } } @@ -230,7 +246,8 @@ public class CaptionWindowDecorViewModel implements WindowDecorViewModel { if (decoration == null) return; decoration.relayout(taskInfo, startT, finishT, false /* applyStartTransactionOnDraw */, - false /* setTaskCropAndPosition */); + false /* setTaskCropAndPosition */, + mFocusTransitionObserver.hasGlobalFocus(taskInfo)); } @Override @@ -308,7 +325,8 @@ public class CaptionWindowDecorViewModel implements WindowDecorViewModel { windowDecoration.setDragPositioningCallback(taskPositioner); windowDecoration.setTaskDragResizer(taskPositioner); windowDecoration.relayout(taskInfo, startT, finishT, - false /* applyStartTransactionOnDraw */, false /* setTaskCropAndPosition */); + false /* applyStartTransactionOnDraw */, false /* setTaskCropAndPosition */, + mFocusTransitionObserver.hasGlobalFocus(taskInfo)); } private class CaptionTouchEventListener implements @@ -359,9 +377,9 @@ public class CaptionWindowDecorViewModel implements WindowDecorViewModel { } if (e.getAction() == MotionEvent.ACTION_DOWN) { final RunningTaskInfo taskInfo = mTaskOrganizer.getRunningTaskInfo(mTaskId); - if (!taskInfo.isFocused) { + if (!mFocusTransitionObserver.hasGlobalFocus(taskInfo)) { final WindowContainerTransaction wct = new WindowContainerTransaction(); - wct.reorder(mTaskToken, true /* onTop */); + wct.reorder(mTaskToken, true /* onTop */, true /* includingParents */); mSyncQueue.queue(wct); } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecoration.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecoration.java index 839973fcbdd5..509cb85c96cd 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecoration.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecoration.java @@ -16,7 +16,7 @@ package com.android.wm.shell.windowdecor; -import static android.window.flags.DesktopModeFlags.ENABLE_WINDOWING_SCALED_RESIZING; +import static android.window.DesktopModeFlags.ENABLE_WINDOWING_SCALED_RESIZING; import static com.android.wm.shell.windowdecor.DragResizeWindowGeometry.getFineResizeCornerSize; import static com.android.wm.shell.windowdecor.DragResizeWindowGeometry.getLargeResizeCornerSize; @@ -174,7 +174,7 @@ public class CaptionWindowDecoration extends WindowDecoration<WindowDecorLinearL } @Override - void relayout(RunningTaskInfo taskInfo) { + void relayout(RunningTaskInfo taskInfo, boolean hasGlobalFocus) { final SurfaceControl.Transaction t = new SurfaceControl.Transaction(); // The crop and position of the task should only be set when a task is fluid resizing. In // all other cases, it is expected that the transition handler positions and crops the task @@ -185,7 +185,7 @@ public class CaptionWindowDecoration extends WindowDecoration<WindowDecorLinearL // synced with the buffer transaction (that draws the View). Both will be shown on screen // at the same, whereas applying them independently causes flickering. See b/270202228. relayout(taskInfo, t, t, true /* applyStartTransactionOnDraw */, - shouldSetTaskPositionAndCrop); + shouldSetTaskPositionAndCrop, hasGlobalFocus); } @VisibleForTesting @@ -196,12 +196,13 @@ public class CaptionWindowDecoration extends WindowDecoration<WindowDecorLinearL boolean setTaskCropAndPosition, boolean isStatusBarVisible, boolean isKeyguardVisibleAndOccluded, - InsetsState displayInsetsState) { + InsetsState displayInsetsState, + boolean hasGlobalFocus) { relayoutParams.reset(); relayoutParams.mRunningTaskInfo = taskInfo; relayoutParams.mLayoutResId = R.layout.caption_window_decor; relayoutParams.mCaptionHeightId = getCaptionHeightIdStatic(taskInfo.getWindowingMode()); - relayoutParams.mShadowRadiusId = taskInfo.isFocused + relayoutParams.mShadowRadiusId = hasGlobalFocus ? R.dimen.freeform_decor_shadow_focused_thickness : R.dimen.freeform_decor_shadow_unfocused_thickness; relayoutParams.mApplyStartTransactionOnDraw = applyStartTransactionOnDraw; @@ -233,7 +234,8 @@ public class CaptionWindowDecoration extends WindowDecoration<WindowDecorLinearL @SuppressLint("MissingPermission") void relayout(RunningTaskInfo taskInfo, SurfaceControl.Transaction startT, SurfaceControl.Transaction finishT, - boolean applyStartTransactionOnDraw, boolean setTaskCropAndPosition) { + boolean applyStartTransactionOnDraw, boolean setTaskCropAndPosition, + boolean hasGlobalFocus) { final boolean isFreeform = taskInfo.getWindowingMode() == WindowConfiguration.WINDOWING_MODE_FREEFORM; final boolean isDragResizeable = ENABLE_WINDOWING_SCALED_RESIZING.isTrue() @@ -245,7 +247,7 @@ public class CaptionWindowDecoration extends WindowDecoration<WindowDecorLinearL updateRelayoutParams(mRelayoutParams, taskInfo, applyStartTransactionOnDraw, setTaskCropAndPosition, mIsStatusBarVisible, mIsKeyguardVisibleAndOccluded, - mDisplayController.getInsetsState(taskInfo.displayId)); + mDisplayController.getInsetsState(taskInfo.displayId), hasGlobalFocus); relayout(mRelayoutParams, startT, finishT, wct, oldRootView, mResult); // After this line, mTaskInfo is up-to-date and should be used instead of taskInfo diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java index bcf48d9ec2eb..9e089b2460f6 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java @@ -56,7 +56,6 @@ import android.graphics.Rect; import android.graphics.Region; import android.hardware.input.InputManager; import android.os.Handler; -import android.os.IBinder; import android.os.Looper; import android.os.RemoteException; import android.os.UserHandle; @@ -77,10 +76,10 @@ import android.view.SurfaceControl.Transaction; import android.view.View; import android.view.ViewConfiguration; import android.widget.Toast; +import android.window.DesktopModeFlags; import android.window.TaskSnapshot; import android.window.WindowContainerToken; import android.window.WindowContainerTransaction; -import android.window.flags.DesktopModeFlags; import androidx.annotation.Nullable; import androidx.annotation.OptIn; @@ -103,8 +102,8 @@ import com.android.wm.shell.common.MultiInstanceHelper; import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.SyncTransactionQueue; import com.android.wm.shell.desktopmode.DesktopActivityOrientationChangeHandler; -import com.android.wm.shell.desktopmode.DesktopRepository; import com.android.wm.shell.desktopmode.DesktopModeVisualIndicator; +import com.android.wm.shell.desktopmode.DesktopRepository; import com.android.wm.shell.desktopmode.DesktopTasksController; import com.android.wm.shell.desktopmode.DesktopTasksController.SnapPosition; import com.android.wm.shell.desktopmode.DesktopTasksLimiter; @@ -112,6 +111,7 @@ import com.android.wm.shell.desktopmode.DesktopWallpaperActivity; import com.android.wm.shell.desktopmode.WindowDecorCaptionHandleRepository; import com.android.wm.shell.desktopmode.education.AppHandleEducationController; import com.android.wm.shell.freeform.FreeformTaskTransitionStarter; +import com.android.wm.shell.shared.FocusTransitionListener; import com.android.wm.shell.shared.annotations.ShellBackgroundThread; import com.android.wm.shell.shared.annotations.ShellMainThread; import com.android.wm.shell.shared.desktopmode.DesktopModeStatus; @@ -124,6 +124,7 @@ import com.android.wm.shell.sysui.KeyguardChangeListener; import com.android.wm.shell.sysui.ShellCommandHandler; import com.android.wm.shell.sysui.ShellController; import com.android.wm.shell.sysui.ShellInit; +import com.android.wm.shell.transition.FocusTransitionObserver; import com.android.wm.shell.transition.Transitions; import com.android.wm.shell.windowdecor.DesktopModeWindowDecoration.ExclusionRegionListener; import com.android.wm.shell.windowdecor.extension.InsetsStateKt; @@ -146,7 +147,8 @@ import java.util.function.Supplier; * {@link DesktopModeWindowDecoration}. */ -public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { +public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, + FocusTransitionListener { private static final String TAG = "DesktopModeWindowDecorViewModel"; private final DesktopModeWindowDecoration.Factory mDesktopModeWindowDecorFactory; @@ -216,6 +218,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { } }; private final TaskPositionerFactory mTaskPositionerFactory; + private final FocusTransitionObserver mFocusTransitionObserver; public DesktopModeWindowDecorViewModel( Context context, @@ -242,7 +245,8 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { Optional<DesktopTasksLimiter> desktopTasksLimiter, AppHandleEducationController appHandleEducationController, WindowDecorCaptionHandleRepository windowDecorCaptionHandleRepository, - Optional<DesktopActivityOrientationChangeHandler> activityOrientationChangeHandler) { + Optional<DesktopActivityOrientationChangeHandler> activityOrientationChangeHandler, + FocusTransitionObserver focusTransitionObserver) { this( context, shellExecutor, @@ -274,7 +278,8 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { appHandleEducationController, windowDecorCaptionHandleRepository, activityOrientationChangeHandler, - new TaskPositionerFactory()); + new TaskPositionerFactory(), + focusTransitionObserver); } @VisibleForTesting @@ -309,7 +314,8 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { AppHandleEducationController appHandleEducationController, WindowDecorCaptionHandleRepository windowDecorCaptionHandleRepository, Optional<DesktopActivityOrientationChangeHandler> activityOrientationChangeHandler, - TaskPositionerFactory taskPositionerFactory) { + TaskPositionerFactory taskPositionerFactory, + FocusTransitionObserver focusTransitionObserver) { mContext = context; mMainExecutor = shellExecutor; mMainHandler = mainHandler; @@ -369,6 +375,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { } }; mTaskPositionerFactory = taskPositionerFactory; + mFocusTransitionObserver = focusTransitionObserver; shellInit.addInitCallback(this::onInit, this); } @@ -402,11 +409,22 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { return Unit.INSTANCE; }); } + mFocusTransitionObserver.setLocalFocusTransitionListener(this, mMainExecutor); + } + + @Override + public void onFocusedTaskChanged(int taskId, boolean isFocusedOnDisplay, + boolean isFocusedGlobally) { + final WindowDecoration decor = mWindowDecorByTaskId.get(taskId); + if (decor != null) { + decor.relayout(decor.mTaskInfo, isFocusedGlobally); + } } @Override public void setFreeformTaskTransitionStarter(FreeformTaskTransitionStarter transitionStarter) { mTaskOperations = new TaskOperations(transitionStarter, mContext, mSyncQueue); + mDesktopTasksController.setFreeformTaskTransitionStarter(transitionStarter); } @Override @@ -447,7 +465,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { removeTaskFromEventReceiver(oldTaskInfo.displayId); incrementEventReceiverTasks(taskInfo.displayId); } - decoration.relayout(taskInfo); + decoration.relayout(taskInfo, decoration.mHasGlobalFocus); mActivityOrientationChangeHandler.ifPresent(handler -> handler.handleActivityOrientationChange(oldTaskInfo, taskInfo)); } @@ -486,7 +504,8 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { createWindowDecoration(taskInfo, taskSurface, startT, finishT); } else { decoration.relayout(taskInfo, startT, finishT, false /* applyStartTransactionOnDraw */, - false /* shouldSetTaskPositionAndCrop */); + false /* shouldSetTaskPositionAndCrop */, + mFocusTransitionObserver.hasGlobalFocus(taskInfo)); } } @@ -499,7 +518,8 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { if (decoration == null) return; decoration.relayout(taskInfo, startT, finishT, false /* applyStartTransactionOnDraw */, - false /* shouldSetTaskPositionAndCrop */); + false /* shouldSetTaskPositionAndCrop */, + mFocusTransitionObserver.hasGlobalFocus(taskInfo)); } @Override @@ -774,11 +794,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { onMaximizeOrRestore(decoration.mTaskInfo.taskId, "caption_bar_button"); } } else if (id == R.id.minimize_window) { - final WindowContainerTransaction wct = new WindowContainerTransaction(); - mDesktopTasksController.onDesktopWindowMinimize(wct, mTaskId); - final IBinder transition = mTaskOperations.minimizeTask(mTaskToken, wct); - mDesktopTasksLimiter.ifPresent(limiter -> - limiter.addPendingMinimizeChange(transition, mDisplayId, mTaskId)); + mDesktopTasksController.minimizeTask(decoration.mTaskInfo); } } @@ -895,7 +911,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { } private void moveTaskToFront(RunningTaskInfo taskInfo) { - if (!taskInfo.isFocused) { + if (!mFocusTransitionObserver.hasGlobalFocus(taskInfo)) { mDesktopTasksController.moveTaskToFront(taskInfo); } } @@ -1516,7 +1532,8 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { windowDecoration.setExclusionRegionListener(mExclusionRegionListener); windowDecoration.setDragPositioningCallback(taskPositioner); windowDecoration.relayout(taskInfo, startT, finishT, - false /* applyStartTransactionOnDraw */, false /* shouldSetTaskPositionAndCrop */); + false /* applyStartTransactionOnDraw */, false /* shouldSetTaskPositionAndCrop */, + mFocusTransitionObserver.hasGlobalFocus(taskInfo)); if (!Flags.enableHandleInputFix()) { incrementEventReceiverTasks(taskInfo.displayId); } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java index 25d37fce7270..2c621b1f1a52 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java @@ -24,8 +24,8 @@ import static android.view.InsetsSource.FLAG_FORCE_CONSUMING_OPAQUE_CAPTION_BAR; import static android.view.MotionEvent.ACTION_CANCEL; import static android.view.MotionEvent.ACTION_DOWN; import static android.view.MotionEvent.ACTION_UP; -import static android.window.flags.DesktopModeFlags.ENABLE_CAPTION_COMPAT_INSET_FORCE_CONSUMPTION; -import static android.window.flags.DesktopModeFlags.ENABLE_CAPTION_COMPAT_INSET_FORCE_CONSUMPTION_ALWAYS; +import static android.window.DesktopModeFlags.ENABLE_CAPTION_COMPAT_INSET_FORCE_CONSUMPTION; +import static android.window.DesktopModeFlags.ENABLE_CAPTION_COMPAT_INSET_FORCE_CONSUMPTION_ALWAYS; import static com.android.launcher3.icons.BaseIconFactory.MODE_DEFAULT; import static com.android.wm.shell.shared.desktopmode.DesktopModeStatus.canEnterDesktopMode; @@ -72,9 +72,9 @@ import android.view.ViewConfiguration; import android.view.WindowInsets; import android.view.WindowManager; import android.widget.ImageButton; +import android.window.DesktopModeFlags; import android.window.TaskSnapshot; import android.window.WindowContainerTransaction; -import android.window.flags.DesktopModeFlags; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.policy.ScreenDecorationsUtils; @@ -352,7 +352,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin } @Override - void relayout(ActivityManager.RunningTaskInfo taskInfo) { + void relayout(ActivityManager.RunningTaskInfo taskInfo, boolean hasGlobalFocus) { final SurfaceControl.Transaction t = mSurfaceControlTransactionSupplier.get(); // The crop and position of the task should only be set when a task is fluid resizing. In // all other cases, it is expected that the transition handler positions and crops the task @@ -365,7 +365,8 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin // the View). Both will be shown on screen at the same, whereas applying them independently // causes flickering. See b/270202228. final boolean applyTransactionOnDraw = taskInfo.isFreeform(); - relayout(taskInfo, t, t, applyTransactionOnDraw, shouldSetTaskPositionAndCrop); + relayout(taskInfo, t, t, applyTransactionOnDraw, shouldSetTaskPositionAndCrop, + hasGlobalFocus); if (!applyTransactionOnDraw) { t.apply(); } @@ -373,18 +374,19 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin void relayout(ActivityManager.RunningTaskInfo taskInfo, SurfaceControl.Transaction startT, SurfaceControl.Transaction finishT, - boolean applyStartTransactionOnDraw, boolean shouldSetTaskPositionAndCrop) { + boolean applyStartTransactionOnDraw, boolean shouldSetTaskPositionAndCrop, + boolean hasGlobalFocus) { Trace.beginSection("DesktopModeWindowDecoration#relayout"); if (taskInfo.isFreeform()) { // The Task is in Freeform mode -> show its header in sync since it's an integral part // of the window itself - a delayed header might cause bad UX. relayoutInSync(taskInfo, startT, finishT, applyStartTransactionOnDraw, - shouldSetTaskPositionAndCrop); + shouldSetTaskPositionAndCrop, hasGlobalFocus); } else { // The Task is outside Freeform mode -> allow the handle view to be delayed since the // handle is just a small addition to the window. relayoutWithDelayedViewHost(taskInfo, startT, finishT, applyStartTransactionOnDraw, - shouldSetTaskPositionAndCrop); + shouldSetTaskPositionAndCrop, hasGlobalFocus); } Trace.endSection(); } @@ -392,11 +394,12 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin /** Run the whole relayout phase immediately without delay. */ private void relayoutInSync(ActivityManager.RunningTaskInfo taskInfo, SurfaceControl.Transaction startT, SurfaceControl.Transaction finishT, - boolean applyStartTransactionOnDraw, boolean shouldSetTaskPositionAndCrop) { + boolean applyStartTransactionOnDraw, boolean shouldSetTaskPositionAndCrop, + boolean hasGlobalFocus) { // Clear the current ViewHost runnable as we will update the ViewHost here clearCurrentViewHostRunnable(); updateRelayoutParamsAndSurfaces(taskInfo, startT, finishT, applyStartTransactionOnDraw, - shouldSetTaskPositionAndCrop); + shouldSetTaskPositionAndCrop, hasGlobalFocus); if (mResult.mRootView != null) { updateViewHost(mRelayoutParams, startT, mResult); } @@ -418,7 +421,8 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin */ private void relayoutWithDelayedViewHost(ActivityManager.RunningTaskInfo taskInfo, SurfaceControl.Transaction startT, SurfaceControl.Transaction finishT, - boolean applyStartTransactionOnDraw, boolean shouldSetTaskPositionAndCrop) { + boolean applyStartTransactionOnDraw, boolean shouldSetTaskPositionAndCrop, + boolean hasGlobalFocus) { if (applyStartTransactionOnDraw) { throw new IllegalArgumentException( "We cannot both sync viewhost ondraw and delay viewhost creation."); @@ -426,7 +430,8 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin // Clear the current ViewHost runnable as we will update the ViewHost here clearCurrentViewHostRunnable(); updateRelayoutParamsAndSurfaces(taskInfo, startT, finishT, - false /* applyStartTransactionOnDraw */, shouldSetTaskPositionAndCrop); + false /* applyStartTransactionOnDraw */, shouldSetTaskPositionAndCrop, + hasGlobalFocus); if (mResult.mRootView == null) { // This means something blocks the window decor from showing, e.g. the task is hidden. // Nothing is set up in this case including the decoration surface. @@ -440,7 +445,8 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin @SuppressLint("MissingPermission") private void updateRelayoutParamsAndSurfaces(ActivityManager.RunningTaskInfo taskInfo, SurfaceControl.Transaction startT, SurfaceControl.Transaction finishT, - boolean applyStartTransactionOnDraw, boolean shouldSetTaskPositionAndCrop) { + boolean applyStartTransactionOnDraw, boolean shouldSetTaskPositionAndCrop, + boolean hasGlobalFocus) { Trace.beginSection("DesktopModeWindowDecoration#updateRelayoutParamsAndSurfaces"); if (Flags.enableDesktopWindowingAppToWeb()) { @@ -459,7 +465,8 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin .isTaskInFullImmersiveState(taskInfo.taskId); updateRelayoutParams(mRelayoutParams, mContext, taskInfo, applyStartTransactionOnDraw, shouldSetTaskPositionAndCrop, mIsStatusBarVisible, mIsKeyguardVisibleAndOccluded, - inFullImmersive, mDisplayController.getInsetsState(taskInfo.displayId)); + inFullImmersive, mDisplayController.getInsetsState(taskInfo.displayId), + hasGlobalFocus); final WindowDecorLinearLayout oldRootView = mResult.mRootView; final SurfaceControl oldDecorationSurface = mDecorationContainerSurface; @@ -507,12 +514,13 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin )); } else { mWindowDecorViewHolder.bindData(new AppHeaderViewHolder.HeaderData( - mTaskInfo, TaskInfoKt.getRequestingImmersive(mTaskInfo), inFullImmersive + mTaskInfo, TaskInfoKt.getRequestingImmersive(mTaskInfo), inFullImmersive, + hasGlobalFocus )); } Trace.endSection(); - if (!mTaskInfo.isFocused) { + if (!hasGlobalFocus) { closeHandleMenu(); closeManageWindowsMenu(); closeMaximizeMenu(); @@ -780,7 +788,8 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin boolean isStatusBarVisible, boolean isKeyguardVisibleAndOccluded, boolean inFullImmersiveMode, - @NonNull InsetsState displayInsetsState) { + @NonNull InsetsState displayInsetsState, + boolean hasGlobalFocus) { final int captionLayoutId = getDesktopModeWindowDecorLayoutId(taskInfo.getWindowingMode()); final boolean isAppHeader = captionLayoutId == R.layout.desktop_mode_app_header; @@ -790,6 +799,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin relayoutParams.mLayoutResId = captionLayoutId; relayoutParams.mCaptionHeightId = getCaptionHeightIdStatic(taskInfo.getWindowingMode()); relayoutParams.mCaptionWidthId = getCaptionWidthId(relayoutParams.mLayoutResId); + relayoutParams.mHasGlobalFocus = hasGlobalFocus; final boolean showCaption; if (Flags.enableFullyImmersiveInDesktop()) { @@ -812,7 +822,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin || (isStatusBarVisible && !isKeyguardVisibleAndOccluded); } relayoutParams.mIsCaptionVisible = showCaption; - + relayoutParams.mIsInsetSource = isAppHeader && !inFullImmersiveMode; if (isAppHeader) { if (TaskInfoKt.isTransparentCaptionBarAppearance(taskInfo)) { // If the app is requesting to customize the caption bar, allow input to fall @@ -837,7 +847,6 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin WindowInsets.Type.systemBars() & ~WindowInsets.Type.captionBar(), false /* ignoreVisibility */); relayoutParams.mCaptionTopPadding = systemBarInsets.top; - relayoutParams.mIsInsetSource = false; } // Report occluding elements as bounding rects to the insets system so that apps can // draw in the empty space in the center: @@ -865,8 +874,8 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin relayoutParams.mInputFeatures |= WindowManager.LayoutParams.INPUT_FEATURE_NO_INPUT_CHANNEL; } - if (DesktopModeStatus.useWindowShadow(/* isFocusedWindow= */ taskInfo.isFocused)) { - relayoutParams.mShadowRadiusId = taskInfo.isFocused + if (DesktopModeStatus.useWindowShadow(/* isFocusedWindow= */ hasGlobalFocus)) { + relayoutParams.mShadowRadiusId = hasGlobalFocus ? R.dimen.freeform_decor_shadow_focused_thickness : R.dimen.freeform_decor_shadow_unfocused_thickness; } @@ -1408,7 +1417,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin } boolean isFocused() { - return mTaskInfo.isFocused; + return mHasGlobalFocus; } /** @@ -1592,7 +1601,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin private static int getCaptionHeightIdStatic(@WindowingMode int windowingMode) { return windowingMode == WINDOWING_MODE_FULLSCREEN - ? R.dimen.desktop_mode_fullscreen_decor_caption_height + ? com.android.internal.R.dimen.status_bar_height_default : R.dimen.desktop_mode_freeform_decor_caption_height; } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragPositioningCallbackUtility.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragPositioningCallbackUtility.java index 38f9cfaca7ae..60c922293d80 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragPositioningCallbackUtility.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragPositioningCallbackUtility.java @@ -27,7 +27,7 @@ import android.graphics.PointF; import android.graphics.Rect; import android.util.DisplayMetrics; import android.view.SurfaceControl; -import android.window.flags.DesktopModeFlags; +import android.window.DesktopModeFlags; import androidx.annotation.NonNull; diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragResizeWindowGeometry.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragResizeWindowGeometry.java index d726f5083eb6..33d1c260cb84 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragResizeWindowGeometry.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragResizeWindowGeometry.java @@ -18,7 +18,7 @@ package com.android.wm.shell.windowdecor; import static android.view.InputDevice.SOURCE_MOUSE; import static android.view.InputDevice.SOURCE_TOUCHSCREEN; -import static android.window.flags.DesktopModeFlags.ENABLE_WINDOWING_EDGE_DRAG_RESIZE; +import static android.window.DesktopModeFlags.ENABLE_WINDOWING_EDGE_DRAG_RESIZE; import static com.android.wm.shell.windowdecor.DragPositioningCallback.CTRL_TYPE_BOTTOM; import static com.android.wm.shell.windowdecor.DragPositioningCallback.CTRL_TYPE_LEFT; diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/FluidResizeTaskPositioner.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/FluidResizeTaskPositioner.java index 3853f1f086c1..ccf329c2bb22 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/FluidResizeTaskPositioner.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/FluidResizeTaskPositioner.java @@ -93,9 +93,10 @@ class FluidResizeTaskPositioner implements TaskPositioner, Transitions.Transitio mWindowDecoration.mTaskInfo.configuration.windowConfiguration.getBounds()); mRepositionStartPoint.set(x, y); mDragStartListener.onDragStart(mWindowDecoration.mTaskInfo.taskId); - if (mCtrlType != CTRL_TYPE_UNDEFINED && !mWindowDecoration.mTaskInfo.isFocused) { + if (mCtrlType != CTRL_TYPE_UNDEFINED && !mWindowDecoration.mHasGlobalFocus) { WindowContainerTransaction wct = new WindowContainerTransaction(); - wct.reorder(mWindowDecoration.mTaskInfo.token, true); + wct.reorder(mWindowDecoration.mTaskInfo.token, true /* onTop */, + true /* includingParents */); mTaskOrganizer.applyTransaction(wct); } mRepositionTaskBounds.set(mTaskBoundsAtDragStart); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MaximizeButtonView.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MaximizeButtonView.kt index 68a58ee0a370..376cd2a78baf 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MaximizeButtonView.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MaximizeButtonView.kt @@ -33,7 +33,7 @@ import androidx.core.animation.doOnEnd import androidx.core.animation.doOnStart import androidx.core.content.ContextCompat import com.android.wm.shell.R -import android.window.flags.DesktopModeFlags +import android.window.DesktopModeFlags private const val OPEN_MAXIMIZE_MENU_DELAY_ON_HOVER_MS = 350 private const val MAX_DRAWABLE_ALPHA = 255 diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/VeiledResizeTaskPositioner.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/VeiledResizeTaskPositioner.java index 6eb5cca9ad1a..ff3b45555bce 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/VeiledResizeTaskPositioner.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/VeiledResizeTaskPositioner.java @@ -106,9 +106,10 @@ public class VeiledResizeTaskPositioner implements TaskPositioner, Transitions.T // Capture CUJ for re-sizing window in DW mode. mInteractionJankMonitor.begin(mDesktopWindowDecoration.mTaskSurface, mDesktopWindowDecoration.mContext, mHandler, CUJ_DESKTOP_MODE_RESIZE_WINDOW); - if (!mDesktopWindowDecoration.mTaskInfo.isFocused) { + if (!mDesktopWindowDecoration.mHasGlobalFocus) { WindowContainerTransaction wct = new WindowContainerTransaction(); - wct.reorder(mDesktopWindowDecoration.mTaskInfo.token, true); + wct.reorder(mDesktopWindowDecoration.mTaskInfo.token, true /* onTop */, + true /* includingParents */); mTaskOrganizer.applyTransaction(wct); } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java index f8aed412e3fb..ce5cfd0bdc36 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java @@ -125,7 +125,7 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer> } mDisplayController.removeDisplayWindowListener(this); - relayout(mTaskInfo); + relayout(mTaskInfo, mHasGlobalFocus); } }; @@ -146,6 +146,7 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer> boolean mIsStatusBarVisible; boolean mIsKeyguardVisibleAndOccluded; + boolean mHasGlobalFocus; /** The most recent set of insets applied to this window decoration. */ private WindowDecorationInsets mWindowDecorationInsets; @@ -199,8 +200,9 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer> * * @param taskInfo The previous {@link RunningTaskInfo} passed into {@link #relayout} or the * constructor. + * @param hasGlobalFocus Whether the task is focused */ - abstract void relayout(RunningTaskInfo taskInfo); + abstract void relayout(RunningTaskInfo taskInfo, boolean hasGlobalFocus); /** * Used by the {@link DragPositioningCallback} associated with the implementing class to @@ -225,6 +227,7 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer> if (params.mRunningTaskInfo != null) { mTaskInfo = params.mRunningTaskInfo; } + mHasGlobalFocus = params.mHasGlobalFocus; final int oldLayoutResId = mLayoutResId; mLayoutResId = params.mLayoutResId; @@ -246,7 +249,7 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer> final Rect taskBounds = mTaskInfo.getConfiguration().windowConfiguration.getBounds(); outResult.mWidth = taskBounds.width(); outResult.mHeight = taskBounds.height(); - outResult.mRootView.setTaskFocusState(mTaskInfo.isFocused); + outResult.mRootView.setTaskFocusState(mHasGlobalFocus); final Resources resources = mDecorWindowContext.getResources(); outResult.mCaptionHeight = loadDimensionPixelSize(resources, params.mCaptionHeightId) + params.mCaptionTopPadding; @@ -391,11 +394,11 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer> final WindowDecorationInsets newInsets = new WindowDecorationInsets( mTaskInfo.token, mOwner, captionInsetsRect, boundingRects, - params.mInsetSourceFlags); + params.mInsetSourceFlags, params.mIsInsetSource); if (!newInsets.equals(mWindowDecorationInsets)) { // Add or update this caption as an insets source. mWindowDecorationInsets = newInsets; - mWindowDecorationInsets.addOrUpdate(wct); + mWindowDecorationInsets.update(wct); } } @@ -512,7 +515,7 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer> mIsKeyguardVisibleAndOccluded = visible && occluded; final boolean changed = prevVisAndOccluded != mIsKeyguardVisibleAndOccluded; if (changed) { - relayout(mTaskInfo); + relayout(mTaskInfo, mHasGlobalFocus); } } @@ -522,7 +525,7 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer> final boolean changed = prevStatusBarVisibility != mIsStatusBarVisible; if (changed) { - relayout(mTaskInfo); + relayout(mTaskInfo, mHasGlobalFocus); } } @@ -710,10 +713,11 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer> final int captionHeight = loadDimensionPixelSize(mContext.getResources(), captionHeightId); final Rect captionInsets = new Rect(0, 0, 0, captionHeight); final WindowDecorationInsets newInsets = new WindowDecorationInsets(mTaskInfo.token, - mOwner, captionInsets, null /* boundingRets */, 0 /* flags */); + mOwner, captionInsets, null /* boundingRets */, 0 /* flags */, + true /* shouldAddCaptionInset */); if (!newInsets.equals(mWindowDecorationInsets)) { mWindowDecorationInsets = newInsets; - mWindowDecorationInsets.addOrUpdate(wct); + mWindowDecorationInsets.update(wct); } } @@ -737,6 +741,7 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer> boolean mApplyStartTransactionOnDraw; boolean mSetTaskPositionAndCrop; + boolean mHasGlobalFocus; void reset() { mLayoutResId = Resources.ID_NULL; @@ -756,6 +761,7 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer> mApplyStartTransactionOnDraw = false; mSetTaskPositionAndCrop = false; mWindowDecorConfig = null; + mHasGlobalFocus = false; } boolean hasInputFeatureSpy() { @@ -814,21 +820,26 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer> private final Rect mFrame; private final Rect[] mBoundingRects; private final @InsetsSource.Flags int mFlags; + private final boolean mShouldAddCaptionInset; private WindowDecorationInsets(WindowContainerToken token, Binder owner, Rect frame, - Rect[] boundingRects, @InsetsSource.Flags int flags) { + Rect[] boundingRects, @InsetsSource.Flags int flags, + boolean shouldAddCaptionInset) { mToken = token; mOwner = owner; mFrame = frame; mBoundingRects = boundingRects; mFlags = flags; + mShouldAddCaptionInset = shouldAddCaptionInset; } - void addOrUpdate(WindowContainerTransaction wct) { - wct.addInsetsSource(mToken, mOwner, INDEX, captionBar(), mFrame, mBoundingRects, - mFlags); - wct.addInsetsSource(mToken, mOwner, INDEX, mandatorySystemGestures(), mFrame, - mBoundingRects, 0 /* flags */); + void update(WindowContainerTransaction wct) { + if (mShouldAddCaptionInset) { + wct.addInsetsSource(mToken, mOwner, INDEX, captionBar(), mFrame, mBoundingRects, + mFlags); + wct.addInsetsSource(mToken, mOwner, INDEX, mandatorySystemGestures(), mFrame, + mBoundingRects, 0 /* flags */); + } } void remove(WindowContainerTransaction wct) { @@ -843,7 +854,8 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer> return Objects.equals(mToken, that.mToken) && Objects.equals(mOwner, that.mOwner) && Objects.equals(mFrame, that.mFrame) && Objects.deepEquals(mBoundingRects, that.mBoundingRects) - && mFlags == that.mFlags; + && mFlags == that.mFlags + && mShouldAddCaptionInset == that.mShouldAddCaptionInset; } @Override diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHeaderViewHolder.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHeaderViewHolder.kt index 52bf40062cdb..cf03b3f74dc7 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHeaderViewHolder.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHeaderViewHolder.kt @@ -49,7 +49,7 @@ import com.android.internal.R.attr.materialColorSurfaceDim import com.android.window.flags.Flags import com.android.window.flags.Flags.enableMinimizeButton import com.android.wm.shell.R -import android.window.flags.DesktopModeFlags +import android.window.DesktopModeFlags import com.android.wm.shell.windowdecor.MaximizeButtonView import com.android.wm.shell.windowdecor.common.DecorThemeUtil import com.android.wm.shell.windowdecor.common.OPACITY_100 @@ -81,6 +81,7 @@ class AppHeaderViewHolder( val taskInfo: RunningTaskInfo, val isRequestingImmersive: Boolean, val inFullImmersiveState: Boolean, + val hasGlobalFocus: Boolean ) : Data() private val decorThemeUtil = DecorThemeUtil(context) @@ -159,24 +160,27 @@ class AppHeaderViewHolder( } override fun bindData(data: HeaderData) { - bindData(data.taskInfo, data.isRequestingImmersive, data.inFullImmersiveState) + bindData(data.taskInfo, data.isRequestingImmersive, data.inFullImmersiveState, + data.hasGlobalFocus) } private fun bindData( taskInfo: RunningTaskInfo, isRequestingImmersive: Boolean, inFullImmersiveState: Boolean, + hasGlobalFocus: Boolean ) { if (DesktopModeFlags.ENABLE_THEMED_APP_HEADERS.isTrue()) { - bindDataWithThemedHeaders(taskInfo, isRequestingImmersive, inFullImmersiveState) + bindDataWithThemedHeaders(taskInfo, isRequestingImmersive, inFullImmersiveState, + hasGlobalFocus) } else { - bindDataLegacy(taskInfo) + bindDataLegacy(taskInfo, hasGlobalFocus) } } - private fun bindDataLegacy(taskInfo: RunningTaskInfo) { - captionView.setBackgroundColor(getCaptionBackgroundColor(taskInfo)) - val color = getAppNameAndButtonColor(taskInfo) + private fun bindDataLegacy(taskInfo: RunningTaskInfo, hasGlobalFocus: Boolean) { + captionView.setBackgroundColor(getCaptionBackgroundColor(taskInfo, hasGlobalFocus)) + val color = getAppNameAndButtonColor(taskInfo, hasGlobalFocus) val alpha = Color.alpha(color) closeWindowButton.imageTintList = ColorStateList.valueOf(color) maximizeWindowButton.imageTintList = ColorStateList.valueOf(color) @@ -210,9 +214,10 @@ class AppHeaderViewHolder( private fun bindDataWithThemedHeaders( taskInfo: RunningTaskInfo, requestingImmersive: Boolean, - inFullImmersiveState: Boolean + inFullImmersiveState: Boolean, + hasGlobalFocus: Boolean ) { - val header = fillHeaderInfo(taskInfo) + val header = fillHeaderInfo(taskInfo, hasGlobalFocus) val headerStyle = getHeaderStyle(header) // Caption Background @@ -455,7 +460,7 @@ class AppHeaderViewHolder( } } - private fun fillHeaderInfo(taskInfo: RunningTaskInfo): Header { + private fun fillHeaderInfo(taskInfo: RunningTaskInfo, hasGlobalFocus: Boolean): Header { return Header( type = if (taskInfo.isTransparentCaptionBarAppearance) { Header.Type.CUSTOM @@ -463,7 +468,7 @@ class AppHeaderViewHolder( Header.Type.DEFAULT }, appTheme = decorThemeUtil.getAppTheme(taskInfo), - isFocused = taskInfo.isFocused, + isFocused = hasGlobalFocus, isAppearanceCaptionLight = taskInfo.isLightCaptionBarAppearance ) } @@ -544,19 +549,19 @@ class AppHeaderViewHolder( } @ColorInt - private fun getCaptionBackgroundColor(taskInfo: RunningTaskInfo): Int { + private fun getCaptionBackgroundColor(taskInfo: RunningTaskInfo, hasGlobalFocus: Boolean): Int { if (taskInfo.isTransparentCaptionBarAppearance) { return Color.TRANSPARENT } val materialColorAttr: Int = if (isDarkMode()) { - if (!taskInfo.isFocused) { + if (!hasGlobalFocus) { materialColorSurfaceContainerHigh } else { materialColorSurfaceDim } } else { - if (!taskInfo.isFocused) { + if (!hasGlobalFocus) { materialColorSurfaceContainerLow } else { materialColorSecondaryContainer @@ -569,7 +574,7 @@ class AppHeaderViewHolder( } @ColorInt - private fun getAppNameAndButtonColor(taskInfo: RunningTaskInfo): Int { + private fun getAppNameAndButtonColor(taskInfo: RunningTaskInfo, hasGlobalFocus: Boolean): Int { val materialColorAttr = when { taskInfo.isTransparentCaptionBarAppearance && taskInfo.isLightCaptionBarAppearance -> materialColorOnSecondaryContainer @@ -579,8 +584,8 @@ class AppHeaderViewHolder( else -> materialColorOnSecondaryContainer } val appDetailsOpacity = when { - isDarkMode() && !taskInfo.isFocused -> DARK_THEME_UNFOCUSED_OPACITY - !isDarkMode() && !taskInfo.isFocused -> LIGHT_THEME_UNFOCUSED_OPACITY + isDarkMode() && !hasGlobalFocus -> DARK_THEME_UNFOCUSED_OPACITY + !isDarkMode() && !hasGlobalFocus -> LIGHT_THEME_UNFOCUSED_OPACITY else -> FOCUSED_OPACITY } context.withStyledAttributes(null, intArrayOf(materialColorAttr), 0, 0) { diff --git a/libs/WindowManager/Shell/tests/flicker/Android.bp b/libs/WindowManager/Shell/tests/flicker/Android.bp index 58559ac2c3ca..7b6cfe3f9f8a 100644 --- a/libs/WindowManager/Shell/tests/flicker/Android.bp +++ b/libs/WindowManager/Shell/tests/flicker/Android.bp @@ -30,7 +30,6 @@ filegroup { java_library { name: "wm-shell-flicker-utils", - platform_apis: true, optimize: { enabled: false, }, diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackAnimationControllerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackAnimationControllerTest.java index 227060d15640..dee0b23a42f5 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackAnimationControllerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackAnimationControllerTest.java @@ -860,15 +860,9 @@ public class BackAnimationControllerTest extends ShellTestCase { } private void doMotionEvent(int actionDown, int coordinate) { - doMotionEvent(actionDown, coordinate, 0); - } - - private void doMotionEvent(int actionDown, int coordinate, float velocity) { mController.onMotionEvent( /* touchX */ coordinate, /* touchY */ coordinate, - /* velocityX = */ velocity, - /* velocityY = */ velocity, /* keyAction */ actionDown, /* swipeEdge */ BackEvent.EDGE_LEFT); } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackProgressAnimatorTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackProgressAnimatorTest.java index 9b019ddb8362..1da4ef6b5a8b 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackProgressAnimatorTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/BackProgressAnimatorTest.java @@ -54,8 +54,6 @@ public class BackProgressAnimatorTest { /* touchX = */ touchX, /* touchY = */ 0, /* progress = */ progress, - /* velocityX = */ 0, - /* velocityY = */ 0, /* triggerBack = */ false, /* swipeEdge = */ BackEvent.EDGE_LEFT, /* departingAnimationTarget = */ null); diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/CustomCrossActivityBackAnimationTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/CustomCrossActivityBackAnimationTest.kt index 5b5ef6f48789..2235c20d7f21 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/CustomCrossActivityBackAnimationTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/back/CustomCrossActivityBackAnimationTest.kt @@ -222,8 +222,6 @@ class CustomCrossActivityBackAnimationTest : ShellTestCase() { /* touchX = */ touchX, /* touchY = */ 0f, /* progress = */ progress, - /* velocityX = */ 0f, - /* velocityY = */ 0f, /* triggerBack = */ false, /* swipeEdge = */ BackEvent.EDGE_LEFT, /* departingAnimationTarget = */ null diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopFullImmersiveTransitionHandlerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopFullImmersiveTransitionHandlerTest.kt index cae609526c65..2e9effb44d67 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopFullImmersiveTransitionHandlerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopFullImmersiveTransitionHandlerTest.kt @@ -15,23 +15,39 @@ */ package com.android.wm.shell.desktopmode +import android.app.WindowConfiguration.WINDOW_CONFIG_BOUNDS +import android.os.Binder import android.os.IBinder +import android.platform.test.annotations.EnableFlags +import android.platform.test.flag.junit.SetFlagsRule import android.testing.AndroidTestingRunner +import android.view.Display.DEFAULT_DISPLAY import android.view.SurfaceControl import android.view.WindowManager.TRANSIT_CHANGE +import android.view.WindowManager.TransitionFlags +import android.view.WindowManager.TransitionType +import android.window.TransitionInfo +import android.window.WindowContainerToken import android.window.WindowContainerTransaction import androidx.test.filters.SmallTest +import com.android.window.flags.Flags +import com.android.wm.shell.ShellTaskOrganizer import com.android.wm.shell.ShellTestCase import com.android.wm.shell.TestShellExecutor +import com.android.wm.shell.common.DisplayController +import com.android.wm.shell.common.DisplayLayout import com.android.wm.shell.desktopmode.DesktopTestHelpers.Companion.createFreeformTask import com.android.wm.shell.sysui.ShellInit import com.android.wm.shell.transition.Transitions import com.google.common.truth.Truth.assertThat import org.junit.Before +import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock import org.mockito.Mockito.mock +import org.mockito.kotlin.any +import org.mockito.kotlin.eq import org.mockito.kotlin.mock import org.mockito.kotlin.times import org.mockito.kotlin.verify @@ -40,14 +56,18 @@ import org.mockito.kotlin.whenever /** * Tests for [DesktopFullImmersiveTransitionHandler]. * - * Usage: atest WMShellUnitTests:DesktopFullImmersiveTransitionHandler + * Usage: atest WMShellUnitTests:DesktopFullImmersiveTransitionHandlerTest */ @SmallTest @RunWith(AndroidTestingRunner::class) class DesktopFullImmersiveTransitionHandlerTest : ShellTestCase() { + @JvmField @Rule val setFlagsRule = SetFlagsRule() + @Mock private lateinit var mockTransitions: Transitions private lateinit var desktopRepository: DesktopRepository + @Mock private lateinit var mockDisplayController: DisplayController + @Mock private lateinit var mockShellTaskOrganizer: ShellTaskOrganizer private val transactionSupplier = { SurfaceControl.Transaction() } private lateinit var immersiveHandler: DesktopFullImmersiveTransitionHandler @@ -57,19 +77,22 @@ class DesktopFullImmersiveTransitionHandlerTest : ShellTestCase() { desktopRepository = DesktopRepository( context, ShellInit(TestShellExecutor()), mock(), mock() ) + whenever(mockDisplayController.getDisplayLayout(DEFAULT_DISPLAY)) + .thenReturn(DisplayLayout()) immersiveHandler = DesktopFullImmersiveTransitionHandler( transitions = mockTransitions, desktopRepository = desktopRepository, - transactionSupplier = transactionSupplier + displayController = mockDisplayController, + shellTaskOrganizer = mockShellTaskOrganizer, + transactionSupplier = transactionSupplier, ) } @Test fun enterImmersive_transitionReady_updatesRepository() { val task = createFreeformTask() - val wct = WindowContainerTransaction() val mockBinder = mock(IBinder::class.java) - whenever(mockTransitions.startTransition(TRANSIT_CHANGE, wct, immersiveHandler)) + whenever(mockTransitions.startTransition(eq(TRANSIT_CHANGE), any(), eq(immersiveHandler))) .thenReturn(mockBinder) desktopRepository.setTaskInFullImmersiveState( displayId = task.displayId, @@ -77,8 +100,8 @@ class DesktopFullImmersiveTransitionHandlerTest : ShellTestCase() { immersive = false ) - immersiveHandler.enterImmersive(task, wct) - immersiveHandler.onTransitionReady(mockBinder) + immersiveHandler.moveTaskToImmersive(task) + immersiveHandler.onTransitionReady(mockBinder, createTransitionInfo()) assertThat(desktopRepository.isTaskInFullImmersiveState(task.taskId)).isTrue() } @@ -86,9 +109,8 @@ class DesktopFullImmersiveTransitionHandlerTest : ShellTestCase() { @Test fun exitImmersive_transitionReady_updatesRepository() { val task = createFreeformTask() - val wct = WindowContainerTransaction() val mockBinder = mock(IBinder::class.java) - whenever(mockTransitions.startTransition(TRANSIT_CHANGE, wct, immersiveHandler)) + whenever(mockTransitions.startTransition(eq(TRANSIT_CHANGE), any(), eq(immersiveHandler))) .thenReturn(mockBinder) desktopRepository.setTaskInFullImmersiveState( displayId = task.displayId, @@ -96,8 +118,8 @@ class DesktopFullImmersiveTransitionHandlerTest : ShellTestCase() { immersive = true ) - immersiveHandler.exitImmersive(task, wct) - immersiveHandler.onTransitionReady(mockBinder) + immersiveHandler.moveTaskToNonImmersive(task) + immersiveHandler.onTransitionReady(mockBinder, createTransitionInfo()) assertThat(desktopRepository.isTaskInFullImmersiveState(task.taskId)).isFalse() } @@ -105,28 +127,251 @@ class DesktopFullImmersiveTransitionHandlerTest : ShellTestCase() { @Test fun enterImmersive_inProgress_ignores() { val task = createFreeformTask() - val wct = WindowContainerTransaction() val mockBinder = mock(IBinder::class.java) - whenever(mockTransitions.startTransition(TRANSIT_CHANGE, wct, immersiveHandler)) + whenever(mockTransitions.startTransition(eq(TRANSIT_CHANGE), any(), eq(immersiveHandler))) .thenReturn(mockBinder) - immersiveHandler.enterImmersive(task, wct) - immersiveHandler.enterImmersive(task, wct) + immersiveHandler.moveTaskToImmersive(task) + immersiveHandler.moveTaskToImmersive(task) - verify(mockTransitions, times(1)).startTransition(TRANSIT_CHANGE, wct, immersiveHandler) + verify(mockTransitions, times(1)) + .startTransition(eq(TRANSIT_CHANGE), any(), eq(immersiveHandler)) } @Test fun exitImmersive_inProgress_ignores() { val task = createFreeformTask() - val wct = WindowContainerTransaction() val mockBinder = mock(IBinder::class.java) - whenever(mockTransitions.startTransition(TRANSIT_CHANGE, wct, immersiveHandler)) + whenever(mockTransitions.startTransition(eq(TRANSIT_CHANGE), any(), eq(immersiveHandler))) .thenReturn(mockBinder) - immersiveHandler.exitImmersive(task, wct) - immersiveHandler.exitImmersive(task, wct) + immersiveHandler.moveTaskToNonImmersive(task) + immersiveHandler.moveTaskToNonImmersive(task) + + verify(mockTransitions, times(1)) + .startTransition(eq(TRANSIT_CHANGE), any(), eq(immersiveHandler)) + } + + @Test + @EnableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP) + fun exitImmersiveIfApplicable_inImmersive_addsPendingExit() { + val task = createFreeformTask() + whenever(mockShellTaskOrganizer.getRunningTaskInfo(task.taskId)).thenReturn(task) + val wct = WindowContainerTransaction() + val transition = Binder() + desktopRepository.setTaskInFullImmersiveState( + displayId = DEFAULT_DISPLAY, + taskId = task.taskId, + immersive = true + ) + + immersiveHandler.exitImmersiveIfApplicable(transition, wct, DEFAULT_DISPLAY) - verify(mockTransitions, times(1)).startTransition(TRANSIT_CHANGE, wct, immersiveHandler) + assertThat(immersiveHandler.pendingExternalExitTransitions.any { exit -> + exit.transition == transition && exit.displayId == DEFAULT_DISPLAY + && exit.taskId == task.taskId + }).isTrue() } + + @Test + @EnableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP) + fun exitImmersiveIfApplicable_notInImmersive_doesNotAddPendingExit() { + val task = createFreeformTask() + whenever(mockShellTaskOrganizer.getRunningTaskInfo(task.taskId)).thenReturn(task) + val wct = WindowContainerTransaction() + val transition = Binder() + desktopRepository.setTaskInFullImmersiveState( + displayId = DEFAULT_DISPLAY, + taskId = task.taskId, + immersive = false + ) + + immersiveHandler.exitImmersiveIfApplicable(transition, wct, DEFAULT_DISPLAY) + + assertThat(immersiveHandler.pendingExternalExitTransitions.any { exit -> + exit.transition == transition && exit.displayId == DEFAULT_DISPLAY + && exit.taskId == task.taskId + }).isFalse() + } + + @Test + @EnableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP) + fun exitImmersiveIfApplicable_byDisplay_inImmersive_changesTaskBounds() { + val task = createFreeformTask() + whenever(mockShellTaskOrganizer.getRunningTaskInfo(task.taskId)).thenReturn(task) + val wct = WindowContainerTransaction() + val transition = Binder() + desktopRepository.setTaskInFullImmersiveState( + displayId = DEFAULT_DISPLAY, + taskId = task.taskId, + immersive = true + ) + + immersiveHandler.exitImmersiveIfApplicable(transition, wct, DEFAULT_DISPLAY) + + assertThat(wct.hasBoundsChange(task.token)).isTrue() + } + + @Test + @EnableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP) + fun exitImmersiveIfApplicable_byDisplay_notInImmersive_doesNotChangeTaskBounds() { + val task = createFreeformTask() + whenever(mockShellTaskOrganizer.getRunningTaskInfo(task.taskId)).thenReturn(task) + val wct = WindowContainerTransaction() + val transition = Binder() + desktopRepository.setTaskInFullImmersiveState( + displayId = DEFAULT_DISPLAY, + taskId = task.taskId, + immersive = false + ) + + immersiveHandler.exitImmersiveIfApplicable(transition, wct, DEFAULT_DISPLAY) + + assertThat(wct.hasBoundsChange(task.token)).isFalse() + } + + @Test + @EnableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP) + fun exitImmersiveIfApplicable_byTask_inImmersive_changesTaskBounds() { + val task = createFreeformTask() + whenever(mockShellTaskOrganizer.getRunningTaskInfo(task.taskId)).thenReturn(task) + val wct = WindowContainerTransaction() + desktopRepository.setTaskInFullImmersiveState( + displayId = DEFAULT_DISPLAY, + taskId = task.taskId, + immersive = true + ) + + immersiveHandler.exitImmersiveIfApplicable(wct = wct, taskInfo = task) + + assertThat(wct.hasBoundsChange(task.token)).isTrue() + } + + @Test + @EnableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP) + fun exitImmersiveIfApplicable_byTask_notInImmersive_doesNotChangeTaskBounds() { + val task = createFreeformTask() + whenever(mockShellTaskOrganizer.getRunningTaskInfo(task.taskId)).thenReturn(task) + val wct = WindowContainerTransaction() + desktopRepository.setTaskInFullImmersiveState( + displayId = DEFAULT_DISPLAY, + taskId = task.taskId, + immersive = false + ) + + immersiveHandler.exitImmersiveIfApplicable(wct, task.taskId) + + assertThat(wct.hasBoundsChange(task.token)).isFalse() + } + + @Test + @EnableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP) + fun exitImmersiveIfApplicable_byTask_inImmersive_addsPendingExitOnRun() { + val task = createFreeformTask() + whenever(mockShellTaskOrganizer.getRunningTaskInfo(task.taskId)).thenReturn(task) + val wct = WindowContainerTransaction() + val transition = Binder() + desktopRepository.setTaskInFullImmersiveState( + displayId = DEFAULT_DISPLAY, + taskId = task.taskId, + immersive = true + ) + + immersiveHandler.exitImmersiveIfApplicable(wct, task.taskId)?.invoke(transition) + + assertThat(immersiveHandler.pendingExternalExitTransitions.any { exit -> + exit.transition == transition && exit.displayId == DEFAULT_DISPLAY + && exit.taskId == task.taskId + }).isFalse() + } + + @Test + @EnableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP) + fun exitImmersiveIfApplicable_byTask_notInImmersive_doesNotAddPendingExitOnRun() { + val task = createFreeformTask() + whenever(mockShellTaskOrganizer.getRunningTaskInfo(task.taskId)).thenReturn(task) + val wct = WindowContainerTransaction() + val transition = Binder() + desktopRepository.setTaskInFullImmersiveState( + displayId = DEFAULT_DISPLAY, + taskId = task.taskId, + immersive = false + ) + + immersiveHandler.exitImmersiveIfApplicable(wct, task.taskId)?.invoke(transition) + + assertThat(immersiveHandler.pendingExternalExitTransitions.any { exit -> + exit.transition == transition && exit.displayId == DEFAULT_DISPLAY + && exit.taskId == task.taskId + }).isFalse() + } + + @Test + @EnableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP) + fun onTransitionReady_pendingExit_removesPendingExit() { + val task = createFreeformTask() + whenever(mockShellTaskOrganizer.getRunningTaskInfo(task.taskId)).thenReturn(task) + val wct = WindowContainerTransaction() + val transition = Binder() + desktopRepository.setTaskInFullImmersiveState( + displayId = DEFAULT_DISPLAY, + taskId = task.taskId, + immersive = true + ) + immersiveHandler.exitImmersiveIfApplicable(transition, wct, DEFAULT_DISPLAY) + + immersiveHandler.onTransitionReady( + transition = transition, + info = createTransitionInfo( + changes = listOf( + TransitionInfo.Change(task.token, SurfaceControl()).apply { taskInfo = task } + ) + ) + ) + + assertThat(immersiveHandler.pendingExternalExitTransitions.any { exit -> + exit.transition == transition && exit.displayId == DEFAULT_DISPLAY + && exit.taskId == task.taskId + }).isFalse() + } + + @Test + @EnableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP) + fun onTransitionReady_pendingExit_updatesRepository() { + val task = createFreeformTask() + whenever(mockShellTaskOrganizer.getRunningTaskInfo(task.taskId)).thenReturn(task) + val wct = WindowContainerTransaction() + val transition = Binder() + desktopRepository.setTaskInFullImmersiveState( + displayId = DEFAULT_DISPLAY, + taskId = task.taskId, + immersive = true + ) + immersiveHandler.exitImmersiveIfApplicable(transition, wct, DEFAULT_DISPLAY) + + immersiveHandler.onTransitionReady( + transition = transition, + info = createTransitionInfo( + changes = listOf( + TransitionInfo.Change(task.token, SurfaceControl()).apply { taskInfo = task } + ) + ) + ) + + assertThat(desktopRepository.isTaskInFullImmersiveState(task.taskId)).isFalse() + } + + private fun createTransitionInfo( + @TransitionType type: Int = TRANSIT_CHANGE, + @TransitionFlags flags: Int = 0, + changes: List<TransitionInfo.Change> = emptyList() + ): TransitionInfo = TransitionInfo(type, flags).apply { + changes.forEach { change -> addChange(change) } + } + + private fun WindowContainerTransaction.hasBoundsChange(token: WindowContainerToken): Boolean = + this.changes.any { change -> + change.key == token.asBinder() + && (change.value.windowSetMask and WINDOW_CONFIG_BOUNDS) != 0 + } } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeLoggerTransitionObserverTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeLoggerTransitionObserverTest.kt index d399b20abb2a..daf7e7d5397b 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeLoggerTransitionObserverTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeLoggerTransitionObserverTest.kt @@ -110,15 +110,20 @@ class DesktopModeLoggerTransitionObserverTest : ShellTestCase() { shellInit = spy(ShellInit(testExecutor)) desktopModeEventLogger = mock<DesktopModeEventLogger>() - transitionObserver = - DesktopModeLoggerTransitionObserver( - context, mockShellInit, transitions, desktopModeEventLogger) - if (Transitions.ENABLE_SHELL_TRANSITIONS) { - val initRunnableCaptor = ArgumentCaptor.forClass(Runnable::class.java) - verify(mockShellInit).addInitCallback(initRunnableCaptor.capture(), same(transitionObserver)) - initRunnableCaptor.value.run() - } else { - transitionObserver.onInit() + transitionObserver = DesktopModeLoggerTransitionObserver( + context, mockShellInit, transitions, desktopModeEventLogger) + val initRunnableCaptor = ArgumentCaptor.forClass(Runnable::class.java) + verify(mockShellInit).addInitCallback(initRunnableCaptor.capture(), same(transitionObserver)) + initRunnableCaptor.value.run() + } + + @Test + fun testInitialiseVisibleTasksSystemProperty() { + ExtendedMockito.verify { + SystemProperties.set( + eq(DesktopModeLoggerTransitionObserver.VISIBLE_TASKS_COUNTER_SYSTEM_PROPERTY), + eq(DesktopModeLoggerTransitionObserver + .VISIBLE_TASKS_COUNTER_SYSTEM_PROPERTY_DEFAULT_VALUE)) } } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopRepositoryTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopRepositoryTest.kt index 55b9724795e1..e20f0ecb1f3b 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopRepositoryTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopRepositoryTest.kt @@ -940,6 +940,32 @@ class DesktopRepositoryTest : ShellTestCase() { assertThat(repo.isTaskInFullImmersiveState(taskId = 2)).isTrue() } + @Test + fun removeDesktop_multipleTasks_removesAll() { + repo.addActiveTask(displayId = DEFAULT_DISPLAY, taskId = 1) + repo.addActiveTask(displayId = DEFAULT_DISPLAY, taskId = 2) + repo.addActiveTask(displayId = DEFAULT_DISPLAY, taskId = 3) + // The front-most task will be the one added last through `addOrMoveFreeformTaskToTop` + repo.addOrMoveFreeformTaskToTop(displayId = DEFAULT_DISPLAY, taskId = 3) + repo.addOrMoveFreeformTaskToTop(displayId = DEFAULT_DISPLAY, taskId = 2) + repo.addOrMoveFreeformTaskToTop(displayId = DEFAULT_DISPLAY, taskId = 1) + repo.minimizeTask(displayId = DEFAULT_DISPLAY, taskId = 2) + + val tasksBeforeRemoval = repo.removeDesktop(displayId = DEFAULT_DISPLAY) + + assertThat(tasksBeforeRemoval).containsExactly(1, 2, 3).inOrder() + assertThat(repo.getActiveTasks(displayId = DEFAULT_DISPLAY)).isEmpty() + } + + @Test + fun getTaskInFullImmersiveState_byDisplay() { + repo.setTaskInFullImmersiveState(DEFAULT_DESKTOP_ID, taskId = 1, immersive = true) + repo.setTaskInFullImmersiveState(DEFAULT_DESKTOP_ID + 1, taskId = 2, immersive = true) + + assertThat(repo.getTaskInFullImmersiveState(DEFAULT_DESKTOP_ID)).isEqualTo(1) + assertThat(repo.getTaskInFullImmersiveState(DEFAULT_DESKTOP_ID + 1)).isEqualTo(2) + } + class TestListener : DesktopRepository.ActiveTasksListener { var activeChangesOnDefaultDisplay = 0 var activeChangesOnSecondaryDisplay = 0 diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt index ae4772eba5b0..b3c10d64c3a3 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt @@ -42,6 +42,7 @@ import android.graphics.Rect import android.os.Binder import android.os.Bundle import android.os.Handler +import android.os.IBinder import android.platform.test.annotations.DisableFlags import android.platform.test.annotations.EnableFlags import android.platform.test.flag.junit.SetFlagsRule @@ -99,6 +100,7 @@ import com.android.wm.shell.desktopmode.DesktopTestHelpers.Companion.createSplit import com.android.wm.shell.desktopmode.persistence.Desktop import com.android.wm.shell.desktopmode.persistence.DesktopPersistentRepository import com.android.wm.shell.draganddrop.DragAndDropController +import com.android.wm.shell.freeform.FreeformTaskTransitionStarter import com.android.wm.shell.recents.RecentTasksController import com.android.wm.shell.recents.RecentsTransitionHandler import com.android.wm.shell.recents.RecentsTransitionStateListener @@ -144,13 +146,11 @@ import org.mockito.Mockito import org.mockito.Mockito.anyInt import org.mockito.Mockito.clearInvocations import org.mockito.Mockito.mock -import org.mockito.Mockito.never import org.mockito.Mockito.spy import org.mockito.Mockito.verify import org.mockito.Mockito.times import org.mockito.kotlin.any import org.mockito.kotlin.anyOrNull -import org.mockito.kotlin.argThat import org.mockito.kotlin.atLeastOnce import org.mockito.kotlin.capture import org.mockito.kotlin.eq @@ -201,6 +201,7 @@ class DesktopTasksControllerTest : ShellTestCase() { private lateinit var mockInteractionJankMonitor: InteractionJankMonitor @Mock private lateinit var mockSurface: SurfaceControl @Mock private lateinit var taskbarDesktopTaskListener: TaskbarDesktopTaskListener + @Mock private lateinit var freeformTaskTransitionStarter: FreeformTaskTransitionStarter @Mock private lateinit var mockHandler: Handler @Mock lateinit var persistentRepository: DesktopPersistentRepository @@ -266,6 +267,7 @@ class DesktopTasksControllerTest : ShellTestCase() { controller = createController() controller.setSplitScreenController(splitScreenController) + controller.freeformTaskTransitionStarter = freeformTaskTransitionStarter shellInit.init() @@ -1542,75 +1544,142 @@ class DesktopTasksControllerTest : ShellTestCase() { } @Test - fun onDesktopWindowMinimize_noActiveTask_doesntUpdateTransaction() { - val wct = WindowContainerTransaction() - controller.onDesktopWindowMinimize(wct, taskId = 1) - // Nothing happens. - assertThat(wct.hierarchyOps).isEmpty() + fun onDesktopWindowMinimize_noActiveTask_doesntRemoveWallpaper() { + val task = setUpFreeformTask(active = false) + val transition = Binder() + whenever(freeformTaskTransitionStarter.startMinimizedModeTransition(any())) + .thenReturn(transition) + val wallpaperToken = MockToken().token() + taskRepository.wallpaperActivityToken = wallpaperToken + + controller.minimizeTask(task) + + val captor = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) + verify(freeformTaskTransitionStarter).startMinimizedModeTransition(captor.capture()) + captor.value.hierarchyOps.none { hop -> + hop.type == HIERARCHY_OP_TYPE_REMOVE_TASK && hop.container == wallpaperToken.asBinder() + } } @Test - fun onDesktopWindowMinimize_singleActiveTask_noWallpaperActivityToken_doesntUpdateTransaction() { - val task = setUpFreeformTask() - val wct = WindowContainerTransaction() - controller.onDesktopWindowMinimize(wct, taskId = task.taskId) - // Nothing happens. - assertThat(wct.hierarchyOps).isEmpty() + fun onDesktopWindowMinimize_singleActiveTask_noWallpaperActivityToken_doesntRemoveWallpaper() { + val task = setUpFreeformTask(active = true) + val transition = Binder() + whenever(freeformTaskTransitionStarter.startMinimizedModeTransition(any())) + .thenReturn(transition) + + controller.minimizeTask(task) + + val captor = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) + verify(freeformTaskTransitionStarter).startMinimizedModeTransition(captor.capture()) + captor.value.hierarchyOps.none { hop -> + hop.type == HIERARCHY_OP_TYPE_REMOVE_TASK + } } @Test fun onDesktopWindowMinimize_singleActiveTask_hasWallpaperActivityToken_removesWallpaper() { val task = setUpFreeformTask() + val transition = Binder() + whenever(freeformTaskTransitionStarter.startMinimizedModeTransition(any())) + .thenReturn(transition) val wallpaperToken = MockToken().token() taskRepository.wallpaperActivityToken = wallpaperToken - val wct = WindowContainerTransaction() // The only active task is being minimized. - controller.onDesktopWindowMinimize(wct, taskId = task.taskId) + controller.minimizeTask(task) + + val captor = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) + verify(freeformTaskTransitionStarter).startMinimizedModeTransition(captor.capture()) // Adds remove wallpaper operation - wct.assertRemoveAt(index = 0, wallpaperToken) + captor.value.assertRemoveAt(index = 0, wallpaperToken) } @Test - fun onDesktopWindowMinimize_singleActiveTask_alreadyMinimized_doesntUpdateTransaction() { + fun onDesktopWindowMinimize_singleActiveTask_alreadyMinimized_doesntRemoveWallpaper() { val task = setUpFreeformTask() + val transition = Binder() + whenever(freeformTaskTransitionStarter.startMinimizedModeTransition(any())) + .thenReturn(transition) val wallpaperToken = MockToken().token() taskRepository.wallpaperActivityToken = wallpaperToken taskRepository.minimizeTask(DEFAULT_DISPLAY, task.taskId) - val wct = WindowContainerTransaction() // The only active task is already minimized. - controller.onDesktopWindowMinimize(wct, taskId = task.taskId) - // Doesn't modify transaction - assertThat(wct.hierarchyOps).isEmpty() + controller.minimizeTask(task) + + val captor = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) + verify(freeformTaskTransitionStarter).startMinimizedModeTransition(captor.capture()) + captor.value.hierarchyOps.none { hop -> + hop.type == HIERARCHY_OP_TYPE_REMOVE_TASK && hop.container == wallpaperToken.asBinder() + } } @Test - fun onDesktopWindowMinimize_multipleActiveTasks_doesntUpdateTransaction() { - val task1 = setUpFreeformTask() - setUpFreeformTask() + fun onDesktopWindowMinimize_multipleActiveTasks_doesntRemoveWallpaper() { + val task1 = setUpFreeformTask(active = true) + setUpFreeformTask(active = true) + val transition = Binder() + whenever(freeformTaskTransitionStarter.startMinimizedModeTransition(any())) + .thenReturn(transition) val wallpaperToken = MockToken().token() taskRepository.wallpaperActivityToken = wallpaperToken - val wct = WindowContainerTransaction() - controller.onDesktopWindowMinimize(wct, taskId = task1.taskId) - // Doesn't modify transaction - assertThat(wct.hierarchyOps).isEmpty() + controller.minimizeTask(task1) + + val captor = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) + verify(freeformTaskTransitionStarter).startMinimizedModeTransition(captor.capture()) + captor.value.hierarchyOps.none { hop -> + hop.type == HIERARCHY_OP_TYPE_REMOVE_TASK && hop.container == wallpaperToken.asBinder() + } } @Test fun onDesktopWindowMinimize_multipleActiveTasks_minimizesTheOnlyVisibleTask_removesWallpaper() { - val task1 = setUpFreeformTask() - val task2 = setUpFreeformTask() + val task1 = setUpFreeformTask(active = true) + val task2 = setUpFreeformTask(active = true) + val transition = Binder() + whenever(freeformTaskTransitionStarter.startMinimizedModeTransition(any())) + .thenReturn(transition) val wallpaperToken = MockToken().token() taskRepository.wallpaperActivityToken = wallpaperToken taskRepository.minimizeTask(DEFAULT_DISPLAY, task2.taskId) - val wct = WindowContainerTransaction() // task1 is the only visible task as task2 is minimized. - controller.onDesktopWindowMinimize(wct, taskId = task1.taskId) + controller.minimizeTask(task1) // Adds remove wallpaper operation - wct.assertRemoveAt(index = 0, wallpaperToken) + val captor = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) + verify(freeformTaskTransitionStarter).startMinimizedModeTransition(captor.capture()) + // Adds remove wallpaper operation + captor.value.assertRemoveAt(index = 0, wallpaperToken) + } + + @Test + fun onDesktopWindowMinimize_triesToExitImmersive() { + val task = setUpFreeformTask() + val transition = Binder() + whenever(freeformTaskTransitionStarter.startMinimizedModeTransition(any())) + .thenReturn(transition) + + controller.minimizeTask(task) + + verify(mockDesktopFullImmersiveTransitionHandler).exitImmersiveIfApplicable(any(), eq(task)) + } + + @Test + fun onDesktopWindowMinimize_invokesImmersiveTransitionStartCallback() { + val task = setUpFreeformTask() + val transition = Binder() + val runOnTransit = RunOnStartTransitionCallback() + whenever(freeformTaskTransitionStarter.startMinimizedModeTransition(any())) + .thenReturn(transition) + whenever(mockDesktopFullImmersiveTransitionHandler.exitImmersiveIfApplicable(any(), eq(task))) + .thenReturn(runOnTransit) + + controller.minimizeTask(task) + + assertThat(runOnTransit.invocations).isEqualTo(1) + assertThat(runOnTransit.lastInvoked).isEqualTo(transition) } @Test @@ -2466,6 +2535,41 @@ class DesktopTasksControllerTest : ShellTestCase() { } @Test + @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION) + fun removeDesktop_multipleTasks_removesAll() { + val task1 = setUpFreeformTask() + val task2 = setUpFreeformTask() + val task3 = setUpFreeformTask() + taskRepository.minimizeTask(DEFAULT_DISPLAY, task2.taskId) + + controller.removeDesktop(displayId = DEFAULT_DISPLAY) + + val wct = getLatestWct(TRANSIT_CLOSE) + assertThat(wct.hierarchyOps).hasSize(3) + wct.assertRemoveAt(index = 0, task1.token) + wct.assertRemoveAt(index = 1, task2.token) + wct.assertRemoveAt(index = 2, task3.token) + } + + @Test + @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_BACK_NAVIGATION) + fun removeDesktop_multipleTasksWithBackgroundTask_removesAll() { + val task1 = setUpFreeformTask() + val task2 = setUpFreeformTask() + val task3 = setUpFreeformTask() + taskRepository.minimizeTask(DEFAULT_DISPLAY, task2.taskId) + whenever(shellTaskOrganizer.getRunningTaskInfo(task3.taskId)).thenReturn(null) + + controller.removeDesktop(displayId = DEFAULT_DISPLAY) + + val wct = getLatestWct(TRANSIT_CLOSE) + assertThat(wct.hierarchyOps).hasSize(2) + wct.assertRemoveAt(index = 0, task1.token) + wct.assertRemoveAt(index = 1, task2.token) + verify(recentTasksController).removeBackgroundTask(task3.taskId) + } + + @Test @EnableFlags(Flags.FLAG_ENABLE_WINDOWING_DYNAMIC_INITIAL_BOUNDS) fun dragToDesktop_landscapeDevice_resizable_undefinedOrientation_defaultLandscapeBounds() { val spyController = spy(controller) @@ -3131,27 +3235,23 @@ class DesktopTasksControllerTest : ShellTestCase() { } @Test - fun toggleImmersive_enter_resizesToDisplayBounds() { + fun toggleImmersive_enter_movesToImmersive() { val task = setUpFreeformTask(DEFAULT_DISPLAY) taskRepository.setTaskInFullImmersiveState(DEFAULT_DISPLAY, task.taskId, false /* immersive */) controller.toggleDesktopTaskFullImmersiveState(task) - verify(mockDesktopFullImmersiveTransitionHandler).enterImmersive(eq(task), argThat { wct -> - wct.hasBoundsChange(task.token, Rect()) - }) + verify(mockDesktopFullImmersiveTransitionHandler).moveTaskToImmersive(task) } @Test - fun toggleImmersive_exit_resizesToStableBounds() { + fun toggleImmersive_exit_movesToNonImmersive() { val task = setUpFreeformTask(DEFAULT_DISPLAY) taskRepository.setTaskInFullImmersiveState(DEFAULT_DISPLAY, task.taskId, true /* immersive */) controller.toggleDesktopTaskFullImmersiveState(task) - verify(mockDesktopFullImmersiveTransitionHandler).exitImmersive(eq(task), argThat { wct -> - wct.hasBoundsChange(task.token, STABLE_BOUNDS) - }) + verify(mockDesktopFullImmersiveTransitionHandler).moveTaskToNonImmersive(task) } @Test @@ -3163,7 +3263,7 @@ class DesktopTasksControllerTest : ShellTestCase() { task.requestedVisibleTypes = WindowInsets.Type.statusBars() controller.onTaskInfoChanged(task) - verify(mockDesktopFullImmersiveTransitionHandler).exitImmersive(eq(task), any()) + verify(mockDesktopFullImmersiveTransitionHandler).moveTaskToNonImmersive(task) } @Test @@ -3175,7 +3275,113 @@ class DesktopTasksControllerTest : ShellTestCase() { task.requestedVisibleTypes = WindowInsets.Type.statusBars() controller.onTaskInfoChanged(task) - verify(mockDesktopFullImmersiveTransitionHandler, never()).exitImmersive(eq(task), any()) + verify(mockDesktopFullImmersiveTransitionHandler, never()).moveTaskToNonImmersive(task) + } + + @Test + fun moveTaskToDesktop_background_attemptsImmersiveExit() { + val task = setUpFreeformTask(background = true) + val wct = WindowContainerTransaction() + val runOnStartTransit = RunOnStartTransitionCallback() + val transition = Binder() + whenever(mockDesktopFullImmersiveTransitionHandler + .exitImmersiveIfApplicable(wct, task.displayId)).thenReturn(runOnStartTransit) + whenever(enterDesktopTransitionHandler.moveToDesktop(wct, UNKNOWN)).thenReturn(transition) + + controller.moveTaskToDesktop(taskId = task.taskId, wct = wct, transitionSource = UNKNOWN) + + verify(mockDesktopFullImmersiveTransitionHandler).exitImmersiveIfApplicable(wct, task.displayId) + runOnStartTransit.assertOnlyInvocation(transition) + } + + @Test + fun moveTaskToDesktop_foreground_attemptsImmersiveExit() { + val task = setUpFreeformTask(background = false) + val wct = WindowContainerTransaction() + val runOnStartTransit = RunOnStartTransitionCallback() + val transition = Binder() + whenever(mockDesktopFullImmersiveTransitionHandler + .exitImmersiveIfApplicable(wct, task.displayId)).thenReturn(runOnStartTransit) + whenever(enterDesktopTransitionHandler.moveToDesktop(wct, UNKNOWN)).thenReturn(transition) + + controller.moveTaskToDesktop(taskId = task.taskId, wct = wct, transitionSource = UNKNOWN) + + verify(mockDesktopFullImmersiveTransitionHandler).exitImmersiveIfApplicable(wct, task.displayId) + runOnStartTransit.assertOnlyInvocation(transition) + } + + @Test + fun moveTaskToFront_background_attemptsImmersiveExit() { + val task = setUpFreeformTask(background = true) + val runOnStartTransit = RunOnStartTransitionCallback() + val transition = Binder() + whenever(mockDesktopFullImmersiveTransitionHandler + .exitImmersiveIfApplicable(any(), eq(task.displayId))).thenReturn(runOnStartTransit) + whenever(transitions.startTransition(any(), any(), anyOrNull())).thenReturn(transition) + + controller.moveTaskToFront(task.taskId) + + verify(mockDesktopFullImmersiveTransitionHandler) + .exitImmersiveIfApplicable(any(), eq(task.displayId)) + runOnStartTransit.assertOnlyInvocation(transition) + } + + @Test + fun moveTaskToFront_foreground_attemptsImmersiveExit() { + val task = setUpFreeformTask(background = false) + val runOnStartTransit = RunOnStartTransitionCallback() + val transition = Binder() + whenever(mockDesktopFullImmersiveTransitionHandler + .exitImmersiveIfApplicable(any(), eq(task.displayId))).thenReturn(runOnStartTransit) + whenever(transitions.startTransition(any(), any(), anyOrNull())).thenReturn(transition) + + controller.moveTaskToFront(task.taskId) + + verify(mockDesktopFullImmersiveTransitionHandler) + .exitImmersiveIfApplicable(any(), eq(task.displayId)) + runOnStartTransit.assertOnlyInvocation(transition) + } + + @Test + fun handleRequest_freeformLaunchToDesktop_attemptsImmersiveExit() { + markTaskVisible(setUpFreeformTask()) + val task = setUpFreeformTask() + markTaskVisible(task) + val binder = Binder() + + controller.handleRequest(binder, createTransition(task)) + + verify(mockDesktopFullImmersiveTransitionHandler) + .exitImmersiveIfApplicable(eq(binder), any(), eq(task.displayId)) + } + + @Test + fun handleRequest_fullscreenLaunchToDesktop_attemptsImmersiveExit() { + setUpFreeformTask() + val task = setUpFullscreenTask() + val binder = Binder() + + controller.handleRequest(binder, createTransition(task)) + + verify(mockDesktopFullImmersiveTransitionHandler) + .exitImmersiveIfApplicable(eq(binder), any(), eq(task.displayId)) + } + + private class RunOnStartTransitionCallback : ((IBinder) -> Unit) { + var invocations = 0 + private set + var lastInvoked: IBinder? = null + private set + + override fun invoke(transition: IBinder) { + invocations++ + lastInvoked = transition + } + } + + private fun RunOnStartTransitionCallback.assertOnlyInvocation(transition: IBinder) { + assertThat(invocations).isEqualTo(1) + assertThat(lastInvoked).isEqualTo(transition) } /** @@ -3256,18 +3462,27 @@ class DesktopTasksControllerTest : ShellTestCase() { private fun setUpFreeformTask( displayId: Int = DEFAULT_DISPLAY, bounds: Rect? = null, - active: Boolean = true + active: Boolean = true, + background: Boolean = false, ): RunningTaskInfo { val task = createFreeformTask(displayId, bounds) val activityInfo = ActivityInfo() task.topActivityInfo = activityInfo - whenever(shellTaskOrganizer.getRunningTaskInfo(task.taskId)).thenReturn(task) + if (background) { + whenever(shellTaskOrganizer.getRunningTaskInfo(task.taskId)).thenReturn(null) + whenever(recentTasksController.findTaskInBackground(task.taskId)) + .thenReturn(createTaskInfo(task.taskId)) + } else { + whenever(shellTaskOrganizer.getRunningTaskInfo(task.taskId)).thenReturn(task) + } if (active) { taskRepository.addActiveTask(displayId, task.taskId) taskRepository.updateTaskVisibility(displayId, task.taskId, visible = true) } taskRepository.addOrMoveFreeformTaskToTop(displayId, task.taskId) - runningTasks.add(task) + if (!background) { + runningTasks.add(task) + } return task } @@ -3521,6 +3736,21 @@ private fun WindowContainerTransaction.assertRemoveAt(index: Int, token: WindowC assertThat(op.container).isEqualTo(token.asBinder()) } +private fun WindowContainerTransaction.assertNoRemoveAt(index: Int, token: WindowContainerToken) { + assertIndexInBounds(index) + val op = hierarchyOps[index] + assertThat(op.type).isEqualTo(HIERARCHY_OP_TYPE_REMOVE_TASK) + assertThat(op.container).isEqualTo(token.asBinder()) +} + +private fun WindowContainerTransaction.hasRemoveAt(index: Int, token: WindowContainerToken) { + + assertIndexInBounds(index) + val op = hierarchyOps[index] + assertThat(op.type).isEqualTo(HIERARCHY_OP_TYPE_REMOVE_TASK) + assertThat(op.container).isEqualTo(token.asBinder()) +} + private fun WindowContainerTransaction.assertPendingIntentAt(index: Int, intent: Intent) { assertIndexInBounds(index) val op = hierarchyOps[index] @@ -3543,13 +3773,6 @@ private fun WindowContainerTransaction.assertLaunchTaskAt( .isEqualTo(windowingMode) } -private fun WindowContainerTransaction.hasBoundsChange( - token: WindowContainerToken, - bounds: Rect -): Boolean = this.changes.any { change -> - change.key == token.asBinder() && change.value.configuration.windowConfiguration.bounds == bounds -} - private fun WindowContainerTransaction?.anyDensityConfigChange( token: WindowContainerToken ): Boolean { diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/freeform/FreeformTaskListenerTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/freeform/FreeformTaskListenerTests.java index 36e0427a7e22..f95b0d1e7287 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/freeform/FreeformTaskListenerTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/freeform/FreeformTaskListenerTests.java @@ -178,6 +178,7 @@ public final class FreeformTaskListenerTests extends ShellTestCase { mFreeformTaskListener.onTaskVanished(task); verify(mDesktopRepository, never()).minimizeTask(task.displayId, task.taskId); + verify(mDesktopRepository).removeClosingTask(task.taskId); verify(mDesktopRepository).removeFreeformTask(task.displayId, task.taskId); } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/freeform/FreeformTaskTransitionObserverTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/freeform/FreeformTaskTransitionObserverTest.java index 86a8502e0d85..7ae0bcd13681 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/freeform/FreeformTaskTransitionObserverTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/freeform/FreeformTaskTransitionObserverTest.java @@ -20,8 +20,8 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; import static android.view.WindowManager.TRANSIT_CHANGE; import static android.view.WindowManager.TRANSIT_CLOSE; import static android.view.WindowManager.TRANSIT_OPEN; +import static android.view.WindowManager.TRANSIT_TO_BACK; import static android.view.WindowManager.TRANSIT_TO_FRONT; -import static android.view.WindowManager.TRANSIT_CHANGE; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; @@ -43,18 +43,14 @@ import android.window.WindowContainerToken; import androidx.test.filters.SmallTest; import com.android.window.flags.Flags; - -import com.android.wm.shell.desktopmode.DesktopTaskChangeListener; import com.android.wm.shell.desktopmode.DesktopFullImmersiveTransitionHandler; import com.android.wm.shell.sysui.ShellInit; +import com.android.wm.shell.transition.FocusTransitionObserver; import com.android.wm.shell.transition.TransitionInfoBuilder; import com.android.wm.shell.transition.Transitions; import com.android.wm.shell.windowdecor.WindowDecorViewModel; -import java.util.Optional; - import org.junit.Before; -import org.junit.Rule; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.Mock; @@ -79,6 +75,9 @@ public class FreeformTaskTransitionObserverTest { private WindowDecorViewModel mWindowDecorViewModel; @Mock private TaskChangeListener mTaskChangeListener; + @Mock + private FocusTransitionObserver mFocusTransitionObserver; + private FreeformTaskTransitionObserver mTransitionObserver; @Before @@ -94,16 +93,13 @@ public class FreeformTaskTransitionObserverTest { mTransitionObserver = new FreeformTaskTransitionObserver( context, mShellInit, mTransitions, Optional.of(mDesktopFullImmersiveTransitionHandler), - mWindowDecorViewModel, Optional.of(mTaskChangeListener)); - if (Transitions.ENABLE_SHELL_TRANSITIONS) { - final ArgumentCaptor<Runnable> initRunnableCaptor = ArgumentCaptor.forClass( - Runnable.class); - verify(mShellInit).addInitCallback(initRunnableCaptor.capture(), - same(mTransitionObserver)); - initRunnableCaptor.getValue().run(); - } else { - mTransitionObserver.onInit(); - } + mWindowDecorViewModel, Optional.of(mTaskChangeListener), mFocusTransitionObserver); + + final ArgumentCaptor<Runnable> initRunnableCaptor = ArgumentCaptor.forClass( + Runnable.class); + verify(mShellInit).addInitCallback(initRunnableCaptor.capture(), + same(mTransitionObserver)); + initRunnableCaptor.getValue().run(); } @Test @@ -161,6 +157,22 @@ public class FreeformTaskTransitionObserverTest { } @Test + public void toBackTransition_notifiesOnTaskMovingToBack() { + final TransitionInfo.Change change = + createChange(TRANSIT_TO_BACK, /* taskId= */ 1, WINDOWING_MODE_FREEFORM); + final TransitionInfo info = new TransitionInfoBuilder(TRANSIT_TO_BACK, /* flags= */ 0) + .addChange(change).build(); + + final IBinder transition = mock(IBinder.class); + final SurfaceControl.Transaction startT = mock(SurfaceControl.Transaction.class); + final SurfaceControl.Transaction finishT = mock(SurfaceControl.Transaction.class); + mTransitionObserver.onTransitionReady(transition, info, startT, finishT); + mTransitionObserver.onTransitionStarting(transition); + + verify(mTaskChangeListener).onTaskMovingToBack(change.getTaskInfo()); + } + + @Test public void changeTransition_notifiesOnTaskChanging() { final TransitionInfo.Change change = createChange(TRANSIT_CHANGE, /* taskId= */ 1, WINDOWING_MODE_FREEFORM); @@ -317,7 +329,7 @@ public class FreeformTaskTransitionObserverTest { mTransitionObserver.onTransitionReady(transition, info, startT, finishT); - verify(mDesktopFullImmersiveTransitionHandler).onTransitionReady(transition); + verify(mDesktopFullImmersiveTransitionHandler).onTransitionReady(transition, info); } private static TransitionInfo.Change createChange(int mode, int taskId, int windowingMode) { diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/TaskStackTransitionObserverTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/TaskStackTransitionObserverTest.kt index 0e5efa650cc4..afdb68776d04 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/TaskStackTransitionObserverTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/recents/TaskStackTransitionObserverTest.kt @@ -114,7 +114,7 @@ class TaskStackTransitionObserverTest { @Test @EnableFlags(Flags.FLAG_ENABLE_TASK_STACK_OBSERVER_IN_SHELL) - fun taskCreated_fullscreenWindow_listenerNotNotified() { + fun taskCreated_fullscreenWindow_listenerNotified() { val listener = TestListener() val executor = TestShellExecutor() transitionObserver.addTaskStackTransitionObserverListener(listener, executor) @@ -130,9 +130,9 @@ class TaskStackTransitionObserverTest { callOnTransitionFinished() executor.flushAll() - assertThat(listener.taskInfoToBeNotified.taskId).isEqualTo(0) + assertThat(listener.taskInfoToBeNotified.taskId).isEqualTo(1) assertThat(listener.taskInfoToBeNotified.windowingMode) - .isEqualTo(WindowConfiguration.WINDOWING_MODE_UNDEFINED) + .isEqualTo(WindowConfiguration.WINDOWING_MODE_FULLSCREEN) } @Test diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/FocusTransitionObserverTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/FocusTransitionObserverTest.java index d63158c29688..015ea20767e9 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/FocusTransitionObserverTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/transition/FocusTransitionObserverTest.java @@ -23,6 +23,7 @@ import static android.window.TransitionInfo.FLAG_MOVED_TO_TOP; import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify; +import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; @@ -30,9 +31,6 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.when; import android.app.ActivityManager.RunningTaskInfo; -import android.os.Handler; -import android.os.IBinder; -import android.os.Looper; import android.os.RemoteException; import android.platform.test.annotations.RequiresFlagsEnabled; import android.platform.test.flag.junit.CheckFlagsRule; @@ -43,17 +41,11 @@ import android.window.TransitionInfo.TransitionMode; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; -import androidx.test.platform.app.InstrumentationRegistry; import com.android.window.flags.Flags; -import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.ShellTestCase; import com.android.wm.shell.TestShellExecutor; -import com.android.wm.shell.common.DisplayController; -import com.android.wm.shell.shared.IFocusTransitionListener; -import com.android.wm.shell.shared.TransactionPool; -import com.android.wm.shell.sysui.ShellController; -import com.android.wm.shell.sysui.ShellInit; +import com.android.wm.shell.shared.FocusTransitionListener; import org.junit.Before; import org.junit.Rule; @@ -75,57 +67,64 @@ public class FocusTransitionObserverTest extends ShellTestCase { @Rule public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule(); - private IFocusTransitionListener mListener; - private Transitions mTransition; + private FocusTransitionListener mListener; + private final TestShellExecutor mShellExecutor = new TestShellExecutor(); private FocusTransitionObserver mFocusTransitionObserver; @Before public void setUp() { - mListener = mock(IFocusTransitionListener.class); - when(mListener.asBinder()).thenReturn(mock(IBinder.class)); - + mListener = mock(FocusTransitionListener.class); mFocusTransitionObserver = new FocusTransitionObserver(); - mTransition = - new Transitions(InstrumentationRegistry.getInstrumentation().getTargetContext(), - mock(ShellInit.class), mock(ShellController.class), - mock(ShellTaskOrganizer.class), mock(TransactionPool.class), - mock(DisplayController.class), new TestShellExecutor(), - new Handler(Looper.getMainLooper()), new TestShellExecutor(), - mock(HomeTransitionObserver.class), - mFocusTransitionObserver); - mFocusTransitionObserver.setRemoteFocusTransitionListener(mTransition, mListener); + mFocusTransitionObserver.setLocalFocusTransitionListener(mListener, mShellExecutor); + mShellExecutor.flushAll(); + clearInvocations(mListener); } @Test - public void testOnlyDisplayChangeAffectsDisplayFocus() throws RemoteException { - final IBinder binder = mock(IBinder.class); + public void testBasicTaskAndDisplayFocusSwitch() throws RemoteException { final SurfaceControl.Transaction tx = mock(SurfaceControl.Transaction.class); - // Open a task on the secondary display, but it doesn't change display focus because it only - // has a task change. + // First, open a task on the default display. TransitionInfo info = mock(TransitionInfo.class); final List<TransitionInfo.Change> changes = new ArrayList<>(); - setupTaskChange(changes, 123 /* taskId */, TRANSIT_OPEN, SECONDARY_DISPLAY_ID, - true /* focused */); + setupTaskChange(changes, 1 /* taskId */, TRANSIT_OPEN, + DEFAULT_DISPLAY, true /* focused */); when(info.getChanges()).thenReturn(changes); - mFocusTransitionObserver.onTransitionReady(binder, info, tx, tx); - verify(mListener, never()).onFocusedDisplayChanged(SECONDARY_DISPLAY_ID); + mFocusTransitionObserver.updateFocusState(info); + mShellExecutor.flushAll(); + verify(mListener, never()).onFocusedDisplayChanged(anyInt()); + verify(mListener, times(1)).onFocusedTaskChanged(1 /* taskId */, + true /* isFocusedOnDisplay */, true /* isFocusedGlobally */); clearInvocations(mListener); - // Moving the secondary display to front must change display focus to it. - changes.clear(); + // Open a task on the secondary display. + setupTaskChange(changes, 2 /* taskId */, TRANSIT_OPEN, + SECONDARY_DISPLAY_ID, true /* focused */); setupDisplayToTopChange(changes, SECONDARY_DISPLAY_ID); when(info.getChanges()).thenReturn(changes); - mFocusTransitionObserver.onTransitionReady(binder, info, tx, tx); + mFocusTransitionObserver.updateFocusState(info); + mShellExecutor.flushAll(); verify(mListener, times(1)) .onFocusedDisplayChanged(SECONDARY_DISPLAY_ID); + verify(mListener, times(1)).onFocusedTaskChanged(1 /* taskId */, + true /* isFocusedOnDisplay */, false /* isFocusedGlobally */); + verify(mListener, times(1)).onFocusedTaskChanged(2 /* taskId */, + true /* isFocusedOnDisplay */, true /* isFocusedGlobally */); + clearInvocations(mListener); - // Moving the secondary display to front must change display focus back to it. + // Moving only the default display back to front, and verify that affected tasks are also + // notified. changes.clear(); setupDisplayToTopChange(changes, DEFAULT_DISPLAY); when(info.getChanges()).thenReturn(changes); - mFocusTransitionObserver.onTransitionReady(binder, info, tx, tx); - verify(mListener, times(1)).onFocusedDisplayChanged(DEFAULT_DISPLAY); + mFocusTransitionObserver.updateFocusState(info); + mShellExecutor.flushAll(); + verify(mListener, times(1)) + .onFocusedDisplayChanged(DEFAULT_DISPLAY); + verify(mListener, times(1)).onFocusedTaskChanged(1 /* taskId */, + true /* isFocusedOnDisplay */, true /* isFocusedGlobally */); + verify(mListener, times(1)).onFocusedTaskChanged(2 /* taskId */, + true /* isFocusedOnDisplay */, false /* isFocusedGlobally */); } private void setupTaskChange(List<TransitionInfo.Change> changes, int taskId, diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/CaptionWindowDecorationTests.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/CaptionWindowDecorationTests.kt index 0f16b9d0fa7e..5ebf5170bf86 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/CaptionWindowDecorationTests.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/CaptionWindowDecorationTests.kt @@ -49,7 +49,8 @@ class CaptionWindowDecorationTests : ShellTestCase() { false, true /* isStatusBarVisible */, false /* isKeyguardVisibleAndOccluded */, - InsetsState() + InsetsState(), + true /* hasGlobalFocus */ ) Truth.assertThat(relayoutParams.hasInputFeatureSpy()).isTrue() @@ -70,7 +71,8 @@ class CaptionWindowDecorationTests : ShellTestCase() { false, true /* isStatusBarVisible */, false /* isKeyguardVisibleAndOccluded */, - InsetsState() + InsetsState(), + true /* hasGlobalFocus */ ) Truth.assertThat(relayoutParams.hasInputFeatureSpy()).isFalse() @@ -87,7 +89,8 @@ class CaptionWindowDecorationTests : ShellTestCase() { false, true /* isStatusBarVisible */, false /* isKeyguardVisibleAndOccluded */, - InsetsState() + InsetsState(), + true /* hasGlobalFocus */ ) Truth.assertThat(relayoutParams.mOccludingCaptionElements.size).isEqualTo(2) Truth.assertThat(relayoutParams.mOccludingCaptionElements[0].mAlignment).isEqualTo( diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt index 4aa7e18b4b84..175fbd2396e3 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt @@ -100,6 +100,7 @@ import com.android.wm.shell.splitscreen.SplitScreenController import com.android.wm.shell.sysui.ShellCommandHandler import com.android.wm.shell.sysui.ShellController import com.android.wm.shell.sysui.ShellInit +import com.android.wm.shell.transition.FocusTransitionObserver import com.android.wm.shell.transition.Transitions import com.android.wm.shell.windowdecor.DesktopModeWindowDecorViewModel.DesktopModeKeyguardChangeListener import com.android.wm.shell.windowdecor.DesktopModeWindowDecorViewModel.DesktopModeOnInsetsChangedListener @@ -126,7 +127,6 @@ import org.mockito.Mockito.never import org.mockito.Mockito.times import org.mockito.kotlin.verify import org.mockito.kotlin.any -import org.mockito.kotlin.anyOrNull import org.mockito.kotlin.argThat import org.mockito.kotlin.argumentCaptor import org.mockito.kotlin.doNothing @@ -192,6 +192,7 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() { DesktopModeWindowDecorViewModel.TaskPositionerFactory @Mock private lateinit var mockTaskPositioner: TaskPositioner @Mock private lateinit var mockAppHandleEducationController: AppHandleEducationController + @Mock private lateinit var mockFocusTransitionObserver: FocusTransitionObserver @Mock private lateinit var mockCaptionHandleRepository: WindowDecorCaptionHandleRepository private lateinit var spyContext: TestableContext @@ -254,7 +255,8 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() { mockAppHandleEducationController, mockCaptionHandleRepository, Optional.of(mockActivityOrientationChangeHandler), - mockTaskPositionerFactory + mockTaskPositionerFactory, + mockFocusTransitionObserver ) desktopModeWindowDecorViewModel.setSplitScreenController(mockSplitScreenController) whenever(mockDisplayController.getDisplayLayout(any())).thenReturn(mockDisplayLayout) @@ -455,24 +457,13 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() { onClickListenerCaptor.value.onClick(view) - val transactionCaptor = argumentCaptor<WindowContainerTransaction>() - verify(mockFreeformTaskTransitionStarter) - .startMinimizedModeTransition(transactionCaptor.capture()) - val wct = transactionCaptor.firstValue - - verify(mockTasksLimiter).addPendingMinimizeChange( - anyOrNull(), eq(DEFAULT_DISPLAY), eq(decor.mTaskInfo.taskId)) - - assertEquals(1, wct.getHierarchyOps().size) - assertEquals(HierarchyOp.HIERARCHY_OP_TYPE_REORDER, wct.getHierarchyOps().get(0).getType()) - assertFalse(wct.getHierarchyOps().get(0).getToTop()) - assertEquals(decor.mTaskInfo.token.asBinder(), wct.getHierarchyOps().get(0).getContainer()) + verify(mockDesktopTasksController).minimizeTask(decor.mTaskInfo) } @Test @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODALS_POLICY) fun testDecorationIsCreatedForTopTranslucentActivitiesWithStyleFloating() { - val task = createTask(windowingMode = WINDOWING_MODE_FULLSCREEN, focused = true).apply { + val task = createTask(windowingMode = WINDOWING_MODE_FULLSCREEN).apply { isTopActivityTransparent = true isTopActivityStyleFloating = true numActivities = 1 @@ -487,7 +478,7 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() { @Test @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODALS_POLICY) fun testDecorationIsNotCreatedForTopTranslucentActivitiesWithoutStyleFloating() { - val task = createTask(windowingMode = WINDOWING_MODE_FULLSCREEN, focused = true).apply { + val task = createTask(windowingMode = WINDOWING_MODE_FULLSCREEN).apply { isTopActivityTransparent = true isTopActivityStyleFloating = false numActivities = 1 @@ -500,7 +491,7 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() { @Test @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODALS_POLICY) fun testDecorationIsNotCreatedForSystemUIActivities() { - val task = createTask(windowingMode = WINDOWING_MODE_FULLSCREEN, focused = true) + val task = createTask(windowingMode = WINDOWING_MODE_FULLSCREEN) // Set task as systemUI package val systemUIPackageName = context.resources.getString( @@ -573,7 +564,7 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() { // Simulate default enforce device restrictions system property whenever(DesktopModeStatus.enforceDeviceRestrictions()).thenReturn(true) - val task = createTask(windowingMode = WINDOWING_MODE_FULLSCREEN, focused = true) + val task = createTask(windowingMode = WINDOWING_MODE_FULLSCREEN) // Simulate device that doesn't support desktop mode doReturn(false).`when` { DesktopModeStatus.isDesktopModeSupported(any()) } @@ -589,7 +580,7 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() { // Simulate device that doesn't support desktop mode doReturn(false).`when` { DesktopModeStatus.isDesktopModeSupported(any()) } - val task = createTask(windowingMode = WINDOWING_MODE_FULLSCREEN, focused = true) + val task = createTask(windowingMode = WINDOWING_MODE_FULLSCREEN) setUpMockDecorationsForTasks(task) onTaskOpening(task) @@ -602,7 +593,7 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() { // Simulate default enforce device restrictions system property whenever(DesktopModeStatus.enforceDeviceRestrictions()).thenReturn(true) - val task = createTask(windowingMode = WINDOWING_MODE_FULLSCREEN, focused = true) + val task = createTask(windowingMode = WINDOWING_MODE_FULLSCREEN) doReturn(true).`when` { DesktopModeStatus.isDesktopModeSupported(any()) } setUpMockDecorationsForTasks(task) @@ -1045,7 +1036,7 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() { @Test fun testOnDisplayRotation_tasksOutOfValidArea_taskBoundsUpdated() { - val task = createTask(focused = true, windowingMode = WINDOWING_MODE_FREEFORM) + val task = createTask(windowingMode = WINDOWING_MODE_FREEFORM) val secondTask = createTask(displayId = task.displayId, windowingMode = WINDOWING_MODE_FREEFORM) val thirdTask = @@ -1073,7 +1064,7 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() { @Test fun testOnDisplayRotation_taskInValidArea_taskBoundsNotUpdated() { - val task = createTask(focused = true, windowingMode = WINDOWING_MODE_FREEFORM) + val task = createTask(windowingMode = WINDOWING_MODE_FREEFORM) val secondTask = createTask(displayId = task.displayId, windowingMode = WINDOWING_MODE_FREEFORM) val thirdTask = @@ -1100,7 +1091,7 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() { @Test fun testOnDisplayRotation_sameOrientationRotation_taskBoundsNotUpdated() { - val task = createTask(focused = true, windowingMode = WINDOWING_MODE_FREEFORM) + val task = createTask(windowingMode = WINDOWING_MODE_FREEFORM) val secondTask = createTask(displayId = task.displayId, windowingMode = WINDOWING_MODE_FREEFORM) val thirdTask = @@ -1124,7 +1115,7 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() { @Test fun testOnDisplayRotation_differentDisplayId_taskBoundsNotUpdated() { - val task = createTask(focused = true, windowingMode = WINDOWING_MODE_FREEFORM) + val task = createTask(windowingMode = WINDOWING_MODE_FREEFORM) val secondTask = createTask(displayId = -2, windowingMode = WINDOWING_MODE_FREEFORM) val thirdTask = createTask(displayId = -3, windowingMode = WINDOWING_MODE_FREEFORM) @@ -1149,7 +1140,7 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() { @Test fun testOnDisplayRotation_nonFreeformTask_taskBoundsNotUpdated() { - val task = createTask(focused = true, windowingMode = WINDOWING_MODE_FREEFORM) + val task = createTask(windowingMode = WINDOWING_MODE_FREEFORM) val secondTask = createTask(displayId = -2, windowingMode = WINDOWING_MODE_FULLSCREEN) val thirdTask = createTask(displayId = -3, windowingMode = WINDOWING_MODE_PINNED) @@ -1322,7 +1313,6 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() { displayId: Int = DEFAULT_DISPLAY, @WindowingMode windowingMode: Int, activityType: Int = ACTIVITY_TYPE_STANDARD, - focused: Boolean = true, activityInfo: ActivityInfo = ActivityInfo(), requestingImmersive: Boolean = false ): RunningTaskInfo { @@ -1333,7 +1323,6 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() { .setActivityType(activityType) .build().apply { topActivityInfo = activityInfo - isFocused = focused isResizeable = true requestedVisibleTypes = if (requestingImmersive) { statusBars().inv() @@ -1351,7 +1340,6 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() { any(), any(), any(), any(), any(), any(), any()) ).thenReturn(decoration) decoration.mTaskInfo = task - whenever(decoration.isFocused).thenReturn(task.isFocused) whenever(decoration.user).thenReturn(mockUserHandle) if (task.windowingMode == WINDOWING_MODE_MULTI_WINDOW) { whenever(mockSplitScreenController.isTaskInSplitScreen(task.taskId)) diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java index 35be80e87ecd..1d11d2e8ff06 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java @@ -279,7 +279,7 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { final DesktopModeWindowDecoration spyWindowDecor = spy(createWindowDecoration(taskInfo)); - spyWindowDecor.relayout(taskInfo); + spyWindowDecor.relayout(taskInfo, false /* hasGlobalFocus */); // Menus should close if open before the task being invisible causes relayout to return. verify(spyWindowDecor).closeHandleMenu(); @@ -298,7 +298,8 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { /* isStatusBarVisible */ true, /* isKeyguardVisibleAndOccluded */ false, /* inFullImmersiveMode */ false, - new InsetsState()); + new InsetsState(), + /* hasGlobalFocus= */ true); assertThat(relayoutParams.mShadowRadiusId).isNotEqualTo(Resources.ID_NULL); } @@ -318,7 +319,8 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { /* isStatusBarVisible */ true, /* isKeyguardVisibleAndOccluded */ false, /* inFullImmersiveMode */ false, - new InsetsState()); + new InsetsState(), + /* hasGlobalFocus= */ true); assertThat(relayoutParams.mCornerRadius).isGreaterThan(0); } @@ -343,7 +345,8 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { /* isStatusBarVisible */ true, /* isKeyguardVisibleAndOccluded */ false, /* inFullImmersiveMode */ false, - new InsetsState()); + new InsetsState(), + /* hasGlobalFocus= */ true); assertThat(relayoutParams.mWindowDecorConfig.densityDpi).isEqualTo(customTaskDensity); } @@ -369,7 +372,8 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { /* isStatusBarVisible */ true, /* isKeyguardVisibleAndOccluded */ false, /* inFullImmersiveMode */ false, - new InsetsState()); + new InsetsState(), + /* hasGlobalFocus= */ true); assertThat(relayoutParams.mWindowDecorConfig.densityDpi).isEqualTo(systemDensity); } @@ -391,7 +395,8 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { /* isStatusBarVisible */ true, /* isKeyguardVisibleAndOccluded */ false, /* inFullImmersiveMode */ false, - new InsetsState()); + new InsetsState(), + /* hasGlobalFocus= */ true); assertThat(relayoutParams.hasInputFeatureSpy()).isTrue(); } @@ -412,7 +417,8 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { /* isStatusBarVisible */ true, /* isKeyguardVisibleAndOccluded */ false, /* inFullImmersiveMode */ false, - new InsetsState()); + new InsetsState(), + /* hasGlobalFocus= */ true); assertThat(relayoutParams.hasInputFeatureSpy()).isFalse(); } @@ -432,7 +438,8 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { /* isStatusBarVisible */ true, /* isKeyguardVisibleAndOccluded */ false, /* inFullImmersiveMode */ false, - new InsetsState()); + new InsetsState(), + /* hasGlobalFocus= */ true); assertThat(relayoutParams.hasInputFeatureSpy()).isFalse(); } @@ -452,7 +459,8 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { /* isStatusBarVisible */ true, /* isKeyguardVisibleAndOccluded */ false, /* inFullImmersiveMode */ false, - new InsetsState()); + new InsetsState(), + /* hasGlobalFocus= */ true); assertThat(hasNoInputChannelFeature(relayoutParams)).isFalse(); } @@ -473,7 +481,8 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { /* isStatusBarVisible */ true, /* isKeyguardVisibleAndOccluded */ false, /* inFullImmersiveMode */ false, - new InsetsState()); + new InsetsState(), + /* hasGlobalFocus= */ true); assertThat(hasNoInputChannelFeature(relayoutParams)).isTrue(); } @@ -494,7 +503,8 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { /* isStatusBarVisible */ true, /* isKeyguardVisibleAndOccluded */ false, /* inFullImmersiveMode */ false, - new InsetsState()); + new InsetsState(), + /* hasGlobalFocus= */ true); assertThat(hasNoInputChannelFeature(relayoutParams)).isTrue(); } @@ -516,7 +526,8 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { /* isStatusBarVisible */ true, /* isKeyguardVisibleAndOccluded */ false, /* inFullImmersiveMode */ false, - new InsetsState()); + new InsetsState(), + /* hasGlobalFocus= */ true); assertThat((relayoutParams.mInsetSourceFlags & FLAG_FORCE_CONSUMING) != 0).isTrue(); } @@ -539,7 +550,8 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { /* isStatusBarVisible */ true, /* isKeyguardVisibleAndOccluded */ false, /* inFullImmersiveMode */ false, - new InsetsState()); + new InsetsState(), + /* hasGlobalFocus= */ true); assertThat((relayoutParams.mInsetSourceFlags & FLAG_FORCE_CONSUMING) == 0).isTrue(); } @@ -560,7 +572,8 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { /* isStatusBarVisible */ true, /* isKeyguardVisibleAndOccluded */ false, /* inFullImmersiveMode */ false, - new InsetsState()); + new InsetsState(), + /* hasGlobalFocus= */ true); assertThat( (relayoutParams.mInsetSourceFlags & FLAG_FORCE_CONSUMING_OPAQUE_CAPTION_BAR) != 0) @@ -583,7 +596,8 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { /* isStatusBarVisible */ true, /* isKeyguardVisibleAndOccluded */ false, /* inFullImmersiveMode */ false, - new InsetsState()); + new InsetsState(), + /* hasGlobalFocus= */ true); assertThat( (relayoutParams.mInsetSourceFlags & FLAG_FORCE_CONSUMING_OPAQUE_CAPTION_BAR) == 0) @@ -612,7 +626,8 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { /* isStatusBarVisible */ true, /* isKeyguardVisibleAndOccluded */ false, /* inFullImmersiveMode */ true, - insetsState); + insetsState, + /* hasGlobalFocus= */ true); // Takes status bar inset as padding, ignores caption bar inset. assertThat(relayoutParams.mCaptionTopPadding).isEqualTo(50); @@ -634,7 +649,8 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { /* isStatusBarVisible */ true, /* isKeyguardVisibleAndOccluded */ false, /* inFullImmersiveMode */ true, - new InsetsState()); + new InsetsState(), + /* hasGlobalFocus= */ true); assertThat(relayoutParams.mIsInsetSource).isFalse(); } @@ -655,7 +671,8 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { /* isStatusBarVisible */ false, /* isKeyguardVisibleAndOccluded */ false, /* inFullImmersiveMode */ false, - new InsetsState()); + new InsetsState(), + /* hasGlobalFocus= */ true); // Header is always shown because it's assumed the status bar is always visible. assertThat(relayoutParams.mIsCaptionVisible).isTrue(); @@ -676,7 +693,8 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { /* isStatusBarVisible */ true, /* isKeyguardVisibleAndOccluded */ false, /* inFullImmersiveMode */ false, - new InsetsState()); + new InsetsState(), + /* hasGlobalFocus= */ true); assertThat(relayoutParams.mIsCaptionVisible).isTrue(); } @@ -696,7 +714,8 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { /* isStatusBarVisible */ false, /* isKeyguardVisibleAndOccluded */ false, /* inFullImmersiveMode */ false, - new InsetsState()); + new InsetsState(), + /* hasGlobalFocus= */ true); assertThat(relayoutParams.mIsCaptionVisible).isFalse(); } @@ -716,7 +735,8 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { /* isStatusBarVisible */ true, /* isKeyguardVisibleAndOccluded */ true, /* inFullImmersiveMode */ false, - new InsetsState()); + new InsetsState(), + /* hasGlobalFocus= */ true); assertThat(relayoutParams.mIsCaptionVisible).isFalse(); } @@ -737,7 +757,8 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { /* isStatusBarVisible */ true, /* isKeyguardVisibleAndOccluded */ false, /* inFullImmersiveMode */ true, - new InsetsState()); + new InsetsState(), + /* hasGlobalFocus= */ true); assertThat(relayoutParams.mIsCaptionVisible).isTrue(); @@ -750,7 +771,8 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { /* isStatusBarVisible */ false, /* isKeyguardVisibleAndOccluded */ false, /* inFullImmersiveMode */ true, - new InsetsState()); + new InsetsState(), + /* hasGlobalFocus= */ true); assertThat(relayoutParams.mIsCaptionVisible).isFalse(); } @@ -771,7 +793,8 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { /* isStatusBarVisible */ true, /* isKeyguardVisibleAndOccluded */ true, /* inFullImmersiveMode */ true, - new InsetsState()); + new InsetsState(), + /* hasGlobalFocus= */ true); assertThat(relayoutParams.mIsCaptionVisible).isFalse(); } @@ -782,7 +805,7 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { final DesktopModeWindowDecoration spyWindowDecor = spy(createWindowDecoration(taskInfo)); taskInfo.configuration.windowConfiguration.setWindowingMode(WINDOWING_MODE_FULLSCREEN); - spyWindowDecor.relayout(taskInfo); + spyWindowDecor.relayout(taskInfo, true /* hasGlobalFocus */); verify(mMockTransaction).apply(); verify(mMockRootSurfaceControl, never()).applyTransactionOnDraw(any()); @@ -797,7 +820,7 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { // Make non-resizable to avoid dealing with input-permissions (MONITOR_INPUT) taskInfo.isResizeable = false; - spyWindowDecor.relayout(taskInfo); + spyWindowDecor.relayout(taskInfo, true /* hasGlobalFocus */); verify(mMockTransaction, never()).apply(); verify(mMockRootSurfaceControl).applyTransactionOnDraw(mMockTransaction); @@ -809,7 +832,7 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { final DesktopModeWindowDecoration spyWindowDecor = spy(createWindowDecoration(taskInfo)); taskInfo.configuration.windowConfiguration.setWindowingMode(WINDOWING_MODE_FULLSCREEN); - spyWindowDecor.relayout(taskInfo); + spyWindowDecor.relayout(taskInfo, true /* hasGlobalFocus */); verify(mMockSurfaceControlViewHostFactory, never()).create(any(), any(), any()); } @@ -821,7 +844,7 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { taskInfo.configuration.windowConfiguration.setWindowingMode(WINDOWING_MODE_FULLSCREEN); ArgumentCaptor<Runnable> runnableArgument = ArgumentCaptor.forClass(Runnable.class); - spyWindowDecor.relayout(taskInfo); + spyWindowDecor.relayout(taskInfo, true /* hasGlobalFocus */); // Once for view host, the other for the AppHandle input layer. verify(mMockHandler, times(2)).post(runnableArgument.capture()); @@ -838,7 +861,7 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { // Make non-resizable to avoid dealing with input-permissions (MONITOR_INPUT) taskInfo.isResizeable = false; - spyWindowDecor.relayout(taskInfo); + spyWindowDecor.relayout(taskInfo, true /* hasGlobalFocus */); verify(mMockSurfaceControlViewHostFactory).create(any(), any(), any()); verify(mMockHandler, never()).post(any()); @@ -850,11 +873,11 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { final DesktopModeWindowDecoration spyWindowDecor = spy(createWindowDecoration(taskInfo)); taskInfo.configuration.windowConfiguration.setWindowingMode(WINDOWING_MODE_FULLSCREEN); ArgumentCaptor<Runnable> runnableArgument = ArgumentCaptor.forClass(Runnable.class); - spyWindowDecor.relayout(taskInfo); + spyWindowDecor.relayout(taskInfo, true /* hasGlobalFocus */); // Once for view host, the other for the AppHandle input layer. verify(mMockHandler, times(2)).post(runnableArgument.capture()); - spyWindowDecor.relayout(taskInfo); + spyWindowDecor.relayout(taskInfo, true /* hasGlobalFocus */); verify(mMockHandler).removeCallbacks(runnableArgument.getValue()); } @@ -865,7 +888,7 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { final DesktopModeWindowDecoration spyWindowDecor = spy(createWindowDecoration(taskInfo)); taskInfo.configuration.windowConfiguration.setWindowingMode(WINDOWING_MODE_FULLSCREEN); ArgumentCaptor<Runnable> runnableArgument = ArgumentCaptor.forClass(Runnable.class); - spyWindowDecor.relayout(taskInfo); + spyWindowDecor.relayout(taskInfo, true /* hasGlobalFocus */); // Once for view host, the other for the AppHandle input layer. verify(mMockHandler, times(2)).post(runnableArgument.capture()); @@ -998,7 +1021,7 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { runnableArgument.getValue().run(); // Relayout decor with same captured link - decor.relayout(taskInfo); + decor.relayout(taskInfo, true /* hasGlobalFocus */); // Verify handle menu's browser link not set to captured link since link is expired createHandleMenu(decor); @@ -1147,7 +1170,7 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { final DesktopModeWindowDecoration spyWindowDecor = spy(createWindowDecoration(taskInfo)); taskInfo.configuration.windowConfiguration.setWindowingMode(WINDOWING_MODE_FULLSCREEN); - spyWindowDecor.relayout(taskInfo); + spyWindowDecor.relayout(taskInfo, true /* hasGlobalFocus */); verify(mMockCaptionHandleRepository, never()).notifyCaptionChanged(any()); } @@ -1164,7 +1187,7 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { ArgumentCaptor<CaptionState> captionStateArgumentCaptor = ArgumentCaptor.forClass( CaptionState.class); - spyWindowDecor.relayout(taskInfo); + spyWindowDecor.relayout(taskInfo, true /* hasGlobalFocus */); verify(mMockCaptionHandleRepository, atLeastOnce()).notifyCaptionChanged( captionStateArgumentCaptor.capture()); @@ -1191,7 +1214,7 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { ArgumentCaptor<CaptionState> captionStateArgumentCaptor = ArgumentCaptor.forClass( CaptionState.class); - spyWindowDecor.relayout(taskInfo); + spyWindowDecor.relayout(taskInfo, true /* hasGlobalFocus */); verify(mMockAppHeaderViewHolder, atLeastOnce()).runOnAppChipGlobalLayout( runnableArgumentCaptor.capture()); runnableArgumentCaptor.getValue().invoke(); @@ -1214,7 +1237,7 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { ArgumentCaptor<CaptionState> captionStateArgumentCaptor = ArgumentCaptor.forClass( CaptionState.class); - spyWindowDecor.relayout(taskInfo); + spyWindowDecor.relayout(taskInfo, false /* hasGlobalFocus */); verify(mMockCaptionHandleRepository, atLeastOnce()).notifyCaptionChanged( captionStateArgumentCaptor.capture()); @@ -1234,7 +1257,7 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { ArgumentCaptor<CaptionState> captionStateArgumentCaptor = ArgumentCaptor.forClass( CaptionState.class); - spyWindowDecor.relayout(taskInfo); + spyWindowDecor.relayout(taskInfo, true /* hasGlobalFocus */); createHandleMenu(spyWindowDecor); verify(mMockCaptionHandleRepository, atLeastOnce()).notifyCaptionChanged( @@ -1259,7 +1282,7 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { ArgumentCaptor<CaptionState> captionStateArgumentCaptor = ArgumentCaptor.forClass( CaptionState.class); - spyWindowDecor.relayout(taskInfo); + spyWindowDecor.relayout(taskInfo, true /* hasGlobalFocus */); createHandleMenu(spyWindowDecor); spyWindowDecor.closeHandleMenu(); @@ -1356,7 +1379,7 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { windowDecor.setOpenInBrowserClickListener(mMockOpenInBrowserClickListener); windowDecor.mDecorWindowContext = mContext; if (relayout) { - windowDecor.relayout(taskInfo); + windowDecor.relayout(taskInfo, true /* hasGlobalFocus */); } return windowDecor; } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/FluidResizeTaskPositionerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/FluidResizeTaskPositionerTest.kt index 7543fed4b085..ca1f9abed09e 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/FluidResizeTaskPositionerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/FluidResizeTaskPositionerTest.kt @@ -624,7 +624,7 @@ class FluidResizeTaskPositionerTest : ShellTestCase() { @Test fun testDragResize_resize_resizingTaskReorderedToTopWhenNotFocused() { - mockWindowDecoration.mTaskInfo.isFocused = false + mockWindowDecoration.mHasGlobalFocus = false taskPositioner.onDragPositioningStart( CTRL_TYPE_RIGHT, // Resize right STARTING_BOUNDS.left.toFloat(), @@ -640,7 +640,7 @@ class FluidResizeTaskPositionerTest : ShellTestCase() { @Test fun testDragResize_resize_resizingTaskNotReorderedToTopWhenFocused() { - mockWindowDecoration.mTaskInfo.isFocused = true + mockWindowDecoration.mHasGlobalFocus = true taskPositioner.onDragPositioningStart( CTRL_TYPE_RIGHT, // Resize right STARTING_BOUNDS.left.toFloat(), @@ -656,7 +656,7 @@ class FluidResizeTaskPositionerTest : ShellTestCase() { @Test fun testDragResize_drag_draggedTaskNotReorderedToTop() { - mockWindowDecoration.mTaskInfo.isFocused = false + mockWindowDecoration.mHasGlobalFocus = false taskPositioner.onDragPositioningStart( CTRL_TYPE_UNDEFINED, // drag STARTING_BOUNDS.left.toFloat(), diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/VeiledResizeTaskPositionerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/VeiledResizeTaskPositionerTest.kt index 1273ee823159..1dfbd6705bf4 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/VeiledResizeTaskPositionerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/VeiledResizeTaskPositionerTest.kt @@ -323,7 +323,7 @@ class VeiledResizeTaskPositionerTest : ShellTestCase() { @Test fun testDragResize_resize_resizingTaskReorderedToTopWhenNotFocused() = runOnUiThread { - mockDesktopWindowDecoration.mTaskInfo.isFocused = false + mockDesktopWindowDecoration.mHasGlobalFocus = false taskPositioner.onDragPositioningStart( CTRL_TYPE_RIGHT, // Resize right STARTING_BOUNDS.left.toFloat(), @@ -339,7 +339,7 @@ class VeiledResizeTaskPositionerTest : ShellTestCase() { @Test fun testDragResize_resize_resizingTaskNotReorderedToTopWhenFocused() = runOnUiThread { - mockDesktopWindowDecoration.mTaskInfo.isFocused = true + mockDesktopWindowDecoration.mHasGlobalFocus = true taskPositioner.onDragPositioningStart( CTRL_TYPE_RIGHT, // Resize right STARTING_BOUNDS.left.toFloat(), @@ -355,7 +355,7 @@ class VeiledResizeTaskPositionerTest : ShellTestCase() { @Test fun testDragResize_drag_draggedTaskNotReorderedToTop() = runOnUiThread { - mockDesktopWindowDecoration.mTaskInfo.isFocused = false + mockDesktopWindowDecoration.mHasGlobalFocus = false taskPositioner.onDragPositioningStart( CTRL_TYPE_UNDEFINED, // drag STARTING_BOUNDS.left.toFloat(), diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/WindowDecorationTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/WindowDecorationTests.java index 54dd15baa4c0..bb41e9c81ece 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/WindowDecorationTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/WindowDecorationTests.java @@ -203,13 +203,12 @@ public class WindowDecorationTests extends ShellTestCase { .setPositionInParent(TASK_POSITION_IN_PARENT.x, TASK_POSITION_IN_PARENT.y) .setVisible(false) .build(); - taskInfo.isFocused = false; // Density is 2. Shadow radius is 10px. Caption height is 64px. taskInfo.configuration.densityDpi = DisplayMetrics.DENSITY_DEFAULT * 2; final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo); - windowDecor.relayout(taskInfo); + windowDecor.relayout(taskInfo, false /* hasGlobalFocus */); verify(decorContainerSurfaceBuilder, never()).build(); verify(taskBackgroundSurfaceBuilder, never()).build(); @@ -243,13 +242,12 @@ public class WindowDecorationTests extends ShellTestCase { .setVisible(true) .setWindowingMode(WINDOWING_MODE_FREEFORM) .build(); - taskInfo.isFocused = true; // Density is 2. Shadow radius is 10px. Caption height is 64px. taskInfo.configuration.densityDpi = DisplayMetrics.DENSITY_DEFAULT * 2; final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo); mRelayoutParams.mIsCaptionVisible = true; - windowDecor.relayout(taskInfo); + windowDecor.relayout(taskInfo, true /* hasGlobalFocus */); verify(decorContainerSurfaceBuilder).setParent(mMockTaskSurface); verify(decorContainerSurfaceBuilder).setContainerLayer(); @@ -316,14 +314,13 @@ public class WindowDecorationTests extends ShellTestCase { .setPositionInParent(TASK_POSITION_IN_PARENT.x, TASK_POSITION_IN_PARENT.y) .setVisible(true) .build(); - taskInfo.isFocused = true; // Density is 2. Shadow radius is 10px. Caption height is 64px. taskInfo.configuration.densityDpi = DisplayMetrics.DENSITY_DEFAULT * 2; final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo); mRelayoutParams.mIsCaptionVisible = true; - windowDecor.relayout(taskInfo); + windowDecor.relayout(taskInfo, true /* hasGlobalFocus */); verify(mMockSurfaceControlViewHost, never()).release(); verify(t, never()).apply(); @@ -333,7 +330,7 @@ public class WindowDecorationTests extends ShellTestCase { final SurfaceControl.Transaction t2 = mock(SurfaceControl.Transaction.class); mMockSurfaceControlTransactions.add(t2); taskInfo.isVisible = false; - windowDecor.relayout(taskInfo); + windowDecor.relayout(taskInfo, false /* hasGlobalFocus */); final InOrder releaseOrder = inOrder(t2, mMockSurfaceControlViewHost); releaseOrder.verify(mMockSurfaceControlViewHost).release(); @@ -361,7 +358,7 @@ public class WindowDecorationTests extends ShellTestCase { .build(); final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo); - windowDecor.relayout(taskInfo); + windowDecor.relayout(taskInfo, true /* hasGlobalFocus */); // It shouldn't show the window decoration when it can't obtain the display instance. assertThat(mRelayoutResult.mRootView).isNull(); @@ -417,10 +414,9 @@ public class WindowDecorationTests extends ShellTestCase { .setPositionInParent(TASK_POSITION_IN_PARENT.x, TASK_POSITION_IN_PARENT.y) .setVisible(true) .build(); - taskInfo.isFocused = true; taskInfo.configuration.densityDpi = DisplayMetrics.DENSITY_DEFAULT * 2; final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo); - windowDecor.relayout(taskInfo); + windowDecor.relayout(taskInfo, true /* hasGlobalFocus */); final SurfaceControl additionalWindowSurface = mock(SurfaceControl.class); final SurfaceControl.Builder additionalWindowSurfaceBuilder = @@ -470,11 +466,10 @@ public class WindowDecorationTests extends ShellTestCase { .setPositionInParent(TASK_POSITION_IN_PARENT.x, TASK_POSITION_IN_PARENT.y) .setVisible(true) .build(); - taskInfo.isFocused = true; taskInfo.configuration.densityDpi = DisplayMetrics.DENSITY_DEFAULT * 2; final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo); - windowDecor.relayout(taskInfo); + windowDecor.relayout(taskInfo, true /* hasGlobalFocus */); verify(captionContainerSurfaceBuilder).setParent(decorContainerSurface); verify(captionContainerSurfaceBuilder).setContainerLayer(); @@ -510,11 +505,11 @@ public class WindowDecorationTests extends ShellTestCase { .setPositionInParent(TASK_POSITION_IN_PARENT.x, TASK_POSITION_IN_PARENT.y) .setVisible(true) .build(); - taskInfo.isFocused = true; taskInfo.configuration.densityDpi = DisplayMetrics.DENSITY_DEFAULT * 2; final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo); - windowDecor.relayout(taskInfo, true /* applyStartTransactionOnDraw */); + windowDecor.relayout(taskInfo, true /* applyStartTransactionOnDraw */, + true /* hasGlobalFocus */); verify(mMockRootSurfaceControl).applyTransactionOnDraw(mMockSurfaceControlStartT); } @@ -549,10 +544,9 @@ public class WindowDecorationTests extends ShellTestCase { .setVisible(true) .setWindowingMode(WINDOWING_MODE_FREEFORM) .build(); - taskInfo.isFocused = true; final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo); - windowDecor.relayout(taskInfo); + windowDecor.relayout(taskInfo, true /* hasGlobalFocus */); verify(mMockSurfaceControlStartT).setColor(mMockTaskSurface, new float[]{1.f, 1.f, 0.f}); @@ -575,7 +569,7 @@ public class WindowDecorationTests extends ShellTestCase { final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo); mRelayoutParams.mIsCaptionVisible = true; - windowDecor.relayout(taskInfo); + windowDecor.relayout(taskInfo, true /* hasGlobalFocus */); verify(mMockWindowContainerTransaction).addInsetsSource(eq(taskInfo.token), any(), eq(0) /* index */, eq(captionBar()), any(), any(), anyInt()); @@ -611,10 +605,9 @@ public class WindowDecorationTests extends ShellTestCase { .setVisible(true) .setWindowingMode(WINDOWING_MODE_FULLSCREEN) .build(); - taskInfo.isFocused = true; final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo); - windowDecor.relayout(taskInfo); + windowDecor.relayout(taskInfo, true /* hasGlobalFocus */); verify(mMockSurfaceControlStartT).unsetColor(mMockTaskSurface); @@ -635,7 +628,7 @@ public class WindowDecorationTests extends ShellTestCase { // Hidden from the beginning, so no insets were ever added. final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo); mRelayoutParams.mIsCaptionVisible = false; - windowDecor.relayout(taskInfo); + windowDecor.relayout(taskInfo, true /* hasGlobalFocus */); // Never added. verify(mMockWindowContainerTransaction, never()).addInsetsSource(eq(taskInfo.token), any(), @@ -663,7 +656,7 @@ public class WindowDecorationTests extends ShellTestCase { final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo); mRelayoutParams.mIsInsetSource = false; - windowDecor.relayout(taskInfo); + windowDecor.relayout(taskInfo, true /* hasGlobalFocus */); // Never added. verify(mMockWindowContainerTransaction, never()).addInsetsSource(eq(taskInfo.token), any(), @@ -687,11 +680,11 @@ public class WindowDecorationTests extends ShellTestCase { mRelayoutParams.mIsCaptionVisible = true; mRelayoutParams.mIsInsetSource = true; - windowDecor.relayout(taskInfo); + windowDecor.relayout(taskInfo, true /* hasGlobalFocus */); mRelayoutParams.mIsCaptionVisible = true; mRelayoutParams.mIsInsetSource = false; - windowDecor.relayout(taskInfo); + windowDecor.relayout(taskInfo, true /* hasGlobalFocus */); // Insets should be removed. verify(mMockWindowContainerTransaction).removeInsetsSource(eq(taskInfo.token), any(), @@ -715,7 +708,7 @@ public class WindowDecorationTests extends ShellTestCase { // Relayout will add insets. mRelayoutParams.mIsCaptionVisible = true; - windowDecor.relayout(taskInfo); + windowDecor.relayout(taskInfo, true /* hasGlobalFocus */); verify(mMockWindowContainerTransaction).addInsetsSource(eq(taskInfo.token), any(), eq(0) /* index */, eq(captionBar()), any(), any(), anyInt()); verify(mMockWindowContainerTransaction).addInsetsSource(eq(taskInfo.token), any(), @@ -768,10 +761,10 @@ public class WindowDecorationTests extends ShellTestCase { final ActivityManager.RunningTaskInfo firstTaskInfo = builder.setToken(token).setBounds(new Rect(0, 0, 1000, 1000)).build(); final TestWindowDecoration windowDecor = createWindowDecoration(firstTaskInfo); - windowDecor.relayout(firstTaskInfo); + windowDecor.relayout(firstTaskInfo, true /* hasGlobalFocus */); final ActivityManager.RunningTaskInfo secondTaskInfo = builder.setToken(token).setBounds(new Rect(50, 50, 1000, 1000)).build(); - windowDecor.relayout(secondTaskInfo); + windowDecor.relayout(secondTaskInfo, true /* hasGlobalFocus */); // Insets should be applied twice. verify(mMockWindowContainerTransaction, times(2)).addInsetsSource(eq(token), any(), @@ -796,10 +789,10 @@ public class WindowDecorationTests extends ShellTestCase { final ActivityManager.RunningTaskInfo firstTaskInfo = builder.setToken(token).setBounds(new Rect(0, 0, 1000, 1000)).build(); final TestWindowDecoration windowDecor = createWindowDecoration(firstTaskInfo); - windowDecor.relayout(firstTaskInfo); + windowDecor.relayout(firstTaskInfo, true /* hasGlobalFocus */); final ActivityManager.RunningTaskInfo secondTaskInfo = builder.setToken(token).setBounds(new Rect(0, 0, 1000, 1000)).build(); - windowDecor.relayout(secondTaskInfo); + windowDecor.relayout(secondTaskInfo, true /* hasGlobalFocus */); // Insets should only need to be applied once. verify(mMockWindowContainerTransaction, times(1)).addInsetsSource(eq(token), any(), @@ -824,7 +817,7 @@ public class WindowDecorationTests extends ShellTestCase { mRelayoutParams.mIsCaptionVisible = true; mRelayoutParams.mInsetSourceFlags = FLAG_FORCE_CONSUMING | FLAG_FORCE_CONSUMING_OPAQUE_CAPTION_BAR; - windowDecor.relayout(taskInfo); + windowDecor.relayout(taskInfo, true /* hasGlobalFocus */); // Caption inset source should add params' flags. verify(mMockWindowContainerTransaction).addInsetsSource(eq(token), any(), @@ -845,14 +838,13 @@ public class WindowDecorationTests extends ShellTestCase { .setVisible(true) .setWindowingMode(WINDOWING_MODE_FREEFORM) .build(); - taskInfo.isFocused = true; // Density is 2. Shadow radius is 10px. Caption height is 64px. taskInfo.configuration.densityDpi = DisplayMetrics.DENSITY_DEFAULT * 2; final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo); mRelayoutParams.mSetTaskPositionAndCrop = false; - windowDecor.relayout(taskInfo); + windowDecor.relayout(taskInfo, true /* hasGlobalFocus */); verify(mMockSurfaceControlStartT, never()).setWindowCrop( eq(mMockTaskSurface), anyInt(), anyInt()); @@ -875,13 +867,12 @@ public class WindowDecorationTests extends ShellTestCase { .setVisible(true) .setWindowingMode(WINDOWING_MODE_FREEFORM) .build(); - taskInfo.isFocused = true; // Density is 2. Shadow radius is 10px. Caption height is 64px. taskInfo.configuration.densityDpi = DisplayMetrics.DENSITY_DEFAULT * 2; final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo); mRelayoutParams.mSetTaskPositionAndCrop = true; - windowDecor.relayout(taskInfo); + windowDecor.relayout(taskInfo, true /* hasGlobalFocus */); verify(mMockSurfaceControlStartT).setWindowCrop( eq(mMockTaskSurface), anyInt(), anyInt()); @@ -932,12 +923,12 @@ public class WindowDecorationTests extends ShellTestCase { when(mMockDisplayController.getInsetsState(task.displayId)) .thenReturn(createInsetsState(statusBars(), true /* visible */)); final TestWindowDecoration decor = spy(createWindowDecoration(task)); - decor.relayout(task); + decor.relayout(task, true /* hasGlobalFocus */); assertTrue(decor.mIsStatusBarVisible); decor.onInsetsStateChanged(createInsetsState(statusBars(), false /* visible */)); - verify(decor, times(2)).relayout(task); + verify(decor, times(2)).relayout(task, true /* hasGlobalFocus */); } @Test @@ -947,11 +938,11 @@ public class WindowDecorationTests extends ShellTestCase { when(mMockDisplayController.getInsetsState(task.displayId)) .thenReturn(createInsetsState(statusBars(), true /* visible */)); final TestWindowDecoration decor = spy(createWindowDecoration(task)); - decor.relayout(task); + decor.relayout(task, true /* hasGlobalFocus */); decor.onInsetsStateChanged(createInsetsState(statusBars(), true /* visible */)); - verify(decor, times(1)).relayout(task); + verify(decor, times(1)).relayout(task, true /* hasGlobalFocus */); } @Test @@ -960,13 +951,13 @@ public class WindowDecorationTests extends ShellTestCase { when(mMockDisplayController.getInsetsState(task.displayId)) .thenReturn(createInsetsState(statusBars(), true /* visible */)); final TestWindowDecoration decor = spy(createWindowDecoration(task)); - decor.relayout(task); + decor.relayout(task, true /* hasGlobalFocus */); assertFalse(decor.mIsKeyguardVisibleAndOccluded); decor.onKeyguardStateChanged(true /* visible */, true /* occluding */); assertTrue(decor.mIsKeyguardVisibleAndOccluded); - verify(decor, times(2)).relayout(task); + verify(decor, times(2)).relayout(task, true /* hasGlobalFocus */); } @Test @@ -975,19 +966,18 @@ public class WindowDecorationTests extends ShellTestCase { when(mMockDisplayController.getInsetsState(task.displayId)) .thenReturn(createInsetsState(statusBars(), true /* visible */)); final TestWindowDecoration decor = spy(createWindowDecoration(task)); - decor.relayout(task); + decor.relayout(task, true /* hasGlobalFocus */); assertFalse(decor.mIsKeyguardVisibleAndOccluded); decor.onKeyguardStateChanged(false /* visible */, true /* occluding */); - verify(decor, times(1)).relayout(task); + verify(decor, times(1)).relayout(task, true /* hasGlobalFocus */); } private ActivityManager.RunningTaskInfo createTaskInfo() { final ActivityManager.RunningTaskInfo taskInfo = new TestRunningTaskInfoBuilder() .setVisible(true) .build(); - taskInfo.isFocused = true; return taskInfo; } @@ -1055,8 +1045,8 @@ public class WindowDecorationTests extends ShellTestCase { } @Override - void relayout(ActivityManager.RunningTaskInfo taskInfo) { - relayout(taskInfo, false /* applyStartTransactionOnDraw */); + void relayout(ActivityManager.RunningTaskInfo taskInfo, boolean hasGlobalFocus) { + relayout(taskInfo, false /* applyStartTransactionOnDraw */, hasGlobalFocus); } @Override @@ -1078,10 +1068,11 @@ public class WindowDecorationTests extends ShellTestCase { } void relayout(ActivityManager.RunningTaskInfo taskInfo, - boolean applyStartTransactionOnDraw) { + boolean applyStartTransactionOnDraw, boolean hasGlobalFocus) { mRelayoutParams.mRunningTaskInfo = taskInfo; mRelayoutParams.mApplyStartTransactionOnDraw = applyStartTransactionOnDraw; mRelayoutParams.mLayoutResId = R.layout.caption_layout; + mRelayoutParams.mHasGlobalFocus = hasGlobalFocus; relayout(mRelayoutParams, mMockSurfaceControlStartT, mMockSurfaceControlFinishT, mMockWindowContainerTransaction, mMockView, mRelayoutResult); } diff --git a/libs/androidfw/Idmap.cpp b/libs/androidfw/Idmap.cpp index f066e4620675..3ecd82b074a1 100644 --- a/libs/androidfw/Idmap.cpp +++ b/libs/androidfw/Idmap.cpp @@ -65,13 +65,7 @@ struct Idmap_data_header { uint32_t string_pool_index_offset; }; -struct Idmap_target_entry { - uint32_t target_id; - uint32_t overlay_id; -}; - struct Idmap_target_entry_inline { - uint32_t target_id; uint32_t start_value_index; uint32_t value_count; }; @@ -81,10 +75,9 @@ struct Idmap_target_entry_inline_value { Res_value value; }; -struct Idmap_overlay_entry { - uint32_t overlay_id; - uint32_t target_id; -}; +static constexpr uint32_t convert_dev_target_id(uint32_t dev_target_id) { + return (0x00FFFFFFU & dtohl(dev_target_id)); +} OverlayStringPool::OverlayStringPool(const LoadedIdmap* loaded_idmap) : data_header_(loaded_idmap->data_header_), @@ -117,27 +110,29 @@ size_t OverlayStringPool::size() const { } OverlayDynamicRefTable::OverlayDynamicRefTable(const Idmap_data_header* data_header, - const Idmap_overlay_entry* entries, + Idmap_overlay_entries entries, uint8_t target_assigned_package_id) : data_header_(data_header), entries_(entries), - target_assigned_package_id_(target_assigned_package_id) {} + target_assigned_package_id_(target_assigned_package_id) { +} status_t OverlayDynamicRefTable::lookupResourceId(uint32_t* resId) const { - const Idmap_overlay_entry* first_entry = entries_; - const Idmap_overlay_entry* end_entry = entries_ + dtohl(data_header_->overlay_entry_count); - auto entry = std::lower_bound(first_entry, end_entry, *resId, - [](const Idmap_overlay_entry& e1, const uint32_t overlay_id) { - return dtohl(e1.overlay_id) < overlay_id; - }); - - if (entry == end_entry || dtohl(entry->overlay_id) != *resId) { + const auto count = dtohl(data_header_->overlay_entry_count); + const auto overlay_it_end = entries_.overlay_id + count; + const auto entry_it = std::lower_bound(entries_.overlay_id, overlay_it_end, *resId, + [](uint32_t dev_overlay_id, uint32_t overlay_id) { + return dtohl(dev_overlay_id) < overlay_id; + }); + + if (entry_it == overlay_it_end || dtohl(*entry_it) != *resId) { // A mapping for the target resource id could not be found. return DynamicRefTable::lookupResourceId(resId); } - *resId = (0x00FFFFFFU & dtohl(entry->target_id)) - | (((uint32_t) target_assigned_package_id_) << 24U); + const auto index = entry_it - entries_.overlay_id; + *resId = convert_dev_target_id(entries_.target_id[index]) | + (((uint32_t)target_assigned_package_id_) << 24U); return NO_ERROR; } @@ -145,12 +140,10 @@ status_t OverlayDynamicRefTable::lookupResourceIdNoRewrite(uint32_t* resId) cons return DynamicRefTable::lookupResourceId(resId); } -IdmapResMap::IdmapResMap(const Idmap_data_header* data_header, - const Idmap_target_entry* entries, - const Idmap_target_entry_inline* inline_entries, +IdmapResMap::IdmapResMap(const Idmap_data_header* data_header, Idmap_target_entries entries, + Idmap_target_inline_entries inline_entries, const Idmap_target_entry_inline_value* inline_entry_values, - const ConfigDescription* configs, - uint8_t target_assigned_package_id, + const ConfigDescription* configs, uint8_t target_assigned_package_id, const OverlayDynamicRefTable* overlay_ref_table) : data_header_(data_header), entries_(entries), @@ -158,7 +151,8 @@ IdmapResMap::IdmapResMap(const Idmap_data_header* data_header, inline_entry_values_(inline_entry_values), configurations_(configs), target_assigned_package_id_(target_assigned_package_id), - overlay_ref_table_(overlay_ref_table) { } + overlay_ref_table_(overlay_ref_table) { +} IdmapResMap::Result IdmapResMap::Lookup(uint32_t target_res_id) const { if ((target_res_id >> 24U) != target_assigned_package_id_) { @@ -171,15 +165,15 @@ IdmapResMap::Result IdmapResMap::Lookup(uint32_t target_res_id) const { target_res_id &= 0x00FFFFFFU; // Check if the target resource is mapped to an overlay resource. - auto first_entry = entries_; - auto end_entry = entries_ + dtohl(data_header_->target_entry_count); - auto entry = std::lower_bound(first_entry, end_entry, target_res_id, - [](const Idmap_target_entry& e, const uint32_t target_id) { - return (0x00FFFFFFU & dtohl(e.target_id)) < target_id; - }); - - if (entry != end_entry && (0x00FFFFFFU & dtohl(entry->target_id)) == target_res_id) { - uint32_t overlay_resource_id = dtohl(entry->overlay_id); + const auto target_end = entries_.target_id + dtohl(data_header_->target_entry_count); + auto target_it = std::lower_bound(entries_.target_id, target_end, target_res_id, + [](uint32_t dev_target_id, uint32_t target_id) { + return convert_dev_target_id(dev_target_id) < target_id; + }); + + if (target_it != target_end && convert_dev_target_id(*target_it) == target_res_id) { + const auto index = target_it - entries_.target_id; + uint32_t overlay_resource_id = dtohl(entries_.overlay_id[index]); // Lookup the resource without rewriting the overlay resource id back to the target resource id // being looked up. overlay_ref_table_->lookupResourceIdNoRewrite(&overlay_resource_id); @@ -187,20 +181,22 @@ IdmapResMap::Result IdmapResMap::Lookup(uint32_t target_res_id) const { } // Check if the target resources is mapped to an inline table entry. - auto first_inline_entry = inline_entries_; - auto end_inline_entry = inline_entries_ + dtohl(data_header_->target_inline_entry_count); - auto inline_entry = std::lower_bound(first_inline_entry, end_inline_entry, target_res_id, - [](const Idmap_target_entry_inline& e, - const uint32_t target_id) { - return (0x00FFFFFFU & dtohl(e.target_id)) < target_id; - }); - - if (inline_entry != end_inline_entry && - (0x00FFFFFFU & dtohl(inline_entry->target_id)) == target_res_id) { + const auto inline_entry_target_end = + inline_entries_.target_id + dtohl(data_header_->target_inline_entry_count); + const auto inline_entry_target_it = + std::lower_bound(inline_entries_.target_id, inline_entry_target_end, target_res_id, + [](uint32_t dev_target_id, uint32_t target_id) { + return convert_dev_target_id(dev_target_id) < target_id; + }); + + if (inline_entry_target_it != inline_entry_target_end && + convert_dev_target_id(*inline_entry_target_it) == target_res_id) { + const auto index = inline_entry_target_it - inline_entries_.target_id; std::map<ConfigDescription, Res_value> values_map; - for (int i = 0; i < inline_entry->value_count; i++) { - const auto& value = inline_entry_values_[inline_entry->start_value_index + i]; - const auto& config = configurations_[value.config_index]; + const auto& inline_entry = inline_entries_.entry[index]; + for (int i = 0; i < dtohl(inline_entry.value_count); i++) { + const auto& value = inline_entry_values_[dtohl(inline_entry.start_value_index) + i]; + const auto& config = configurations_[dtohl(value.config_index)]; values_map[config] = value.value; } return Result(std::move(values_map)); @@ -210,15 +206,15 @@ IdmapResMap::Result IdmapResMap::Lookup(uint32_t target_res_id) const { namespace { template <typename T> -const T* ReadType(const uint8_t** in_out_data_ptr, size_t* in_out_size, const std::string& label, +const T* ReadType(const uint8_t** in_out_data_ptr, size_t* in_out_size, const char* label, size_t count = 1) { if (!util::IsFourByteAligned(*in_out_data_ptr)) { - LOG(ERROR) << "Idmap " << label << " is not word aligned."; + LOG(ERROR) << "Idmap " << label << " in " << __func__ << " is not word aligned."; return {}; } if ((*in_out_size / sizeof(T)) < count) { - LOG(ERROR) << "Idmap too small for the number of " << label << " entries (" - << count << ")."; + LOG(ERROR) << "Idmap too small for the number of " << label << " in " << __func__ + << " entries (" << count << ")."; return nullptr; } auto data_ptr = *in_out_data_ptr; @@ -229,8 +225,8 @@ const T* ReadType(const uint8_t** in_out_data_ptr, size_t* in_out_size, const st } std::optional<std::string_view> ReadString(const uint8_t** in_out_data_ptr, size_t* in_out_size, - const std::string& label) { - const auto* len = ReadType<uint32_t>(in_out_data_ptr, in_out_size, label + " length"); + const char* label) { + const auto* len = ReadType<uint32_t>(in_out_data_ptr, in_out_size, label); if (len == nullptr) { return {}; } @@ -242,7 +238,7 @@ std::optional<std::string_view> ReadString(const uint8_t** in_out_data_ptr, size const uint32_t padding_size = (4U - ((size_t)*in_out_data_ptr & 0x3U)) % 4U; for (uint32_t i = 0; i < padding_size; i++) { if (**in_out_data_ptr != 0) { - LOG(ERROR) << " Idmap padding of " << label << " is non-zero."; + LOG(ERROR) << " Idmap padding of " << label << " in " << __func__ << " is non-zero."; return {}; } *in_out_data_ptr += sizeof(uint8_t); @@ -258,12 +254,10 @@ std::optional<std::string_view> ReadString(const uint8_t** in_out_data_ptr, size #endif LoadedIdmap::LoadedIdmap(const std::string& idmap_path, const Idmap_header* header, - const Idmap_data_header* data_header, - const Idmap_target_entry* target_entries, - const Idmap_target_entry_inline* target_inline_entries, + const Idmap_data_header* data_header, Idmap_target_entries target_entries, + Idmap_target_inline_entries target_inline_entries, const Idmap_target_entry_inline_value* inline_entry_values, - const ConfigDescription* configs, - const Idmap_overlay_entry* overlay_entries, + const ConfigDescription* configs, Idmap_overlay_entries overlay_entries, std::unique_ptr<ResStringPool>&& string_pool, std::string_view overlay_apk_path, std::string_view target_apk_path) : header_(header), @@ -274,10 +268,12 @@ LoadedIdmap::LoadedIdmap(const std::string& idmap_path, const Idmap_header* head configurations_(configs), overlay_entries_(overlay_entries), string_pool_(std::move(string_pool)), - idmap_fd_(android::base::utf8::open(idmap_path.c_str(), O_RDONLY|O_CLOEXEC|O_BINARY|O_PATH)), + idmap_fd_( + android::base::utf8::open(idmap_path.c_str(), O_RDONLY | O_CLOEXEC | O_BINARY | O_PATH)), overlay_apk_path_(overlay_apk_path), target_apk_path_(target_apk_path), - idmap_last_mod_time_(getFileModDate(idmap_fd_.get())) {} + idmap_last_mod_time_(getFileModDate(idmap_fd_.get())) { +} std::unique_ptr<LoadedIdmap> LoadedIdmap::Load(StringPiece idmap_path, StringPiece idmap_data) { ATRACE_CALL(); @@ -319,14 +315,21 @@ std::unique_ptr<LoadedIdmap> LoadedIdmap::Load(StringPiece idmap_path, StringPie if (data_header == nullptr) { return {}; } - auto target_entries = ReadType<Idmap_target_entry>(&data_ptr, &data_size, "target", - dtohl(data_header->target_entry_count)); - if (target_entries == nullptr) { + Idmap_target_entries target_entries{ + .target_id = ReadType<uint32_t>(&data_ptr, &data_size, "entries.target_id", + dtohl(data_header->target_entry_count)), + .overlay_id = ReadType<uint32_t>(&data_ptr, &data_size, "entries.overlay_id", + dtohl(data_header->target_entry_count)), + }; + if (!target_entries.target_id || !target_entries.overlay_id) { return {}; } - auto target_inline_entries = ReadType<Idmap_target_entry_inline>( - &data_ptr, &data_size, "target inline", dtohl(data_header->target_inline_entry_count)); - if (target_inline_entries == nullptr) { + Idmap_target_inline_entries target_inline_entries{ + .target_id = ReadType<uint32_t>(&data_ptr, &data_size, "target inline.target_id", + dtohl(data_header->target_inline_entry_count)), + .entry = ReadType<Idmap_target_entry_inline>(&data_ptr, &data_size, "target inline.entry", + dtohl(data_header->target_inline_entry_count))}; + if (!target_inline_entries.target_id || !target_inline_entries.entry) { return {}; } @@ -344,9 +347,13 @@ std::unique_ptr<LoadedIdmap> LoadedIdmap::Load(StringPiece idmap_path, StringPie return {}; } - auto overlay_entries = ReadType<Idmap_overlay_entry>(&data_ptr, &data_size, "target inline", - dtohl(data_header->overlay_entry_count)); - if (overlay_entries == nullptr) { + Idmap_overlay_entries overlay_entries{ + .overlay_id = ReadType<uint32_t>(&data_ptr, &data_size, "overlay entries.overlay_id", + dtohl(data_header->overlay_entry_count)), + .target_id = ReadType<uint32_t>(&data_ptr, &data_size, "overlay entries.target_id", + dtohl(data_header->overlay_entry_count)), + }; + if (!overlay_entries.overlay_id || !overlay_entries.target_id) { return {}; } std::optional<std::string_view> string_pool = ReadString(&data_ptr, &data_size, "string pool"); diff --git a/libs/androidfw/include/androidfw/Idmap.h b/libs/androidfw/include/androidfw/Idmap.h index 64b1f0c6ed03..e213fbd22ab0 100644 --- a/libs/androidfw/include/androidfw/Idmap.h +++ b/libs/androidfw/include/androidfw/Idmap.h @@ -40,6 +40,19 @@ struct Idmap_target_entry_inline; struct Idmap_target_entry_inline_value; struct Idmap_overlay_entry; +struct Idmap_target_entries { + const uint32_t* target_id = nullptr; + const uint32_t* overlay_id = nullptr; +}; +struct Idmap_target_inline_entries { + const uint32_t* target_id = nullptr; + const Idmap_target_entry_inline* entry = nullptr; +}; +struct Idmap_overlay_entries { + const uint32_t* overlay_id = nullptr; + const uint32_t* target_id = nullptr; +}; + // A string pool for overlay apk assets. The string pool holds the strings of the overlay resources // table and additionally allows for loading strings from the idmap string pool. The idmap string // pool strings are offset after the end of the overlay resource table string pool entries so @@ -67,7 +80,7 @@ class OverlayDynamicRefTable : public DynamicRefTable { private: explicit OverlayDynamicRefTable(const Idmap_data_header* data_header, - const Idmap_overlay_entry* entries, + Idmap_overlay_entries entries, uint8_t target_assigned_package_id); // Rewrites a compile-time overlay resource id to the runtime resource id of corresponding target @@ -75,8 +88,8 @@ class OverlayDynamicRefTable : public DynamicRefTable { status_t lookupResourceIdNoRewrite(uint32_t* resId) const; const Idmap_data_header* data_header_; - const Idmap_overlay_entry* entries_; - const int8_t target_assigned_package_id_; + Idmap_overlay_entries entries_; + uint8_t target_assigned_package_id_; friend LoadedIdmap; friend IdmapResMap; @@ -131,17 +144,15 @@ class IdmapResMap { } private: - explicit IdmapResMap(const Idmap_data_header* data_header, - const Idmap_target_entry* entries, - const Idmap_target_entry_inline* inline_entries, + explicit IdmapResMap(const Idmap_data_header* data_header, Idmap_target_entries entries, + Idmap_target_inline_entries inline_entries, const Idmap_target_entry_inline_value* inline_entry_values, - const ConfigDescription* configs, - uint8_t target_assigned_package_id, + const ConfigDescription* configs, uint8_t target_assigned_package_id, const OverlayDynamicRefTable* overlay_ref_table); const Idmap_data_header* data_header_; - const Idmap_target_entry* entries_; - const Idmap_target_entry_inline* inline_entries_; + Idmap_target_entries entries_; + Idmap_target_inline_entries inline_entries_; const Idmap_target_entry_inline_value* inline_entry_values_; const ConfigDescription* configurations_; const uint8_t target_assigned_package_id_; @@ -192,11 +203,11 @@ class LoadedIdmap { const Idmap_header* header_; const Idmap_data_header* data_header_; - const Idmap_target_entry* target_entries_; - const Idmap_target_entry_inline* target_inline_entries_; + Idmap_target_entries target_entries_; + Idmap_target_inline_entries target_inline_entries_; const Idmap_target_entry_inline_value* inline_entry_values_; const ConfigDescription* configurations_; - const Idmap_overlay_entry* overlay_entries_; + const Idmap_overlay_entries overlay_entries_; const std::unique_ptr<ResStringPool> string_pool_; android::base::unique_fd idmap_fd_; @@ -207,17 +218,13 @@ class LoadedIdmap { private: DISALLOW_COPY_AND_ASSIGN(LoadedIdmap); - explicit LoadedIdmap(const std::string& idmap_path, - const Idmap_header* header, - const Idmap_data_header* data_header, - const Idmap_target_entry* target_entries, - const Idmap_target_entry_inline* target_inline_entries, + explicit LoadedIdmap(const std::string& idmap_path, const Idmap_header* header, + const Idmap_data_header* data_header, Idmap_target_entries target_entries, + Idmap_target_inline_entries target_inline_entries, const Idmap_target_entry_inline_value* inline_entry_values_, - const ConfigDescription* configs, - const Idmap_overlay_entry* overlay_entries, + const ConfigDescription* configs, Idmap_overlay_entries overlay_entries, std::unique_ptr<ResStringPool>&& string_pool, - std::string_view overlay_apk_path, - std::string_view target_apk_path); + std::string_view overlay_apk_path, std::string_view target_apk_path); friend OverlayStringPool; }; diff --git a/libs/androidfw/include/androidfw/ResourceTypes.h b/libs/androidfw/include/androidfw/ResourceTypes.h index c2648909386c..e330410ed1a0 100644 --- a/libs/androidfw/include/androidfw/ResourceTypes.h +++ b/libs/androidfw/include/androidfw/ResourceTypes.h @@ -48,7 +48,7 @@ namespace android { constexpr const uint32_t kIdmapMagic = 0x504D4449u; -constexpr const uint32_t kIdmapCurrentVersion = 0x00000009u; +constexpr const uint32_t kIdmapCurrentVersion = 0x0000000Au; // This must never change. constexpr const uint32_t kFabricatedOverlayMagic = 0x4f525246; // FRRO (big endian) diff --git a/libs/androidfw/tests/data/overlay/overlay.idmap b/libs/androidfw/tests/data/overlay/overlay.idmap Binary files differindex 8e847e81aa31..7e4b261cf109 100644 --- a/libs/androidfw/tests/data/overlay/overlay.idmap +++ b/libs/androidfw/tests/data/overlay/overlay.idmap diff --git a/libs/appfunctions/api/current.txt b/libs/appfunctions/api/current.txt index bc269fedddfe..e9845c1d9f13 100644 --- a/libs/appfunctions/api/current.txt +++ b/libs/appfunctions/api/current.txt @@ -15,7 +15,8 @@ package com.google.android.appfunctions.sidecar { public abstract class AppFunctionService extends android.app.Service { ctor public AppFunctionService(); method @NonNull public final android.os.IBinder onBind(@Nullable android.content.Intent); - method @MainThread public void onExecuteFunction(@NonNull com.google.android.appfunctions.sidecar.ExecuteAppFunctionRequest, @NonNull android.os.CancellationSignal, @NonNull java.util.function.Consumer<com.google.android.appfunctions.sidecar.ExecuteAppFunctionResponse>); + method @MainThread public void onExecuteFunction(@NonNull com.google.android.appfunctions.sidecar.ExecuteAppFunctionRequest, @NonNull String, @NonNull android.os.CancellationSignal, @NonNull java.util.function.Consumer<com.google.android.appfunctions.sidecar.ExecuteAppFunctionResponse>); + method @Deprecated @MainThread public void onExecuteFunction(@NonNull com.google.android.appfunctions.sidecar.ExecuteAppFunctionRequest, @NonNull android.os.CancellationSignal, @NonNull java.util.function.Consumer<com.google.android.appfunctions.sidecar.ExecuteAppFunctionResponse>); method @Deprecated @MainThread public void onExecuteFunction(@NonNull com.google.android.appfunctions.sidecar.ExecuteAppFunctionRequest, @NonNull java.util.function.Consumer<com.google.android.appfunctions.sidecar.ExecuteAppFunctionResponse>); field @NonNull public static final String BIND_APP_FUNCTION_SERVICE = "android.permission.BIND_APP_FUNCTION_SERVICE"; field @NonNull public static final String SERVICE_INTERFACE = "android.app.appfunctions.AppFunctionService"; diff --git a/libs/appfunctions/java/com/google/android/appfunctions/sidecar/AppFunctionService.java b/libs/appfunctions/java/com/google/android/appfunctions/sidecar/AppFunctionService.java index 6e91de6bbcf2..2a168e871713 100644 --- a/libs/appfunctions/java/com/google/android/appfunctions/sidecar/AppFunctionService.java +++ b/libs/appfunctions/java/com/google/android/appfunctions/sidecar/AppFunctionService.java @@ -24,8 +24,8 @@ import android.annotation.Nullable; import android.app.Service; import android.content.Intent; import android.os.Binder; -import android.os.IBinder; import android.os.CancellationSignal; +import android.os.IBinder; import android.util.Log; import java.util.function.Consumer; @@ -71,18 +71,21 @@ public abstract class AppFunctionService extends Service { private final Binder mBinder = android.app.appfunctions.AppFunctionService.createBinder( /* context= */ this, - /* onExecuteFunction= */ (platformRequest, cancellationSignal, callback) -> { + /* onExecuteFunction= */ (platformRequest, + callingPackage, + cancellationSignal, + callback) -> { AppFunctionService.this.onExecuteFunction( SidecarConverter.getSidecarExecuteAppFunctionRequest( platformRequest), + callingPackage, cancellationSignal, (sidecarResponse) -> { callback.accept( SidecarConverter.getPlatformExecuteAppFunctionResponse( sidecarResponse)); }); - } - ); + }); @NonNull @Override @@ -107,11 +110,49 @@ public abstract class AppFunctionService extends Service { * thread and dispatch the result with the given callback. You should always report back the * result using the callback, no matter if the execution was successful or not. * + * <p>This method also accepts a {@link CancellationSignal} that the app should listen to cancel + * the execution of function if requested by the system. + * + * @param request The function execution request. + * @param callingPackage The package name of the app that is requesting the execution. + * @param cancellationSignal A signal to cancel the execution. + * @param callback A callback to report back the result. + */ + @MainThread + public void onExecuteFunction( + @NonNull ExecuteAppFunctionRequest request, + @NonNull String callingPackage, + @NonNull CancellationSignal cancellationSignal, + @NonNull Consumer<ExecuteAppFunctionResponse> callback) { + onExecuteFunction(request, cancellationSignal, callback); + } + + /** + * Called by the system to execute a specific app function. + * + * <p>This method is triggered when the system requests your AppFunctionService to handle a + * particular function you have registered and made available. + * + * <p>To ensure proper routing of function requests, assign a unique identifier to each + * function. This identifier doesn't need to be globally unique, but it must be unique within + * your app. For example, a function to order food could be identified as "orderFood". In most + * cases this identifier should come from the ID automatically generated by the AppFunctions + * SDK. You can determine the specific function to invoke by calling {@link + * ExecuteAppFunctionRequest#getFunctionIdentifier()}. + * + * <p>This method is always triggered in the main thread. You should run heavy tasks on a worker + * thread and dispatch the result with the given callback. You should always report back the + * result using the callback, no matter if the execution was successful or not. + * * @param request The function execution request. * @param cancellationSignal A {@link CancellationSignal} to cancel the request. * @param callback A callback to report back the result. + * @deprecated Use {@link #onExecuteFunction(ExecuteAppFunctionRequest, String, + * CancellationSignal, Consumer)} instead. This method will be removed once usage references + * are updated. */ @MainThread + @Deprecated public void onExecuteFunction( @NonNull ExecuteAppFunctionRequest request, @NonNull CancellationSignal cancellationSignal, @@ -138,7 +179,6 @@ public abstract class AppFunctionService extends Service { * * @param request The function execution request. * @param callback A callback to report back the result. - * * @deprecated Use {@link #onExecuteFunction(ExecuteAppFunctionRequest, CancellationSignal, * Consumer)} instead. This method will be removed once usage references are updated. */ diff --git a/libs/appfunctions/java/com/google/android/appfunctions/sidecar/ExecuteAppFunctionResponse.java b/libs/appfunctions/java/com/google/android/appfunctions/sidecar/ExecuteAppFunctionResponse.java index d87fec7985e9..969e5d58b909 100644 --- a/libs/appfunctions/java/com/google/android/appfunctions/sidecar/ExecuteAppFunctionResponse.java +++ b/libs/appfunctions/java/com/google/android/appfunctions/sidecar/ExecuteAppFunctionResponse.java @@ -234,12 +234,13 @@ public final class ExecuteAppFunctionResponse { @IntDef( prefix = {"RESULT_"}, value = { - RESULT_OK, - RESULT_DENIED, - RESULT_APP_UNKNOWN_ERROR, - RESULT_INTERNAL_ERROR, - RESULT_INVALID_ARGUMENT, - RESULT_DISABLED + RESULT_OK, + RESULT_DENIED, + RESULT_APP_UNKNOWN_ERROR, + RESULT_INTERNAL_ERROR, + RESULT_INVALID_ARGUMENT, + RESULT_DISABLED, + RESULT_CANCELLED }) @Retention(RetentionPolicy.SOURCE) public @interface ResultCode {} diff --git a/libs/hwui/DeferredLayerUpdater.cpp b/libs/hwui/DeferredLayerUpdater.cpp index b763a96e8e8a..c0160705fd47 100644 --- a/libs/hwui/DeferredLayerUpdater.cpp +++ b/libs/hwui/DeferredLayerUpdater.cpp @@ -19,6 +19,7 @@ #include <GLES2/gl2ext.h> // TODO: Use public SurfaceTexture APIs once available and include public NDK header file instead. +#include <statslog_hwui.h> #include <surfacetexture/surface_texture_platform.h> #include "AutoBackendTextureRelease.h" @@ -50,6 +51,14 @@ DeferredLayerUpdater::~DeferredLayerUpdater() { setTransform(nullptr); mRenderState.removeContextCallback(this); destroyLayer(); + if (mFirstTimeForDataspace > std::chrono::steady_clock::time_point::min()) { + auto currentTime = std::chrono::steady_clock::now(); + stats_write(stats::TEXTURE_VIEW_EVENT, static_cast<int32_t>(getuid()), + static_cast<int64_t>(std::chrono::duration_cast<std::chrono::milliseconds>( + currentTime - mFirstTimeForDataspace) + .count()), + mDataspace); + } } void DeferredLayerUpdater::setSurfaceTexture(AutoTextureRelease&& consumer) { @@ -195,6 +204,21 @@ void DeferredLayerUpdater::apply() { updateLayer(forceFilter, layerImage, outTransform, currentCropRect, maxLuminanceNits); } + + if (dataspace != mDataspace || + mFirstTimeForDataspace == std::chrono::steady_clock::time_point::min()) { + auto currentTime = std::chrono::steady_clock::now(); + if (mFirstTimeForDataspace > std::chrono::steady_clock::time_point::min()) { + stats_write(stats::TEXTURE_VIEW_EVENT, static_cast<int32_t>(getuid()), + static_cast<int64_t>( + std::chrono::duration_cast<std::chrono::milliseconds>( + currentTime - mFirstTimeForDataspace) + .count()), + mDataspace); + } + mFirstTimeForDataspace = currentTime; + mDataspace = dataspace; + } } } diff --git a/libs/hwui/DeferredLayerUpdater.h b/libs/hwui/DeferredLayerUpdater.h index a7f8f6189a8e..3abb47ca92d1 100644 --- a/libs/hwui/DeferredLayerUpdater.h +++ b/libs/hwui/DeferredLayerUpdater.h @@ -16,6 +16,8 @@ #pragma once +#include <EGL/egl.h> +#include <EGL/eglext.h> #include <SkBlendMode.h> #include <SkColorFilter.h> #include <SkImage.h> @@ -24,9 +26,9 @@ #include <android/surface_texture.h> #include <cutils/compiler.h> #include <utils/Errors.h> +#include <utils/Timers.h> -#include <EGL/egl.h> -#include <EGL/eglext.h> +#include <chrono> #include <map> #include <memory> @@ -154,6 +156,9 @@ private: bool mGLContextAttached; bool mUpdateTexImage; int mCurrentSlot = -1; + android_dataspace mDataspace = HAL_DATASPACE_UNKNOWN; + std::chrono::steady_clock::time_point mFirstTimeForDataspace = + std::chrono::steady_clock::time_point::min(); Layer* mLayer; }; diff --git a/libs/hwui/pipeline/skia/BackdropFilterDrawable.cpp b/libs/hwui/pipeline/skia/BackdropFilterDrawable.cpp index e81cbfb508ae..c0ef4b14d53f 100644 --- a/libs/hwui/pipeline/skia/BackdropFilterDrawable.cpp +++ b/libs/hwui/pipeline/skia/BackdropFilterDrawable.cpp @@ -29,37 +29,6 @@ namespace android { namespace uirenderer { namespace skiapipeline { -BackdropFilterDrawable::~BackdropFilterDrawable() {} - -bool BackdropFilterDrawable::prepareToDraw(SkCanvas* canvas, const RenderProperties& properties, - int backdropImageWidth, int backdropImageHeight) { - // the drawing bounds for blurred content. - mDstBounds.setWH(properties.getWidth(), properties.getHeight()); - - float alphaMultiplier = 1.0f; - RenderNodeDrawable::setViewProperties(properties, canvas, &alphaMultiplier, true); - - // get proper subset for previous content. - canvas->getTotalMatrix().mapRect(&mImageSubset, mDstBounds); - SkRect imageSubset(mImageSubset); - // ensure the subset is inside bounds of previous content. - if (!mImageSubset.intersect(SkRect::MakeWH(backdropImageWidth, backdropImageHeight))) { - return false; - } - - // correct the drawing bounds if subset was changed. - if (mImageSubset != imageSubset) { - SkMatrix inverse; - if (canvas->getTotalMatrix().invert(&inverse)) { - inverse.mapRect(&mDstBounds, mImageSubset); - } - } - - // follow the alpha from the target RenderNode. - mPaint.setAlpha(properties.layerProperties().alpha() * alphaMultiplier); - return true; -} - void BackdropFilterDrawable::onDraw(SkCanvas* canvas) { const RenderProperties& properties = mTargetRenderNode->properties(); auto* backdropFilter = properties.layerProperties().getBackdropImageFilter(); @@ -68,27 +37,43 @@ void BackdropFilterDrawable::onDraw(SkCanvas* canvas) { return; } - auto backdropImage = surface->makeImageSnapshot(); - // sync necessary properties from target RenderNode. - if (!prepareToDraw(canvas, properties, backdropImage->width(), backdropImage->height())) { + SkRect srcBounds = SkRect::MakeWH(properties.getWidth(), properties.getHeight()); + + float alphaMultiplier = 1.0f; + RenderNodeDrawable::setViewProperties(properties, canvas, &alphaMultiplier, true); + SkPaint paint; + paint.setAlpha(properties.layerProperties().alpha() * alphaMultiplier); + + SkRect surfaceSubset; + canvas->getTotalMatrix().mapRect(&surfaceSubset, srcBounds); + if (!surfaceSubset.intersect(SkRect::MakeWH(surface->width(), surface->height()))) { return; } - auto imageSubset = mImageSubset.roundOut(); + auto backdropImage = surface->makeImageSnapshot(surfaceSubset.roundOut()); + + SkIRect imageBounds = SkIRect::MakeWH(backdropImage->width(), backdropImage->height()); + SkIPoint offset; + SkIRect imageSubset; + #ifdef __ANDROID__ if (canvas->recordingContext()) { backdropImage = SkImages::MakeWithFilter(canvas->recordingContext(), backdropImage, backdropFilter, - imageSubset, imageSubset, &mOutSubset, &mOutOffset); + imageBounds, imageBounds, &imageSubset, &offset); } else #endif { - backdropImage = SkImages::MakeWithFilter(backdropImage, backdropFilter, imageSubset, - imageSubset, &mOutSubset, &mOutOffset); + backdropImage = SkImages::MakeWithFilter(backdropImage, backdropFilter, imageBounds, + imageBounds, &imageSubset, &offset); } - canvas->drawImageRect(backdropImage, SkRect::Make(mOutSubset), mDstBounds, - SkSamplingOptions(SkFilterMode::kLinear), &mPaint, - SkCanvas::kStrict_SrcRectConstraint); + + canvas->save(); + canvas->resetMatrix(); + canvas->drawImageRect(backdropImage, SkRect::Make(imageSubset), surfaceSubset, + SkSamplingOptions(SkFilterMode::kLinear), &paint, + SkCanvas::kFast_SrcRectConstraint); + canvas->restore(); } } // namespace skiapipeline diff --git a/libs/hwui/pipeline/skia/BackdropFilterDrawable.h b/libs/hwui/pipeline/skia/BackdropFilterDrawable.h index 9e35837675ae..5e216a1fc3c3 100644 --- a/libs/hwui/pipeline/skia/BackdropFilterDrawable.h +++ b/libs/hwui/pipeline/skia/BackdropFilterDrawable.h @@ -37,23 +37,10 @@ public: BackdropFilterDrawable(RenderNode* renderNode, SkCanvas* canvas) : mTargetRenderNode(renderNode), mBounds(canvas->getLocalClipBounds()) {} - ~BackdropFilterDrawable(); + ~BackdropFilterDrawable() = default; private: RenderNode* mTargetRenderNode; - SkPaint mPaint; - - SkRect mDstBounds; - SkRect mImageSubset; - SkIRect mOutSubset; - SkIPoint mOutOffset; - - /** - * Check all necessary properties before actual drawing. - * Return true if ready to draw. - */ - bool prepareToDraw(SkCanvas* canvas, const RenderProperties& properties, int backdropImageWidth, - int backdropImageHeight); protected: void onDraw(SkCanvas* canvas) override; diff --git a/libs/hwui/tests/common/scenes/BackdropBlur.cpp b/libs/hwui/tests/common/scenes/BackdropBlur.cpp new file mode 100644 index 000000000000..a1133ffe96ef --- /dev/null +++ b/libs/hwui/tests/common/scenes/BackdropBlur.cpp @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2024 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. + */ + +#include <SkBlendMode.h> + +#include "SkImageFilter.h" +#include "SkImageFilters.h" +#include "TestSceneBase.h" +#include "utils/Blur.h" + +class BackdropBlurAnimation : public TestScene { +private: + std::unique_ptr<TestScene> listView; + +public: + explicit BackdropBlurAnimation(const TestScene::Options& opts) { + listView.reset(TestScene::testMap()["listview"].createScene(opts)); + } + + void createContent(int width, int height, Canvas& canvas) override { + sp<RenderNode> list = TestUtils::createNode( + 0, 0, width, height, + [this, width, height](RenderProperties& props, Canvas& canvas) { + props.setClipToBounds(false); + listView->createContent(width, height, canvas); + }); + + canvas.drawRenderNode(list.get()); + + int x = width / 8; + int y = height / 4; + sp<RenderNode> blurNode = TestUtils::createNode( + x, y, width - x, height - y, [](RenderProperties& props, Canvas& canvas) { + props.mutableOutline().setRoundRect(0, 0, props.getWidth(), props.getHeight(), + dp(16), 1); + props.mutableOutline().setShouldClip(true); + sk_sp<SkImageFilter> blurFilter = SkImageFilters::Blur( + Blur::convertRadiusToSigma(dp(8)), Blur::convertRadiusToSigma(dp(8)), + SkTileMode::kClamp, nullptr, nullptr); + props.mutateLayerProperties().setBackdropImageFilter(blurFilter.get()); + canvas.drawColor(0x33000000, SkBlendMode::kSrcOver); + }); + + canvas.drawRenderNode(blurNode.get()); + } + + void doFrame(int frameNr) override { listView->doFrame(frameNr); } +}; + +static TestScene::Registrar _BackdropBlur(TestScene::Info{ + "backdropblur", "A rounded rect that does a blur-behind of a sky animation.", + [](const TestScene::Options& opts) -> test::TestScene* { + return new BackdropBlurAnimation(opts); + }}); diff --git a/libs/hwui/tests/unit/RenderNodeDrawableTests.cpp b/libs/hwui/tests/unit/RenderNodeDrawableTests.cpp index ca540874833c..4b29100c55a6 100644 --- a/libs/hwui/tests/unit/RenderNodeDrawableTests.cpp +++ b/libs/hwui/tests/unit/RenderNodeDrawableTests.cpp @@ -1280,7 +1280,7 @@ RENDERTHREAD_TEST(BackdropFilterDrawable, drawing) { canvas->drawDrawable(&backdropDrawable); // the drawable is still visible, ok to draw. EXPECT_EQ(2, canvas->mDrawCounter); - EXPECT_EQ(SkRect::MakeLTRB(0, 0, CANVAS_WIDTH - 30, CANVAS_HEIGHT - 30), canvas->mDstBounds); + EXPECT_EQ(SkRect::MakeLTRB(30, 30, CANVAS_WIDTH, CANVAS_HEIGHT), canvas->mDstBounds); canvas->translate(CANVAS_WIDTH, CANVAS_HEIGHT); canvas->drawDrawable(&drawable); |