diff options
Diffstat (limited to 'libs')
130 files changed, 2210 insertions, 1169 deletions
diff --git a/libs/WindowManager/Shell/Android.bp b/libs/WindowManager/Shell/Android.bp index 94809f2d258f..f8574294a3a2 100644 --- a/libs/WindowManager/Shell/Android.bp +++ b/libs/WindowManager/Shell/Android.bp @@ -147,8 +147,10 @@ java_library { java_library { name: "WindowManager-Shell-lite-proto", - srcs: ["src/com/android/wm/shell/desktopmode/education/data/proto/**/*.proto"], - + srcs: [ + "src/com/android/wm/shell/desktopmode/education/data/proto/**/*.proto", + "src/com/android/wm/shell/desktopmode/persistence/*.proto", + ], proto: { type: "lite", }, diff --git a/libs/WindowManager/Shell/aconfig/multitasking.aconfig b/libs/WindowManager/Shell/aconfig/multitasking.aconfig index 526ccd55ce3d..63a288079401 100644 --- a/libs/WindowManager/Shell/aconfig/multitasking.aconfig +++ b/libs/WindowManager/Shell/aconfig/multitasking.aconfig @@ -122,6 +122,16 @@ flag { } flag { + name: "enable_shell_top_task_tracking" + namespace: "multitasking" + description: "Enables tracking top tasks from the shell" + bug: "342627272" + metadata { + purpose: PURPOSE_BUGFIX + } +} + +flag { name: "enable_bubble_bar_in_persistent_task_bar" namespace: "multitasking" description: "Enable bubble bar to be shown in the persistent task bar" diff --git a/libs/WindowManager/Shell/multivalentScreenshotTests/goldens/onDevice/phone/dark_portrait_bubbles_education.png b/libs/WindowManager/Shell/multivalentScreenshotTests/goldens/onDevice/phone/dark_portrait_bubbles_education.png Binary files differindex 991cdcf09416..c7b4c65b8c4b 100644 --- a/libs/WindowManager/Shell/multivalentScreenshotTests/goldens/onDevice/phone/dark_portrait_bubbles_education.png +++ b/libs/WindowManager/Shell/multivalentScreenshotTests/goldens/onDevice/phone/dark_portrait_bubbles_education.png diff --git a/libs/WindowManager/Shell/multivalentScreenshotTests/goldens/onDevice/phone/light_portrait_bubbles_education.png b/libs/WindowManager/Shell/multivalentScreenshotTests/goldens/onDevice/phone/light_portrait_bubbles_education.png Binary files differindex 991cdcf09416..c7b4c65b8c4b 100644 --- a/libs/WindowManager/Shell/multivalentScreenshotTests/goldens/onDevice/phone/light_portrait_bubbles_education.png +++ b/libs/WindowManager/Shell/multivalentScreenshotTests/goldens/onDevice/phone/light_portrait_bubbles_education.png diff --git a/libs/WindowManager/Shell/res/layout/desktop_mode_app_handle.xml b/libs/WindowManager/Shell/res/layout/desktop_mode_app_handle.xml index c0ff1922edc8..1d1cdfa85040 100644 --- a/libs/WindowManager/Shell/res/layout/desktop_mode_app_handle.xml +++ b/libs/WindowManager/Shell/res/layout/desktop_mode_app_handle.xml @@ -28,6 +28,8 @@ android:layout_height="@dimen/desktop_mode_fullscreen_decor_caption_height" android:paddingVertical="16dp" android:paddingHorizontal="10dp" + android:screenReaderFocusable="true" + android:importantForAccessibility="yes" android:contentDescription="@string/handle_text" android:src="@drawable/decor_handle_dark" tools:tint="@color/desktop_mode_caption_handle_bar_dark" diff --git a/libs/WindowManager/Shell/res/layout/desktop_mode_app_header.xml b/libs/WindowManager/Shell/res/layout/desktop_mode_app_header.xml index 7dcb3c237c51..3dbf7542ac6e 100644 --- a/libs/WindowManager/Shell/res/layout/desktop_mode_app_header.xml +++ b/libs/WindowManager/Shell/res/layout/desktop_mode_app_header.xml @@ -31,14 +31,16 @@ android:orientation="horizontal" android:clickable="true" android:focusable="true" + android:contentDescription="@string/desktop_mode_app_header_chip_text" android:layout_marginStart="12dp"> <ImageView android:id="@+id/application_icon" android:layout_width="@dimen/desktop_mode_caption_icon_radius" android:layout_height="@dimen/desktop_mode_caption_icon_radius" android:layout_gravity="center_vertical" - android:contentDescription="@string/app_icon_text" android:layout_marginStart="6dp" + android:clickable="false" + android:focusable="false" android:scaleType="centerCrop"/> <TextView @@ -53,18 +55,22 @@ android:layout_gravity="center_vertical" android:layout_weight="1" android:layout_marginStart="8dp" + android:clickable="false" + android:focusable="false" tools:text="Gmail"/> <ImageButton android:id="@+id/expand_menu_button" android:layout_width="16dp" android:layout_height="16dp" - android:contentDescription="@string/expand_menu_text" android:src="@drawable/ic_baseline_expand_more_24" android:background="@null" android:scaleType="fitCenter" android:clickable="false" android:focusable="false" + android:screenReaderFocusable="false" + android:importantForAccessibility="no" + android:contentDescription="@null" android:layout_marginHorizontal="8dp" android:layout_gravity="center_vertical"/> @@ -90,6 +96,7 @@ <com.android.wm.shell.windowdecor.MaximizeButtonView android:id="@+id/maximize_button_view" + android:importantForAccessibility="no" android:layout_width="44dp" android:layout_height="40dp" android:layout_gravity="end" diff --git a/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_handle_menu.xml b/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_handle_menu.xml index 64f71c713d1c..6913e54c2b10 100644 --- a/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_handle_menu.xml +++ b/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_handle_menu.xml @@ -43,13 +43,15 @@ android:layout_height="@dimen/desktop_mode_caption_icon_radius" android:layout_marginStart="12dp" android:layout_marginEnd="12dp" - android:contentDescription="@string/app_icon_text"/> + android:contentDescription="@string/app_icon_text" + android:importantForAccessibility="no"/> <TextView android:id="@+id/application_name" android:layout_width="0dp" android:layout_height="wrap_content" tools:text="Gmail" + android:importantForAccessibility="no" android:textColor="?androidprv:attr/materialColorOnSurface" android:textSize="14sp" android:textFontWeight="500" diff --git a/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_maximize_menu.xml b/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_maximize_menu.xml index 5fe3f2af63a0..35ef2393bb9b 100644 --- a/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_maximize_menu.xml +++ b/libs/WindowManager/Shell/res/layout/desktop_mode_window_decor_maximize_menu.xml @@ -41,6 +41,8 @@ android:id="@+id/maximize_menu_maximize_button" style="?android:attr/buttonBarButtonStyle" android:stateListAnimator="@null" + android:importantForAccessibility="yes" + android:contentDescription="@string/desktop_mode_maximize_menu_maximize_button_text" android:layout_marginRight="8dp" android:layout_marginBottom="4dp" android:alpha="0"/> @@ -53,6 +55,7 @@ android:layout_marginBottom="76dp" android:gravity="center" android:fontFamily="google-sans-text" + android:importantForAccessibility="no" android:text="@string/desktop_mode_maximize_menu_maximize_text" android:textColor="?androidprv:attr/materialColorOnSurface" android:alpha="0"/> @@ -78,6 +81,8 @@ android:layout_height="@dimen/desktop_mode_maximize_menu_button_height" android:layout_marginRight="4dp" android:background="@drawable/desktop_mode_maximize_menu_button_background" + android:importantForAccessibility="yes" + android:contentDescription="@string/desktop_mode_maximize_menu_snap_left_button_text" android:stateListAnimator="@null"/> <Button @@ -86,6 +91,8 @@ android:layout_width="41dp" android:layout_height="@dimen/desktop_mode_maximize_menu_button_height" android:background="@drawable/desktop_mode_maximize_menu_button_background" + android:importantForAccessibility="yes" + android:contentDescription="@string/desktop_mode_maximize_menu_snap_right_button_text" android:stateListAnimator="@null"/> </LinearLayout> <TextView @@ -96,6 +103,7 @@ android:layout_marginBottom="76dp" android:layout_gravity="center" android:gravity="center" + android:importantForAccessibility="no" android:fontFamily="google-sans-text" android:text="@string/desktop_mode_maximize_menu_snap_text" android:textColor="?androidprv:attr/materialColorOnSurface" diff --git a/libs/WindowManager/Shell/res/layout/maximize_menu_button.xml b/libs/WindowManager/Shell/res/layout/maximize_menu_button.xml index cf1b8947467e..b734d2d81455 100644 --- a/libs/WindowManager/Shell/res/layout/maximize_menu_button.xml +++ b/libs/WindowManager/Shell/res/layout/maximize_menu_button.xml @@ -19,7 +19,8 @@ <FrameLayout android:layout_width="44dp" - android:layout_height="40dp"> + android:layout_height="40dp" + android:importantForAccessibility="noHideDescendants"> <ProgressBar android:id="@+id/progress_bar" style="?android:attr/progressBarStyleHorizontal" diff --git a/libs/WindowManager/Shell/res/values-af/strings.xml b/libs/WindowManager/Shell/res/values-af/strings.xml index e50d8dc59f4c..50aa4ca1a1f1 100644 --- a/libs/WindowManager/Shell/res/values-af/strings.xml +++ b/libs/WindowManager/Shell/res/values-af/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"Skermskoot"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"Maak in blaaier oop"</string> <string name="new_window_text" msgid="6318648868380652280">"Nuwe venster"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <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> - <string name="expand_menu_text" msgid="3847736164494181168">"Maak kieslys oop"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-am/strings.xml b/libs/WindowManager/Shell/res/values-am/strings.xml index f29bbe7c4cdd..281e313d328f 100644 --- a/libs/WindowManager/Shell/res/values-am/strings.xml +++ b/libs/WindowManager/Shell/res/values-am/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"ቅጽበታዊ ገፅ ዕይታ"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"በአሳሽ ውስጥ ክፈት"</string> <string name="new_window_text" msgid="6318648868380652280">"አዲስ መስኮት"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <string name="manage_windows_text" msgid="5567366688493093920">"መስኮቶችን አስተዳድር"</string> <string name="close_text" msgid="4986518933445178928">"ዝጋ"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"ምናሌ ዝጋ"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"ምናሌን ክፈት"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-ar/strings.xml b/libs/WindowManager/Shell/res/values-ar/strings.xml index d76a2a50f299..2c0b34a604a9 100644 --- a/libs/WindowManager/Shell/res/values-ar/strings.xml +++ b/libs/WindowManager/Shell/res/values-ar/strings.xml @@ -126,8 +126,15 @@ <string name="manage_windows_text" msgid="5567366688493093920">"إدارة النوافذ"</string> <string name="close_text" msgid="4986518933445178928">"إغلاق"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"إغلاق القائمة"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"فتح القائمة"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-as/strings.xml b/libs/WindowManager/Shell/res/values-as/strings.xml index 1fe79aca1ef2..c5e37162e2d9 100644 --- a/libs/WindowManager/Shell/res/values-as/strings.xml +++ b/libs/WindowManager/Shell/res/values-as/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"স্ক্ৰীনশ্বট"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"ব্ৰাউজাৰত খোলক"</string> <string name="new_window_text" msgid="6318648868380652280">"নতুন ৱিণ্ড’"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <string name="manage_windows_text" msgid="5567366688493093920">"ৱিণ্ড’ পৰিচালনা কৰক"</string> <string name="close_text" msgid="4986518933445178928">"বন্ধ কৰক"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"মেনু বন্ধ কৰক"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"মেনু খোলক"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-az/strings.xml b/libs/WindowManager/Shell/res/values-az/strings.xml index 299265532d66..e23e8d049a8f 100644 --- a/libs/WindowManager/Shell/res/values-az/strings.xml +++ b/libs/WindowManager/Shell/res/values-az/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"Skrinşot"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"Brauzerdə açın"</string> <string name="new_window_text" msgid="6318648868380652280">"Yeni pəncərə"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <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> - <string name="expand_menu_text" msgid="3847736164494181168">"Menyunu açın"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <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 12f14189e53d..283d1f5578cf 100644 --- a/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml +++ b/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml @@ -126,8 +126,15 @@ <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> - <string name="expand_menu_text" msgid="3847736164494181168">"Otvorite meni"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-be/strings.xml b/libs/WindowManager/Shell/res/values-be/strings.xml index 8aa43f7ab102..48914f1eb27c 100644 --- a/libs/WindowManager/Shell/res/values-be/strings.xml +++ b/libs/WindowManager/Shell/res/values-be/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"Здымак экрана"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"Адкрыць у браўзеры"</string> <string name="new_window_text" msgid="6318648868380652280">"Новае акно"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <string name="manage_windows_text" msgid="5567366688493093920">"Кіраваць вокнамі"</string> <string name="close_text" msgid="4986518933445178928">"Закрыць"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Закрыць меню"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"Адкрыць меню"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-bg/strings.xml b/libs/WindowManager/Shell/res/values-bg/strings.xml index b84778b4bca3..b385d285350b 100644 --- a/libs/WindowManager/Shell/res/values-bg/strings.xml +++ b/libs/WindowManager/Shell/res/values-bg/strings.xml @@ -126,8 +126,15 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Управление на прозорците"</string> <string name="close_text" msgid="4986518933445178928">"Затваряне"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Затваряне на менюто"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"Отваряне на менюто"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-bn/strings.xml b/libs/WindowManager/Shell/res/values-bn/strings.xml index 5e47e2a85de8..56fcf7f4fff5 100644 --- a/libs/WindowManager/Shell/res/values-bn/strings.xml +++ b/libs/WindowManager/Shell/res/values-bn/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"স্ক্রিনশট"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"ব্রাউজারে খুলুন"</string> <string name="new_window_text" msgid="6318648868380652280">"নতুন উইন্ডো"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <string name="manage_windows_text" msgid="5567366688493093920">"উইন্ডো ম্যানেজ করুন"</string> <string name="close_text" msgid="4986518933445178928">"বন্ধ করুন"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"\'মেনু\' বন্ধ করুন"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"মেনু খুলুন"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-bs/strings.xml b/libs/WindowManager/Shell/res/values-bs/strings.xml index bd7cddd59233..95362bbfeab5 100644 --- a/libs/WindowManager/Shell/res/values-bs/strings.xml +++ b/libs/WindowManager/Shell/res/values-bs/strings.xml @@ -126,8 +126,15 @@ <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> - <string name="expand_menu_text" msgid="3847736164494181168">"Otvaranje menija"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-ca/strings.xml b/libs/WindowManager/Shell/res/values-ca/strings.xml index af54037e87f1..e0b25389e6f1 100644 --- a/libs/WindowManager/Shell/res/values-ca/strings.xml +++ b/libs/WindowManager/Shell/res/values-ca/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"Captura de pantalla"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"Obre al navegador"</string> <string name="new_window_text" msgid="6318648868380652280">"Finestra nova"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <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> - <string name="expand_menu_text" msgid="3847736164494181168">"Obre el menú"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-cs/strings.xml b/libs/WindowManager/Shell/res/values-cs/strings.xml index dd4802ed963c..3aae52e4808a 100644 --- a/libs/WindowManager/Shell/res/values-cs/strings.xml +++ b/libs/WindowManager/Shell/res/values-cs/strings.xml @@ -126,8 +126,15 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Spravovat okna"</string> <string name="close_text" msgid="4986518933445178928">"Zavřít"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Zavřít nabídku"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"Otevřít nabídku"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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> + <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-da/strings.xml b/libs/WindowManager/Shell/res/values-da/strings.xml index fca92a171211..fdc59137dd5e 100644 --- a/libs/WindowManager/Shell/res/values-da/strings.xml +++ b/libs/WindowManager/Shell/res/values-da/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"Screenshot"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"Åbn i browser"</string> <string name="new_window_text" msgid="6318648868380652280">"Nyt vindue"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <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> - <string name="expand_menu_text" msgid="3847736164494181168">"Åbn menu"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-de/strings.xml b/libs/WindowManager/Shell/res/values-de/strings.xml index 512bd7a64582..913e3d0abf0f 100644 --- a/libs/WindowManager/Shell/res/values-de/strings.xml +++ b/libs/WindowManager/Shell/res/values-de/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"Screenshot"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"Im Browser öffnen"</string> <string name="new_window_text" msgid="6318648868380652280">"Neues Fenster"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <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> - <string name="expand_menu_text" msgid="3847736164494181168">"Menü öffnen"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-el/strings.xml b/libs/WindowManager/Shell/res/values-el/strings.xml index f66d8744c793..564fa910fdcd 100644 --- a/libs/WindowManager/Shell/res/values-el/strings.xml +++ b/libs/WindowManager/Shell/res/values-el/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"Στιγμιότυπο οθόνης"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"Άνοιγμα σε πρόγραμμα περιήγησης"</string> <string name="new_window_text" msgid="6318648868380652280">"Νέο παράθυρο"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <string name="manage_windows_text" msgid="5567366688493093920">"Διαχείριση παραθύρων"</string> <string name="close_text" msgid="4986518933445178928">"Κλείσιμο"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Κλείσιμο μενού"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"Άνοιγμα μενού"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <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 0b11cb530a52..e4ece9386a3f 100644 --- a/libs/WindowManager/Shell/res/values-en-rAU/strings.xml +++ b/libs/WindowManager/Shell/res/values-en-rAU/strings.xml @@ -126,8 +126,15 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Manage windows"</string> <string name="close_text" msgid="4986518933445178928">"Close"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Close menu"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"Open menu"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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> + <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <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 a09e1e90b4d5..14fe60b3e3cb 100644 --- a/libs/WindowManager/Shell/res/values-en-rCA/strings.xml +++ b/libs/WindowManager/Shell/res/values-en-rCA/strings.xml @@ -126,8 +126,15 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Manage Windows"</string> <string name="close_text" msgid="4986518933445178928">"Close"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Close Menu"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"Open Menu"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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> + <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <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 0b11cb530a52..e4ece9386a3f 100644 --- a/libs/WindowManager/Shell/res/values-en-rGB/strings.xml +++ b/libs/WindowManager/Shell/res/values-en-rGB/strings.xml @@ -126,8 +126,15 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Manage windows"</string> <string name="close_text" msgid="4986518933445178928">"Close"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Close menu"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"Open menu"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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> + <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <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 0b11cb530a52..e4ece9386a3f 100644 --- a/libs/WindowManager/Shell/res/values-en-rIN/strings.xml +++ b/libs/WindowManager/Shell/res/values-en-rIN/strings.xml @@ -126,8 +126,15 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Manage windows"</string> <string name="close_text" msgid="4986518933445178928">"Close"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Close menu"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"Open menu"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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> + <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <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 7662a14fa4c5..dda97abf7b03 100644 --- a/libs/WindowManager/Shell/res/values-en-rXC/strings.xml +++ b/libs/WindowManager/Shell/res/values-en-rXC/strings.xml @@ -126,8 +126,15 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Manage Windows"</string> <string name="close_text" msgid="4986518933445178928">"Close"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Close Menu"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"Open Menu"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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> + <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <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 7a324e3dba7a..a4c03632cbe4 100644 --- a/libs/WindowManager/Shell/res/values-es-rUS/strings.xml +++ b/libs/WindowManager/Shell/res/values-es-rUS/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"Captura de pantalla"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"Abrir en el navegador"</string> <string name="new_window_text" msgid="6318648868380652280">"Nueva ventana"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <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> - <string name="expand_menu_text" msgid="3847736164494181168">"Abrir el menú"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-es/strings.xml b/libs/WindowManager/Shell/res/values-es/strings.xml index 27272aae46a3..69f7d7b020d6 100644 --- a/libs/WindowManager/Shell/res/values-es/strings.xml +++ b/libs/WindowManager/Shell/res/values-es/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"Captura de pantalla"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"Abrir en el navegador"</string> <string name="new_window_text" msgid="6318648868380652280">"Ventana nueva"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <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> - <string name="expand_menu_text" msgid="3847736164494181168">"Abrir menú"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-et/strings.xml b/libs/WindowManager/Shell/res/values-et/strings.xml index d859f01fd6f0..3d929f6cd8d3 100644 --- a/libs/WindowManager/Shell/res/values-et/strings.xml +++ b/libs/WindowManager/Shell/res/values-et/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"Ekraanipilt"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"Avamine brauseris"</string> <string name="new_window_text" msgid="6318648868380652280">"Uus aken"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <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> - <string name="expand_menu_text" msgid="3847736164494181168">"Ava menüü"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-eu/strings.xml b/libs/WindowManager/Shell/res/values-eu/strings.xml index 999960b1a934..39bcf080fcf3 100644 --- a/libs/WindowManager/Shell/res/values-eu/strings.xml +++ b/libs/WindowManager/Shell/res/values-eu/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"Pantaila-argazkia"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"Ireki arakatzailean"</string> <string name="new_window_text" msgid="6318648868380652280">"Leiho berria"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <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> - <string name="expand_menu_text" msgid="3847736164494181168">"Ireki menua"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-fa/strings.xml b/libs/WindowManager/Shell/res/values-fa/strings.xml index e31a6caea9e3..9f607bf89656 100644 --- a/libs/WindowManager/Shell/res/values-fa/strings.xml +++ b/libs/WindowManager/Shell/res/values-fa/strings.xml @@ -126,8 +126,15 @@ <string name="manage_windows_text" msgid="5567366688493093920">"مدیریت کردن پنجرهها"</string> <string name="close_text" msgid="4986518933445178928">"بستن"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"بستن منو"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"باز کردن منو"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-fi/strings.xml b/libs/WindowManager/Shell/res/values-fi/strings.xml index 71c3e36f487f..04b6241ca90b 100644 --- a/libs/WindowManager/Shell/res/values-fi/strings.xml +++ b/libs/WindowManager/Shell/res/values-fi/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"Kuvakaappaus"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"Avaa selaimessa"</string> <string name="new_window_text" msgid="6318648868380652280">"Uusi ikkuna"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <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> - <string name="expand_menu_text" msgid="3847736164494181168">"Avaa valikko"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <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 790a29685ead..73129525ebdd 100644 --- a/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml +++ b/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"Capture d\'écran"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"Ouvrir dans le navigateur"</string> <string name="new_window_text" msgid="6318648868380652280">"Nouvelle fenêtre"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <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> - <string name="expand_menu_text" msgid="3847736164494181168">"Ouvrir le menu"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-fr/strings.xml b/libs/WindowManager/Shell/res/values-fr/strings.xml index 3472edd212b8..8f4e58f99a13 100644 --- a/libs/WindowManager/Shell/res/values-fr/strings.xml +++ b/libs/WindowManager/Shell/res/values-fr/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"Capture d\'écran"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"Ouvrir dans un navigateur"</string> <string name="new_window_text" msgid="6318648868380652280">"Nouvelle fenêtre"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <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> - <string name="expand_menu_text" msgid="3847736164494181168">"Ouvrir le menu"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-gl/strings.xml b/libs/WindowManager/Shell/res/values-gl/strings.xml index 31cb71d939ff..5c0aa074b329 100644 --- a/libs/WindowManager/Shell/res/values-gl/strings.xml +++ b/libs/WindowManager/Shell/res/values-gl/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"Captura de pantalla"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"Abrir no navegador"</string> <string name="new_window_text" msgid="6318648868380652280">"Ventá nova"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <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> - <string name="expand_menu_text" msgid="3847736164494181168">"Abrir menú"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-gu/strings.xml b/libs/WindowManager/Shell/res/values-gu/strings.xml index e1f58063ed49..a382d0b41652 100644 --- a/libs/WindowManager/Shell/res/values-gu/strings.xml +++ b/libs/WindowManager/Shell/res/values-gu/strings.xml @@ -126,8 +126,15 @@ <string name="manage_windows_text" msgid="5567366688493093920">"વિન્ડો મેનેજ કરો"</string> <string name="close_text" msgid="4986518933445178928">"બંધ કરો"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"મેનૂ બંધ કરો"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"મેનૂ ખોલો"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-hi/strings.xml b/libs/WindowManager/Shell/res/values-hi/strings.xml index cea4b2359f5e..d6fc85b6cdcc 100644 --- a/libs/WindowManager/Shell/res/values-hi/strings.xml +++ b/libs/WindowManager/Shell/res/values-hi/strings.xml @@ -126,8 +126,15 @@ <string name="manage_windows_text" msgid="5567366688493093920">"विंडो मैनेज करें"</string> <string name="close_text" msgid="4986518933445178928">"बंद करें"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"मेन्यू बंद करें"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"मेन्यू खोलें"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-hr/strings.xml b/libs/WindowManager/Shell/res/values-hr/strings.xml index 23cddbc88b2d..f233c029c752 100644 --- a/libs/WindowManager/Shell/res/values-hr/strings.xml +++ b/libs/WindowManager/Shell/res/values-hr/strings.xml @@ -126,8 +126,15 @@ <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> - <string name="expand_menu_text" msgid="3847736164494181168">"Otvaranje izbornika"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-hu/strings.xml b/libs/WindowManager/Shell/res/values-hu/strings.xml index e3c3ced83e38..aaa4e2654f39 100644 --- a/libs/WindowManager/Shell/res/values-hu/strings.xml +++ b/libs/WindowManager/Shell/res/values-hu/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"Képernyőkép"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"Megnyitás böngészőben"</string> <string name="new_window_text" msgid="6318648868380652280">"Új ablak"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <string name="manage_windows_text" msgid="5567366688493093920">"Ablakok kezelése"</string> <string name="close_text" msgid="4986518933445178928">"Bezárás"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Menü bezárása"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"Menü megnyitása"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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> + <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-hy/strings.xml b/libs/WindowManager/Shell/res/values-hy/strings.xml index 56b609b8a832..cd21faab45c2 100644 --- a/libs/WindowManager/Shell/res/values-hy/strings.xml +++ b/libs/WindowManager/Shell/res/values-hy/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"Սքրինշոթ"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"Բացել դիտարկիչում"</string> <string name="new_window_text" msgid="6318648868380652280">"Նոր պատուհան"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <string name="manage_windows_text" msgid="5567366688493093920">"Կառավարել պատուհանները"</string> <string name="close_text" msgid="4986518933445178928">"Փակել"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Փակել ընտրացանկը"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"Բացել ընտրացանկը"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-in/strings.xml b/libs/WindowManager/Shell/res/values-in/strings.xml index a83d51e3c1f6..ba0683deecd8 100644 --- a/libs/WindowManager/Shell/res/values-in/strings.xml +++ b/libs/WindowManager/Shell/res/values-in/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"Screenshot"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"Buka di browser"</string> <string name="new_window_text" msgid="6318648868380652280">"Jendela Baru"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <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> - <string name="expand_menu_text" msgid="3847736164494181168">"Buka Menu"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-is/strings.xml b/libs/WindowManager/Shell/res/values-is/strings.xml index e7590cbd0778..b427eaf23290 100644 --- a/libs/WindowManager/Shell/res/values-is/strings.xml +++ b/libs/WindowManager/Shell/res/values-is/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"Skjámynd"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"Opna í vafra"</string> <string name="new_window_text" msgid="6318648868380652280">"Nýr gluggi"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <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> - <string name="expand_menu_text" msgid="3847736164494181168">"Opna valmynd"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-it/strings.xml b/libs/WindowManager/Shell/res/values-it/strings.xml index bd74fbed9ac7..9eb9d4e3a403 100644 --- a/libs/WindowManager/Shell/res/values-it/strings.xml +++ b/libs/WindowManager/Shell/res/values-it/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"Screenshot"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"Apri nel browser"</string> <string name="new_window_text" msgid="6318648868380652280">"Nuova finestra"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <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> - <string name="expand_menu_text" msgid="3847736164494181168">"Apri menu"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-iw/strings.xml b/libs/WindowManager/Shell/res/values-iw/strings.xml index d8533bbd814d..3e82198201b9 100644 --- a/libs/WindowManager/Shell/res/values-iw/strings.xml +++ b/libs/WindowManager/Shell/res/values-iw/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"צילום מסך"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"פתיחה בדפדפן"</string> <string name="new_window_text" msgid="6318648868380652280">"חלון חדש"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <string name="manage_windows_text" msgid="5567366688493093920">"ניהול החלונות"</string> <string name="close_text" msgid="4986518933445178928">"סגירה"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"סגירת התפריט"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"פתיחת התפריט"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-ja/strings.xml b/libs/WindowManager/Shell/res/values-ja/strings.xml index 26540c7ddc59..5d8dc5e85462 100644 --- a/libs/WindowManager/Shell/res/values-ja/strings.xml +++ b/libs/WindowManager/Shell/res/values-ja/strings.xml @@ -126,8 +126,15 @@ <string name="manage_windows_text" msgid="5567366688493093920">"ウィンドウを管理する"</string> <string name="close_text" msgid="4986518933445178928">"閉じる"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"メニューを閉じる"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"メニューを開く"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-ka/strings.xml b/libs/WindowManager/Shell/res/values-ka/strings.xml index d2fbcb1c66fc..de08b9ca2d7e 100644 --- a/libs/WindowManager/Shell/res/values-ka/strings.xml +++ b/libs/WindowManager/Shell/res/values-ka/strings.xml @@ -126,8 +126,15 @@ <string name="manage_windows_text" msgid="5567366688493093920">"ფანჯრების მართვა"</string> <string name="close_text" msgid="4986518933445178928">"დახურვა"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"მენიუს დახურვა"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"მენიუს გახსნა"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-kk/strings.xml b/libs/WindowManager/Shell/res/values-kk/strings.xml index 43c2f83d884d..dd4e5c94fc27 100644 --- a/libs/WindowManager/Shell/res/values-kk/strings.xml +++ b/libs/WindowManager/Shell/res/values-kk/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"Скриншот"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"Браузерден ашу"</string> <string name="new_window_text" msgid="6318648868380652280">"Жаңа терезе"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <string name="manage_windows_text" msgid="5567366688493093920">"Терезелерді басқару"</string> <string name="close_text" msgid="4986518933445178928">"Жабу"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Мәзірді жабу"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"Мәзірді ашу"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-km/strings.xml b/libs/WindowManager/Shell/res/values-km/strings.xml index c0bf1bf07f47..96fe62e4f034 100644 --- a/libs/WindowManager/Shell/res/values-km/strings.xml +++ b/libs/WindowManager/Shell/res/values-km/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"រូបថតអេក្រង់"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"បើកក្នុងកម្មវិធីរុករកតាមអ៊ីនធឺណិត"</string> <string name="new_window_text" msgid="6318648868380652280">"វិនដូថ្មី"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <string name="manage_windows_text" msgid="5567366688493093920">"គ្រប់គ្រងវិនដូ"</string> <string name="close_text" msgid="4986518933445178928">"បិទ"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"បិទម៉ឺនុយ"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"បើកម៉ឺនុយ"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-kn/strings.xml b/libs/WindowManager/Shell/res/values-kn/strings.xml index 92b8ad444666..b38f74411db2 100644 --- a/libs/WindowManager/Shell/res/values-kn/strings.xml +++ b/libs/WindowManager/Shell/res/values-kn/strings.xml @@ -34,8 +34,8 @@ <string name="dock_forced_resizable" msgid="7429086980048964687">"ಸ್ಪ್ಲಿಟ್ ಸ್ಕ್ರೀನ್ನಲ್ಲಿ ಆ್ಯಪ್ ಕೆಲಸ ಮಾಡದೇ ಇರಬಹುದು"</string> <string name="dock_non_resizeble_failed_to_dock_text" msgid="2733543750291266047">"ಸ್ಪ್ಲಿಟ್ ಸ್ಕ್ರೀನ್ ಅನ್ನು ಆ್ಯಪ್ ಬೆಂಬಲಿಸುವುದಿಲ್ಲ"</string> <string name="dock_multi_instances_not_supported_text" msgid="5011042177901502928">"ಈ ಆ್ಯಪ್ ಅನ್ನು 1 ವಿಂಡೋದಲ್ಲಿ ಮಾತ್ರ ತೆರೆಯಬಹುದು"</string> - <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"ಸೆಕೆಂಡರಿ ಡಿಸ್ಪ್ಲೇಗಳಲ್ಲಿ ಅಪ್ಲಿಕೇಶನ್ ಕಾರ್ಯ ನಿರ್ವಹಿಸದೇ ಇರಬಹುದು."</string> - <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"ಸೆಕೆಂಡರಿ ಡಿಸ್ಪ್ಲೇಗಳಲ್ಲಿ ಪ್ರಾರಂಭಿಸುವಿಕೆಯನ್ನು ಅಪ್ಲಿಕೇಶನ್ ಬೆಂಬಲಿಸುವುದಿಲ್ಲ."</string> + <string name="forced_resizable_secondary_display" msgid="1768046938673582671">"ಸೆಕೆಂಡರಿ ಡಿಸ್ಪ್ಲೇಗಳಲ್ಲಿ ಆ್ಯಪ್ ಕಾರ್ಯ ನಿರ್ವಹಿಸದೇ ಇರಬಹುದು."</string> + <string name="activity_launch_on_secondary_display_failed_text" msgid="4226485344988071769">"ಸೆಕೆಂಡರಿ ಡಿಸ್ಪ್ಲೇಗಳಲ್ಲಿ ಪ್ರಾರಂಭಿಸುವಿಕೆಯನ್ನು ಆ್ಯಪ್ ಬೆಂಬಲಿಸುವುದಿಲ್ಲ."</string> <string name="accessibility_divider" msgid="6407584574218956849">"ಸ್ಪ್ಲಿಟ್ ಸ್ಕ್ರೀನ್ ಡಿವೈಡರ್"</string> <string name="divider_title" msgid="1963391955593749442">"ಸ್ಪ್ಲಿಟ್ ಸ್ಕ್ರೀನ್ ಡಿವೈಡರ್"</string> <string name="accessibility_action_divider_left_full" msgid="1792313656305328536">"ಎಡ ಫುಲ್ ಸ್ಕ್ರೀನ್"</string> @@ -126,8 +126,15 @@ <string name="manage_windows_text" msgid="5567366688493093920">"ವಿಂಡೋಗಳನ್ನು ನಿರ್ವಹಿಸಿ"</string> <string name="close_text" msgid="4986518933445178928">"ಮುಚ್ಚಿ"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"ಮೆನು ಮುಚ್ಚಿ"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"ಮೆನು ತೆರೆಯಿರಿ"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-ko/strings.xml b/libs/WindowManager/Shell/res/values-ko/strings.xml index b52c8a169eff..421d4666911e 100644 --- a/libs/WindowManager/Shell/res/values-ko/strings.xml +++ b/libs/WindowManager/Shell/res/values-ko/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"스크린샷"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"브라우저에서 열기"</string> <string name="new_window_text" msgid="6318648868380652280">"새 창"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <string name="manage_windows_text" msgid="5567366688493093920">"창 관리"</string> <string name="close_text" msgid="4986518933445178928">"닫기"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"메뉴 닫기"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"메뉴 열기"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-ky/strings.xml b/libs/WindowManager/Shell/res/values-ky/strings.xml index f994d1e82dd3..abafd7ac0330 100644 --- a/libs/WindowManager/Shell/res/values-ky/strings.xml +++ b/libs/WindowManager/Shell/res/values-ky/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"Скриншот"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"Серепчиден ачуу"</string> <string name="new_window_text" msgid="6318648868380652280">"Жаңы терезе"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <string name="manage_windows_text" msgid="5567366688493093920">"Терезелерди тескөө"</string> <string name="close_text" msgid="4986518933445178928">"Жабуу"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Менюну жабуу"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"Менюну ачуу"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-lo/strings.xml b/libs/WindowManager/Shell/res/values-lo/strings.xml index 459f3a218a31..5bc5316494b3 100644 --- a/libs/WindowManager/Shell/res/values-lo/strings.xml +++ b/libs/WindowManager/Shell/res/values-lo/strings.xml @@ -126,8 +126,15 @@ <string name="manage_windows_text" msgid="5567366688493093920">"ຈັດການໜ້າຈໍ"</string> <string name="close_text" msgid="4986518933445178928">"ປິດ"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"ປິດເມນູ"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"ເປີດເມນູ"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-lt/strings.xml b/libs/WindowManager/Shell/res/values-lt/strings.xml index 2bfd9d32093a..01a72ee4cced 100644 --- a/libs/WindowManager/Shell/res/values-lt/strings.xml +++ b/libs/WindowManager/Shell/res/values-lt/strings.xml @@ -126,8 +126,15 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Tvarkyti langus"</string> <string name="close_text" msgid="4986518933445178928">"Uždaryti"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Uždaryti meniu"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"Atidaryti meniu"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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> + <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-lv/strings.xml b/libs/WindowManager/Shell/res/values-lv/strings.xml index b6012740b4cd..2f235babd721 100644 --- a/libs/WindowManager/Shell/res/values-lv/strings.xml +++ b/libs/WindowManager/Shell/res/values-lv/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"Ekrānuzņēmums"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"Atvērt pārlūkā"</string> <string name="new_window_text" msgid="6318648868380652280">"Jauns logs"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <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> - <string name="expand_menu_text" msgid="3847736164494181168">"Atvērt izvēlni"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-mk/strings.xml b/libs/WindowManager/Shell/res/values-mk/strings.xml index 96e7f2527e0b..e58d8fc945f4 100644 --- a/libs/WindowManager/Shell/res/values-mk/strings.xml +++ b/libs/WindowManager/Shell/res/values-mk/strings.xml @@ -126,8 +126,15 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Управувајте со прозорци"</string> <string name="close_text" msgid="4986518933445178928">"Затворете"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Затворете го менито"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"Отвори го менито"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-ml/strings.xml b/libs/WindowManager/Shell/res/values-ml/strings.xml index a77c203c325e..d51c3fb70a9e 100644 --- a/libs/WindowManager/Shell/res/values-ml/strings.xml +++ b/libs/WindowManager/Shell/res/values-ml/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"സ്ക്രീൻഷോട്ട്"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"ബ്രൗസറിൽ തുറക്കുക"</string> <string name="new_window_text" msgid="6318648868380652280">"പുതിയ വിന്ഡോ"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <string name="manage_windows_text" msgid="5567366688493093920">"വിൻഡോകൾ മാനേജ് ചെയ്യുക"</string> <string name="close_text" msgid="4986518933445178928">"അടയ്ക്കുക"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"മെനു അടയ്ക്കുക"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"മെനു തുറക്കുക"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-mn/strings.xml b/libs/WindowManager/Shell/res/values-mn/strings.xml index 5c7f5483922d..f7e6a6c87890 100644 --- a/libs/WindowManager/Shell/res/values-mn/strings.xml +++ b/libs/WindowManager/Shell/res/values-mn/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"Дэлгэцийн агшин"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"Хөтчид нээх"</string> <string name="new_window_text" msgid="6318648868380652280">"Шинэ цонх"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <string name="manage_windows_text" msgid="5567366688493093920">"Windows-г удирдах"</string> <string name="close_text" msgid="4986518933445178928">"Хаах"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Цэсийг хаах"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"Цэс нээх"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-mr/strings.xml b/libs/WindowManager/Shell/res/values-mr/strings.xml index a78b37b43c8b..483228424d44 100644 --- a/libs/WindowManager/Shell/res/values-mr/strings.xml +++ b/libs/WindowManager/Shell/res/values-mr/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"स्क्रीनशॉट"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"ब्राउझरमध्ये उघडा"</string> <string name="new_window_text" msgid="6318648868380652280">"नवीन विंडो"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <string name="manage_windows_text" msgid="5567366688493093920">"विंडो व्यवस्थापित करा"</string> <string name="close_text" msgid="4986518933445178928">"बंद करा"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"मेनू बंद करा"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"मेनू उघडा"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-ms/strings.xml b/libs/WindowManager/Shell/res/values-ms/strings.xml index fa2c1c52318b..e510d723f1e5 100644 --- a/libs/WindowManager/Shell/res/values-ms/strings.xml +++ b/libs/WindowManager/Shell/res/values-ms/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"Tangkapan skrin"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"Buka dalam penyemak imbas"</string> <string name="new_window_text" msgid="6318648868380652280">"Tetingkap Baharu"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <string name="manage_windows_text" msgid="5567366688493093920">"Urus Tetingkap"</string> <string name="close_text" msgid="4986518933445178928">"Tutup"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Tutup Menu"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"Buka Menu"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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> + <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-my/strings.xml b/libs/WindowManager/Shell/res/values-my/strings.xml index 48449c0ce834..aac6f8420d7a 100644 --- a/libs/WindowManager/Shell/res/values-my/strings.xml +++ b/libs/WindowManager/Shell/res/values-my/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"ဖန်သားပြင်ဓာတ်ပုံ"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"ဘရောင်ဇာတွင် ဖွင့်ရန်"</string> <string name="new_window_text" msgid="6318648868380652280">"ဝင်းဒိုးအသစ်"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <string name="manage_windows_text" msgid="5567366688493093920">"ဝင်းဒိုးများ စီမံရန်"</string> <string name="close_text" msgid="4986518933445178928">"ပိတ်ရန်"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"မီနူး ပိတ်ရန်"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"မီနူး ဖွင့်ရန်"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-nb/strings.xml b/libs/WindowManager/Shell/res/values-nb/strings.xml index 5697f0de6bdc..175133d1744a 100644 --- a/libs/WindowManager/Shell/res/values-nb/strings.xml +++ b/libs/WindowManager/Shell/res/values-nb/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"Skjermbilde"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"Åpne i nettleseren"</string> <string name="new_window_text" msgid="6318648868380652280">"Nytt vindu"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <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> - <string name="expand_menu_text" msgid="3847736164494181168">"Åpne menyen"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-ne/strings.xml b/libs/WindowManager/Shell/res/values-ne/strings.xml index 365a3b378f43..d3a7e12c0df4 100644 --- a/libs/WindowManager/Shell/res/values-ne/strings.xml +++ b/libs/WindowManager/Shell/res/values-ne/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"स्क्रिनसट"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"ब्राउजरमा खोल्नुहोस्"</string> <string name="new_window_text" msgid="6318648868380652280">"नयाँ विन्डो"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <string name="manage_windows_text" msgid="5567366688493093920">"विन्डोहरू व्यवस्थापन गर्नुहोस्"</string> <string name="close_text" msgid="4986518933445178928">"बन्द गर्नुहोस्"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"मेनु बन्द गर्नुहोस्"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"मेनु खोल्नुहोस्"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-nl/strings.xml b/libs/WindowManager/Shell/res/values-nl/strings.xml index 9cf1551ac0dc..747afe3eb034 100644 --- a/libs/WindowManager/Shell/res/values-nl/strings.xml +++ b/libs/WindowManager/Shell/res/values-nl/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"Screenshot"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"Openen in browser"</string> <string name="new_window_text" msgid="6318648868380652280">"Nieuw venster"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <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> - <string name="expand_menu_text" msgid="3847736164494181168">"Menu openen"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-or/strings.xml b/libs/WindowManager/Shell/res/values-or/strings.xml index 9f7342cb4059..a5adcbe36db1 100644 --- a/libs/WindowManager/Shell/res/values-or/strings.xml +++ b/libs/WindowManager/Shell/res/values-or/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"ସ୍କ୍ରିନସଟ"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"ବ୍ରାଉଜରରେ ଖୋଲନ୍ତୁ"</string> <string name="new_window_text" msgid="6318648868380652280">"ନୂଆ ୱିଣ୍ଡୋ"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <string name="manage_windows_text" msgid="5567366688493093920">"ୱିଣ୍ଡୋଗୁଡ଼ିକୁ ପରିଚାଳନା କରନ୍ତୁ"</string> <string name="close_text" msgid="4986518933445178928">"ବନ୍ଦ କରନ୍ତୁ"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"ମେନୁ ବନ୍ଦ କରନ୍ତୁ"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"ମେନୁ ଖୋଲନ୍ତୁ"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-pa/strings.xml b/libs/WindowManager/Shell/res/values-pa/strings.xml index 48fa55213b66..5a4e61a2303b 100644 --- a/libs/WindowManager/Shell/res/values-pa/strings.xml +++ b/libs/WindowManager/Shell/res/values-pa/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"ਸਕ੍ਰੀਨਸ਼ਾਟ"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"ਬ੍ਰਾਊਜ਼ਰ ਵਿੱਚ ਖੋਲ੍ਹੋ"</string> <string name="new_window_text" msgid="6318648868380652280">"ਨਵੀਂ ਵਿੰਡੋ"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <string name="manage_windows_text" msgid="5567366688493093920">"ਵਿੰਡੋਆਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ"</string> <string name="close_text" msgid="4986518933445178928">"ਬੰਦ ਕਰੋ"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"ਮੀਨੂ ਬੰਦ ਕਰੋ"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"ਮੀਨੂ ਖੋਲ੍ਹੋ"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-pl/strings.xml b/libs/WindowManager/Shell/res/values-pl/strings.xml index 211ae9852450..a14bb99286f8 100644 --- a/libs/WindowManager/Shell/res/values-pl/strings.xml +++ b/libs/WindowManager/Shell/res/values-pl/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"Zrzut ekranu"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"Otwórz w przeglądarce"</string> <string name="new_window_text" msgid="6318648868380652280">"Nowe okno"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <string name="manage_windows_text" msgid="5567366688493093920">"Zarządzaj oknami"</string> <string name="close_text" msgid="4986518933445178928">"Zamknij"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Zamknij menu"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"Otwórz menu"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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> + <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <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 dfae5d84bfdc..75c445c6f35c 100644 --- a/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml +++ b/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"Captura de tela"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"Abrir no navegador"</string> <string name="new_window_text" msgid="6318648868380652280">"Nova janela"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <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> - <string name="expand_menu_text" msgid="3847736164494181168">"Abrir o menu"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <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 1399b26ec68c..1d31d0d92309 100644 --- a/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml +++ b/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml @@ -126,8 +126,15 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Faça a gestão das janelas"</string> <string name="close_text" msgid="4986518933445178928">"Fechar"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Fechar menu"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"Abrir menu"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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> + <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-pt/strings.xml b/libs/WindowManager/Shell/res/values-pt/strings.xml index dfae5d84bfdc..75c445c6f35c 100644 --- a/libs/WindowManager/Shell/res/values-pt/strings.xml +++ b/libs/WindowManager/Shell/res/values-pt/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"Captura de tela"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"Abrir no navegador"</string> <string name="new_window_text" msgid="6318648868380652280">"Nova janela"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <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> - <string name="expand_menu_text" msgid="3847736164494181168">"Abrir o menu"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-ro/strings.xml b/libs/WindowManager/Shell/res/values-ro/strings.xml index 2f458e9bc0de..3c763ea8a6a4 100644 --- a/libs/WindowManager/Shell/res/values-ro/strings.xml +++ b/libs/WindowManager/Shell/res/values-ro/strings.xml @@ -126,8 +126,15 @@ <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> - <string name="expand_menu_text" msgid="3847736164494181168">"Deschide meniul"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-ru/strings.xml b/libs/WindowManager/Shell/res/values-ru/strings.xml index a7fdd41d2dda..a6c20adc4c2e 100644 --- a/libs/WindowManager/Shell/res/values-ru/strings.xml +++ b/libs/WindowManager/Shell/res/values-ru/strings.xml @@ -126,8 +126,15 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Управление окнами"</string> <string name="close_text" msgid="4986518933445178928">"Закрыть"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Закрыть меню"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"Открыть меню"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-si/strings.xml b/libs/WindowManager/Shell/res/values-si/strings.xml index bbfafb6035ac..ed762699bc49 100644 --- a/libs/WindowManager/Shell/res/values-si/strings.xml +++ b/libs/WindowManager/Shell/res/values-si/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"තිර රුව"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"බ්රව්සරයේ විවෘත කරන්න"</string> <string name="new_window_text" msgid="6318648868380652280">"නව කවුළුව"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <string name="manage_windows_text" msgid="5567366688493093920">"කවුළු කළමනාකරණය කරන්න"</string> <string name="close_text" msgid="4986518933445178928">"වසන්න"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"මෙනුව වසන්න"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"මෙනුව විවෘත කරන්න"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-sk/strings.xml b/libs/WindowManager/Shell/res/values-sk/strings.xml index da7a834d0072..529a6932c9ce 100644 --- a/libs/WindowManager/Shell/res/values-sk/strings.xml +++ b/libs/WindowManager/Shell/res/values-sk/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"Snímka obrazovky"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"Otvoriť v prehliadači"</string> <string name="new_window_text" msgid="6318648868380652280">"Nové okno"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <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> - <string name="expand_menu_text" msgid="3847736164494181168">"Otvoriť ponuku"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-sl/strings.xml b/libs/WindowManager/Shell/res/values-sl/strings.xml index 0434e5440f10..fe08e04b21a3 100644 --- a/libs/WindowManager/Shell/res/values-sl/strings.xml +++ b/libs/WindowManager/Shell/res/values-sl/strings.xml @@ -126,8 +126,15 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Upravljanje oken"</string> <string name="close_text" msgid="4986518933445178928">"Zapri"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Zapri meni"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"Odpri meni"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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> + <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-sq/strings.xml b/libs/WindowManager/Shell/res/values-sq/strings.xml index 65a270da90c5..a4a7e744c426 100644 --- a/libs/WindowManager/Shell/res/values-sq/strings.xml +++ b/libs/WindowManager/Shell/res/values-sq/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"Pamja e ekranit"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"Hape në shfletues"</string> <string name="new_window_text" msgid="6318648868380652280">"Dritare e re"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <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> - <string name="expand_menu_text" msgid="3847736164494181168">"Hap menynë"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-sr/strings.xml b/libs/WindowManager/Shell/res/values-sr/strings.xml index caa9c7dad9b5..9545ccf7a810 100644 --- a/libs/WindowManager/Shell/res/values-sr/strings.xml +++ b/libs/WindowManager/Shell/res/values-sr/strings.xml @@ -126,8 +126,15 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Управљајте прозорима"</string> <string name="close_text" msgid="4986518933445178928">"Затворите"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Затворите мени"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"Отворите мени"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-sv/strings.xml b/libs/WindowManager/Shell/res/values-sv/strings.xml index 681ef8ba97e4..c43f5dfa7b02 100644 --- a/libs/WindowManager/Shell/res/values-sv/strings.xml +++ b/libs/WindowManager/Shell/res/values-sv/strings.xml @@ -126,8 +126,15 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Hantera fönster"</string> <string name="close_text" msgid="4986518933445178928">"Stäng"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Stäng menyn"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"Öppna menyn"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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> + <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-sw/strings.xml b/libs/WindowManager/Shell/res/values-sw/strings.xml index bb314a3ac153..c6ce023a5ca7 100644 --- a/libs/WindowManager/Shell/res/values-sw/strings.xml +++ b/libs/WindowManager/Shell/res/values-sw/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"Picha ya skrini"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"Fungua katika kivinjari"</string> <string name="new_window_text" msgid="6318648868380652280">"Dirisha Jipya"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <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> - <string name="expand_menu_text" msgid="3847736164494181168">"Fungua Menyu"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-ta/strings.xml b/libs/WindowManager/Shell/res/values-ta/strings.xml index 686e705dc68a..2c2f31978b0f 100644 --- a/libs/WindowManager/Shell/res/values-ta/strings.xml +++ b/libs/WindowManager/Shell/res/values-ta/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"ஸ்கிரீன்ஷாட்"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"உலாவியில் திறக்கும்"</string> <string name="new_window_text" msgid="6318648868380652280">"புதிய சாளரம்"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <string name="manage_windows_text" msgid="5567366688493093920">"சாளரங்களை நிர்வகிக்கலாம்"</string> <string name="close_text" msgid="4986518933445178928">"மூடும்"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"மெனுவை மூடும்"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"மெனுவைத் திற"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-te/strings.xml b/libs/WindowManager/Shell/res/values-te/strings.xml index 7b554d936eb1..8691c9d5aa26 100644 --- a/libs/WindowManager/Shell/res/values-te/strings.xml +++ b/libs/WindowManager/Shell/res/values-te/strings.xml @@ -126,8 +126,15 @@ <string name="manage_windows_text" msgid="5567366688493093920">"విండోలను మేనేజ్ చేయండి"</string> <string name="close_text" msgid="4986518933445178928">"మూసివేయండి"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"మెనూను మూసివేయండి"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"మెనూను తెరవండి"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-th/strings.xml b/libs/WindowManager/Shell/res/values-th/strings.xml index 59deabb2a2e0..07e141601d08 100644 --- a/libs/WindowManager/Shell/res/values-th/strings.xml +++ b/libs/WindowManager/Shell/res/values-th/strings.xml @@ -126,8 +126,15 @@ <string name="manage_windows_text" msgid="5567366688493093920">"จัดการหน้าต่าง"</string> <string name="close_text" msgid="4986518933445178928">"ปิด"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"ปิดเมนู"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"เปิดเมนู"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-tl/strings.xml b/libs/WindowManager/Shell/res/values-tl/strings.xml index 79e968d87b14..477700e7bbdf 100644 --- a/libs/WindowManager/Shell/res/values-tl/strings.xml +++ b/libs/WindowManager/Shell/res/values-tl/strings.xml @@ -126,8 +126,15 @@ <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> - <string name="expand_menu_text" msgid="3847736164494181168">"Buksan ang Menu"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-tr/strings.xml b/libs/WindowManager/Shell/res/values-tr/strings.xml index e5bca20178c2..b0c253965970 100644 --- a/libs/WindowManager/Shell/res/values-tr/strings.xml +++ b/libs/WindowManager/Shell/res/values-tr/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"Ekran görüntüsü"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"Tarayıcıda aç"</string> <string name="new_window_text" msgid="6318648868380652280">"Yeni Pencere"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <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> - <string name="expand_menu_text" msgid="3847736164494181168">"Menüyü Aç"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-uk/strings.xml b/libs/WindowManager/Shell/res/values-uk/strings.xml index 0e877b005615..dd64c6642104 100644 --- a/libs/WindowManager/Shell/res/values-uk/strings.xml +++ b/libs/WindowManager/Shell/res/values-uk/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"Знімок екрана"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"Відкрити у вебпереглядачі"</string> <string name="new_window_text" msgid="6318648868380652280">"Нове вікно"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <string name="manage_windows_text" msgid="5567366688493093920">"Керувати вікнами"</string> <string name="close_text" msgid="4986518933445178928">"Закрити"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Закрити меню"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"Відкрити меню"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-ur/strings.xml b/libs/WindowManager/Shell/res/values-ur/strings.xml index 06807957b37a..aa311c2978c8 100644 --- a/libs/WindowManager/Shell/res/values-ur/strings.xml +++ b/libs/WindowManager/Shell/res/values-ur/strings.xml @@ -126,8 +126,15 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Windows کا نظم کریں"</string> <string name="close_text" msgid="4986518933445178928">"بند کریں"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"مینیو بند کریں"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"مینو کھولیں"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-uz/strings.xml b/libs/WindowManager/Shell/res/values-uz/strings.xml index 4e0eb532a2a4..8754629df761 100644 --- a/libs/WindowManager/Shell/res/values-uz/strings.xml +++ b/libs/WindowManager/Shell/res/values-uz/strings.xml @@ -126,8 +126,15 @@ <string name="manage_windows_text" msgid="5567366688493093920">"Oynalarni boshqarish"</string> <string name="close_text" msgid="4986518933445178928">"Yopish"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"Menyuni yopish"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"Menyuni ochish"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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> + <!-- no translation found for desktop_mode_maximize_menu_maximize_button_text (3090199175564175845) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-vi/strings.xml b/libs/WindowManager/Shell/res/values-vi/strings.xml index c5d76ea79355..abac3fe824bb 100644 --- a/libs/WindowManager/Shell/res/values-vi/strings.xml +++ b/libs/WindowManager/Shell/res/values-vi/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"Ảnh chụp màn hình"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"Mở trong trình duyệt"</string> <string name="new_window_text" msgid="6318648868380652280">"Cửa sổ mới"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <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> - <string name="expand_menu_text" msgid="3847736164494181168">"Mở Trình đơn"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <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 1202168e1f64..5a61decdcfb9 100644 --- a/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml +++ b/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"屏幕截图"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"在浏览器中打开"</string> <string name="new_window_text" msgid="6318648868380652280">"新窗口"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <string name="manage_windows_text" msgid="5567366688493093920">"管理窗口"</string> <string name="close_text" msgid="4986518933445178928">"关闭"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"关闭菜单"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"打开菜单"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <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 a23b147ee566..e1c303e198bb 100644 --- a/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml +++ b/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"螢幕截圖"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"在瀏覽器中開啟"</string> <string name="new_window_text" msgid="6318648868380652280">"新視窗"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <string name="manage_windows_text" msgid="5567366688493093920">"管理視窗"</string> <string name="close_text" msgid="4986518933445178928">"關閉"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"關閉選單"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"打開選單"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <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 e70a8ad50f56..97e36c300a4a 100644 --- a/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml +++ b/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"螢幕截圖"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"在瀏覽器中開啟"</string> <string name="new_window_text" msgid="6318648868380652280">"新視窗"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <string name="manage_windows_text" msgid="5567366688493093920">"管理視窗"</string> <string name="close_text" msgid="4986518933445178928">"關閉"</string> <string name="collapse_menu_text" msgid="7515008122450342029">"關閉選單"</string> - <string name="expand_menu_text" msgid="3847736164494181168">"開啟選單"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values-zu/strings.xml b/libs/WindowManager/Shell/res/values-zu/strings.xml index 13a2a0fa977a..74c7169fefa3 100644 --- a/libs/WindowManager/Shell/res/values-zu/strings.xml +++ b/libs/WindowManager/Shell/res/values-zu/strings.xml @@ -123,12 +123,18 @@ <string name="screenshot_text" msgid="1477704010087786671">"Isithombe-skrini"</string> <string name="open_in_browser_text" msgid="9181692926376072904">"Vula kubhrawuza"</string> <string name="new_window_text" msgid="6318648868380652280">"Iwindi Elisha"</string> - <!-- no translation found for manage_windows_text (5567366688493093920) --> - <skip /> + <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> - <string name="expand_menu_text" msgid="3847736164494181168">"Vula Imenyu"</string> + <!-- no translation found for desktop_mode_app_header_chip_text (6366422614991687237) --> + <skip /> <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) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_left_button_text (8077452201179893424) --> + <skip /> + <!-- no translation found for desktop_mode_maximize_menu_snap_right_button_text (7117751068945657304) --> + <skip /> </resources> diff --git a/libs/WindowManager/Shell/res/values/strings.xml b/libs/WindowManager/Shell/res/values/strings.xml index a6da421dbbb9..bda56860d3ba 100644 --- a/libs/WindowManager/Shell/res/values/strings.xml +++ b/libs/WindowManager/Shell/res/values/strings.xml @@ -300,12 +300,19 @@ <string name="close_text">Close</string> <!-- Accessibility text for the handle menu close menu button [CHAR LIMIT=NONE] --> <string name="collapse_menu_text">Close Menu</string> - <!-- Accessibility text for the handle menu open menu button [CHAR LIMIT=NONE] --> - <string name="expand_menu_text">Open Menu</string> + <!-- Accessibility text for the App Header's App Chip [CHAR LIMIT=NONE] --> + <string name="desktop_mode_app_header_chip_text">Open Menu</string> <!-- Maximize menu maximize button string. --> <string name="desktop_mode_maximize_menu_maximize_text">Maximize Screen</string> <!-- Maximize menu snap buttons string. --> <string name="desktop_mode_maximize_menu_snap_text">Snap Screen</string> <!-- Snap resizing non-resizable string. --> <string name="desktop_mode_non_resizable_snap_text">This app can\'t be resized</string> + <!-- Accessibility text for the Maximize Menu's maximize button [CHAR LIMIT=NONE] --> + <string name="desktop_mode_maximize_menu_maximize_button_text">Maximize</string> + <!-- Accessibility text for the Maximize Menu's snap left button [CHAR LIMIT=NONE] --> + <string name="desktop_mode_maximize_menu_snap_left_button_text">Snap left</string> + <!-- Accessibility text for the Maximize Menu's snap right button [CHAR LIMIT=NONE] --> + <string name="desktop_mode_maximize_menu_snap_right_button_text">Snap right</string> + </resources> diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java index 7e6f43458ba6..4607a8ec1210 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/ShellTaskOrganizer.java @@ -584,7 +584,8 @@ public class ShellTaskOrganizer extends TaskOrganizer { final boolean windowModeChanged = data.getTaskInfo().getWindowingMode() != taskInfo.getWindowingMode(); final boolean visibilityChanged = data.getTaskInfo().isVisible != taskInfo.isVisible; - if (windowModeChanged || visibilityChanged) { + if (windowModeChanged || (taskInfo.getWindowingMode() == WINDOWING_MODE_FREEFORM + && visibilityChanged)) { mRecentTasks.ifPresent(recentTasks -> recentTasks.onTaskRunningInfoChanged(taskInfo)); } 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 80a9b675ebd8..96a07755fea9 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 @@ -18,7 +18,6 @@ package com.android.wm.shell.dagger; import static android.window.flags.DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_TASK_LIMIT; -import android.annotation.NonNull; import android.annotation.Nullable; import android.app.KeyguardManager; import android.content.Context; @@ -79,6 +78,7 @@ import com.android.wm.shell.desktopmode.WindowDecorCaptionHandleRepository; import com.android.wm.shell.desktopmode.education.AppHandleEducationController; import com.android.wm.shell.desktopmode.education.AppHandleEducationFilter; import com.android.wm.shell.desktopmode.education.data.AppHandleEducationDatastoreRepository; +import com.android.wm.shell.desktopmode.persistence.DesktopPersistentRepository; import com.android.wm.shell.draganddrop.DragAndDropController; import com.android.wm.shell.draganddrop.GlobalDragListener; import com.android.wm.shell.freeform.FreeformComponents; @@ -116,8 +116,6 @@ import com.android.wm.shell.unfold.qualifier.UnfoldTransition; import com.android.wm.shell.windowdecor.CaptionWindowDecorViewModel; import com.android.wm.shell.windowdecor.DesktopModeWindowDecorViewModel; import com.android.wm.shell.windowdecor.WindowDecorViewModel; -import com.android.wm.shell.windowdecor.viewhost.DefaultWindowDecorViewHostSupplier; -import com.android.wm.shell.windowdecor.viewhost.WindowDecorViewHostSupplier; import dagger.Binds; import dagger.Lazy; @@ -249,8 +247,7 @@ public abstract class WMShellModule { MultiInstanceHelper multiInstanceHelper, Optional<DesktopTasksLimiter> desktopTasksLimiter, WindowDecorCaptionHandleRepository windowDecorCaptionHandleRepository, - Optional<DesktopActivityOrientationChangeHandler> desktopActivityOrientationHandler, - WindowDecorViewHostSupplier windowDecorViewHostSupplier) { + Optional<DesktopActivityOrientationChangeHandler> desktopActivityOrientationHandler) { if (DesktopModeStatus.canEnterDesktopMode(context)) { return new DesktopModeWindowDecorViewModel( context, @@ -275,8 +272,7 @@ public abstract class WMShellModule { multiInstanceHelper, desktopTasksLimiter, windowDecorCaptionHandleRepository, - desktopActivityOrientationHandler, - windowDecorViewHostSupplier); + desktopActivityOrientationHandler); } return new CaptionWindowDecorViewModel( context, @@ -290,8 +286,7 @@ public abstract class WMShellModule { displayController, rootTaskDisplayAreaOrganizer, syncQueue, - transitions, - windowDecorViewHostSupplier); + transitions); } @WMSingleton @@ -382,13 +377,6 @@ public abstract class WMShellModule { context, shellInit, transitions, windowDecorViewModel); } - @WMSingleton - @Provides - static WindowDecorViewHostSupplier provideWindowDecorViewHostSupplier( - @ShellMainThread @NonNull CoroutineScope mainScope) { - return new DefaultWindowDecorViewHostSupplier(mainScope); - } - // // One handed mode // @@ -712,8 +700,14 @@ public abstract class WMShellModule { @WMSingleton @Provides @DynamicOverride - static DesktopModeTaskRepository provideDesktopModeTaskRepository() { - return new DesktopModeTaskRepository(); + static DesktopModeTaskRepository provideDesktopModeTaskRepository( + Context context, + ShellInit shellInit, + DesktopPersistentRepository desktopPersistentRepository, + @ShellMainThread CoroutineScope mainScope + ) { + return new DesktopModeTaskRepository(context, shellInit, desktopPersistentRepository, + mainScope); } @WMSingleton @@ -798,6 +792,14 @@ public abstract class WMShellModule { shellTaskOrganizer, appHandleEducationDatastoreRepository, applicationScope); } + @WMSingleton + @Provides + static DesktopPersistentRepository provideDesktopPersistentRepository( + Context context, + @ShellBackgroundThread CoroutineScope bgScope) { + return new DesktopPersistentRepository(context, bgScope); + } + // // Drag and drop // diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeTaskRepository.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeTaskRepository.kt index 9d041692200d..759ed035895e 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeTaskRepository.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeTaskRepository.kt @@ -16,6 +16,7 @@ package com.android.wm.shell.desktopmode +import android.content.Context import android.graphics.Rect import android.graphics.Region import android.util.ArrayMap @@ -27,13 +28,27 @@ import androidx.core.util.forEach import androidx.core.util.keyIterator import androidx.core.util.valueIterator import com.android.internal.protolog.ProtoLog +import com.android.window.flags.Flags +import com.android.wm.shell.desktopmode.persistence.DesktopPersistentRepository +import com.android.wm.shell.desktopmode.persistence.DesktopTask +import com.android.wm.shell.desktopmode.persistence.DesktopTaskState import com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE +import com.android.wm.shell.shared.annotations.ShellMainThread +import com.android.wm.shell.shared.desktopmode.DesktopModeStatus +import com.android.wm.shell.sysui.ShellInit import java.io.PrintWriter import java.util.concurrent.Executor import java.util.function.Consumer +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch /** Tracks task data for Desktop Mode. */ -class DesktopModeTaskRepository { +class DesktopModeTaskRepository ( + private val context: Context, + shellInit: ShellInit, + private val persistentRepository: DesktopPersistentRepository, + @ShellMainThread private val mainCoroutineScope: CoroutineScope, +){ /** * Task data tracked per desktop. @@ -54,7 +69,15 @@ class DesktopModeTaskRepository { // TODO(b/332682201): Remove when the repository state is updated via TransitionObserver val closingTasks: ArraySet<Int> = ArraySet(), val freeformTasksInZOrder: ArrayList<Int> = ArrayList(), - ) + ) { + fun deepCopy(): DesktopTaskData = DesktopTaskData( + activeTasks = ArraySet(activeTasks), + visibleTasks = ArraySet(visibleTasks), + minimizedTasks = ArraySet(minimizedTasks), + closingTasks = ArraySet(closingTasks), + freeformTasksInZOrder = ArrayList(freeformTasksInZOrder) + ) + } /* Current wallpaper activity token to remove wallpaper activity when last task is removed. */ var wallpaperActivityToken: WindowContainerToken? = null @@ -77,6 +100,40 @@ class DesktopModeTaskRepository { this[displayId] ?: DesktopTaskData().also { this[displayId] = it } } + init { + if (DesktopModeStatus.canEnterDesktopMode(context)) { + shellInit.addInitCallback(::initRepoFromPersistentStorage, this) + } + } + + private fun initRepoFromPersistentStorage() { + if (!Flags.enableDesktopWindowingPersistence()) return + // TODO: b/365962554 - Handle the case that user moves to desktop before it's initialized + mainCoroutineScope.launch { + val desktop = persistentRepository.readDesktop() + val maxTasks = + DesktopModeStatus.getMaxTaskLimit(context).takeIf { it > 0 } + ?: desktop.zOrderedTasksCount + + desktop.zOrderedTasksList + // Reverse it so we initialize the repo from bottom to top. + .reversed() + .map { taskId -> + desktop.tasksByTaskIdMap.getOrDefault( + taskId, + DesktopTask.getDefaultInstance() + ) + } + .filter { task -> task.desktopTaskState == DesktopTaskState.VISIBLE } + .take(maxTasks) + .forEach { task -> + addOrMoveFreeformTaskToTop(desktop.displayId, task.taskId) + addActiveTask(desktop.displayId, task.taskId) + updateTaskVisibility(desktop.displayId, task.taskId, visible = false) + } + } + } + /** Adds [activeTasksListener] to be notified of updates to active tasks. */ fun addActiveTaskListener(activeTasksListener: ActiveTasksListener) { activeTasksListeners.add(activeTasksListener) @@ -266,12 +323,18 @@ class DesktopModeTaskRepository { desktopTaskDataByDisplayId.getOrCreate(displayId).freeformTasksInZOrder.add(0, taskId) // Unminimize the task if it is minimized. unminimizeTask(displayId, taskId) + if (Flags.enableDesktopWindowingPersistence()) { + updatePersistentRepository(displayId) + } } /** Minimizes the task for [taskId] and [displayId] */ fun minimizeTask(displayId: Int, taskId: Int) { logD("Minimize Task: display=%d, task=%d", displayId, taskId) desktopTaskDataByDisplayId.getOrCreate(displayId).minimizedTasks.add(taskId) + if (Flags.enableDesktopWindowingPersistence()) { + updatePersistentRepository(displayId) + } } /** Unminimizes the task for [taskId] and [displayId] */ @@ -315,7 +378,10 @@ class DesktopModeTaskRepository { // Remove task from unminimized task if it is minimized. unminimizeTask(displayId, taskId) removeActiveTask(taskId) - updateTaskVisibility(displayId, taskId, visible = false); + updateTaskVisibility(displayId, taskId, visible = false) + if (Flags.enableDesktopWindowingPersistence()) { + updatePersistentRepository(displayId) + } } /** @@ -352,6 +418,27 @@ class DesktopModeTaskRepository { fun saveBoundsBeforeMaximize(taskId: Int, bounds: Rect) = boundsBeforeMaximizeByTaskId.set(taskId, Rect(bounds)) + private fun updatePersistentRepository(displayId: Int) { + // Create a deep copy of the data + desktopTaskDataByDisplayId[displayId]?.deepCopy()?.let { desktopTaskDataByDisplayIdCopy -> + mainCoroutineScope.launch { + try { + persistentRepository.addOrUpdateDesktop( + visibleTasks = desktopTaskDataByDisplayIdCopy.visibleTasks, + minimizedTasks = desktopTaskDataByDisplayIdCopy.minimizedTasks, + freeformTasksInZOrder = desktopTaskDataByDisplayIdCopy.freeformTasksInZOrder + ) + } catch (exception: Exception) { + logE( + "An exception occurred while updating the persistent repository \n%s", + exception.stackTrace + ) + } + } + } + } + + internal fun dump(pw: PrintWriter, prefix: String) { val innerPrefix = "$prefix " pw.println("${prefix}DesktopModeTaskRepository") @@ -390,6 +477,10 @@ class DesktopModeTaskRepository { ProtoLog.w(WM_SHELL_DESKTOP_MODE, "%s: $msg", TAG, *arguments) } + private fun logE(msg: String, vararg arguments: Any?) { + ProtoLog.e(WM_SHELL_DESKTOP_MODE, "%s: $msg", TAG, *arguments) + } + companion object { private const val TAG = "DesktopModeTaskRepository" } 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 f3ae3ed45f41..968f40c3df5d 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 @@ -58,6 +58,7 @@ import com.android.internal.jank.Cuj.CUJ_DESKTOP_MODE_SNAP_RESIZE import com.android.internal.jank.InteractionJankMonitor import com.android.internal.policy.ScreenDecorationsUtils import com.android.internal.protolog.ProtoLog +import com.android.window.flags.Flags import com.android.wm.shell.RootTaskDisplayAreaOrganizer import com.android.wm.shell.ShellTaskOrganizer import com.android.wm.shell.common.DisplayController @@ -80,8 +81,8 @@ import com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE import com.android.wm.shell.recents.RecentTasksController import com.android.wm.shell.recents.RecentsTransitionHandler import com.android.wm.shell.recents.RecentsTransitionStateListener -import com.android.wm.shell.shared.TransitionUtil 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 @@ -728,7 +729,7 @@ class DesktopTasksController( // exclude current task since maximize/restore transition has not taken place yet. .filterNot { taskId -> taskId == excludeTaskId } .any { taskId -> - val taskInfo = shellTaskOrganizer.getRunningTaskInfo(taskId)!! + val taskInfo = shellTaskOrganizer.getRunningTaskInfo(taskId) ?: return false val displayLayout = displayController.getDisplayLayout(taskInfo.displayId) val stableBounds = Rect().apply { displayLayout?.getStableBounds(this) } logD("taskInfo = %s", taskInfo) @@ -896,6 +897,7 @@ class DesktopTasksController( val nonMinimizedTasksOrderedFrontToBack = taskRepository.getActiveNonMinimizedOrderedTasks(displayId) // If we're adding a new Task we might need to minimize an old one + // TODO(b/365725441): Handle non running task minimization val taskToMinimize: RunningTaskInfo? = if (newTaskIdInFront != null && desktopTasksLimiter.isPresent) { desktopTasksLimiter @@ -907,12 +909,26 @@ class DesktopTasksController( } else { null } + nonMinimizedTasksOrderedFrontToBack // If there is a Task to minimize, let it stay behind the Home Task .filter { taskId -> taskId != taskToMinimize?.taskId } - .mapNotNull { taskId -> shellTaskOrganizer.getRunningTaskInfo(taskId) } .reversed() // Start from the back so the front task is brought forward last - .forEach { task -> wct.reorder(task.token, /* onTop= */ true) } + .forEach { taskId -> + val runningTaskInfo = shellTaskOrganizer.getRunningTaskInfo(taskId) + if (runningTaskInfo != null) { + // Task is already running, reorder it to the front + wct.reorder(runningTaskInfo.token, /* onTop= */ true) + } else if (Flags.enableDesktopWindowingPersistence()) { + // Task is not running, start it + wct.startTask( + taskId, + ActivityOptions.makeBasic().apply { + launchWindowingMode = WINDOWING_MODE_FREEFORM + }.toBundle(), + ) + } + } taskbarDesktopTaskListener?. onTaskbarCornerRoundingUpdate(doesAnyTaskRequireTaskbarRounding(displayId)) @@ -1211,6 +1227,7 @@ class DesktopTasksController( wct.reorder(task.token, true) return wct } + // TODO(b/365723620): Handle non running tasks that were launched after reboot. // If task is already visible, it must have been handled already and added to desktop mode. // Cascade task only if it's not visible yet. if (DesktopModeFlags.ENABLE_CASCADING_WINDOWS.isTrue() diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/persistence/DesktopPersistentRepository.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/persistence/DesktopPersistentRepository.kt new file mode 100644 index 000000000000..3f41d7cf4e86 --- /dev/null +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/persistence/DesktopPersistentRepository.kt @@ -0,0 +1,201 @@ +/* + * 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.desktopmode.persistence + +import android.content.Context +import android.util.ArraySet +import android.util.Log +import android.view.Display.DEFAULT_DISPLAY +import androidx.datastore.core.CorruptionException +import androidx.datastore.core.DataStore +import androidx.datastore.core.DataStoreFactory +import androidx.datastore.core.Serializer +import androidx.datastore.dataStoreFile +import com.android.framework.protobuf.InvalidProtocolBufferException +import com.android.wm.shell.shared.annotations.ShellBackgroundThread +import java.io.IOException +import java.io.InputStream +import java.io.OutputStream +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.catch +import kotlinx.coroutines.flow.first + +/** + * Persistent repository for storing desktop mode related data. + * + * The main constructor is public only for testing purposes. + */ +class DesktopPersistentRepository( + private val dataStore: DataStore<DesktopPersistentRepositories>, +) { + constructor( + context: Context, + @ShellBackgroundThread bgCoroutineScope: CoroutineScope, + ) : this( + DataStoreFactory.create( + serializer = DesktopPersistentRepositoriesSerializer, + produceFile = { context.dataStoreFile(DESKTOP_REPOSITORIES_DATASTORE_FILE) }, + scope = bgCoroutineScope)) + + /** Provides `dataStore.data` flow and handles exceptions thrown during collection */ + private val dataStoreFlow: Flow<DesktopPersistentRepositories> = + dataStore.data.catch { exception -> + // dataStore.data throws an IOException when an error is encountered when reading data + if (exception is IOException) { + Log.e( + TAG, + "Error in reading desktop mode related data from datastore, data is " + + "stored in a file named $DESKTOP_REPOSITORIES_DATASTORE_FILE", + exception) + } else { + throw exception + } + } + + /** + * Reads and returns the [DesktopRepositoryState] proto object from the DataStore for a user. If + * the DataStore is empty or there's an error reading, it returns the default value of Proto. + */ + private suspend fun getDesktopRepositoryState( + userId: Int = DEFAULT_USER_ID + ): DesktopRepositoryState = + try { + dataStoreFlow + .first() + .desktopRepoByUserMap + .getOrDefault(userId, DesktopRepositoryState.getDefaultInstance()) + } catch (e: Exception) { + Log.e(TAG, "Unable to read from datastore", e) + DesktopRepositoryState.getDefaultInstance() + } + + /** + * Reads the [Desktop] of a desktop filtering by the [userId] and [desktopId]. Executes the + * [callback] using the [mainCoroutineScope]. + */ + suspend fun readDesktop( + userId: Int = DEFAULT_USER_ID, + desktopId: Int = DEFAULT_DESKTOP_ID, + ): Desktop = + try { + val repository = getDesktopRepositoryState(userId) + repository.getDesktopOrThrow(desktopId) + } catch (e: Exception) { + Log.e(TAG, "Unable to get desktop info from persistent repository", e) + Desktop.getDefaultInstance() + } + + /** Adds or updates a desktop stored in the datastore */ + suspend fun addOrUpdateDesktop( + userId: Int = DEFAULT_USER_ID, + desktopId: Int = 0, + visibleTasks: ArraySet<Int> = ArraySet(), + minimizedTasks: ArraySet<Int> = ArraySet(), + freeformTasksInZOrder: ArrayList<Int> = ArrayList(), + ) { + // TODO: b/367609270 - Improve the API to support multi-user + try { + dataStore.updateData { desktopPersistentRepositories: DesktopPersistentRepositories -> + val currentRepository = + desktopPersistentRepositories.getDesktopRepoByUserOrDefault( + userId, DesktopRepositoryState.getDefaultInstance()) + val desktop = + getDesktop(currentRepository, desktopId) + .toBuilder() + .updateTaskStates(visibleTasks, minimizedTasks) + .updateZOrder(freeformTasksInZOrder) + + desktopPersistentRepositories + .toBuilder() + .putDesktopRepoByUser( + userId, + currentRepository + .toBuilder() + .putDesktop(desktopId, desktop.build()) + .build()) + .build() + } + } catch (exception: IOException) { + Log.e( + TAG, + "Error in updating desktop mode related data, data is " + + "stored in a file named $DESKTOP_REPOSITORIES_DATASTORE_FILE", + exception) + } + } + + private fun getDesktop(currentRepository: DesktopRepositoryState, desktopId: Int): Desktop = + // If there are no desktops set up, create one on the default display + currentRepository.getDesktopOrDefault( + desktopId, + Desktop.newBuilder().setDesktopId(desktopId).setDisplayId(DEFAULT_DISPLAY).build()) + + companion object { + private const val TAG = "DesktopPersistenceRepo" + private const val DESKTOP_REPOSITORIES_DATASTORE_FILE = "desktop_persistent_repositories.pb" + + private const val DEFAULT_USER_ID = 1000 + private const val DEFAULT_DESKTOP_ID = 0 + + object DesktopPersistentRepositoriesSerializer : Serializer<DesktopPersistentRepositories> { + + override val defaultValue: DesktopPersistentRepositories = + DesktopPersistentRepositories.getDefaultInstance() + + override suspend fun readFrom(input: InputStream): DesktopPersistentRepositories = + try { + DesktopPersistentRepositories.parseFrom(input) + } catch (exception: InvalidProtocolBufferException) { + throw CorruptionException("Cannot read proto.", exception) + } + + override suspend fun writeTo(t: DesktopPersistentRepositories, output: OutputStream) = + t.writeTo(output) + } + + private fun Desktop.Builder.updateTaskStates( + visibleTasks: ArraySet<Int>, + minimizedTasks: ArraySet<Int> + ): Desktop.Builder { + clearTasksByTaskId() + putAllTasksByTaskId( + visibleTasks.associateWith { + createDesktopTask(it, state = DesktopTaskState.VISIBLE) + }) + putAllTasksByTaskId( + minimizedTasks.associateWith { + createDesktopTask(it, state = DesktopTaskState.MINIMIZED) + }) + return this + } + + private fun Desktop.Builder.updateZOrder( + freeformTasksInZOrder: ArrayList<Int> + ): Desktop.Builder { + clearZOrderedTasks() + addAllZOrderedTasks(freeformTasksInZOrder) + return this + } + + private fun createDesktopTask( + taskId: Int, + state: DesktopTaskState = DesktopTaskState.VISIBLE + ): DesktopTask = + DesktopTask.newBuilder().setTaskId(taskId).setDesktopTaskState(state).build() + } +} diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/persistence/persistent_desktop_repositories.proto b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/persistence/persistent_desktop_repositories.proto new file mode 100644 index 000000000000..010523162cec --- /dev/null +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/persistence/persistent_desktop_repositories.proto @@ -0,0 +1,33 @@ +syntax = "proto2"; + +option java_package = "com.android.wm.shell.desktopmode.persistence"; +option java_multiple_files = true; + +// Represents the state of a task in desktop. +enum DesktopTaskState { + VISIBLE = 0; + MINIMIZED = 1; +} + +message DesktopTask { + optional int32 task_id = 1; + optional DesktopTaskState desktop_task_state= 2; +} + +message Desktop { + optional int32 display_id = 1; + optional int32 desktop_id = 2; + // Stores a mapping between task id and the tasks. The key is the task id. + map<int32, DesktopTask> tasks_by_task_id = 3; + repeated int32 z_ordered_tasks = 4; +} + +message DesktopRepositoryState { + // Stores a mapping between a repository and the desktops in it. The key is the desktop id. + map<int32, Desktop> desktop = 1; +} + +message DesktopPersistentRepositories { + // Stores a mapping between a user and their desktop repository. The key is the user id. + map<int32, DesktopRepositoryState> desktop_repo_by_user = 1; +}
\ No newline at end of file diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java index 1573291aef63..f40e0bac1b4e 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultTransitionHandler.java @@ -358,12 +358,9 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler { if (mode == TRANSIT_CHANGE && change.hasFlags(FLAG_IS_DISPLAY)) { if (info.getType() == TRANSIT_CHANGE) { - int anim = getRotationAnimationHint(change, info, mDisplayController); + final int anim = getRotationAnimationHint(change, info, mDisplayController); isSeamlessDisplayChange = anim == ROTATION_ANIMATION_SEAMLESS; if (!(isSeamlessDisplayChange || anim == ROTATION_ANIMATION_JUMPCUT)) { - if (wallpaperTransit != WALLPAPER_TRANSITION_NONE) { - anim |= ScreenRotationAnimation.ANIMATION_HINT_HAS_WALLPAPER; - } startRotationAnimation(startTransaction, change, info, anim, animations, onAnimFinish); isDisplayRotationAnimationStarted = true; @@ -829,26 +826,24 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler { @NonNull Runnable finishCallback, @NonNull TransactionPool pool, @NonNull ShellExecutor mainExecutor, @Nullable Point position, float cornerRadius, @Nullable Rect clipRect, boolean isActivity) { - final DefaultAnimationAdapter adapter = new DefaultAnimationAdapter(anim, leash, - position, clipRect, cornerRadius, isActivity); - buildSurfaceAnimation(animations, anim, finishCallback, pool, mainExecutor, adapter); - } - - /** Builds an animator for the surface and adds it to the `animations` list. */ - static void buildSurfaceAnimation(@NonNull ArrayList<Animator> animations, - @NonNull Animation anim, @NonNull Runnable finishCallback, - @NonNull TransactionPool pool, @NonNull ShellExecutor mainExecutor, - @NonNull AnimationAdapter updateListener) { final SurfaceControl.Transaction transaction = pool.acquire(); - updateListener.setTransaction(transaction); final ValueAnimator va = ValueAnimator.ofFloat(0f, 1f); + final Transformation transformation = new Transformation(); + final float[] matrix = new float[9]; // Animation length is already expected to be scaled. va.overrideDurationScale(1.0f); va.setDuration(anim.computeDurationHint()); + final ValueAnimator.AnimatorUpdateListener updateListener = animation -> { + final long currentPlayTime = Math.min(va.getDuration(), va.getCurrentPlayTime()); + + applyTransformation(currentPlayTime, transaction, leash, anim, transformation, matrix, + position, cornerRadius, clipRect, isActivity); + }; va.addUpdateListener(updateListener); final Runnable finisher = () -> { - updateListener.onAnimationUpdate(va); + applyTransformation(va.getDuration(), transaction, leash, anim, transformation, matrix, + position, cornerRadius, clipRect, isActivity); pool.release(transaction); mainExecutor.execute(() -> { @@ -1012,88 +1007,37 @@ public class DefaultTransitionHandler implements Transitions.TransitionHandler { || animType == ANIM_FROM_STYLE; } - /** The animation adapter for buildSurfaceAnimation. */ - abstract static class AnimationAdapter implements ValueAnimator.AnimatorUpdateListener { - @NonNull final SurfaceControl mLeash; - @NonNull SurfaceControl.Transaction mTransaction; - private Choreographer mChoreographer; - - AnimationAdapter(@NonNull SurfaceControl leash) { - mLeash = leash; + private static void applyTransformation(long time, SurfaceControl.Transaction t, + SurfaceControl leash, Animation anim, Transformation tmpTransformation, float[] matrix, + Point position, float cornerRadius, @Nullable Rect immutableClipRect, + boolean isActivity) { + tmpTransformation.clear(); + anim.getTransformation(time, tmpTransformation); + if (com.android.graphics.libgui.flags.Flags.edgeExtensionShader() + && anim.getExtensionEdges() != 0x0 && isActivity) { + t.setEdgeExtensionEffect(leash, anim.getExtensionEdges()); } - - void setTransaction(@NonNull SurfaceControl.Transaction transaction) { - mTransaction = transaction; + if (position != null) { + tmpTransformation.getMatrix().postTranslate(position.x, position.y); } - - @Override - public void onAnimationUpdate(@NonNull ValueAnimator animator) { - applyTransformation(animator); - if (mChoreographer == null) { - mChoreographer = Choreographer.getInstance(); - } - mTransaction.setFrameTimelineVsync(mChoreographer.getVsyncId()); - mTransaction.apply(); + t.setMatrix(leash, tmpTransformation.getMatrix(), matrix); + t.setAlpha(leash, tmpTransformation.getAlpha()); + + final Rect clipRect = immutableClipRect == null ? null : new Rect(immutableClipRect); + Insets extensionInsets = Insets.min(tmpTransformation.getInsets(), Insets.NONE); + if (!extensionInsets.equals(Insets.NONE) && clipRect != null && !clipRect.isEmpty()) { + // Clip out any overflowing edge extension + clipRect.inset(extensionInsets); + t.setCrop(leash, clipRect); } - abstract void applyTransformation(@NonNull ValueAnimator animator); - } - - private static class DefaultAnimationAdapter extends AnimationAdapter { - final Transformation mTransformation = new Transformation(); - final float[] mMatrix = new float[9]; - @NonNull final Animation mAnim; - @Nullable final Point mPosition; - @Nullable final Rect mClipRect; - final float mCornerRadius; - final boolean mIsActivity; - - DefaultAnimationAdapter(@NonNull Animation anim, @NonNull SurfaceControl leash, - @Nullable Point position, @Nullable Rect clipRect, float cornerRadius, - boolean isActivity) { - super(leash); - mAnim = anim; - mPosition = (position != null && (position.x != 0 || position.y != 0)) - ? position : null; - mClipRect = (clipRect != null && !clipRect.isEmpty()) ? clipRect : null; - mCornerRadius = cornerRadius; - mIsActivity = isActivity; + if (anim.hasRoundedCorners() && cornerRadius > 0 && clipRect != null) { + // We can only apply rounded corner if a crop is set + t.setCrop(leash, clipRect); + t.setCornerRadius(leash, cornerRadius); } - @Override - void applyTransformation(@NonNull ValueAnimator animator) { - final long currentPlayTime = Math.min(animator.getDuration(), - animator.getCurrentPlayTime()); - final Transformation transformation = mTransformation; - final SurfaceControl.Transaction t = mTransaction; - final SurfaceControl leash = mLeash; - transformation.clear(); - mAnim.getTransformation(currentPlayTime, transformation); - if (com.android.graphics.libgui.flags.Flags.edgeExtensionShader() - && mIsActivity && mAnim.getExtensionEdges() != 0) { - t.setEdgeExtensionEffect(leash, mAnim.getExtensionEdges()); - } - if (mPosition != null) { - transformation.getMatrix().postTranslate(mPosition.x, mPosition.y); - } - t.setMatrix(leash, transformation.getMatrix(), mMatrix); - t.setAlpha(leash, transformation.getAlpha()); - - if (mClipRect != null) { - Rect clipRect = mClipRect; - final Insets extensionInsets = Insets.min(transformation.getInsets(), Insets.NONE); - if (!extensionInsets.equals(Insets.NONE)) { - // Clip out any overflowing edge extension. - clipRect = new Rect(mClipRect); - clipRect.inset(extensionInsets); - t.setCrop(leash, clipRect); - } - if (mCornerRadius > 0 && mAnim.hasRoundedCorners()) { - // Rounded corner can only be applied if a crop is set. - t.setCrop(leash, clipRect); - t.setCornerRadius(leash, mCornerRadius); - } - } - } + t.setFrameTimelineVsync(Choreographer.getInstance().getVsyncId()); + t.apply(); } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/ScreenRotationAnimation.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/ScreenRotationAnimation.java index b9d11a3d0c06..5802e2ca8133 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/ScreenRotationAnimation.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/ScreenRotationAnimation.java @@ -25,9 +25,12 @@ import static com.android.wm.shell.transition.DefaultTransitionHandler.buildSurf import static com.android.wm.shell.transition.Transitions.TAG; import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.ArgbEvaluator; import android.animation.ValueAnimator; import android.annotation.NonNull; import android.content.Context; +import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Rect; import android.hardware.HardwareBuffer; @@ -35,7 +38,6 @@ import android.util.Slog; import android.view.Surface; import android.view.SurfaceControl; import android.view.SurfaceControl.Transaction; -import android.view.animation.AccelerateInterpolator; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.window.ScreenCapture; @@ -72,9 +74,6 @@ import java.util.ArrayList; */ class ScreenRotationAnimation { static final int MAX_ANIMATION_DURATION = 10 * 1000; - static final int ANIMATION_HINT_HAS_WALLPAPER = 1 << 8; - /** It must cover all WindowManager#ROTATION_ANIMATION_*. */ - private static final int ANIMATION_TYPE_MASK = 0xff; private final Context mContext; private final TransactionPool mTransactionPool; @@ -82,7 +81,7 @@ class ScreenRotationAnimation { /** The leash of the changing window container. */ private final SurfaceControl mSurfaceControl; - private final int mAnimType; + private final int mAnimHint; private final int mStartWidth; private final int mStartHeight; private final int mEndWidth; @@ -99,12 +98,6 @@ class ScreenRotationAnimation { private SurfaceControl mBackColorSurface; /** The leash using to animate screenshot layer. */ private final SurfaceControl mAnimLeash; - /** - * The container with background color for {@link #mSurfaceControl}. It is only created if - * {@link #mSurfaceControl} may be translucent. E.g. visible wallpaper with alpha < 1 (dimmed). - * That prevents flickering of alpha blending. - */ - private SurfaceControl mBackEffectSurface; // The current active animation to move from the old to the new rotated // state. Which animation is run here will depend on the old and new @@ -122,7 +115,7 @@ class ScreenRotationAnimation { Transaction t, TransitionInfo.Change change, SurfaceControl rootLeash, int animHint) { mContext = context; mTransactionPool = pool; - mAnimType = animHint & ANIMATION_TYPE_MASK; + mAnimHint = animHint; mSurfaceControl = change.getLeash(); mStartWidth = change.getStartAbsBounds().width(); @@ -177,20 +170,11 @@ class ScreenRotationAnimation { } hardwareBuffer.close(); } - if ((animHint & ANIMATION_HINT_HAS_WALLPAPER) != 0) { - mBackEffectSurface = new SurfaceControl.Builder() - .setCallsite("ShellRotationAnimation").setParent(rootLeash) - .setEffectLayer().setOpaque(true).setName("BackEffect").build(); - t.reparent(mSurfaceControl, mBackEffectSurface) - .setColor(mBackEffectSurface, - new float[] {mStartLuma, mStartLuma, mStartLuma}) - .show(mBackEffectSurface); - } t.setLayer(mAnimLeash, SCREEN_FREEZE_LAYER_BASE); t.show(mAnimLeash); // Crop the real content in case it contains a larger child layer, e.g. wallpaper. - t.setCrop(getEnterSurface(), new Rect(0, 0, mEndWidth, mEndHeight)); + t.setCrop(mSurfaceControl, new Rect(0, 0, mEndWidth, mEndHeight)); if (!isCustomRotate()) { mBackColorSurface = new SurfaceControl.Builder() @@ -215,12 +199,7 @@ class ScreenRotationAnimation { } private boolean isCustomRotate() { - return mAnimType == ROTATION_ANIMATION_CROSSFADE || mAnimType == ROTATION_ANIMATION_JUMPCUT; - } - - /** Returns the surface which contains the real content to animate enter. */ - private SurfaceControl getEnterSurface() { - return mBackEffectSurface != null ? mBackEffectSurface : mSurfaceControl; + return mAnimHint == ROTATION_ANIMATION_CROSSFADE || mAnimHint == ROTATION_ANIMATION_JUMPCUT; } private void setScreenshotTransform(SurfaceControl.Transaction t) { @@ -281,7 +260,7 @@ class ScreenRotationAnimation { final boolean customRotate = isCustomRotate(); if (customRotate) { mRotateExitAnimation = AnimationUtils.loadAnimation(mContext, - mAnimType == ROTATION_ANIMATION_JUMPCUT ? R.anim.rotation_animation_jump_exit + mAnimHint == ROTATION_ANIMATION_JUMPCUT ? R.anim.rotation_animation_jump_exit : R.anim.rotation_animation_xfade_exit); mRotateEnterAnimation = AnimationUtils.loadAnimation(mContext, R.anim.rotation_animation_enter); @@ -335,11 +314,7 @@ class ScreenRotationAnimation { } else { startDisplayRotation(animations, finishCallback, mainExecutor); startScreenshotRotationAnimation(animations, finishCallback, mainExecutor); - if (mBackEffectSurface != null && mStartLuma > 0.1f) { - // Animate from the color of background to black for smooth alpha blending. - buildLumaAnimation(animations, mStartLuma, 0f /* endLuma */, mBackEffectSurface, - animationScale, finishCallback, mainExecutor); - } + //startColorAnimation(mTransaction, animationScale); } return true; @@ -347,7 +322,7 @@ class ScreenRotationAnimation { private void startDisplayRotation(@NonNull ArrayList<Animator> animations, @NonNull Runnable finishCallback, @NonNull ShellExecutor mainExecutor) { - buildSurfaceAnimation(animations, mRotateEnterAnimation, getEnterSurface(), finishCallback, + buildSurfaceAnimation(animations, mRotateEnterAnimation, mSurfaceControl, finishCallback, mTransactionPool, mainExecutor, null /* position */, 0 /* cornerRadius */, null /* clipRect */, false /* isActivity */); } @@ -366,17 +341,40 @@ class ScreenRotationAnimation { null /* clipRect */, false /* isActivity */); } - private void buildLumaAnimation(@NonNull ArrayList<Animator> animations, - float startLuma, float endLuma, SurfaceControl surface, float animationScale, - @NonNull Runnable finishCallback, @NonNull ShellExecutor mainExecutor) { - final long durationMillis = (long) (mContext.getResources().getInteger( - R.integer.config_screen_rotation_color_transition) * animationScale); - final LumaAnimation animation = new LumaAnimation(durationMillis); - // Align the end with the enter animation. - animation.setStartOffset(mRotateEnterAnimation.getDuration() - durationMillis); - final LumaAnimationAdapter adapter = new LumaAnimationAdapter(surface, startLuma, endLuma); - buildSurfaceAnimation(animations, animation, finishCallback, mTransactionPool, - mainExecutor, adapter); + private void startColorAnimation(float animationScale, @NonNull ShellExecutor animExecutor) { + int colorTransitionMs = mContext.getResources().getInteger( + R.integer.config_screen_rotation_color_transition); + final float[] rgbTmpFloat = new float[3]; + final int startColor = Color.rgb(mStartLuma, mStartLuma, mStartLuma); + final int endColor = Color.rgb(mEndLuma, mEndLuma, mEndLuma); + final long duration = colorTransitionMs * (long) animationScale; + final Transaction t = mTransactionPool.acquire(); + + final ValueAnimator va = ValueAnimator.ofFloat(0f, 1f); + // Animation length is already expected to be scaled. + va.overrideDurationScale(1.0f); + va.setDuration(duration); + va.addUpdateListener(animation -> { + final long currentPlayTime = Math.min(va.getDuration(), va.getCurrentPlayTime()); + final float fraction = currentPlayTime / va.getDuration(); + applyColor(startColor, endColor, rgbTmpFloat, fraction, mBackColorSurface, t); + }); + va.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationCancel(Animator animation) { + applyColor(startColor, endColor, rgbTmpFloat, 1f /* fraction */, mBackColorSurface, + t); + mTransactionPool.release(t); + } + + @Override + public void onAnimationEnd(Animator animation) { + applyColor(startColor, endColor, rgbTmpFloat, 1f /* fraction */, mBackColorSurface, + t); + mTransactionPool.release(t); + } + }); + animExecutor.execute(va::start); } public void kill() { @@ -391,47 +389,21 @@ class ScreenRotationAnimation { if (mBackColorSurface != null && mBackColorSurface.isValid()) { t.remove(mBackColorSurface); } - if (mBackEffectSurface != null && mBackEffectSurface.isValid()) { - t.remove(mBackEffectSurface); - } t.apply(); mTransactionPool.release(t); } - /** A no-op wrapper to provide animation duration. */ - private static class LumaAnimation extends Animation { - LumaAnimation(long durationMillis) { - setDuration(durationMillis); - } - } - - private static class LumaAnimationAdapter extends DefaultTransitionHandler.AnimationAdapter { - final float[] mColorArray = new float[3]; - final float mStartLuma; - final float mEndLuma; - final AccelerateInterpolator mInterpolation; - - LumaAnimationAdapter(@NonNull SurfaceControl leash, float startLuma, float endLuma) { - super(leash); - mStartLuma = startLuma; - mEndLuma = endLuma; - // Make the initial progress color lighter if the background is light. That avoids - // darker content when fading into the entering surface. - final float factor = Math.min(3f, (Math.max(0.5f, mStartLuma) - 0.5f) * 10); - Slog.d(TAG, "Luma=" + mStartLuma + " factor=" + factor); - mInterpolation = factor > 0.5f ? new AccelerateInterpolator(factor) : null; - } - - @Override - void applyTransformation(ValueAnimator animator) { - final float fraction = mInterpolation != null - ? mInterpolation.getInterpolation(animator.getAnimatedFraction()) - : animator.getAnimatedFraction(); - final float luma = mStartLuma + fraction * (mEndLuma - mStartLuma); - mColorArray[0] = luma; - mColorArray[1] = luma; - mColorArray[2] = luma; - mTransaction.setColor(mLeash, mColorArray); + private static void applyColor(int startColor, int endColor, float[] rgbFloat, + float fraction, SurfaceControl surface, SurfaceControl.Transaction t) { + final int color = (Integer) ArgbEvaluator.getInstance().evaluate(fraction, startColor, + endColor); + Color middleColor = Color.valueOf(color); + rgbFloat[0] = middleColor.red(); + rgbFloat[1] = middleColor.green(); + rgbFloat[2] = middleColor.blue(); + if (surface.isValid()) { + t.setColor(surface, rgbFloat); } + t.apply(); } } 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 431461a27e6f..f5b2340b87a7 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 @@ -63,7 +63,6 @@ import com.android.wm.shell.splitscreen.SplitScreenController; import com.android.wm.shell.sysui.ShellInit; import com.android.wm.shell.transition.Transitions; import com.android.wm.shell.windowdecor.extension.TaskInfoKt; -import com.android.wm.shell.windowdecor.viewhost.WindowDecorViewHostSupplier; /** * View model for the window decoration with a caption and shadows. Works with @@ -85,7 +84,6 @@ public class CaptionWindowDecorViewModel implements WindowDecorViewModel { private final Transitions mTransitions; private final Region mExclusionRegion = Region.obtain(); private final InputManager mInputManager; - private final WindowDecorViewHostSupplier mWindowDecorViewHostSupplier; private TaskOperations mTaskOperations; /** @@ -123,8 +121,7 @@ public class CaptionWindowDecorViewModel implements WindowDecorViewModel { DisplayController displayController, RootTaskDisplayAreaOrganizer rootTaskDisplayAreaOrganizer, SyncTransactionQueue syncQueue, - Transitions transitions, - WindowDecorViewHostSupplier windowDecorViewHostSupplier) { + Transitions transitions) { mContext = context; mMainExecutor = shellExecutor; mMainHandler = mainHandler; @@ -136,7 +133,6 @@ public class CaptionWindowDecorViewModel implements WindowDecorViewModel { mRootTaskDisplayAreaOrganizer = rootTaskDisplayAreaOrganizer; mSyncQueue = syncQueue; mTransitions = transitions; - mWindowDecorViewHostSupplier = windowDecorViewHostSupplier; if (!Transitions.ENABLE_SHELL_TRANSITIONS) { mTaskOperations = new TaskOperations(null, mContext, mSyncQueue); } @@ -300,8 +296,7 @@ public class CaptionWindowDecorViewModel implements WindowDecorViewModel { mMainHandler, mBgExecutor, mMainChoreographer, - mSyncQueue, - mWindowDecorViewHostSupplier); + mSyncQueue); mWindowDecorByTaskId.put(taskInfo.taskId, windowDecoration); final FluidResizeTaskPositioner taskPositioner = 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 d0eba23f7d45..05065be7171c 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 @@ -58,7 +58,6 @@ import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.SyncTransactionQueue; import com.android.wm.shell.shared.annotations.ShellBackgroundThread; import com.android.wm.shell.windowdecor.extension.TaskInfoKt; -import com.android.wm.shell.windowdecor.viewhost.WindowDecorViewHostSupplier; /** * Defines visuals and behaviors of a window decoration of a caption bar and shadows. It works with @@ -90,10 +89,8 @@ public class CaptionWindowDecoration extends WindowDecoration<WindowDecorLinearL Handler handler, @ShellBackgroundThread ShellExecutor bgExecutor, Choreographer choreographer, - SyncTransactionQueue syncQueue, - WindowDecorViewHostSupplier windowDecorViewHostSupplier) { - super(context, userContext, displayController, taskOrganizer, taskInfo, taskSurface, - windowDecorViewHostSupplier); + SyncTransactionQueue syncQueue) { + super(context, userContext, displayController, taskOrganizer, taskInfo, taskSurface); mHandler = handler; mBgExecutor = bgExecutor; mChoreographer = choreographer; 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 c59d92912e80..272508f46d33 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 @@ -130,7 +130,6 @@ import com.android.wm.shell.windowdecor.DesktopModeWindowDecoration.ExclusionReg import com.android.wm.shell.windowdecor.extension.InsetsStateKt; import com.android.wm.shell.windowdecor.extension.TaskInfoKt; import com.android.wm.shell.windowdecor.viewholder.AppHeaderViewHolder; -import com.android.wm.shell.windowdecor.viewhost.WindowDecorViewHostSupplier; import kotlin.Pair; import kotlin.Unit; @@ -169,7 +168,6 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { private final WindowDecorCaptionHandleRepository mWindowDecorCaptionHandleRepository; private final Optional<DesktopTasksLimiter> mDesktopTasksLimiter; private final AppHeaderViewHolder.Factory mAppHeaderViewHolderFactory; - private final WindowDecorViewHostSupplier mWindowDecorViewHostSupplier; private boolean mTransitionDragActive; private SparseArray<EventReceiver> mEventReceiversByDisplay = new SparseArray<>(); @@ -239,8 +237,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { MultiInstanceHelper multiInstanceHelper, Optional<DesktopTasksLimiter> desktopTasksLimiter, WindowDecorCaptionHandleRepository windowDecorCaptionHandleRepository, - Optional<DesktopActivityOrientationChangeHandler> activityOrientationChangeHandler, - WindowDecorViewHostSupplier windowDecorViewHostSupplier) { + Optional<DesktopActivityOrientationChangeHandler> activityOrientationChangeHandler) { this( context, shellExecutor, @@ -260,7 +257,6 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { genericLinksParser, assistContentRequester, multiInstanceHelper, - windowDecorViewHostSupplier, new DesktopModeWindowDecoration.Factory(), new InputMonitorFactory(), SurfaceControl.Transaction::new, @@ -294,7 +290,6 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { AppToWebGenericLinksParser genericLinksParser, AssistContentRequester assistContentRequester, MultiInstanceHelper multiInstanceHelper, - WindowDecorViewHostSupplier windowDecorViewHostSupplier, DesktopModeWindowDecoration.Factory desktopModeWindowDecorFactory, InputMonitorFactory inputMonitorFactory, Supplier<SurfaceControl.Transaction> transactionFactory, @@ -322,7 +317,6 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { mMultiInstanceHelper = multiInstanceHelper; mShellCommandHandler = shellCommandHandler; mWindowManager = windowManager; - mWindowDecorViewHostSupplier = windowDecorViewHostSupplier; mDesktopModeWindowDecorFactory = desktopModeWindowDecorFactory; mInputMonitorFactory = inputMonitorFactory; mTransactionFactory = transactionFactory; @@ -1412,8 +1406,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel { mGenericLinksParser, mAssistContentRequester, mMultiInstanceHelper, - mWindowDecorCaptionHandleRepository, - mWindowDecorViewHostSupplier); + mWindowDecorCaptionHandleRepository); mWindowDecorByTaskId.put(taskInfo.taskId, windowDecoration); final TaskPositioner taskPositioner = mTaskPositionerFactory.create( 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 1537a1ea4d45..8a53f5ba4a51 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 @@ -38,6 +38,7 @@ import static com.android.wm.shell.windowdecor.DragResizeWindowGeometry.getResiz import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.SuppressLint; import android.app.ActivityManager; import android.app.WindowConfiguration.WindowingMode; import android.app.assist.AssistContent; @@ -98,7 +99,6 @@ import com.android.wm.shell.windowdecor.extension.TaskInfoKt; import com.android.wm.shell.windowdecor.viewholder.AppHandleViewHolder; import com.android.wm.shell.windowdecor.viewholder.AppHeaderViewHolder; import com.android.wm.shell.windowdecor.viewholder.WindowDecorationViewHolder; -import com.android.wm.shell.windowdecor.viewhost.WindowDecorViewHostSupplier; import kotlin.Pair; import kotlin.Unit; @@ -144,9 +144,12 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin private Function0<Unit> mOnManageWindowsClickListener; private DragPositioningCallback mDragPositioningCallback; private DragResizeInputListener mDragResizeListener; + private Runnable mCurrentViewHostRunnable = null; private RelayoutParams mRelayoutParams = new RelayoutParams(); private final WindowDecoration.RelayoutResult<WindowDecorLinearLayout> mResult = new WindowDecoration.RelayoutResult<>(); + private final Runnable mViewHostRunnable = + () -> updateViewHost(mRelayoutParams, null /* onDrawTransaction */, mResult); private final Point mPositionInParent = new Point(); private HandleMenu mHandleMenu; @@ -203,8 +206,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin AppToWebGenericLinksParser genericLinksParser, AssistContentRequester assistContentRequester, MultiInstanceHelper multiInstanceHelper, - WindowDecorCaptionHandleRepository windowDecorCaptionHandleRepository, - WindowDecorViewHostSupplier windowDecorViewHostSupplier) { + WindowDecorCaptionHandleRepository windowDecorCaptionHandleRepository) { this (context, userContext, displayController, splitScreenController, taskOrganizer, taskInfo, taskSurface, handler, bgExecutor, choreographer, syncQueue, appHeaderViewHolderFactory, rootTaskDisplayAreaOrganizer, genericLinksParser, @@ -212,7 +214,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin SurfaceControl.Builder::new, SurfaceControl.Transaction::new, WindowContainerTransaction::new, SurfaceControl::new, new WindowManagerWrapper( context.getSystemService(WindowManager.class)), - new SurfaceControlViewHostFactory() {}, windowDecorViewHostSupplier, + new SurfaceControlViewHostFactory() {}, DefaultMaximizeMenuFactory.INSTANCE, DefaultHandleMenuFactory.INSTANCE, multiInstanceHelper, windowDecorCaptionHandleRepository); @@ -240,7 +242,6 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin Supplier<SurfaceControl> surfaceControlSupplier, WindowManagerWrapper windowManagerWrapper, SurfaceControlViewHostFactory surfaceControlViewHostFactory, - WindowDecorViewHostSupplier windowDecorViewHostSupplier, MaximizeMenuFactory maximizeMenuFactory, HandleMenuFactory handleMenuFactory, MultiInstanceHelper multiInstanceHelper, @@ -248,7 +249,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin super(context, userContext, displayController, taskOrganizer, taskInfo, taskSurface, surfaceControlBuilderSupplier, surfaceControlTransactionSupplier, windowContainerTransactionSupplier, surfaceControlSupplier, - surfaceControlViewHostFactory, windowDecorViewHostSupplier); + surfaceControlViewHostFactory); mSplitScreenController = splitScreenController; mHandler = handler; mBgExecutor = bgExecutor; @@ -362,6 +363,73 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin SurfaceControl.Transaction startT, SurfaceControl.Transaction finishT, boolean applyStartTransactionOnDraw, boolean shouldSetTaskPositionAndCrop) { 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); + } 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); + } + Trace.endSection(); + } + + /** Run the whole relayout phase immediately without delay. */ + private void relayoutInSync(ActivityManager.RunningTaskInfo taskInfo, + SurfaceControl.Transaction startT, SurfaceControl.Transaction finishT, + boolean applyStartTransactionOnDraw, boolean shouldSetTaskPositionAndCrop) { + // Clear the current ViewHost runnable as we will update the ViewHost here + clearCurrentViewHostRunnable(); + updateRelayoutParamsAndSurfaces(taskInfo, startT, finishT, applyStartTransactionOnDraw, + shouldSetTaskPositionAndCrop); + if (mResult.mRootView != null) { + updateViewHost(mRelayoutParams, startT, mResult); + } + } + + /** + * Clear the current ViewHost runnable - to ensure it doesn't run once relayout params have been + * updated. + */ + private void clearCurrentViewHostRunnable() { + if (mCurrentViewHostRunnable != null) { + mHandler.removeCallbacks(mCurrentViewHostRunnable); + mCurrentViewHostRunnable = null; + } + } + + /** + * Relayout the window decoration but repost some of the work, to unblock the current callstack. + */ + private void relayoutWithDelayedViewHost(ActivityManager.RunningTaskInfo taskInfo, + SurfaceControl.Transaction startT, SurfaceControl.Transaction finishT, + boolean applyStartTransactionOnDraw, boolean shouldSetTaskPositionAndCrop) { + if (applyStartTransactionOnDraw) { + throw new IllegalArgumentException( + "We cannot both sync viewhost ondraw and delay viewhost creation."); + } + // Clear the current ViewHost runnable as we will update the ViewHost here + clearCurrentViewHostRunnable(); + updateRelayoutParamsAndSurfaces(taskInfo, startT, finishT, + false /* applyStartTransactionOnDraw */, shouldSetTaskPositionAndCrop); + 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. + return; + } + // Store the current runnable so it can be removed if we start a new relayout. + mCurrentViewHostRunnable = mViewHostRunnable; + mHandler.post(mCurrentViewHostRunnable); + } + + @SuppressLint("MissingPermission") + private void updateRelayoutParamsAndSurfaces(ActivityManager.RunningTaskInfo taskInfo, + SurfaceControl.Transaction startT, SurfaceControl.Transaction finishT, + boolean applyStartTransactionOnDraw, boolean shouldSetTaskPositionAndCrop) { + Trace.beginSection("DesktopModeWindowDecoration#updateRelayoutParamsAndSurfaces"); if (Flags.enableDesktopWindowingAppToWeb()) { setCapturedLink(taskInfo.capturedLink, taskInfo.capturedLinkTimestamp); @@ -378,8 +446,8 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin final SurfaceControl oldDecorationSurface = mDecorationContainerSurface; final WindowContainerTransaction wct = new WindowContainerTransaction(); - Trace.beginSection("DesktopModeWindowDecoration#relayout-inner"); - relayout(mRelayoutParams, startT, finishT, wct, oldRootView, mResult); + Trace.beginSection("DesktopModeWindowDecoration#relayout-updateViewsAndSurfaces"); + updateViewsAndSurfaces(mRelayoutParams, startT, finishT, wct, oldRootView, mResult); Trace.endSection(); // After this line, mTaskInfo is up-to-date and should be used instead of taskInfo @@ -394,7 +462,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin notifyNoCaptionHandle(); } disposeStatusBarInputLayer(); - Trace.endSection(); // DesktopModeWindowDecoration#relayout + Trace.endSection(); // DesktopModeWindowDecoration#updateRelayoutParamsAndSurfaces return; } @@ -402,12 +470,12 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin disposeStatusBarInputLayer(); mWindowDecorViewHolder = createViewHolder(); } + Trace.beginSection("DesktopModeWindowDecoration#relayout-binding"); final Point position = new Point(); if (isAppHandle(mWindowDecorViewHolder)) { position.set(determineHandlePosition()); } - Trace.beginSection("DesktopModeWindowDecoration#relayout-bindData"); if (canEnterDesktopMode(mContext) && Flags.enableDesktopWindowingAppHandleEducation()) { notifyCaptionStateChanged(); } @@ -425,7 +493,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin } updateDragResizeListener(oldDecorationSurface); updateMaximizeMenu(startT); - Trace.endSection(); // DesktopModeWindowDecoration#relayout + Trace.endSection(); // DesktopModeWindowDecoration#updateRelayoutParamsAndSurfaces } private boolean isCaptionVisible() { @@ -610,7 +678,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin || !Flags.enableHandleInputFix()) { return; } - ((AppHandleViewHolder) mWindowDecorViewHolder).disposeStatusBarInputLayer(); + asAppHandle(mWindowDecorViewHolder).disposeStatusBarInputLayer(); } private WindowDecorationViewHolder createViewHolder() { @@ -647,6 +715,22 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin return viewHolder instanceof AppHandleViewHolder; } + @Nullable + private AppHandleViewHolder asAppHandle(WindowDecorationViewHolder viewHolder) { + if (viewHolder instanceof AppHandleViewHolder) { + return (AppHandleViewHolder) viewHolder; + } + return null; + } + + @Nullable + private AppHeaderViewHolder asAppHeader(WindowDecorationViewHolder viewHolder) { + if (viewHolder instanceof AppHeaderViewHolder) { + return (AppHeaderViewHolder) viewHolder; + } + return null; + } + @VisibleForTesting static void updateRelayoutParams( RelayoutParams relayoutParams, @@ -663,10 +747,6 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin relayoutParams.mLayoutResId = captionLayoutId; relayoutParams.mCaptionHeightId = getCaptionHeightIdStatic(taskInfo.getWindowingMode()); relayoutParams.mCaptionWidthId = getCaptionWidthId(relayoutParams.mLayoutResId); - // Allow the handle view to be delayed since the handle is just a small addition to the - // window, whereas the header cannot be delayed because it is expected to be visible from - // the first frame. - relayoutParams.mAsyncViewHost = isAppHandle; if (isAppHeader) { if (TaskInfoKt.isTransparentCaptionBarAppearance(taskInfo)) { @@ -1025,7 +1105,15 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin */ void closeMaximizeMenu() { if (!isMaximizeMenuActive()) return; - mMaximizeMenu.close(); + mMaximizeMenu.close(() -> { + // Request the accessibility service to refocus on the maximize button after closing + // the menu. + final AppHeaderViewHolder appHeader = asAppHeader(mWindowDecorViewHolder); + if (appHeader != null) { + appHeader.requestAccessibilityFocus(); + } + return Unit.INSTANCE; + }); mMaximizeMenu = null; } @@ -1341,10 +1429,10 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin mExclusionRegionListener.onExclusionRegionDismissed(mTaskInfo.taskId); disposeResizeVeil(); disposeStatusBarInputLayer(); + clearCurrentViewHostRunnable(); if (canEnterDesktopMode(mContext) && Flags.enableDesktopWindowingAppHandleEducation()) { notifyNoCaptionHandle(); } - super.close(); } @@ -1408,7 +1496,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin void setAnimatingTaskResizeOrReposition(boolean animatingTaskResizeOrReposition) { if (mRelayoutParams.mLayoutResId == R.layout.desktop_mode_app_handle) return; - ((AppHeaderViewHolder) mWindowDecorViewHolder) + asAppHeader(mWindowDecorViewHolder) .setAnimatingTaskResizeOrReposition(animatingTaskResizeOrReposition); } @@ -1416,16 +1504,14 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin * Called when there is a {@link MotionEvent#ACTION_HOVER_EXIT} on the maximize window button. */ void onMaximizeButtonHoverExit() { - ((AppHeaderViewHolder) mWindowDecorViewHolder) - .onMaximizeWindowHoverExit(); + asAppHeader(mWindowDecorViewHolder).onMaximizeWindowHoverExit(); } /** * Called when there is a {@link MotionEvent#ACTION_HOVER_ENTER} on the maximize window button. */ void onMaximizeButtonHoverEnter() { - ((AppHeaderViewHolder) mWindowDecorViewHolder) - .onMaximizeWindowHoverEnter(); + asAppHeader(mWindowDecorViewHolder).onMaximizeWindowHoverEnter(); } @Override @@ -1457,8 +1543,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin AppToWebGenericLinksParser genericLinksParser, AssistContentRequester assistContentRequester, MultiInstanceHelper multiInstanceHelper, - WindowDecorCaptionHandleRepository windowDecorCaptionHandleRepository, - WindowDecorViewHostSupplier windowDecorViewHostSupplier) { + WindowDecorCaptionHandleRepository windowDecorCaptionHandleRepository) { return new DesktopModeWindowDecoration( context, userContext, @@ -1476,8 +1561,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration<WindowDecorLin genericLinksParser, assistContentRequester, multiInstanceHelper, - windowDecorCaptionHandleRepository, - windowDecorViewHostSupplier); + windowDecorCaptionHandleRepository); } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenu.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenu.kt index 5b3f26318825..9a5b4f54dd36 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenu.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenu.kt @@ -23,8 +23,6 @@ import android.content.Context import android.content.res.ColorStateList import android.content.res.Resources import android.graphics.Bitmap -import android.graphics.BlendMode -import android.graphics.BlendModeColorFilter import android.graphics.Point import android.graphics.PointF import android.graphics.Rect @@ -568,9 +566,7 @@ class HandleMenu( appIconBitmap: Bitmap?, appName: CharSequence? ) { - appInfoPill.background.colorFilter = BlendModeColorFilter( - style.backgroundColor, BlendMode.MULTIPLY - ) + appInfoPill.background.setTint(style.backgroundColor) collapseMenuButton.apply { imageTintList = ColorStateList.valueOf(style.textColor) @@ -584,9 +580,7 @@ class HandleMenu( } private fun bindWindowingPill(style: MenuStyle) { - windowingPill.background.colorFilter = BlendModeColorFilter( - style.backgroundColor, BlendMode.MULTIPLY - ) + windowingPill.background.setTint(style.backgroundColor) // TODO: Remove once implemented. floatingBtn.visibility = View.GONE @@ -612,23 +606,19 @@ class HandleMenu( } screenshotBtn.apply { isGone = !SHOULD_SHOW_SCREENSHOT_BUTTON - background.colorFilter = - BlendModeColorFilter(style.backgroundColor, BlendMode.MULTIPLY - ) + background.setTint(style.backgroundColor) setTextColor(style.textColor) compoundDrawableTintList = ColorStateList.valueOf(style.textColor) } newWindowBtn.apply { isGone = !shouldShowNewWindowButton - background.colorFilter = - BlendModeColorFilter(style.backgroundColor, BlendMode.MULTIPLY) + background.setTint(style.backgroundColor) setTextColor(style.textColor) compoundDrawableTintList = ColorStateList.valueOf(style.textColor) } manageWindowBtn.apply { isGone = !shouldShowManageWindowsButton - background.colorFilter = - BlendModeColorFilter(style.backgroundColor, BlendMode.MULTIPLY) + background.setTint(style.backgroundColor) setTextColor(style.textColor) compoundDrawableTintList = ColorStateList.valueOf(style.textColor) } @@ -637,9 +627,7 @@ class HandleMenu( private fun bindOpenInBrowserPill(style: MenuStyle) { openInBrowserPill.apply { isGone = !shouldShowBrowserPill - background.colorFilter = BlendModeColorFilter( - style.backgroundColor, BlendMode.MULTIPLY - ) + background.setTint(style.backgroundColor) } browserBtn.apply { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenuAnimator.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenuAnimator.kt index 9590ccdc3b97..0c475f12f53b 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenuAnimator.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/HandleMenuAnimator.kt @@ -26,6 +26,7 @@ import android.view.View.SCALE_Y import android.view.View.TRANSLATION_Y import android.view.View.TRANSLATION_Z import android.view.ViewGroup +import android.view.accessibility.AccessibilityEvent import android.widget.Button import androidx.core.animation.doOnEnd import androidx.core.view.children @@ -83,7 +84,12 @@ class HandleMenuAnimator( animateWindowingPillOpen() animateMoreActionsPillOpen() animateOpenInBrowserPill() - runAnimations() + runAnimations { + appInfoPill.post { + appInfoPill.requireViewById<View>(R.id.collapse_menu_button).sendAccessibilityEvent( + AccessibilityEvent.TYPE_VIEW_FOCUSED) + } + } } /** @@ -98,7 +104,12 @@ class HandleMenuAnimator( animateWindowingPillOpen() animateMoreActionsPillOpen() animateOpenInBrowserPill() - runAnimations() + runAnimations { + appInfoPill.post { + appInfoPill.requireViewById<View>(R.id.collapse_menu_button).sendAccessibilityEvent( + AccessibilityEvent.TYPE_VIEW_FOCUSED) + } + } } /** diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MaximizeMenu.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MaximizeMenu.kt index 9c73e4a38aa9..0cb219ae4b81 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MaximizeMenu.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/MaximizeMenu.kt @@ -51,6 +51,7 @@ import android.view.View.TRANSLATION_Z import android.view.ViewGroup import android.view.WindowManager import android.view.WindowlessWindowManager +import android.view.accessibility.AccessibilityEvent import android.widget.Button import android.widget.TextView import android.window.TaskConstants @@ -116,19 +117,24 @@ class MaximizeMenu( onHoverListener = onHoverListener, onOutsideTouchListener = onOutsideTouchListener ) - maximizeMenuView?.animateOpenMenu() + maximizeMenuView?.let { view -> + view.animateOpenMenu(onEnd = { + view.requestAccessibilityFocus() + }) + } } /** Closes the maximize window and releases its view. */ - fun close() { + fun close(onEnd: () -> Unit) { val view = maximizeMenuView val menu = maximizeMenu if (view == null) { menu?.releaseView() } else { - view.animateCloseMenu { + view.animateCloseMenu(onEnd = { menu?.releaseView() - } + onEnd.invoke() + }) } maximizeMenu = null maximizeMenuView = null @@ -351,7 +357,7 @@ class MaximizeMenu( } /** Animate the opening of the menu */ - fun animateOpenMenu() { + fun animateOpenMenu(onEnd: () -> Unit) { maximizeButton.setLayerType(View.LAYER_TYPE_HARDWARE, null) maximizeText.setLayerType(View.LAYER_TYPE_HARDWARE, null) menuAnimatorSet = AnimatorSet() @@ -419,6 +425,7 @@ class MaximizeMenu( onEnd = { maximizeButton.setLayerType(View.LAYER_TYPE_SOFTWARE, null) maximizeText.setLayerType(View.LAYER_TYPE_SOFTWARE, null) + onEnd.invoke() } ) menuAnimatorSet?.start() @@ -499,6 +506,14 @@ class MaximizeMenu( menuAnimatorSet?.start() } + /** Request that the accessibility service focus on the menu. */ + fun requestAccessibilityFocus() { + // Focus the first button in the menu by default. + maximizeButton.post { + maximizeButton.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) + } + } + /** Cancel the menu animation. */ private fun cancelAnimation() { menuAnimatorSet?.cancel() 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 369484558325..c1a55b48a02a 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 @@ -62,8 +62,6 @@ import com.android.wm.shell.shared.desktopmode.DesktopModeStatus; import com.android.wm.shell.windowdecor.WindowDecoration.RelayoutParams.OccludingCaptionElement; import com.android.wm.shell.windowdecor.additionalviewcontainer.AdditionalViewHostViewContainer; import com.android.wm.shell.windowdecor.extension.InsetsStateKt; -import com.android.wm.shell.windowdecor.viewhost.WindowDecorViewHost; -import com.android.wm.shell.windowdecor.viewhost.WindowDecorViewHostSupplier; import java.util.ArrayList; import java.util.Arrays; @@ -118,7 +116,6 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer> final Supplier<SurfaceControl.Transaction> mSurfaceControlTransactionSupplier; final Supplier<WindowContainerTransaction> mWindowContainerTransactionSupplier; final SurfaceControlViewHostFactory mSurfaceControlViewHostFactory; - @NonNull private final WindowDecorViewHostSupplier mWindowDecorViewHostSupplier; private final DisplayController.OnDisplaysChangedListener mOnDisplaysChangedListener = new DisplayController.OnDisplaysChangedListener() { @Override @@ -140,7 +137,9 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer> Context mDecorWindowContext; SurfaceControl mDecorationContainerSurface; - private WindowDecorViewHost mDecorViewHost; + SurfaceControl mCaptionContainerSurface; + private WindowlessWindowManager mCaptionWindowManager; + private SurfaceControlViewHost mViewHost; private Configuration mWindowDecorConfig; TaskDragResizer mTaskDragResizer; boolean mIsCaptionVisible; @@ -159,13 +158,11 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer> DisplayController displayController, ShellTaskOrganizer taskOrganizer, RunningTaskInfo taskInfo, - SurfaceControl taskSurface, - @NonNull WindowDecorViewHostSupplier windowDecorViewHostSupplier) { + SurfaceControl taskSurface) { this(context, userContext, displayController, taskOrganizer, taskInfo, taskSurface, SurfaceControl.Builder::new, SurfaceControl.Transaction::new, WindowContainerTransaction::new, SurfaceControl::new, - new SurfaceControlViewHostFactory() {}, - windowDecorViewHostSupplier); + new SurfaceControlViewHostFactory() {}); } WindowDecoration( @@ -179,8 +176,7 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer> Supplier<SurfaceControl.Transaction> surfaceControlTransactionSupplier, Supplier<WindowContainerTransaction> windowContainerTransactionSupplier, Supplier<SurfaceControl> surfaceControlSupplier, - SurfaceControlViewHostFactory surfaceControlViewHostFactory, - @NonNull WindowDecorViewHostSupplier windowDecorViewHostSupplier) { + SurfaceControlViewHostFactory surfaceControlViewHostFactory) { mContext = context; mUserContext = userContext; mDisplayController = displayController; @@ -191,7 +187,6 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer> mSurfaceControlTransactionSupplier = surfaceControlTransactionSupplier; mWindowContainerTransactionSupplier = windowContainerTransactionSupplier; mSurfaceControlViewHostFactory = surfaceControlViewHostFactory; - mWindowDecorViewHostSupplier = windowDecorViewHostSupplier; mDisplay = mDisplayController.getDisplay(mTaskInfo.displayId); final InsetsState insetsState = mDisplayController.getInsetsState(mTaskInfo.displayId); mIsStatusBarVisible = insetsState != null @@ -217,7 +212,15 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer> void relayout(RelayoutParams params, SurfaceControl.Transaction startT, SurfaceControl.Transaction finishT, WindowContainerTransaction wct, T rootView, RelayoutResult<T> outResult) { - Trace.beginSection("WindowDecoration#relayout"); + updateViewsAndSurfaces(params, startT, finishT, wct, rootView, outResult); + if (outResult.mRootView != null) { + updateViewHost(params, startT, outResult); + } + } + + protected void updateViewsAndSurfaces(RelayoutParams params, + SurfaceControl.Transaction startT, SurfaceControl.Transaction finishT, + WindowContainerTransaction wct, T rootView, RelayoutResult<T> outResult) { outResult.reset(); if (params.mRunningTaskInfo != null) { mTaskInfo = params.mRunningTaskInfo; @@ -228,21 +231,17 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer> if (!mTaskInfo.isVisible) { releaseViews(wct); finishT.hide(mTaskSurface); - Trace.endSection(); // WindowDecoration#relayout return; } - Trace.beginSection("WindowDecoration#relayout-inflateIfNeeded"); + inflateIfNeeded(params, wct, rootView, oldLayoutResId, outResult); - Trace.endSection(); - final boolean hasCaptionView = outResult.mRootView != null; - if (!hasCaptionView) { - Trace.endSection(); // WindowDecoration#relayout + if (outResult.mRootView == null) { + // Didn't manage to create a root view, early out. return; } + rootView = null; // Clear it just in case we use it accidentally - Trace.beginSection("WindowDecoration#relayout-updateCaptionVisibility"); updateCaptionVisibility(outResult.mRootView); - Trace.endSection(); final Rect taskBounds = mTaskInfo.getConfiguration().windowConfiguration.getBounds(); outResult.mWidth = taskBounds.width(); @@ -255,23 +254,10 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer> ? loadDimensionPixelSize(resources, params.mCaptionWidthId) : taskBounds.width(); outResult.mCaptionX = (outResult.mWidth - outResult.mCaptionWidth) / 2; - Trace.beginSection("WindowDecoration#relayout-acquire"); - if (mDecorViewHost == null) { - mDecorViewHost = mWindowDecorViewHostSupplier.acquire(mDecorWindowContext, mDisplay); - } - Trace.endSection(); - - final SurfaceControl captionSurface = mDecorViewHost.getSurfaceControl(); - Trace.beginSection("WindowDecoration#relayout-updateSurfacesAndInsets"); updateDecorationContainerSurface(startT, outResult); - updateCaptionContainerSurface(captionSurface, startT, outResult); + updateCaptionContainerSurface(startT, outResult); updateCaptionInsets(params, wct, outResult, taskBounds); updateTaskSurface(params, startT, finishT, outResult); - Trace.endSection(); - - outResult.mRootView.setPadding(0, params.mCaptionTopPadding, 0, 0); - updateViewHierarchy(params, outResult, startT); - Trace.endSection(); // WindowDecoration#relayout } private void inflateIfNeeded(RelayoutParams params, WindowContainerTransaction wct, @@ -319,32 +305,6 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer> return (T) LayoutInflater.from(context).inflate(layoutResId, null); } - private void updateViewHierarchy(@NonNull RelayoutParams params, - @NonNull RelayoutResult<T> outResult, @NonNull SurfaceControl.Transaction startT) { - Trace.beginSection("WindowDecoration#updateViewHierarchy"); - final WindowManager.LayoutParams lp = - new WindowManager.LayoutParams( - outResult.mCaptionWidth, - outResult.mCaptionHeight, - TYPE_APPLICATION, - FLAG_NOT_FOCUSABLE | FLAG_SPLIT_TOUCH, - PixelFormat.TRANSPARENT); - lp.setTitle("Caption of Task=" + mTaskInfo.taskId); - lp.setTrustedOverlay(); - lp.inputFeatures = params.mInputFeatures; - if (params.mAsyncViewHost) { - if (params.mApplyStartTransactionOnDraw) { - throw new IllegalArgumentException( - "We cannot both sync viewhost ondraw and delay viewhost creation."); - } - mDecorViewHost.updateViewAsync(outResult.mRootView, lp, mTaskInfo.getConfiguration()); - } else { - mDecorViewHost.updateView(outResult.mRootView, lp, mTaskInfo.getConfiguration(), - params.mApplyStartTransactionOnDraw ? startT : null); - } - Trace.endSection(); - } - private void updateDecorationContainerSurface( SurfaceControl.Transaction startT, RelayoutResult<T> outResult) { if (mDecorationContainerSurface == null) { @@ -365,14 +325,23 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer> .show(mDecorationContainerSurface); } - private void updateCaptionContainerSurface(@NonNull SurfaceControl captionSurface, + private void updateCaptionContainerSurface( SurfaceControl.Transaction startT, RelayoutResult<T> outResult) { - startT.reparent(captionSurface, mDecorationContainerSurface) - .setWindowCrop(captionSurface, outResult.mCaptionWidth, + if (mCaptionContainerSurface == null) { + final SurfaceControl.Builder builder = mSurfaceControlBuilderSupplier.get(); + mCaptionContainerSurface = builder + .setName("Caption container of Task=" + mTaskInfo.taskId) + .setContainerLayer() + .setParent(mDecorationContainerSurface) + .setCallsite("WindowDecoration.updateCaptionContainerSurface") + .build(); + } + + startT.setWindowCrop(mCaptionContainerSurface, outResult.mCaptionWidth, outResult.mCaptionHeight) - .setPosition(captionSurface, outResult.mCaptionX, 0 /* y */) - .setLayer(captionSurface, CAPTION_LAYER_Z_ORDER) - .show(captionSurface); + .setPosition(mCaptionContainerSurface, outResult.mCaptionX, 0 /* y */) + .setLayer(mCaptionContainerSurface, CAPTION_LAYER_Z_ORDER) + .show(mCaptionContainerSurface); } private void updateCaptionInsets(RelayoutParams params, WindowContainerTransaction wct, @@ -466,6 +435,64 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer> } } + /** + * Updates a {@link SurfaceControlViewHost} to connect the window decoration surfaces with our + * View hierarchy. + * + * @param params parameters to use from the last relayout + * @param onDrawTransaction a transaction to apply in sync with #onDraw + * @param outResult results to use from the last relayout + * + */ + protected void updateViewHost(RelayoutParams params, + SurfaceControl.Transaction onDrawTransaction, RelayoutResult<T> outResult) { + Trace.beginSection("CaptionViewHostLayout"); + if (mCaptionWindowManager == null) { + // Put caption under a container surface because ViewRootImpl sets the destination frame + // of windowless window layers and BLASTBufferQueue#update() doesn't support offset. + mCaptionWindowManager = new WindowlessWindowManager( + mTaskInfo.getConfiguration(), mCaptionContainerSurface, + null /* hostInputToken */); + } + mCaptionWindowManager.setConfiguration(mTaskInfo.getConfiguration()); + final WindowManager.LayoutParams lp = + new WindowManager.LayoutParams( + outResult.mCaptionWidth, + outResult.mCaptionHeight, + TYPE_APPLICATION, + FLAG_NOT_FOCUSABLE | FLAG_SPLIT_TOUCH, + PixelFormat.TRANSPARENT); + lp.setTitle("Caption of Task=" + mTaskInfo.taskId); + lp.setTrustedOverlay(); + lp.inputFeatures = params.mInputFeatures; + if (mViewHost == null) { + Trace.beginSection("CaptionViewHostLayout-new"); + mViewHost = mSurfaceControlViewHostFactory.create(mDecorWindowContext, mDisplay, + mCaptionWindowManager); + if (params.mApplyStartTransactionOnDraw) { + if (onDrawTransaction == null) { + throw new IllegalArgumentException("Trying to sync a null Transaction"); + } + mViewHost.getRootSurfaceControl().applyTransactionOnDraw(onDrawTransaction); + } + outResult.mRootView.setPadding(0, params.mCaptionTopPadding, 0, 0); + mViewHost.setView(outResult.mRootView, lp); + Trace.endSection(); + } else { + Trace.beginSection("CaptionViewHostLayout-relayout"); + if (params.mApplyStartTransactionOnDraw) { + if (onDrawTransaction == null) { + throw new IllegalArgumentException("Trying to sync a null Transaction"); + } + mViewHost.getRootSurfaceControl().applyTransactionOnDraw(onDrawTransaction); + } + outResult.mRootView.setPadding(0, params.mCaptionTopPadding, 0, 0); + mViewHost.relayout(lp); + Trace.endSection(); + } + Trace.endSection(); // CaptionViewHostLayout + } + private Rect calculateBoundingRect(@NonNull OccludingCaptionElement element, int elementWidthPx, @NonNull Rect captionRect) { switch (element.mAlignment) { @@ -553,11 +580,18 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer> } void releaseViews(WindowContainerTransaction wct) { + if (mViewHost != null) { + mViewHost.release(); + mViewHost = null; + } + + mCaptionWindowManager = null; + final SurfaceControl.Transaction t = mSurfaceControlTransactionSupplier.get(); boolean released = false; - if (mDecorViewHost != null) { - mWindowDecorViewHostSupplier.release(mDecorViewHost, t); - mDecorViewHost = null; + if (mCaptionContainerSurface != null) { + t.remove(mCaptionContainerSurface); + mCaptionContainerSurface = null; released = true; } @@ -708,7 +742,6 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer> boolean mApplyStartTransactionOnDraw; boolean mSetTaskPositionAndCrop; - boolean mAsyncViewHost; void reset() { mLayoutResId = Resources.ID_NULL; @@ -725,7 +758,6 @@ public abstract class WindowDecoration<T extends View & TaskFocusStateConsumer> mApplyStartTransactionOnDraw = false; mSetTaskPositionAndCrop = false; - mAsyncViewHost = false; mWindowDecorConfig = null; } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHandleViewHolder.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHandleViewHolder.kt index 9c7d644afb7e..8c102ebfb590 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHandleViewHolder.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHandleViewHolder.kt @@ -22,6 +22,7 @@ import android.content.res.ColorStateList import android.graphics.Color import android.graphics.Point import android.hardware.input.InputManager +import android.os.Bundle import android.os.Handler import android.view.MotionEvent.ACTION_DOWN import android.view.SurfaceControl @@ -29,7 +30,12 @@ import android.view.View import android.view.View.OnClickListener import android.view.WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS import android.view.WindowManager +import android.view.accessibility.AccessibilityEvent +import android.view.accessibility.AccessibilityNodeInfo +import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction import android.widget.ImageButton +import androidx.core.view.ViewCompat +import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat import com.android.internal.policy.SystemBarUtils import com.android.window.flags.Flags import com.android.wm.shell.R @@ -67,6 +73,20 @@ internal class AppHandleViewHolder( captionView.setOnTouchListener(onCaptionTouchListener) captionHandle.setOnTouchListener(onCaptionTouchListener) captionHandle.setOnClickListener(onCaptionButtonClickListener) + captionHandle.accessibilityDelegate = object : View.AccessibilityDelegate() { + override fun sendAccessibilityEvent(host: View, eventType: Int) { + when (eventType) { + AccessibilityEvent.TYPE_VIEW_HOVER_ENTER, + AccessibilityEvent.TYPE_VIEW_HOVER_EXIT -> { + // Caption Handle itself can't get a11y focus because it's under the status + // bar, so pass through TYPE_VIEW_HOVER a11y events to the status bar + // input layer, so that it can get a11y focus on the caption handle's behalf + statusBarInputLayer?.view?.sendAccessibilityEvent(eventType) + } + else -> super.sendAccessibilityEvent(host, eventType) + } + } + } } override fun bindData( @@ -134,9 +154,53 @@ internal class AppHandleViewHolder( captionHandle.dispatchTouchEvent(event) return@setOnTouchListener true } + setupAppHandleA11y(view) windowManagerWrapper.updateViewLayout(view, lp) } + private fun setupAppHandleA11y(view: View) { + view.accessibilityDelegate = object : View.AccessibilityDelegate() { + override fun onInitializeAccessibilityNodeInfo( + host: View, + info: AccessibilityNodeInfo + ) { + // Allow the status bar input layer to be a11y clickable so it can interact with + // a11y services on behalf of caption handle (due to being under status bar) + super.onInitializeAccessibilityNodeInfo(host, info) + info.addAction(AccessibilityAction.ACTION_CLICK) + host.isClickable = true + } + + override fun performAccessibilityAction( + host: View, + action: Int, + args: Bundle? + ): Boolean { + // Passthrough the a11y click action so the caption handle, so that app handle menu + // is opened on a11y click, similar to a real click + if (action == AccessibilityAction.ACTION_CLICK.id) { + captionHandle.performClick() + } + return super.performAccessibilityAction(host, action, args) + } + + override fun onPopulateAccessibilityEvent(host: View, event: AccessibilityEvent) { + super.onPopulateAccessibilityEvent(host, event) + // When the status bar input layer is focused, use the content description of the + // caption handle so that it appears as "App handle" and not "Unlabelled view" + if (event.eventType == AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED) { + event.text.add(captionHandle.contentDescription) + } + } + } + + // Update a11y action text so that Talkback announces "Press double tap to open app handle + // menu" while focused on status bar input layer + ViewCompat.replaceAccessibilityAction( + view, AccessibilityActionCompat.ACTION_CLICK, "Open app handle menu", null + ) + } + private fun updateStatusBarInputLayer(globalPosition: Point) { statusBarInputLayer?.setPosition( SurfaceControl.Transaction(), @@ -173,7 +237,8 @@ internal class AppHandleViewHolder( return taskInfo.taskDescription ?.let { taskDescription -> if (Color.alpha(taskDescription.statusBarColor) != 0 && - taskInfo.windowingMode == WINDOWING_MODE_FREEFORM) { + taskInfo.windowingMode == WINDOWING_MODE_FREEFORM + ) { Color.valueOf(taskDescription.statusBarColor).luminance() < 0.5 } else { taskDescription.systemBarsAppearance and APPEARANCE_LIGHT_STATUS_BARS == 0 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 af6a819bb705..e9961655d979 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 @@ -30,6 +30,7 @@ import android.graphics.drawable.shapes.RoundRectShape import android.view.View import android.view.View.OnLongClickListener import android.view.ViewTreeObserver.OnGlobalLayoutListener +import android.view.accessibility.AccessibilityEvent import android.widget.ImageButton import android.widget.ImageView import android.widget.TextView @@ -263,7 +264,11 @@ class AppHeaderViewHolder( override fun onHandleMenuOpened() {} - override fun onHandleMenuClosed() {} + override fun onHandleMenuClosed() { + openMenuButton.post { + openMenuButton.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) + } + } fun setAnimatingTaskResizeOrReposition(animatingTaskResizeOrReposition: Boolean) { // If animating a task resize or reposition, cancel any running hover animations @@ -309,6 +314,12 @@ class AppHeaderViewHolder( ) } + fun requestAccessibilityFocus() { + maximizeWindowButton.post { + maximizeWindowButton.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED) + } + } + private fun getHeaderStyle(header: Header): HeaderStyle { return HeaderStyle( background = getHeaderBackground(header), diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewhost/DefaultWindowDecorViewHost.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewhost/DefaultWindowDecorViewHost.kt deleted file mode 100644 index 139e6790b744..000000000000 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewhost/DefaultWindowDecorViewHost.kt +++ /dev/null @@ -1,146 +0,0 @@ -/* - * 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.windowdecor.viewhost - -import android.content.Context -import android.content.res.Configuration -import android.view.Display -import android.view.SurfaceControl -import android.view.SurfaceControlViewHost -import android.view.View -import android.view.WindowManager -import android.view.WindowlessWindowManager -import androidx.tracing.Trace -import com.android.internal.annotations.VisibleForTesting -import com.android.wm.shell.shared.annotations.ShellMainThread -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Job -import kotlinx.coroutines.launch -typealias SurfaceControlViewHostFactory = - (Context, Display, WindowlessWindowManager, String) -> SurfaceControlViewHost - -/** - * A default implementation of [WindowDecorViewHost] backed by a [SurfaceControlViewHost]. - * - * It does not support swapping the root view added to the VRI of the [SurfaceControlViewHost], and - * any attempts to do will throw, which means that once a [View] is added using [updateView] or - * [updateViewAsync], only its properties and binding may be changed, its children views may be - * added, removed or changed and its [WindowManager.LayoutParams] may be changed. - * It also supports asynchronously updating the view hierarchy using [updateViewAsync], in which - * case the update work will be posted on the [ShellMainThread] with no delay. - */ -class DefaultWindowDecorViewHost( - private val context: Context, - @ShellMainThread private val mainScope: CoroutineScope, - private val display: Display, - private val surfaceControlViewHostFactory: SurfaceControlViewHostFactory = { c, d, wwm, s -> - SurfaceControlViewHost(c, d, wwm, s) - } -) : WindowDecorViewHost { - - private val rootSurface: SurfaceControl = SurfaceControl.Builder() - .setName("DefaultWindowDecorViewHost surface") - .setContainerLayer() - .setCallsite("DefaultWindowDecorViewHost#init") - .build() - - private var wwm: WindowlessWindowManager? = null - @VisibleForTesting - var viewHost: SurfaceControlViewHost? = null - private var currentUpdateJob: Job? = null - - override val surfaceControl: SurfaceControl - get() = rootSurface - - override fun updateView( - view: View, - attrs: WindowManager.LayoutParams, - configuration: Configuration, - onDrawTransaction: SurfaceControl.Transaction? - ) { - Trace.beginSection("DefaultWindowDecorViewHost#updateView") - clearCurrentUpdateJob() - updateViewHost(view, attrs, configuration, onDrawTransaction) - Trace.endSection() - } - - override fun updateViewAsync( - view: View, - attrs: WindowManager.LayoutParams, - configuration: Configuration - ) { - Trace.beginSection("DefaultWindowDecorViewHost#updateViewAsync") - clearCurrentUpdateJob() - currentUpdateJob = mainScope.launch { - updateViewHost(view, attrs, configuration, onDrawTransaction = null) - } - Trace.endSection() - } - - override fun release(t: SurfaceControl.Transaction) { - clearCurrentUpdateJob() - viewHost?.release() - t.remove(rootSurface) - } - - private fun updateViewHost( - view: View, - attrs: WindowManager.LayoutParams, - configuration: Configuration, - onDrawTransaction: SurfaceControl.Transaction? - ) { - Trace.beginSection("DefaultWindowDecorViewHost#updateViewHost") - if (wwm == null) { - wwm = WindowlessWindowManager(configuration, rootSurface, null) - } - requireWindowlessWindowManager().setConfiguration(configuration) - if (viewHost == null) { - viewHost = surfaceControlViewHostFactory.invoke( - context, - display, - requireWindowlessWindowManager(), - "DefaultWindowDecorViewHost#updateViewHost" - ) - } - onDrawTransaction?.let { - requireViewHost().rootSurfaceControl.applyTransactionOnDraw(it) - } - if (requireViewHost().view == null) { - Trace.beginSection("DefaultWindowDecorViewHost#updateViewHost-setView") - requireViewHost().setView(view, attrs) - Trace.endSection() - } else { - check(requireViewHost().view == view) { "Changing view is not allowed" } - Trace.beginSection("DefaultWindowDecorViewHost#updateViewHost-relayout") - requireViewHost().relayout(attrs) - Trace.endSection() - } - Trace.endSection() - } - - private fun clearCurrentUpdateJob() { - currentUpdateJob?.cancel() - currentUpdateJob = null - } - - private fun requireWindowlessWindowManager(): WindowlessWindowManager { - return wwm ?: error("Expected non-null windowless window manager") - } - - private fun requireViewHost(): SurfaceControlViewHost { - return viewHost ?: error("Expected non-null view host") - } -} diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewhost/DefaultWindowDecorViewHostSupplier.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewhost/DefaultWindowDecorViewHostSupplier.kt deleted file mode 100644 index 9997e8f564d8..000000000000 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewhost/DefaultWindowDecorViewHostSupplier.kt +++ /dev/null @@ -1,38 +0,0 @@ -/* - * 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.windowdecor.viewhost - -import android.content.Context -import android.view.Display -import android.view.SurfaceControl -import com.android.wm.shell.shared.annotations.ShellMainThread -import kotlinx.coroutines.CoroutineScope - -/** - * A supplier of [DefaultWindowDecorViewHost]s. It creates a new one every time one is requested. - */ -class DefaultWindowDecorViewHostSupplier( - @ShellMainThread private val mainScope: CoroutineScope, -) : WindowDecorViewHostSupplier<DefaultWindowDecorViewHost> { - - override fun acquire(context: Context, display: Display): DefaultWindowDecorViewHost { - return DefaultWindowDecorViewHost(context, mainScope, display) - } - - override fun release(viewHost: DefaultWindowDecorViewHost, t: SurfaceControl.Transaction) { - viewHost.release(t) - } -} diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewhost/WindowDecorViewHost.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewhost/WindowDecorViewHost.kt deleted file mode 100644 index 3fbaea8bd1bf..000000000000 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewhost/WindowDecorViewHost.kt +++ /dev/null @@ -1,49 +0,0 @@ -/* - * 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.windowdecor.viewhost - -import android.content.res.Configuration -import android.view.SurfaceControl -import android.view.View -import android.view.WindowManager -import com.android.wm.shell.windowdecor.WindowDecoration - -/** - * An interface for a utility that hosts a [WindowDecoration]'s [View] hierarchy under a - * [SurfaceControl]. - */ -interface WindowDecorViewHost { - /** The surface where the underlying [View] hierarchy is being rendered. */ - val surfaceControl: SurfaceControl - - /** Synchronously update the view hierarchy of this view host. */ - fun updateView( - view: View, - attrs: WindowManager.LayoutParams, - configuration: Configuration, - onDrawTransaction: SurfaceControl.Transaction? - ) - - /** Asynchronously update the view hierarchy of this view host. */ - fun updateViewAsync( - view: View, - attrs: WindowManager.LayoutParams, - configuration: Configuration - ) - - /** Releases the underlying [View] hierarchy and removes the backing [SurfaceControl]. */ - fun release(t: SurfaceControl.Transaction) -} diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewhost/WindowDecorViewHostSupplier.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewhost/WindowDecorViewHostSupplier.kt deleted file mode 100644 index 0e2358446d12..000000000000 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewhost/WindowDecorViewHostSupplier.kt +++ /dev/null @@ -1,38 +0,0 @@ -/* - * 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.windowdecor.viewhost - -import android.content.Context -import android.view.Display -import android.view.SurfaceControl - -/** - * An interface for a supplier of [WindowDecorViewHost]s. - */ -interface WindowDecorViewHostSupplier<T : WindowDecorViewHost> { - /** Acquire a [WindowDecorViewHost]. */ - fun acquire(context: Context, display: Display): T - - /** - * Release a [WindowDecorViewHost] when it is no longer used. - * - * @param viewHost the [WindowDecorViewHost] to release - * @param t a transaction that may be used to remove any underlying backing [SurfaceControl] - * that are hosting this [WindowDecorViewHost]. The supplier is not expected to apply - * the transaction. It should be applied by the owner of this supplier. - */ - fun release(viewHost: T, t: SurfaceControl.Transaction) -} diff --git a/libs/WindowManager/Shell/tests/e2e/desktopmode/scenarios/src/com/android/wm/shell/scenarios/StartAppMediaProjectionWithMaxDesktopWindows.kt b/libs/WindowManager/Shell/tests/e2e/desktopmode/scenarios/src/com/android/wm/shell/scenarios/StartAppMediaProjectionWithMaxDesktopWindows.kt index 717ea306eb77..ce235d445fe5 100644 --- a/libs/WindowManager/Shell/tests/e2e/desktopmode/scenarios/src/com/android/wm/shell/scenarios/StartAppMediaProjectionWithMaxDesktopWindows.kt +++ b/libs/WindowManager/Shell/tests/e2e/desktopmode/scenarios/src/com/android/wm/shell/scenarios/StartAppMediaProjectionWithMaxDesktopWindows.kt @@ -72,7 +72,6 @@ open class StartAppMediaProjectionWithMaxDesktopWindows { @Test open fun startMediaProjection() { - // TODO(b/366455106) - handle max task Limit mediaProjectionAppHelper.startSingleAppMediaProjection(wmHelper, targetApp) mailApp.launchViaIntent(wmHelper) simpleApp.launchViaIntent(wmHelper) diff --git a/libs/WindowManager/Shell/tests/e2e/mediaprojection/scenarios/src/com/android/wm/shell/scenarios/StartAppMediaProjectionWithDisplayRotations.kt b/libs/WindowManager/Shell/tests/e2e/mediaprojection/scenarios/src/com/android/wm/shell/scenarios/StartAppMediaProjectionWithDisplayRotations.kt index 1573b58853da..f5fb4cec5535 100644 --- a/libs/WindowManager/Shell/tests/e2e/mediaprojection/scenarios/src/com/android/wm/shell/scenarios/StartAppMediaProjectionWithDisplayRotations.kt +++ b/libs/WindowManager/Shell/tests/e2e/mediaprojection/scenarios/src/com/android/wm/shell/scenarios/StartAppMediaProjectionWithDisplayRotations.kt @@ -20,13 +20,12 @@ import android.app.Instrumentation import android.platform.test.annotations.Postsubmit import android.tools.NavBar import android.tools.Rotation -import android.tools.flicker.rules.ChangeDisplayOrientationRule import android.tools.device.apphelpers.CalculatorAppHelper +import android.tools.flicker.rules.ChangeDisplayOrientationRule import android.tools.traces.parsers.WindowManagerStateHelper import androidx.test.platform.app.InstrumentationRegistry import androidx.test.uiautomator.UiDevice import com.android.launcher3.tapl.LauncherInstrumentation -import com.android.server.wm.flicker.helpers.DesktopModeAppHelper import com.android.server.wm.flicker.helpers.StartMediaProjectionAppHelper import com.android.wm.shell.Utils import org.junit.After @@ -47,8 +46,7 @@ open class StartAppMediaProjectionWithDisplayRotations { private val initialRotation = Rotation.ROTATION_0 private val targetApp = CalculatorAppHelper(instrumentation) - private val mediaProjectionAppHelper = StartMediaProjectionAppHelper(instrumentation) - private val testApp = DesktopModeAppHelper(mediaProjectionAppHelper) + private val testApp = StartMediaProjectionAppHelper(instrumentation) @Rule @JvmField @@ -63,7 +61,7 @@ open class StartAppMediaProjectionWithDisplayRotations { @Test open fun startMediaProjectionAndRotate() { - mediaProjectionAppHelper.startSingleAppMediaProjection(wmHelper, targetApp) + testApp.startSingleAppMediaProjection(wmHelper, targetApp) wmHelper.StateSyncBuilder().withAppTransitionIdle().waitForAndVerify() ChangeDisplayOrientationRule.setRotation(Rotation.ROTATION_90) diff --git a/libs/WindowManager/Shell/tests/e2e/mediaprojection/scenarios/src/com/android/wm/shell/scenarios/StartScreenMediaProjectionWithDisplayRotations.kt b/libs/WindowManager/Shell/tests/e2e/mediaprojection/scenarios/src/com/android/wm/shell/scenarios/StartScreenMediaProjectionWithDisplayRotations.kt index e80a895c1aa6..28f3cc758c22 100644 --- a/libs/WindowManager/Shell/tests/e2e/mediaprojection/scenarios/src/com/android/wm/shell/scenarios/StartScreenMediaProjectionWithDisplayRotations.kt +++ b/libs/WindowManager/Shell/tests/e2e/mediaprojection/scenarios/src/com/android/wm/shell/scenarios/StartScreenMediaProjectionWithDisplayRotations.kt @@ -25,7 +25,6 @@ import android.tools.traces.parsers.WindowManagerStateHelper import androidx.test.platform.app.InstrumentationRegistry import androidx.test.uiautomator.UiDevice import com.android.launcher3.tapl.LauncherInstrumentation -import com.android.server.wm.flicker.helpers.DesktopModeAppHelper import com.android.server.wm.flicker.helpers.StartMediaProjectionAppHelper import com.android.wm.shell.Utils import org.junit.After @@ -45,8 +44,7 @@ open class StartScreenMediaProjectionWithDisplayRotations { val device = UiDevice.getInstance(instrumentation) private val initialRotation = Rotation.ROTATION_0 - private val mediaProjectionAppHelper = StartMediaProjectionAppHelper(instrumentation) - private val testApp = DesktopModeAppHelper(mediaProjectionAppHelper) + private val testApp = StartMediaProjectionAppHelper(instrumentation) @Rule @JvmField @@ -60,7 +58,7 @@ open class StartScreenMediaProjectionWithDisplayRotations { @Test open fun startMediaProjectionAndRotate() { - mediaProjectionAppHelper.startEntireScreenMediaProjection(wmHelper) + testApp.startEntireScreenMediaProjection(wmHelper) wmHelper.StateSyncBuilder().withAppTransitionIdle().waitForAndVerify() ChangeDisplayOrientationRule.setRotation(Rotation.ROTATION_90) diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/ShellTaskOrganizerTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/ShellTaskOrganizerTests.java index e514dc38208e..f01ed84adc74 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/ShellTaskOrganizerTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/ShellTaskOrganizerTests.java @@ -39,6 +39,7 @@ import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.never; import android.app.ActivityManager.RunningTaskInfo; import android.app.TaskInfo; @@ -599,6 +600,18 @@ public class ShellTaskOrganizerTests extends ShellTestCase { } @Test + public void testRecentTasks_visibilityChanges_notFreeForm_shouldNotNotifyTaskController() { + RunningTaskInfo task1_visible = createTaskInfo(/* taskId= */ 1, WINDOWING_MODE_FULLSCREEN); + mOrganizer.onTaskAppeared(task1_visible, /* leash= */ null); + RunningTaskInfo task1_hidden = createTaskInfo(/* taskId= */ 1, WINDOWING_MODE_FULLSCREEN); + task1_hidden.isVisible = false; + + mOrganizer.onTaskInfoChanged(task1_hidden); + + verify(mRecentTasksController, never()).onTaskRunningInfoChanged(task1_hidden); + } + + @Test public void testRecentTasks_windowingModeChanges_shouldNotifyTaskController() { RunningTaskInfo task1 = createTaskInfo(/* taskId= */ 1, WINDOWING_MODE_FULLSCREEN); mOrganizer.onTaskAppeared(task1, /* leash= */ null); diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopActivityOrientationChangeHandlerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopActivityOrientationChangeHandlerTest.kt index b14f1633e8fd..628c9cdd9339 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopActivityOrientationChangeHandlerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopActivityOrientationChangeHandlerTest.kt @@ -41,12 +41,22 @@ import com.android.wm.shell.common.ShellExecutor import com.android.wm.shell.common.TaskStackListenerImpl import com.android.wm.shell.desktopmode.DesktopTestHelpers.Companion.createFreeformTask import com.android.wm.shell.desktopmode.DesktopTestHelpers.Companion.createFullscreenTask +import com.android.wm.shell.desktopmode.persistence.Desktop +import com.android.wm.shell.desktopmode.persistence.DesktopPersistentRepository import com.android.wm.shell.shared.desktopmode.DesktopModeStatus import com.android.wm.shell.sysui.ShellInit import com.android.wm.shell.transition.Transitions import junit.framework.Assert.assertEquals import junit.framework.Assert.assertTrue import kotlin.test.assertNotNull +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.cancel +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.setMain import org.junit.After import org.junit.Before import org.junit.Rule @@ -73,6 +83,7 @@ import org.mockito.quality.Strictness */ @SmallTest @RunWith(AndroidTestingRunner::class) +@ExperimentalCoroutinesApi @EnableFlags(FLAG_ENABLE_DESKTOP_WINDOWING_MODE, FLAG_RESPECT_ORIENTATION_CHANGE_FOR_UNRESIZEABLE) class DesktopActivityOrientationChangeHandlerTest : ShellTestCase() { @JvmField @Rule val setFlagsRule = SetFlagsRule() @@ -82,16 +93,19 @@ class DesktopActivityOrientationChangeHandlerTest : ShellTestCase() { @Mock lateinit var transitions: Transitions @Mock lateinit var resizeTransitionHandler: ToggleResizeDesktopTaskTransitionHandler @Mock lateinit var taskStackListener: TaskStackListenerImpl + @Mock lateinit var persistentRepository: DesktopPersistentRepository private lateinit var mockitoSession: StaticMockitoSession private lateinit var handler: DesktopActivityOrientationChangeHandler private lateinit var shellInit: ShellInit private lateinit var taskRepository: DesktopModeTaskRepository + private lateinit var testScope: CoroutineScope // Mock running tasks are registered here so we can get the list from mock shell task organizer. private val runningTasks = mutableListOf<RunningTaskInfo>() @Before fun setUp() { + Dispatchers.setMain(StandardTestDispatcher()) mockitoSession = mockitoSession() .strictness(Strictness.LENIENT) @@ -99,10 +113,15 @@ class DesktopActivityOrientationChangeHandlerTest : ShellTestCase() { .startMocking() doReturn(true).`when` { DesktopModeStatus.isDesktopModeSupported(any()) } + testScope = CoroutineScope(Dispatchers.Unconfined + SupervisorJob()) shellInit = spy(ShellInit(testExecutor)) - taskRepository = DesktopModeTaskRepository() + taskRepository = + DesktopModeTaskRepository(context, shellInit, persistentRepository, testScope) whenever(shellTaskOrganizer.getRunningTasks(anyInt())).thenAnswer { runningTasks } whenever(transitions.startTransition(anyInt(), any(), isNull())).thenAnswer { Binder() } + whenever(runBlocking { persistentRepository.readDesktop(any(), any()) }).thenReturn( + Desktop.getDefaultInstance() + ) handler = DesktopActivityOrientationChangeHandler(context, shellInit, shellTaskOrganizer, taskStackListener, resizeTransitionHandler, taskRepository) @@ -115,6 +134,7 @@ class DesktopActivityOrientationChangeHandlerTest : ShellTestCase() { mockitoSession.finishMocking() runningTasks.clear() + testScope.cancel() } @Test diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeTaskRepositoryTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeTaskRepositoryTest.kt index d3404f7bd261..bc40d89009bc 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeTaskRepositoryTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeTaskRepositoryTest.kt @@ -17,27 +17,70 @@ package com.android.wm.shell.desktopmode import android.graphics.Rect +import android.platform.test.annotations.EnableFlags import android.testing.AndroidTestingRunner +import android.util.ArraySet import android.view.Display.DEFAULT_DISPLAY import android.view.Display.INVALID_DISPLAY import androidx.test.filters.SmallTest +import com.android.window.flags.Flags.FLAG_ENABLE_DESKTOP_WINDOWING_PERSISTENCE import com.android.wm.shell.ShellTestCase import com.android.wm.shell.TestShellExecutor +import com.android.wm.shell.common.ShellExecutor +import com.android.wm.shell.desktopmode.persistence.Desktop +import com.android.wm.shell.desktopmode.persistence.DesktopPersistentRepository +import com.android.wm.shell.sysui.ShellInit import com.google.common.truth.Truth.assertThat import junit.framework.Assert.fail +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.cancel +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.runTest +import kotlinx.coroutines.test.setMain +import org.junit.After import org.junit.Before import org.junit.Test import org.junit.runner.RunWith +import org.mockito.Mock +import org.mockito.Mockito.inOrder +import org.mockito.Mockito.spy +import org.mockito.kotlin.any +import org.mockito.kotlin.never +import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever @SmallTest @RunWith(AndroidTestingRunner::class) +@ExperimentalCoroutinesApi class DesktopModeTaskRepositoryTest : ShellTestCase() { private lateinit var repo: DesktopModeTaskRepository + private lateinit var shellInit: ShellInit + private lateinit var datastoreScope: CoroutineScope + + @Mock private lateinit var testExecutor: ShellExecutor + @Mock private lateinit var persistentRepository: DesktopPersistentRepository @Before fun setUp() { - repo = DesktopModeTaskRepository() + Dispatchers.setMain(StandardTestDispatcher()) + datastoreScope = CoroutineScope(Dispatchers.Unconfined + SupervisorJob()) + shellInit = spy(ShellInit(testExecutor)) + + repo = DesktopModeTaskRepository(context, shellInit, persistentRepository, datastoreScope) + whenever(runBlocking { persistentRepository.readDesktop(any(), any()) }).thenReturn( + Desktop.getDefaultInstance() + ) + shellInit.init() + } + + @After + fun tearDown() { + datastoreScope.cancel() } @Test @@ -455,6 +498,44 @@ class DesktopModeTaskRepositoryTest : ShellTestCase() { } @Test + @EnableFlags(FLAG_ENABLE_DESKTOP_WINDOWING_PERSISTENCE) + fun addOrMoveFreeformTaskToTop_noTaskExists_persistenceEnabled_addsToTop() = + runTest(StandardTestDispatcher()) { + repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 5) + repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 6) + repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 7) + + val tasks = repo.getFreeformTasksInZOrder(DEFAULT_DISPLAY) + assertThat(tasks).containsExactly(7, 6, 5).inOrder() + inOrder(persistentRepository).run { + verify(persistentRepository) + .addOrUpdateDesktop( + DEFAULT_USER_ID, + DEFAULT_DESKTOP_ID, + visibleTasks = ArraySet(), + minimizedTasks = ArraySet(), + freeformTasksInZOrder = arrayListOf(5) + ) + verify(persistentRepository) + .addOrUpdateDesktop( + DEFAULT_USER_ID, + DEFAULT_DESKTOP_ID, + visibleTasks = ArraySet(), + minimizedTasks = ArraySet(), + freeformTasksInZOrder = arrayListOf(6, 5) + ) + verify(persistentRepository) + .addOrUpdateDesktop( + DEFAULT_USER_ID, + DEFAULT_DESKTOP_ID, + visibleTasks = ArraySet(), + minimizedTasks = ArraySet(), + freeformTasksInZOrder = arrayListOf(7, 6, 5) + ) + } + } + + @Test fun addOrMoveFreeformTaskToTop_alreadyExists_movesToTop() { repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 5) repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 6) @@ -480,6 +561,55 @@ class DesktopModeTaskRepositoryTest : ShellTestCase() { } @Test + @EnableFlags(FLAG_ENABLE_DESKTOP_WINDOWING_PERSISTENCE) + fun minimizeTask_persistenceEnabled_taskIsPersistedAsMinimized() = + runTest(StandardTestDispatcher()) { + repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 5) + repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 6) + repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 7) + + repo.minimizeTask(displayId = 0, taskId = 6) + + val tasks = repo.getFreeformTasksInZOrder(DEFAULT_DISPLAY) + assertThat(tasks).containsExactly(7, 6, 5).inOrder() + assertThat(repo.isMinimizedTask(taskId = 6)).isTrue() + inOrder(persistentRepository).run { + verify(persistentRepository) + .addOrUpdateDesktop( + DEFAULT_USER_ID, + DEFAULT_DESKTOP_ID, + visibleTasks = ArraySet(), + minimizedTasks = ArraySet(), + freeformTasksInZOrder = arrayListOf(5) + ) + verify(persistentRepository) + .addOrUpdateDesktop( + DEFAULT_USER_ID, + DEFAULT_DESKTOP_ID, + visibleTasks = ArraySet(), + minimizedTasks = ArraySet(), + freeformTasksInZOrder = arrayListOf(6, 5) + ) + verify(persistentRepository) + .addOrUpdateDesktop( + DEFAULT_USER_ID, + DEFAULT_DESKTOP_ID, + visibleTasks = ArraySet(), + minimizedTasks = ArraySet(), + freeformTasksInZOrder = arrayListOf(7, 6, 5) + ) + verify(persistentRepository) + .addOrUpdateDesktop( + DEFAULT_USER_ID, + DEFAULT_DESKTOP_ID, + visibleTasks = ArraySet(), + minimizedTasks = ArraySet(arrayOf(6)), + freeformTasksInZOrder = arrayListOf(7, 6, 5) + ) + } + } + + @Test fun addOrMoveFreeformTaskToTop_taskIsUnminimized_noop() { repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 5) repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, 6) @@ -503,6 +633,33 @@ class DesktopModeTaskRepositoryTest : ShellTestCase() { } @Test + @EnableFlags(FLAG_ENABLE_DESKTOP_WINDOWING_PERSISTENCE) + fun removeFreeformTask_invalidDisplay_persistenceEnabled_removesTaskFromFreeformTasks() { + runTest(StandardTestDispatcher()) { + repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, taskId = 1) + + repo.removeFreeformTask(INVALID_DISPLAY, taskId = 1) + + verify(persistentRepository) + .addOrUpdateDesktop( + DEFAULT_USER_ID, + DEFAULT_DESKTOP_ID, + visibleTasks = ArraySet(), + minimizedTasks = ArraySet(), + freeformTasksInZOrder = arrayListOf(1) + ) + verify(persistentRepository) + .addOrUpdateDesktop( + DEFAULT_USER_ID, + DEFAULT_DESKTOP_ID, + visibleTasks = ArraySet(), + minimizedTasks = ArraySet(), + freeformTasksInZOrder = ArrayList() + ) + } + } + + @Test fun removeFreeformTask_validDisplay_removesTaskFromFreeformTasks() { repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, taskId = 1) @@ -513,6 +670,33 @@ class DesktopModeTaskRepositoryTest : ShellTestCase() { } @Test + @EnableFlags(FLAG_ENABLE_DESKTOP_WINDOWING_PERSISTENCE) + fun removeFreeformTask_validDisplay_persistenceEnabled_removesTaskFromFreeformTasks() { + runTest(StandardTestDispatcher()) { + repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, taskId = 1) + + repo.removeFreeformTask(DEFAULT_DISPLAY, taskId = 1) + + verify(persistentRepository) + .addOrUpdateDesktop( + DEFAULT_USER_ID, + DEFAULT_DESKTOP_ID, + visibleTasks = ArraySet(), + minimizedTasks = ArraySet(), + freeformTasksInZOrder = arrayListOf(1) + ) + verify(persistentRepository) + .addOrUpdateDesktop( + DEFAULT_USER_ID, + DEFAULT_DESKTOP_ID, + visibleTasks = ArraySet(), + minimizedTasks = ArraySet(), + freeformTasksInZOrder = ArrayList() + ) + } + } + + @Test fun removeFreeformTask_validDisplay_differentDisplay_doesNotRemovesTask() { repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, taskId = 1) @@ -523,6 +707,33 @@ class DesktopModeTaskRepositoryTest : ShellTestCase() { } @Test + @EnableFlags(FLAG_ENABLE_DESKTOP_WINDOWING_PERSISTENCE) + fun removeFreeformTask_validDisplayButDifferentDisplay_persistenceEnabled_doesNotRemoveTask() { + runTest(StandardTestDispatcher()) { + repo.addOrMoveFreeformTaskToTop(DEFAULT_DISPLAY, taskId = 1) + + repo.removeFreeformTask(SECOND_DISPLAY, taskId = 1) + + verify(persistentRepository) + .addOrUpdateDesktop( + DEFAULT_USER_ID, + DEFAULT_DESKTOP_ID, + visibleTasks = ArraySet(), + minimizedTasks = ArraySet(), + freeformTasksInZOrder = arrayListOf(1) + ) + verify(persistentRepository, never()) + .addOrUpdateDesktop( + DEFAULT_USER_ID, + DEFAULT_DESKTOP_ID, + visibleTasks = ArraySet(), + minimizedTasks = ArraySet(), + freeformTasksInZOrder = ArrayList() + ) + } + } + + @Test fun removeFreeformTask_removesTaskBoundsBeforeMaximize() { val taskId = 1 repo.addActiveTask(THIRD_DISPLAY, taskId) @@ -709,5 +920,7 @@ class DesktopModeTaskRepositoryTest : ShellTestCase() { companion object { const val SECOND_DISPLAY = 1 const val THIRD_DISPLAY = 345 + private const val DEFAULT_USER_ID = 1000 + private const val DEFAULT_DESKTOP_ID = 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 8f20841e76b3..ee545209904f 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 @@ -93,6 +93,8 @@ import com.android.wm.shell.desktopmode.DesktopTestHelpers.Companion.createFreef import com.android.wm.shell.desktopmode.DesktopTestHelpers.Companion.createFullscreenTask import com.android.wm.shell.desktopmode.DesktopTestHelpers.Companion.createHomeTask import com.android.wm.shell.desktopmode.DesktopTestHelpers.Companion.createSplitScreenTask +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.recents.RecentTasksController import com.android.wm.shell.recents.RecentsTransitionHandler @@ -117,6 +119,14 @@ import junit.framework.Assert.assertFalse import junit.framework.Assert.assertTrue import kotlin.test.assertNotNull import kotlin.test.assertNull +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.cancel +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.setMain import org.junit.After import org.junit.Assume.assumeTrue import org.junit.Before @@ -148,6 +158,7 @@ import org.mockito.quality.Strictness */ @SmallTest @RunWith(AndroidTestingRunner::class) +@ExperimentalCoroutinesApi @EnableFlags(FLAG_ENABLE_DESKTOP_WINDOWING_MODE) class DesktopTasksControllerTest : ShellTestCase() { @@ -183,6 +194,7 @@ class DesktopTasksControllerTest : ShellTestCase() { @Mock private lateinit var mockSurface: SurfaceControl @Mock private lateinit var taskbarDesktopTaskListener: TaskbarDesktopTaskListener @Mock private lateinit var mockHandler: Handler + @Mock lateinit var persistentRepository: DesktopPersistentRepository private lateinit var mockitoSession: StaticMockitoSession private lateinit var controller: DesktopTasksController @@ -190,6 +202,7 @@ class DesktopTasksControllerTest : ShellTestCase() { private lateinit var taskRepository: DesktopModeTaskRepository private lateinit var desktopTasksLimiter: DesktopTasksLimiter private lateinit var recentsTransitionStateListener: RecentsTransitionStateListener + private lateinit var testScope: CoroutineScope private val shellExecutor = TestShellExecutor() @@ -207,6 +220,7 @@ class DesktopTasksControllerTest : ShellTestCase() { @Before fun setUp() { + Dispatchers.setMain(StandardTestDispatcher()) mockitoSession = mockitoSession() .strictness(Strictness.LENIENT) @@ -214,8 +228,9 @@ class DesktopTasksControllerTest : ShellTestCase() { .startMocking() doReturn(true).`when` { DesktopModeStatus.isDesktopModeSupported(any()) } + testScope = CoroutineScope(Dispatchers.Unconfined + SupervisorJob()) shellInit = spy(ShellInit(testExecutor)) - taskRepository = DesktopModeTaskRepository() + taskRepository = DesktopModeTaskRepository(context, shellInit, persistentRepository, testScope) desktopTasksLimiter = DesktopTasksLimiter( transitions, @@ -233,6 +248,9 @@ class DesktopTasksControllerTest : ShellTestCase() { whenever(displayLayout.getStableBounds(any())).thenAnswer { i -> (i.arguments.first() as Rect).set(STABLE_BOUNDS) } + whenever(runBlocking { persistentRepository.readDesktop(any(), any()) }).thenReturn( + Desktop.getDefaultInstance() + ) val tda = DisplayAreaInfo(MockToken().token(), DEFAULT_DISPLAY, 0) tda.configuration.windowConfiguration.windowingMode = WINDOWING_MODE_FULLSCREEN @@ -287,6 +305,7 @@ class DesktopTasksControllerTest : ShellTestCase() { mockitoSession.finishMocking() runningTasks.clear() + testScope.cancel() } @Test diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksLimiterTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksLimiterTest.kt index 61d03cac035c..045e07796cb8 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksLimiterTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksLimiterTest.kt @@ -35,13 +35,23 @@ import com.android.internal.jank.Cuj.CUJ_DESKTOP_MODE_MINIMIZE_WINDOW import com.android.internal.jank.InteractionJankMonitor import com.android.wm.shell.ShellTaskOrganizer import com.android.wm.shell.ShellTestCase +import com.android.wm.shell.common.ShellExecutor import com.android.wm.shell.desktopmode.DesktopTestHelpers.Companion.createFreeformTask +import com.android.wm.shell.desktopmode.persistence.DesktopPersistentRepository import com.android.wm.shell.shared.desktopmode.DesktopModeStatus +import com.android.wm.shell.sysui.ShellInit import com.android.wm.shell.transition.TransitionInfoBuilder import com.android.wm.shell.transition.Transitions import com.android.wm.shell.util.StubTransaction import com.google.common.truth.Truth.assertThat import kotlin.test.assertFailsWith +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.cancel +import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.setMain import org.junit.After import org.junit.Before import org.junit.Rule @@ -49,6 +59,7 @@ import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock import org.mockito.Mockito.any +import org.mockito.Mockito.spy import org.mockito.Mockito.`when` import org.mockito.kotlin.eq import org.mockito.kotlin.verify @@ -62,6 +73,7 @@ import org.mockito.quality.Strictness */ @SmallTest @RunWith(AndroidTestingRunner::class) +@ExperimentalCoroutinesApi class DesktopTasksLimiterTest : ShellTestCase() { @JvmField @@ -72,19 +84,26 @@ class DesktopTasksLimiterTest : ShellTestCase() { @Mock lateinit var transitions: Transitions @Mock lateinit var interactionJankMonitor: InteractionJankMonitor @Mock lateinit var handler: Handler + @Mock lateinit var testExecutor: ShellExecutor + @Mock lateinit var persistentRepository: DesktopPersistentRepository private lateinit var mockitoSession: StaticMockitoSession private lateinit var desktopTasksLimiter: DesktopTasksLimiter private lateinit var desktopTaskRepo: DesktopModeTaskRepository + private lateinit var shellInit: ShellInit + private lateinit var testScope: CoroutineScope @Before fun setUp() { mockitoSession = ExtendedMockito.mockitoSession().strictness(Strictness.LENIENT) .spyStatic(DesktopModeStatus::class.java).startMocking() doReturn(true).`when`{ DesktopModeStatus.canEnterDesktopMode(any()) } + shellInit = spy(ShellInit(testExecutor)) + Dispatchers.setMain(StandardTestDispatcher()) + testScope = CoroutineScope(Dispatchers.Unconfined + SupervisorJob()) - desktopTaskRepo = DesktopModeTaskRepository() - + desktopTaskRepo = + DesktopModeTaskRepository(context, shellInit, persistentRepository, testScope) desktopTasksLimiter = DesktopTasksLimiter(transitions, desktopTaskRepo, shellTaskOrganizer, MAX_TASK_LIMIT, interactionJankMonitor, mContext, handler) @@ -93,6 +112,7 @@ class DesktopTasksLimiterTest : ShellTestCase() { @After fun tearDown() { mockitoSession.finishMocking() + testScope.cancel() } @Test diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/persistence/DesktopPersistentRepositoryTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/persistence/DesktopPersistentRepositoryTest.kt new file mode 100644 index 000000000000..9b9703fdf6dc --- /dev/null +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/persistence/DesktopPersistentRepositoryTest.kt @@ -0,0 +1,198 @@ +/* + * 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.desktopmode.persistence + +import android.content.Context +import android.platform.test.annotations.EnableFlags +import android.testing.AndroidTestingRunner +import android.util.ArraySet +import android.view.Display.DEFAULT_DISPLAY +import androidx.datastore.core.DataStore +import androidx.datastore.core.DataStoreFactory +import androidx.datastore.dataStoreFile +import androidx.test.core.app.ApplicationProvider +import androidx.test.filters.SmallTest +import androidx.test.platform.app.InstrumentationRegistry +import com.android.window.flags.Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE +import com.android.window.flags.Flags.FLAG_ENABLE_DESKTOP_WINDOWING_PERSISTENCE +import com.android.wm.shell.ShellTestCase +import com.google.common.truth.Truth.assertThat +import java.io.File +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.cancel +import kotlinx.coroutines.test.StandardTestDispatcher +import kotlinx.coroutines.test.runTest +import kotlinx.coroutines.test.setMain +import org.junit.After +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith + +@SmallTest +@RunWith(AndroidTestingRunner::class) +@ExperimentalCoroutinesApi +@EnableFlags(FLAG_ENABLE_DESKTOP_WINDOWING_MODE, FLAG_ENABLE_DESKTOP_WINDOWING_PERSISTENCE) +class DesktopPersistentRepositoryTest : ShellTestCase() { + private val testContext: Context = InstrumentationRegistry.getInstrumentation().targetContext + private lateinit var testDatastore: DataStore<DesktopPersistentRepositories> + private lateinit var datastoreRepository: DesktopPersistentRepository + private lateinit var datastoreScope: CoroutineScope + + @Before + fun setUp() { + Dispatchers.setMain(StandardTestDispatcher()) + datastoreScope = CoroutineScope(Dispatchers.Unconfined + SupervisorJob()) + testDatastore = + DataStoreFactory.create( + serializer = + DesktopPersistentRepository.Companion.DesktopPersistentRepositoriesSerializer, + scope = datastoreScope) { + testContext.dataStoreFile(DESKTOP_REPOSITORY_STATES_DATASTORE_TEST_FILE) + } + datastoreRepository = DesktopPersistentRepository(testDatastore) + } + + @After + fun tearDown() { + File(ApplicationProvider.getApplicationContext<Context>().filesDir, "datastore") + .deleteRecursively() + + datastoreScope.cancel() + } + + @Test + fun readRepository_returnsCorrectDesktop() { + runTest(StandardTestDispatcher()) { + val task = createDesktopTask(1) + val desk = createDesktop(task) + val repositoryState = + DesktopRepositoryState.newBuilder().putDesktop(DEFAULT_DESKTOP_ID, desk) + val DesktopPersistentRepositories = + DesktopPersistentRepositories.newBuilder() + .putDesktopRepoByUser(DEFAULT_USER_ID, repositoryState.build()) + .build() + testDatastore.updateData { DesktopPersistentRepositories } + + val actualDesktop = datastoreRepository.readDesktop(DEFAULT_USER_ID, DEFAULT_DESKTOP_ID) + + assertThat(actualDesktop).isEqualTo(desk) + } + } + + @Test + fun addOrUpdateTask_addNewTaskToDesktop() { + runTest(StandardTestDispatcher()) { + // Create a basic repository state + val task = createDesktopTask(1) + val DesktopPersistentRepositories = createRepositoryWithOneDesk(task) + testDatastore.updateData { DesktopPersistentRepositories } + // Create a new state to be initialized + val visibleTasks = ArraySet(listOf(1, 2)) + val minimizedTasks = ArraySet<Int>() + val freeformTasksInZOrder = ArrayList(listOf(2, 1)) + + // Update with new state + datastoreRepository.addOrUpdateDesktop( + visibleTasks = visibleTasks, + minimizedTasks = minimizedTasks, + freeformTasksInZOrder = freeformTasksInZOrder) + + val actualDesktop = datastoreRepository.readDesktop(DEFAULT_USER_ID, DEFAULT_DESKTOP_ID) + assertThat(actualDesktop.tasksByTaskIdMap).hasSize(2) + assertThat(actualDesktop.getZOrderedTasks(0)).isEqualTo(2) + } + } + + @Test + fun addOrUpdateTask_changeTaskStateToMinimize_taskStateIsMinimized() { + runTest(StandardTestDispatcher()) { + val task = createDesktopTask(1) + val DesktopPersistentRepositories = createRepositoryWithOneDesk(task) + testDatastore.updateData { DesktopPersistentRepositories } + // Create a new state to be initialized + val visibleTasks = ArraySet(listOf(1)) + val minimizedTasks = ArraySet(listOf(1)) + val freeformTasksInZOrder = ArrayList(listOf(1)) + + // Update with new state + datastoreRepository.addOrUpdateDesktop( + visibleTasks = visibleTasks, + minimizedTasks = minimizedTasks, + freeformTasksInZOrder = freeformTasksInZOrder) + + val actualDesktop = datastoreRepository.readDesktop(DEFAULT_USER_ID, DEFAULT_DESKTOP_ID) + assertThat(actualDesktop.tasksByTaskIdMap[task.taskId]?.desktopTaskState) + .isEqualTo(DesktopTaskState.MINIMIZED) + } + } + + @Test + fun removeTask_previouslyAddedTaskIsRemoved() { + runTest(StandardTestDispatcher()) { + val task = createDesktopTask(1) + val DesktopPersistentRepositories = createRepositoryWithOneDesk(task) + testDatastore.updateData { DesktopPersistentRepositories } + // Create a new state to be initialized + val visibleTasks = ArraySet<Int>() + val minimizedTasks = ArraySet<Int>() + val freeformTasksInZOrder = ArrayList<Int>() + + // Update with new state + datastoreRepository.addOrUpdateDesktop( + visibleTasks = visibleTasks, + minimizedTasks = minimizedTasks, + freeformTasksInZOrder = freeformTasksInZOrder) + + val actualDesktop = datastoreRepository.readDesktop(DEFAULT_USER_ID, DEFAULT_DESKTOP_ID) + assertThat(actualDesktop.tasksByTaskIdMap).isEmpty() + assertThat(actualDesktop.zOrderedTasksList).isEmpty() + } + } + + private companion object { + const val DESKTOP_REPOSITORY_STATES_DATASTORE_TEST_FILE = "desktop_repo_test.pb" + const val DEFAULT_USER_ID = 1000 + const val DEFAULT_DESKTOP_ID = 0 + + fun createRepositoryWithOneDesk(task: DesktopTask): DesktopPersistentRepositories { + val desk = createDesktop(task) + val repositoryState = + DesktopRepositoryState.newBuilder().putDesktop(DEFAULT_DESKTOP_ID, desk) + val DesktopPersistentRepositories = + DesktopPersistentRepositories.newBuilder() + .putDesktopRepoByUser(DEFAULT_USER_ID, repositoryState.build()) + .build() + return DesktopPersistentRepositories + } + + fun createDesktop(task: DesktopTask): Desktop? = + Desktop.newBuilder() + .setDisplayId(DEFAULT_DISPLAY) + .addZOrderedTasks(task.taskId) + .putTasksByTaskId(task.taskId, task) + .build() + + fun createDesktopTask( + taskId: Int, + state: DesktopTaskState = DesktopTaskState.VISIBLE + ): DesktopTask = + DesktopTask.newBuilder().setTaskId(taskId).setDesktopTaskState(state).build() + } +} 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 ee2a41c322c9..3051714b5ae8 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,7 +100,6 @@ import com.android.wm.shell.transition.Transitions import com.android.wm.shell.windowdecor.DesktopModeWindowDecorViewModel.DesktopModeKeyguardChangeListener import com.android.wm.shell.windowdecor.DesktopModeWindowDecorViewModel.DesktopModeOnInsetsChangedListener import com.android.wm.shell.windowdecor.viewholder.AppHeaderViewHolder -import com.android.wm.shell.windowdecor.viewhost.WindowDecorViewHostSupplier import java.util.Optional import java.util.function.Consumer import java.util.function.Supplier @@ -186,7 +185,6 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() { DesktopModeWindowDecorViewModel.TaskPositionerFactory @Mock private lateinit var mockTaskPositioner: TaskPositioner @Mock private lateinit var mockCaptionHandleRepository: WindowDecorCaptionHandleRepository - @Mock private lateinit var mockWindowDecorViewHostSupplier: WindowDecorViewHostSupplier<*> private lateinit var spyContext: TestableContext private val transactionFactory = Supplier<SurfaceControl.Transaction> { @@ -236,7 +234,6 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() { mockGenericLinksParser, mockAssistContentRequester, mockMultiInstanceHelper, - mockWindowDecorViewHostSupplier, mockDesktopModeWindowDecorFactory, mockInputMonitorFactory, transactionFactory, @@ -1217,7 +1214,7 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() { whenever( mockDesktopModeWindowDecorFactory.create( any(), any(), any(), any(), any(), eq(task), any(), any(), any(), any(), any(), - any(), any(), any(), any(), any(), any(), any()) + any(), any(), any(), any(), any(), any()) ).thenReturn(decoration) decoration.mTaskInfo = task whenever(decoration.isFocused).thenReturn(task.isFocused) 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 a1867f3698fc..f007115c6dab 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 @@ -47,6 +47,7 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import static org.mockito.kotlin.VerificationKt.times; import android.app.ActivityManager; import android.app.assist.AssistContent; @@ -106,8 +107,6 @@ import com.android.wm.shell.shared.desktopmode.DesktopModeStatus; import com.android.wm.shell.splitscreen.SplitScreenController; import com.android.wm.shell.windowdecor.WindowDecoration.RelayoutParams; import com.android.wm.shell.windowdecor.viewholder.AppHeaderViewHolder; -import com.android.wm.shell.windowdecor.viewhost.WindowDecorViewHost; -import com.android.wm.shell.windowdecor.viewhost.WindowDecorViewHostSupplier; import kotlin.Unit; import kotlin.jvm.functions.Function0; @@ -178,10 +177,6 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { @Mock private WindowDecoration.SurfaceControlViewHostFactory mMockSurfaceControlViewHostFactory; @Mock - private WindowDecorViewHostSupplier mMockWindowDecorViewHostSupplier; - @Mock - private WindowDecorViewHost mMockWindowDecorViewHost; - @Mock private TypedArray mMockRoundedCornersRadiusArray; @Mock private TestTouchEventListener mMockTouchEventListener; @@ -257,9 +252,6 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { anyBoolean(), anyBoolean(), anyBoolean(), any(), anyInt(), anyInt(), anyInt())) .thenReturn(mMockHandleMenu); when(mMockMultiInstanceHelper.supportsMultiInstanceSplit(any())).thenReturn(false); - when(mMockWindowDecorViewHostSupplier.acquire(any(), eq(defaultDisplay))) - .thenReturn(mMockWindowDecorViewHost); - when(mMockWindowDecorViewHost.getSurfaceControl()).thenReturn(mock(SurfaceControl.class)); when(mMockAppHeaderViewHolderFactory.create(any(), any(), any(), any(), any(), any(), any(), any())).thenReturn(mMockAppHeaderViewHolder); } @@ -533,56 +525,61 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { } @Test - public void updateRelayoutParams_handle_requestsAsyncViewHostRendering() { + public void relayout_fullscreenTask_appliesTransactionImmediately() { final ActivityManager.RunningTaskInfo taskInfo = createTaskInfo(/* visible= */ true); - // Make the task fullscreen so that its decoration is an App Handle. + final DesktopModeWindowDecoration spyWindowDecor = spy(createWindowDecoration(taskInfo)); taskInfo.configuration.windowConfiguration.setWindowingMode(WINDOWING_MODE_FULLSCREEN); - final RelayoutParams relayoutParams = new RelayoutParams(); - DesktopModeWindowDecoration.updateRelayoutParams( - relayoutParams, - mTestableContext, - taskInfo, - /* applyStartTransactionOnDraw= */ true, - /* shouldSetTaskPositionAndCrop */ false); + spyWindowDecor.relayout(taskInfo); - // App Handles don't need to be rendered in sync with the task animation, per UX. - assertThat(relayoutParams.mAsyncViewHost).isTrue(); + verify(mMockTransaction).apply(); + verify(mMockRootSurfaceControl, never()).applyTransactionOnDraw(any()); } @Test - public void updateRelayoutParams_header_requestsSyncViewHostRendering() { + @Ignore("TODO(b/367235906): Due to MONITOR_INPUT permission error") + public void relayout_freeformTask_appliesTransactionOnDraw() { final ActivityManager.RunningTaskInfo taskInfo = createTaskInfo(/* visible= */ true); - // Make the task freeform so that its decoration is an App Header. + final DesktopModeWindowDecoration spyWindowDecor = spy(createWindowDecoration(taskInfo)); taskInfo.configuration.windowConfiguration.setWindowingMode(WINDOWING_MODE_FREEFORM); - final RelayoutParams relayoutParams = new RelayoutParams(); + // Make non-resizable to avoid dealing with input-permissions (MONITOR_INPUT) + taskInfo.isResizeable = false; - DesktopModeWindowDecoration.updateRelayoutParams( - relayoutParams, - mTestableContext, - taskInfo, - /* applyStartTransactionOnDraw= */ true, - /* shouldSetTaskPositionAndCrop */ false); + spyWindowDecor.relayout(taskInfo); - // App Headers must be rendered in sync with the task animation, so it cannot be delayed. - assertThat(relayoutParams.mAsyncViewHost).isFalse(); + verify(mMockTransaction, never()).apply(); + verify(mMockRootSurfaceControl).applyTransactionOnDraw(mMockTransaction); } @Test - public void relayout_fullscreenTask_appliesTransactionImmediately() { + public void relayout_fullscreenTask_doesNotCreateViewHostImmediately() { final ActivityManager.RunningTaskInfo taskInfo = createTaskInfo(/* visible= */ true); final DesktopModeWindowDecoration spyWindowDecor = spy(createWindowDecoration(taskInfo)); taskInfo.configuration.windowConfiguration.setWindowingMode(WINDOWING_MODE_FULLSCREEN); spyWindowDecor.relayout(taskInfo); - verify(mMockTransaction).apply(); - verify(mMockRootSurfaceControl, never()).applyTransactionOnDraw(any()); + verify(mMockSurfaceControlViewHostFactory, never()).create(any(), any(), any()); + } + + @Test + public void relayout_fullscreenTask_postsViewHostCreation() { + final ActivityManager.RunningTaskInfo taskInfo = createTaskInfo(/* visible= */ true); + final DesktopModeWindowDecoration spyWindowDecor = spy(createWindowDecoration(taskInfo)); + taskInfo.configuration.windowConfiguration.setWindowingMode(WINDOWING_MODE_FULLSCREEN); + + ArgumentCaptor<Runnable> runnableArgument = ArgumentCaptor.forClass(Runnable.class); + spyWindowDecor.relayout(taskInfo); + + // Once for view host, the other for the AppHandle input layer. + verify(mMockHandler, times(2)).post(runnableArgument.capture()); + runnableArgument.getValue().run(); + verify(mMockSurfaceControlViewHostFactory).create(any(), any(), any()); } @Test @Ignore("TODO(b/367235906): Due to MONITOR_INPUT permission error") - public void relayout_freeformTask_appliesTransactionOnDraw() { + public void relayout_freeformTask_createsViewHostImmediately() { final ActivityManager.RunningTaskInfo taskInfo = createTaskInfo(/* visible= */ true); final DesktopModeWindowDecoration spyWindowDecor = spy(createWindowDecoration(taskInfo)); taskInfo.configuration.windowConfiguration.setWindowingMode(WINDOWING_MODE_FREEFORM); @@ -591,8 +588,38 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { spyWindowDecor.relayout(taskInfo); - verify(mMockTransaction, never()).apply(); - verify(mMockWindowDecorViewHost).updateView(any(), any(), any(), eq(mMockTransaction)); + verify(mMockSurfaceControlViewHostFactory).create(any(), any(), any()); + verify(mMockHandler, never()).post(any()); + } + + @Test + public void relayout_removesExistingHandlerCallback() { + final ActivityManager.RunningTaskInfo taskInfo = createTaskInfo(/* visible= */ true); + final DesktopModeWindowDecoration spyWindowDecor = spy(createWindowDecoration(taskInfo)); + taskInfo.configuration.windowConfiguration.setWindowingMode(WINDOWING_MODE_FULLSCREEN); + ArgumentCaptor<Runnable> runnableArgument = ArgumentCaptor.forClass(Runnable.class); + spyWindowDecor.relayout(taskInfo); + // Once for view host, the other for the AppHandle input layer. + verify(mMockHandler, times(2)).post(runnableArgument.capture()); + + spyWindowDecor.relayout(taskInfo); + + verify(mMockHandler).removeCallbacks(runnableArgument.getValue()); + } + + @Test + public void close_removesExistingHandlerCallback() { + final ActivityManager.RunningTaskInfo taskInfo = createTaskInfo(/* visible= */ true); + final DesktopModeWindowDecoration spyWindowDecor = spy(createWindowDecoration(taskInfo)); + taskInfo.configuration.windowConfiguration.setWindowingMode(WINDOWING_MODE_FULLSCREEN); + ArgumentCaptor<Runnable> runnableArgument = ArgumentCaptor.forClass(Runnable.class); + spyWindowDecor.relayout(taskInfo); + // Once for view host, the other for the AppHandle input layer. + verify(mMockHandler, times(2)).post(runnableArgument.capture()); + + spyWindowDecor.close(); + + verify(mMockHandler).removeCallbacks(runnableArgument.getValue()); } @Test @@ -623,7 +650,7 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { .postDelayed(mCloseMaxMenuRunnable.capture(), eq(CLOSE_MAXIMIZE_MENU_DELAY_MS)); mCloseMaxMenuRunnable.getValue().run(); - verify(menu).close(); + verify(menu).close(any()); assertFalse(decoration.isMaximizeMenuActive()); } @@ -642,7 +669,7 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { .postDelayed(mCloseMaxMenuRunnable.capture(), eq(CLOSE_MAXIMIZE_MENU_DELAY_MS)); mCloseMaxMenuRunnable.getValue().run(); - verify(menu).close(); + verify(menu).close(any()); assertFalse(decoration.isMaximizeMenuActive()); } @@ -1065,7 +1092,7 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { mMockGenericLinksParser, mMockAssistContentRequester, SurfaceControl.Builder::new, mMockTransactionSupplier, WindowContainerTransaction::new, SurfaceControl::new, new WindowManagerWrapper(mMockWindowManager), mMockSurfaceControlViewHostFactory, - mMockWindowDecorViewHostSupplier, maximizeMenuFactory, mMockHandleMenuFactory, + maximizeMenuFactory, mMockHandleMenuFactory, mMockMultiInstanceHelper, mMockCaptionHandleRepository); windowDecor.setCaptionListeners(mMockTouchEventListener, mMockTouchEventListener, mMockTouchEventListener, mMockTouchEventListener); 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 7252b32efc6b..2e117ac9f865 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 @@ -85,8 +85,6 @@ import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.shared.desktopmode.DesktopModeStatus; import com.android.wm.shell.tests.R; import com.android.wm.shell.windowdecor.additionalviewcontainer.AdditionalViewContainer; -import com.android.wm.shell.windowdecor.viewhost.WindowDecorViewHost; -import com.android.wm.shell.windowdecor.viewhost.WindowDecorViewHostSupplier; import org.junit.Before; import org.junit.Rule; @@ -130,10 +128,6 @@ public class WindowDecorationTests extends ShellTestCase { @Mock private SurfaceControlViewHost mMockSurfaceControlViewHost; @Mock - private WindowDecorViewHostSupplier mMockWindowDecorViewHostSupplier; - @Mock - private WindowDecorViewHost mMockWindowDecorViewHost; - @Mock private AttachedSurfaceControl mMockRootSurfaceControl; @Mock private TestView mMockView; @@ -173,9 +167,6 @@ public class WindowDecorationTests extends ShellTestCase { when(mMockSurfaceControlViewHost.getRootSurfaceControl()) .thenReturn(mMockRootSurfaceControl); when(mMockView.findViewById(anyInt())).thenReturn(mMockView); - when(mMockWindowDecorViewHostSupplier.acquire(any(), any())) - .thenReturn(mMockWindowDecorViewHost); - when(mMockWindowDecorViewHost.getSurfaceControl()).thenReturn(mock(SurfaceControl.class)); // Add status bar inset so that WindowDecoration does not think task is in immersive mode mInsetsState.getOrCreateSource(STATUS_BAR_INSET_SOURCE_ID, statusBars()).setVisible(true); @@ -239,6 +230,10 @@ public class WindowDecorationTests extends ShellTestCase { final SurfaceControl.Builder decorContainerSurfaceBuilder = createMockSurfaceControlBuilder(decorContainerSurface); mMockSurfaceControlBuilders.add(decorContainerSurfaceBuilder); + final SurfaceControl captionContainerSurface = mock(SurfaceControl.class); + final SurfaceControl.Builder captionContainerSurfaceBuilder = + createMockSurfaceControlBuilder(captionContainerSurface); + mMockSurfaceControlBuilders.add(captionContainerSurfaceBuilder); final ActivityManager.RunningTaskInfo taskInfo = new TestRunningTaskInfoBuilder() .setDisplayId(Display.DEFAULT_DISPLAY) @@ -259,18 +254,18 @@ public class WindowDecorationTests extends ShellTestCase { verify(mMockSurfaceControlStartT).setTrustedOverlay(decorContainerSurface, true); verify(mMockSurfaceControlStartT).setWindowCrop(decorContainerSurface, 300, 100); - final SurfaceControl captionContainerSurface = mMockWindowDecorViewHost.getSurfaceControl(); - verify(mMockSurfaceControlStartT).reparent(captionContainerSurface, decorContainerSurface); + verify(captionContainerSurfaceBuilder).setParent(decorContainerSurface); + verify(captionContainerSurfaceBuilder).setContainerLayer(); verify(mMockSurfaceControlStartT).setWindowCrop(captionContainerSurface, 300, 64); verify(mMockSurfaceControlStartT).show(captionContainerSurface); - verify(mMockWindowDecorViewHost).updateView( - same(mMockView), - argThat(lp -> lp.height == 64 - && lp.width == 300 - && (lp.flags & LayoutParams.FLAG_NOT_FOCUSABLE) != 0), - eq(taskInfo.configuration), - eq(null) /* onDrawTransaction */); + verify(mMockSurfaceControlViewHostFactory).create(any(), eq(defaultDisplay), any()); + + verify(mMockSurfaceControlViewHost) + .setView(same(mMockView), + argThat(lp -> lp.height == 64 + && lp.width == 300 + && (lp.flags & LayoutParams.FLAG_NOT_FOCUSABLE) != 0)); verify(mMockView).setTaskFocusState(true); verify(mMockWindowContainerTransaction).addInsetsSource( eq(taskInfo.token), @@ -301,6 +296,10 @@ public class WindowDecorationTests extends ShellTestCase { final SurfaceControl.Builder decorContainerSurfaceBuilder = createMockSurfaceControlBuilder(decorContainerSurface); mMockSurfaceControlBuilders.add(decorContainerSurfaceBuilder); + final SurfaceControl captionContainerSurface = mock(SurfaceControl.class); + final SurfaceControl.Builder captionContainerSurfaceBuilder = + createMockSurfaceControlBuilder(captionContainerSurface); + mMockSurfaceControlBuilders.add(captionContainerSurfaceBuilder); final SurfaceControl.Transaction t = mock(SurfaceControl.Transaction.class); mMockSurfaceControlTransactions.add(t); @@ -323,7 +322,7 @@ public class WindowDecorationTests extends ShellTestCase { windowDecor.relayout(taskInfo); - verify(mMockWindowDecorViewHost, never()).release(any()); + verify(mMockSurfaceControlViewHost, never()).release(); verify(t, never()).apply(); verify(mMockWindowContainerTransaction, never()) .removeInsetsSource(eq(taskInfo.token), any(), anyInt(), anyInt()); @@ -333,8 +332,9 @@ public class WindowDecorationTests extends ShellTestCase { taskInfo.isVisible = false; windowDecor.relayout(taskInfo); - final InOrder releaseOrder = inOrder(t2, mMockWindowDecorViewHostSupplier); - releaseOrder.verify(mMockWindowDecorViewHostSupplier).release(mMockWindowDecorViewHost, t2); + final InOrder releaseOrder = inOrder(t2, mMockSurfaceControlViewHost); + releaseOrder.verify(mMockSurfaceControlViewHost).release(); + releaseOrder.verify(t2).remove(captionContainerSurface); releaseOrder.verify(t2).remove(decorContainerSurface); releaseOrder.verify(t2).apply(); // Expect to remove two insets sources, the caption insets and the mandatory gesture insets. @@ -382,8 +382,8 @@ public class WindowDecorationTests extends ShellTestCase { verify(mMockDisplayController).removeDisplayWindowListener(same(listener)); assertThat(mRelayoutResult.mRootView).isSameInstanceAs(mMockView); - verify(mMockWindowDecorViewHostSupplier).acquire(any(), eq(mockDisplay)); - verify(mMockWindowDecorViewHost).updateView(same(mMockView), any(), any(), any()); + verify(mMockSurfaceControlViewHostFactory).create(any(), eq(mockDisplay), any()); + verify(mMockSurfaceControlViewHost).setView(same(mMockView), any()); } @Test @@ -396,6 +396,10 @@ public class WindowDecorationTests extends ShellTestCase { final SurfaceControl.Builder decorContainerSurfaceBuilder = createMockSurfaceControlBuilder(decorContainerSurface); mMockSurfaceControlBuilders.add(decorContainerSurfaceBuilder); + final SurfaceControl captionContainerSurface = mock(SurfaceControl.class); + final SurfaceControl.Builder captionContainerSurfaceBuilder = + createMockSurfaceControlBuilder(captionContainerSurface); + mMockSurfaceControlBuilders.add(captionContainerSurfaceBuilder); final SurfaceControl.Transaction t = mock(SurfaceControl.Transaction.class); mMockSurfaceControlTransactions.add(t); @@ -432,7 +436,8 @@ public class WindowDecorationTests extends ShellTestCase { windowDecor.mDecorWindowContext.getResources(), mRelayoutParams.mCaptionHeightId); verify(mMockSurfaceControlAddWindowT).setWindowCrop(additionalWindowSurface, width, height); verify(mMockSurfaceControlAddWindowT).show(additionalWindowSurface); - verify(mMockSurfaceControlViewHostFactory).create(any(), eq(defaultDisplay), any()); + verify(mMockSurfaceControlViewHostFactory, Mockito.times(2)) + .create(any(), eq(defaultDisplay), any()); } @Test @@ -445,6 +450,10 @@ public class WindowDecorationTests extends ShellTestCase { final SurfaceControl.Builder decorContainerSurfaceBuilder = createMockSurfaceControlBuilder(decorContainerSurface); mMockSurfaceControlBuilders.add(decorContainerSurfaceBuilder); + final SurfaceControl captionContainerSurface = mock(SurfaceControl.class); + final SurfaceControl.Builder captionContainerSurfaceBuilder = + createMockSurfaceControlBuilder(captionContainerSurface); + mMockSurfaceControlBuilders.add(captionContainerSurfaceBuilder); final SurfaceControl.Transaction t = mock(SurfaceControl.Transaction.class); mMockSurfaceControlTransactions.add(t); @@ -464,8 +473,8 @@ public class WindowDecorationTests extends ShellTestCase { windowDecor.relayout(taskInfo); - final SurfaceControl captionContainerSurface = mMockWindowDecorViewHost.getSurfaceControl(); - verify(mMockSurfaceControlStartT).reparent(captionContainerSurface, decorContainerSurface); + verify(captionContainerSurfaceBuilder).setParent(decorContainerSurface); + verify(captionContainerSurfaceBuilder).setContainerLayer(); // Width of the captionContainerSurface should match the width of TASK_BOUNDS verify(mMockSurfaceControlStartT).setWindowCrop(captionContainerSurface, 300, 64); verify(mMockSurfaceControlStartT).show(captionContainerSurface); @@ -481,6 +490,10 @@ public class WindowDecorationTests extends ShellTestCase { final SurfaceControl.Builder decorContainerSurfaceBuilder = createMockSurfaceControlBuilder(decorContainerSurface); mMockSurfaceControlBuilders.add(decorContainerSurfaceBuilder); + final SurfaceControl captionContainerSurface = mock(SurfaceControl.class); + final SurfaceControl.Builder captionContainerSurfaceBuilder = + createMockSurfaceControlBuilder(captionContainerSurface); + mMockSurfaceControlBuilders.add(captionContainerSurfaceBuilder); final SurfaceControl.Transaction t = mock(SurfaceControl.Transaction.class); mMockSurfaceControlTransactions.add(t); @@ -498,11 +511,9 @@ public class WindowDecorationTests extends ShellTestCase { taskInfo.configuration.densityDpi = DisplayMetrics.DENSITY_DEFAULT * 2; final TestWindowDecoration windowDecor = createWindowDecoration(taskInfo); - mRelayoutParams.mApplyStartTransactionOnDraw = true; - windowDecor.relayout(taskInfo); + windowDecor.relayout(taskInfo, true /* applyStartTransactionOnDraw */); - verify(mMockWindowDecorViewHost).updateView(any(), any(), any(), - eq(mMockSurfaceControlStartT)); + verify(mMockRootSurfaceControl).applyTransactionOnDraw(mMockSurfaceControlStartT); } @Test @@ -856,52 +867,37 @@ public class WindowDecorationTests extends ShellTestCase { } @Test - public void relayout_applyTransactionOnDrawIsTrue_updatesViewWithDrawTransaction() { + public void updateViewHost_applyTransactionOnDrawIsTrue_surfaceControlIsUpdated() { final TestWindowDecoration windowDecor = createWindowDecoration( - new TestRunningTaskInfoBuilder() - .setVisible(true) - .setWindowingMode(WINDOWING_MODE_FREEFORM) - .build()); + new TestRunningTaskInfoBuilder().build()); mRelayoutParams.mApplyStartTransactionOnDraw = true; mRelayoutResult.mRootView = mMockView; - windowDecor.relayout(windowDecor.mTaskInfo); + windowDecor.updateViewHost(mRelayoutParams, mMockSurfaceControlStartT, mRelayoutResult); - verify(mMockWindowDecorViewHost) - .updateView(eq(mRelayoutResult.mRootView), any(), - eq(windowDecor.mTaskInfo.configuration), eq(mMockSurfaceControlStartT)); + verify(mMockRootSurfaceControl).applyTransactionOnDraw(mMockSurfaceControlStartT); } @Test - public void relayout_applyTransactionOnDrawIsTrue_asyncViewHostRendering_throwsException() { + public void updateViewHost_nullDrawTransaction_applyTransactionOnDrawIsTrue_throwsException() { final TestWindowDecoration windowDecor = createWindowDecoration( - new TestRunningTaskInfoBuilder() - .setVisible(true) - .setWindowingMode(WINDOWING_MODE_FULLSCREEN) - .build()); + new TestRunningTaskInfoBuilder().build()); mRelayoutParams.mApplyStartTransactionOnDraw = true; - mRelayoutParams.mAsyncViewHost = true; mRelayoutResult.mRootView = mMockView; assertThrows(IllegalArgumentException.class, - () -> windowDecor.relayout(windowDecor.mTaskInfo)); + () -> windowDecor.updateViewHost( + mRelayoutParams, null /* onDrawTransaction */, mRelayoutResult)); } @Test - public void relayout_asyncViewHostRendering() { + public void updateViewHost_nullDrawTransaction_applyTransactionOnDrawIsFalse_doesNotThrow() { final TestWindowDecoration windowDecor = createWindowDecoration( - new TestRunningTaskInfoBuilder() - .setVisible(true) - .setWindowingMode(WINDOWING_MODE_FULLSCREEN) - .build()); - mRelayoutParams.mAsyncViewHost = true; + new TestRunningTaskInfoBuilder().build()); + mRelayoutParams.mApplyStartTransactionOnDraw = false; mRelayoutResult.mRootView = mMockView; - windowDecor.relayout(windowDecor.mTaskInfo); - - verify(mMockWindowDecorViewHost) - .updateViewAsync(eq(mRelayoutResult.mRootView), any(), - eq(windowDecor.mTaskInfo.configuration)); + windowDecor.updateViewHost(mRelayoutParams, null /* onDrawTransaction */, mRelayoutResult); } @Test @@ -1001,8 +997,7 @@ public class WindowDecorationTests extends ShellTestCase { new MockObjectSupplier<>(mMockSurfaceControlTransactions, () -> mock(SurfaceControl.Transaction.class)), () -> mMockWindowContainerTransaction, () -> mMockTaskSurface, - mMockSurfaceControlViewHostFactory, - mMockWindowDecorViewHostSupplier); + mMockSurfaceControlViewHostFactory); } private class MockObjectSupplier<T> implements Supplier<T> { @@ -1042,20 +1037,16 @@ public class WindowDecorationTests extends ShellTestCase { Supplier<SurfaceControl.Transaction> surfaceControlTransactionSupplier, Supplier<WindowContainerTransaction> windowContainerTransactionSupplier, Supplier<SurfaceControl> surfaceControlSupplier, - SurfaceControlViewHostFactory surfaceControlViewHostFactory, - @NonNull WindowDecorViewHostSupplier windowDecorViewHostSupplier) { + SurfaceControlViewHostFactory surfaceControlViewHostFactory) { super(context, userContext, displayController, taskOrganizer, taskInfo, taskSurface, surfaceControlBuilderSupplier, surfaceControlTransactionSupplier, windowContainerTransactionSupplier, surfaceControlSupplier, - surfaceControlViewHostFactory, windowDecorViewHostSupplier); + surfaceControlViewHostFactory); } @Override void relayout(ActivityManager.RunningTaskInfo taskInfo) { - mRelayoutParams.mRunningTaskInfo = taskInfo; - mRelayoutParams.mLayoutResId = R.layout.caption_layout; - relayout(mRelayoutParams, mMockSurfaceControlStartT, mMockSurfaceControlFinishT, - mMockWindowContainerTransaction, mMockView, mRelayoutResult); + relayout(taskInfo, false /* applyStartTransactionOnDraw */); } @Override @@ -1076,6 +1067,15 @@ public class WindowDecorationTests extends ShellTestCase { return super.inflateLayout(context, layoutResId); } + void relayout(ActivityManager.RunningTaskInfo taskInfo, + boolean applyStartTransactionOnDraw) { + mRelayoutParams.mRunningTaskInfo = taskInfo; + mRelayoutParams.mApplyStartTransactionOnDraw = applyStartTransactionOnDraw; + mRelayoutParams.mLayoutResId = R.layout.caption_layout; + relayout(mRelayoutParams, mMockSurfaceControlStartT, mMockSurfaceControlFinishT, + mMockWindowContainerTransaction, mMockView, mRelayoutResult); + } + private AdditionalViewContainer addTestViewContainer() { final Resources resources = mDecorWindowContext.getResources(); final int width = loadDimensionPixelSize(resources, mCaptionMenuWidthId); diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/viewhost/DefaultWindowDecorViewHostTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/viewhost/DefaultWindowDecorViewHostTest.kt deleted file mode 100644 index 1b2ce9e4df36..000000000000 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/viewhost/DefaultWindowDecorViewHostTest.kt +++ /dev/null @@ -1,222 +0,0 @@ -/* - * 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.windowdecor.viewhost - -import android.testing.AndroidTestingRunner -import android.testing.TestableLooper -import android.view.SurfaceControl -import android.view.SurfaceControlViewHost -import android.view.View -import android.view.WindowManager -import androidx.test.filters.SmallTest -import com.android.wm.shell.ShellTestCase -import com.google.common.truth.Truth.assertThat -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.test.advanceUntilIdle -import kotlinx.coroutines.test.runTest -import org.junit.Assert.assertThrows -import org.junit.Test -import org.junit.runner.RunWith -import org.mockito.Mockito.mock -import org.mockito.kotlin.spy -import org.mockito.kotlin.verify - - -/** - * Tests for [DefaultWindowDecorViewHost]. - * - * Build/Install/Run: - * atest WMShellUnitTests:DefaultWindowDecorViewHostTest - */ -@SmallTest -@TestableLooper.RunWithLooper -@RunWith(AndroidTestingRunner::class) -class DefaultWindowDecorViewHostTest : ShellTestCase() { - - @Test - fun updateView_layoutInViewHost() = runTest { - val windowDecorViewHost = createDefaultViewHost() - val view = View(context) - - windowDecorViewHost.updateView( - view = view, - attrs = WindowManager.LayoutParams(100, 100), - configuration = context.resources.configuration, - onDrawTransaction = null - ) - - assertThat(windowDecorViewHost.viewHost).isNotNull() - assertThat(windowDecorViewHost.viewHost!!.view).isEqualTo(view) - } - - @Test - fun updateView_alreadyLaidOut_relayouts() = runTest { - val windowDecorViewHost = createDefaultViewHost() - val view = View(context) - windowDecorViewHost.updateView( - view = view, - attrs = WindowManager.LayoutParams(100, 100), - configuration = context.resources.configuration, - onDrawTransaction = null - ) - - val otherParams = WindowManager.LayoutParams(200, 200) - windowDecorViewHost.updateView( - view = view, - attrs = otherParams, - configuration = context.resources.configuration, - onDrawTransaction = null - ) - - assertThat(windowDecorViewHost.viewHost!!.view).isEqualTo(view) - assertThat(windowDecorViewHost.viewHost!!.view!!.layoutParams.width) - .isEqualTo(otherParams.width) - } - - @Test - fun updateView_replacingView_throws() = runTest { - val windowDecorViewHost = createDefaultViewHost() - val view = View(context) - windowDecorViewHost.updateView( - view = view, - attrs = WindowManager.LayoutParams(100, 100), - configuration = context.resources.configuration, - onDrawTransaction = null - ) - - val otherView = View(context) - assertThrows(Exception::class.java) { - windowDecorViewHost.updateView( - view = otherView, - attrs = WindowManager.LayoutParams(100, 100), - configuration = context.resources.configuration, - onDrawTransaction = null - ) - } - } - - @OptIn(ExperimentalCoroutinesApi::class) - @Test - fun updateView_clearsPendingAsyncJob() = runTest { - val windowDecorViewHost = createDefaultViewHost() - val asyncView = View(context) - val syncView = View(context) - val asyncAttrs = WindowManager.LayoutParams(100, 100) - val syncAttrs = WindowManager.LayoutParams(200, 200) - - windowDecorViewHost.updateViewAsync( - view = asyncView, - attrs = asyncAttrs, - configuration = context.resources.configuration, - ) - - // No view host yet, since the coroutine hasn't run. - assertThat(windowDecorViewHost.viewHost).isNull() - - windowDecorViewHost.updateView( - view = syncView, - attrs = syncAttrs, - configuration = context.resources.configuration, - onDrawTransaction = null - ) - - // Would run coroutine if it hadn't been cancelled. - advanceUntilIdle() - - assertThat(windowDecorViewHost.viewHost).isNotNull() - assertThat(windowDecorViewHost.viewHost!!.view).isNotNull() - // View host view/attrs should match the ones from the sync call, plus, since the - // sync/async were made with different views, if the job hadn't been cancelled there - // would've been an exception thrown as replacing views isn't allowed. - assertThat(windowDecorViewHost.viewHost!!.view).isEqualTo(syncView) - assertThat(windowDecorViewHost.viewHost!!.view!!.layoutParams.width) - .isEqualTo(syncAttrs.width) - } - - @OptIn(ExperimentalCoroutinesApi::class) - @Test - fun updateViewAsync() = runTest { - val windowDecorViewHost = createDefaultViewHost() - val view = View(context) - val attrs = WindowManager.LayoutParams(100, 100) - - windowDecorViewHost.updateViewAsync( - view = view, - attrs = attrs, - configuration = context.resources.configuration, - ) - - assertThat(windowDecorViewHost.viewHost).isNull() - - advanceUntilIdle() - - assertThat(windowDecorViewHost.viewHost).isNotNull() - } - - @OptIn(ExperimentalCoroutinesApi::class) - @Test - fun updateViewAsync_clearsPendingAsyncJob() = runTest { - val windowDecorViewHost = createDefaultViewHost() - - val view = View(context) - windowDecorViewHost.updateViewAsync( - view = view, - attrs = WindowManager.LayoutParams(100, 100), - configuration = context.resources.configuration, - ) - val otherView = View(context) - windowDecorViewHost.updateViewAsync( - view = otherView, - attrs = WindowManager.LayoutParams(100, 100), - configuration = context.resources.configuration, - ) - - advanceUntilIdle() - - assertThat(windowDecorViewHost.viewHost).isNotNull() - assertThat(windowDecorViewHost.viewHost!!.view).isNotNull() - assertThat(windowDecorViewHost.viewHost!!.view).isEqualTo(otherView) - } - - @Test - fun release() = runTest { - val windowDecorViewHost = createDefaultViewHost() - - val view = View(context) - windowDecorViewHost.updateView( - view = view, - attrs = WindowManager.LayoutParams(100, 100), - configuration = context.resources.configuration, - onDrawTransaction = null - ) - - val t = mock(SurfaceControl.Transaction::class.java) - windowDecorViewHost.release(t) - - verify(windowDecorViewHost.viewHost!!).release() - verify(t).remove(windowDecorViewHost.surfaceControl) - } - - private fun CoroutineScope.createDefaultViewHost() = DefaultWindowDecorViewHost( - context = context, - mainScope = this, - display = context.display, - surfaceControlViewHostFactory = { c, d, wwm, s -> - spy(SurfaceControlViewHost(c, d, wwm, s)) - } - ) -}
\ No newline at end of file |