Merge "Don't recreate taskbar in Overview" into main
diff --git a/aconfig/launcher.aconfig b/aconfig/launcher.aconfig
index 1856b39..bc49146 100644
--- a/aconfig/launcher.aconfig
+++ b/aconfig/launcher.aconfig
@@ -501,10 +501,13 @@
}
flag {
- name: "enforce_system_radius_for_app_widgets"
+ name: "use_system_radius_for_app_widgets"
namespace: "launcher"
- description: "Enforce system radius for widget corners instead of a separate 16.dp value"
- bug: "370950552"
+ description: "Use system radius for enforced widget corners instead of a separate 16.dp value"
+ bug: "373351337"
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
}
flag {
@@ -533,4 +536,11 @@
namespace: "launcher"
description: "Add options to pin/unpin to taskbar to app context menus."
bug: "375648361"
+}
+
+flag {
+ name: "enable_launcher_icon_shapes"
+ namespace: "launcher"
+ description: "Enable launcher icon shape customizations"
+ bug: "348708061"
}
\ No newline at end of file
diff --git a/aconfig/launcher_overview.aconfig b/aconfig/launcher_overview.aconfig
index 93d8d54..b299edf 100644
--- a/aconfig/launcher_overview.aconfig
+++ b/aconfig/launcher_overview.aconfig
@@ -61,4 +61,14 @@
namespace: "launcher_overview"
description: "Enables the non-overlapping layout for desktop windows in Overview mode."
bug: "378011776"
+}
+
+flag {
+ name: "enable_use_top_visible_activity_for_exclude_from_recent_task"
+ namespace: "launcher_overview"
+ description: "Enables using the top visible activity for exclude from recent task instead of the activity indicies."
+ bug: "342627272"
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
}
\ No newline at end of file
diff --git a/protos/launcher_atom.proto b/protos/launcher_atom.proto
index 823c821..ce99348 100644
--- a/protos/launcher_atom.proto
+++ b/protos/launcher_atom.proto
@@ -33,6 +33,7 @@
FolderIcon folder_icon = 9;
Slice slice = 10;
SearchActionItem search_action_item = 11;
+ TaskView task_view = 15;
}
// When used for launch event, stores the global predictive rank
optional int32 rank = 5;
@@ -262,6 +263,21 @@
optional int32 index = 3;
}
+// TaskView in RecentsView.
+message TaskView {
+ // TaskViewType.
+ optional int32 type = 1;
+
+ // Index of TaskView in RecentsView.
+ optional int32 index = 2;
+
+ // ComponentName of the Task.
+ optional string component_name = 3;
+
+ // Number of tasks in the TaskView.
+ optional int32 cardinality = 4;
+}
+
// Represents folder in a closed state.
message FolderIcon {
// Number of items inside folder.
diff --git a/quickstep/AndroidManifest-launcher.xml b/quickstep/AndroidManifest-launcher.xml
index c6e2d8c..80d8154 100644
--- a/quickstep/AndroidManifest-launcher.xml
+++ b/quickstep/AndroidManifest-launcher.xml
@@ -48,7 +48,7 @@
android:stateNotNeeded="true"
android:windowSoftInputMode="adjustPan"
android:screenOrientation="unspecified"
- android:configChanges="keyboard|keyboardHidden|mcc|mnc|navigation|orientation|screenSize|screenLayout|smallestScreenSize"
+ android:configChanges="keyboard|keyboardHidden|mcc|mnc|navigation|orientation|screenSize|screenLayout|smallestScreenSize|uiMode"
android:resizeableActivity="true"
android:resumeWhilePausing="true"
android:taskAffinity=""
diff --git a/quickstep/res/color/all_set_bg_primary.xml b/quickstep/res/color/all_set_bg_primary.xml
index 013de7a..ce4fb47 100644
--- a/quickstep/res/color/all_set_bg_primary.xml
+++ b/quickstep/res/color/all_set_bg_primary.xml
@@ -15,5 +15,5 @@
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
- <item android:color="?attr/materialColorPrimaryContainer"/>
+ <item android:color="@color/materialColorPrimaryContainer"/>
</selector>
diff --git a/quickstep/res/color/all_set_bg_tertiary.xml b/quickstep/res/color/all_set_bg_tertiary.xml
index b58d61c..de4bab1 100644
--- a/quickstep/res/color/all_set_bg_tertiary.xml
+++ b/quickstep/res/color/all_set_bg_tertiary.xml
@@ -15,5 +15,5 @@
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
- <item android:color="?attr/materialColorTertiary"/>
+ <item android:color="@color/materialColorTertiary"/>
</selector>
diff --git a/quickstep/res/color/bubblebar_drop_target_bg_color.xml b/quickstep/res/color/bubblebar_drop_target_bg_color.xml
index bae8c4e..a91465f 100644
--- a/quickstep/res/color/bubblebar_drop_target_bg_color.xml
+++ b/quickstep/res/color/bubblebar_drop_target_bg_color.xml
@@ -15,5 +15,5 @@
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
- <item android:alpha="0.35" android:color="?attr/materialColorPrimaryContainer" />
+ <item android:alpha="0.35" android:color="@color/materialColorPrimaryContainer" />
</selector>
\ No newline at end of file
diff --git a/quickstep/res/color/menu_item_hover_state_color.xml b/quickstep/res/color/menu_item_hover_state_color.xml
index 3c68789..eb35769 100644
--- a/quickstep/res/color/menu_item_hover_state_color.xml
+++ b/quickstep/res/color/menu_item_hover_state_color.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
- <item android:state_hovered="false" android:color="?attr/materialColorSurfaceBright" />
- <item android:state_hovered="true" android:color="?attr/materialColorSurfaceVariant" />
+ <item android:state_hovered="false" android:color="@color/materialColorSurfaceBright" />
+ <item android:state_hovered="true" android:color="@color/materialColorSurfaceVariant" />
</selector>
\ No newline at end of file
diff --git a/quickstep/res/color/taskbar_minimized_app_indicator_color.xml b/quickstep/res/color/taskbar_minimized_app_indicator_color.xml
index 1596fe1..2703787 100644
--- a/quickstep/res/color/taskbar_minimized_app_indicator_color.xml
+++ b/quickstep/res/color/taskbar_minimized_app_indicator_color.xml
@@ -15,5 +15,5 @@
~ limitations under the License.
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:color="?attr/materialColorOutline"/>
+ <item android:color="@color/materialColorOutline"/>
</selector>
diff --git a/quickstep/res/color/taskbar_running_app_indicator_color.xml b/quickstep/res/color/taskbar_running_app_indicator_color.xml
index 5dc9781..7f2d12d 100644
--- a/quickstep/res/color/taskbar_running_app_indicator_color.xml
+++ b/quickstep/res/color/taskbar_running_app_indicator_color.xml
@@ -15,5 +15,5 @@
~ limitations under the License.
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:color="?attr/materialColorTertiary"/>
+ <item android:color="@color/materialColorTertiary"/>
</selector>
diff --git a/quickstep/res/drawable/bg_bubble_bar_drop_target.xml b/quickstep/res/drawable/bg_bubble_bar_drop_target.xml
index f597cb5..bf86a7f 100644
--- a/quickstep/res/drawable/bg_bubble_bar_drop_target.xml
+++ b/quickstep/res/drawable/bg_bubble_bar_drop_target.xml
@@ -20,5 +20,5 @@
<solid android:color="@color/bubblebar_drop_target_bg_color" />
<stroke
android:width="1dp"
- android:color="?attr/materialColorPrimaryContainer" />
+ android:color="@color/materialColorPrimaryContainer" />
</shape>
diff --git a/quickstep/res/drawable/bg_bubble_expanded_view_drop_target.xml b/quickstep/res/drawable/bg_bubble_expanded_view_drop_target.xml
index 169e396..8fb5587 100644
--- a/quickstep/res/drawable/bg_bubble_expanded_view_drop_target.xml
+++ b/quickstep/res/drawable/bg_bubble_expanded_view_drop_target.xml
@@ -22,6 +22,6 @@
<solid android:color="@color/bubblebar_drop_target_bg_color" />
<stroke
android:width="1dp"
- android:color="?attr/materialColorPrimaryContainer" />
+ android:color="@color/materialColorPrimaryContainer" />
</shape>
</inset>
diff --git a/quickstep/res/drawable/bg_floating_desktop_select.xml b/quickstep/res/drawable/bg_floating_desktop_select.xml
index 6481be4..a707aab 100644
--- a/quickstep/res/drawable/bg_floating_desktop_select.xml
+++ b/quickstep/res/drawable/bg_floating_desktop_select.xml
@@ -19,5 +19,5 @@
android:shape="rectangle">
<corners android:radius="@dimen/rounded_button_radius" />
- <solid android:color="?attr/materialColorPrimaryContainer" />
+ <solid android:color="@color/materialColorPrimaryContainer" />
</shape>
\ No newline at end of file
diff --git a/quickstep/res/drawable/bg_overview_clear_all_button.xml b/quickstep/res/drawable/bg_overview_clear_all_button.xml
index 0d12274..7f58cf8 100644
--- a/quickstep/res/drawable/bg_overview_clear_all_button.xml
+++ b/quickstep/res/drawable/bg_overview_clear_all_button.xml
@@ -21,7 +21,7 @@
<shape android:shape="rectangle"
android:tint="?colorButtonNormal">
<corners android:radius="@dimen/recents_clear_all_outline_radius" />
- <solid android:color="?attr/materialColorSurfaceBright"/>
+ <solid android:color="@color/materialColorSurfaceBright"/>
</shape>
</item>
</ripple>
\ No newline at end of file
diff --git a/quickstep/res/drawable/bg_taskbar_edu_tooltip.xml b/quickstep/res/drawable/bg_taskbar_edu_tooltip.xml
index 9e9bb2b..e2fe4c0 100644
--- a/quickstep/res/drawable/bg_taskbar_edu_tooltip.xml
+++ b/quickstep/res/drawable/bg_taskbar_edu_tooltip.xml
@@ -18,5 +18,5 @@
android:shape="rectangle">
<corners android:radius="@dimen/dialogCornerRadius" />
- <solid android:color="?attr/materialColorSurfaceBright"/>
+ <solid android:color="@color/materialColorSurfaceBright"/>
</shape>
\ No newline at end of file
diff --git a/quickstep/res/drawable/bg_wellbeing_toast.xml b/quickstep/res/drawable/bg_wellbeing_toast.xml
index 418caae..bb45bb3 100644
--- a/quickstep/res/drawable/bg_wellbeing_toast.xml
+++ b/quickstep/res/drawable/bg_wellbeing_toast.xml
@@ -16,6 +16,6 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:androidprv="http://schemas.android.com/apk/prv/res/android"
android:shape="rectangle">
- <solid android:color="?attr/materialColorSecondaryFixed" />
+ <solid android:color="@color/materialColorSecondaryFixed" />
<corners android:radius="?android:attr/dialogCornerRadius" />
</shape>
\ No newline at end of file
diff --git a/quickstep/res/drawable/ic_chevron_down.xml b/quickstep/res/drawable/ic_chevron_down.xml
index b586e50..15f7fc8 100644
--- a/quickstep/res/drawable/ic_chevron_down.xml
+++ b/quickstep/res/drawable/ic_chevron_down.xml
@@ -19,7 +19,7 @@
android:width="48dp"
android:height="48dp"
android:autoMirrored="true"
- android:tint="?attr/materialColorOnSurface"
+ android:tint="@color/materialColorOnSurface"
android:viewportHeight="48"
android:viewportWidth="48">
<group
diff --git a/quickstep/res/drawable/rotate_tutorial_warning.xml b/quickstep/res/drawable/rotate_tutorial_warning.xml
index 90b7d64..2d0c8d2 100644
--- a/quickstep/res/drawable/rotate_tutorial_warning.xml
+++ b/quickstep/res/drawable/rotate_tutorial_warning.xml
@@ -21,6 +21,6 @@
android:viewportHeight="960"
android:viewportWidth="960">
<path
- android:fillColor="?attr/materialColorOnSurface"
+ android:fillColor="@color/materialColorOnSurface"
android:pathData="M40,840L480,80L920,840L40,840ZM178,760L782,760L480,240L178,760ZM480,720Q497,720 508.5,708.5Q520,697 520,680Q520,663 508.5,651.5Q497,640 480,640Q463,640 451.5,651.5Q440,663 440,680Q440,697 451.5,708.5Q463,720 480,720ZM440,600L520,600L520,400L440,400L440,600ZM480,500L480,500L480,500L480,500Z" />
</vector>
diff --git a/quickstep/res/layout-land/keyboard_quick_switch_taskview.xml b/quickstep/res/layout-land/keyboard_quick_switch_taskview.xml
index d1e5667..b44510d 100644
--- a/quickstep/res/layout-land/keyboard_quick_switch_taskview.xml
+++ b/quickstep/res/layout-land/keyboard_quick_switch_taskview.xml
@@ -23,7 +23,7 @@
android:importantForAccessibility="yes"
android:background="@drawable/keyboard_quick_switch_task_view_background"
android:clipToOutline="true"
- launcher:focusBorderColor="?attr/materialColorOutline">
+ launcher:focusBorderColor="@color/materialColorOutline">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/content"
diff --git a/quickstep/res/layout-land/keyboard_quick_switch_taskview_square.xml b/quickstep/res/layout-land/keyboard_quick_switch_taskview_square.xml
index 0eccd8e..56b1adf 100644
--- a/quickstep/res/layout-land/keyboard_quick_switch_taskview_square.xml
+++ b/quickstep/res/layout-land/keyboard_quick_switch_taskview_square.xml
@@ -23,7 +23,7 @@
android:importantForAccessibility="yes"
android:background="@drawable/keyboard_quick_switch_task_view_background"
android:clipToOutline="true"
- launcher:focusBorderColor="?androidprv:attr/materialColorOutline">
+ launcher:focusBorderColor="@androidprv:color/materialColorOutline">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/content"
diff --git a/quickstep/res/layout-sw600dp-land/gesture_tutorial_step_menu.xml b/quickstep/res/layout-sw600dp-land/gesture_tutorial_step_menu.xml
index 40d2322..0767aa5 100644
--- a/quickstep/res/layout-sw600dp-land/gesture_tutorial_step_menu.xml
+++ b/quickstep/res/layout-sw600dp-land/gesture_tutorial_step_menu.xml
@@ -20,7 +20,7 @@
android:theme="@style/GestureTutorialActivity"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:background="?attr/materialColorSurfaceContainer"
+ android:background="@color/materialColorSurfaceContainer"
android:fitsSystemWindows="true">
<androidx.constraintlayout.widget.ConstraintLayout
@@ -163,7 +163,7 @@
android:layout_marginVertical="16dp"
android:text="@string/gesture_tutorial_action_button_label"
android:background="@drawable/gesture_tutorial_action_button_background"
- android:backgroundTint="?attr/materialColorPrimary"
+ android:backgroundTint="@color/materialColorPrimary"
android:stateListAnimator="@null"
app:layout_constraintTop_toBottomOf="@id/guideline"
diff --git a/quickstep/res/layout/digital_wellbeing_toast.xml b/quickstep/res/layout/digital_wellbeing_toast.xml
index 0551c12..25676ac 100644
--- a/quickstep/res/layout/digital_wellbeing_toast.xml
+++ b/quickstep/res/layout/digital_wellbeing_toast.xml
@@ -24,7 +24,7 @@
android:forceHasOverlappingRendering="false"
android:gravity="center"
android:importantForAccessibility="noHideDescendants"
- android:textColor="?attr/materialColorOnSecondaryFixed"
+ android:textColor="@color/materialColorOnSecondaryFixed"
android:textSize="14sp"
android:autoSizeTextType="uniform"
android:autoSizeMaxTextSize="14sp"
diff --git a/quickstep/res/layout/gesture_tutorial_step_menu.xml b/quickstep/res/layout/gesture_tutorial_step_menu.xml
index 7feb882..b4493c2 100644
--- a/quickstep/res/layout/gesture_tutorial_step_menu.xml
+++ b/quickstep/res/layout/gesture_tutorial_step_menu.xml
@@ -20,7 +20,7 @@
android:theme="@style/GestureTutorialActivity"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:background="?attr/materialColorSurfaceContainer"
+ android:background="@color/materialColorSurfaceContainer"
android:fitsSystemWindows="true">
<androidx.constraintlayout.widget.ConstraintLayout
@@ -161,7 +161,7 @@
android:layout_marginVertical="16dp"
android:text="@string/gesture_tutorial_action_button_label"
android:background="@drawable/gesture_tutorial_action_button_background"
- android:backgroundTint="?attr/materialColorPrimary"
+ android:backgroundTint="@color/materialColorPrimary"
android:stateListAnimator="@null"
app:layout_constraintTop_toBottomOf="@id/guideline"
diff --git a/quickstep/res/layout/icon_app_chip_view.xml b/quickstep/res/layout/icon_app_chip_view.xml
index 36ece2a..00b5392 100644
--- a/quickstep/res/layout/icon_app_chip_view.xml
+++ b/quickstep/res/layout/icon_app_chip_view.xml
@@ -26,7 +26,7 @@
android:importantForAccessibility="no"
android:autoMirrored="true"
android:elevation="@dimen/task_thumbnail_icon_menu_elevation"
- android:background="?attr/materialColorSurfaceBright">
+ android:background="@color/materialColorSurfaceBright">
<!-- ignoring warning because the user of the anchor is a Rect where RTL is not needed -->
<!-- This anchor's bounds is in the expected location after rotations and translations are
diff --git a/quickstep/res/layout/keyboard_quick_switch_desktop_taskview.xml b/quickstep/res/layout/keyboard_quick_switch_desktop_taskview.xml
index c3f9e54..71c782d 100644
--- a/quickstep/res/layout/keyboard_quick_switch_desktop_taskview.xml
+++ b/quickstep/res/layout/keyboard_quick_switch_desktop_taskview.xml
@@ -22,7 +22,7 @@
android:layout_height="wrap_content"
android:clipToOutline="true"
android:importantForAccessibility="yes"
- launcher:focusBorderColor="?androidprv:attr/materialColorOutline"
+ launcher:focusBorderColor="@androidprv:color/materialColorOutline"
launcher:focusBorderRadius="@dimen/keyboard_quick_switch_text_button_radius">
<androidx.constraintlayout.widget.ConstraintLayout
@@ -30,7 +30,7 @@
android:layout_width="@dimen/keyboard_quick_switch_text_button_width"
android:layout_height="@dimen/keyboard_quick_switch_taskview_height"
android:background="@drawable/keyboard_quick_switch_text_button_background"
- android:backgroundTint="?androidprv:attr/materialColorSurfaceContainer"
+ android:backgroundTint="@androidprv:color/materialColorSurfaceContainer"
android:paddingHorizontal="@dimen/keyboard_quick_switch_text_button_horizontal_padding"
app:layout_constraintTop_toTopOf="parent"
@@ -43,7 +43,7 @@
android:layout_width="@dimen/keyboard_quick_switch_desktop_icon_size"
android:layout_height="@dimen/keyboard_quick_switch_desktop_icon_size"
android:layout_marginBottom="4dp"
- android:tint="?androidprv:attr/materialColorOnSurface"
+ android:tint="@androidprv:color/materialColorOnSurface"
android:src="@drawable/ic_desktop"
app:layout_constraintVertical_chainStyle="packed"
diff --git a/quickstep/res/layout/keyboard_quick_switch_overview_taskview.xml b/quickstep/res/layout/keyboard_quick_switch_overview_taskview.xml
index 0b44a2a..5a3ee83 100644
--- a/quickstep/res/layout/keyboard_quick_switch_overview_taskview.xml
+++ b/quickstep/res/layout/keyboard_quick_switch_overview_taskview.xml
@@ -22,7 +22,7 @@
android:layout_height="wrap_content"
android:clipToOutline="true"
android:importantForAccessibility="yes"
- launcher:focusBorderColor="?androidprv:attr/materialColorOutline"
+ launcher:focusBorderColor="@androidprv:color/materialColorOutline"
launcher:focusBorderRadius="@dimen/keyboard_quick_switch_text_button_radius">
<androidx.constraintlayout.widget.ConstraintLayout
@@ -30,7 +30,7 @@
android:layout_width="@dimen/keyboard_quick_switch_text_button_width"
android:layout_height="@dimen/keyboard_quick_switch_taskview_height"
android:background="@drawable/keyboard_quick_switch_text_button_background"
- android:backgroundTint="?androidprv:attr/materialColorSurfaceBright"
+ android:backgroundTint="@androidprv:color/materialColorSurfaceBright"
android:paddingHorizontal="@dimen/keyboard_quick_switch_text_button_horizontal_padding"
app:layout_constraintTop_toTopOf="parent"
diff --git a/quickstep/res/layout/keyboard_quick_switch_taskview.xml b/quickstep/res/layout/keyboard_quick_switch_taskview.xml
index 41eb623..37bb027 100644
--- a/quickstep/res/layout/keyboard_quick_switch_taskview.xml
+++ b/quickstep/res/layout/keyboard_quick_switch_taskview.xml
@@ -23,7 +23,7 @@
android:importantForAccessibility="yes"
android:background="@drawable/keyboard_quick_switch_task_view_background"
android:clipToOutline="true"
- launcher:focusBorderColor="?attr/materialColorOutline">
+ launcher:focusBorderColor="@color/materialColorOutline">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/content"
diff --git a/quickstep/res/layout/keyboard_quick_switch_taskview_square.xml b/quickstep/res/layout/keyboard_quick_switch_taskview_square.xml
index 1474949..33d8c16 100644
--- a/quickstep/res/layout/keyboard_quick_switch_taskview_square.xml
+++ b/quickstep/res/layout/keyboard_quick_switch_taskview_square.xml
@@ -23,7 +23,7 @@
android:importantForAccessibility="yes"
android:background="@drawable/keyboard_quick_switch_task_view_background"
android:clipToOutline="true"
- launcher:focusBorderColor="?androidprv:attr/materialColorOutline">
+ launcher:focusBorderColor="@androidprv:color/materialColorOutline">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/content"
diff --git a/quickstep/res/layout/keyboard_quick_switch_view.xml b/quickstep/res/layout/keyboard_quick_switch_view.xml
index 4118500..345b97c 100644
--- a/quickstep/res/layout/keyboard_quick_switch_view.xml
+++ b/quickstep/res/layout/keyboard_quick_switch_view.xml
@@ -44,7 +44,7 @@
android:layout_height="@dimen/keyboard_quick_switch_no_recent_items_icon_size"
android:layout_marginBottom="@dimen/keyboard_quick_switch_no_recent_items_icon_margin"
android:src="@drawable/view_carousel"
- android:tint="?attr/materialColorOnSurface"
+ android:tint="@color/materialColorOnSurface"
android:importantForAccessibility="no"
app:layout_constraintVertical_chainStyle="packed"
diff --git a/quickstep/res/layout/overview_add_desktop_button.xml b/quickstep/res/layout/overview_add_desktop_button.xml
new file mode 100644
index 0000000..2333dd1
--- /dev/null
+++ b/quickstep/res/layout/overview_add_desktop_button.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2024 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<com.android.quickstep.views.AddDesktopButton
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:launcher="http://schemas.android.com/apgk/res-auto"
+ android:id="@+id/add_desktop_button"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:src="@drawable/ic_desktop_add"
+ android:padding="10dp" />
\ No newline at end of file
diff --git a/quickstep/res/layout/overview_clear_all_button.xml b/quickstep/res/layout/overview_clear_all_button.xml
index 40f38f4..18a6240 100644
--- a/quickstep/res/layout/overview_clear_all_button.xml
+++ b/quickstep/res/layout/overview_clear_all_button.xml
@@ -23,6 +23,6 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/recents_clear_all"
- android:textColor="?attr/materialColorOnSurface"
- launcher:focusBorderColor="?attr/materialColorOutline"
+ android:textColor="@color/materialColorOnSurface"
+ launcher:focusBorderColor="@color/materialColorOutline"
android:textSize="14sp" />
\ No newline at end of file
diff --git a/quickstep/res/layout/task.xml b/quickstep/res/layout/task.xml
index 760bcdb..a7f6b36 100644
--- a/quickstep/res/layout/task.xml
+++ b/quickstep/res/layout/task.xml
@@ -25,8 +25,8 @@
android:clipChildren="false"
android:defaultFocusHighlightEnabled="false"
android:focusable="true"
- launcher:focusBorderColor="?attr/materialColorOutline"
- launcher:hoverBorderColor="?attr/materialColorPrimary">
+ launcher:focusBorderColor="@color/materialColorOutline"
+ launcher:hoverBorderColor="@color/materialColorPrimary">
<include layout="@layout/task_thumbnail_deprecated" />
diff --git a/quickstep/res/layout/task_desktop.xml b/quickstep/res/layout/task_desktop.xml
index 0472007..fb515be 100644
--- a/quickstep/res/layout/task_desktop.xml
+++ b/quickstep/res/layout/task_desktop.xml
@@ -22,12 +22,8 @@
android:contentDescription="@string/recent_task_desktop"
android:defaultFocusHighlightEnabled="false"
android:focusable="true"
- launcher:focusBorderColor="?attr/materialColorOutline"
- launcher:hoverBorderColor="?attr/materialColorPrimary">
- <View
- android:id="@+id/background"
- android:layout_width="match_parent"
- android:layout_height="match_parent" />
+ launcher:focusBorderColor="@color/materialColorOutline"
+ launcher:hoverBorderColor="@color/materialColorPrimary">
<ViewStub
android:id="@+id/icon"
@@ -38,6 +34,13 @@
<com.android.quickstep.views.DesktopTaskContentView
android:id="@+id/desktop_content"
android:layout_width="match_parent"
- android:layout_height="match_parent" />
+ android:layout_height="match_parent">
+
+ <View
+ android:id="@+id/background"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+
+ </com.android.quickstep.views.DesktopTaskContentView>
</com.android.quickstep.views.DesktopTaskView>
diff --git a/quickstep/res/layout/task_grouped.xml b/quickstep/res/layout/task_grouped.xml
index c36a45e..4c650b9 100644
--- a/quickstep/res/layout/task_grouped.xml
+++ b/quickstep/res/layout/task_grouped.xml
@@ -30,8 +30,8 @@
android:clipChildren="false"
android:defaultFocusHighlightEnabled="false"
android:focusable="true"
- launcher:focusBorderColor="?attr/materialColorOutline"
- launcher:hoverBorderColor="?attr/materialColorPrimary">
+ launcher:focusBorderColor="@color/materialColorOutline"
+ launcher:hoverBorderColor="@color/materialColorPrimary">
<include layout="@layout/task_thumbnail_deprecated"/>
diff --git a/quickstep/res/layout/task_view_menu_option.xml b/quickstep/res/layout/task_view_menu_option.xml
index 5218de0..91051f0 100644
--- a/quickstep/res/layout/task_view_menu_option.xml
+++ b/quickstep/res/layout/task_view_menu_option.xml
@@ -31,7 +31,7 @@
android:layout_height="@dimen/system_shortcut_icon_size"
android:layout_marginStart="@dimen/task_menu_option_start_margin"
android:layout_gravity="center_horizontal"
- android:backgroundTint="?attr/materialColorOnSurface"/>
+ android:backgroundTint="@color/materialColorOnSurface"/>
<TextView
style="@style/BaseIcon"
@@ -40,7 +40,7 @@
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/task_menu_option_text_start_margin"
android:textSize="14sp"
- android:textColor="?attr/materialColorOnSurface"
+ android:textColor="@color/materialColorOnSurface"
android:focusable="false"
android:gravity="start"
android:ellipsize="end" />
diff --git a/quickstep/res/values-af/strings.xml b/quickstep/res/values-af/strings.xml
index eac8043..22125d7 100644
--- a/quickstep/res/values-af/strings.xml
+++ b/quickstep/res/values-af/strings.xml
@@ -105,7 +105,7 @@
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"Verlaat verdeeldeskermkeuse"</string>
<string name="toast_split_app_unsupported" msgid="2360229567007828914">"Kies nog ’n app as jy verdeelde skerm wil gebruik"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"Jou organisasie laat nie hierdie program toe nie"</string>
- <string name="split_widgets_not_supported" msgid="1355743038053053866">"Legstukke word nie tans ondersteun nie; kies asseblief ’n ander program"</string>
+ <string name="split_widgets_not_supported" msgid="1355743038053053866">"Legstukke word nie tans ondersteun nie; kies asseblief ’n ander app"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"Slaan navigasietutoriaal oor?"</string>
<string name="skip_tutorial_dialog_subtitle" msgid="544063326241955662">"Jy kan dit later in die <xliff:g id="NAME">%1$s</xliff:g>-program kry"</string>
<string name="gesture_tutorial_action_button_label_cancel" msgid="3809842569351264108">"Kanselleer"</string>
diff --git a/quickstep/res/values-fr-rCA/strings.xml b/quickstep/res/values-fr-rCA/strings.xml
index 746bf50..a5ae3df 100644
--- a/quickstep/res/values-fr-rCA/strings.xml
+++ b/quickstep/res/values-fr-rCA/strings.xml
@@ -97,7 +97,7 @@
<string name="allset_navigation_settings" msgid="4713404605961476027"><annotation id="link">"Paramètres de navigation du système"</annotation></string>
<string name="action_share" msgid="2648470652637092375">"Partager"</string>
<string name="action_screenshot" msgid="8171125848358142917">"Capture d\'écran"</string>
- <string name="action_split" msgid="2098009717623550676">"Partager"</string>
+ <string name="action_split" msgid="2098009717623550676">"Diviser"</string>
<string name="action_save_app_pair" msgid="5974823919237645229">"Enr. paire d\'applis"</string>
<string name="toast_split_select_app" msgid="8464310533320556058">"Toucher une autre appli pour partager l\'écran"</string>
<string name="toast_contextual_split_select_app" msgid="433510957123687090">"Choisir une autre appli pour utiliser l\'Écran divisé"</string>
diff --git a/quickstep/res/values-hr/strings.xml b/quickstep/res/values-hr/strings.xml
index c350bc5..441a80c 100644
--- a/quickstep/res/values-hr/strings.xml
+++ b/quickstep/res/values-hr/strings.xml
@@ -52,8 +52,8 @@
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Prijeđite prstom od krajnjeg desnog ili krajnjeg lijevog ruba"</string>
<string name="back_gesture_feedback_cancelled" msgid="762621530959111290">"Pazite da prijeđete prstom od desnog ili lijevog ruba do sredine zaslona i podignite prst"</string>
<string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Naučili ste kako prijeći prstom zdesna da biste se vratili. Sad saznajte kako promijeniti aplikaciju."</string>
- <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"Izvršili ste pokret za povratak. Sad saznajte kako promijeniti aplikaciju."</string>
- <string name="back_gesture_feedback_complete_without_follow_up" msgid="197189945858268342">"Izvršili ste pokret za povratak"</string>
+ <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"Napravili ste pokret za povratak. Sad saznajte kako promijeniti aplikaciju."</string>
+ <string name="back_gesture_feedback_complete_without_follow_up" msgid="197189945858268342">"Napravili ste pokret za povratak"</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="9157480023651452969">"Pazite da ne prijeđete prstom preblizu dnu zaslona"</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"Osjetljivost pokreta povratka promijenite u postavkama"</string>
<string name="back_gesture_intro_title" msgid="19551256430224428">"Prijeđite prstom da biste se vratili"</string>
@@ -64,8 +64,8 @@
<string name="home_gesture_feedback_swipe_too_far_from_edge" msgid="4816365433160895458">"Pazite da prijeđete prstom prema gore od donjeg ruba zaslona"</string>
<string name="home_gesture_feedback_overview_detected" msgid="5177627157303895077">"Pazite da ne zastanete prije podizanja prsta"</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="8328465201424027148">"Pazite da prijeđete prstom ravno prema gore"</string>
- <string name="home_gesture_feedback_complete_with_follow_up" msgid="8766981412895888417">"Izvršili ste pokret za otvaranje početnog zaslona. Sad saznajte kako se vratiti."</string>
- <string name="home_gesture_feedback_complete_without_follow_up" msgid="2978063221383413443">"Izvršili ste pokret za otvaranje početnog zaslona"</string>
+ <string name="home_gesture_feedback_complete_with_follow_up" msgid="8766981412895888417">"Napravili ste pokret za otvaranje početnog zaslona. Sad saznajte kako se vratiti."</string>
+ <string name="home_gesture_feedback_complete_without_follow_up" msgid="2978063221383413443">"Napravili ste pokret za otvaranje početnog zaslona"</string>
<string name="home_gesture_intro_title" msgid="836590312858441830">"Prijeđite prstom da biste otvorili početni zaslon"</string>
<string name="home_gesture_intro_subtitle" msgid="2632238748497975326">"Prijeđite prstom od dna zaslona prema gore. Tim pokretom uvijek će se otvoriti početni zaslon."</string>
<string name="home_gesture_spoken_intro_subtitle" msgid="1030987707382031750">"Prijeđite s dva prsta od dna zaslona prema gore. Tim pokretom uvijek će se otvoriti početni zaslon."</string>
@@ -76,7 +76,7 @@
<string name="overview_gesture_feedback_home_detected" msgid="663432226180397138">"Pokušajte zadržati prozor dulje prije podizanja prsta"</string>
<string name="overview_gesture_feedback_wrong_swipe_direction" msgid="1191055451018584958">"Prijeđite prstom ravno prema gore, a zatim zastanite"</string>
<string name="overview_gesture_feedback_complete_with_follow_up" msgid="3544611727467765026">"Naučili ste koristiti pokrete. Pokrete možete isključiti u postavkama."</string>
- <string name="overview_gesture_feedback_complete_without_follow_up" msgid="2903050864432331629">"Izvršili ste pokret za promjenu aplikacije"</string>
+ <string name="overview_gesture_feedback_complete_without_follow_up" msgid="2903050864432331629">"Napravili ste pokret za promjenu aplikacije"</string>
<string name="overview_gesture_intro_title" msgid="2902054412868489378">"Povlačenje prstom za promjenu aplikacije"</string>
<string name="overview_gesture_intro_subtitle" msgid="4968091015637850859">"Da biste promijenili aplikaciju, prijeđite prstom od dna zaslona prema gore, zadržite pritisak pa pustite."</string>
<string name="overview_gesture_spoken_intro_subtitle" msgid="3853371838260201751">"Za promjenu aplikacije prijeđite s dva prsta od dna zaslona prema gore, zadržite pritisak i pustite."</string>
diff --git a/quickstep/res/values-in/strings.xml b/quickstep/res/values-in/strings.xml
index e1400a9..4039f36 100644
--- a/quickstep/res/values-in/strings.xml
+++ b/quickstep/res/values-in/strings.xml
@@ -53,7 +53,7 @@
<string name="back_gesture_feedback_cancelled" msgid="762621530959111290">"Pastikan Anda menggeser dari tepi kanan atau kiri ke tengah layar, lalu lepaskan"</string>
<string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Anda telah belajar cara geser dari kanan untuk kembali. Berikutnya, pelajari cara beralih aplikasi."</string>
<string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"Anda telah menyelesaikan gestur kembali. Selanjutnya, pelajari cara beralih aplikasi."</string>
- <string name="back_gesture_feedback_complete_without_follow_up" msgid="197189945858268342">"Anda telah menyelesaikan gestur kembali"</string>
+ <string name="back_gesture_feedback_complete_without_follow_up" msgid="197189945858268342">"Anda telah menyelesaikan gestur untuk kembali"</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="9157480023651452969">"Pastikan Anda tidak menggeser terlalu dekat ke bagian bawah layar"</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"Untuk mengubah sensitivitas gestur kembali, buka Setelan"</string>
<string name="back_gesture_intro_title" msgid="19551256430224428">"Geser untuk kembali"</string>
@@ -71,7 +71,7 @@
<string name="home_gesture_spoken_intro_subtitle" msgid="1030987707382031750">"Geser ke atas dengan 2 jari dari bawah layar. Gestur ini akan selalu membawa Anda ke Layar utama."</string>
<string name="home_gesture_tutorial_title" msgid="3126834347496917376">"Buka layar utama"</string>
<string name="home_gesture_tutorial_subtitle" msgid="7245995490408668778">"Geser ke atas dari bagian bawah layar"</string>
- <string name="home_gesture_tutorial_success" msgid="1736295017642244751">"Bagus."</string>
+ <string name="home_gesture_tutorial_success" msgid="1736295017642244751">"Bagus!"</string>
<string name="overview_gesture_feedback_swipe_too_far_from_edge" msgid="6402349235265407385">"Pastikan Anda menggeser ke atas dari tepi bawah layar"</string>
<string name="overview_gesture_feedback_home_detected" msgid="663432226180397138">"Coba tahan jendela lebih lama sebelum melepaskan"</string>
<string name="overview_gesture_feedback_wrong_swipe_direction" msgid="1191055451018584958">"Pastikan Anda menggeser lurus ke atas, lalu berhenti sejenak"</string>
@@ -82,12 +82,12 @@
<string name="overview_gesture_spoken_intro_subtitle" msgid="3853371838260201751">"Untuk beralih antar-aplikasi, geser ke atas dengan 2 jari dari bawah layar, tahan, lalu lepaskan."</string>
<string name="overview_gesture_tutorial_title" msgid="4125835002668708720">"Beralih aplikasi"</string>
<string name="overview_gesture_tutorial_subtitle" msgid="5253549754058973071">"Geser ke atas dari bagian bawah layar, tahan, kemudian lepas"</string>
- <string name="overview_gesture_tutorial_success" msgid="1910267697807973076">"Bagus."</string>
+ <string name="overview_gesture_tutorial_success" msgid="1910267697807973076">"Oke!"</string>
<string name="gesture_tutorial_confirm_title" msgid="6201516182040074092">"Semua siap"</string>
<string name="gesture_tutorial_action_button_label" msgid="6249846312991332122">"Selesai"</string>
<string name="gesture_tutorial_action_button_label_settings" msgid="2923621047916486604">"Setelan"</string>
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Coba lagi"</string>
- <string name="gesture_tutorial_nice" msgid="2936275692616928280">"Bagus!"</string>
+ <string name="gesture_tutorial_nice" msgid="2936275692616928280">"Sip!"</string>
<string name="gesture_tutorial_step" msgid="1279786122817620968">"Tutorial <xliff:g id="CURRENT">%1$d</xliff:g>/<xliff:g id="TOTAL">%2$d</xliff:g>"</string>
<string name="allset_title" msgid="5021126669778966707">"Selesai!"</string>
<string name="allset_hint" msgid="459504134589971527">"Geser ke atas untuk membuka Layar utama"</string>
diff --git a/quickstep/res/values-is/strings.xml b/quickstep/res/values-is/strings.xml
index bf2a211..bddca4d 100644
--- a/quickstep/res/values-is/strings.xml
+++ b/quickstep/res/values-is/strings.xml
@@ -52,8 +52,8 @@
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Passaðu að strjúka frá jaðri hægri eða vinstri brúnar"</string>
<string name="back_gesture_feedback_cancelled" msgid="762621530959111290">"Passaðu að strjúka frá jaðri hægri eða vinstri brúnar að miðju skjásins og sleppa síðan"</string>
<string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Þú lærðir að strjúka frá hægri til að bakka. Næst skaltu læra hvernig þú skiptir á milli forrita."</string>
- <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"Þú laukst við að kynna þér bendinguna „til baka“. Næst skaltu læra hvernig þú skiptir á milli forrita."</string>
- <string name="back_gesture_feedback_complete_without_follow_up" msgid="197189945858268342">"Þú laukst við að kynna þér bendinguna „til baka“"</string>
+ <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"Þú laukst við að kynna þér bendinguna „Til baka“. Næst skaltu læra hvernig þú skiptir á milli forrita."</string>
+ <string name="back_gesture_feedback_complete_without_follow_up" msgid="197189945858268342">"Þú laukst við að kynna þér bendinguna „Til baka“"</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="9157480023651452969">"Passaðu að strjúka ekki of nálægt neðri brún skjásins"</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"Til að breyta næmi til baka-bendingar ferðu í stillingar"</string>
<string name="back_gesture_intro_title" msgid="19551256430224428">"Strjúktu til að fara til baka"</string>
diff --git a/quickstep/res/values-ja/strings.xml b/quickstep/res/values-ja/strings.xml
index b30b000..a25b2bf 100644
--- a/quickstep/res/values-ja/strings.xml
+++ b/quickstep/res/values-ja/strings.xml
@@ -53,7 +53,7 @@
<string name="back_gesture_feedback_cancelled" msgid="762621530959111290">"画面の右端または左端から中央に向かってスワイプし、指を離してください"</string>
<string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"右側からスワイプして前の画面に戻る方法を学習しました。次は、アプリを切り替える方法を覚えましょう。"</string>
<string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"「戻る」操作を完了しました。次は、アプリを切り替える方法を覚えましょう。"</string>
- <string name="back_gesture_feedback_complete_without_follow_up" msgid="197189945858268342">"「戻る」操作を学習しました"</string>
+ <string name="back_gesture_feedback_complete_without_follow_up" msgid="197189945858268342">"「戻る」ジェスチャーを学習しました"</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="9157480023651452969">"スワイプする際は画面の下部に近づきすぎないようにしましょう"</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"「戻る」操作の感度を変更するには [設定] に移動します"</string>
<string name="back_gesture_intro_title" msgid="19551256430224428">"スワイプで戻る"</string>
@@ -65,7 +65,7 @@
<string name="home_gesture_feedback_overview_detected" msgid="5177627157303895077">"指を離す前にいったん止めないでください"</string>
<string name="home_gesture_feedback_wrong_swipe_direction" msgid="8328465201424027148">"まっすぐ上にスワイプしてください"</string>
<string name="home_gesture_feedback_complete_with_follow_up" msgid="8766981412895888417">"「ホームに移動」操作を学習しました。次は、前の画面に戻る方法を覚えましょう。"</string>
- <string name="home_gesture_feedback_complete_without_follow_up" msgid="2978063221383413443">"「ホームに移動」操作を学習しました"</string>
+ <string name="home_gesture_feedback_complete_without_follow_up" msgid="2978063221383413443">"「ホームに移動」ジェスチャーを学習しました"</string>
<string name="home_gesture_intro_title" msgid="836590312858441830">"スワイプでホームに戻る"</string>
<string name="home_gesture_intro_subtitle" msgid="2632238748497975326">"画面を下から上にスワイプします。この操作でいつでもホーム画面に戻れます。"</string>
<string name="home_gesture_spoken_intro_subtitle" msgid="1030987707382031750">"2 本の指で画面下部から上にスワイプします。この操作で常にホーム画面に戻ります。"</string>
diff --git a/quickstep/res/values-kn/strings.xml b/quickstep/res/values-kn/strings.xml
index afd53ac..5fc27d2 100644
--- a/quickstep/res/values-kn/strings.xml
+++ b/quickstep/res/values-kn/strings.xml
@@ -53,7 +53,7 @@
<string name="back_gesture_feedback_cancelled" msgid="762621530959111290">"ನೀವು ಬಲ ಅಥವಾ ಎಡ ಅಂಚಿನಿಂದ ಸ್ಕ್ರೀನ್ನ ಮಧ್ಯಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡುತ್ತಿದ್ದೀರಿ ಎಂದು ಖಚಿತಪಡಿಸಿಕೊಂಡು ಬಿಟ್ಟುಬಿಡಿ"</string>
<string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"ಹಿಂದೆ ಹೋಗಲು ಬಲದಿಂದ ಸ್ವೈಪ್ ಮಾಡುವುದು ಹೇಗೆಂದು ಕಲಿತಿರಿ. ಮುಂದೆ, ಆ್ಯಪ್ಗಳನ್ನು ಬದಲಿಸುವುದು ಹೇಗೆಂದು ತಿಳಿಯಿರಿ."</string>
<string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"ನೀವು ಗೋ ಬ್ಯಾಕ್ ಗೆಸ್ಚರ್ ಅನ್ನು ಪೂರ್ಣಗೊಳಿಸಿದ್ದೀರಿ. ಮುಂದೆ, ಆ್ಯಪ್ಗಳನ್ನು ಬದಲಾಯಿಸುವುದು ಹೇಗೆ ಎಂದು ತಿಳಿಯಿರಿ."</string>
- <string name="back_gesture_feedback_complete_without_follow_up" msgid="197189945858268342">"ನೀವು ಗೋ ಬ್ಯಾಕ್ ಗೆಸ್ಚರ್ ಅನ್ನು ಪೂರ್ಣಗೊಳಿಸಿದ್ದೀರಿ"</string>
+ <string name="back_gesture_feedback_complete_without_follow_up" msgid="197189945858268342">"ನೀವು ಹಿಂದಕ್ಕೆ ಹೋಗಿ ಎಂಬ ಜೆಸ್ಚರ್ ಅನ್ನು ಪೂರ್ಣಗೊಳಿಸಿದ್ದೀರಿ"</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="9157480023651452969">"ನೀವು ಸ್ಕ್ರೀನ್ನ ಕೆಳಭಾಗಕ್ಕೆ ಹೆಚ್ಚು ಹತ್ತಿರ ಸ್ವೈಪ್ ಮಾಡದಂತೆ ನೋಡಿಕೊಳ್ಳಿ"</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"ಬ್ಯಾಕ್ ಗೆಸ್ಚರ್ನ ಸೂಕ್ಷ್ಮತೆ ಬದಲಾಯಿಸಲು, ಸೆಟ್ಟಿಂಗ್ಗಳಿಗೆ ಹೋಗಿ"</string>
<string name="back_gesture_intro_title" msgid="19551256430224428">"ಹಿಂದಕ್ಕೆ ಹೋಗಲು ಸ್ವೈಪ್ ಮಾಡಿ"</string>
@@ -103,7 +103,7 @@
<string name="toast_contextual_split_select_app" msgid="433510957123687090">"ಸ್ಪ್ಲಿಟ್ ಸ್ಕ್ರೀನ್ ಬಳಸಲು ಇನ್ನೊಂದು ಆ್ಯಪ್ ಆಯ್ಕೆಮಾಡಿ"</string>
<string name="toast_split_select_app_cancel" msgid="1939025102486630426">"ರದ್ದುಮಾಡಿ"</string>
<string name="toast_split_select_cont_desc" msgid="2119685056059607602">"ಸ್ಪ್ಲಿಟ್ ಸ್ಕ್ರೀನ್ ಆಯ್ಕೆಯಿಂದ ನಿರ್ಗಮಿಸಿ"</string>
- <string name="toast_split_app_unsupported" msgid="2360229567007828914">"\"ಪರದೆ ಬೇರ್ಪಡಿಸಿ\" ಬಳಸಲು ಬೇರೆ ಆ್ಯಪ್ ಅನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string>
+ <string name="toast_split_app_unsupported" msgid="2360229567007828914">"\"ಸ್ಕ್ರೀನ್ ಬೇರ್ಪಡಿಸಿ\" ಬಳಸಲು ಬೇರೆ ಆ್ಯಪ್ ಅನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string>
<string name="blocked_by_policy" msgid="2071401072261365546">"ಆ್ಯಪ್ ಅಥವಾ ನಿಮ್ಮ ಸಂಸ್ಥೆಯು ಈ ಕ್ರಿಯೆಯನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ"</string>
<string name="split_widgets_not_supported" msgid="1355743038053053866">"ವಿಜೆಟ್ಗಳು ಪ್ರಸ್ತುತ ಬೆಂಬಲಿತವಾಗಿಲ್ಲ, ಮತ್ತೊಂದು ಆ್ಯಪ್ ಅನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string>
<string name="skip_tutorial_dialog_title" msgid="2725643161260038458">"ನ್ಯಾವಿಗೇಶನ್ ಟ್ಯುಟೋರಿಯಲ್ ಸ್ಕಿಪ್ ಮಾಡಬೇಕೇ?"</string>
diff --git a/quickstep/res/values-night/colors.xml b/quickstep/res/values-night/colors.xml
index a1e9c70..7cb85bc 100644
--- a/quickstep/res/values-night/colors.xml
+++ b/quickstep/res/values-night/colors.xml
@@ -25,5 +25,5 @@
<color name="all_set_page_background">@android:color/system_neutral1_900</color>
<!-- Turn on work apps button -->
- <color name="work_turn_on_stroke">?attr/materialColorPrimary</color>
+ <color name="work_turn_on_stroke">@color/materialColorPrimary</color>
</resources>
\ No newline at end of file
diff --git a/quickstep/res/values-night/styles.xml b/quickstep/res/values-night/styles.xml
index eb88310..0a5e0af 100644
--- a/quickstep/res/values-night/styles.xml
+++ b/quickstep/res/values-night/styles.xml
@@ -73,16 +73,16 @@
<style name="GestureTutorialActivity" parent="@style/AppTheme">
<item name="background">@android:color/transparent</item>
<item name="tutorialSubtitle">@android:color/white</item>
- <item name="surfaceContainer">?attr/materialColorSurfaceContainer</item>
- <item name="onSurfaceHome">?attr/materialColorPrimaryFixedDim</item>
- <item name="surfaceHome">?attr/materialColorOnPrimaryFixedVariant</item>
- <item name="secondaryHome">?attr/materialColorOnPrimaryFixed</item>
- <item name="onSurfaceBack">?attr/materialColorTertiaryFixedDim</item>
- <item name="surfaceBack">?attr/materialColorOnTertiaryFixedVariant</item>
- <item name="secondaryBack">?attr/materialColorOnTertiaryFixed</item>
- <item name="onSurfaceOverview">?attr/materialColorPrimaryFixed</item>
- <item name="surfaceOverview">?attr/materialColorOnSecondaryFixedVariant</item>
- <item name="secondaryOverview">?attr/materialColorOnSecondaryFixed</item>
+ <item name="surfaceContainer">@color/materialColorSurfaceContainer</item>
+ <item name="onSurfaceHome">@color/materialColorPrimaryFixedDim</item>
+ <item name="surfaceHome">@color/materialColorOnPrimaryFixedVariant</item>
+ <item name="secondaryHome">@color/materialColorOnPrimaryFixed</item>
+ <item name="onSurfaceBack">@color/materialColorTertiaryFixedDim</item>
+ <item name="surfaceBack">@color/materialColorOnTertiaryFixedVariant</item>
+ <item name="secondaryBack">@color/materialColorOnTertiaryFixed</item>
+ <item name="onSurfaceOverview">@color/materialColorPrimaryFixed</item>
+ <item name="surfaceOverview">@color/materialColorOnSecondaryFixedVariant</item>
+ <item name="secondaryOverview">@color/materialColorOnSecondaryFixed</item>
</style>
</resources>
\ No newline at end of file
diff --git a/quickstep/res/values-sw/strings.xml b/quickstep/res/values-sw/strings.xml
index 821797b..d872287 100644
--- a/quickstep/res/values-sw/strings.xml
+++ b/quickstep/res/values-sw/strings.xml
@@ -52,8 +52,8 @@
<string name="back_gesture_feedback_swipe_too_far_from_edge" msgid="4175100312909721217">"Hakikisha unatelezesha kidole kutoka ukingo wa kulia au kushoto kabisa"</string>
<string name="back_gesture_feedback_cancelled" msgid="762621530959111290">"Hakikisha unatelezesha kidole kutoka ukingo wa kulia au kushoto hadi katikati ya skrini na uachilie"</string>
<string name="back_gesture_feedback_complete_with_overview_follow_up" msgid="9176400654037014471">"Umejifunza jinsi ya kutelezesha kidole kuanzia kulia ili kurudi nyuma. Sasa jifunze jinsi ya kubadilisha programu."</string>
- <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"Umekamilisha ishara ya kurudi nyuma. Hatua inayofuata, jifunze jinsi ya kubadilisha programu."</string>
- <string name="back_gesture_feedback_complete_without_follow_up" msgid="197189945858268342">"Umeweka ishara ya kurudi nyuma"</string>
+ <string name="back_gesture_feedback_complete_with_follow_up" msgid="8653374779579748392">"Umekamilisha mafunzo ya miguso ya kurudi nyuma. Hatua inayofuata, fahamu jinsi ya kubadilisha programu."</string>
+ <string name="back_gesture_feedback_complete_without_follow_up" msgid="197189945858268342">"Umekamilisha mafunzo ya miguso ya kurudi nyuma"</string>
<string name="back_gesture_feedback_swipe_in_nav_bar" msgid="9157480023651452969">"Hakikisha hutelezeshi kidole karibu sana na sehemu ya chini ya skrini"</string>
<string name="back_gesture_tutorial_confirm_subtitle" msgid="5181305411668713250">"Kubadilisha hisi ya ishara ya nyuma, nenda kwenye Mipangilio"</string>
<string name="back_gesture_intro_title" msgid="19551256430224428">"Telezesha kidole ili urudi nyuma"</string>
diff --git a/quickstep/res/values-tr/strings.xml b/quickstep/res/values-tr/strings.xml
index c50c1f8..6a0b78f 100644
--- a/quickstep/res/values-tr/strings.xml
+++ b/quickstep/res/values-tr/strings.xml
@@ -89,7 +89,7 @@
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Tekrar deneyin"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"Güzel!"</string>
<string name="gesture_tutorial_step" msgid="1279786122817620968">"Eğitim <xliff:g id="CURRENT">%1$d</xliff:g>/<xliff:g id="TOTAL">%2$d</xliff:g>"</string>
- <string name="allset_title" msgid="5021126669778966707">"İşlem tamam!"</string>
+ <string name="allset_title" msgid="5021126669778966707">"Kurulum tamamlandı"</string>
<string name="allset_hint" msgid="459504134589971527">"Ana ekrana gitmek için yukarı kaydırın"</string>
<string name="allset_button_hint" msgid="2395219947744706291">"Ana ekranınıza gitmek için ana sayfa düğmesine dokunun"</string>
<string name="allset_description_generic" msgid="5385500062202019855">"<xliff:g id="DEVICE">%1$s</xliff:g> adlı cihazınızı kullanmaya hazırsınız"</string>
diff --git a/quickstep/res/values/colors.xml b/quickstep/res/values/colors.xml
index 668bce7..42c0478 100644
--- a/quickstep/res/values/colors.xml
+++ b/quickstep/res/values/colors.xml
@@ -13,7 +13,7 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<resources xmlns:androidprv="http://schemas.android.com/apk/prv/res/android">
+<resources>
<color name="chip_hint_foreground_color">#fff</color>
<color name="chip_scrim_start_color">#39000000</color>
@@ -93,5 +93,5 @@
<color name="lottie_yellow600">#f9ab00</color>
<!-- Turn on work apps button -->
- <color name="work_turn_on_stroke">?attr/materialColorPrimary</color>
+ <color name="work_turn_on_stroke">@color/materialColorPrimary</color>
</resources>
\ No newline at end of file
diff --git a/quickstep/res/values/config.xml b/quickstep/res/values/config.xml
index f3c9467..e8c8505 100644
--- a/quickstep/res/values/config.xml
+++ b/quickstep/res/values/config.xml
@@ -35,7 +35,6 @@
<string name="launcher_restore_event_logger_class" translatable="false">com.android.quickstep.LauncherRestoreEventLoggerImpl</string>
<string name="taskbar_edu_tooltip_controller_class" translatable="false">com.android.launcher3.taskbar.TaskbarEduTooltipController</string>
<string name="nav_handle_long_press_handler_class" translatable="false"></string>
- <string name="contextual_search_invoker_class" translatable="false"></string>
<string name="contextual_search_state_manager_class" translatable="false"></string>
<!-- The number of thumbnails and icons to keep in the cache. The thumbnail cache size also
diff --git a/quickstep/res/values/dimens.xml b/quickstep/res/values/dimens.xml
index 53f37ba..b221b22 100644
--- a/quickstep/res/values/dimens.xml
+++ b/quickstep/res/values/dimens.xml
@@ -362,11 +362,6 @@
<dimen name="taskbar_running_app_indicator_width">12dp</dimen>
<dimen name="taskbar_running_app_indicator_top_margin">4dp</dimen>
<dimen name="taskbar_minimized_app_indicator_width">6dp</dimen>
- <dimen name="taskbar_overflow_item_icon_size_default">22dp</dimen>
- <dimen name="taskbar_overflow_item_icon_size_scaled_down">15dp</dimen>
- <dimen name="taskbar_overflow_item_icon_stroke_width_default">2dp</dimen>
- <dimen name="taskbar_overflow_leave_behind_size_default">18dp</dimen>
- <dimen name="taskbar_overflow_leave_behind_size_scaled_down">15dp</dimen>
<!-- Transient taskbar -->
<dimen name="transient_taskbar_padding">12dp</dimen>
diff --git a/quickstep/res/values/styles.xml b/quickstep/res/values/styles.xml
index c423d09..5f2a63d 100644
--- a/quickstep/res/values/styles.xml
+++ b/quickstep/res/values/styles.xml
@@ -124,7 +124,7 @@
<style name="TextAppearance.GestureTutorial.ButtonLabel"
parent="TextAppearance.GestureTutorial.CallToAction">
<item name="android:gravity">center</item>
- <item name="android:textColor">?attr/materialColorOnPrimary</item>
+ <item name="android:textColor">@color/materialColorOnPrimary</item>
<item name="android:letterSpacing">0.02</item>
<item name="android:textSize">16sp</item>
<item name="android:textAllCaps">false</item>
@@ -211,6 +211,7 @@
<item name="android:enforceNavigationBarContrast">false</item>
<item name="android:windowLightStatusBar">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
+ <item name="android:windowShowWallpaper">false</item>
</style>
<!--
@@ -268,7 +269,7 @@
<style name="KeyboardQuickSwitchText">
<item name="fontFamily">google-sans-text</item>
<item name="android:textSize">14sp</item>
- <item name="android:textColor">?attr/materialColorOnSurface</item>
+ <item name="android:textColor">@color/materialColorOnSurface</item>
<item name="lineHeight">20sp</item>
</style>
@@ -277,7 +278,7 @@
</style>
<style name="KeyboardQuickSwitchText.OnBackground" parent="KeyboardQuickSwitchText">
- <item name="android:textColor">?attr/materialColorOnSurface</item>
+ <item name="android:textColor">@color/materialColorOnSurface</item>
</style>
<style name="KeyboardQuickSwitchText.OnTaskView" parent="KeyboardQuickSwitchText">
@@ -291,35 +292,35 @@
<style name="GestureTutorialActivity" parent="@style/AppTheme">
<item name="background">@android:color/transparent</item>
<item name="tutorialSubtitle">@android:color/black</item>
- <item name="surfaceContainer">?attr/materialColorSurfaceContainer</item>
- <item name="onSurfaceHome">?attr/materialColorPrimaryFixed</item>
+ <item name="surfaceContainer">@color/materialColorSurfaceContainer</item>
+ <item name="onSurfaceHome">@color/materialColorPrimaryFixed</item>
<item name="surfaceHome">@android:color/system_accent1_300</item>
- <item name="secondaryHome">?attr/materialColorOnPrimaryFixedVariant</item>
- <item name="onSurfaceBack">?attr/materialColorTertiaryFixed</item>
+ <item name="secondaryHome">@color/materialColorOnPrimaryFixedVariant</item>
+ <item name="onSurfaceBack">@color/materialColorTertiaryFixed</item>
<item name="surfaceBack">@android:color/system_accent3_300</item>
- <item name="secondaryBack">?attr/materialColorOnTertiaryFixedVariant</item>
- <item name="onSurfaceOverview">?attr/materialColorPrimaryFixed</item>
+ <item name="secondaryBack">@color/materialColorOnTertiaryFixedVariant</item>
+ <item name="onSurfaceOverview">@color/materialColorPrimaryFixed</item>
<item name="surfaceOverview">@android:color/system_accent2_300</item>
- <item name="secondaryOverview">?attr/materialColorOnSecondaryFixedVariant</item>
+ <item name="secondaryOverview">@color/materialColorOnSecondaryFixedVariant</item>
</style>
<style name="rotate_prompt_title" parent="TextAppearance.GestureTutorial.Dialog.Title">
- <item name="android:textColor">?attr/materialColorOnSurface</item>
+ <item name="android:textColor">@color/materialColorOnSurface</item>
</style>
<style name="rotate_prompt_subtitle" parent="TextAppearance.GestureTutorial.Dialog.Subtitle">
- <item name="android:textColor">?attr/materialColorOnSurfaceVariant</item>
+ <item name="android:textColor">@color/materialColorOnSurfaceVariant</item>
</style>
<style name="ArrowTipTaskbarStyle">
- <item name="arrowTipBackground">?attr/materialColorSurfaceContainer</item>
- <item name="arrowTipTextColor">?attr/materialColorOnSurface</item>
+ <item name="arrowTipBackground">@color/materialColorSurfaceContainer</item>
+ <item name="arrowTipTextColor">@color/materialColorOnSurface</item>
</style>
<style name="IconAppChipMenuTextStyle">
<item name="android:fontFamily">google-sans-text-medium</item>
<item name="android:textSize">@dimen/task_thumbnail_icon_menu_text_size</item>
- <item name="android:textColor">?attr/materialColorOnSurface</item>
+ <item name="android:textColor">@color/materialColorOnSurface</item>
<item name="android:letterSpacing">0.025</item>
<item name="android:lineHeight">20sp</item>
</style>
diff --git a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java
index e624be7..2759816 100644
--- a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java
+++ b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java
@@ -19,6 +19,7 @@
import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
+import static android.app.role.RoleManager.ROLE_HOME;
import static android.provider.Settings.Secure.LAUNCHER_TASKBAR_EDUCATION_SHOWING;
import static android.view.RemoteAnimationTarget.MODE_CLOSING;
import static android.view.RemoteAnimationTarget.MODE_OPENING;
@@ -74,6 +75,7 @@
import android.animation.ValueAnimator;
import android.app.ActivityOptions;
import android.app.WindowConfiguration;
+import android.app.role.RoleManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.res.Resources;
@@ -1194,7 +1196,9 @@
.registerRemoteTransition(mLauncherOpenTransition, homeCheck);
if (mBackAnimationController != null) {
mBackAnimationController.registerComponentCallbacks();
- mBackAnimationController.registerBackCallbacks(mHandler);
+ if (isHomeRoleHeld()) {
+ mBackAnimationController.registerBackCallbacks(mHandler);
+ }
}
}
@@ -1207,6 +1211,22 @@
.unregisterContentObserver(mAnimationRemovalObserver));
}
+ /**
+ * Called when the overview-target changes. Updates the back callback registration state.
+ */
+ public void onOverviewTargetChange() {
+ if (isHomeRoleHeld()) {
+ mBackAnimationController.registerBackCallbacks(mHandler);
+ } else {
+ mBackAnimationController.unregisterBackCallbacks();
+ }
+ }
+
+ private boolean isHomeRoleHeld() {
+ RoleManager roleManager = mLauncher.getSystemService(RoleManager.class);
+ return roleManager == null || roleManager.isRoleHeld(ROLE_HOME);
+ }
+
private void unregisterRemoteAnimations() {
if (SEPARATE_RECENTS_ACTIVITY.get()) {
return;
@@ -1547,7 +1567,8 @@
private boolean isFreeformAnimation(RemoteAnimationTarget[] appTargets) {
return DesktopModeStatus.canEnterDesktopMode(mLauncher.getApplicationContext())
- && DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_EXIT_TRANSITIONS.isTrue()
+ && (DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_EXIT_TRANSITIONS.isTrue()
+ || DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_EXIT_TRANSITIONS_BUGFIX.isTrue())
&& Arrays.stream(appTargets)
.anyMatch(app -> app.taskInfo != null && app.taskInfo.isFreeform());
}
diff --git a/quickstep/src/com/android/launcher3/appprediction/AppsDividerView.java b/quickstep/src/com/android/launcher3/appprediction/AppsDividerView.java
index 32fda48..e1e3eec 100644
--- a/quickstep/src/com/android/launcher3/appprediction/AppsDividerView.java
+++ b/quickstep/src/com/android/launcher3/appprediction/AppsDividerView.java
@@ -37,7 +37,6 @@
import com.android.launcher3.Utilities;
import com.android.launcher3.allapps.FloatingHeaderRow;
import com.android.launcher3.allapps.FloatingHeaderView;
-import com.android.launcher3.util.Themes;
/**
* A view which shows a horizontal divider
@@ -85,9 +84,9 @@
getResources().getDimensionPixelSize(R.dimen.all_apps_divider_height)
};
- mStrokeColor = Themes.getAttrColor(context, R.attr.materialColorOutlineVariant);
+ mStrokeColor = context.getColor(R.color.materialColorOutlineVariant);
- mAllAppsLabelTextColor = Themes.getAttrColor(context, R.attr.materialColorOnSurfaceVariant);
+ mAllAppsLabelTextColor = context.getColor(R.color.materialColorOnSurfaceVariant);
mAccessibilityManager = AccessibilityManager.getInstance(context);
setShowAllAppsLabel(!ALL_APPS_VISITED_COUNT.hasReachedMax(context));
diff --git a/quickstep/src/com/android/launcher3/desktop/DesktopAppLaunchTransitionManager.kt b/quickstep/src/com/android/launcher3/desktop/DesktopAppLaunchTransitionManager.kt
index e32bcd1..645bef6 100644
--- a/quickstep/src/com/android/launcher3/desktop/DesktopAppLaunchTransitionManager.kt
+++ b/quickstep/src/com/android/launcher3/desktop/DesktopAppLaunchTransitionManager.kt
@@ -67,7 +67,8 @@
private fun shouldRegisterTransitions(): Boolean =
DesktopModeStatus.canEnterDesktopMode(context) &&
- DesktopModeFlags.ENABLE_DESKTOP_APP_LAUNCH_TRANSITIONS.isTrue
+ (DesktopModeFlags.ENABLE_DESKTOP_APP_LAUNCH_TRANSITIONS.isTrue ||
+ DesktopModeFlags.ENABLE_DESKTOP_APP_LAUNCH_TRANSITIONS_BUGFIX.isTrue)
companion object {
private fun buildAppLaunchFilter(): TransitionFilter {
diff --git a/quickstep/src/com/android/launcher3/model/data/TaskViewItemInfo.kt b/quickstep/src/com/android/launcher3/model/data/TaskViewItemInfo.kt
new file mode 100644
index 0000000..ee28d7a
--- /dev/null
+++ b/quickstep/src/com/android/launcher3/model/data/TaskViewItemInfo.kt
@@ -0,0 +1,80 @@
+/*
+ * 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.launcher3.model.data
+
+import android.content.Context
+import android.content.Intent
+import androidx.annotation.VisibleForTesting
+import androidx.annotation.VisibleForTesting.Companion.PRIVATE
+import com.android.launcher3.Flags.privateSpaceRestrictAccessibilityDrag
+import com.android.launcher3.LauncherSettings
+import com.android.launcher3.logger.LauncherAtom
+import com.android.launcher3.pm.UserCache
+import com.android.quickstep.TaskUtils
+import com.android.quickstep.views.TaskContainer
+
+class TaskViewItemInfo(taskContainer: TaskContainer) : WorkspaceItemInfo() {
+ @VisibleForTesting(otherwise = PRIVATE) val taskViewAtom: LauncherAtom.TaskView
+
+ init {
+ itemType = LauncherSettings.Favorites.ITEM_TYPE_TASK
+ container = LauncherSettings.Favorites.CONTAINER_TASKSWITCHER
+ val componentKey = TaskUtils.getLaunchComponentKeyForTask(taskContainer.task.key)
+ user = componentKey.user
+ intent = Intent().setComponent(componentKey.componentName)
+ title = taskContainer.task.title
+ if (privateSpaceRestrictAccessibilityDrag()) {
+ if (
+ UserCache.getInstance(taskContainer.taskView.context)
+ .getUserInfo(componentKey.user)
+ .isPrivate
+ ) {
+ runtimeStatusFlags = runtimeStatusFlags or ItemInfoWithIcon.FLAG_NOT_PINNABLE
+ }
+ }
+
+ taskViewAtom =
+ createTaskViewAtom(
+ type = taskContainer.taskView.type.ordinal,
+ index =
+ taskContainer.taskView.recentsView?.indexOfChild(taskContainer.taskView) ?: -1,
+ componentName = componentKey.componentName.flattenToShortString(),
+ cardinality = taskContainer.taskView.taskContainers.size,
+ )
+ }
+
+ override fun buildProto(cInfo: CollectionInfo?, context: Context): LauncherAtom.ItemInfo =
+ super.buildProto(cInfo, context).toBuilder().setTaskView(taskViewAtom).build()
+
+ companion object {
+ @VisibleForTesting(otherwise = PRIVATE)
+ fun createTaskViewAtom(
+ type: Int,
+ index: Int,
+ componentName: String,
+ cardinality: Int,
+ ): LauncherAtom.TaskView =
+ LauncherAtom.TaskView.newBuilder()
+ .apply {
+ this.type = type
+ this.index = index
+ this.componentName = componentName
+ this.cardinality = cardinality
+ }
+ .build()
+ }
+}
diff --git a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchController.java b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchController.java
index 3b7ad3e..de42669 100644
--- a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchController.java
@@ -299,10 +299,6 @@
return;
}
mQuickSwitchViewController.closeQuickSwitchView(animate);
- if (mOnClosed != null) {
- mOnClosed.run();
- mOnClosed = null;
- }
}
/**
@@ -394,6 +390,13 @@
});
}
+ void onCloseStarted() {
+ if (mOnClosed != null) {
+ mOnClosed.run();
+ mOnClosed = null;
+ }
+ }
+
void onCloseComplete() {
if (Flags.taskbarOverflow() && mOverlayContext != null) {
mOverlayContext.getDragLayer()
diff --git a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchView.java b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchView.java
index 1967dfd..306443e 100644
--- a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchView.java
+++ b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchView.java
@@ -35,6 +35,8 @@
import android.view.animation.Interpolator;
import android.widget.HorizontalScrollView;
import android.widget.TextView;
+import android.window.OnBackInvokedDispatcher;
+import android.window.WindowOnBackInvokedDispatcher;
import androidx.annotation.LayoutRes;
import androidx.annotation.NonNull;
@@ -109,6 +111,8 @@
@Nullable private AnimatorSet mOpenAnimation;
+ private boolean mIsBackCallbackRegistered = false;
+
@Nullable private KeyboardQuickSwitchViewController.ViewCallbacks mViewCallbacks;
public KeyboardQuickSwitchView(@NonNull Context context) {
@@ -158,6 +162,34 @@
mIsRtl = Utilities.isRtl(resources);
}
+ private void registerOnBackInvokedCallback() {
+ OnBackInvokedDispatcher dispatcher = findOnBackInvokedDispatcher();
+
+ if (isOnBackInvokedCallbackEnabled(dispatcher)
+ && !mIsBackCallbackRegistered) {
+ dispatcher.registerOnBackInvokedCallback(
+ OnBackInvokedDispatcher.PRIORITY_OVERLAY, mViewCallbacks.onBackInvokedCallback);
+ mIsBackCallbackRegistered = true;
+ }
+ }
+
+ private void unregisterOnBackInvokedCallback() {
+ OnBackInvokedDispatcher dispatcher = findOnBackInvokedDispatcher();
+
+ if (isOnBackInvokedCallbackEnabled(dispatcher)
+ && mIsBackCallbackRegistered) {
+ dispatcher.unregisterOnBackInvokedCallback(
+ mViewCallbacks.onBackInvokedCallback);
+ mIsBackCallbackRegistered = false;
+ }
+ }
+
+ private boolean isOnBackInvokedCallbackEnabled(OnBackInvokedDispatcher dispatcher) {
+ return dispatcher instanceof WindowOnBackInvokedDispatcher
+ && ((WindowOnBackInvokedDispatcher) dispatcher).isOnBackInvokedCallbackEnabled()
+ && mViewCallbacks != null;
+ }
+
private KeyboardQuickSwitchTaskView createAndAddTaskView(
int index,
boolean isFinalView,
@@ -277,6 +309,7 @@
new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
+ registerOnBackInvokedCallback();
animateOpen(currentFocusIndexOverride);
getViewTreeObserver().removeOnGlobalLayoutListener(this);
@@ -293,6 +326,9 @@
}
void resetViewCallbacks() {
+ // Unregister the back invoked callback after the view is closed and before the
+ // mViewCallbacks is reset.
+ unregisterOnBackInvokedCallback();
mViewCallbacks = null;
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchViewController.java b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchViewController.java
index 985cc26..3114bc8 100644
--- a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchViewController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchViewController.java
@@ -25,6 +25,7 @@
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.animation.AnimationUtils;
+import android.window.OnBackInvokedCallback;
import android.window.RemoteTransition;
import androidx.annotation.NonNull;
@@ -198,6 +199,7 @@
// Let currently-running animation finish.
return;
}
+ mControllerCallbacks.onCloseStarted();
if (!animate) {
InteractionJankMonitorWrapper.begin(
mKeyboardQuickSwitchView, Cuj.CUJ_LAUNCHER_KEYBOARD_QUICK_SWITCH_CLOSE);
@@ -330,6 +332,7 @@
}
class ViewCallbacks {
+ public final OnBackInvokedCallback onBackInvokedCallback = () -> closeQuickSwitchView(true);
boolean onKeyUp(int keyCode, KeyEvent event, boolean isRTL, boolean allowTraversal) {
if (keyCode != KeyEvent.KEYCODE_TAB
diff --git a/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java
index cc3273e..7d75286 100644
--- a/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java
@@ -18,8 +18,8 @@
import static android.window.DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY;
import static com.android.launcher3.QuickstepTransitionManager.TASKBAR_TO_APP_DURATION;
-import static com.android.launcher3.QuickstepTransitionManager.getTaskbarToHomeDuration;
import static com.android.launcher3.QuickstepTransitionManager.TRANSIENT_TASKBAR_TRANSITION_DURATION;
+import static com.android.launcher3.QuickstepTransitionManager.getTaskbarToHomeDuration;
import static com.android.launcher3.statemanager.BaseState.FLAG_NON_INTERACTIVE;
import static com.android.launcher3.taskbar.TaskbarEduTooltipControllerKt.TOOLTIP_STEP_FEATURES;
import static com.android.launcher3.taskbar.TaskbarLauncherStateController.FLAG_VISIBLE;
@@ -69,14 +69,17 @@
public static final int ALL_APPS_PAGE_PROGRESS_INDEX = 1;
public static final int WIDGETS_PAGE_PROGRESS_INDEX = 2;
public static final int SYSUI_SURFACE_PROGRESS_INDEX = 3;
+ public static final int LAUNCHER_PAUSE_PROGRESS_INDEX = 4;
- public static final int DISPLAY_PROGRESS_COUNT = 4;
+ public static final int DISPLAY_PROGRESS_COUNT = 5;
private final AnimatedFloat mTaskbarInAppDisplayProgress = new AnimatedFloat(
this::onInAppDisplayProgressChanged);
private final MultiPropertyFactory<AnimatedFloat> mTaskbarInAppDisplayProgressMultiProp =
new MultiPropertyFactory<>(mTaskbarInAppDisplayProgress,
AnimatedFloat.VALUE, DISPLAY_PROGRESS_COUNT, Float::max);
+ private final AnimatedFloat mLauncherPauseProgress = new AnimatedFloat(
+ this::onLauncherPauseProgressUpdate);
private final QuickstepLauncher mLauncher;
private final HomeVisibilityState mHomeState;
@@ -154,8 +157,9 @@
@Override
protected boolean isTaskbarTouchable() {
- return !(mTaskbarLauncherStateController.isAnimatingToLauncher()
- && mTaskbarLauncherStateController.isTaskbarAlignedWithHotseat());
+ // Touching down during animation to Hotseat will end the transition and allow the touch to
+ // go through to the Hotseat directly.
+ return !isAnimatingToHotseat();
}
public void setShouldDelayLauncherStateAnim(boolean shouldDelayLauncherStateAnim) {
@@ -274,7 +278,8 @@
if (mControllers.bubbleControllers.isEmpty() || hotseat == null) return;
boolean hiddenForBubbles =
mControllers.bubbleControllers.get().bubbleBarViewController.isHiddenForNoBubbles();
- hotseat.post(() -> adjustHotseatForBubbleBar(!hiddenForBubbles));
+ if (hiddenForBubbles) return;
+ hotseat.post(() -> adjustHotseatForBubbleBar(/* isBubbleBarVisible= */ true));
}
/**
@@ -440,6 +445,17 @@
}
@Override
+ public boolean isAnimatingToHotseat() {
+ return mTaskbarLauncherStateController.isAnimatingToLauncher()
+ && isIconAlignedWithHotseat();
+ }
+
+ @Override
+ public void endAnimationToHotseat() {
+ mTaskbarLauncherStateController.resetIconAlignment();
+ }
+
+ @Override
protected boolean isInOverviewUi() {
return mTaskbarLauncherStateController.isInOverviewUi();
}
@@ -486,7 +502,8 @@
"MINUS_ONE_PAGE_PROGRESS_INDEX",
"ALL_APPS_PAGE_PROGRESS_INDEX",
"WIDGETS_PAGE_PROGRESS_INDEX",
- "SYSUI_SURFACE_PROGRESS_INDEX");
+ "SYSUI_SURFACE_PROGRESS_INDEX",
+ "LAUNCHER_PAUSE_PROGRESS_INDEX");
mTaskbarLauncherStateController.dumpLogs(prefix + "\t", pw);
}
@@ -516,4 +533,39 @@
mLauncher.getWorkspace().onOverlayScrollChanged(0);
}
}
+
+ /**
+ * Called when Launcher Activity resumed while staying at home.
+ * <p>
+ * Shift nav buttons up to at-home position.
+ */
+ public void onLauncherResume() {
+ mLauncherPauseProgress.animateToValue(0.0f).start();
+ }
+
+ /**
+ * Called when Launcher Activity paused while staying at home.
+ * <p>
+ * To avoid UI clash between taskbar & bottom sheet, shift nav buttons down to in-app position.
+ */
+ public void onLauncherPause() {
+ mLauncherPauseProgress.animateToValue(1.0f).start();
+ }
+
+ /**
+ * On launcher stop, avoid animating taskbar & overriding pre-existing animations.
+ */
+ public void onLauncherStop() {
+ mLauncherPauseProgress.cancelAnimation();
+ mLauncherPauseProgress.updateValue(0.0f);
+ }
+
+ private void onLauncherPauseProgressUpdate() {
+ // If we are not aligned with hotseat, setting this will clobber the 3 button nav position.
+ // So in that case, treat the progress as 0 instead.
+ float pauseProgress = isIconAlignedWithHotseat() ? mLauncherPauseProgress.value : 0;
+ onTaskbarInAppDisplayProgressUpdate(pauseProgress, LAUNCHER_PAUSE_PROGRESS_INDEX);
+ }
+
+
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/ManageWindowsTaskbarShortcut.kt b/quickstep/src/com/android/launcher3/taskbar/ManageWindowsTaskbarShortcut.kt
index c0c2a02..032eb51 100644
--- a/quickstep/src/com/android/launcher3/taskbar/ManageWindowsTaskbarShortcut.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/ManageWindowsTaskbarShortcut.kt
@@ -32,9 +32,10 @@
import com.android.launcher3.views.ActivityContext
import com.android.quickstep.RecentsModel
import com.android.quickstep.SystemUiProxy
-import com.android.quickstep.util.GroupTask
+import com.android.quickstep.util.DesktopTask
+import com.android.systemui.shared.recents.model.Task
import com.android.systemui.shared.recents.model.ThumbnailData
-import com.android.wm.shell.shared.desktopmode.ManageWindowsViewContainer
+import com.android.wm.shell.shared.multiinstance.ManageWindowsViewContainer
import java.util.Collections
import java.util.function.Predicate
@@ -46,7 +47,7 @@
class ManageWindowsTaskbarShortcut<T>(
private val target: T,
private val itemInfo: ItemInfo?,
- private val originalView: View?,
+ private val originalView: View,
private val controllers: TaskbarControllers,
) :
SystemShortcut<T>(
@@ -60,20 +61,29 @@
private val recentsModel = RecentsModel.INSTANCE[controllers.taskbarActivityContext]
override fun onClick(v: View?) {
- val filter =
- Predicate<GroupTask> { task: GroupTask? ->
- task != null && task.task1.key.packageName == itemInfo?.getTargetPackage()
- }
- recentsModel.getTasks(
- { tasks: List<GroupTask> ->
- // Since fetching thumbnails is asynchronous, use this set to gate until the tasks
- // are ready to display
- val pendingTaskIds =
- Collections.synchronizedSet(tasks.map { it.task1.key.id }.toMutableSet())
- createAndShowTaskShortcutView(tasks, pendingTaskIds)
- },
- filter,
- )
+ val targetPackage = itemInfo?.getTargetPackage()
+ val targetUserId = itemInfo?.user?.identifier
+ val isTargetPackageTask: (Task) -> Boolean = { task ->
+ task.key?.packageName == targetPackage && task.key.userId == targetUserId
+ }
+
+ recentsModel.getTasks { tasks ->
+ val desktopTask = tasks.filterIsInstance<DesktopTask>().firstOrNull()
+ val packageDesktopTasks =
+ (desktopTask?.tasks ?: emptyList()).filter(isTargetPackageTask)
+ val nonDesktopPackageTasks =
+ tasks.filter { isTargetPackageTask(it.task1) }.map { it.task1 }
+
+ // Add tasks from the fetched tasks, deduplicating by task ID
+ val packageTasks =
+ (packageDesktopTasks + nonDesktopPackageTasks).distinctBy { it.key.id }
+
+ // Since fetching thumbnails is asynchronous, use `awaitedTaskIds` to gate until the
+ // tasks are ready to display
+ val awaitedTaskIds = packageTasks.map { it.key.id }.toMutableSet()
+
+ createAndShowTaskShortcutView(packageTasks, awaitedTaskIds)
+ }
}
/**
@@ -83,25 +93,20 @@
* thumbnails are processed, it creates a [TaskbarShortcutManageWindowsView] with the collected
* thumbnails and positions it appropriately.
*/
- private fun createAndShowTaskShortcutView(
- tasks: List<GroupTask?>,
- pendingTaskIds: MutableSet<Int>,
- ) {
+ private fun createAndShowTaskShortcutView(tasks: List<Task>, pendingTaskIds: MutableSet<Int>) {
val taskList = arrayListOf<Pair<Int, Bitmap?>>()
- tasks.forEach { groupTask ->
- groupTask?.task1?.let { task ->
- recentsModel.thumbnailCache.getThumbnailInBackground(task) {
- thumbnailData: ThumbnailData ->
- pendingTaskIds.remove(task.key.id)
- // Add the current pair of task id and ThumbnailData to the list of all tasks
- if (thumbnailData.thumbnail != null) {
- taskList.add(task.key.id to thumbnailData.thumbnail)
- }
- // If the set is empty, all thumbnails have been fetched
- if (pendingTaskIds.isEmpty() && taskList.isNotEmpty()) {
- createAndPositionTaskbarShortcut(taskList)
- }
+ tasks.forEach { task ->
+ recentsModel.thumbnailCache.getThumbnailInBackground(task) {
+ thumbnailData: ThumbnailData ->
+ pendingTaskIds.remove(task.key.id)
+ // Add the current pair of task id and ThumbnailData to the list of all tasks
+ if (thumbnailData.thumbnail != null) {
+ taskList.add(task.key.id to thumbnailData.thumbnail)
+ }
+ // If the set is empty, all thumbnails have been fetched
+ if (pendingTaskIds.isEmpty() && taskList.isNotEmpty()) {
+ createAndPositionTaskbarShortcut(taskList)
}
}
}
@@ -113,23 +118,39 @@
private fun createAndPositionTaskbarShortcut(taskList: ArrayList<Pair<Int, Bitmap?>>) {
val onIconClickListener =
({ taskId: Int? ->
- taskbarShortcutAllWindowsView.removeFromContainer()
+ taskbarShortcutAllWindowsView.animateClose()
if (taskId != null) {
SystemUiProxy.INSTANCE.get(target).showDesktopApp(taskId, null)
}
})
- val onOutsideClickListener = { taskbarShortcutAllWindowsView.removeFromContainer() }
+ val onOutsideClickListener = { taskbarShortcutAllWindowsView.animateClose() }
taskbarShortcutAllWindowsView =
TaskbarShortcutManageWindowsView(
- originalView!!,
+ originalView,
controllers.taskbarOverlayController.requestWindow(),
taskList,
onIconClickListener,
onOutsideClickListener,
controllers,
)
+
+ // If the view is removed from elsewhere, reset the state to allow the taskbar to auto-stash
+ taskbarShortcutAllWindowsView.menuView.rootView.addOnAttachStateChangeListener(
+ object : View.OnAttachStateChangeListener {
+ override fun onViewAttachedToWindow(v: View) {
+ return
+ }
+
+ override fun onViewDetachedFromWindow(v: View) {
+ controllers.taskbarAutohideSuspendController.updateFlag(
+ FLAG_AUTOHIDE_SUSPEND_MULTI_INSTANCE_MENU_OPEN,
+ false,
+ )
+ }
+ }
+ )
}
/**
@@ -148,7 +169,7 @@
) :
ManageWindowsViewContainer(
originalView.context,
- Themes.getAttrColor(originalView.context, R.attr.materialColorSurfaceBright),
+ originalView.context.getColor(R.color.materialColorSurfaceBright),
),
TouchController {
private val taskbarActivityContext = controllers.taskbarActivityContext
@@ -156,11 +177,12 @@
init {
createAndShowMenuView(snapshotList, onIconClickListener, onOutsideClickListener)
taskbarOverlayContext.dragLayer.addTouchController(this)
+ animateOpen()
}
/** Adds the carousel menu to the taskbar overlay drag layer */
override fun addToContainer(menuView: ManageWindowsView) {
- taskbarOverlayContext.dragLayer.post { positionCarouselMenu() }
+ positionCarouselMenu()
controllers.taskbarAutohideSuspendController.updateFlag(
FLAG_AUTOHIDE_SUSPEND_MULTI_INSTANCE_MENU_OPEN,
@@ -184,28 +206,28 @@
* align with the calling app while ensuring it doesn't go beyond the screen edge.
*/
private fun positionCarouselMenu() {
+ val deviceProfile = taskbarActivityContext.deviceProfile
val margin =
context.resources.getDimension(
R.dimen.taskbar_multi_instance_menu_min_padding_from_screen_edge
)
// Calculate the Y position to place the carousel above the taskbar
- val availableHeight = taskbarOverlayContext.dragLayer.height
menuView.rootView.y =
- availableHeight -
+ deviceProfile.availableHeightPx -
menuView.menuHeight -
controllers.taskbarStashController.touchableHeight -
margin
// Calculate the X position to align with the calling app,
// but avoid clashing with the screen edge
- val availableWidth = taskbarOverlayContext.dragLayer.width
- if (Utilities.isRtl(context.resources)) {
- menuView.rootView.translationX = -(availableWidth - menuView.menuWidth) / 2f
- } else {
- val maxX = availableWidth - menuView.menuWidth - margin
- menuView.rootView.translationX = minOf(originalView.x, maxX)
- }
+ menuView.rootView.translationX =
+ if (Utilities.isRtl(context.resources)) {
+ -(deviceProfile.availableWidthPx - menuView.menuWidth) / 2f
+ } else {
+ val maxX = deviceProfile.availableWidthPx - menuView.menuWidth - margin
+ minOf(originalView.x, maxX)
+ }
}
/** Closes the carousel menu and removes it from the taskbar overlay drag layer */
@@ -214,7 +236,6 @@
FLAG_AUTOHIDE_SUSPEND_MULTI_INSTANCE_MENU_OPEN,
false,
)
- controllers.taskbarStashController.updateAndAnimateTransientTaskbar(true)
taskbarOverlayContext.dragLayer?.removeView(menuView.rootView)
taskbarOverlayContext.dragLayer.removeTouchController(this)
}
@@ -227,10 +248,10 @@
override fun onControllerInterceptTouchEvent(ev: MotionEvent?): Boolean {
ev?.let {
if (
- ev.action == MotionEvent.ACTION_DOWN &&
- !taskbarOverlayContext.dragLayer.isEventOverView(menuView.rootView, ev)
+ it.action == MotionEvent.ACTION_DOWN &&
+ !taskbarOverlayContext.dragLayer.isEventOverView(menuView.rootView, it)
) {
- removeFromContainer()
+ animateClose()
}
}
return false
diff --git a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java
index fbd1b6e..cb4e5e2 100644
--- a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java
@@ -15,6 +15,7 @@
*/
package com.android.launcher3.taskbar;
+import static android.view.KeyEvent.ACTION_UP;
import static android.view.View.AccessibilityDelegate;
import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
import static android.view.ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION;
@@ -65,6 +66,7 @@
import android.graphics.Color;
import android.graphics.Point;
import android.graphics.Rect;
+import android.graphics.RectF;
import android.graphics.Region;
import android.graphics.Region.Op;
import android.graphics.drawable.Drawable;
@@ -72,9 +74,9 @@
import android.graphics.drawable.RotateDrawable;
import android.inputmethodservice.InputMethodService;
import android.os.Handler;
-import android.os.SystemClock;
import android.util.Property;
import android.view.Gravity;
+import android.view.HapticFeedbackConstants;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
@@ -448,14 +450,16 @@
mPropertyHolders.add(new StatePropertyHolder(mBackButton,
flags -> (flags & FLAG_IME_VISIBLE) != 0,
ROTATION_DRAWABLE_PERCENT, 1f, 0f));
- // Translate back button to be at end/start of other buttons for keyguard
+ // Translate back button to be at end/start of other buttons for keyguard (only after SUW
+ // since it is laid to align with SUW actions while in that state)
int navButtonSize = mContext.getResources().getDimensionPixelSize(
R.dimen.taskbar_nav_buttons_size);
boolean isRtl = Utilities.isRtl(mContext.getResources());
if (!mContext.isPhoneMode()) {
mPropertyHolders.add(new StatePropertyHolder(
- mBackButton, flags -> (flags & FLAG_ONLY_BACK_FOR_BOUNCER_VISIBLE) != 0
- || (flags & FLAG_KEYGUARD_VISIBLE) != 0,
+ mBackButton, flags -> mContext.isUserSetupComplete()
+ && ((flags & FLAG_ONLY_BACK_FOR_BOUNCER_VISIBLE) != 0
+ || (flags & FLAG_KEYGUARD_VISIBLE) != 0),
VIEW_TRANSLATE_X, navButtonSize * (isRtl ? -2 : 2), 0));
}
@@ -860,20 +864,21 @@
private void setBackButtonTouchListener(View buttonView,
TaskbarNavButtonController navButtonController) {
+ final RectF rect = new RectF();
buttonView.setOnTouchListener((v, event) -> {
- if (event.getAction() == MotionEvent.ACTION_MOVE) return false;
- long time = SystemClock.uptimeMillis();
- int action = event.getAction();
- KeyEvent keyEvent = new KeyEvent(time, time,
- action == MotionEvent.ACTION_DOWN ? KeyEvent.ACTION_DOWN : KeyEvent.ACTION_UP,
- KeyEvent.KEYCODE_BACK, 0);
- if (event.getAction() == MotionEvent.ACTION_CANCEL) {
- keyEvent.cancel();
+ if (event.getAction() == MotionEvent.ACTION_DOWN) {
+ rect.set(0, 0, v.getWidth(), v.getHeight());
}
- navButtonController.executeBack(keyEvent);
-
- if (action == MotionEvent.ACTION_UP) {
+ boolean isCancelled = event.getAction() == MotionEvent.ACTION_CANCEL
+ || !rect.contains(event.getX(), event.getY());
+ if (event.getAction() == MotionEvent.ACTION_MOVE && !isCancelled) return false;
+ int motionEventAction = event.getAction();
+ int keyEventAction = motionEventAction == MotionEvent.ACTION_DOWN
+ ? KeyEvent.ACTION_DOWN : ACTION_UP;
+ navButtonController.sendBackKeyEvent(keyEventAction, isCancelled);
+ if (motionEventAction == MotionEvent.ACTION_UP && !isCancelled) {
buttonView.performClick();
+ buttonView.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);
}
return false;
});
@@ -1293,7 +1298,10 @@
boolean isNavbarOnRight = location.isOnLeft(mNavButtonsView.isLayoutRtl());
DeviceProfile dp = mContext.getDeviceProfile();
float navBarTargetStartX;
- if (mContext.shouldStartAlignTaskbar()) {
+ if (!mContext.isUserSetupComplete()) {
+ // Skip additional translations on the nav bar container while in SUW layout
+ return 0;
+ } else if (mContext.shouldStartAlignTaskbar()) {
int navBarSpacing = dp.inlineNavButtonsEndSpacingPx;
// If the taskbar is start aligned the navigation bar is aligned to the start or end of
// the container, depending on the bubble bar location
@@ -1306,7 +1314,8 @@
// If the task bar is not start aligned, the navigation bar is located in the center
// between the taskbar and screen edges, depending on the bubble bar location.
float navbarWidth = mNavButtonContainer.getWidth();
- Rect taskbarBounds = mControllers.taskbarViewController.getIconLayoutBounds();
+ Rect taskbarBounds = mControllers.taskbarViewController
+ .getTransientTaskbarIconLayoutBoundsInParent();
if (isNavbarOnRight) {
if (mNavButtonsView.isLayoutRtl()) {
float taskBarEnd = taskbarBounds.right;
@@ -1326,8 +1335,10 @@
public void onLayoutsUpdated() {
// no need to do anything if on phone, or if taskbar or navbar views were not placed on
// screen.
+ Rect transientTaskbarIconLayoutBoundsInParent = mControllers.taskbarViewController
+ .getTransientTaskbarIconLayoutBoundsInParent();
if (mContext.getDeviceProfile().isPhone
- || mControllers.taskbarViewController.getIconLayoutBounds().isEmpty()
+ || transientTaskbarIconLayoutBoundsInParent.isEmpty()
|| mNavButtonsView.getWidth() == 0) {
return;
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/StashedHandleViewController.java b/quickstep/src/com/android/launcher3/taskbar/StashedHandleViewController.java
index eb47bb0..b6b090c 100644
--- a/quickstep/src/com/android/launcher3/taskbar/StashedHandleViewController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/StashedHandleViewController.java
@@ -212,7 +212,8 @@
* morphs into the size of where the taskbar icons will be.
*/
public Animator createRevealAnimToIsStashed(boolean isStashed) {
- Rect visualBounds = mControllers.taskbarViewController.getIconLayoutVisualBounds();
+ Rect visualBounds = mControllers.taskbarViewController
+ .getTransientTaskbarIconLayoutBounds();
float startRadius = mStashedHandleRadius;
if (DisplayController.isTransientTaskbar(mActivity)) {
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
index d7e5c61..5377d65 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
@@ -301,7 +301,8 @@
BubbleStashController bubbleStashController = isTransientTaskbar
? new TransientBubbleStashController(dimensionsProvider, this)
: new PersistentBubbleStashController(dimensionsProvider);
- bubbleStashController.setHotseatVerticalCenter(launcherDp.getHotseatVerticalCenter());
+ bubbleStashController.setBubbleBarVerticalCenterForHome(
+ launcherDp.getBubbleBarVerticalCenterForHome());
bubbleControllersOptional = Optional.of(new BubbleControllers(
new BubbleBarController(this, bubbleBarView),
new BubbleBarViewController(this, bubbleBarView, bubbleBarContainer),
@@ -369,8 +370,9 @@
applyDeviceProfile(launcherDp);
mControllers.taskbarOverlayController.updateLauncherDeviceProfile(launcherDp);
mControllers.bubbleControllers.ifPresent(bubbleControllers -> {
- int hotseatVertCenter = launcherDp.getHotseatVerticalCenter();
- bubbleControllers.bubbleStashController.setHotseatVerticalCenter(hotseatVertCenter);
+ int bubbleBarVerticalCenter = launcherDp.getBubbleBarVerticalCenterForHome();
+ bubbleControllers.bubbleStashController
+ .setBubbleBarVerticalCenterForHome(bubbleBarVerticalCenter);
});
AbstractFloatingView.closeAllOpenViewsExcept(this, false, TYPE_REBIND_SAFE);
// Reapply fullscreen to take potential new screen size into account.
@@ -440,6 +442,8 @@
onNavButtonsDarkIntensityChanged(sharedState.navButtonsDarkIntensity);
onNavigationBarLumaSamplingEnabled(sharedState.mLumaSamplingDisplayId,
sharedState.mIsLumaSamplingEnabled);
+ setWallpaperVisible(sharedState.wallpaperVisible);
+ onTransitionModeUpdated(sharedState.barMode, true /* checkBarModes */);
if (ENABLE_TASKBAR_NAVBAR_UNIFICATION) {
// W/ the flag not set this entire class gets re-created, which resets the value of
@@ -582,7 +586,9 @@
int windowFlags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_SLIPPERY
| WindowManager.LayoutParams.FLAG_SPLIT_TOUCH;
- if (DisplayController.isTransientTaskbar(this) && !isRunningInTestHarness()) {
+ boolean watchOutside = DisplayController.isTransientTaskbar(this)
+ || isThreeButtonNav();
+ if (watchOutside && !isRunningInTestHarness()) {
windowFlags |= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
| WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
}
@@ -865,7 +871,8 @@
}
private ActivityOptionsWrapper getActivityLaunchDesktopOptions(ItemInfo info) {
- if (!DesktopModeFlags.ENABLE_DESKTOP_APP_LAUNCH_TRANSITIONS.isTrue()) {
+ if (!DesktopModeFlags.ENABLE_DESKTOP_APP_LAUNCH_TRANSITIONS.isTrue()
+ && !DesktopModeFlags.ENABLE_DESKTOP_APP_LAUNCH_TRANSITIONS_BUGFIX.isTrue()) {
return null;
}
if (!areDesktopTasksVisible()) {
@@ -1134,6 +1141,10 @@
return getSetupWindowSize();
}
+ int bubbleBarTop = mControllers.bubbleControllers.map(bubbleControllers ->
+ bubbleControllers.bubbleBarViewController.getBubbleBarWithFlyoutMaximumHeight()
+ ).orElse(0);
+ int taskbarWindowSize;
boolean shouldTreatAsTransient = DisplayController.isTransientTaskbar(this)
|| (enableTaskbarPinning() && !isThreeButtonNav());
@@ -1150,16 +1161,18 @@
DeviceProfile transientTaskbarDp = mDeviceProfile.toBuilder(this)
.setIsTransientTaskbar(true).build();
- return transientTaskbarDp.taskbarHeight
+ taskbarWindowSize = transientTaskbarDp.taskbarHeight
+ (2 * transientTaskbarDp.taskbarBottomMargin)
+ Math.max(extraHeightForTaskbarTooltips, resources.getDimensionPixelSize(
R.dimen.transient_taskbar_shadow_blur));
+ return Math.max(taskbarWindowSize, bubbleBarTop);
}
- return mDeviceProfile.taskbarHeight
+ taskbarWindowSize = mDeviceProfile.taskbarHeight
+ getCornerRadius()
+ extraHeightForTaskbarTooltips;
+ return Math.max(taskbarWindowSize, bubbleBarTop);
}
public int getSetupWindowSize() {
@@ -1427,7 +1440,9 @@
BubbleTextView.RunningAppState runningAppState =
mControllers.taskbarRecentAppsController.getRunningAppState(taskId);
return runningAppState == BubbleTextView.RunningAppState.MINIMIZED
- && DesktopModeFlags.ENABLE_DESKTOP_APP_LAUNCH_ALTTAB_TRANSITIONS.isTrue();
+ && (DesktopModeFlags.ENABLE_DESKTOP_APP_LAUNCH_ALTTAB_TRANSITIONS.isTrue()
+ || DesktopModeFlags.ENABLE_DESKTOP_APP_LAUNCH_ALTTAB_TRANSITIONS_BUGFIX.isTrue()
+ );
}
private RemoteTransition createUnminimizeRemoteTransition() {
@@ -1632,15 +1647,6 @@
mControllers.taskbarEduTooltipController.hide();
}
- /**
- * Called when we want to open bubblebar when user performs swipes up gesture.
- */
- public void onSwipeToOpenBubblebar() {
- mControllers.bubbleControllers.ifPresent(controllers -> {
- controllers.bubbleStashController.showBubbleBar(/* expandBubbles= */ true);
- });
- }
-
/** Returns {@code true} if Taskbar All Apps is open. */
public boolean isTaskbarAllAppsOpen() {
return mControllers.taskbarAllAppsController.isOpen();
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarBackgroundRenderer.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarBackgroundRenderer.kt
index c0e921e..ea6d82b 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarBackgroundRenderer.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarBackgroundRenderer.kt
@@ -23,7 +23,6 @@
import android.graphics.Path
import android.graphics.RectF
import com.android.app.animation.Interpolators
-import com.android.internal.policy.ScreenDecorationsUtils
import com.android.launcher3.R
import com.android.launcher3.Utilities
import com.android.launcher3.Utilities.mapRange
@@ -98,12 +97,9 @@
shadowAlpha = LIGHT_THEME_SHADOW_ALPHA
}
- if (context.areDesktopTasksVisible()) {
- fullCornerRadius = ScreenDecorationsUtils.getWindowCornerRadius(context)
- cornerRadius = fullCornerRadius
- } else {
- fullCornerRadius = context.cornerRadius.toFloat()
- cornerRadius = fullCornerRadius
+ fullCornerRadius = context.cornerRadius.toFloat()
+ cornerRadius = fullCornerRadius
+ if (!context.areDesktopTasksVisible()) {
setCornerRoundness(MAX_ROUNDNESS)
}
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java
index db70724..826722d 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarControllers.java
@@ -227,7 +227,9 @@
bubbleControllers.bubbleBarViewController.getBubbleBarLocation();
boolean hiddenForBubbles =
bubbleControllers.bubbleBarViewController.isHiddenForNoBubbles();
- uiController.adjustHotseatForBubbleBar(!hiddenForBubbles);
+ if (!hiddenForBubbles) {
+ uiController.adjustHotseatForBubbleBar(/* isBubbleBarVisible= */ true);
+ }
uiController.onBubbleBarLocationUpdated(location);
}, () -> uiController.onBubbleBarLocationUpdated(null));
// Notify that the ui controller has changed
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayer.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayer.java
index e16c76d..8b52112 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayer.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayer.java
@@ -262,6 +262,7 @@
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
TestLogging.recordMotionEvent(TestProtocol.SEQUENCE_MAIN, "Touch event", ev);
+ mControllerCallbacks.onDispatchTouchEvent(ev);
return super.dispatchTouchEvent(ev);
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayerController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayerController.java
index 2845cee..925e10b 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayerController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragLayerController.java
@@ -23,6 +23,7 @@
import android.graphics.Point;
import android.graphics.Rect;
import android.os.SystemProperties;
+import android.view.MotionEvent;
import android.view.ViewTreeObserver;
import com.android.launcher3.DeviceProfile;
@@ -325,5 +326,15 @@
}
mControllers.taskbarInsetsController.drawDebugTouchableRegionBounds(canvas);
}
+
+ /** Handles any touch event before it is dispatched to the rest of TaskbarDragLayer. */
+ public void onDispatchTouchEvent(MotionEvent ev) {
+ if (mActivity.isThreeButtonNav() && ev.getAction() == MotionEvent.ACTION_OUTSIDE
+ && mControllers.uiController.isAnimatingToHotseat()) {
+ // When touching during animation to home, jump to the end so Hotseat can handle
+ // the touch. (Gesture Navigation handles this in AbsSwipeUpHandler.)
+ mControllers.uiController.endAnimationToHotseat();
+ }
+ }
}
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarEduTooltip.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarEduTooltip.kt
index 19e9872..d85dd50 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarEduTooltip.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarEduTooltip.kt
@@ -45,15 +45,12 @@
/** Floating tooltip for Taskbar education. */
class TaskbarEduTooltip
@JvmOverloads
-constructor(
- context: Context,
- attrs: AttributeSet? = null,
- defStyleAttr: Int = 0,
-) : AbstractFloatingView(context, attrs, defStyleAttr) {
+constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) :
+ AbstractFloatingView(context, attrs, defStyleAttr) {
private val activityContext: ActivityContext = ActivityContext.lookupContext(context)
- private val backgroundColor = Themes.getAttrColor(context, R.attr.materialColorSurfaceBright)
+ private val backgroundColor = context.getColor(R.color.materialColorSurfaceBright)
private val tooltipCornerRadius = Themes.getDialogCornerRadius(context)
private val arrowWidth = resources.getDimension(R.dimen.popup_arrow_width)
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarEduTooltipController.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarEduTooltipController.kt
index a89bc3a..26a552e 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarEduTooltipController.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarEduTooltipController.kt
@@ -83,7 +83,7 @@
protected val activityContext: TaskbarActivityContext = ActivityContext.lookupContext(context)
open val shouldShowSearchEdu: Boolean
get() =
- ContextualSearchInvoker.newInstance(activityContext)
+ ContextualSearchInvoker(activityContext)
.runContextualSearchInvocationChecksAndLogFailures()
private val isTooltipEnabled: Boolean
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java
index dce377d..2db7961 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java
@@ -40,6 +40,7 @@
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
+import android.content.Context;
import android.os.SystemClock;
import android.util.Log;
import android.view.animation.Interpolator;
@@ -475,7 +476,7 @@
}
mControllers.bubbleControllers.ifPresent(controllers -> {
// Show the bubble bar when on launcher home (hotseat icons visible) or in overview
- boolean onOverview = mLauncherState == LauncherState.OVERVIEW;
+ boolean onOverview = isInLauncher && mLauncherState == LauncherState.OVERVIEW;
boolean hotseatIconsVisible = isInLauncher && mLauncherState.areElementsVisible(
mLauncher, HOTSEAT_ICONS);
BubbleLauncherState state = onOverview
@@ -581,7 +582,7 @@
float backgroundAlpha = isInLauncher && isTaskbarAlignedWithHotseat() ? 0 : 1;
AnimatedFloat taskbarBgOffset =
mControllers.taskbarDragLayerController.getTaskbarBackgroundOffset();
- boolean showTaskbar = !isInLauncher || isInOverview;
+ boolean showTaskbar = shouldShowTaskbar(mLauncher, isInLauncher, isInOverview);
float taskbarBgOffsetEnd = showTaskbar ? 0f : 1f;
float taskbarBgOffsetStart = showTaskbar ? 1f : 0f;
@@ -714,6 +715,14 @@
return animatorSet;
}
+ private static boolean shouldShowTaskbar(Context context, boolean isInLauncher,
+ boolean isInOverview) {
+ if (DisplayController.showLockedTaskbarOnHome(context) && isInLauncher) {
+ return true;
+ }
+ return !isInLauncher || isInOverview;
+ }
+
private void setupPinnedTaskbarAnimation(AnimatorSet animatorSet, boolean showTaskbar,
AnimatedFloat taskbarBgOffset, float taskbarBgOffsetStart, float taskbarBgOffsetEnd,
long duration, Animator taskbarBackgroundAlpha) {
@@ -1009,12 +1018,7 @@
@Override
public void onRecentsAnimationFinished(RecentsAnimationController controller) {
- endGestureStateOverride(!controller.getFinishTargetIsLauncher(),
- controller.getLauncherIsVisibleAtFinish(), false /*canceled*/);
- }
-
- private void endGestureStateOverride(boolean finishedToApp, boolean canceled) {
- endGestureStateOverride(finishedToApp, finishedToApp, canceled);
+ endGestureStateOverride(!controller.getFinishTargetIsLauncher(), false /*canceled*/);
}
/**
@@ -1024,13 +1028,11 @@
*
* @param finishedToApp {@code true} if the recents animation finished to showing an app and
* not workspace or overview
- * @param launcherIsVisible {code true} if launcher is visible at finish
* @param canceled {@code true} if the recents animation was canceled instead of
* finishing
* to completion
*/
- private void endGestureStateOverride(boolean finishedToApp, boolean launcherIsVisible,
- boolean canceled) {
+ private void endGestureStateOverride(boolean finishedToApp, boolean canceled) {
mCallbacks.removeListener(this);
mTaskBarRecentsAnimationListener = null;
((RecentsView) mLauncher.getOverviewPanel()).setTaskLaunchListener(null);
@@ -1039,27 +1041,18 @@
mSkipNextRecentsAnimEnd = false;
return;
}
- updateStateForUserFinishedToApp(finishedToApp, launcherIsVisible);
+ updateStateForUserFinishedToApp(finishedToApp);
}
}
/**
- * @see #updateStateForUserFinishedToApp(boolean, boolean)
- */
- private void updateStateForUserFinishedToApp(boolean finishedToApp) {
- updateStateForUserFinishedToApp(finishedToApp, !finishedToApp);
- }
-
- /**
* Updates the visible state immediately to ensure a seamless handoff.
*
* @param finishedToApp True iff user is in an app.
- * @param launcherIsVisible True iff launcher is still visible (ie. transparent app)
*/
- private void updateStateForUserFinishedToApp(boolean finishedToApp,
- boolean launcherIsVisible) {
+ private void updateStateForUserFinishedToApp(boolean finishedToApp) {
// Update the visible state immediately to ensure a seamless handoff
- boolean launcherVisible = !finishedToApp || launcherIsVisible;
+ boolean launcherVisible = !finishedToApp;
updateStateForFlag(FLAG_TRANSITION_TO_VISIBLE, false);
updateStateForFlag(FLAG_VISIBLE, launcherVisible);
applyState();
@@ -1068,7 +1061,7 @@
if (DEBUG) {
Log.d(TAG, "endGestureStateOverride - FLAG_IN_APP: " + finishedToApp);
}
- controller.updateStateForFlag(FLAG_IN_APP, finishedToApp && !launcherIsVisible);
+ controller.updateStateForFlag(FLAG_IN_APP, finishedToApp);
controller.applyState();
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
index 0807ee9..ff8e4a8 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
@@ -46,6 +46,7 @@
import android.os.Trace;
import android.provider.Settings;
import android.util.Log;
+import android.util.SparseArray;
import android.view.Display;
import android.view.MotionEvent;
import android.view.WindowManager;
@@ -115,13 +116,12 @@
private final Context mContext;
private final @Nullable Context mNavigationBarPanelContext;
private WindowManager mWindowManager;
- private FrameLayout mTaskbarRootLayout;
private boolean mAddedWindow;
- private final TaskbarNavButtonController mNavButtonController;
- private final ComponentCallbacks mComponentCallbacks;
+ private final TaskbarNavButtonController mDefaultNavButtonController;
+ private final ComponentCallbacks mDefaultComponentCallbacks;
private final SimpleBroadcastReceiver mShutdownReceiver =
- new SimpleBroadcastReceiver(UI_HELPER_EXECUTOR, i -> destroyExistingTaskbar());
+ new SimpleBroadcastReceiver(UI_HELPER_EXECUTOR, i -> destroyAllTaskbars());
// The source for this provider is set when Launcher is available
// We use 'non-destroyable' version here so the original provider won't be destroyed
@@ -129,8 +129,10 @@
// It's destruction/creation will be managed by the activity.
private final ScopedUnfoldTransitionProgressProvider mUnfoldProgressProvider =
new NonDestroyableScopedUnfoldTransitionProgressProvider();
-
- private TaskbarActivityContext mTaskbarActivityContext;
+ /** DisplayId - {@link TaskbarActivityContext} map for Connected Display. */
+ private final SparseArray<TaskbarActivityContext> mTaskbars = new SparseArray<>();
+ /** DisplayId - {@link FrameLayout} map for Connected Display. */
+ private final SparseArray<FrameLayout> mRootLayouts = new SparseArray<>();
private StatefulActivity mActivity;
private RecentsViewContainer mRecentsViewContainer;
@@ -167,7 +169,9 @@
private final Runnable mActivityOnDestroyCallback = new Runnable() {
@Override
public void run() {
+ int displayId = getDefaultDisplayId();
if (mActivity != null) {
+ displayId = mActivity.getDisplayId();
mActivity.removeOnDeviceProfileChangeListener(
mDebugActivityDeviceProfileChanged);
Log.d(TASKBAR_NOT_DESTROYED_TAG,
@@ -180,8 +184,9 @@
}
mActivity = null;
debugWhyTaskbarNotDestroyed("clearActivity");
- if (mTaskbarActivityContext != null) {
- mTaskbarActivityContext.setUIController(TaskbarUIController.DEFAULT);
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(displayId);
+ if (taskbar != null) {
+ taskbar.setUIController(TaskbarUIController.DEFAULT);
}
mUnfoldProgressProvider.setSourceProvider(null);
}
@@ -236,27 +241,28 @@
mDesktopVisibilityController = desktopVisibilityController;
if (enableTaskbarNoRecreate()) {
mWindowManager = mContext.getSystemService(WindowManager.class);
- mTaskbarRootLayout = new FrameLayout(mContext) {
+ FrameLayout taskbarRootLayout = new FrameLayout(mContext) {
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
// The motion events can be outside the view bounds of task bar, and hence
// manually dispatching them to the drag layer here.
- if (mTaskbarActivityContext != null
- && mTaskbarActivityContext.getDragLayer().isAttachedToWindow()) {
- return mTaskbarActivityContext.getDragLayer().dispatchTouchEvent(ev);
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(getDefaultDisplayId());
+ if (taskbar != null && taskbar.getDragLayer().isAttachedToWindow()) {
+ return taskbar.getDragLayer().dispatchTouchEvent(ev);
}
return super.dispatchTouchEvent(ev);
}
};
+ addTaskbarRootLayoutToMap(getDefaultDisplayId(), taskbarRootLayout);
}
- mNavButtonController = new TaskbarNavButtonController(
+ mDefaultNavButtonController = new TaskbarNavButtonController(
context,
navCallbacks,
SystemUiProxy.INSTANCE.get(mContext),
ContextualEduStatsManager.INSTANCE.get(mContext),
new Handler(),
- ContextualSearchInvoker.newInstance(mContext));
- mComponentCallbacks = new ComponentCallbacks() {
+ new ContextualSearchInvoker(mContext));
+ mDefaultComponentCallbacks = new ComponentCallbacks() {
private Configuration mOldConfig = mContext.getResources().getConfiguration();
@Override
@@ -265,6 +271,7 @@
"onConfigurationChanged: " + newConfig);
debugWhyTaskbarNotDestroyed(
"TaskbarManager#mComponentCallbacks.onConfigurationChanged: " + newConfig);
+ // TODO: adapt this logic to be specific to different displays.
DeviceProfile dp = mUserUnlocked
? LauncherAppState.getIDP(mContext).getDeviceProfile(mContext)
: null;
@@ -281,12 +288,12 @@
debugWhyTaskbarNotDestroyed("ComponentCallbacks#onConfigurationChanged() "
+ "configDiff=" + Configuration.configurationDiffToString(configDiff));
- if (configDiff != 0 || mTaskbarActivityContext == null) {
+ if (configDiff != 0 || getCurrentActivityContext() == null) {
recreateTaskbar();
} else {
// Config change might be handled without re-creating the taskbar
if (dp != null && !isTaskbarEnabled(dp)) {
- destroyExistingTaskbar();
+ destroyDefaultTaskbar();
} else {
if (dp != null && isTaskbarEnabled(dp)) {
if (ENABLE_TASKBAR_NAVBAR_UNIFICATION) {
@@ -295,10 +302,10 @@
// block above?
recreateTaskbar();
} else {
- mTaskbarActivityContext.updateDeviceProfile(dp);
+ getCurrentActivityContext().updateDeviceProfile(dp);
}
}
- mTaskbarActivityContext.onConfigurationChanged(configDiff);
+ getCurrentActivityContext().onConfigurationChanged(configDiff);
}
}
mOldConfig = new Configuration(newConfig);
@@ -315,7 +322,7 @@
SettingsCache.INSTANCE.get(mContext)
.register(NAV_BAR_KIDS_MODE, mOnSettingsChangeListener);
Log.d(TASKBAR_NOT_DESTROYED_TAG, "registering component callbacks from constructor.");
- mContext.registerComponentCallbacks(mComponentCallbacks);
+ mContext.registerComponentCallbacks(mDefaultComponentCallbacks);
mShutdownReceiver.register(mContext, Intent.ACTION_SHUTDOWN);
UI_HELPER_EXECUTOR.execute(() -> {
mSharedState.taskbarSystemActionPendingIntent = PendingIntent.getBroadcast(
@@ -331,18 +338,31 @@
recreateTaskbar();
}
- private void destroyExistingTaskbar() {
- debugWhyTaskbarNotDestroyed("destroyExistingTaskbar: " + mTaskbarActivityContext);
- if (mTaskbarActivityContext != null) {
- mTaskbarActivityContext.onDestroy();
- if (!ENABLE_TASKBAR_NAVBAR_UNIFICATION || enableTaskbarNoRecreate()) {
- mTaskbarActivityContext = null;
- }
+ private void destroyAllTaskbars() {
+ for (int i = 0; i < mTaskbars.size(); i++) {
+ int displayId = mTaskbars.keyAt(i);
+ destroyTaskbarForDisplay(displayId);
+ removeTaskbarRootViewFromWindow(displayId);
+ }
+ }
+
+ private void destroyDefaultTaskbar() {
+ destroyTaskbarForDisplay(getDefaultDisplayId());
+ }
+
+ private void destroyTaskbarForDisplay(int displayId) {
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(displayId);
+ debugWhyTaskbarNotDestroyed(
+ "destroyTaskbarForDisplay: " + taskbar + " displayId=" + displayId);
+ if (taskbar != null) {
+ taskbar.onDestroy();
+ // remove all defaults that we store
+ removeTaskbarFromMap(displayId);
}
DeviceProfile dp = mUserUnlocked ?
LauncherAppState.getIDP(mContext).getDeviceProfile(mContext) : null;
if (dp == null || !isTaskbarEnabled(dp)) {
- removeTaskbarRootViewFromWindow();
+ removeTaskbarRootViewFromWindow(displayId);
}
}
@@ -350,8 +370,10 @@
* Show Taskbar upon receiving broadcast
*/
private void showTaskbarFromBroadcast(Intent intent) {
- if (ACTION_SHOW_TASKBAR.equals(intent.getAction()) && mTaskbarActivityContext != null) {
- mTaskbarActivityContext.showTaskbarFromBroadcast();
+ // TODO: make this code displayId specific
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(getDefaultDisplayId());
+ if (ACTION_SHOW_TASKBAR.equals(intent.getAction()) && taskbar != null) {
+ taskbar.showTaskbarFromBroadcast();
}
}
@@ -359,12 +381,13 @@
* Toggles All Apps for Taskbar or Launcher depending on the current state.
*/
public void toggleAllApps() {
- if (mTaskbarActivityContext == null || mTaskbarActivityContext.canToggleHomeAllApps()) {
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(getDefaultDisplayId());
+ if (taskbar == null || taskbar.canToggleHomeAllApps()) {
// Home All Apps should be toggled from this class, because the controllers are not
// initialized when Taskbar is disabled (i.e. TaskbarActivityContext is null).
if (mActivity instanceof Launcher l) l.toggleAllAppsSearch();
} else {
- mTaskbarActivityContext.toggleAllAppsSearch();
+ taskbar.toggleAllAppsSearch();
}
}
@@ -375,8 +398,8 @@
* progress.
*/
public AnimatorPlaybackController createLauncherStartFromSuwAnim(int duration) {
- return mTaskbarActivityContext == null
- ? null : mTaskbarActivityContext.createLauncherStartFromSuwAnim(duration);
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(getDefaultDisplayId());
+ return taskbar == null ? null : taskbar.createLauncherStartFromSuwAnim(duration);
}
/**
@@ -386,7 +409,7 @@
mUserUnlocked = true;
DisplayController.INSTANCE.get(mContext).addChangeListener(mRecreationListener);
recreateTaskbar();
- addTaskbarRootViewToWindow();
+ addTaskbarRootViewToWindow(getDefaultDisplayId());
}
/**
@@ -429,8 +452,9 @@
mActivityOnDestroyCallback.run();
}
mRecentsViewContainer = recentsViewContainer;
- if (mTaskbarActivityContext != null) {
- mTaskbarActivityContext.setUIController(
+ TaskbarActivityContext taskbar = getCurrentActivityContext();
+ if (taskbar != null) {
+ taskbar.setUIController(
createTaskbarUIControllerForRecentsViewContainer(mRecentsViewContainer));
}
}
@@ -472,11 +496,21 @@
/**
* This method is called multiple times (ex. initial init, then when user unlocks) in which case
- * we fully want to destroy an existing taskbar and create a new one.
+ * we fully want to destroy the existing default display's taskbar and create a new one.
* In other case (folding/unfolding) we don't need to remove and add window.
*/
@VisibleForTesting
public synchronized void recreateTaskbar() {
+ // TODO: make this recreate all taskbars in map.
+ recreateTaskbarForDisplay(getDefaultDisplayId());
+ }
+
+ /**
+ * This method is called multiple times (ex. initial init, then when user unlocks) in which case
+ * we fully want to destroy an existing taskbar for a specified display and create a new one.
+ * In other case (folding/unfolding) we don't need to remove and add window.
+ */
+ private void recreateTaskbarForDisplay(int displayId) {
Trace.beginSection("recreateTaskbar");
try {
DeviceProfile dp = mUserUnlocked ?
@@ -486,7 +520,7 @@
final boolean isLargeScreenTaskbar = dp != null && dp.isTaskbarPresent;
mAllAppsActionManager.setTaskbarPresent(isLargeScreenTaskbar);
- destroyExistingTaskbar();
+ destroyTaskbarForDisplay(displayId);
boolean isTaskbarEnabled = dp != null && isTaskbarEnabled(dp);
debugWhyTaskbarNotDestroyed("recreateTaskbar: isTaskbarEnabled=" + isTaskbarEnabled
@@ -501,29 +535,32 @@
}
}
- if (enableTaskbarNoRecreate() || mTaskbarActivityContext == null) {
- mTaskbarActivityContext = new TaskbarActivityContext(mContext,
- mNavigationBarPanelContext, dp, mNavButtonController,
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(displayId);
+ if (enableTaskbarNoRecreate() || taskbar == null) {
+ taskbar = new TaskbarActivityContext(mContext,
+ mNavigationBarPanelContext, dp, mDefaultNavButtonController,
mUnfoldProgressProvider, mDesktopVisibilityController);
} else {
- mTaskbarActivityContext.updateDeviceProfile(dp);
+ taskbar.updateDeviceProfile(dp);
}
mSharedState.startTaskbarVariantIsTransient =
- DisplayController.isTransientTaskbar(mTaskbarActivityContext);
+ DisplayController.isTransientTaskbar(taskbar);
mSharedState.allAppsVisible = mSharedState.allAppsVisible && isLargeScreenTaskbar;
- mTaskbarActivityContext.init(mSharedState);
+ taskbar.init(mSharedState);
if (mRecentsViewContainer != null) {
- mTaskbarActivityContext.setUIController(
+ taskbar.setUIController(
createTaskbarUIControllerForRecentsViewContainer(mRecentsViewContainer));
}
if (enableTaskbarNoRecreate()) {
- addTaskbarRootViewToWindow();
- mTaskbarRootLayout.removeAllViews();
- mTaskbarRootLayout.addView(mTaskbarActivityContext.getDragLayer());
- mTaskbarActivityContext.notifyUpdateLayoutParams();
+ addTaskbarRootViewToWindow(displayId);
+ FrameLayout taskbarRootLayout = getTaskbarRootLayoutForDisplay(displayId);
+ taskbarRootLayout.removeAllViews();
+ taskbarRootLayout.addView(taskbar.getDragLayer());
+ taskbar.notifyUpdateLayoutParams();
}
+ addTaskbarToMap(displayId, taskbar);
} finally {
Trace.endSection();
}
@@ -535,14 +572,15 @@
mSharedState.sysuiStateFlags, QuickStepContract::getSystemUiStateString));
}
mSharedState.sysuiStateFlags = systemUiStateFlags;
- if (mTaskbarActivityContext != null) {
- mTaskbarActivityContext.updateSysuiStateFlags(systemUiStateFlags, false /* fromInit */);
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(getDefaultDisplayId());
+ if (taskbar != null) {
+ taskbar.updateSysuiStateFlags(systemUiStateFlags, false /* fromInit */);
}
}
public void onLongPressHomeEnabled(boolean assistantLongPressEnabled) {
- if (mNavButtonController != null) {
- mNavButtonController.setAssistantLongPressEnabled(assistantLongPressEnabled);
+ if (mDefaultNavButtonController != null) {
+ mDefaultNavButtonController.setAssistantLongPressEnabled(assistantLongPressEnabled);
}
}
@@ -551,46 +589,53 @@
*/
public void setSetupUIVisible(boolean isVisible) {
mSharedState.setupUIVisible = isVisible;
- if (mTaskbarActivityContext != null) {
- mTaskbarActivityContext.setSetupUIVisible(isVisible);
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(getDefaultDisplayId());
+ if (taskbar != null) {
+ taskbar.setSetupUIVisible(isVisible);
}
}
public void setWallpaperVisible(boolean isVisible) {
mSharedState.wallpaperVisible = isVisible;
- if (mTaskbarActivityContext != null) {
- mTaskbarActivityContext.setWallpaperVisible(isVisible);
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(getDefaultDisplayId());
+ if (taskbar != null) {
+ taskbar.setWallpaperVisible(isVisible);
}
}
public void checkNavBarModes(int displayId) {
- if (mTaskbarActivityContext != null) {
- mTaskbarActivityContext.checkNavBarModes();
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(displayId);
+ if (taskbar != null) {
+ taskbar.checkNavBarModes();
}
}
public void finishBarAnimations(int displayId) {
- if (mTaskbarActivityContext != null) {
- mTaskbarActivityContext.finishBarAnimations();
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(displayId);
+ if (taskbar != null) {
+ taskbar.finishBarAnimations();
}
}
public void touchAutoDim(int displayId, boolean reset) {
- if (mTaskbarActivityContext != null) {
- mTaskbarActivityContext.touchAutoDim(reset);
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(displayId);
+ if (taskbar != null) {
+ taskbar.touchAutoDim(reset);
}
}
public void transitionTo(int displayId, @BarTransitions.TransitionMode int barMode,
boolean animate) {
- if (mTaskbarActivityContext != null) {
- mTaskbarActivityContext.transitionTo(barMode, animate);
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(displayId);
+ if (taskbar != null) {
+ taskbar.transitionTo(barMode, animate);
}
}
public void appTransitionPending(boolean pending) {
- if (mTaskbarActivityContext != null) {
- mTaskbarActivityContext.appTransitionPending(pending);
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(getDefaultDisplayId());
+ if (taskbar != null) {
+ taskbar.appTransitionPending(pending);
}
}
@@ -599,8 +644,9 @@
}
public void onRotationProposal(int rotation, boolean isValid) {
- if (mTaskbarActivityContext != null) {
- mTaskbarActivityContext.onRotationProposal(rotation, isValid);
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(getDefaultDisplayId());
+ if (taskbar != null) {
+ taskbar.onRotationProposal(rotation, isValid);
}
}
@@ -608,38 +654,43 @@
mSharedState.disableNavBarDisplayId = displayId;
mSharedState.disableNavBarState1 = state1;
mSharedState.disableNavBarState2 = state2;
- if (mTaskbarActivityContext != null) {
- mTaskbarActivityContext.disableNavBarElements(displayId, state1, state2, animate);
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(displayId);
+ if (taskbar != null) {
+ taskbar.disableNavBarElements(displayId, state1, state2, animate);
}
}
public void onSystemBarAttributesChanged(int displayId, int behavior) {
mSharedState.systemBarAttrsDisplayId = displayId;
mSharedState.systemBarAttrsBehavior = behavior;
- if (mTaskbarActivityContext != null) {
- mTaskbarActivityContext.onSystemBarAttributesChanged(displayId, behavior);
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(displayId);
+ if (taskbar != null) {
+ taskbar.onSystemBarAttributesChanged(displayId, behavior);
}
}
public void onTransitionModeUpdated(int barMode, boolean checkBarModes) {
mSharedState.barMode = barMode;
- if (mTaskbarActivityContext != null) {
- mTaskbarActivityContext.onTransitionModeUpdated(barMode, checkBarModes);
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(getDefaultDisplayId());
+ if (taskbar != null) {
+ taskbar.onTransitionModeUpdated(barMode, checkBarModes);
}
}
public void onNavButtonsDarkIntensityChanged(float darkIntensity) {
mSharedState.navButtonsDarkIntensity = darkIntensity;
- if (mTaskbarActivityContext != null) {
- mTaskbarActivityContext.onNavButtonsDarkIntensityChanged(darkIntensity);
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(getDefaultDisplayId());
+ if (taskbar != null) {
+ taskbar.onNavButtonsDarkIntensityChanged(darkIntensity);
}
}
public void onNavigationBarLumaSamplingEnabled(int displayId, boolean enable) {
mSharedState.mLumaSamplingDisplayId = displayId;
mSharedState.mIsLumaSamplingEnabled = enable;
- if (mTaskbarActivityContext != null) {
- mTaskbarActivityContext.onNavigationBarLumaSamplingEnabled(displayId, enable);
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(displayId);
+ if (taskbar != null) {
+ taskbar.onNavigationBarLumaSamplingEnabled(displayId, enable);
}
}
@@ -666,8 +717,7 @@
debugWhyTaskbarNotDestroyed("TaskbarManager#destroy()");
removeActivityCallbacksAndListeners();
mTaskbarBroadcastReceiver.unregisterReceiverSafely(mContext);
- destroyExistingTaskbar();
- removeTaskbarRootViewFromWindow();
+ destroyAllTaskbars();
if (mUserUnlocked) {
DisplayController.INSTANCE.get(mContext).removeChangeListener(mRecreationListener);
}
@@ -676,38 +726,112 @@
SettingsCache.INSTANCE.get(mContext)
.unregister(NAV_BAR_KIDS_MODE, mOnSettingsChangeListener);
Log.d(TASKBAR_NOT_DESTROYED_TAG, "unregistering component callbacks from destroy().");
- mContext.unregisterComponentCallbacks(mComponentCallbacks);
+ mContext.unregisterComponentCallbacks(mDefaultComponentCallbacks);
mShutdownReceiver.unregisterReceiverSafely(mContext);
}
public @Nullable TaskbarActivityContext getCurrentActivityContext() {
- return mTaskbarActivityContext;
+ return getTaskbarForDisplay(mContext.getDisplayId());
}
public void dumpLogs(String prefix, PrintWriter pw) {
pw.println(prefix + "TaskbarManager:");
- if (mTaskbarActivityContext == null) {
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(getDefaultDisplayId());
+ if (taskbar == null) {
pw.println(prefix + "\tTaskbarActivityContext: null");
} else {
- mTaskbarActivityContext.dumpLogs(prefix + "\t", pw);
+ taskbar.dumpLogs(prefix + "\t", pw);
}
}
- private void addTaskbarRootViewToWindow() {
- if (enableTaskbarNoRecreate() && !mAddedWindow && mTaskbarActivityContext != null) {
- mWindowManager.addView(mTaskbarRootLayout,
- mTaskbarActivityContext.getWindowLayoutParams());
+ private void addTaskbarRootViewToWindow(int displayId) {
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(displayId);
+ if (enableTaskbarNoRecreate() && !mAddedWindow && taskbar != null) {
+ mWindowManager.addView(getTaskbarRootLayoutForDisplay(displayId),
+ taskbar.getWindowLayoutParams());
mAddedWindow = true;
}
}
- private void removeTaskbarRootViewFromWindow() {
- if (enableTaskbarNoRecreate() && mAddedWindow) {
- mWindowManager.removeViewImmediate(mTaskbarRootLayout);
+ private void removeTaskbarRootViewFromWindow(int displayId) {
+ FrameLayout rootLayout = getTaskbarRootLayoutForDisplay(displayId);
+ if (enableTaskbarNoRecreate() && mAddedWindow && rootLayout != null) {
+ mWindowManager.removeViewImmediate(rootLayout);
mAddedWindow = false;
+ removeTaskbarRootLayoutFromMap(displayId);
}
}
+ /**
+ * Returns the {@link TaskbarActivityContext} associated with the given display ID.
+ *
+ * @param displayId The ID of the display to retrieve the taskbar for.
+ * @return The {@link TaskbarActivityContext} for the specified display, or
+ * {@code null} if no taskbar is associated with that display.
+ */
+ private TaskbarActivityContext getTaskbarForDisplay(int displayId) {
+ return mTaskbars.get(displayId);
+ }
+
+ /**
+ * Adds the {@link TaskbarActivityContext} associated with the given display ID to taskbar
+ * map if there is not already a taskbar mapped to that displayId.
+ *
+ * @param displayId The ID of the display to retrieve the taskbar for.
+ * @param newTaskbar The new {@link TaskbarActivityContext} to add to the map.
+ */
+ private void addTaskbarToMap(int displayId, TaskbarActivityContext newTaskbar) {
+ if (!mTaskbars.contains(displayId)) {
+ mTaskbars.put(displayId, newTaskbar);
+ }
+ }
+
+ /**
+ * Removes the taskbar associated with the given display ID from the taskbar map.
+ *
+ * @param displayId The ID of the display for which to remove the taskbar.
+ */
+ private void removeTaskbarFromMap(int displayId) {
+ mTaskbars.delete(displayId);
+ }
+
+ /**
+ * Retrieves the root layout of the taskbar for the specified display.
+ *
+ * @param displayId The ID of the display for which to retrieve the taskbar root layout.
+ * @return The taskbar root layout {@link FrameLayout} for a given display or {@code null}.
+ */
+ private FrameLayout getTaskbarRootLayoutForDisplay(int displayId) {
+ return mRootLayouts.get(displayId);
+ }
+
+ /**
+ * Adds the taskbar root layout {@link FrameLayout} to taskbar map, mapped to display ID.
+ *
+ * @param displayId The ID of the display to associate with the taskbar root layout.
+ * @param rootLayout The taskbar root layout {@link FrameLayout} to add to the map.
+ */
+ private void addTaskbarRootLayoutToMap(int displayId, FrameLayout rootLayout) {
+ if (!mRootLayouts.contains(displayId)) {
+ mRootLayouts.put(displayId, rootLayout);
+ }
+ }
+
+ /**
+ * Removes taskbar root layout {@link FrameLayout} for given display ID from the taskbar map.
+ *
+ * @param displayId The ID of the display for which to remove the taskbar root layout.
+ */
+ private void removeTaskbarRootLayoutFromMap(int displayId) {
+ if (mRootLayouts.contains(displayId)) {
+ mRootLayouts.delete(displayId);
+ }
+ }
+
+ private int getDefaultDisplayId() {
+ return mContext.getDisplayId();
+ }
+
/** Temp logs for b/254119092. */
public void debugWhyTaskbarNotDestroyed(String debugReason) {
StringJoiner log = new StringJoiner("\n");
@@ -749,4 +873,9 @@
private final DeviceProfile.OnDeviceProfileChangeListener mDebugActivityDeviceProfileChanged =
dp -> debugWhyTaskbarNotDestroyed("mActivity onDeviceProfileChanged");
+
+ @VisibleForTesting
+ public Context getWindowContext() {
+ return mContext;
+ }
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarModelCallbacks.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarModelCallbacks.java
index c20617d..f905c5f 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarModelCallbacks.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarModelCallbacks.java
@@ -208,7 +208,7 @@
private void commitHotseatItemUpdates(
ItemInfo[] hotseatItemInfos, List<GroupTask> recentTasks) {
- mContainer.updateHotseatItems(hotseatItemInfos, recentTasks);
+ mContainer.updateItems(hotseatItemInfos, recentTasks);
mControllers.taskbarViewController.updateIconViewsRunningStates();
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarNavButtonController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarNavButtonController.java
index d4764c7..4881836 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarNavButtonController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarNavButtonController.java
@@ -16,7 +16,8 @@
package com.android.launcher3.taskbar;
-import static android.view.MotionEvent.ACTION_UP;
+import static android.view.KeyEvent.ACTION_DOWN;
+import static android.view.KeyEvent.ACTION_UP;
import static com.android.internal.app.AssistUtils.INVOCATION_TYPE_HOME_BUTTON_LONG_PRESS;
import static com.android.internal.app.AssistUtils.INVOCATION_TYPE_KEY;
@@ -38,6 +39,7 @@
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
+import android.os.SystemClock;
import android.util.Log;
import android.view.HapticFeedbackConstants;
import android.view.KeyEvent;
@@ -78,6 +80,7 @@
private long mLastScreenPinLongPress;
private boolean mScreenPinned;
private boolean mAssistantLongPressEnabled;
+ private int mLastSentBackAction = ACTION_UP;
@Override
public void dumpLogs(String prefix, PrintWriter pw) {
@@ -85,6 +88,8 @@
pw.println(prefix + "\tmLastScreenPinLongPress=" + mLastScreenPinLongPress);
pw.println(prefix + "\tmScreenPinned=" + mScreenPinned);
+ pw.println(prefix + "\tmLastSentBackAction="
+ + KeyEvent.actionToString(mLastSentBackAction));
}
@Retention(RetentionPolicy.SOURCE)
@@ -141,6 +146,11 @@
if (buttonType == BUTTON_SPACE) {
return;
}
+ if (predictiveBackThreeButtonNav() && mLastSentBackAction == ACTION_DOWN) {
+ Log.i(TAG, "Button click ignored while back button is pressed");
+ // prevent interactions with other buttons while back button is pressed
+ return;
+ }
// Provide the same haptic feedback that the system offers for virtual keys.
view.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);
switch (buttonType) {
@@ -180,6 +190,13 @@
if (buttonType == BUTTON_SPACE) {
return false;
}
+ if (predictiveBackThreeButtonNav() && mLastSentBackAction == ACTION_DOWN
+ && buttonType != BUTTON_BACK && buttonType != BUTTON_RECENTS) {
+ // prevent interactions with other buttons while back button is pressed (except back
+ // and recents button for screen-unpin action).
+ Log.i(TAG, "Button long click ignored while back button is pressed");
+ return false;
+ }
// Provide the same haptic feedback that the system offers for long press.
// The haptic feedback from long pressing on the home button is handled by circle to search.
@@ -327,13 +344,27 @@
mCallbacks.onToggleOverview();
}
- void executeBack(@Nullable KeyEvent keyEvent) {
+ void sendBackKeyEvent(int action, boolean cancelled) {
+ if (action == mLastSentBackAction) {
+ // There must always be an alternating sequence of ACTION_DOWN and ACTION_UP events
+ return;
+ }
+ long time = SystemClock.uptimeMillis();
+ KeyEvent keyEvent = new KeyEvent(time, time, action, KeyEvent.KEYCODE_BACK, 0);
+ if (cancelled) {
+ keyEvent.cancel();
+ }
+ executeBack(keyEvent);
+ }
+
+ private void executeBack(@Nullable KeyEvent keyEvent) {
if (keyEvent == null || (keyEvent.getAction() == ACTION_UP && !keyEvent.isCanceled())) {
logEvent(LAUNCHER_TASKBAR_BACK_BUTTON_TAP);
mContextualEduStatsManager.updateEduStats(/* isTrackpadGesture= */ false,
GestureType.BACK);
}
mSystemUiProxy.onBackEvent(keyEvent);
+ mLastSentBackAction = keyEvent != null ? keyEvent.getAction() : ACTION_UP;
}
private void onImeSwitcherPress() {
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarOverflowView.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarOverflowView.java
index 712478e..8775766 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarOverflowView.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarOverflowView.java
@@ -41,6 +41,7 @@
import com.android.launcher3.R;
import com.android.launcher3.Reorderable;
import com.android.launcher3.Utilities;
+import com.android.launcher3.icons.IconNormalizer;
import com.android.launcher3.util.MultiTranslateDelegate;
import com.android.launcher3.util.Themes;
import com.android.systemui.shared.recents.model.Task;
@@ -68,8 +69,15 @@
private static final long LEAVE_BEHIND_ANIMATIONS_DELAY = 500L;
private static final long LEAVE_BEHIND_OPACITY_ANIMATION_DURATION = 100L;
private static final long LEAVE_BEHIND_SIZE_ANIMATION_DURATION = 500L;
+ private static final float LEAVE_BEHIND_SIZE_SCALE_DOWN_MULTIPLIER = 0.83f;
private static final int MAX_ITEMS_IN_PREVIEW = 4;
+ // The height divided by the width of the horizontal box containing two overlapping app icons.
+ // According to the spec, this ratio is constant for different sizes of taskbar app icons.
+ // Assuming the width of this box = taskbar app icon size - 2 paddings - 2 stroke widths, and
+ // the height = width * 0.61, which is also equal to the height of a single item in the preview.
+ private static final float TWO_ITEM_ICONS_BOX_ASPECT_RATIO = 0.61f;
+
private static final FloatProperty<TaskbarOverflowView> ITEM_ICON_CENTER_OFFSET =
new FloatProperty<>("itemIconCenterOffset") {
@Override
@@ -208,9 +216,24 @@
icon.mIconSize = iconSize;
icon.mPadding = padding;
- final float radius = iconSize / 2f - padding;
- final float size = radius + icon.mItemIconStrokeWidth;
- icon.mItemIconCenterOffsetDefault = radius - size / 2 - icon.mItemIconStrokeWidth;
+ final float taskbarIconRadius =
+ iconSize * IconNormalizer.ICON_VISIBLE_AREA_FACTOR / 2f - padding;
+
+ icon.mLeaveBehindSizeDefault = taskbarIconRadius; // 1/2 of taskbar app icon size
+ icon.mLeaveBehindSizeScaledDown =
+ icon.mLeaveBehindSizeDefault * LEAVE_BEHIND_SIZE_SCALE_DOWN_MULTIPLIER;
+ icon.mLeaveBehindSize = icon.mLeaveBehindSizeScaledDown;
+
+ icon.mItemIconStrokeWidthDefault = taskbarIconRadius / 5f; // 1/10 of taskbar app icon size
+ icon.mItemIconStrokeWidth = icon.mItemIconStrokeWidthDefault;
+
+ icon.mItemIconSizeDefault = 2 * (taskbarIconRadius - icon.mItemIconStrokeWidthDefault)
+ * TWO_ITEM_ICONS_BOX_ASPECT_RATIO;
+ icon.mItemIconSizeScaledDown = icon.mLeaveBehindSizeScaledDown;
+ icon.mItemIconSize = icon.mItemIconSizeDefault;
+
+ icon.mItemIconCenterOffsetDefault = taskbarIconRadius - icon.mItemIconSizeDefault / 2f
+ - icon.mItemIconStrokeWidthDefault;
icon.mItemIconCenterOffset = icon.mItemIconCenterOffsetDefault;
return icon;
@@ -222,22 +245,6 @@
mItemBackgroundColor = getContext().getColor(R.color.taskbar_background);
mLeaveBehindColor = Themes.getAttrColor(getContext(), android.R.attr.textColorTertiary);
- mItemIconSizeDefault = getResources().getDimension(
- R.dimen.taskbar_overflow_item_icon_size_default);
- mItemIconSizeScaledDown = getResources().getDimension(
- R.dimen.taskbar_overflow_item_icon_size_scaled_down);
- mItemIconSize = mItemIconSizeDefault;
-
- mItemIconStrokeWidthDefault = getResources().getDimension(
- R.dimen.taskbar_overflow_item_icon_stroke_width_default);
- mItemIconStrokeWidth = mItemIconStrokeWidthDefault;
-
- mLeaveBehindSizeDefault = getResources().getDimension(
- R.dimen.taskbar_overflow_leave_behind_size_default);
- mLeaveBehindSizeScaledDown = getResources().getDimension(
- R.dimen.taskbar_overflow_leave_behind_size_scaled_down);
- mLeaveBehindSize = mLeaveBehindSizeScaledDown;
-
setWillNotDraw(false);
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarRecentAppsController.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarRecentAppsController.kt
index 3d57de4..a059b22 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarRecentAppsController.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarRecentAppsController.kt
@@ -326,8 +326,8 @@
}
/**
- * Returns the hotseat items updated so that any item that points to a package with a running
- * task also references that task.
+ * Returns the hotseat items updated so that any item that points to a package+user with a
+ * running task also references that task.
*/
private fun updateHotseatItemsFromRunningTasks(
groupTasks: List<GroupTask>,
@@ -338,8 +338,10 @@
itemInfo
} else {
val foundTask =
- groupTasks.find { task -> task.task1.key.packageName == itemInfo.targetPackage }
- ?: return@map itemInfo
+ groupTasks.find { task ->
+ task.task1.key.packageName == itemInfo.targetPackage &&
+ task.task1.key.userId == itemInfo.user.identifier
+ } ?: return@map itemInfo
TaskItemInfo(foundTask.task1.key.id, itemInfo as WorkspaceItemInfo)
}
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java
index f7f5cf6..8b636dd 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java
@@ -195,6 +195,16 @@
return true;
}
+ public boolean isAnimatingToHotseat() {
+ return false;
+ }
+
+ /**
+ * Skips to the end of the animation to Hotseat - should only be used if
+ * {@link #isAnimatingToHotseat()} returns true.
+ */
+ public void endAnimationToHotseat() {}
+
/** Returns {@code true} if Taskbar is currently within overview. */
protected boolean isInOverviewUi() {
return false;
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java
index 8816a6d..130b9b7 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java
@@ -20,11 +20,14 @@
import static com.android.launcher3.BubbleTextView.DISPLAY_TASKBAR;
import static com.android.launcher3.Flags.enableCursorHoverStates;
import static com.android.launcher3.Flags.enableRecentsInTaskbar;
+import static com.android.launcher3.Flags.taskbarRecentsLayoutTransition;
import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_APP_PAIR;
import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_FOLDER;
import static com.android.launcher3.config.FeatureFlags.enableTaskbarPinning;
import static com.android.launcher3.icons.IconNormalizer.ICON_VISIBLE_AREA_FACTOR;
+import static java.util.function.Predicate.not;
+
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Canvas;
@@ -70,7 +73,9 @@
import com.android.wm.shell.shared.bubbles.BubbleBarLocation;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
+import java.util.Objects;
import java.util.function.Predicate;
/**
@@ -108,6 +113,8 @@
// Only non-null when device supports having a Taskbar Overflow button.
@Nullable private TaskbarOverflowView mTaskbarOverflowView;
+ private int mNextViewIndex;
+
/**
* Whether the divider is between Hotseat icons and Recents,
* instead of between All Apps button and Hotseat.
@@ -125,6 +132,8 @@
private final int mAllAppsButtonTranslationOffset;
+ private final int mNumStaticViews;
+
public TaskbarView(@NonNull Context context) {
this(context, null);
}
@@ -189,6 +198,9 @@
// TODO: Disable touch events on QSB otherwise it can crash.
mQsb = LayoutInflater.from(context).inflate(R.layout.search_container_hotseat, this, false);
+
+ mNumStaticViews = taskbarRecentsLayoutTransition() && !mActivityContext.isPhoneMode()
+ ? addStaticViews() : 0;
}
/**
@@ -249,6 +261,24 @@
&& (mIdealNumIcons > oldMaxNumIcons || mIdealNumIcons > mMaxNumIcons);
}
+ /**
+ * Pre-adds views that are always children of this view for LayoutTransition support.
+ * <p>
+ * Normally these views are removed and re-added when updating hotseat and recents. This
+ * approach does not behave well with LayoutTransition, so we instead need to add them
+ * initially and avoid removing them during updates.
+ */
+ private int addStaticViews() {
+ int numStaticViews = 1;
+ addView(mAllAppsButtonContainer);
+ if (mActivityContext.getDeviceProfile().isQsbInline) {
+ addView(mQsb, mIsRtl ? 1 : 0);
+ mQsb.setVisibility(View.INVISIBLE);
+ numStaticViews++;
+ }
+ return numStaticViews;
+ }
+
@Override
public void setVisibility(int visibility) {
boolean changed = getVisibility() != visibility;
@@ -359,15 +389,33 @@
if (!(view.getTag() instanceof CollectionInfo)) {
mActivityContext.getViewCache().recycleView(view.getSourceLayoutResId(), view);
}
+ if (view instanceof FolderIcon fi) {
+ // We should clear FolderInfo's Folder and FolderIcon to avoid memory leak.
+ fi.removeListeners();
+ }
view.setTag(null);
}
- /**
- * Inflates/binds the Hotseat views to show in the Taskbar given their ItemInfos.
- */
- protected void updateHotseatItems(ItemInfo[] hotseatItemInfos, List<GroupTask> recentTasks) {
- int nextViewIndex = 0;
- int numViewsAnimated = 0;
+ /** Inflates/binds the hotseat items and recent tasks to the view. */
+ protected void updateItems(ItemInfo[] hotseatItemInfos, List<GroupTask> recentTasks) {
+ // Filter out unsupported items.
+ hotseatItemInfos = Arrays.stream(hotseatItemInfos)
+ .filter(Objects::nonNull)
+ .toArray(ItemInfo[]::new);
+ // TODO(b/343289567 and b/316004172): support app pairs and desktop mode.
+ recentTasks = recentTasks.stream().filter(not(GroupTask::supportsMultipleTasks)).toList();
+
+ if (taskbarRecentsLayoutTransition()) {
+ updateItemsWithLayoutTransition(hotseatItemInfos, recentTasks);
+ } else {
+ updateItemsWithoutLayoutTransition(hotseatItemInfos, recentTasks);
+ }
+ }
+
+ private void updateItemsWithoutLayoutTransition(
+ ItemInfo[] hotseatItemInfos, List<GroupTask> recentTasks) {
+
+ mNextViewIndex = 0;
mAddedDividerForRecents = false;
removeView(mAllAppsButtonContainer);
@@ -380,12 +428,105 @@
}
removeView(mQsb);
- // Add Hotseat icons.
- for (ItemInfo hotseatItemInfo : hotseatItemInfos) {
- if (hotseatItemInfo == null) {
- continue;
- }
+ updateHotseatItems(hotseatItemInfos);
+ if (mTaskbarDividerContainer != null && !recentTasks.isEmpty()) {
+ addView(mTaskbarDividerContainer, mNextViewIndex++);
+ mAddedDividerForRecents = true;
+ }
+
+ updateRecents(recentTasks);
+
+ addView(mAllAppsButtonContainer, mIsRtl ? hotseatItemInfos.length : 0);
+
+ // If there are no recent tasks, add divider after All Apps (unless it's the only view).
+ if (!mAddedDividerForRecents
+ && mTaskbarDividerContainer != null
+ && getChildCount() > 1) {
+ addView(mTaskbarDividerContainer, mIsRtl ? (getChildCount() - 1) : 1);
+ }
+
+ if (mActivityContext.getDeviceProfile().isQsbInline) {
+ addView(mQsb, mIsRtl ? getChildCount() : 0);
+ // Always set QSB to invisible after re-adding.
+ mQsb.setVisibility(View.INVISIBLE);
+ }
+ }
+
+ private void updateItemsWithLayoutTransition(
+ ItemInfo[] hotseatItemInfos, List<GroupTask> recentTasks) {
+
+ // Skip static views and potential All Apps divider, if they are on the left.
+ mNextViewIndex = mIsRtl ? 0 : mNumStaticViews;
+ if (getChildAt(mNextViewIndex) == mTaskbarDividerContainer) {
+ mNextViewIndex++;
+ }
+
+ // Update left section.
+ if (mIsRtl) {
+ updateRecents(recentTasks.reversed());
+ } else {
+ updateHotseatItems(hotseatItemInfos);
+ }
+
+ // Now at theoretical position for recent apps divider.
+ updateRecentsDivider(!recentTasks.isEmpty());
+ if (getChildAt(mNextViewIndex) == mTaskbarDividerContainer) {
+ mNextViewIndex++;
+ }
+
+ // Update right section.
+ if (mIsRtl) {
+ updateHotseatItems(hotseatItemInfos);
+ } else {
+ updateRecents(recentTasks);
+ }
+
+ // Recents divider takes priority.
+ if (!mAddedDividerForRecents) {
+ updateAllAppsDivider();
+ }
+ }
+
+ private void updateRecentsDivider(boolean hasRecents) {
+ if (hasRecents && !mAddedDividerForRecents) {
+ mAddedDividerForRecents = true;
+
+ // Remove possible All Apps divider.
+ if (getChildAt(mNumStaticViews) == mTaskbarDividerContainer) {
+ mNextViewIndex--; // All Apps divider on the left. Need to account for removing it.
+ }
+ removeView(mTaskbarDividerContainer);
+
+ addView(mTaskbarDividerContainer, mNextViewIndex);
+ } else if (!hasRecents && mAddedDividerForRecents) {
+ mAddedDividerForRecents = false;
+ removeViewAt(mNextViewIndex);
+ }
+ }
+
+ private void updateAllAppsDivider() {
+ // Index where All Apps divider would be if it is already in Taskbar.
+ final int expectedAllAppsDividerIndex =
+ mIsRtl ? getChildCount() - mNumStaticViews - 1 : mNumStaticViews;
+ if (getChildAt(expectedAllAppsDividerIndex) == mTaskbarDividerContainer
+ && getChildCount() == mNumStaticViews + 1) {
+ // Only static views with divider so remove divider.
+ removeView(mTaskbarDividerContainer);
+ } else if (getChildAt(expectedAllAppsDividerIndex) != mTaskbarDividerContainer
+ && getChildCount() >= mNumStaticViews + 1) {
+ // Static views with at least one app icon so add divider. For RTL, add it after the
+ // icon that is at the expected index.
+ addView(
+ mTaskbarDividerContainer,
+ mIsRtl ? expectedAllAppsDividerIndex + 1 : expectedAllAppsDividerIndex);
+ }
+ }
+
+ private void updateHotseatItems(ItemInfo[] hotseatItemInfos) {
+ int numViewsAnimated = 0;
+
+ for (ItemInfo hotseatItemInfo : hotseatItemInfos) {
// Replace any Hotseat views with the appropriate type if it's not already that type.
final int expectedLayoutResId;
boolean isCollection = false;
@@ -401,8 +542,8 @@
}
View hotseatView = null;
- while (nextViewIndex < getChildCount()) {
- hotseatView = getChildAt(nextViewIndex);
+ while (isNextViewInSection(ItemInfo.class)) {
+ hotseatView = getChildAt(mNextViewIndex);
// see if the view can be reused
if ((hotseatView.getSourceLayoutResId() != expectedLayoutResId)
@@ -443,7 +584,7 @@
}
LayoutParams lp = new LayoutParams(mIconTouchSize, mIconTouchSize);
hotseatView.setPadding(mItemPadding, mItemPadding, mItemPadding, mItemPadding);
- addView(hotseatView, nextViewIndex, lp);
+ addView(hotseatView, mNextViewIndex, lp);
}
// Apply the Hotseat ItemInfos, or hide the view if there is none for a given index.
@@ -459,14 +600,15 @@
if (enableCursorHoverStates()) {
setHoverListenerForIcon(hotseatView);
}
- nextViewIndex++;
+ mNextViewIndex++;
}
- if (mTaskbarDividerContainer != null && !recentTasks.isEmpty()) {
- addView(mTaskbarDividerContainer, nextViewIndex++);
- mAddedDividerForRecents = true;
+ while (isNextViewInSection(ItemInfo.class)) {
+ removeAndRecycle(getChildAt(mNextViewIndex));
}
+ }
+ private void updateRecents(List<GroupTask> recentTasks) {
// At this point, the all apps button has not been added as a child view, but needs to be
// accounted for when comparing current icon count to max number of icons.
int nonTaskIconsToBeAdded = 1;
@@ -474,19 +616,11 @@
boolean supportsOverflow = Flags.taskbarOverflow();
int overflowSize = 0;
if (supportsOverflow) {
- int numberOfSupportedRecents = 0;
- for (GroupTask task : recentTasks) {
- // TODO(b/343289567 and b/316004172): support app pairs and desktop mode.
- if (!task.supportsMultipleTasks()) {
- ++numberOfSupportedRecents;
- }
- }
-
- mIdealNumIcons = nextViewIndex + numberOfSupportedRecents + nonTaskIconsToBeAdded;
+ mIdealNumIcons = mNextViewIndex + recentTasks.size() + nonTaskIconsToBeAdded;
overflowSize = mIdealNumIcons - mMaxNumIcons;
if (overflowSize > 0 && mTaskbarOverflowView != null) {
- addView(mTaskbarOverflowView, nextViewIndex++);
+ addView(mTaskbarOverflowView, mNextViewIndex++);
} else if (mTaskbarOverflowView != null) {
mTaskbarOverflowView.clearItems();
}
@@ -495,9 +629,10 @@
List<Task> overflownTasks = null;
// An extra item needs to be added to overflow button to account for the space taken up by
// the overflow button.
- final int itemsToAddToOverflow = overflowSize > 0 ? overflowSize + 1 : 0;
+ final int itemsToAddToOverflow =
+ (overflowSize > 0) ? Math.min(overflowSize + 1, recentTasks.size()) : 0;
if (overflowSize > 0) {
- overflownTasks = new ArrayList<Task>(itemsToAddToOverflow);
+ overflownTasks = new ArrayList<>(itemsToAddToOverflow);
}
// Add Recent/Running icons.
@@ -505,10 +640,6 @@
if (mTaskbarOverflowView != null && overflownTasks != null
&& overflownTasks.size() < itemsToAddToOverflow) {
// TODO(b/343289567 and b/316004172): support app pairs and desktop mode.
- if (task.supportsMultipleTasks()) {
- continue;
- }
-
overflownTasks.add(task.task1);
if (overflownTasks.size() == itemsToAddToOverflow) {
mTaskbarOverflowView.setItems(overflownTasks);
@@ -533,8 +664,8 @@
}
View recentIcon = null;
- while (nextViewIndex < getChildCount()) {
- recentIcon = getChildAt(nextViewIndex);
+ while (isNextViewInSection(GroupTask.class)) {
+ recentIcon = getChildAt(mNextViewIndex);
// see if the view can be reused
if ((recentIcon.getSourceLayoutResId() != expectedLayoutResId)
@@ -548,15 +679,11 @@
}
if (recentIcon == null) {
- if (isCollection) {
- // TODO(b/343289567 and b/316004172): support app pairs and desktop mode.
- continue;
- }
-
+ // TODO(b/343289567 and b/316004172): support app pairs and desktop mode.
recentIcon = inflate(expectedLayoutResId);
LayoutParams lp = new LayoutParams(mIconTouchSize, mIconTouchSize);
recentIcon.setPadding(mItemPadding, mItemPadding, mItemPadding, mItemPadding);
- addView(recentIcon, nextViewIndex, lp);
+ addView(recentIcon, mNextViewIndex, lp);
}
if (recentIcon instanceof BubbleTextView btv) {
@@ -566,29 +693,17 @@
if (enableCursorHoverStates()) {
setHoverListenerForIcon(recentIcon);
}
- nextViewIndex++;
+ mNextViewIndex++;
}
- // Remove remaining views
- while (nextViewIndex < getChildCount()) {
- removeAndRecycle(getChildAt(nextViewIndex));
+ while (isNextViewInSection(GroupTask.class)) {
+ removeAndRecycle(getChildAt(mNextViewIndex));
}
+ }
- addView(mAllAppsButtonContainer, mIsRtl ? hotseatItemInfos.length : 0);
-
- // If there are no recent tasks, add divider after All Apps (unless it's the only view).
- if (!mAddedDividerForRecents
- && mTaskbarDividerContainer != null
- && getChildCount() > 1) {
- addView(mTaskbarDividerContainer, mIsRtl ? (getChildCount() - 1) : 1);
- }
-
-
- if (mActivityContext.getDeviceProfile().isQsbInline) {
- addView(mQsb, mIsRtl ? getChildCount() : 0);
- // Always set QSB to invisible after re-adding.
- mQsb.setVisibility(View.INVISIBLE);
- }
+ private boolean isNextViewInSection(Class<?> tagClass) {
+ return mNextViewIndex < getChildCount()
+ && tagClass.isInstance(getChildAt(mNextViewIndex).getTag());
}
/** Binds the GroupTask to the BubbleTextView to be ready to present to the user. */
@@ -649,7 +764,7 @@
) {
return 0;
}
- Rect iconsBounds = getIconLayoutBounds();
+ Rect iconsBounds = getTransientTaskbarIconLayoutBoundsInParent();
return getTaskBarIconsEndForBubbleBarLocation(location) - iconsBounds.right;
}
@@ -777,26 +892,46 @@
}
/**
- * Returns whether the given MotionEvent, *in screen coorindates*, is within any Taskbar item's
+ * Returns whether the given MotionEvent, *in screen coordinates*, is within any Taskbar item's
* touch bounds.
*/
public boolean isEventOverAnyItem(MotionEvent ev) {
getLocationOnScreen(mTempOutLocation);
- int xInOurCoordinates = (int) ev.getX() - mTempOutLocation[0];
- int yInOurCoorindates = (int) ev.getY() - mTempOutLocation[1];
- return isShown() && mIconLayoutBounds.contains(xInOurCoordinates, yInOurCoorindates);
+ int xInOurCoordinates = (int) ev.getRawX() - mTempOutLocation[0];
+ int yInOurCoordinates = (int) ev.getRawY() - mTempOutLocation[1];
+ return isShown() && getTaskbarIconsActualBounds().contains(xInOurCoordinates,
+ yInOurCoordinates);
+ }
+
+ /**
+ * Returns the current visual taskbar icons bounds (unlike `mIconLayoutBounds` which contains
+ * bounds for transient mode only).
+ */
+ private Rect getTaskbarIconsActualBounds() {
+ View[] iconViews = getIconViews();
+ if (iconViews.length == 0) {
+ return new Rect();
+ }
+
+ int[] firstIconViewLocation = new int[2];
+ int[] lastIconViewLocation = new int[2];
+ iconViews[0].getLocationOnScreen(firstIconViewLocation);
+ iconViews[iconViews.length - 1].getLocationOnScreen(lastIconViewLocation);
+
+ return new Rect(firstIconViewLocation[0], 0, lastIconViewLocation[0] + mIconTouchSize,
+ getHeight());
}
/**
* Gets visual bounds of the taskbar view. The visual bounds correspond to the taskbar touch
* area, rather than layout placement in the parent view.
*/
- public Rect getIconLayoutVisualBounds() {
+ public Rect getTransientTaskbarIconLayoutBounds() {
return new Rect(mIconLayoutBounds);
}
/** Gets taskbar layout bounds in parent view. */
- public Rect getIconLayoutBounds() {
+ public Rect getTransientTaskbarIconLayoutBoundsInParent() {
Rect actualBounds = new Rect(mIconLayoutBounds);
actualBounds.top = getTop();
actualBounds.bottom = getBottom();
@@ -848,6 +983,13 @@
}
/**
+ * The max number of icon views the taskbar can have when taskbar overflow is enabled.
+ */
+ int getMaxNumIconViews() {
+ return mMaxNumIcons;
+ }
+
+ /**
* Returns the all apps button in the taskbar.
*/
public TaskbarAllAppsButtonContainer getAllAppsButtonContainer() {
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacks.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacks.java
index f65f307..4d77ab2 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacks.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacks.java
@@ -91,6 +91,7 @@
public View.OnTouchListener getTaskbarDividerRightClickListener() {
return (v, event) -> {
if (event.isFromSource(InputDevice.SOURCE_MOUSE)
+ && event.getAction() == MotionEvent.ACTION_DOWN
&& event.getButtonState() == MotionEvent.BUTTON_SECONDARY) {
mControllers.taskbarPinningController.showPinningView(v, getDividerCenterX());
return true;
@@ -202,6 +203,10 @@
private class TaskbarViewGestureListener extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onDown(@NonNull MotionEvent event) {
+ if (event.isFromSource(InputDevice.SOURCE_MOUSE)
+ && event.getButtonState() == MotionEvent.BUTTON_SECONDARY) {
+ maybeShowPinningView(event);
+ }
return true;
}
@@ -211,11 +216,16 @@
}
@Override
- public void onLongPress(MotionEvent event) {
- if (DisplayController.isPinnedTaskbar(mActivity)) {
- mControllers.taskbarPinningController.showPinningView(mTaskbarView,
- event.getRawX());
+ public void onLongPress(@NonNull MotionEvent event) {
+ maybeShowPinningView(event);
+ }
+
+ private void maybeShowPinningView(@NonNull MotionEvent event) {
+ if (!DisplayController.isPinnedTaskbar(mActivity) || mTaskbarView.isEventOverAnyItem(
+ event)) {
+ return;
}
+ mControllers.taskbarPinningController.showPinningView(mTaskbarView, event.getRawX());
}
}
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacksFactory.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacksFactory.kt
index 704d6cf..17da533 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacksFactory.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacksFactory.kt
@@ -38,7 +38,7 @@
super.triggerAllAppsButtonLongClick()
val contextualSearchInvoked =
- ContextualSearchInvoker.newInstance(activity).show(ENTRYPOINT_LONG_PRESS_META)
+ ContextualSearchInvoker(activity).show(ENTRYPOINT_LONG_PRESS_META)
if (contextualSearchInvoked) {
val runningPackage =
TopTaskTracker.INSTANCE[activity].getCachedTopTask(
@@ -59,8 +59,7 @@
}
open fun longPressAllAppsToStartContextualSearch(context: Context): Boolean =
- ContextualSearchInvoker.newInstance(context)
- .runContextualSearchInvocationChecksAndLogFailures()
+ ContextualSearchInvoker(context).runContextualSearchInvocationChecksAndLogFailures()
companion object {
@JvmStatic
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java
index bb4f07a..4acf2fe 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java
@@ -351,12 +351,17 @@
OneShotPreDrawListener.add(mTaskbarView, listener);
}
- public Rect getIconLayoutVisualBounds() {
- return mTaskbarView.getIconLayoutVisualBounds();
+ @VisibleForTesting
+ int getMaxNumIconViews() {
+ return mTaskbarView.getMaxNumIconViews();
}
- public Rect getIconLayoutBounds() {
- return mTaskbarView.getIconLayoutBounds();
+ public Rect getTransientTaskbarIconLayoutBounds() {
+ return mTaskbarView.getTransientTaskbarIconLayoutBounds();
+ }
+
+ public Rect getTransientTaskbarIconLayoutBoundsInParent() {
+ return mTaskbarView.getTransientTaskbarIconLayoutBoundsInParent();
}
public View[] getIconViews() {
@@ -554,14 +559,14 @@
if (mControllers.getSharedState().startTaskbarVariantIsTransient) {
float transY =
mTransientTaskbarDp.taskbarBottomMargin + (mTransientTaskbarDp.taskbarHeight
- - mTaskbarView.getIconLayoutVisualBounds().bottom)
+ - mTaskbarView.getTransientTaskbarIconLayoutBounds().bottom)
- (mPersistentTaskbarDp.taskbarHeight
- mTransientTaskbarDp.taskbarIconSize) / 2f;
taskbarIconTranslationYForPinningValue = mapRange(scale, 0f, transY);
} else {
float transY =
-mTransientTaskbarDp.taskbarBottomMargin + (mPersistentTaskbarDp.taskbarHeight
- - mTaskbarView.getIconLayoutVisualBounds().bottom)
+ - mTaskbarView.getTransientTaskbarIconLayoutBounds().bottom)
- (mTransientTaskbarDp.taskbarHeight
- mTransientTaskbarDp.taskbarIconSize) / 2f;
taskbarIconTranslationYForPinningValue = mapRange(scale, transY, 0f);
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarController.java b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarController.java
index e0814d3..987937e 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarController.java
@@ -115,7 +115,6 @@
private BubbleBarItem mSelectedBubble;
private TaskbarSharedState mSharedState;
- private ImeVisibilityChecker mImeVisibilityChecker;
private BubbleBarViewController mBubbleBarViewController;
private BubbleStashController mBubbleStashController;
private Optional<BubbleStashedHandleViewController> mBubbleStashedHandleViewController;
@@ -126,6 +125,8 @@
// Cache last sent top coordinate to avoid sending duplicate updates to shell
private int mLastSentBubbleBarTop;
+ private boolean mIsImeVisible = false;
+
/**
* Similar to {@link BubbleBarUpdate} but rather than {@link BubbleInfo}s it uses
* {@link BubbleBarBubble}s so that it can be used to update the views.
@@ -192,10 +193,8 @@
/** Initializes controllers. */
public void init(BubbleControllers bubbleControllers,
BubbleBarLocationListener bubbleBarLocationListener,
- ImeVisibilityChecker imeVisibilityChecker,
TaskbarSharedState sharedState) {
mSharedState = sharedState;
- mImeVisibilityChecker = imeVisibilityChecker;
mBubbleBarViewController = bubbleControllers.bubbleBarViewController;
mBubbleStashController = bubbleControllers.bubbleStashController;
mBubbleStashedHandleViewController = bubbleControllers.bubbleStashedHandleViewController;
@@ -234,6 +233,10 @@
boolean sysuiLocked = (flags & MASK_SYSUI_LOCKED) != 0;
mBubbleStashController.setSysuiLocked(sysuiLocked);
+ mIsImeVisible = (flags & SYSUI_STATE_IME_SHOWING) != 0;
+ if (mIsImeVisible) {
+ mBubbleBarViewController.onImeVisible();
+ }
}
//
@@ -309,8 +312,7 @@
// enabling gesture nav. also suppress animation if the bubble bar is hidden for sysui e.g.
// the shade is open, or we're locked.
final boolean suppressAnimation =
- update.initialState || mBubbleBarViewController.isHiddenForSysui()
- || mImeVisibilityChecker.isImeVisible();
+ update.initialState || mBubbleBarViewController.isHiddenForSysui() || mIsImeVisible;
if (update.initialState && mSharedState.hasSavedBubbles()) {
// clear restored state
@@ -572,12 +574,6 @@
mBubbleBarViewController.addBubble(bubble, isExpanding, suppressAnimation);
}
- /** Interface for checking whether the IME is visible. */
- public interface ImeVisibilityChecker {
- /** Whether the IME is visible. */
- boolean isImeVisible();
- }
-
/** Listener of {@link BubbleBarLocation} updates. */
public interface BubbleBarLocationListener {
diff --git a/quickstep/src/com/android/quickstep/task/viewmodel/TaskViewModel.kt b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarParentViewHeightUpdateNotifier.kt
similarity index 71%
rename from quickstep/src/com/android/quickstep/task/viewmodel/TaskViewModel.kt
rename to quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarParentViewHeightUpdateNotifier.kt
index ec75d59..f69ad74 100644
--- a/quickstep/src/com/android/quickstep/task/viewmodel/TaskViewModel.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarParentViewHeightUpdateNotifier.kt
@@ -14,12 +14,11 @@
* limitations under the License.
*/
-package com.android.quickstep.task.viewmodel
+package com.android.launcher3.taskbar.bubbles
-import androidx.lifecycle.ViewModel
+/** Controls the parent view height. */
+interface BubbleBarParentViewHeightUpdateNotifier {
-class TaskViewModel(private val taskViewData: TaskViewData) : ViewModel() {
- fun updateScale(scale: Float) {
- taskViewData.scale.value = scale
- }
+ /** Notify parent that top boundary should be updated. */
+ fun updateTopBoundary()
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarSwipeController.kt b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarSwipeController.kt
index 2d3642b..4b8924c 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarSwipeController.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarSwipeController.kt
@@ -91,7 +91,7 @@
when {
canUnstash() && swipeState.passedUnstash -> {
swipeState.currentState = COLLAPSED
- bubbleStashController.showBubbleBar(expandBubbles = false)
+ bubbleStashController.showBubbleBar(expandBubbles = false, bubbleBarGesture = true)
}
canStash() && !swipeState.passedUnstash -> {
swipeState.currentState = STASHED
@@ -103,7 +103,7 @@
/** Finish tracking swipe gesture. Animate views back to resting state */
fun finish() {
if (swipeState.passedUnstash && swipeState.startState in setOf(STASHED, COLLAPSED)) {
- bubbleStashController.showBubbleBar(expandBubbles = true)
+ bubbleStashController.showBubbleBar(expandBubbles = true, bubbleBarGesture = true)
}
if (animatedSwipeTranslation.value == 0f) {
reset()
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarView.java b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarView.java
index c5c2d69..37c6194 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarView.java
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarView.java
@@ -81,6 +81,7 @@
public static final long FADE_OUT_ANIM_POSITION_DURATION_MS = 100L;
public static final long FADE_IN_ANIM_ALPHA_DURATION_MS = 100L;
+ public static final long FADE_OUT_BUBBLE_BAR_DURATION_MS = 150L;
private static final String TAG = "BubbleBarView";
// TODO: (b/273594744) calculate the amount of space we have and base the max on that
// if it's smaller than 5.
@@ -146,6 +147,9 @@
// collapsed state and 1 to the fully expanded state.
private ValueAnimator mWidthAnimator = createExpansionAnimator(/* expanding = */ false);
+ @Nullable
+ private ValueAnimator mDismissAnimator = null;
+
/** An animator used for animating individual bubbles in the bubble bar while expanded. */
@Nullable
private BubbleAnimator mBubbleAnimator = null;
@@ -381,6 +385,7 @@
super.onInitializeAccessibilityNodeInfoInternal(info);
// Always show only expand action as the menu is only for collapsed bubble bar
info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_EXPAND);
+ info.addAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_CLICK);
info.addAction(new AccessibilityNodeInfo.AccessibilityAction(R.id.action_dismiss_all,
getResources().getString(R.string.bubble_bar_action_dismiss_all)));
if (mBubbleBarLocation.isOnLeft(isLayoutRtl())) {
@@ -395,10 +400,8 @@
@Override
public boolean performAccessibilityActionInternal(int action,
@androidx.annotation.Nullable Bundle arguments) {
- if (super.performAccessibilityActionInternal(action, arguments)) {
- return true;
- }
- if (action == AccessibilityNodeInfo.ACTION_EXPAND) {
+ if (action == AccessibilityNodeInfo.ACTION_EXPAND
+ || action == AccessibilityNodeInfo.ACTION_CLICK) {
mController.expandBubbleBar();
return true;
}
@@ -416,7 +419,7 @@
BubbleBarLocation.UpdateSource.A11Y_ACTION_BAR);
return true;
}
- return false;
+ return super.performAccessibilityActionInternal(action, arguments);
}
@SuppressLint("RtlHardcoded")
@@ -456,7 +459,7 @@
return;
}
mDragging = dragging;
- setElevation(dragging ? mDragElevation : mBubbleElevation);
+ mController.setIsDragging(dragging);
if (!mDragging) {
// Relayout after dragging to ensure that the dragged bubble is positioned correctly
requestLayout();
@@ -799,11 +802,11 @@
/** Removes the given bubble from the bubble bar. */
public void removeBubble(View bubble) {
if (isExpanded()) {
- // TODO b/347062801 - animate the bubble bar if the last bubble is removed
final boolean dismissedByDrag = mDraggedBubbleView == bubble;
if (dismissedByDrag) {
mDismissedByDragBubbleView = mDraggedBubbleView;
}
+ boolean removingLastRemainingBubble = getBubbleChildCount() == 1;
int bubbleCount = getChildCount();
mBubbleAnimator = new BubbleAnimator(mIconSize, mExpandedBarIconsSpacing,
bubbleCount, mBubbleBarLocation.isOnLeft(isLayoutRtl()));
@@ -841,7 +844,10 @@
: bubbleIndex == bubbleCount - 1;
mBubbleAnimator.animateRemovedBubble(
indexOfChild(bubble), indexOfChild(mSelectedBubbleView), removingLastBubble,
- listener);
+ removingLastRemainingBubble, listener);
+ if (removingLastRemainingBubble && mDismissAnimator == null) {
+ createDismissAnimator().start();
+ }
} else {
removeView(bubble);
}
@@ -862,6 +868,28 @@
updateDotsAndBadgesIfCollapsed();
}
+ private ValueAnimator createDismissAnimator() {
+ ValueAnimator animator =
+ ValueAnimator.ofFloat(0, 1).setDuration(FADE_OUT_BUBBLE_BAR_DURATION_MS);
+ animator.setInterpolator(Interpolators.EMPHASIZED);
+ Runnable onEnd = () -> {
+ mDismissAnimator = null;
+ setAlpha(0);
+ };
+ addAnimationCallBacks(animator, /* onStart= */ null, onEnd,
+ /* onUpdate= */ anim -> setAlpha(1 - anim.getAnimatedFraction()));
+ mDismissAnimator = animator;
+ return animator;
+ }
+
+ /** Dismisses the bubble bar */
+ public void dismiss(Runnable onDismissed) {
+ if (mDismissAnimator == null) {
+ createDismissAnimator().start();
+ }
+ addAnimationCallBacks(mDismissAnimator, null, onDismissed, null);
+ }
+
/**
* Return child views in the order which they are shown on the screen.
* <p>
@@ -1307,6 +1335,10 @@
return getBubbleBarCollapsedHeight() + mPointerSize;
}
+ float getArrowHeight() {
+ return mPointerSize;
+ }
+
float getBubbleBarCollapsedHeight() {
// the pointer is invisible when collapsed
return getScaledIconSize() + mBubbleBarPadding * 2;
@@ -1575,5 +1607,8 @@
/** Requests the controller to update bubble bar location to the given value */
void updateBubbleBarLocation(BubbleBarLocation location,
@BubbleBarLocation.UpdateSource int source);
+
+ /** Notifies the controller that bubble bar is being dragged */
+ void setIsDragging(boolean dragging);
}
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java
index d842138..67d7901 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java
@@ -85,6 +85,7 @@
private final BubbleBarView mBarView;
private int mIconSize;
private int mBubbleBarPadding;
+ private final int mDragElevation;
// Initialized in init.
private BubbleStashController mBubbleStashController;
@@ -94,7 +95,6 @@
private TaskbarInsetsController mTaskbarInsetsController;
private TaskbarViewPropertiesProvider mTaskbarViewPropertiesProvider;
private View.OnClickListener mBubbleClickListener;
- private View.OnClickListener mBubbleBarClickListener;
private BubbleView.Controller mBubbleViewController;
private BubbleBarOverflow mOverflowBubble;
@@ -152,6 +152,8 @@
mBubbleBarAlpha = new MultiValueAlpha(mBarView, 1 /* num alpha channels */);
mIconSize = activity.getResources().getDimensionPixelSize(
R.dimen.bubblebar_icon_size);
+ mDragElevation = activity.getResources().getDimensionPixelSize(
+ R.dimen.bubblebar_drag_elevation);
mTaskbarTranslationDelta = getBubbleBarTranslationDeltaForTaskbar(activity);
}
@@ -168,20 +170,18 @@
mBubbleBarContainer, createFlyoutPositioner(), createFlyoutCallbacks());
mBubbleBarViewAnimator = new BubbleBarViewAnimator(
mBarView, mBubbleStashController, mBubbleBarFlyoutController,
- mBubbleBarController::showExpandedView);
+ createBubbleBarParentViewController(), mBubbleBarController::showExpandedView);
mTaskbarViewPropertiesProvider = taskbarViewPropertiesProvider;
onBubbleBarConfigurationChanged(/* animate= */ false);
mActivity.addOnDeviceProfileChangeListener(
dp -> onBubbleBarConfigurationChanged(/* animate= */ true));
mBubbleBarScaleY.updateValue(1f);
mBubbleClickListener = v -> onBubbleClicked((BubbleView) v);
- mBubbleBarClickListener = v -> expandBubbleBar();
mBubbleDragController.setupBubbleBarView(mBarView);
mOverflowBubble = bubbleControllers.bubbleCreator.createOverflow(mBarView);
if (!Flags.enableOptionalBubbleOverflow()) {
showOverflow(true);
}
- mBarView.setOnClickListener(mBubbleBarClickListener);
mBarView.addOnLayoutChangeListener(
(v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> {
mTaskbarInsetsController.onTaskbarOrBubblebarWindowHeightOrInsetsChanged();
@@ -208,7 +208,8 @@
@Override
public void expandBubbleBar() {
- BubbleBarViewController.this.expandBubbleBar();
+ BubbleBarViewController.this.setExpanded(
+ /* isExpanded= */ true, /* maybeShowEdu*/ true);
}
@Override
@@ -221,6 +222,11 @@
@BubbleBarLocation.UpdateSource int source) {
mBubbleBarController.updateBubbleBarLocation(location, source);
}
+
+ @Override
+ public void setIsDragging(boolean dragging) {
+ mBubbleBarContainer.setElevation(dragging ? mDragElevation : 0);
+ }
});
mBubbleViewController = new BubbleView.Controller() {
@@ -311,20 +317,18 @@
private FlyoutCallbacks createFlyoutCallbacks() {
return new FlyoutCallbacks() {
@Override
- public void extendTopBoundary(int space) {
- int defaultSize = mActivity.getDefaultTaskbarWindowSize();
- mActivity.setTaskbarWindowSize(defaultSize + space);
- }
-
- @Override
- public void resetTopBoundary() {
- mActivity.setTaskbarWindowSize(mActivity.getDefaultTaskbarWindowSize());
- }
-
- @Override
public void flyoutClicked() {
interruptAnimationForTouch();
- expandBubbleBar();
+ setExpanded(/* isExpanded= */ true, /* maybeShowEdu*/ true);
+ }
+ };
+ }
+
+ private BubbleBarParentViewHeightUpdateNotifier createBubbleBarParentViewController() {
+ return new BubbleBarParentViewHeightUpdateNotifier() {
+ @Override
+ public void updateTopBoundary() {
+ mActivity.setTaskbarWindowSize(mActivity.getDefaultTaskbarWindowSize());
}
};
}
@@ -352,25 +356,6 @@
mBubbleStashController.onNewBubbleAnimationInterrupted(false, mBarView.getTranslationY());
}
- private void expandBubbleBar() {
- if (mShouldShowEducation) {
- mShouldShowEducation = false;
- // Get the bubble bar bounds on screen
- Rect bounds = new Rect();
- mBarView.getBoundsOnScreen(bounds);
- // Calculate user education reference position in Screen coordinates
- Point position = new Point(bounds.centerX(), bounds.top);
- // Show user education relative to the reference point
- mSystemUiProxy.showUserEducation(position);
- } else {
- // ensure that the bubble bar has the correct translation. we may have just interrupted
- // the animation by touching the bubble bar.
- mBubbleBarTranslationY.animateToValue(mBubbleStashController.getBubbleBarTranslationY())
- .start();
- setExpanded(true);
- }
- }
-
private void collapseBubbleBar() {
setExpanded(false);
mBubbleStashController.stashBubbleBar();
@@ -383,6 +368,29 @@
}
}
+ /** Shows the education view if it was previously requested. */
+ private boolean maybeShowEduView() {
+ if (mShouldShowEducation) {
+ mShouldShowEducation = false;
+ // Get the bubble bar bounds on screen
+ Rect bounds = new Rect();
+ mBarView.getBoundsOnScreen(bounds);
+ // Calculate user education reference position in Screen coordinates
+ Point position = new Point(bounds.centerX(), bounds.top);
+ // Show user education relative to the reference point
+ mSystemUiProxy.showUserEducation(position);
+ return true;
+ }
+ return false;
+ }
+
+ /** Notifies that the IME became visible. */
+ public void onImeVisible() {
+ if (isAnimatingNewBubble()) {
+ mBubbleBarViewAnimator.interruptForIme();
+ }
+ }
+
//
// The below animators are exposed to BubbleStashController so it can manage the stashing
// animation.
@@ -432,6 +440,11 @@
return mBarView.getBubbleBarCollapsedHeight();
}
+ /** Returns the bubble bar arrow height.*/
+ public float getBubbleBarArrowHeight() {
+ return mBarView.getArrowHeight();
+ }
+
/**
* @see BubbleBarView#getRelativePivotX()
*/
@@ -565,19 +578,36 @@
return mHiddenForNoBubbles;
}
+ /** Returns maximum height of the bubble bar with the flyout view. */
+ public int getBubbleBarWithFlyoutMaximumHeight() {
+ if (!isBubbleBarVisible()) return 0;
+ int bubbleBarTopOnHome = (int) (mBubbleStashController.getBubbleBarVerticalCenterForHome()
+ + mBarView.getBubbleBarCollapsedHeight() / 2);
+ int result = (int) (bubbleBarTopOnHome + mBarView.getArrowHeight());
+ if (isAnimatingNewBubble()) {
+ // when animating new bubble add the maximum height of the flyout view
+ result += mBubbleBarFlyoutController.getMaximumFlyoutHeight();
+ }
+ return result;
+ }
+
/**
* Sets whether the bubble bar should be hidden because there are no bubbles.
*/
public void setHiddenForBubbles(boolean hidden) {
if (mHiddenForNoBubbles != hidden) {
mHiddenForNoBubbles = hidden;
- updateVisibilityForStateChange();
if (hidden) {
- mBarView.setAlpha(0);
- mBarView.setExpanded(false);
- adjustTaskbarAndHotseatToBubbleBarState(/* isBubbleBarExpanded = */ false);
+ mBarView.dismiss(() -> {
+ updateVisibilityForStateChange();
+ mBarView.setExpanded(false);
+ adjustTaskbarAndHotseatToBubbleBarState(/* isBubbleBarExpanded= */ false);
+ mActivity.bubbleBarVisibilityChanged(/* isVisible= */ false);
+ });
+ } else {
+ updateVisibilityForStateChange();
+ mActivity.bubbleBarVisibilityChanged(/* isVisible= */ true);
}
- mActivity.bubbleBarVisibilityChanged(!hidden);
}
}
@@ -610,7 +640,6 @@
}
}
- // TODO: (b/273592694) animate it
private void updateVisibilityForStateChange() {
if (!mHiddenForSysui && !mHiddenForNoBubbles && !mHiddenForStashed) {
mBarView.setVisibility(VISIBLE);
@@ -931,13 +960,25 @@
mBarView.setSelectedBubble(newlySelected.getView());
}
+ /** @see #setExpanded(boolean, boolean) */
+ public void setExpanded(boolean isExpanded) {
+ setExpanded(isExpanded, /* maybeShowEdu= */ false);
+ }
+
/**
* Sets whether the bubble bar should be expanded (not unstashed, but have the contents
* within it expanded). This method notifies SystemUI that the bubble bar is expanded and
* showing a selected bubble. This method should ONLY be called from UI events originating
* from Launcher.
+ *
+ * @param isExpanded whether the bar should be expanded
+ * @param maybeShowEdu whether we should show the edu view before expanding
*/
- public void setExpanded(boolean isExpanded) {
+ public void setExpanded(boolean isExpanded, boolean maybeShowEdu) {
+ // if we're trying to expand try showing the edu view instead
+ if (maybeShowEdu && isExpanded && !mBarView.isExpanded() && maybeShowEduView()) {
+ return;
+ }
if (!mBubbleBarPinning.isAnimating() && isExpanded != mBarView.isExpanded()) {
mBarView.setExpanded(isExpanded);
adjustTaskbarAndHotseatToBubbleBarState(isExpanded);
@@ -997,10 +1038,13 @@
}
}
- /** Marks as should show education and shows the bubble bar in a collapsed state */
+ /**
+ * Stores a request to show the education view for later processing when appropriate.
+ *
+ * @see #maybeShowEduView()
+ */
public void prepareToShowEducation() {
mShouldShowEducation = true;
- mBubbleStashController.showBubbleBar(false /* expand the bubbles */);
}
/**
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleControllers.java b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleControllers.java
index d993685..68917ff 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleControllers.java
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleControllers.java
@@ -89,7 +89,6 @@
);
bubbleBarController.init(this,
bubbleBarLocationListeners,
- taskbarControllers.navbarButtonsViewController::isImeVisible,
taskbarSharedState);
bubbleStashedHandleViewController.ifPresent(
controller -> controller.init(/* bubbleControllers = */ this));
@@ -103,7 +102,8 @@
new TaskbarViewPropertiesProvider() {
@Override
public Rect getTaskbarViewBounds() {
- return taskbarControllers.taskbarViewController.getIconLayoutBounds();
+ return taskbarControllers.taskbarViewController
+ .getTransientTaskbarIconLayoutBoundsInParent();
}
@Override
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleCreator.java b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleCreator.java
index c5efe2f..8b344cf 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleCreator.java
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleCreator.java
@@ -30,7 +30,6 @@
import android.content.pm.LauncherApps;
import android.content.pm.PackageManager;
import android.content.pm.ShortcutInfo;
-import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.Matrix;
@@ -217,14 +216,8 @@
private Bitmap createOverflowBitmap() {
Drawable iconDrawable = mContext.getDrawable(R.drawable.bubble_ic_overflow_button);
- final TypedArray ta = mContext.obtainStyledAttributes(
- new int[]{
- R.attr.materialColorOnPrimaryFixed,
- R.attr.materialColorPrimaryFixed
- });
- int overflowIconColor = ta.getColor(0, Color.WHITE);
- int overflowBackgroundColor = ta.getColor(1, Color.BLACK);
- ta.recycle();
+ int overflowIconColor = mContext.getColor(R.color.materialColorOnPrimaryFixed);
+ int overflowBackgroundColor = mContext.getColor(R.color.materialColorPrimaryFixed);
iconDrawable.setTint(overflowIconColor);
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleView.java b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleView.java
index c74fa9b..92fd5e8 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleView.java
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleView.java
@@ -351,14 +351,20 @@
.start();
}
- /** Suppresses or un-suppresses drawing the dot due to an update for this bubble. */
- public void suppressDotForBubbleUpdate(boolean suppress) {
- mDotSuppressedForBubbleUpdate = suppress;
- if (suppress) {
- setDotScale(0);
- } else {
- showDotIfNeeded(/* animate= */ false);
- }
+ /** Suppresses drawing the dot due to an update for this bubble. */
+ public void suppressDotForBubbleUpdate() {
+ mDotSuppressedForBubbleUpdate = true;
+ setDotScale(0);
+ }
+
+ /**
+ * Unsuppresses the dot after the bubble update finished animating.
+ *
+ * @param animate whether or not to animate the dot back in
+ */
+ public void unsuppressDotForBubbleUpdate(boolean animate) {
+ mDotSuppressedForBubbleUpdate = false;
+ showDotIfNeeded(animate);
}
boolean hasUnseenContent() {
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/animation/BubbleAnimator.kt b/quickstep/src/com/android/launcher3/taskbar/bubbles/animation/BubbleAnimator.kt
index 8af8ffb..3604167 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/animation/BubbleAnimator.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/animation/BubbleAnimator.kt
@@ -49,23 +49,30 @@
bubbleIndex: Int,
selectedBubbleIndex: Int,
removingLastBubble: Boolean,
- listener: Listener
+ removingLastRemainingBubble: Boolean,
+ listener: Listener,
) {
animator = createAnimator(listener)
- state = State.RemovingBubble(bubbleIndex, selectedBubbleIndex, removingLastBubble)
+ state =
+ State.RemovingBubble(
+ bubbleIndex = bubbleIndex,
+ selectedBubbleIndex = selectedBubbleIndex,
+ removingLastBubble = removingLastBubble,
+ removingLastRemainingBubble = removingLastRemainingBubble,
+ )
animator.start()
}
fun animateNewAndRemoveOld(
selectedBubbleIndex: Int,
removedBubbleIndex: Int,
- listener: Listener
+ listener: Listener,
) {
animator = createAnimator(listener)
state =
State.AddingAndRemoving(
selectedBubbleIndex = selectedBubbleIndex,
- removedBubbleIndex = removedBubbleIndex
+ removedBubbleIndex = removedBubbleIndex,
)
animator.start()
}
@@ -111,20 +118,22 @@
getBubbleTranslationXWhileScalingBubble(
bubbleIndex = bubbleIndex,
scalingBubbleIndex = 0,
- bubbleScale = animator.animatedFraction
+ bubbleScale = animator.animatedFraction,
)
+
is State.RemovingBubble ->
getBubbleTranslationXWhileScalingBubble(
bubbleIndex = bubbleIndex,
scalingBubbleIndex = state.bubbleIndex,
- bubbleScale = 1 - animator.animatedFraction
+ bubbleScale = 1 - animator.animatedFraction,
)
+
is State.AddingAndRemoving ->
getBubbleTranslationXWhileAddingBubbleAtLimit(
bubbleIndex = bubbleIndex,
removedBubbleIndex = state.removedBubbleIndex,
addedBubbleScale = animator.animatedFraction,
- removedBubbleScale = 1 - animator.animatedFraction
+ removedBubbleScale = 1 - animator.animatedFraction,
)
}
}
@@ -176,10 +185,11 @@
getBubbleTranslationXWhileScalingBubble(
bubbleIndex = state.selectedBubbleIndex,
scalingBubbleIndex = 0,
- bubbleScale = animator.animatedFraction
+ bubbleScale = animator.animatedFraction,
)
tx + iconSize / 2f
}
+
is State.RemovingBubble -> getArrowPositionWhenRemovingBubble(state)
is State.AddingAndRemoving -> {
// we never remove the selected bubble, so the arrow stays pointing to its center
@@ -188,22 +198,23 @@
bubbleIndex = state.selectedBubbleIndex,
removedBubbleIndex = state.removedBubbleIndex,
addedBubbleScale = animator.animatedFraction,
- removedBubbleScale = 1 - animator.animatedFraction
+ removedBubbleScale = 1 - animator.animatedFraction,
)
tx + iconSize / 2f
}
}
}
- private fun getArrowPositionWhenRemovingBubble(state: State.RemovingBubble): Float {
- return if (state.selectedBubbleIndex != state.bubbleIndex) {
- // if we're not removing the selected bubble, the selected bubble doesn't change so just
- // return the translation X of the selected bubble and add half icon
+ private fun getArrowPositionWhenRemovingBubble(state: State.RemovingBubble): Float =
+ if (state.selectedBubbleIndex != state.bubbleIndex || state.removingLastRemainingBubble) {
+ // if we're not removing the selected bubble or if we're removing the last remaining
+ // bubble, the selected bubble doesn't change so just return the translation X of the
+ // selected bubble and add half icon
val tx =
getBubbleTranslationXWhileScalingBubble(
bubbleIndex = state.selectedBubbleIndex,
scalingBubbleIndex = state.bubbleIndex,
- bubbleScale = 1 - animator.animatedFraction
+ bubbleScale = 1 - animator.animatedFraction,
)
tx + iconSize / 2f
} else {
@@ -238,7 +249,6 @@
}
}
}
- }
/**
* Returns the translation X for the bubble at index {@code bubbleIndex} when the bubble bar is
@@ -251,7 +261,7 @@
private fun getBubbleTranslationXWhileScalingBubble(
bubbleIndex: Int,
scalingBubbleIndex: Int,
- bubbleScale: Float
+ bubbleScale: Float,
): Float {
val iconAndSpacing = iconSize + expandedBarIconSpacing
// the bubble is scaling from the center, so we need to adjust its translation so
@@ -300,7 +310,7 @@
bubbleIndex: Int,
removedBubbleIndex: Int,
addedBubbleScale: Float,
- removedBubbleScale: Float
+ removedBubbleScale: Float,
): Float {
val iconAndSpacing = iconSize + expandedBarIconSpacing
// the bubbles are scaling from the center, so we need to adjust their translation so
@@ -377,7 +387,9 @@
/** The index of the selected bubble. */
val selectedBubbleIndex: Int,
/** Whether the bubble being removed is also the last bubble. */
- val removingLastBubble: Boolean
+ val removingLastBubble: Boolean,
+ /** Whether we're removing the last remaining bubble. */
+ val removingLastRemainingBubble: Boolean,
) : State
/** A new bubble is being added and an old bubble is being removed from the bubble bar. */
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimator.kt b/quickstep/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimator.kt
index 6c354f3..6f8943f 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimator.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimator.kt
@@ -25,6 +25,7 @@
import androidx.dynamicanimation.animation.SpringForce
import com.android.launcher3.R
import com.android.launcher3.taskbar.bubbles.BubbleBarBubble
+import com.android.launcher3.taskbar.bubbles.BubbleBarParentViewHeightUpdateNotifier
import com.android.launcher3.taskbar.bubbles.BubbleBarView
import com.android.launcher3.taskbar.bubbles.BubbleView
import com.android.launcher3.taskbar.bubbles.flyout.BubbleBarFlyoutController
@@ -39,6 +40,7 @@
private val bubbleBarView: BubbleBarView,
private val bubbleStashController: BubbleStashController,
private val bubbleBarFlyoutController: BubbleBarFlyoutController,
+ private val bubbleBarParentViewHeightUpdateNotifier: BubbleBarParentViewHeightUpdateNotifier,
private val onExpanded: Runnable,
private val scheduler: Scheduler = HandlerScheduler(bubbleBarView),
) {
@@ -342,7 +344,7 @@
scheduler.post(buildHandleToBubbleBarAnimation(initialVelocity = finalVelocity))
return@addEndListener
}
- animatingBubble = null
+ clearAnimatingBubble()
if (!canceled) bubbleStashController.stashBubbleBarImmediate()
bubbleBarView.relativePivotY = 1f
bubbleBarView.scaleY = 1f
@@ -378,7 +380,7 @@
moveToState(AnimatingBubble.State.ANIMATING_OUT)
bubbleBarFlyoutController.collapseFlyout {
onFlyoutRemoved()
- animatingBubble = null
+ clearAnimatingBubble()
}
bubbleStashController.showBubbleBarImmediate()
bubbleStashController.updateTaskbarTouchRegion()
@@ -437,7 +439,7 @@
moveToState(AnimatingBubble.State.ANIMATING_OUT)
bubbleBarFlyoutController.collapseFlyout {
onFlyoutRemoved()
- animatingBubble = null
+ clearAnimatingBubble()
}
bubbleStashController.showBubbleBarImmediate()
bubbleStashController.updateTaskbarTouchRegion()
@@ -473,8 +475,8 @@
ObjectAnimator.ofFloat(bubbleBarView, View.TRANSLATION_Y, ty - bubbleBarBounceDistanceInPx)
.withDuration(BUBBLE_BAR_BOUNCE_ANIMATION_DURATION_MS)
.withEndAction {
- if (animatingBubble?.expand == true) expandBubbleBar()
springBackAnimation.start()
+ if (animatingBubble?.expand == true) expandBubbleBar()
}
.start()
}
@@ -486,7 +488,7 @@
if (flyout != null) {
bubbleBarFlyoutController.setUpAndShowFlyout(
BubbleBarFlyoutMessage(flyout.icon, flyout.title, flyout.message),
- onInit = { bubbleView.suppressDotForBubbleUpdate(true) },
+ onInit = { bubbleView.suppressDotForBubbleUpdate() },
onEnd = {
moveToState(AnimatingBubble.State.IN)
bubbleStashController.updateTaskbarTouchRegion()
@@ -498,35 +500,49 @@
}
private fun cancelFlyout() {
- bubbleBarFlyoutController.cancelFlyout { onFlyoutRemoved() }
+ animatingBubble?.bubbleView?.unsuppressDotForBubbleUpdate(/* animate= */ true)
+ bubbleBarFlyoutController.cancelFlyout { bubbleStashController.updateTaskbarTouchRegion() }
}
private fun onFlyoutRemoved() {
- animatingBubble?.bubbleView?.suppressDotForBubbleUpdate(false)
+ animatingBubble?.bubbleView?.unsuppressDotForBubbleUpdate(/* animate= */ false)
bubbleStashController.updateTaskbarTouchRegion()
}
/** Interrupts the animation due to touching the bubble bar or flyout. */
fun interruptForTouch() {
+ animatingBubble?.hideAnimation?.let { scheduler.cancel(it) }
PhysicsAnimator.getInstance(bubbleBarView).cancelIfRunning()
bubbleStashController.getStashedHandlePhysicsAnimator().cancelIfRunning()
cancelFlyout()
- val hideAnimation = animatingBubble?.hideAnimation ?: return
- scheduler.cancel(hideAnimation)
- bubbleBarView.relativePivotY = 1f
- animatingBubble = null
+ resetBubbleBarPropertiesOnInterrupt()
+ clearAnimatingBubble()
}
/** Notifies the animator that the taskbar area was touched during an animation. */
fun onStashStateChangingWhileAnimating() {
+ animatingBubble?.hideAnimation?.let { scheduler.cancel(it) }
+ cancelFlyout()
+ clearAnimatingBubble()
+ bubbleStashController.getStashedHandlePhysicsAnimator().cancelIfRunning()
+ resetBubbleBarPropertiesOnInterrupt()
+ bubbleStashController.onNewBubbleAnimationInterrupted(
+ /* isStashed= */ bubbleBarView.alpha == 0f,
+ bubbleBarView.translationY,
+ )
+ }
+
+ /** Interrupts the animation due to the IME becoming visible. */
+ fun interruptForIme() {
cancelFlyout()
val hideAnimation = animatingBubble?.hideAnimation ?: return
scheduler.cancel(hideAnimation)
animatingBubble = null
bubbleStashController.getStashedHandlePhysicsAnimator().cancelIfRunning()
- bubbleBarView.relativePivotY = 1f
+ resetBubbleBarPropertiesOnInterrupt()
+ // stash the bubble bar since the IME is now visible
bubbleStashController.onNewBubbleAnimationInterrupted(
- /* isStashed= */ bubbleBarView.alpha == 0f,
+ /* isStashed= */ true,
bubbleBarView.translationY,
)
}
@@ -573,7 +589,7 @@
val flyout = bubble?.flyoutMessage
if (flyout != null) {
// the flyout is currently expanding and we need to update it with new data
- bubbleView.suppressDotForBubbleUpdate(true)
+ bubbleView.suppressDotForBubbleUpdate()
bubbleBarFlyoutController.updateFlyoutWhileExpanding(flyout)
} else {
// the flyout is expanding but we don't have new flyout data to update it with,
@@ -588,7 +604,7 @@
isExpanding: Boolean,
) {
// unsuppress the current bubble because we are about to hide its flyout
- animatingBubble.bubbleView.suppressDotForBubbleUpdate(false)
+ animatingBubble.bubbleView.unsuppressDotForBubbleUpdate(/* animate= */ false)
this.animatingBubble = animatingBubble.copy(bubbleView = bubbleView, expand = isExpanding)
// we're currently idle, waiting for the hide animation to start. update the flyout
@@ -601,7 +617,7 @@
val bubble = bubbleView.bubble as? BubbleBarBubble
val flyout = bubble?.flyoutMessage
if (flyout != null) {
- bubbleView.suppressDotForBubbleUpdate(true)
+ bubbleView.suppressDotForBubbleUpdate()
bubbleBarFlyoutController.updateFlyoutFullyExpanded(flyout) {
bubbleStashController.updateTaskbarTouchRegion()
}
@@ -616,7 +632,7 @@
isExpanding: Boolean,
) {
// unsuppress the current bubble because we are about to hide its flyout
- animatingBubble.bubbleView.suppressDotForBubbleUpdate(false)
+ animatingBubble.bubbleView.unsuppressDotForBubbleUpdate(/* animate= */ false)
this.animatingBubble = animatingBubble.copy(bubbleView = bubbleView, expand = isExpanding)
// the hide animation already started so it can't be canceled, just post it again
@@ -629,7 +645,7 @@
// the flyout is collapsing. update it with the new flyout
if (flyout != null) {
moveToState(AnimatingBubble.State.ANIMATING_IN)
- bubbleView.suppressDotForBubbleUpdate(true)
+ bubbleView.suppressDotForBubbleUpdate()
bubbleBarFlyoutController.updateFlyoutWhileCollapsing(flyout) {
moveToState(AnimatingBubble.State.IN)
bubbleStashController.updateTaskbarTouchRegion()
@@ -656,11 +672,17 @@
private fun cancelHideAnimation() {
val hideAnimation = animatingBubble?.hideAnimation ?: return
scheduler.cancel(hideAnimation)
- animatingBubble = null
+ clearAnimatingBubble()
bubbleBarView.relativePivotY = 1f
bubbleStashController.showBubbleBarImmediate()
}
+ private fun resetBubbleBarPropertiesOnInterrupt() {
+ bubbleBarView.relativePivotY = 1f
+ bubbleBarView.scaleX = 1f
+ bubbleBarView.scaleY = 1f
+ }
+
private fun <T> PhysicsAnimator<T>?.cancelIfRunning() {
if (this?.isRunning() == true) cancel()
}
@@ -684,6 +706,14 @@
private fun moveToState(state: AnimatingBubble.State) {
val animatingBubble = this.animatingBubble ?: return
this.animatingBubble = animatingBubble.copy(state = state)
+ if (state == AnimatingBubble.State.ANIMATING_IN) {
+ bubbleBarParentViewHeightUpdateNotifier.updateTopBoundary()
+ }
+ }
+
+ private fun clearAnimatingBubble() {
+ animatingBubble = null
+ bubbleBarParentViewHeightUpdateNotifier.updateTopBoundary()
}
private fun expandBubbleBar() {
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/flyout/BubbleBarFlyoutController.kt b/quickstep/src/com/android/launcher3/taskbar/bubbles/flyout/BubbleBarFlyoutController.kt
index 908e97c..63db012 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/flyout/BubbleBarFlyoutController.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/flyout/BubbleBarFlyoutController.kt
@@ -35,6 +35,8 @@
private val flyoutScheduler: FlyoutScheduler = HandlerScheduler(container),
) {
+ val maximumFlyoutHeight: Int = BubbleBarFlyoutView.getMaximumViewHeight(container.context)
+
private companion object {
const val EXPAND_ANIMATION_DURATION_MS = 400L
const val COLLAPSE_ANIMATION_DURATION_MS = 350L
@@ -61,6 +63,8 @@
return rect
}
+ fun getFlyoutMaxHeight(): Int = BubbleBarFlyoutView.getMaximumViewHeight(container.context)
+
fun setUpAndShowFlyout(message: BubbleBarFlyoutMessage, onInit: () -> Unit, onEnd: () -> Unit) {
flyout?.let(container::removeView)
val flyout = BubbleBarFlyoutView(container.context, positioner, flyoutScheduler)
@@ -102,11 +106,10 @@
}
}
animator.addListener(
- onStart = { extendTopBoundary() },
onEnd = {
endAction()
flyout.setOnClickListener { callbacks.flyoutClicked() }
- },
+ }
)
animator.start()
}
@@ -114,14 +117,13 @@
fun updateFlyoutFullyExpanded(message: BubbleBarFlyoutMessage, onEnd: () -> Unit) {
val flyout = flyout ?: return
hideFlyout(AnimationType.FADE) {
- callbacks.resetTopBoundary()
flyout.updateData(message) { showFlyout(AnimationType.FADE, onEnd) }
}
}
fun updateFlyoutWhileExpanding(message: BubbleBarFlyoutMessage) {
val flyout = flyout ?: return
- flyout.updateData(message) { extendTopBoundary() }
+ flyout.updateData(message) {}
}
fun updateFlyoutWhileCollapsing(message: BubbleBarFlyoutMessage, onEnd: () -> Unit) {
@@ -131,14 +133,6 @@
flyout.updateData(message) { showFlyout(AnimationType.MORPH, onEnd) }
}
- private fun extendTopBoundary() {
- val flyout = flyout ?: return
- val flyoutTop = flyout.top + flyout.translationY
- // If the top position of the flyout is negative, then it's bleeding over the
- // top boundary of its parent view
- if (flyoutTop < 0) callbacks.extendTopBoundary(space = -flyoutTop.toInt())
- }
-
fun cancelFlyout(endAction: () -> Unit) {
hideFlyout(AnimationType.FADE) {
cleanupFlyoutView()
@@ -184,7 +178,6 @@
private fun cleanupFlyoutView() {
container.removeView(flyout)
this@BubbleBarFlyoutController.flyout = null
- callbacks.resetTopBoundary()
}
fun hasFlyout() = flyout != null
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/flyout/BubbleBarFlyoutView.kt b/quickstep/src/com/android/launcher3/taskbar/bubbles/flyout/BubbleBarFlyoutView.kt
index f9f5a15..75bf937 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/flyout/BubbleBarFlyoutView.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/flyout/BubbleBarFlyoutView.kt
@@ -18,6 +18,7 @@
import android.content.Context
import android.content.res.Configuration
+import android.content.res.Resources
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Outline
@@ -44,11 +45,27 @@
scheduler: FlyoutScheduler? = null,
) : ConstraintLayout(context) {
- private companion object {
- // the minimum progress of the expansion animation before the content starts fading in.
- const val MIN_EXPANSION_PROGRESS_FOR_CONTENT_ALPHA = 0.75f
+ companion object {
// the rate multiple for the background color animation relative to the morph animation.
const val BACKGROUND_COLOR_CHANGE_RATE = 5
+ // the minimum progress of the expansion animation before the content starts fading in.
+ private const val MIN_EXPANSION_PROGRESS_FOR_CONTENT_ALPHA = 0.75f
+
+ private const val TEXT_ROW_HEIGHT_SP = 20
+ private const val MAX_ROWS_COUNT = 3
+
+ /** Returns the maximum possible height of the flyout view. */
+ fun getMaximumViewHeight(context: Context): Int {
+ val verticalPaddings = getFlyoutPadding(context) * 2
+ val textSizeSp = TEXT_ROW_HEIGHT_SP * MAX_ROWS_COUNT
+ val textSizePx = textSizeSp * Resources.getSystem().displayMetrics.scaledDensity
+ val triangleHeight =
+ context.resources.getDimensionPixelSize(R.dimen.bubblebar_flyout_triangle_height)
+ return verticalPaddings + textSizePx.toInt() + triangleHeight
+ }
+
+ private fun getFlyoutPadding(context: Context) =
+ context.resources.getDimensionPixelSize(R.dimen.bubblebar_flyout_padding)
}
private val scheduler: FlyoutScheduler = scheduler ?: HandlerScheduler(this)
@@ -61,10 +78,7 @@
private val message: TextView by
lazy(LazyThreadSafetyMode.NONE) { findViewById(R.id.bubble_flyout_text) }
- private val flyoutPadding by
- lazy(LazyThreadSafetyMode.NONE) {
- context.resources.getDimensionPixelSize(R.dimen.bubblebar_flyout_padding)
- }
+ private val flyoutPadding by lazy(LazyThreadSafetyMode.NONE) { getFlyoutPadding(context) }
private val triangleHeight by
lazy(LazyThreadSafetyMode.NONE) {
@@ -402,18 +416,13 @@
val isNightModeOn = nightModeFlags == Configuration.UI_MODE_NIGHT_YES
val defaultBackgroundColor = if (isNightModeOn) Color.BLACK else Color.WHITE
val defaultTextColor = if (isNightModeOn) Color.WHITE else Color.BLACK
- val ta =
- context.obtainStyledAttributes(
- intArrayOf(
- com.android.internal.R.attr.materialColorSurfaceContainer,
- com.android.internal.R.attr.materialColorOnSurface,
- com.android.internal.R.attr.materialColorOnSurfaceVariant,
- )
- )
- backgroundColor = ta.getColor(0, defaultBackgroundColor)
- title.setTextColor(ta.getColor(1, defaultTextColor))
- message.setTextColor(ta.getColor(2, defaultTextColor))
- ta.recycle()
+
+ backgroundColor =
+ context.getColor(com.android.internal.R.color.materialColorSurfaceContainer)
+ title.setTextColor(context.getColor(com.android.internal.R.color.materialColorOnSurface))
+ message.setTextColor(
+ context.getColor(com.android.internal.R.color.materialColorOnSurfaceVariant)
+ )
backgroundPaint.color = backgroundColor
}
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/flyout/FlyoutCallbacks.kt b/quickstep/src/com/android/launcher3/taskbar/bubbles/flyout/FlyoutCallbacks.kt
index e2f010a..0804a62 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/flyout/FlyoutCallbacks.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/flyout/FlyoutCallbacks.kt
@@ -18,11 +18,6 @@
/** Callbacks that the flyout uses to notify of events. */
interface FlyoutCallbacks {
- /** Requests to extend the top boundary of the parent to fully include the flyout. */
- fun extendTopBoundary(space: Int)
-
- /** Resets the top boundary of the parent. */
- fun resetTopBoundary()
/** The flyout was clicked. */
fun flyoutClicked()
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/stashing/BubbleStashController.kt b/quickstep/src/com/android/launcher3/taskbar/bubbles/stashing/BubbleStashController.kt
index d9589bb..595dac3 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/stashing/BubbleStashController.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/stashing/BubbleStashController.kt
@@ -74,6 +74,9 @@
val isBubblesShowingOnOverview: Boolean
get() = launcherState == BubbleLauncherState.OVERVIEW
+ /** Bubble bar vertical center for launcher home. */
+ var bubbleBarVerticalCenterForHome: Int
+
/** Updated when sysui locked state changes, when locked, bubble bar is not shown. */
var isSysuiLocked: Boolean
@@ -121,9 +124,6 @@
/** Set a bubble bar location */
fun setBubbleBarLocation(bubbleBarLocation: BubbleBarLocation)
- /** Set the hotseat vertical center that bubble bar will align with. */
- fun setHotseatVerticalCenter(hotseatVerticalCenter: Int)
-
/**
* Stashes the bubble bar (transform to the handle view), or just shrink width of the expanded
* bubble bar based on the controller implementation.
@@ -131,7 +131,17 @@
fun stashBubbleBar()
/** Shows the bubble bar, and expands bubbles depending on [expandBubbles]. */
- fun showBubbleBar(expandBubbles: Boolean)
+ fun showBubbleBar(expandBubbles: Boolean) {
+ showBubbleBar(expandBubbles = expandBubbles, bubbleBarGesture = false)
+ }
+
+ /**
+ * Shows the bubble bar, and expands bubbles depending on [expandBubbles].
+ *
+ * Set [bubbleBarGesture] to true if this request originates from a touch gesture on the bubble
+ * bar.
+ */
+ fun showBubbleBar(expandBubbles: Boolean, bubbleBarGesture: Boolean)
// TODO(b/354218264): Move to BubbleBarViewAnimator
/**
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/stashing/PersistentBubbleStashController.kt b/quickstep/src/com/android/launcher3/taskbar/bubbles/stashing/PersistentBubbleStashController.kt
index 45f5568..9d8c0ed 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/stashing/PersistentBubbleStashController.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/stashing/PersistentBubbleStashController.kt
@@ -47,7 +47,7 @@
private lateinit var bubbleBarAlphaAnimator: MultiPropertyFactory<View>.MultiProperty
private lateinit var bubbleBarScaleAnimator: AnimatedFloat
private lateinit var controllersAfterInitAction: ControllersAfterInitAction
- private var hotseatVerticalCenter: Int = 0
+ override var bubbleBarVerticalCenterForHome: Int = 0
override var launcherState: BubbleLauncherState = BubbleLauncherState.IN_APP
set(state) {
@@ -97,7 +97,7 @@
override val bubbleBarTranslationYForHotseat: Float
get() {
val bubbleBarHeight = bubbleBarViewController.bubbleBarCollapsedHeight
- return -hotseatVerticalCenter + bubbleBarHeight / 2
+ return -bubbleBarVerticalCenterForHome + bubbleBarHeight / 2
}
override val bubbleBarTranslationY: Float
@@ -159,10 +159,6 @@
animatorSet.setDuration(BAR_STASH_DURATION).start()
}
- override fun setHotseatVerticalCenter(hotseatVerticalCenter: Int) {
- this.hotseatVerticalCenter = hotseatVerticalCenter
- }
-
override fun showBubbleBarImmediate() = showBubbleBarImmediate(bubbleBarTranslationY)
override fun showBubbleBarImmediate(bubbleBarTranslationY: Float) {
@@ -180,8 +176,8 @@
updateExpandedState(expand = false)
}
- override fun showBubbleBar(expandBubbles: Boolean) {
- updateExpandedState(expandBubbles)
+ override fun showBubbleBar(expandBubbles: Boolean, bubbleBarGesture: Boolean) {
+ updateExpandedState(expand = expandBubbles, bubbleBarGesture = bubbleBarGesture)
}
override fun stashBubbleBarImmediate() {
@@ -235,13 +231,14 @@
// no op since does not have a handle view
}
- private fun updateExpandedState(expand: Boolean) {
+ private fun updateExpandedState(expand: Boolean, bubbleBarGesture: Boolean = false) {
if (bubbleBarViewController.isHiddenForNoBubbles) {
// If there are no bubbles the bar is invisible, nothing to do here.
return
}
if (bubbleBarViewController.isExpanded != expand) {
- bubbleBarViewController.isExpanded = expand
+ val maybeShowEdu = expand && bubbleBarGesture
+ bubbleBarViewController.setExpanded(expand, maybeShowEdu)
}
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/stashing/TransientBubbleStashController.kt b/quickstep/src/com/android/launcher3/taskbar/bubbles/stashing/TransientBubbleStashController.kt
index e62c0d4..df00696 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/stashing/TransientBubbleStashController.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/stashing/TransientBubbleStashController.kt
@@ -78,7 +78,7 @@
context.resources.getDimensionPixelSize(R.dimen.bubblebar_stashed_size) / 2f
private var animator: AnimatorSet? = null
- private var hotseatVerticalCenter: Int = 0
+ override var bubbleBarVerticalCenterForHome: Int = 0
override var isStashed: Boolean = false
@VisibleForTesting set
@@ -90,7 +90,10 @@
val hasBubbles = bubbleBarViewController.hasBubbles()
bubbleBarViewController.onBubbleBarConfigurationChanged(hasBubbles)
if (!hasBubbles) {
- // if there are no bubbles, there's nothing to show, so just return.
+ // if there are no bubbles, there's no need to update the bubble bar, just keep the
+ // isStashed state up to date so that we can process state changes when bubbles are
+ // created.
+ isStashed = launcherState == BubbleLauncherState.IN_APP
return
}
if (field == BubbleLauncherState.HOME) {
@@ -121,7 +124,7 @@
override val bubbleBarTranslationYForHotseat: Float
get() {
val bubbleBarHeight = bubbleBarViewController.bubbleBarCollapsedHeight
- return -hotseatVerticalCenter + bubbleBarHeight / 2
+ return -bubbleBarVerticalCenterForHome + bubbleBarHeight / 2
}
override val bubbleBarTranslationYForTaskbar: Float =
@@ -179,10 +182,6 @@
.start()
}
- override fun setHotseatVerticalCenter(hotseatVerticalCenter: Int) {
- this.hotseatVerticalCenter = hotseatVerticalCenter
- }
-
override fun showBubbleBarImmediate() {
showBubbleBarImmediate(bubbleBarTranslationY)
}
@@ -247,8 +246,12 @@
updateStashedAndExpandedState(stash = true, expand = false)
}
- override fun showBubbleBar(expandBubbles: Boolean) {
- updateStashedAndExpandedState(stash = false, expandBubbles)
+ override fun showBubbleBar(expandBubbles: Boolean, bubbleBarGesture: Boolean) {
+ updateStashedAndExpandedState(
+ stash = false,
+ expand = expandBubbles,
+ bubbleBarGesture = bubbleBarGesture,
+ )
}
override fun getDiffBetweenHandleAndBarCenters(): Float {
@@ -478,7 +481,11 @@
}
@VisibleForTesting
- fun updateStashedAndExpandedState(stash: Boolean, expand: Boolean) {
+ fun updateStashedAndExpandedState(
+ stash: Boolean,
+ expand: Boolean,
+ bubbleBarGesture: Boolean = false,
+ ) {
if (bubbleBarViewController.isHiddenForNoBubbles) {
// If there are no bubbles the bar and handle are invisible, nothing to do here.
return
@@ -486,10 +493,9 @@
val isStashed = stash && !isBubblesShowingOnHome && !isBubblesShowingOnOverview
if (this.isStashed != isStashed) {
this.isStashed = isStashed
+
// notify the view controller that the stash state is about to change so that it can
// cancel an ongoing animation if there is one.
- // note that this has to be called before updating mIsStashed with the new value,
- // otherwise interrupting an ongoing animation may update it again with the wrong state
bubbleBarViewController.onStashStateChanging()
animator?.cancel()
animator =
@@ -500,7 +506,8 @@
}
}
if (bubbleBarViewController.isExpanded != expand) {
- bubbleBarViewController.isExpanded = expand
+ val maybeShowEdu = expand && bubbleBarGesture
+ bubbleBarViewController.setExpanded(expand, maybeShowEdu)
}
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/customization/TaskbarAllAppsButtonContainer.kt b/quickstep/src/com/android/launcher3/taskbar/customization/TaskbarAllAppsButtonContainer.kt
index 7e3b362..4932654 100644
--- a/quickstep/src/com/android/launcher3/taskbar/customization/TaskbarAllAppsButtonContainer.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/customization/TaskbarAllAppsButtonContainer.kt
@@ -32,6 +32,7 @@
import com.android.launcher3.config.FeatureFlags.enableTaskbarPinning
import com.android.launcher3.taskbar.TaskbarActivityContext
import com.android.launcher3.taskbar.TaskbarViewCallbacks
+import com.android.launcher3.util.DisplayController
import com.android.launcher3.util.Executors.MAIN_EXECUTOR
import com.android.launcher3.views.ActivityContext
import com.android.launcher3.views.IconButtonView
@@ -68,7 +69,9 @@
)
backgroundTintList = ColorStateList.valueOf(TRANSPARENT)
setIconDrawable(drawable)
- setPadding(dpToPx(activityContext.taskbarSpecsEvaluator.taskbarIconPadding.toFloat()))
+ if (!DisplayController.isTransientTaskbar(context)) {
+ setPadding(dpToPx(activityContext.taskbarSpecsEvaluator.taskbarIconPadding.toFloat()))
+ }
setForegroundTint(activityContext.getColor(R.color.all_apps_button_color))
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/customization/TaskbarDividerContainer.kt b/quickstep/src/com/android/launcher3/taskbar/customization/TaskbarDividerContainer.kt
index 344f163..d5f72d5 100644
--- a/quickstep/src/com/android/launcher3/taskbar/customization/TaskbarDividerContainer.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/customization/TaskbarDividerContainer.kt
@@ -26,6 +26,7 @@
import com.android.launcher3.Utilities.dpToPx
import com.android.launcher3.taskbar.TaskbarActivityContext
import com.android.launcher3.taskbar.TaskbarViewCallbacks
+import com.android.launcher3.util.DisplayController
import com.android.launcher3.views.ActivityContext
import com.android.launcher3.views.IconButtonView
@@ -51,7 +52,9 @@
backgroundTintList = ColorStateList.valueOf(TRANSPARENT)
val drawable = resources.getDrawable(R.drawable.taskbar_divider_button)
setIconDrawable(drawable)
- setPadding(dpToPx(activityContext.taskbarSpecsEvaluator.taskbarIconPadding.toFloat()))
+ if (!DisplayController.isTransientTaskbar(context)) {
+ setPadding(dpToPx(activityContext.taskbarSpecsEvaluator.taskbarIconPadding.toFloat()))
+ }
}
@SuppressLint("ClickableViewAccessibility")
diff --git a/quickstep/src/com/android/launcher3/uioverrides/PredictedAppIcon.java b/quickstep/src/com/android/launcher3/uioverrides/PredictedAppIcon.java
index 4590efe..535ae1c 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/PredictedAppIcon.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/PredictedAppIcon.java
@@ -418,7 +418,9 @@
mIconRingPaint.setColor(RING_SHADOW_COLOR);
mIconRingPaint.setMaskFilter(mShadowFilter);
int count = canvas.save();
- canvas.scale(mRingScale, mRingScale, canvas.getWidth() / 2f, canvas.getHeight() / 2f);
+ if (Float.compare(1, mRingScale) != 0) {
+ canvas.scale(mRingScale, mRingScale, canvas.getWidth() / 2f, canvas.getHeight() / 2f);
+ }
canvas.drawPath(mRingPath, mIconRingPaint);
mIconRingPaint.setColor(mPlateColor);
mIconRingPaint.setMaskFilter(null);
diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
index 34d9a68..5cb6e86 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
@@ -264,6 +264,8 @@
private boolean mIsOverlayVisible;
+ private final Runnable mOverviewTargetChangeRunnable = this::onOverviewTargetChanged;
+
public static QuickstepLauncher getLauncher(Context context) {
return fromContext(context);
}
@@ -304,7 +306,7 @@
mTISBindHelper = new TISBindHelper(this, this::onTISConnected);
mDepthController = new DepthController(this);
- if (DesktopModeStatus.canEnterDesktopMode(this)) {
+ if (DesktopModeStatus.canEnterDesktopModeOrShowAppHandle(this)) {
mSplitSelectStateController.initSplitFromDesktopController(this,
overviewComponentObserver);
}
@@ -550,6 +552,10 @@
mUnfoldTransitionProgressProvider.destroy();
}
+ TISBinder binder = mTISBindHelper.getBinder();
+ if (binder != null) {
+ binder.unregisterOverviewTargetChangeListener(mOverviewTargetChangeRunnable);
+ }
mTISBindHelper.onDestroy();
if (mLauncherUnfoldAnimationController != null) {
@@ -795,6 +801,10 @@
if (mLauncherUnfoldAnimationController != null) {
mLauncherUnfoldAnimationController.onResume();
}
+
+ if (mTaskbarUIController != null && FeatureFlags.enableHomeTransitionListener()) {
+ mTaskbarUIController.onLauncherResume();
+ }
}
@Override
@@ -815,6 +825,18 @@
.playPlaceholderDismissAnim(this, LAUNCHER_SPLIT_SELECTION_EXIT_INTERRUPTED);
}
}
+
+ if (mTaskbarUIController != null && FeatureFlags.enableHomeTransitionListener()) {
+ mTaskbarUIController.onLauncherPause();
+ }
+ }
+
+ @Override
+ protected void onStop() {
+ super.onStop();
+ if (mTaskbarUIController != null && FeatureFlags.enableHomeTransitionListener()) {
+ mTaskbarUIController.onLauncherStop();
+ }
}
@Override
@@ -1025,12 +1047,20 @@
}
}
+ private void onOverviewTargetChanged() {
+ QuickstepTransitionManager transitionManager = getAppTransitionManager();
+ if (transitionManager != null) {
+ transitionManager.onOverviewTargetChange();
+ }
+ }
+
private void onTISConnected(TISBinder binder) {
TaskbarManager taskbarManager = mTISBindHelper.getTaskbarManager();
if (taskbarManager != null) {
taskbarManager.setActivity(this);
}
mTISBindHelper.setPredictiveBackToHomeInProgress(mIsPredictiveBackToHomeInProgress);
+ binder.registerOverviewTargetChangeListener(mOverviewTargetChangeRunnable);
}
@Override
diff --git a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
index 95e7737..fbc8d6a 100644
--- a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
+++ b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
@@ -56,9 +56,11 @@
import static com.android.quickstep.GestureState.STATE_RECENTS_ANIMATION_STARTED;
import static com.android.quickstep.GestureState.STATE_RECENTS_SCROLLING_FINISHED;
import static com.android.quickstep.MultiStateCallback.DEBUG_STATES;
+import static com.android.quickstep.TaskViewUtils.extractTargetsAndStates;
import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.EXPECTING_TASK_APPEARED;
import static com.android.quickstep.views.RecentsView.UPDATE_SYSUI_FLAGS_THRESHOLD;
import static com.android.systemui.shared.system.ActivityManagerWrapper.CLOSE_SYSTEM_WINDOWS_REASON_RECENTS;
+import static com.android.wm.shell.shared.ShellSharedConstants.KEY_EXTRA_SHELL_CAN_HAND_OFF_ANIMATION;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
@@ -77,6 +79,9 @@
import android.os.IBinder;
import android.os.SystemClock;
import android.util.Log;
+import android.util.Pair;
+import android.util.TimeUtils;
+import android.view.Choreographer;
import android.view.MotionEvent;
import android.view.RemoteAnimationTarget;
import android.view.SurfaceControl;
@@ -90,6 +95,7 @@
import android.widget.Toast;
import android.window.DesktopModeFlags;
import android.window.PictureInPictureSurfaceTransaction;
+import android.window.WindowAnimationState;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -143,6 +149,7 @@
import com.android.quickstep.views.RecentsViewContainer;
import com.android.quickstep.views.TaskContainer;
import com.android.quickstep.views.TaskView;
+import com.android.systemui.animation.TransitionAnimator;
import com.android.systemui.contextualeducation.GestureType;
import com.android.systemui.shared.recents.model.Task;
import com.android.systemui.shared.recents.model.ThumbnailData;
@@ -152,10 +159,13 @@
import com.android.systemui.shared.system.SysUiStatsLog;
import com.android.systemui.shared.system.TaskStackChangeListener;
import com.android.systemui.shared.system.TaskStackChangeListeners;
+import com.android.wm.shell.Flags;
import com.android.wm.shell.shared.TransactionPool;
import com.android.wm.shell.shared.desktopmode.DesktopModeStatus;
import com.android.wm.shell.shared.startingsurface.SplashScreenExitAnimationUtils;
+import kotlin.Unit;
+
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
@@ -165,8 +175,6 @@
import java.util.OptionalInt;
import java.util.function.Consumer;
-import kotlin.Unit;
-
/**
* Handles the navigation gestures when Launcher is the default home activity.
*/
@@ -347,6 +355,9 @@
// Indicates whether the divider is shown, only used when split screen is activated.
private boolean mIsDividerShown = true;
private boolean mStartMovingTasks;
+ // Whether the animation to home should be handed off to another handler once the gesture is
+ // committed.
+ protected boolean mHandOffAnimationToHome = false;
@Nullable
private RemoteAnimationTargets.ReleaseCheck mSwipePipToHomeReleaseCheck = null;
@@ -775,7 +786,7 @@
&& recentsAttachedToAppWindow) {
// Only move running task if RecentsView has never been attached before, to avoid
// TaskView jumping to new position as we move the tasks.
- mRecentsView.moveRunningTaskToFront();
+ mRecentsView.moveRunningTaskToExpectedPosition();
}
mAnimationFactory.setRecentsAttachedToAppWindow(
recentsAttachedToAppWindow, animate, updateRunningTaskAlpha);
@@ -945,6 +956,10 @@
mSwipePipToHomeReleaseCheck = new RemoteAnimationTargets.ReleaseCheck();
mSwipePipToHomeReleaseCheck.setCanRelease(true);
mRecentsAnimationTargets.addReleaseCheck(mSwipePipToHomeReleaseCheck);
+ if (TransitionAnimator.Companion.longLivedReturnAnimationsEnabled()) {
+ mHandOffAnimationToHome =
+ targets.extras.getBoolean(KEY_EXTRA_SHELL_CAN_HAND_OFF_ANIMATION, false);
+ }
// Only initialize the device profile, if it has not been initialized before, as in some
// configurations targets.homeContentInsets may not be correct.
@@ -1440,8 +1455,21 @@
onPageTransitionEnd.run();
}
}
+ long finalDuration = duration;
+ runOnRecentsAnimationAndLauncherBound(() -> animateGestureEnd(
+ startShift, endShift, finalDuration, interpolator, endTarget, velocityPxPerMs));
+ }
- animateToProgress(startShift, endShift, duration, interpolator, endTarget, velocityPxPerMs);
+ @UiThread
+ protected void animateGestureEnd(
+ float startShift,
+ float endShift,
+ long duration,
+ @NonNull Interpolator interpolator,
+ @NonNull GestureEndTarget endTarget,
+ @NonNull PointF velocityPxPerMs) {
+ animateToProgressInternal(
+ startShift, endShift, duration, interpolator, endTarget, velocityPxPerMs);
}
private void doLogGesture(GestureEndTarget endTarget, @Nullable TaskView targetTask) {
@@ -1484,14 +1512,6 @@
logger.log(event);
}
- /** Animates to the given progress, where 0 is the current app and 1 is overview. */
- @UiThread
- private void animateToProgress(float start, float end, long duration, Interpolator interpolator,
- GestureEndTarget target, PointF velocityPxPerMs) {
- runOnRecentsAnimationAndLauncherBound(() -> animateToProgressInternal(start, end, duration,
- interpolator, target, velocityPxPerMs));
- }
-
protected abstract HomeAnimationFactory createHomeAnimationFactory(
List<IBinder> launchCookies,
long duration,
@@ -1629,6 +1649,10 @@
}
windowAnim = createWindowAnimationToHome(start, homeAnimFactory);
+ if (mHandOffAnimationToHome) {
+ handOffAnimation(velocityPxPerMs);
+ }
+
windowAnim[0].addAnimatorListener(new AnimationSuccessListener() {
@Override
public void onAnimationSuccess(Animator animator) {
@@ -1711,6 +1735,36 @@
}
}
+ private void handOffAnimation(PointF velocityPxPerMs) {
+ if (!TransitionAnimator.Companion.longLivedReturnAnimationsEnabled()) {
+ return;
+ }
+
+ // This function is not guaranteed to be called inside a frame. We try to access the frame
+ // time immediately, but if we're not inside a frame we must post a callback to be run at
+ // the beginning of the next frame.
+ try {
+ handOffAnimationInternal(Choreographer.getInstance().getFrameTime(), velocityPxPerMs);
+ } catch (IllegalStateException e) {
+ Choreographer.getInstance().postFrameCallback(
+ frameTimeNanos -> handOffAnimationInternal(
+ frameTimeNanos / TimeUtils.NANOS_PER_MS, velocityPxPerMs));
+ }
+ }
+
+ private void handOffAnimationInternal(long timestamp, PointF velocityPxPerMs) {
+ if (mRecentsAnimationController == null) {
+ return;
+ }
+
+ Pair<RemoteAnimationTarget[], WindowAnimationState[]> targetsAndStates =
+ extractTargetsAndStates(
+ mRemoteTargetHandles, timestamp, velocityPxPerMs);
+ mRecentsAnimationController.handOffAnimation(
+ targetsAndStates.first, targetsAndStates.second);
+ ActiveGestureProtoLogProxy.logHandOffAnimation();
+ }
+
private int calculateWindowRotation(RemoteAnimationTarget runningTaskTarget,
RecentsOrientedState orientationState) {
if (runningTaskTarget.rotationChange != 0) {
@@ -2050,6 +2104,7 @@
if (mRecentsView != null) {
mRecentsView.removeOnScrollChangedListener(mOnRecentsScrollListener);
}
+ mGestureState.getContainerInterface().setOnDeferredActivityLaunchCallback(null);
}
private void resetStateForAnimationCancel() {
@@ -2176,8 +2231,9 @@
mSwipePipToHomeAnimator.getFinishTransaction(),
mSwipePipToHomeAnimator.getContentOverlay());
mIsSwipingPipToHome = false;
- } else if (mIsSwipeForSplit) {
+ } else if (mIsSwipeForSplit && !Flags.enablePip2()) {
// Transaction to hide the task to avoid flicker for entering PiP from split-screen.
+ // Note: PiP2 handles entering differently, so skip if enable_pip2=true
PictureInPictureSurfaceTransaction tx =
new PictureInPictureSurfaceTransaction.Builder()
.setAlpha(0f)
diff --git a/quickstep/src/com/android/quickstep/DesktopFullscreenDrawParams.kt b/quickstep/src/com/android/quickstep/DesktopFullscreenDrawParams.kt
new file mode 100644
index 0000000..bafb0b2
--- /dev/null
+++ b/quickstep/src/com/android/quickstep/DesktopFullscreenDrawParams.kt
@@ -0,0 +1,33 @@
+/*
+ * 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.quickstep
+
+import android.content.Context
+import com.android.systemui.shared.system.QuickStepContract
+
+// DesktopTaskView thumbnail's corner radius is independent of fullscreenProgress.
+open class DesktopFullscreenDrawParams
+@JvmOverloads
+constructor(context: Context, cornerRadiusProvider: (Context) -> Float = ::computeCornerRadius) :
+ FullscreenDrawParams(context, cornerRadiusProvider, cornerRadiusProvider) {
+ companion object {
+ // computeCornerRadius is used as cornerRadiusProvider, so
+ // QuickStepContract::getWindowCornerRadius can be mocked properly.
+ private fun computeCornerRadius(context: Context): Float =
+ QuickStepContract.getWindowCornerRadius(context)
+ }
+}
diff --git a/quickstep/src/com/android/quickstep/FallbackSwipeHandler.java b/quickstep/src/com/android/quickstep/FallbackSwipeHandler.java
index 7abcfb8..9b56fd4 100644
--- a/quickstep/src/com/android/quickstep/FallbackSwipeHandler.java
+++ b/quickstep/src/com/android/quickstep/FallbackSwipeHandler.java
@@ -64,8 +64,6 @@
import com.android.launcher3.util.DisplayController;
import com.android.quickstep.fallback.FallbackRecentsView;
import com.android.quickstep.fallback.RecentsState;
-import com.android.quickstep.fallback.window.RecentsWindowManager;
-import com.android.quickstep.util.ActiveGestureLog;
import com.android.quickstep.util.RectFSpringAnim;
import com.android.quickstep.util.SurfaceTransaction.SurfaceProperties;
import com.android.quickstep.util.TransformParams;
@@ -172,16 +170,14 @@
}
@Override
- protected boolean handleTaskAppeared(@NonNull RemoteAnimationTarget[] appearedTaskTarget,
- @NonNull ActiveGestureLog.CompoundString failureReason) {
- if (mActiveAnimationFactory != null
- && mActiveAnimationFactory.handleHomeTaskAppeared(appearedTaskTarget)) {
+ public void onTasksAppeared(@NonNull RemoteAnimationTarget[] appearedTaskTargets) {
+ if (mActiveAnimationFactory != null && mActiveAnimationFactory.handleHomeTaskAppeared(
+ appearedTaskTargets)) {
mActiveAnimationFactory = null;
- failureReason.append("(FallbackSwipeHandler) should be handled as home task appeared");
- return false;
+ return;
}
- return super.handleTaskAppeared(appearedTaskTarget, failureReason);
+ super.onTasksAppeared(appearedTaskTargets);
}
@Override
diff --git a/quickstep/src/com/android/quickstep/FullscreenDrawParams.kt b/quickstep/src/com/android/quickstep/FullscreenDrawParams.kt
new file mode 100644
index 0000000..a5ba52a
--- /dev/null
+++ b/quickstep/src/com/android/quickstep/FullscreenDrawParams.kt
@@ -0,0 +1,81 @@
+/*
+ * 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.quickstep
+
+import android.content.Context
+import com.android.launcher3.R
+import com.android.launcher3.Utilities
+import com.android.launcher3.util.DisplayController
+import com.android.launcher3.util.SafeCloseable
+import com.android.launcher3.views.ActivityContext
+import com.android.quickstep.util.TaskCornerRadius
+import com.android.systemui.shared.system.QuickStepContract
+
+/**
+ * Class for computing corner radius by interpolating between overview and fullscreen corner radius
+ * with fullscreenProgress set in [setProgress].
+ */
+open class FullscreenDrawParams
+@JvmOverloads
+constructor(
+ context: Context,
+ private val taskCornerRadiusProvider: (Context) -> Float = ::computeTaskCornerRadius,
+ private val windowCornerRadiusProvider: (Context) -> Float = ::computeWindowCornerRadius,
+) : SafeCloseable {
+ private var taskCornerRadius = 0f
+ private var windowCornerRadius = 0f
+ var currentCornerRadius = 0f
+
+ init {
+ updateCornerRadius(context)
+ }
+
+ /** Recomputes the start and end corner radius for the given Context. */
+ fun updateCornerRadius(context: Context) {
+ taskCornerRadius = taskCornerRadiusProvider(context)
+ windowCornerRadius = windowCornerRadiusProvider(context)
+ }
+
+ /** Sets the progress in range [0, 1] */
+ fun setProgress(fullscreenProgress: Float, parentScale: Float, taskViewScale: Float) {
+ currentCornerRadius =
+ Utilities.mapRange(fullscreenProgress, taskCornerRadius, windowCornerRadius) /
+ parentScale /
+ taskViewScale
+ }
+
+ override fun close() {}
+
+ companion object {
+ private fun computeTaskCornerRadius(context: Context): Float = TaskCornerRadius.get(context)
+
+ private fun computeWindowCornerRadius(context: Context): Float {
+ val activityContext: ActivityContext? = ActivityContext.lookupContextNoThrow(context)
+ return if (
+ activityContext?.deviceProfile?.isTaskbarPresent == true &&
+ DisplayController.isTransientTaskbar(context)
+ ) {
+ context.resources
+ .getDimensionPixelSize(R.dimen.persistent_taskbar_corner_radius)
+ .toFloat()
+ } else {
+ // The corner radius is fixed to match when Taskbar is persistent mode
+ QuickStepContract.getWindowCornerRadius(context)
+ }
+ }
+ }
+}
diff --git a/quickstep/src/com/android/quickstep/GestureState.java b/quickstep/src/com/android/quickstep/GestureState.java
index 5190ec8..cfbcf0a 100644
--- a/quickstep/src/com/android/quickstep/GestureState.java
+++ b/quickstep/src/com/android/quickstep/GestureState.java
@@ -274,7 +274,7 @@
* @return the interface to the activity handing the UI updates for this gesture.
*/
public <S extends BaseState<S>, T extends RecentsViewContainer & StatefulContainer<S>>
- BaseContainerInterface getContainerInterface() {
+ BaseContainerInterface<S, T> getContainerInterface() {
return mContainerInterface;
}
diff --git a/quickstep/src/com/android/quickstep/InputConsumerUtils.kt b/quickstep/src/com/android/quickstep/InputConsumerUtils.kt
new file mode 100644
index 0000000..bea3150
--- /dev/null
+++ b/quickstep/src/com/android/quickstep/InputConsumerUtils.kt
@@ -0,0 +1,746 @@
+/*
+ * 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.quickstep
+
+import android.content.Context
+import android.view.MotionEvent
+import androidx.annotation.VisibleForTesting
+import com.android.launcher3.anim.AnimatedFloat
+import com.android.launcher3.statemanager.BaseState
+import com.android.launcher3.statemanager.StatefulContainer
+import com.android.launcher3.taskbar.TaskbarManager
+import com.android.launcher3.util.LockedUserState.Companion.get
+import com.android.quickstep.inputconsumers.AccessibilityInputConsumer
+import com.android.quickstep.inputconsumers.AssistantInputConsumer
+import com.android.quickstep.inputconsumers.BubbleBarInputConsumer
+import com.android.quickstep.inputconsumers.DeviceLockedInputConsumer
+import com.android.quickstep.inputconsumers.NavHandleLongPressInputConsumer
+import com.android.quickstep.inputconsumers.OneHandedModeInputConsumer
+import com.android.quickstep.inputconsumers.OtherActivityInputConsumer
+import com.android.quickstep.inputconsumers.OverviewInputConsumer
+import com.android.quickstep.inputconsumers.OverviewWithoutFocusInputConsumer
+import com.android.quickstep.inputconsumers.ProgressDelegateInputConsumer
+import com.android.quickstep.inputconsumers.ResetGestureInputConsumer
+import com.android.quickstep.inputconsumers.ScreenPinnedInputConsumer
+import com.android.quickstep.inputconsumers.SysUiOverlayInputConsumer
+import com.android.quickstep.inputconsumers.TaskbarUnstashInputConsumer
+import com.android.quickstep.inputconsumers.TrackpadStatusBarInputConsumer
+import com.android.quickstep.util.ActiveGestureErrorDetector
+import com.android.quickstep.util.ActiveGestureLog
+import com.android.quickstep.util.ActiveGestureLog.CompoundString
+import com.android.quickstep.util.ActiveGestureProtoLogProxy
+import com.android.quickstep.views.RecentsViewContainer
+import com.android.systemui.shared.system.InputChannelCompat
+import com.android.systemui.shared.system.InputMonitorCompat
+import com.android.wm.shell.Flags
+import java.util.function.Consumer
+import java.util.function.Function
+
+/** Utility class for creating input consumers. */
+object InputConsumerUtils {
+ private const val SUBSTRING_PREFIX = "; "
+ private const val NEWLINE_PREFIX = "\n\t\t\t-> "
+
+ @JvmStatic
+ fun <S : BaseState<S>, T> newConsumer(
+ baseContext: Context,
+ tisContext: Context,
+ resetGestureInputConsumer: ResetGestureInputConsumer?,
+ overviewComponentObserver: OverviewComponentObserver,
+ deviceState: RecentsAnimationDeviceState,
+ previousGestureState: GestureState,
+ gestureState: GestureState,
+ taskAnimationManager: TaskAnimationManager,
+ inputMonitorCompat: InputMonitorCompat,
+ swipeUpHandlerFactory: AbsSwipeUpHandler.Factory,
+ onCompleteCallback: Consumer<OtherActivityInputConsumer>,
+ inputEventReceiver: InputChannelCompat.InputEventReceiver,
+ taskbarManager: TaskbarManager,
+ swipeUpProxyProvider: Function<GestureState?, AnimatedFloat?>,
+ overviewCommandHelper: OverviewCommandHelper,
+ event: MotionEvent,
+ ): InputConsumer where T : RecentsViewContainer, T : StatefulContainer<S> {
+ val tac = taskbarManager.currentActivityContext
+ val bubbleControllers = tac?.bubbleControllers
+ if (bubbleControllers != null && BubbleBarInputConsumer.isEventOnBubbles(tac, event)) {
+ val consumer: InputConsumer =
+ BubbleBarInputConsumer(tisContext, bubbleControllers, inputMonitorCompat)
+ logInputConsumerSelectionReason(
+ consumer,
+ newCompoundString("event is on bubbles, creating new input consumer"),
+ )
+ return consumer
+ }
+ val progressProxy = swipeUpProxyProvider.apply(gestureState)
+ if (progressProxy != null) {
+ val consumer: InputConsumer =
+ ProgressDelegateInputConsumer(
+ tisContext,
+ taskAnimationManager,
+ gestureState,
+ inputMonitorCompat,
+ progressProxy,
+ )
+
+ logInputConsumerSelectionReason(
+ consumer,
+ newCompoundString(
+ "mSwipeUpProxyProvider has been set, using ProgressDelegateInputConsumer"
+ ),
+ )
+
+ return consumer
+ }
+
+ val canStartSystemGesture =
+ if (gestureState.isTrackpadGesture) deviceState.canStartTrackpadGesture()
+ else deviceState.canStartSystemGesture()
+
+ if (!get(tisContext).isUserUnlocked) {
+ val reasonString = newCompoundString("device locked")
+ val consumer =
+ if (canStartSystemGesture) {
+ // This handles apps launched in direct boot mode (e.g. dialer) as well as apps
+ // launched while device is locked even after exiting direct boot mode (e.g.
+ // camera).
+ createDeviceLockedInputConsumer(
+ tisContext,
+ resetGestureInputConsumer,
+ deviceState,
+ gestureState,
+ taskAnimationManager,
+ inputMonitorCompat,
+ reasonString.append("%scan start system gesture", SUBSTRING_PREFIX),
+ )
+ } else {
+ getDefaultInputConsumer(
+ resetGestureInputConsumer,
+ reasonString.append("%scannot start system gesture", SUBSTRING_PREFIX),
+ )
+ }
+ logInputConsumerSelectionReason(consumer, reasonString)
+ return consumer
+ }
+
+ var reasonString: CompoundString
+ var base: InputConsumer
+ // When there is an existing recents animation running, bypass systemState check as this is
+ // a followup gesture and the first gesture started in a valid system state.
+ if (canStartSystemGesture || previousGestureState.isRecentsAnimationRunning) {
+ reasonString =
+ newCompoundString(
+ if (canStartSystemGesture)
+ "can start system gesture, trying to use base consumer"
+ else "recents animation was running, trying to use base consumer"
+ )
+ base =
+ newBaseConsumer<S, T>(
+ tisContext,
+ resetGestureInputConsumer,
+ overviewComponentObserver,
+ deviceState,
+ previousGestureState,
+ gestureState,
+ taskAnimationManager,
+ inputMonitorCompat,
+ swipeUpHandlerFactory,
+ onCompleteCallback,
+ inputEventReceiver,
+ event,
+ reasonString,
+ )
+ } else {
+ reasonString =
+ newCompoundString(
+ "cannot start system gesture and recents " +
+ "animation was not running, trying to use default input consumer"
+ )
+ base = getDefaultInputConsumer(resetGestureInputConsumer, reasonString)
+ }
+ if (deviceState.isGesturalNavMode || gestureState.isTrackpadGesture) {
+ handleOrientationSetup(base)
+ }
+ if (deviceState.isFullyGesturalNavMode || gestureState.isTrackpadGesture) {
+ val reasonPrefix =
+ "device is in gesture navigation mode or 3-button mode with a trackpad gesture"
+ if (deviceState.canTriggerAssistantAction(event)) {
+ reasonString.append(
+ "%s%s%sgesture can trigger the assistant, " +
+ "trying to use assistant input consumer",
+ NEWLINE_PREFIX,
+ reasonPrefix,
+ SUBSTRING_PREFIX,
+ )
+ base =
+ tryCreateAssistantInputConsumer(
+ tisContext,
+ deviceState,
+ inputMonitorCompat,
+ base,
+ gestureState,
+ event,
+ reasonString,
+ )
+ }
+
+ // If Taskbar is present, we listen for swipe or cursor hover events to unstash it.
+ if (tac != null && base !is AssistantInputConsumer) {
+ // Present always on large screen or on small screen w/ flag
+ val useTaskbarConsumer =
+ (tac.deviceProfile.isTaskbarPresent &&
+ !tac.isPhoneMode &&
+ !tac.isInStashedLauncherState)
+ if (canStartSystemGesture && useTaskbarConsumer) {
+ reasonString.append(
+ "%s%s%sTaskbarActivityContext != null, " +
+ "using TaskbarUnstashInputConsumer",
+ NEWLINE_PREFIX,
+ reasonPrefix,
+ SUBSTRING_PREFIX,
+ )
+ base =
+ TaskbarUnstashInputConsumer(
+ tisContext,
+ base,
+ inputMonitorCompat,
+ tac,
+ overviewCommandHelper,
+ gestureState,
+ )
+ }
+ }
+ if (Flags.enableBubblesLongPressNavHandle()) {
+ // Create bubbles input consumer before NavHandleLongPressInputConsumer.
+ // This allows for nav handle to fall back to bubbles.
+ if (deviceState.isBubblesExpanded) {
+ reasonString =
+ newCompoundString(reasonPrefix)
+ .append(
+ "%sbubbles expanded, trying to use default input consumer",
+ SUBSTRING_PREFIX,
+ )
+ // Bubbles can handle home gesture itself.
+ base = getDefaultInputConsumer(resetGestureInputConsumer, reasonString)
+ }
+ }
+
+ val navHandle = tac?.navHandle ?: SystemUiProxy.INSTANCE[tisContext]
+ if (
+ canStartSystemGesture &&
+ !previousGestureState.isRecentsAnimationRunning &&
+ navHandle.canNavHandleBeLongPressed() &&
+ !ignoreThreeFingerTrackpadForNavHandleLongPress(gestureState)
+ ) {
+ reasonString.append(
+ "%s%s%sNot running recents animation, ",
+ NEWLINE_PREFIX,
+ reasonPrefix,
+ SUBSTRING_PREFIX,
+ )
+ if (tac != null && tac.navHandle.canNavHandleBeLongPressed()) {
+ reasonString.append("stashed handle is long-pressable, ")
+ }
+ reasonString.append("using NavHandleLongPressInputConsumer")
+ base =
+ NavHandleLongPressInputConsumer(
+ tisContext,
+ base,
+ inputMonitorCompat,
+ deviceState,
+ navHandle,
+ gestureState,
+ )
+ }
+
+ if (!Flags.enableBubblesLongPressNavHandle()) {
+ // Continue overriding nav handle input consumer with bubbles
+ if (deviceState.isBubblesExpanded) {
+ reasonString =
+ newCompoundString(reasonPrefix)
+ .append(
+ "%sbubbles expanded, trying to use default input consumer",
+ SUBSTRING_PREFIX,
+ )
+ // Bubbles can handle home gesture itself.
+ base = getDefaultInputConsumer(resetGestureInputConsumer, reasonString)
+ }
+ }
+
+ if (deviceState.isSystemUiDialogShowing) {
+ reasonString =
+ newCompoundString(reasonPrefix)
+ .append(
+ "%ssystem dialog is showing, using SysUiOverlayInputConsumer",
+ SUBSTRING_PREFIX,
+ )
+ base = SysUiOverlayInputConsumer(baseContext, deviceState, inputMonitorCompat)
+ }
+
+ if (
+ gestureState.isTrackpadGesture &&
+ canStartSystemGesture &&
+ !previousGestureState.isRecentsAnimationRunning
+ ) {
+ reasonString =
+ newCompoundString(reasonPrefix)
+ .append(
+ "%sTrackpad 3-finger gesture, using TrackpadStatusBarInputConsumer",
+ SUBSTRING_PREFIX,
+ )
+ base = TrackpadStatusBarInputConsumer(baseContext, base, inputMonitorCompat)
+ }
+
+ if (deviceState.isScreenPinningActive) {
+ reasonString =
+ newCompoundString(reasonPrefix)
+ .append(
+ "%sscreen pinning is active, using ScreenPinnedInputConsumer",
+ SUBSTRING_PREFIX,
+ )
+ // Note: we only allow accessibility to wrap this, and it replaces the previous
+ // base input consumer (which should be NO_OP anyway since topTaskLocked == true).
+ base = ScreenPinnedInputConsumer(tisContext, gestureState)
+ }
+
+ if (deviceState.canTriggerOneHandedAction(event)) {
+ reasonString.append(
+ "%s%s%sgesture can trigger one handed mode, " +
+ "using OneHandedModeInputConsumer",
+ NEWLINE_PREFIX,
+ reasonPrefix,
+ SUBSTRING_PREFIX,
+ )
+ base = OneHandedModeInputConsumer(tisContext, deviceState, base, inputMonitorCompat)
+ }
+
+ if (deviceState.isAccessibilityMenuAvailable) {
+ reasonString.append(
+ "%s%s%saccessibility menu is available, using AccessibilityInputConsumer",
+ NEWLINE_PREFIX,
+ reasonPrefix,
+ SUBSTRING_PREFIX,
+ )
+ base =
+ AccessibilityInputConsumer(
+ tisContext,
+ deviceState,
+ gestureState,
+ base,
+ inputMonitorCompat,
+ )
+ }
+ } else {
+ val reasonPrefix = "device is not in gesture navigation mode"
+ if (deviceState.isScreenPinningActive) {
+ reasonString =
+ newCompoundString(reasonPrefix)
+ .append(
+ "%sscreen pinning is active, trying to use default input consumer",
+ SUBSTRING_PREFIX,
+ )
+ base = getDefaultInputConsumer(resetGestureInputConsumer, reasonString)
+ }
+
+ if (deviceState.canTriggerOneHandedAction(event)) {
+ reasonString.append(
+ "%s%s%sgesture can trigger one handed mode, " +
+ "using OneHandedModeInputConsumer",
+ NEWLINE_PREFIX,
+ reasonPrefix,
+ SUBSTRING_PREFIX,
+ )
+ base = OneHandedModeInputConsumer(tisContext, deviceState, base, inputMonitorCompat)
+ }
+ }
+ logInputConsumerSelectionReason(base, reasonString)
+ return base
+ }
+
+ @JvmStatic
+ fun tryCreateAssistantInputConsumer(
+ context: Context,
+ deviceState: RecentsAnimationDeviceState,
+ inputMonitorCompat: InputMonitorCompat,
+ gestureState: GestureState,
+ motionEvent: MotionEvent,
+ ): InputConsumer {
+ return tryCreateAssistantInputConsumer(
+ context,
+ deviceState,
+ inputMonitorCompat,
+ InputConsumer.NO_OP,
+ gestureState,
+ motionEvent,
+ CompoundString.NO_OP,
+ )
+ }
+
+ private fun tryCreateAssistantInputConsumer(
+ context: Context,
+ deviceState: RecentsAnimationDeviceState,
+ inputMonitorCompat: InputMonitorCompat,
+ base: InputConsumer,
+ gestureState: GestureState,
+ motionEvent: MotionEvent,
+ reasonString: CompoundString,
+ ): InputConsumer {
+ return if (deviceState.isGestureBlockedTask(gestureState.runningTask)) {
+ reasonString.append(
+ "%sis gesture-blocked task, using base input consumer",
+ SUBSTRING_PREFIX,
+ )
+ base
+ } else {
+ reasonString.append("%susing AssistantInputConsumer", SUBSTRING_PREFIX)
+ AssistantInputConsumer(
+ context,
+ gestureState,
+ base,
+ inputMonitorCompat,
+ deviceState,
+ motionEvent,
+ )
+ }
+ }
+
+ @VisibleForTesting
+ @JvmStatic
+ fun <S : BaseState<S>, T> newBaseConsumer(
+ context: Context,
+ resetGestureInputConsumer: ResetGestureInputConsumer?,
+ overviewComponentObserver: OverviewComponentObserver,
+ deviceState: RecentsAnimationDeviceState,
+ previousGestureState: GestureState,
+ gestureState: GestureState,
+ taskAnimationManager: TaskAnimationManager,
+ inputMonitorCompat: InputMonitorCompat,
+ swipeUpHandlerFactory: AbsSwipeUpHandler.Factory,
+ onCompleteCallback: Consumer<OtherActivityInputConsumer>,
+ inputEventReceiver: InputChannelCompat.InputEventReceiver,
+ event: MotionEvent,
+ reasonString: CompoundString,
+ ): InputConsumer where T : RecentsViewContainer, T : StatefulContainer<S> {
+ if (deviceState.isKeyguardShowingOccluded) {
+ // This handles apps showing over the lockscreen (e.g. camera)
+ return createDeviceLockedInputConsumer(
+ context,
+ resetGestureInputConsumer,
+ deviceState,
+ gestureState,
+ taskAnimationManager,
+ inputMonitorCompat,
+ reasonString.append(
+ "%skeyguard is showing occluded, " +
+ "trying to use device locked input consumer",
+ SUBSTRING_PREFIX,
+ ),
+ )
+ }
+
+ reasonString.append("%skeyguard is not showing occluded", SUBSTRING_PREFIX)
+
+ val runningTask = gestureState.runningTask
+ // Use overview input consumer for sharesheets on top of home.
+ val forceOverviewInputConsumer =
+ gestureState.getContainerInterface<S, T>().isStarted() &&
+ runningTask != null &&
+ runningTask.isRootChooseActivity
+
+ if (!Flags.enableShellTopTaskTracking()) {
+ // In the case where we are in an excluded, translucent overlay, ignore it and treat the
+ // running activity as the task behind the overlay.
+ val otherVisibleTask = runningTask?.visibleNonExcludedTask
+ if (otherVisibleTask != null) {
+ ActiveGestureProtoLogProxy.logUpdateGestureStateRunningTask(
+ otherVisibleTask.packageName ?: "MISSING",
+ runningTask.packageName ?: "MISSING",
+ )
+ gestureState.updateRunningTask(otherVisibleTask)
+ }
+ }
+
+ val previousGestureAnimatedToLauncher =
+ (previousGestureState.isRunningAnimationToLauncher ||
+ deviceState.isPredictiveBackToHomeInProgress)
+ // with shell-transitions, home is resumed during recents animation, so
+ // explicitly check against recents animation too.
+ val launcherResumedThroughShellTransition =
+ (gestureState.getContainerInterface<S, T>().isResumed() &&
+ !previousGestureState.isRecentsAnimationRunning)
+ // If a task fragment within Launcher is resumed
+ val launcherChildActivityResumed =
+ (com.android.launcher3.Flags.useActivityOverlay() &&
+ runningTask != null &&
+ runningTask.isHomeTask &&
+ overviewComponentObserver.isHomeAndOverviewSame &&
+ !launcherResumedThroughShellTransition &&
+ !previousGestureState.isRecentsAnimationRunning)
+
+ return if (gestureState.getContainerInterface<S, T>().isInLiveTileMode()) {
+ createOverviewInputConsumer<S, T>(
+ resetGestureInputConsumer,
+ deviceState,
+ inputMonitorCompat,
+ previousGestureState,
+ gestureState,
+ event,
+ reasonString.append(
+ "%sis in live tile mode, trying to use overview input consumer",
+ SUBSTRING_PREFIX,
+ ),
+ )
+ } else if (runningTask == null) {
+ getDefaultInputConsumer(
+ resetGestureInputConsumer,
+ reasonString.append("%srunning task == null", SUBSTRING_PREFIX),
+ )
+ } else if (
+ previousGestureAnimatedToLauncher ||
+ launcherResumedThroughShellTransition ||
+ forceOverviewInputConsumer
+ ) {
+ createOverviewInputConsumer<S, T>(
+ resetGestureInputConsumer,
+ deviceState,
+ inputMonitorCompat,
+ previousGestureState,
+ gestureState,
+ event,
+ reasonString.append(
+ if (previousGestureAnimatedToLauncher)
+ ("%sprevious gesture animated to launcher, " +
+ "trying to use overview input consumer")
+ else
+ (if (launcherResumedThroughShellTransition)
+ ("%slauncher resumed through a shell transition, " +
+ "trying to use overview input consumer")
+ else
+ ("%sforceOverviewInputConsumer == true, " +
+ "trying to use overview input consumer")),
+ SUBSTRING_PREFIX,
+ ),
+ )
+ } else if (deviceState.isGestureBlockedTask(runningTask) || launcherChildActivityResumed) {
+ getDefaultInputConsumer(
+ resetGestureInputConsumer,
+ reasonString.append(
+ if (launcherChildActivityResumed)
+ "%sis launcher child-task, trying to use default input consumer"
+ else "%sis gesture-blocked task, trying to use default input consumer",
+ SUBSTRING_PREFIX,
+ ),
+ )
+ } else {
+ reasonString.append("%susing OtherActivityInputConsumer", SUBSTRING_PREFIX)
+ createOtherActivityInputConsumer<S, T>(
+ context,
+ swipeUpHandlerFactory,
+ overviewComponentObserver,
+ deviceState,
+ taskAnimationManager,
+ inputMonitorCompat,
+ onCompleteCallback,
+ inputEventReceiver,
+ gestureState,
+ event,
+ )
+ }
+ }
+
+ private fun createDeviceLockedInputConsumer(
+ context: Context,
+ resetGestureInputConsumer: ResetGestureInputConsumer?,
+ deviceState: RecentsAnimationDeviceState,
+ gestureState: GestureState,
+ taskAnimationManager: TaskAnimationManager,
+ inputMonitorCompat: InputMonitorCompat,
+ reasonString: CompoundString,
+ ): InputConsumer {
+ return if (
+ (deviceState.isFullyGesturalNavMode || gestureState.isTrackpadGesture) &&
+ gestureState.runningTask != null
+ ) {
+ reasonString.append(
+ "%sdevice is in gesture nav mode or 3-button mode with a trackpad " +
+ "gesture and running task != null, using DeviceLockedInputConsumer",
+ SUBSTRING_PREFIX,
+ )
+ DeviceLockedInputConsumer(
+ context,
+ deviceState,
+ taskAnimationManager,
+ gestureState,
+ inputMonitorCompat,
+ )
+ } else {
+ getDefaultInputConsumer(
+ resetGestureInputConsumer,
+ reasonString.append(
+ if (deviceState.isFullyGesturalNavMode || gestureState.isTrackpadGesture)
+ "%srunning task == null, trying to use default input consumer"
+ else
+ ("%sdevice is not in gesture nav mode and it's not a trackpad gesture," +
+ " trying to use default input consumer"),
+ SUBSTRING_PREFIX,
+ ),
+ )
+ }
+ }
+
+ private fun <S : BaseState<S>, T> createOverviewInputConsumer(
+ resetGestureInputConsumer: ResetGestureInputConsumer?,
+ deviceState: RecentsAnimationDeviceState,
+ inputMonitorCompat: InputMonitorCompat,
+ previousGestureState: GestureState,
+ gestureState: GestureState,
+ event: MotionEvent,
+ reasonString: CompoundString,
+ ): InputConsumer where T : RecentsViewContainer, T : StatefulContainer<S> {
+ val container: T =
+ gestureState.getContainerInterface<S, T>().getCreatedContainer()
+ ?: return getDefaultInputConsumer(
+ resetGestureInputConsumer,
+ reasonString.append(
+ "%sactivity == null, trying to use default input consumer",
+ SUBSTRING_PREFIX,
+ ),
+ )
+
+ val rootView = container.rootView
+ val hasWindowFocus = rootView?.hasWindowFocus() ?: false
+ val isPreviousGestureAnimatingToLauncher =
+ (previousGestureState.isRunningAnimationToLauncher ||
+ deviceState.isPredictiveBackToHomeInProgress)
+ val isInLiveTileMode: Boolean =
+ gestureState.getContainerInterface<S, T>().isInLiveTileMode()
+
+ reasonString.append(
+ if (hasWindowFocus) "%sactivity has window focus"
+ else
+ (if (isPreviousGestureAnimatingToLauncher)
+ "%sprevious gesture is still animating to launcher"
+ else if (isInLiveTileMode) "%sdevice is in live mode"
+ else "%sall overview focus conditions failed"),
+ SUBSTRING_PREFIX,
+ )
+ return if (hasWindowFocus || isPreviousGestureAnimatingToLauncher || isInLiveTileMode) {
+ reasonString.append(
+ "%soverview should have focus, using OverviewInputConsumer",
+ SUBSTRING_PREFIX,
+ )
+ OverviewInputConsumer(
+ gestureState,
+ container,
+ inputMonitorCompat,
+ /* startingInActivityBounds= */ false,
+ )
+ } else {
+ reasonString.append(
+ "%soverview shouldn't have focus, using OverviewWithoutFocusInputConsumer",
+ SUBSTRING_PREFIX,
+ )
+ val disableHorizontalSwipe = deviceState.isInExclusionRegion(event)
+ OverviewWithoutFocusInputConsumer(
+ container.asContext(),
+ deviceState,
+ gestureState,
+ inputMonitorCompat,
+ disableHorizontalSwipe,
+ )
+ }
+ }
+
+ /** Returns the [ResetGestureInputConsumer] if user is unlocked, else NO_OP. */
+ private fun getDefaultInputConsumer(
+ resetGestureInputConsumer: ResetGestureInputConsumer?,
+ reasonString: CompoundString,
+ ): InputConsumer {
+ return if (resetGestureInputConsumer != null) {
+ reasonString.append(
+ "%smResetGestureInputConsumer initialized, using ResetGestureInputConsumer",
+ SUBSTRING_PREFIX,
+ )
+ resetGestureInputConsumer
+ } else {
+ reasonString.append(
+ "%smResetGestureInputConsumer not initialized, using no-op input consumer",
+ SUBSTRING_PREFIX,
+ )
+ // mResetGestureInputConsumer isn't initialized until onUserUnlocked(), so reset to
+ // NO_OP until then (we never want these to be null).
+ InputConsumer.NO_OP
+ }
+ }
+
+ private fun <S : BaseState<S>, T> createOtherActivityInputConsumer(
+ context: Context,
+ swipeUpHandlerFactory: AbsSwipeUpHandler.Factory,
+ overviewComponentObserver: OverviewComponentObserver,
+ deviceState: RecentsAnimationDeviceState,
+ taskAnimationManager: TaskAnimationManager,
+ inputMonitorCompat: InputMonitorCompat,
+ onCompleteCallback: Consumer<OtherActivityInputConsumer>,
+ inputEventReceiver: InputChannelCompat.InputEventReceiver,
+ gestureState: GestureState,
+ event: MotionEvent,
+ ): InputConsumer where T : RecentsViewContainer, T : StatefulContainer<S> {
+ val shouldDefer =
+ (!overviewComponentObserver.isHomeAndOverviewSame ||
+ gestureState
+ .getContainerInterface<S, T>()
+ .deferStartingActivity(deviceState, event))
+ val disableHorizontalSwipe = deviceState.isInExclusionRegion(event)
+ return OtherActivityInputConsumer(
+ /* base= */ context,
+ deviceState,
+ taskAnimationManager,
+ gestureState,
+ /* isDeferredDownTarget= */ shouldDefer,
+ onCompleteCallback,
+ inputMonitorCompat,
+ inputEventReceiver,
+ disableHorizontalSwipe,
+ swipeUpHandlerFactory,
+ )
+ }
+
+ private fun newCompoundString(substring: String): CompoundString {
+ return CompoundString("%s%s", NEWLINE_PREFIX, substring)
+ }
+
+ private fun logInputConsumerSelectionReason(
+ consumer: InputConsumer,
+ reasonString: CompoundString,
+ ) {
+ ActiveGestureProtoLogProxy.logSetInputConsumer(consumer.name, reasonString.toString())
+ if ((consumer.type and InputConsumer.TYPE_OTHER_ACTIVITY) != 0) {
+ ActiveGestureLog.INSTANCE.trackEvent(
+ ActiveGestureErrorDetector.GestureEvent.FLAG_USING_OTHER_ACTIVITY_INPUT_CONSUMER
+ )
+ }
+ }
+
+ private fun ignoreThreeFingerTrackpadForNavHandleLongPress(
+ gestureState: GestureState
+ ): Boolean {
+ return (com.android.launcher3.Flags.ignoreThreeFingerTrackpadForNavHandleLongPress() &&
+ gestureState.isThreeFingerTrackpadGesture)
+ }
+
+ private fun handleOrientationSetup(baseInputConsumer: InputConsumer) {
+ baseInputConsumer.notifyOrientationSetup()
+ }
+}
diff --git a/quickstep/src/com/android/quickstep/LauncherBackAnimationController.java b/quickstep/src/com/android/quickstep/LauncherBackAnimationController.java
index 6719ab7..4bd9ffb 100644
--- a/quickstep/src/com/android/quickstep/LauncherBackAnimationController.java
+++ b/quickstep/src/com/android/quickstep/LauncherBackAnimationController.java
@@ -49,8 +49,8 @@
import android.window.BackEvent;
import android.window.BackMotionEvent;
import android.window.BackProgressAnimator;
+import android.window.IBackAnimationHandoffHandler;
import android.window.IOnBackInvokedCallback;
-
import com.android.app.animation.Interpolators;
import com.android.internal.policy.SystemBarUtils;
import com.android.internal.view.AppearanceRegion;
@@ -225,6 +225,12 @@
public void setTriggerBack(boolean triggerBack) {
// TODO(b/261654570): track touch from the Launcher process.
}
+
+ @Override
+ public void setHandoffHandler(IBackAnimationHandoffHandler unused) {
+ // For now, Launcher handles this internally so it doesn't need to hand off the
+ // animation.
+ }
}
private static class RemoteAnimationRunnerStub extends IRemoteAnimationRunner.Stub {
@@ -384,10 +390,11 @@
// Move the window along the Y axis.
float top = (screenHeight - height) * 0.5f + deltaY;
// Move the window along the X axis.
- float left = event.getSwipeEdge() == BackEvent.EDGE_RIGHT
- ? progress * mWindowScaleMarginX
- : screenWidth - progress * mWindowScaleMarginX - width;
-
+ float left = switch (event.getSwipeEdge()) {
+ case BackEvent.EDGE_RIGHT -> progress * mWindowScaleMarginX;
+ case BackEvent.EDGE_LEFT -> screenWidth - progress * mWindowScaleMarginX - width;
+ default -> (screenWidth - width) / 2;
+ };
mCurrentRect.set(left, top, left + width, top + height);
float cornerRadius = Utilities.mapRange(
progress, mWindowScaleStartCornerRadius, mWindowScaleEndCornerRadius);
diff --git a/quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java b/quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java
index dacafd4..6087dc2 100644
--- a/quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java
+++ b/quickstep/src/com/android/quickstep/LauncherSwipeHandlerV2.java
@@ -46,7 +46,6 @@
import com.android.launcher3.views.FloatingIconView;
import com.android.launcher3.views.FloatingView;
import com.android.launcher3.widget.LauncherAppWidgetHostView;
-import com.android.quickstep.fallback.window.RecentsWindowManager;
import com.android.quickstep.util.RectFSpringAnim;
import com.android.quickstep.util.ScalingWorkspaceRevealAnim;
import com.android.quickstep.util.StaggeredWorkspaceAnim;
@@ -54,6 +53,7 @@
import com.android.quickstep.views.FloatingWidgetView;
import com.android.quickstep.views.RecentsView;
import com.android.quickstep.views.TaskView;
+import com.android.systemui.animation.TransitionAnimator;
import com.android.systemui.shared.system.InputConsumerController;
import java.util.Collections;
@@ -108,7 +108,9 @@
mContainer.getRootView().setForceHideBackArrow(true);
- if (!canUseWorkspaceView || appCanEnterPip || mIsSwipeForSplit) {
+ boolean handOffAnimation = TransitionAnimator.Companion.longLivedReturnAnimationsEnabled()
+ && mHandOffAnimationToHome;
+ if (handOffAnimation || !canUseWorkspaceView || appCanEnterPip || mIsSwipeForSplit) {
return new LauncherHomeAnimationFactory() {
@Nullable
diff --git a/quickstep/src/com/android/quickstep/OrientationTouchTransformer.java b/quickstep/src/com/android/quickstep/OrientationTouchTransformer.java
index a03c0f8..ef103c4 100644
--- a/quickstep/src/com/android/quickstep/OrientationTouchTransformer.java
+++ b/quickstep/src/com/android/quickstep/OrientationTouchTransformer.java
@@ -37,6 +37,7 @@
import com.android.launcher3.util.DisplayController.Info;
import com.android.launcher3.util.NavigationMode;
import com.android.launcher3.util.window.CachedDisplayInfo;
+import com.android.quickstep.util.ActiveGestureProtoLogProxy;
import com.android.systemui.shared.Flags;
import java.io.PrintWriter;
@@ -111,13 +112,13 @@
mNavBarGesturalHeight);
}
- private void refreshTouchRegion(Info info, Resources newRes) {
+ private void refreshTouchRegion(Info info, Resources newRes, String reason) {
// Swipe touch regions are independent of nav mode, so we have to clear them explicitly
// here to avoid, for ex, a nav region for 2-button rotation 0 being used for 3-button mode
// It tries to cache and reuse swipe regions whenever possible based only on rotation
mResources = newRes;
mSwipeTouchRegions.clear();
- resetSwipeRegions(info);
+ resetSwipeRegions(info, reason);
}
void setNavigationMode(NavigationMode newMode, Info info, Resources newRes) {
@@ -128,7 +129,7 @@
return;
}
this.mMode = newMode;
- refreshTouchRegion(info, newRes);
+ refreshTouchRegion(info, newRes, "setNavigationMode");
}
void setGesturalHeight(int newGesturalHeight, Info info, Resources newRes) {
@@ -136,7 +137,7 @@
return;
}
mNavBarGesturalHeight = newGesturalHeight;
- refreshTouchRegion(info, newRes);
+ refreshTouchRegion(info, newRes, "setGesturalHeight");
}
/**
@@ -147,14 +148,14 @@
*
* @see #enableMultipleRegions(boolean, Info)
*/
- void createOrAddTouchRegion(Info info) {
+ void createOrAddTouchRegion(Info info, String reason) {
mCachedDisplayInfo = new CachedDisplayInfo(info.currentSize, info.rotation);
if (mQuickStepStartingRotation > QUICKSTEP_ROTATION_UNINITIALIZED
&& mCachedDisplayInfo.rotation == mQuickStepStartingRotation) {
// User already was swiping and the current screen is same rotation as the starting one
// Remove active nav bars in other rotations except for the one we started out in
- resetSwipeRegions(info);
+ resetSwipeRegions(info, reason);
return;
}
OrientationRectF region = mSwipeTouchRegions.get(mCachedDisplayInfo);
@@ -163,9 +164,9 @@
}
if (mEnableMultipleRegions) {
- mSwipeTouchRegions.put(mCachedDisplayInfo, createRegionForDisplay(info));
+ mSwipeTouchRegions.put(mCachedDisplayInfo, createRegionForDisplay(info, reason));
} else {
- resetSwipeRegions(info);
+ resetSwipeRegions(info, reason);
}
}
@@ -184,7 +185,7 @@
mActiveTouchRotation = 0;
mQuickStepStartingRotation = QUICKSTEP_ROTATION_UNINITIALIZED;
}
- resetSwipeRegions(info);
+ resetSwipeRegions(info, "enableMultipleRegions");
}
/**
@@ -198,7 +199,7 @@
*/
void setSingleActiveRegion(Info displayInfo) {
mActiveTouchRotation = displayInfo.rotation;
- resetSwipeRegions(displayInfo);
+ resetSwipeRegions(displayInfo, "setSingleActiveRegion");
}
/**
@@ -207,19 +208,21 @@
* To be called whenever we want to stop tracking more than one swipe region.
* Ok to call multiple times.
*/
- private void resetSwipeRegions(Info region) {
+ private void resetSwipeRegions(Info region, String reason) {
if (enableLog()) {
- Log.d(TAG, "clearing all regions except rotation: " + mCachedDisplayInfo.rotation);
+ Log.d(TAG, "clearing all regions except rotation: " + mCachedDisplayInfo.rotation
+ + " reason=" + reason);
}
mCachedDisplayInfo = new CachedDisplayInfo(region.currentSize, region.rotation);
OrientationRectF regionToKeep = mSwipeTouchRegions.get(mCachedDisplayInfo);
if (regionToKeep == null) {
- regionToKeep = createRegionForDisplay(region);
+ regionToKeep = createRegionForDisplay(region, reason);
}
mSwipeTouchRegions.clear();
mSwipeTouchRegions.put(mCachedDisplayInfo, regionToKeep);
updateAssistantRegions(regionToKeep);
+ updateOneHandedRegions(regionToKeep);
}
private void resetSwipeRegions() {
@@ -228,15 +231,17 @@
if (regionToKeep != null) {
mSwipeTouchRegions.put(mCachedDisplayInfo, regionToKeep);
updateAssistantRegions(regionToKeep);
+ updateOneHandedRegions(regionToKeep);
}
}
- private OrientationRectF createRegionForDisplay(Info display) {
+ private OrientationRectF createRegionForDisplay(Info display, String reason) {
if (enableLog()) {
Log.d(TAG, "creating rotation region for: " + mCachedDisplayInfo.rotation
+ " with mode: " + mMode + " displayRotation: " + display.rotation +
" displaySize: " + display.currentSize +
- " navBarHeight: " + mNavBarGesturalHeight);
+ " navBarHeight: " + mNavBarGesturalHeight +
+ " reason: " + reason);
}
Point size = display.currentSize;
@@ -264,9 +269,10 @@
orientationRectF.top = orientationRectF.bottom - touchHeight;
}
}
- // One handed gestural only active on portrait mode
- mOneHandedModeRegion.set(0, orientationRectF.bottom - mNavBarLargerGesturalHeight,
- size.x, size.y);
+ updateOneHandedRegions(orientationRectF);
+ ActiveGestureProtoLogProxy.logCreateTouchRegionForDisplay(rotation, size, orientationRectF,
+ mOneHandedModeRegion, mNavBarGesturalHeight, mNavBarLargerGesturalHeight,
+ reason);
return orientationRectF;
}
@@ -286,6 +292,12 @@
mAssistantRightRegion.left = orientationRectF.right - assistantWidth;
}
+ private void updateOneHandedRegions(OrientationRectF orientationRectF) {
+ // One handed gestural only active on portrait mode
+ mOneHandedModeRegion.set(0, orientationRectF.bottom - mNavBarLargerGesturalHeight,
+ orientationRectF.right, orientationRectF.bottom);
+ }
+
boolean touchInAssistantRegion(MotionEvent ev) {
return mAssistantLeftRegion.contains(ev.getX(), ev.getY())
|| mAssistantRightRegion.contains(ev.getX(), ev.getY());
@@ -411,9 +423,11 @@
OrientationRectF rectF = mSwipeTouchRegions.get(key);
regions.append(rectF).append(" ");
}
- pw.println(regions.toString());
+ pw.println(regions);
pw.println(" mNavBarGesturalHeight=" + mNavBarGesturalHeight);
pw.println(" mNavBarLargerGesturalHeight=" + mNavBarLargerGesturalHeight);
+ pw.println(" mAssistantLeftRegion=" + mAssistantLeftRegion);
+ pw.println(" mAssistantRightRegion=" + mAssistantRightRegion);
pw.println(" mOneHandedModeRegion=" + mOneHandedModeRegion);
}
}
diff --git a/quickstep/src/com/android/quickstep/RecentsAnimationController.java b/quickstep/src/com/android/quickstep/RecentsAnimationController.java
index 60fcff8..055aadb 100644
--- a/quickstep/src/com/android/quickstep/RecentsAnimationController.java
+++ b/quickstep/src/com/android/quickstep/RecentsAnimationController.java
@@ -21,9 +21,11 @@
import android.os.Bundle;
import android.os.RemoteException;
import android.util.Log;
+import android.view.RemoteAnimationTarget;
import android.view.SurfaceControl;
import android.view.WindowManagerGlobal;
import android.window.PictureInPictureSurfaceTransaction;
+import android.window.WindowAnimationState;
import androidx.annotation.UiThread;
@@ -32,6 +34,7 @@
import com.android.launcher3.util.Preconditions;
import com.android.launcher3.util.RunnableList;
import com.android.quickstep.util.ActiveGestureProtoLogProxy;
+import com.android.systemui.animation.TransitionAnimator;
import com.android.systemui.shared.recents.model.ThumbnailData;
import com.android.systemui.shared.system.InteractionJankMonitorWrapper;
import com.android.systemui.shared.system.RecentsAnimationControllerCompat;
@@ -53,8 +56,6 @@
private boolean mFinishRequested = false;
// Only valid when mFinishRequested == true.
private boolean mFinishTargetIsLauncher;
- // Only valid when mFinishRequested == true
- private boolean mLauncherIsVisibleAtFinish;
private RunnableList mPendingFinishCallbacks = new RunnableList();
public RecentsAnimationController(RecentsAnimationControllerCompat controller,
@@ -90,6 +91,16 @@
}
@UiThread
+ public void handOffAnimation(RemoteAnimationTarget[] targets, WindowAnimationState[] states) {
+ if (TransitionAnimator.Companion.longLivedReturnAnimationsEnabled()) {
+ UI_HELPER_EXECUTOR.execute(() -> mController.handOffAnimation(targets, states));
+ } else {
+ Log.e(TAG, "Tried to hand off the animation, but the feature is disabled",
+ new Exception());
+ }
+ }
+
+ @UiThread
public void finishAnimationToHome() {
finishController(true /* toRecents */, null, false /* sendUserLeaveHint */);
}
@@ -119,27 +130,13 @@
}
@UiThread
- public void finish(boolean toRecents, boolean launcherIsVisibleAtFinish,
- Runnable onFinishComplete, boolean sendUserLeaveHint) {
- Preconditions.assertUIThread();
- finishController(toRecents, launcherIsVisibleAtFinish, onFinishComplete, sendUserLeaveHint,
- false);
- }
-
- @UiThread
public void finishController(boolean toRecents, Runnable callback, boolean sendUserLeaveHint) {
- finishController(toRecents, false, callback, sendUserLeaveHint, false /* forceFinish */);
+ finishController(toRecents, callback, sendUserLeaveHint, false /* forceFinish */);
}
@UiThread
public void finishController(boolean toRecents, Runnable callback, boolean sendUserLeaveHint,
boolean forceFinish) {
- finishController(toRecents, toRecents, callback, sendUserLeaveHint, forceFinish);
- }
-
- @UiThread
- public void finishController(boolean toRecents, boolean launcherIsVisibleAtFinish,
- Runnable callback, boolean sendUserLeaveHint, boolean forceFinish) {
mPendingFinishCallbacks.add(callback);
if (!forceFinish && mFinishRequested) {
// If finish has already been requested, then add the callback to the pending list.
@@ -151,7 +148,6 @@
// Finish not yet requested
mFinishRequested = true;
mFinishTargetIsLauncher = toRecents;
- mLauncherIsVisibleAtFinish = launcherIsVisibleAtFinish;
mOnFinishedListener.accept(this);
Runnable finishCb = () -> {
mController.finish(toRecents, sendUserLeaveHint, new IResultReceiver.Stub() {
@@ -228,14 +224,6 @@
return mFinishTargetIsLauncher;
}
- /**
- * RecentsAnimationListeners can check this in onRecentsAnimationFinished() to determine whether
- * the animation was finished to launcher vs an app.
- */
- public boolean getLauncherIsVisibleAtFinish() {
- return mLauncherIsVisibleAtFinish;
- }
-
public void dump(String prefix, PrintWriter pw) {
pw.println(prefix + "RecentsAnimationController:");
diff --git a/quickstep/src/com/android/quickstep/RemoteTargetGluer.java b/quickstep/src/com/android/quickstep/RemoteTargetGluer.java
index 06b2972..91d0776 100644
--- a/quickstep/src/com/android/quickstep/RemoteTargetGluer.java
+++ b/quickstep/src/com/android/quickstep/RemoteTargetGluer.java
@@ -93,8 +93,7 @@
BaseContainerInterface sizingStrategy, int numHandles, boolean forDesktop) {
RemoteTargetHandle[] handles = new RemoteTargetHandle[numHandles];
for (int i = 0; i < numHandles; i++) {
- TaskViewSimulator tvs = new TaskViewSimulator(context, sizingStrategy);
- tvs.setIsDesktopTask(forDesktop , i);
+ TaskViewSimulator tvs = new TaskViewSimulator(context, sizingStrategy, forDesktop , i);
TransformParams transformParams = new TransformParams();
handles[i] = new RemoteTargetHandle(tvs, transformParams);
}
diff --git a/quickstep/src/com/android/quickstep/RotationTouchHelper.java b/quickstep/src/com/android/quickstep/RotationTouchHelper.java
index 79abc0f..909cc35 100644
--- a/quickstep/src/com/android/quickstep/RotationTouchHelper.java
+++ b/quickstep/src/com/android/quickstep/RotationTouchHelper.java
@@ -236,7 +236,8 @@
return;
}
- mOrientationTouchTransformer.createOrAddTouchRegion(mDisplayController.getInfo());
+ mOrientationTouchTransformer.createOrAddTouchRegion(mDisplayController.getInfo(),
+ "RTH.updateGestureTouchRegions");
}
/**
@@ -273,7 +274,8 @@
if (hasGestures(mMode)) {
updateGestureTouchRegions();
- mOrientationTouchTransformer.createOrAddTouchRegion(info);
+ mOrientationTouchTransformer.createOrAddTouchRegion(info,
+ "RTH.onDisplayInfoChanged");
mCurrentAppRotation = mDisplayRotation;
/* Update nav bars on the following:
diff --git a/quickstep/src/com/android/quickstep/SystemUiProxy.java b/quickstep/src/com/android/quickstep/SystemUiProxy.java
index 6c4c74c..2991e64 100644
--- a/quickstep/src/com/android/quickstep/SystemUiProxy.java
+++ b/quickstep/src/com/android/quickstep/SystemUiProxy.java
@@ -55,6 +55,7 @@
import androidx.annotation.MainThread;
import androidx.annotation.Nullable;
+import androidx.annotation.VisibleForTesting;
import androidx.annotation.WorkerThread;
import com.android.internal.logging.InstanceId;
@@ -70,6 +71,7 @@
import com.android.quickstep.util.unfold.ProxyUnfoldTransitionProvider;
import com.android.systemui.shared.recents.ISystemUiProxy;
import com.android.systemui.shared.recents.model.ThumbnailData;
+import com.android.systemui.shared.system.QuickStepContract;
import com.android.systemui.shared.system.QuickStepContract.SystemUiStateFlags;
import com.android.systemui.shared.system.RecentsAnimationControllerCompat;
import com.android.systemui.shared.system.RecentsAnimationListener;
@@ -313,7 +315,7 @@
setBackToLauncherCallback(mBackToLauncherCallback, mBackToLauncherRunner);
setUnfoldAnimationListener(mUnfoldAnimationListener);
setDesktopTaskListener(mDesktopTaskListener);
- setAssistantOverridesRequested(ContextualSearchInvoker.newInstance(mContext)
+ setAssistantOverridesRequested(new ContextualSearchInvoker(mContext)
.getSysUiAssistOverrideInvocationTypes());
mStateChangeCallbacks.forEach(Runnable::run);
@@ -1634,4 +1636,24 @@
pw.println("\tmUnfoldAnimationListener=" + mUnfoldAnimationListener);
pw.println("\tmDragAndDrop=" + mDragAndDrop);
}
+
+ /**
+ * Adds all interfaces held by this proxy to the bundle
+ */
+ @VisibleForTesting
+ public void addAllInterfaces(Bundle out) {
+ QuickStepContract.addInterface(mSystemUiProxy, out);
+ QuickStepContract.addInterface(mPip, out);
+ QuickStepContract.addInterface(mBubbles, out);
+ QuickStepContract.addInterface(mSysuiUnlockAnimationController, out);
+ QuickStepContract.addInterface(mSplitScreen, out);
+ QuickStepContract.addInterface(mOneHanded, out);
+ QuickStepContract.addInterface(mShellTransitions, out);
+ QuickStepContract.addInterface(mStartingWindow, out);
+ QuickStepContract.addInterface(mRecentTasks, out);
+ QuickStepContract.addInterface(mBackAnimation, out);
+ QuickStepContract.addInterface(mDesktopMode, out);
+ QuickStepContract.addInterface(mUnfoldAnimation, out);
+ QuickStepContract.addInterface(mDragAndDrop, out);
+ }
}
diff --git a/quickstep/src/com/android/quickstep/TaskOverlayFactory.java b/quickstep/src/com/android/quickstep/TaskOverlayFactory.java
index 0dbdcb7..ff9c9f6 100644
--- a/quickstep/src/com/android/quickstep/TaskOverlayFactory.java
+++ b/quickstep/src/com/android/quickstep/TaskOverlayFactory.java
@@ -348,11 +348,14 @@
}
/** Called when the snapshot has updated its full screen drawing parameters. */
- public void setFullscreenParams(TaskView.FullscreenDrawParams fullscreenParams) {}
+ public void setFullscreenParams(FullscreenDrawParams fullscreenParams) {}
/** Sets visibility for the overlay associated elements. */
public void setVisibility(int visibility) {}
+ /** See {@link View#addChildrenForAccessibility(ArrayList)} */
+ public void addChildForAccessibility(ArrayList<View> outChildren) {}
+
private class ScreenshotSystemShortcut extends SystemShortcut {
private final RecentsViewContainer mContainer;
diff --git a/quickstep/src/com/android/quickstep/TaskViewUtils.java b/quickstep/src/com/android/quickstep/TaskViewUtils.java
index 07ee479..084cede 100644
--- a/quickstep/src/com/android/quickstep/TaskViewUtils.java
+++ b/quickstep/src/com/android/quickstep/TaskViewUtils.java
@@ -47,12 +47,15 @@
import android.content.Context;
import android.graphics.Matrix;
import android.graphics.Matrix.ScaleToFit;
+import android.graphics.PointF;
import android.graphics.Rect;
import android.graphics.RectF;
+import android.util.Pair;
import android.view.RemoteAnimationTarget;
import android.view.SurfaceControl;
import android.view.View;
import android.window.TransitionInfo;
+import android.window.WindowAnimationState;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -784,4 +787,44 @@
animatorHandler.accept(dockFadeAnimator);
return dockFadeAnimator;
}
+
+ /**
+ * Creates an array of {@link RemoteAnimationTarget}s and a matching array of
+ * {@link WindowAnimationState}s from the provided handles.
+ * Important: the ordering of the two arrays is the same, so the state at each index of the
+ * second applies to the target in the same index of the first.
+ *
+ * @param handles The handles wrapping each target.
+ * @param timestamp The start time of the current frame.
+ * @param velocityPxPerMs The current velocity of the target animations.
+ */
+ @NonNull
+ public static Pair<RemoteAnimationTarget[], WindowAnimationState[]> extractTargetsAndStates(
+ @NonNull RemoteTargetHandle[] handles, long timestamp,
+ @NonNull PointF velocityPxPerMs) {
+ RemoteAnimationTarget[] targets = new RemoteAnimationTarget[handles.length];
+ WindowAnimationState[] animationStates = new WindowAnimationState[handles.length];
+
+ for (int i = 0; i < handles.length; i++) {
+ targets[i] = handles[i].getTransformParams().getTargetSet().apps[i];
+
+ TaskViewSimulator taskViewSimulator = handles[i].getTaskViewSimulator();
+ RectF startRect = taskViewSimulator.getCurrentRect();
+ float cornerRadius = taskViewSimulator.getCurrentCornerRadius();
+
+ WindowAnimationState state = new WindowAnimationState();
+ state.timestamp = timestamp;
+ state.bounds = new RectF(
+ startRect.left, startRect.top, startRect.right, startRect.bottom);
+ state.topLeftRadius = cornerRadius;
+ state.topRightRadius = cornerRadius;
+ state.bottomRightRadius = cornerRadius;
+ state.bottomLeftRadius = cornerRadius;
+ state.velocityPxPerMs = velocityPxPerMs;
+
+ animationStates[i] = state;
+ }
+
+ return new Pair<>(targets, animationStates);
+ }
}
diff --git a/quickstep/src/com/android/quickstep/TopTaskTracker.java b/quickstep/src/com/android/quickstep/TopTaskTracker.java
index 80d6137..210065a 100644
--- a/quickstep/src/com/android/quickstep/TopTaskTracker.java
+++ b/quickstep/src/com/android/quickstep/TopTaskTracker.java
@@ -23,6 +23,8 @@
import static android.view.Display.DEFAULT_DISPLAY;
import static com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_TOP_OR_LEFT;
+import static com.android.launcher3.util.SplitConfigurationOptions.STAGE_TYPE_A;
+import static com.android.wm.shell.Flags.enableFlexibleSplit;
import static com.android.wm.shell.shared.GroupedTaskInfo.TYPE_SPLIT;
import android.app.ActivityManager.RunningTaskInfo;
@@ -132,6 +134,22 @@
mOrderedTaskList.removeIf(rto -> rto.taskId == taskInfo.taskId);
mOrderedTaskList.addFirst(taskInfo);
+ // Workaround for b/372067617, if the home task is being brought to front, then it will
+ // occlude all other tasks, so mark them as not-visible
+ if (taskInfo.getActivityType() == ACTIVITY_TYPE_HOME) {
+ // We've moved the task to the front of the list above, so only iterate the tasks after
+ for (int i = 1; i < mOrderedTaskList.size(); i++) {
+ final TaskInfo info = mOrderedTaskList.get(i);
+ if (info.displayId != taskInfo.displayId) {
+ // Only fall through to reset visibility for tasks on the same display as the
+ // home task being brought forward
+ continue;
+ }
+ info.isVisible = false;
+ info.isVisibleRequested = false;
+ }
+ }
+
// Keep the home display's top running task in the first while adding a non-home
// display's task to the list, to avoid showing non-home display's task upon going to
// Recents animation.
@@ -228,7 +246,8 @@
return;
}
- if (stage == SplitConfigurationOptions.STAGE_TYPE_MAIN) {
+ if (stage == SplitConfigurationOptions.STAGE_TYPE_MAIN
+ || (enableFlexibleSplit() && stage == STAGE_TYPE_A)) {
mMainStagePosition.taskId = taskId;
} else {
mSideStagePosition.taskId = taskId;
diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java
index 0242fb6..50d4dab 100644
--- a/quickstep/src/com/android/quickstep/TouchInteractionService.java
+++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java
@@ -24,7 +24,6 @@
import static com.android.launcher3.Flags.enableCursorHoverStates;
import static com.android.launcher3.Flags.enableHandleDelayedGestureCallbacks;
-import static com.android.launcher3.Flags.useActivityOverlay;
import static com.android.launcher3.LauncherPrefs.backedUpItem;
import static com.android.launcher3.MotionEventsUtils.isTrackpadMotionEvent;
import static com.android.launcher3.MotionEventsUtils.isTrackpadMultiFingerSwipe;
@@ -35,22 +34,9 @@
import static com.android.quickstep.GestureState.DEFAULT_STATE;
import static com.android.quickstep.GestureState.TrackpadGestureType.getTrackpadGestureType;
import static com.android.quickstep.InputConsumer.TYPE_CURSOR_HOVER;
-import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.FLAG_USING_OTHER_ACTIVITY_INPUT_CONSUMER;
+import static com.android.quickstep.InputConsumerUtils.newConsumer;
+import static com.android.quickstep.InputConsumerUtils.tryCreateAssistantInputConsumer;
import static com.android.systemui.shared.system.ActivityManagerWrapper.CLOSE_SYSTEM_WINDOWS_REASON_RECENTS;
-import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_SYSUI_PROXY;
-import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_UNFOLD_ANIMATION_FORWARDER;
-import static com.android.systemui.shared.system.QuickStepContract.KEY_EXTRA_UNLOCK_ANIMATION_CONTROLLER;
-import static com.android.wm.shell.Flags.enableBubblesLongPressNavHandle;
-import static com.android.wm.shell.shared.ShellSharedConstants.KEY_EXTRA_SHELL_BACK_ANIMATION;
-import static com.android.wm.shell.shared.ShellSharedConstants.KEY_EXTRA_SHELL_BUBBLES;
-import static com.android.wm.shell.shared.ShellSharedConstants.KEY_EXTRA_SHELL_DESKTOP_MODE;
-import static com.android.wm.shell.shared.ShellSharedConstants.KEY_EXTRA_SHELL_DRAG_AND_DROP;
-import static com.android.wm.shell.shared.ShellSharedConstants.KEY_EXTRA_SHELL_ONE_HANDED;
-import static com.android.wm.shell.shared.ShellSharedConstants.KEY_EXTRA_SHELL_PIP;
-import static com.android.wm.shell.shared.ShellSharedConstants.KEY_EXTRA_SHELL_RECENT_TASKS;
-import static com.android.wm.shell.shared.ShellSharedConstants.KEY_EXTRA_SHELL_SHELL_TRANSITIONS;
-import static com.android.wm.shell.shared.ShellSharedConstants.KEY_EXTRA_SHELL_SPLIT_SCREEN;
-import static com.android.wm.shell.shared.ShellSharedConstants.KEY_EXTRA_SHELL_STARTING_WINDOW;
import android.app.PendingIntent;
import android.app.Service;
@@ -71,7 +57,6 @@
import android.view.InputDevice;
import android.view.InputEvent;
import android.view.MotionEvent;
-import android.view.View;
import androidx.annotation.BinderThread;
import androidx.annotation.MainThread;
@@ -106,21 +91,9 @@
import com.android.quickstep.OverviewCommandHelper.CommandType;
import com.android.quickstep.fallback.window.RecentsWindowManager;
import com.android.quickstep.fallback.window.RecentsWindowSwipeHandler;
-import com.android.quickstep.inputconsumers.AccessibilityInputConsumer;
-import com.android.quickstep.inputconsumers.AssistantInputConsumer;
import com.android.quickstep.inputconsumers.BubbleBarInputConsumer;
-import com.android.quickstep.inputconsumers.DeviceLockedInputConsumer;
-import com.android.quickstep.inputconsumers.NavHandleLongPressInputConsumer;
import com.android.quickstep.inputconsumers.OneHandedModeInputConsumer;
-import com.android.quickstep.inputconsumers.OtherActivityInputConsumer;
-import com.android.quickstep.inputconsumers.OverviewInputConsumer;
-import com.android.quickstep.inputconsumers.OverviewWithoutFocusInputConsumer;
-import com.android.quickstep.inputconsumers.ProgressDelegateInputConsumer;
import com.android.quickstep.inputconsumers.ResetGestureInputConsumer;
-import com.android.quickstep.inputconsumers.ScreenPinnedInputConsumer;
-import com.android.quickstep.inputconsumers.SysUiOverlayInputConsumer;
-import com.android.quickstep.inputconsumers.TaskbarUnstashInputConsumer;
-import com.android.quickstep.inputconsumers.TrackpadStatusBarInputConsumer;
import com.android.quickstep.util.ActiveGestureLog;
import com.android.quickstep.util.ActiveGestureLog.CompoundString;
import com.android.quickstep.util.ActiveGestureProtoLogProxy;
@@ -151,6 +124,7 @@
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.lang.ref.WeakReference;
+import java.util.HashSet;
import java.util.Set;
import java.util.function.Consumer;
import java.util.function.Function;
@@ -161,7 +135,6 @@
public class TouchInteractionService extends Service {
private static final String SUBSTRING_PREFIX = "; ";
- private static final String NEWLINE_PREFIX = "\n\t\t\t-> ";
private static final String TAG = "TouchInteractionService";
@@ -177,7 +150,7 @@
private final WeakReference<TouchInteractionService> mTis;
- @Nullable private Runnable mOnOverviewTargetChangeListener = null;
+ private final Set<Runnable> mOnOverviewTargetChangeListeners = new HashSet<>();
private TISBinder(TouchInteractionService tis) {
mTis = new WeakReference<>(tis);
@@ -186,30 +159,30 @@
@BinderThread
public void onInitialize(Bundle bundle) {
ISystemUiProxy proxy = ISystemUiProxy.Stub.asInterface(
- bundle.getBinder(KEY_EXTRA_SYSUI_PROXY));
- IPip pip = IPip.Stub.asInterface(bundle.getBinder(KEY_EXTRA_SHELL_PIP));
- IBubbles bubbles = IBubbles.Stub.asInterface(bundle.getBinder(KEY_EXTRA_SHELL_BUBBLES));
+ bundle.getBinder(ISystemUiProxy.DESCRIPTOR));
+ IPip pip = IPip.Stub.asInterface(bundle.getBinder(IPip.DESCRIPTOR));
+ IBubbles bubbles = IBubbles.Stub.asInterface(bundle.getBinder(IBubbles.DESCRIPTOR));
ISplitScreen splitscreen = ISplitScreen.Stub.asInterface(bundle.getBinder(
- KEY_EXTRA_SHELL_SPLIT_SCREEN));
+ ISplitScreen.DESCRIPTOR));
IOneHanded onehanded = IOneHanded.Stub.asInterface(
- bundle.getBinder(KEY_EXTRA_SHELL_ONE_HANDED));
+ bundle.getBinder(IOneHanded.DESCRIPTOR));
IShellTransitions shellTransitions = IShellTransitions.Stub.asInterface(
- bundle.getBinder(KEY_EXTRA_SHELL_SHELL_TRANSITIONS));
+ bundle.getBinder(IShellTransitions.DESCRIPTOR));
IStartingWindow startingWindow = IStartingWindow.Stub.asInterface(
- bundle.getBinder(KEY_EXTRA_SHELL_STARTING_WINDOW));
+ bundle.getBinder(IStartingWindow.DESCRIPTOR));
ISysuiUnlockAnimationController launcherUnlockAnimationController =
ISysuiUnlockAnimationController.Stub.asInterface(
- bundle.getBinder(KEY_EXTRA_UNLOCK_ANIMATION_CONTROLLER));
+ bundle.getBinder(ISysuiUnlockAnimationController.DESCRIPTOR));
IRecentTasks recentTasks = IRecentTasks.Stub.asInterface(
- bundle.getBinder(KEY_EXTRA_SHELL_RECENT_TASKS));
+ bundle.getBinder(IRecentTasks.DESCRIPTOR));
IBackAnimation backAnimation = IBackAnimation.Stub.asInterface(
- bundle.getBinder(KEY_EXTRA_SHELL_BACK_ANIMATION));
+ bundle.getBinder(IBackAnimation.DESCRIPTOR));
IDesktopMode desktopMode = IDesktopMode.Stub.asInterface(
- bundle.getBinder(KEY_EXTRA_SHELL_DESKTOP_MODE));
+ bundle.getBinder(IDesktopMode.DESCRIPTOR));
IUnfoldAnimation unfoldTransition = IUnfoldAnimation.Stub.asInterface(
- bundle.getBinder(KEY_EXTRA_UNFOLD_ANIMATION_FORWARDER));
+ bundle.getBinder(IUnfoldAnimation.DESCRIPTOR));
IDragAndDrop dragAndDrop = IDragAndDrop.Stub.asInterface(
- bundle.getBinder(KEY_EXTRA_SHELL_DRAG_AND_DROP));
+ bundle.getBinder(IDragAndDrop.DESCRIPTOR));
MAIN_EXECUTOR.execute(() -> executeForTouchInteractionService(tis -> {
SystemUiProxy.INSTANCE.get(tis).setProxy(proxy, pip,
bubbles, splitscreen, onehanded, shellTransitions, startingWindow,
@@ -299,8 +272,7 @@
@Override
public void onAssistantOverrideInvoked(int invocationType) {
executeForTouchInteractionService(tis -> {
- if (!ContextualSearchInvoker.newInstance(tis)
- .tryStartAssistOverride(invocationType)) {
+ if (!new ContextualSearchInvoker(tis).tryStartAssistOverride(invocationType)) {
Log.w(TAG, "Failed to invoke Assist override");
}
});
@@ -526,15 +498,20 @@
tis -> tis.mDeviceState.setGestureBlockingTaskId(taskId));
}
- /** Sets a listener to be run on Overview Target updates. */
- public void setOverviewTargetChangeListener(@Nullable Runnable listener) {
- mOnOverviewTargetChangeListener = listener;
+ /** Registers a listener to be run on Overview Target updates. */
+ public void registerOverviewTargetChangeListener(@NonNull Runnable listener) {
+ mOnOverviewTargetChangeListeners.add(listener);
+ }
+
+ /** Unregisters an OverviewTargetChange listener. */
+ public void unregisterOverviewTargetChangeListener(@NonNull Runnable listener) {
+ mOnOverviewTargetChangeListeners.remove(listener);
}
protected void onOverviewTargetChange() {
- if (mOnOverviewTargetChangeListener != null) {
- mOnOverviewTargetChangeListener.run();
- mOnOverviewTargetChangeListener = null;
+ Set<Runnable> listeners = new HashSet<>(mOnOverviewTargetChangeListeners);
+ for (Runnable listener : listeners) {
+ listener.run();
}
}
@@ -959,7 +936,8 @@
+ "consuming gesture for assistant action");
mGestureState =
createGestureState(mGestureState, getTrackpadGestureType(event));
- mUncheckedConsumer = tryCreateAssistantInputConsumer(mGestureState, event);
+ mUncheckedConsumer = tryCreateAssistantInputConsumer(
+ this, mDeviceState, mInputMonitorCompat, mGestureState, event);
} else {
reasonString.append(" but event cannot trigger Assistant, "
+ "consuming gesture as no-op");
@@ -978,7 +956,23 @@
getTrackpadGestureType(event));
mConsumer.onConsumerAboutToBeSwitched();
mGestureState = newGestureState;
- mConsumer = newConsumer(prevGestureState, mGestureState, event);
+ mConsumer = newConsumer(
+ getBaseContext(),
+ this,
+ mResetGestureInputConsumer,
+ mOverviewComponentObserver,
+ mDeviceState,
+ prevGestureState,
+ mGestureState,
+ mTaskAnimationManager,
+ mInputMonitorCompat,
+ getSwipeUpHandlerFactory(),
+ this::onConsumerInactive,
+ mInputEventReceiver,
+ mTaskbarManager,
+ mSwipeUpProxyProvider,
+ mOverviewCommandHelper,
+ event);
mUncheckedConsumer = mConsumer;
} else if ((mDeviceState.isFullyGesturalNavMode() || isTrackpadMultiFingerSwipe(event))
&& mDeviceState.canTriggerAssistantAction(event)) {
@@ -991,7 +985,8 @@
// Do not change mConsumer as if there is an ongoing QuickSwitch gesture, we
// should not interrupt it. QuickSwitch assumes that interruption can only
// happen if the next gesture is also quick switch.
- mUncheckedConsumer = tryCreateAssistantInputConsumer(mGestureState, event);
+ mUncheckedConsumer = tryCreateAssistantInputConsumer(
+ this, mDeviceState, mInputMonitorCompat, mGestureState, event);
} else if (mDeviceState.canTriggerOneHandedAction(event)) {
reasonString.append("event can trigger one-handed action, "
+ "consuming gesture for one-handed action");
@@ -1073,28 +1068,6 @@
return event.isHoverEvent() && event.getSource() == InputDevice.SOURCE_MOUSE;
}
- private InputConsumer tryCreateAssistantInputConsumer(
- GestureState gestureState, MotionEvent motionEvent) {
- return tryCreateAssistantInputConsumer(
- InputConsumer.NO_OP, gestureState, motionEvent, CompoundString.NO_OP);
- }
-
- private InputConsumer tryCreateAssistantInputConsumer(
- InputConsumer base,
- GestureState gestureState,
- MotionEvent motionEvent,
- CompoundString reasonString) {
- if (mDeviceState.isGestureBlockedTask(gestureState.getRunningTask())) {
- reasonString.append(
- "%sis gesture-blocked task, using base input consumer", SUBSTRING_PREFIX);
- return base;
- } else {
- reasonString.append("%susing AssistantInputConsumer", SUBSTRING_PREFIX);
- return new AssistantInputConsumer(
- this, gestureState, base, mInputMonitorCompat, mDeviceState, motionEvent);
- }
- }
-
public GestureState createGestureState(GestureState previousGestureState,
GestureState.TrackpadGestureType trackpadGestureType) {
final GestureState gestureState;
@@ -1125,312 +1098,6 @@
return gestureState;
}
- private InputConsumer newConsumer(
- GestureState previousGestureState, GestureState newGestureState, MotionEvent event) {
- TaskbarActivityContext tac = mTaskbarManager.getCurrentActivityContext();
- BubbleControllers bubbleControllers = tac != null ? tac.getBubbleControllers() : null;
- if (bubbleControllers != null && BubbleBarInputConsumer.isEventOnBubbles(tac, event)) {
- InputConsumer consumer = new BubbleBarInputConsumer(this, bubbleControllers,
- mInputMonitorCompat);
- logInputConsumerSelectionReason(consumer, newCompoundString(
- "event is on bubbles, creating new input consumer"));
- return consumer;
- }
- AnimatedFloat progressProxy = mSwipeUpProxyProvider.apply(mGestureState);
- if (progressProxy != null) {
- InputConsumer consumer = new ProgressDelegateInputConsumer(
- this, mTaskAnimationManager, mGestureState, mInputMonitorCompat, progressProxy);
-
- logInputConsumerSelectionReason(consumer, newCompoundString(
- "mSwipeUpProxyProvider has been set, using ProgressDelegateInputConsumer"));
-
- return consumer;
- }
-
- boolean canStartSystemGesture =
- mGestureState.isTrackpadGesture() ? mDeviceState.canStartTrackpadGesture()
- : mDeviceState.canStartSystemGesture();
-
- if (!LockedUserState.get(this).isUserUnlocked()) {
- CompoundString reasonString = newCompoundString("device locked");
- InputConsumer consumer;
- if (canStartSystemGesture) {
- // This handles apps launched in direct boot mode (e.g. dialer) as well as apps
- // launched while device is locked even after exiting direct boot mode (e.g. camera).
- consumer = createDeviceLockedInputConsumer(
- newGestureState,
- reasonString.append("%scan start system gesture", SUBSTRING_PREFIX));
- } else {
- consumer = getDefaultInputConsumer(
- reasonString.append("%scannot start system gesture", SUBSTRING_PREFIX));
- }
- logInputConsumerSelectionReason(consumer, reasonString);
- return consumer;
- }
-
- CompoundString reasonString;
- InputConsumer base;
- // When there is an existing recents animation running, bypass systemState check as this is
- // a followup gesture and the first gesture started in a valid system state.
- if (canStartSystemGesture || previousGestureState.isRecentsAnimationRunning()) {
- reasonString = newCompoundString(canStartSystemGesture
- ? "can start system gesture, trying to use base consumer"
- : "recents animation was running, trying to use base consumer");
- base = newBaseConsumer(previousGestureState, newGestureState, event, reasonString);
- } else {
- reasonString = newCompoundString("cannot start system gesture and recents "
- + "animation was not running, trying to use default input consumer");
- base = getDefaultInputConsumer(reasonString);
- }
- if (mDeviceState.isGesturalNavMode() || newGestureState.isTrackpadGesture()) {
- handleOrientationSetup(base);
- }
- if (mDeviceState.isFullyGesturalNavMode() || newGestureState.isTrackpadGesture()) {
- String reasonPrefix =
- "device is in gesture navigation mode or 3-button mode with a trackpad gesture";
- if (mDeviceState.canTriggerAssistantAction(event)) {
- reasonString.append("%s%s%sgesture can trigger the assistant, "
- + "trying to use assistant input consumer",
- NEWLINE_PREFIX,
- reasonPrefix,
- SUBSTRING_PREFIX);
- base = tryCreateAssistantInputConsumer(base, newGestureState, event, reasonString);
- }
-
- // If Taskbar is present, we listen for swipe or cursor hover events to unstash it.
- if (tac != null && !(base instanceof AssistantInputConsumer)) {
- // Present always on large screen or on small screen w/ flag
- boolean useTaskbarConsumer = tac.getDeviceProfile().isTaskbarPresent
- && !tac.isPhoneMode()
- && !tac.isInStashedLauncherState();
- if (canStartSystemGesture && useTaskbarConsumer) {
- reasonString.append("%s%s%sTaskbarActivityContext != null, "
- + "using TaskbarUnstashInputConsumer",
- NEWLINE_PREFIX,
- reasonPrefix,
- SUBSTRING_PREFIX);
- base = new TaskbarUnstashInputConsumer(this, base, mInputMonitorCompat, tac,
- mOverviewCommandHelper, mGestureState);
- }
- }
- if (enableBubblesLongPressNavHandle()) {
- // Create bubbles input consumer before NavHandleLongPressInputConsumer.
- // This allows for nav handle to fall back to bubbles.
- if (mDeviceState.isBubblesExpanded()) {
- reasonString = newCompoundString(reasonPrefix).append(
- "%sbubbles expanded, trying to use default input consumer",
- SUBSTRING_PREFIX);
- // Bubbles can handle home gesture itself.
- base = getDefaultInputConsumer(reasonString);
- }
- }
-
- NavHandle navHandle = tac != null ? tac.getNavHandle()
- : SystemUiProxy.INSTANCE.get(this);
- if (canStartSystemGesture && !previousGestureState.isRecentsAnimationRunning()
- && navHandle.canNavHandleBeLongPressed()
- && !ignoreThreeFingerTrackpadForNavHandleLongPress(mGestureState)) {
- reasonString.append("%s%s%sNot running recents animation, ",
- NEWLINE_PREFIX,
- reasonPrefix,
- SUBSTRING_PREFIX);
- if (tac != null && tac.getNavHandle().canNavHandleBeLongPressed()) {
- reasonString.append("stashed handle is long-pressable, ");
- }
- reasonString.append("using NavHandleLongPressInputConsumer");
- base = new NavHandleLongPressInputConsumer(this, base, mInputMonitorCompat,
- mDeviceState, navHandle, mGestureState);
- }
-
- if (!enableBubblesLongPressNavHandle()) {
- // Continue overriding nav handle input consumer with bubbles
- if (mDeviceState.isBubblesExpanded()) {
- reasonString = newCompoundString(reasonPrefix).append(
- "%sbubbles expanded, trying to use default input consumer",
- SUBSTRING_PREFIX);
- // Bubbles can handle home gesture itself.
- base = getDefaultInputConsumer(reasonString);
- }
- }
-
- if (mDeviceState.isSystemUiDialogShowing()) {
- reasonString = newCompoundString(reasonPrefix).append(
- "%ssystem dialog is showing, using SysUiOverlayInputConsumer",
- SUBSTRING_PREFIX);
- base = new SysUiOverlayInputConsumer(
- getBaseContext(), mDeviceState, mInputMonitorCompat);
- }
-
- if (mGestureState.isTrackpadGesture()
- && canStartSystemGesture && !previousGestureState.isRecentsAnimationRunning()) {
- reasonString = newCompoundString(reasonPrefix).append(
- "%sTrackpad 3-finger gesture, using TrackpadStatusBarInputConsumer",
- SUBSTRING_PREFIX);
- base = new TrackpadStatusBarInputConsumer(getBaseContext(), base,
- mInputMonitorCompat);
- }
-
- if (mDeviceState.isScreenPinningActive()) {
- reasonString = newCompoundString(reasonPrefix).append(
- "%sscreen pinning is active, using ScreenPinnedInputConsumer",
- SUBSTRING_PREFIX);
- // Note: we only allow accessibility to wrap this, and it replaces the previous
- // base input consumer (which should be NO_OP anyway since topTaskLocked == true).
- base = new ScreenPinnedInputConsumer(this, newGestureState);
- }
-
- if (mDeviceState.canTriggerOneHandedAction(event)) {
- reasonString.append("%s%s%sgesture can trigger one handed mode, "
- + "using OneHandedModeInputConsumer",
- NEWLINE_PREFIX,
- reasonPrefix,
- SUBSTRING_PREFIX);
- base = new OneHandedModeInputConsumer(
- this, mDeviceState, base, mInputMonitorCompat);
- }
-
- if (mDeviceState.isAccessibilityMenuAvailable()) {
- reasonString.append(
- "%s%s%saccessibility menu is available, using AccessibilityInputConsumer",
- NEWLINE_PREFIX,
- reasonPrefix,
- SUBSTRING_PREFIX);
- base = new AccessibilityInputConsumer(
- this, mDeviceState, mGestureState, base, mInputMonitorCompat);
- }
- } else {
- String reasonPrefix = "device is not in gesture navigation mode";
- if (mDeviceState.isScreenPinningActive()) {
- reasonString = newCompoundString(reasonPrefix).append(
- "%sscreen pinning is active, trying to use default input consumer",
- SUBSTRING_PREFIX);
- base = getDefaultInputConsumer(reasonString);
- }
-
- if (mDeviceState.canTriggerOneHandedAction(event)) {
- reasonString.append("%s%s%sgesture can trigger one handed mode, "
- + "using OneHandedModeInputConsumer",
- NEWLINE_PREFIX,
- reasonPrefix,
- SUBSTRING_PREFIX);
- base = new OneHandedModeInputConsumer(
- this, mDeviceState, base, mInputMonitorCompat);
- }
- }
- logInputConsumerSelectionReason(base, reasonString);
- return base;
- }
-
- private CompoundString newCompoundString(String substring) {
- return new CompoundString("%s%s", NEWLINE_PREFIX, substring);
- }
-
- private boolean ignoreThreeFingerTrackpadForNavHandleLongPress(GestureState gestureState) {
- return Flags.ignoreThreeFingerTrackpadForNavHandleLongPress()
- && gestureState.isThreeFingerTrackpadGesture();
- }
-
- private void logInputConsumerSelectionReason(
- InputConsumer consumer, CompoundString reasonString) {
- ActiveGestureProtoLogProxy.logSetInputConsumer(consumer.getName(), reasonString.toString());
- if ((consumer.getType() & InputConsumer.TYPE_OTHER_ACTIVITY) != 0) {
- ActiveGestureLog.INSTANCE.trackEvent(FLAG_USING_OTHER_ACTIVITY_INPUT_CONSUMER);
- }
- }
-
- private void handleOrientationSetup(InputConsumer baseInputConsumer) {
- baseInputConsumer.notifyOrientationSetup();
- }
-
- private InputConsumer newBaseConsumer(
- GestureState previousGestureState,
- GestureState gestureState,
- MotionEvent event,
- CompoundString reasonString) {
- if (mDeviceState.isKeyguardShowingOccluded()) {
- // This handles apps showing over the lockscreen (e.g. camera)
- return createDeviceLockedInputConsumer(gestureState, reasonString.append(
- "%skeyguard is showing occluded, trying to use device locked input consumer",
- SUBSTRING_PREFIX));
- }
-
- reasonString.append("%skeyguard is not showing occluded", SUBSTRING_PREFIX);
-
- TopTaskTracker.CachedTaskInfo runningTask = gestureState.getRunningTask();
- // Use overview input consumer for sharesheets on top of home.
- boolean forceOverviewInputConsumer = gestureState.getContainerInterface().isStarted()
- && runningTask != null
- && runningTask.isRootChooseActivity();
-
- if (!com.android.wm.shell.Flags.enableShellTopTaskTracking()) {
- // In the case where we are in an excluded, translucent overlay, ignore it and treat the
- // running activity as the task behind the overlay.
- TopTaskTracker.CachedTaskInfo otherVisibleTask = runningTask == null
- ? null
- : runningTask.getVisibleNonExcludedTask();
- if (otherVisibleTask != null) {
- ActiveGestureProtoLogProxy.logUpdateGestureStateRunningTask(
- otherVisibleTask.getPackageName(), runningTask.getPackageName());
- gestureState.updateRunningTask(otherVisibleTask);
- }
- }
-
- boolean previousGestureAnimatedToLauncher =
- previousGestureState.isRunningAnimationToLauncher()
- || mDeviceState.isPredictiveBackToHomeInProgress();
- // with shell-transitions, home is resumed during recents animation, so
- // explicitly check against recents animation too.
- boolean launcherResumedThroughShellTransition =
- gestureState.getContainerInterface().isResumed()
- && !previousGestureState.isRecentsAnimationRunning();
- // If a task fragment within Launcher is resumed
- boolean launcherChildActivityResumed = useActivityOverlay()
- && runningTask != null
- && runningTask.isHomeTask()
- && mOverviewComponentObserver.isHomeAndOverviewSame()
- && !launcherResumedThroughShellTransition
- && !previousGestureState.isRecentsAnimationRunning();
-
- if (gestureState.getContainerInterface().isInLiveTileMode()) {
- return createOverviewInputConsumer(
- previousGestureState,
- gestureState,
- event,
- forceOverviewInputConsumer,
- reasonString.append(
- "%sis in live tile mode, trying to use overview input consumer",
- SUBSTRING_PREFIX));
- } else if (runningTask == null) {
- return getDefaultInputConsumer(reasonString.append(
- "%srunning task == null", SUBSTRING_PREFIX));
- } else if (previousGestureAnimatedToLauncher
- || launcherResumedThroughShellTransition
- || forceOverviewInputConsumer) {
- return createOverviewInputConsumer(
- previousGestureState,
- gestureState,
- event,
- forceOverviewInputConsumer,
- reasonString.append(previousGestureAnimatedToLauncher
- ? "%sprevious gesture animated to launcher, "
- + "trying to use overview input consumer"
- : (launcherResumedThroughShellTransition
- ? "%slauncher resumed through a shell transition, "
- + "trying to use overview input consumer"
- : "%sforceOverviewInputConsumer == true, "
- + "trying to use overview input consumer"),
- SUBSTRING_PREFIX));
- } else if (mDeviceState.isGestureBlockedTask(runningTask) || launcherChildActivityResumed) {
- return getDefaultInputConsumer(reasonString.append(launcherChildActivityResumed
- ? "%sis launcher child-task, trying to use default input consumer"
- : "%sis gesture-blocked task, trying to use default input consumer",
- SUBSTRING_PREFIX));
- } else {
- reasonString.append("%susing OtherActivityInputConsumer", SUBSTRING_PREFIX);
- return createOtherActivityInputConsumer(gestureState, event);
- }
- }
-
public AbsSwipeUpHandler.Factory getSwipeUpHandlerFactory() {
boolean recentsInWindow =
Flags.enableFallbackOverviewInWindow() || Flags.enableLauncherOverviewInWindow();
@@ -1439,80 +1106,6 @@
? mRecentsWindowSwipeHandlerFactory : mFallbackSwipeHandlerFactory);
}
- private InputConsumer createOtherActivityInputConsumer(GestureState gestureState,
- MotionEvent event) {
-
- final AbsSwipeUpHandler.Factory factory = getSwipeUpHandlerFactory();
- final boolean shouldDefer = !mOverviewComponentObserver.isHomeAndOverviewSame()
- || gestureState.getContainerInterface().deferStartingActivity(mDeviceState, event);
- final boolean disableHorizontalSwipe = mDeviceState.isInExclusionRegion(event);
- return new OtherActivityInputConsumer(this, mDeviceState, mTaskAnimationManager,
- gestureState, shouldDefer, this::onConsumerInactive,
- mInputMonitorCompat, mInputEventReceiver, disableHorizontalSwipe, factory);
- }
-
- private InputConsumer createDeviceLockedInputConsumer(
- GestureState gestureState, CompoundString reasonString) {
- if ((mDeviceState.isFullyGesturalNavMode() || gestureState.isTrackpadGesture())
- && gestureState.getRunningTask() != null) {
- reasonString.append("%sdevice is in gesture nav mode or 3-button mode with a trackpad "
- + "gesture and running task != null, using DeviceLockedInputConsumer",
- SUBSTRING_PREFIX);
- return new DeviceLockedInputConsumer(
- this, mDeviceState, mTaskAnimationManager, gestureState, mInputMonitorCompat);
- } else {
- return getDefaultInputConsumer(reasonString.append(
- mDeviceState.isFullyGesturalNavMode() || gestureState.isTrackpadGesture()
- ? "%srunning task == null, trying to use default input consumer"
- : "%sdevice is not in gesture nav mode and it's not a trackpad gesture,"
- + " trying to use default input consumer",
- SUBSTRING_PREFIX));
- }
- }
-
- public InputConsumer createOverviewInputConsumer(
- GestureState previousGestureState,
- GestureState gestureState,
- MotionEvent event,
- boolean forceOverviewInputConsumer,
- CompoundString reasonString) {
- RecentsViewContainer container = gestureState.getContainerInterface().getCreatedContainer();
- if (container == null) {
- return getDefaultInputConsumer(reasonString.append(
- "%sactivity == null, trying to use default input consumer", SUBSTRING_PREFIX));
- }
-
- View rootview = container.getRootView();
- boolean hasWindowFocus = rootview != null && rootview.hasWindowFocus();
- boolean isPreviousGestureAnimatingToLauncher =
- previousGestureState.isRunningAnimationToLauncher()
- || mDeviceState.isPredictiveBackToHomeInProgress();
- boolean isInLiveTileMode = gestureState.getContainerInterface().isInLiveTileMode();
-
- reasonString.append(hasWindowFocus
- ? "%sactivity has window focus"
- : (isPreviousGestureAnimatingToLauncher
- ? "%sprevious gesture is still animating to launcher"
- : isInLiveTileMode
- ? "%sdevice is in live mode"
- : "%sall overview focus conditions failed"), SUBSTRING_PREFIX);
- if (hasWindowFocus
- || isPreviousGestureAnimatingToLauncher
- || isInLiveTileMode) {
- reasonString.append(
- "%soverview should have focus, using OverviewInputConsumer", SUBSTRING_PREFIX);
- return new OverviewInputConsumer(gestureState, container, mInputMonitorCompat,
- false /* startingInActivityBounds */);
- } else {
- reasonString.append(
- "%soverview shouldn't have focus, using OverviewWithoutFocusInputConsumer",
- SUBSTRING_PREFIX);
- final boolean disableHorizontalSwipe = mDeviceState.isInExclusionRegion(event);
- return new OverviewWithoutFocusInputConsumer(container.asContext(), mDeviceState,
- gestureState, mInputMonitorCompat, disableHorizontalSwipe);
- }
- }
-
/**
* To be called by the consumer when it's no longer active. This can be called by any consumer
* in the hierarchy at any point during the gesture (ie. if a delegate consumer starts
diff --git a/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowManager.kt b/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowManager.kt
index 843ef6c..f4c8c99 100644
--- a/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowManager.kt
+++ b/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowManager.kt
@@ -36,11 +36,13 @@
import com.android.launcher3.LauncherAnimationRunner
import com.android.launcher3.LauncherAnimationRunner.RemoteAnimationFactory
import com.android.launcher3.R
+import com.android.launcher3.compat.AccessibilityManagerCompat
import com.android.launcher3.statehandlers.DesktopVisibilityController
import com.android.launcher3.statemanager.StateManager
import com.android.launcher3.statemanager.StateManager.AtomicAnimationFactory
import com.android.launcher3.statemanager.StatefulContainer
import com.android.launcher3.taskbar.TaskbarUIController
+import com.android.launcher3.testing.shared.TestProtocol.OVERVIEW_STATE_ORDINAL
import com.android.launcher3.util.ContextTracker
import com.android.launcher3.util.DisplayController
import com.android.launcher3.util.RunnableList
@@ -163,9 +165,19 @@
}
override fun startHome() {
+ startHome(/* finishRecentsAnimation= */ true)
+ }
+
+ fun startHome(finishRecentsAnimation: Boolean) {
val recentsView: RecentsView<*, *> = getOverviewPanel()
+
+ if (!finishRecentsAnimation) {
+ recentsView.switchToScreenshot(/* onFinishRunnable= */ null)
+ startHomeInternal()
+ return
+ }
recentsView.switchToScreenshot {
- recentsView.finishRecentsAnimation(true) { startHomeInternal() }
+ recentsView.finishRecentsAnimation(/* toRecents= */ true) { startHomeInternal() }
}
}
@@ -345,6 +357,9 @@
if (state == HOME || state == BG_LAUNCHER) {
cleanupRecentsWindow()
}
+ if (state === DEFAULT) {
+ AccessibilityManagerCompat.sendStateEventToTest(baseContext, OVERVIEW_STATE_ORDINAL)
+ }
}
private fun getStateName(state: RecentsState?): String {
@@ -442,7 +457,7 @@
}
override fun isRecentsViewVisible(): Boolean {
- return getStateManager().state!!.isRecentsViewVisible
+ return isShowing() || getStateManager().state!!.isRecentsViewVisible
}
override fun createAtomicAnimationFactory(): AtomicAnimationFactory<RecentsState?>? {
diff --git a/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowSwipeHandler.java b/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowSwipeHandler.java
index c1d3f6e..be71385 100644
--- a/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowSwipeHandler.java
+++ b/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowSwipeHandler.java
@@ -31,6 +31,7 @@
import android.content.Context;
import android.content.Intent;
import android.graphics.Matrix;
+import android.graphics.PointF;
import android.graphics.Rect;
import android.graphics.RectF;
import android.os.Bundle;
@@ -47,9 +48,11 @@
import android.view.Surface;
import android.view.SurfaceControl;
import android.view.SurfaceControl.Transaction;
+import android.view.animation.Interpolator;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.UiThread;
import com.android.launcher3.DeviceProfile;
import com.android.launcher3.Utilities;
@@ -144,6 +147,29 @@
}
}
+ @UiThread
+ @Override
+ protected void animateGestureEnd(
+ float startShift,
+ float endShift,
+ long duration,
+ @NonNull Interpolator interpolator,
+ @NonNull GestureState.GestureEndTarget endTarget,
+ @NonNull PointF velocityPxPerMs) {
+ boolean fromHomeToHome = mRunningOverHome
+ && endTarget == GestureState.GestureEndTarget.HOME;
+ if (fromHomeToHome) {
+ mRecentsWindowManager.startHome(/* finishRecentsAnimation= */ false);
+ }
+ super.animateGestureEnd(
+ startShift,
+ endShift,
+ fromHomeToHome ? 0 : duration,
+ interpolator,
+ endTarget,
+ velocityPxPerMs);
+ }
+
private void updateHomeActivityTransformDuringSwipeUp(SurfaceProperties builder,
RemoteAnimationTarget app, TransformParams params) {
if (mActiveAnimationFactory != null) {
diff --git a/quickstep/src/com/android/quickstep/inputconsumers/BubbleBarInputConsumer.java b/quickstep/src/com/android/quickstep/inputconsumers/BubbleBarInputConsumer.java
index 778c231..6b61298 100644
--- a/quickstep/src/com/android/quickstep/inputconsumers/BubbleBarInputConsumer.java
+++ b/quickstep/src/com/android/quickstep/inputconsumers/BubbleBarInputConsumer.java
@@ -114,7 +114,8 @@
if (isWithinTapTime && !swipeUpOnBubbleHandle && !mPassedTouchSlop
&& mStashedOrCollapsedOnDown) {
// Taps on the handle / collapsed state should open the bar
- mBubbleStashController.showBubbleBar(/* expandBubbles= */ true);
+ mBubbleStashController.showBubbleBar(
+ /* expandBubbles= */ true, /* bubbleBarGesture= */ true);
}
break;
}
diff --git a/quickstep/src/com/android/quickstep/inputconsumers/NavHandleLongPressHandler.java b/quickstep/src/com/android/quickstep/inputconsumers/NavHandleLongPressHandler.java
index 155d095..107babd 100644
--- a/quickstep/src/com/android/quickstep/inputconsumers/NavHandleLongPressHandler.java
+++ b/quickstep/src/com/android/quickstep/inputconsumers/NavHandleLongPressHandler.java
@@ -62,7 +62,7 @@
mStatsLogManager = StatsLogManager.newInstance(context);
mVibratorWrapper = VibratorWrapper.INSTANCE.get(mContext);
mContextualSearchHapticManager = ContextualSearchHapticManager.INSTANCE.get(context);
- mContextualSearchInvoker = ContextualSearchInvoker.newInstance(mContext);
+ mContextualSearchInvoker = new ContextualSearchInvoker(mContext);
}
/** Creates NavHandleLongPressHandler as specified by overrides */
diff --git a/quickstep/src/com/android/quickstep/interaction/AllSetActivity.java b/quickstep/src/com/android/quickstep/interaction/AllSetActivity.java
index f7f3157..99c2c1c 100644
--- a/quickstep/src/com/android/quickstep/interaction/AllSetActivity.java
+++ b/quickstep/src/com/android/quickstep/interaction/AllSetActivity.java
@@ -121,6 +121,8 @@
private TextView mHintView;
+ private final Runnable mOverviewTargetChangeRunnable = this::onOverviewTargetChanged;
+
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -193,7 +195,7 @@
LOTTIE_TERTIARY_COLOR_TOKEN, R.color.all_set_bg_tertiary),
getTheme());
- startBackgroundAnimation(getDP().isTablet);
+ setUpBackgroundAnimation(getDP().isTablet);
getIDP().addOnChangeListener(mOnIDPChangeListener);
}
@@ -218,7 +220,7 @@
Executors.UI_HELPER_EXECUTOR.execute(runnable);
}
- private void startBackgroundAnimation(boolean forTablet) {
+ private void setUpBackgroundAnimation(boolean forTablet) {
if (mVibrator == null) {
return;
}
@@ -262,7 +264,6 @@
};
}
mAnimatedBackground.addAnimatorListener(mBackgroundAnimatorListener);
- mAnimatedBackground.playAnimation();
}
private void setSetupUIVisible(boolean visible) {
@@ -285,7 +286,7 @@
private void onTISConnected(TISBinder binder) {
setSetupUIVisible(isResumed());
binder.setSwipeUpProxy(isResumed() ? this::createSwipeUpProxy : null);
- binder.setOverviewTargetChangeListener(binder::preloadOverviewForSUWAllSet);
+ binder.registerOverviewTargetChangeListener(mOverviewTargetChangeRunnable);
binder.preloadOverviewForSUWAllSet();
TaskbarManager taskbarManager = binder.getTaskbarManager();
if (taskbarManager != null) {
@@ -293,6 +294,14 @@
}
}
+ private void onOverviewTargetChanged() {
+ TISBinder binder = mTISBindHelper.getBinder();
+ if (binder != null) {
+ binder.preloadOverviewForSUWAllSet();
+ binder.unregisterOverviewTargetChangeListener(mOverviewTargetChangeRunnable);
+ }
+ }
+
@Override
protected void onPause() {
super.onPause();
@@ -309,7 +318,7 @@
if (binder != null) {
setSetupUIVisible(false);
binder.setSwipeUpProxy(null);
- binder.setOverviewTargetChangeListener(null);
+ binder.unregisterOverviewTargetChangeListener(mOverviewTargetChangeRunnable);
}
}
diff --git a/quickstep/src/com/android/quickstep/logging/StatsLogCompatManager.java b/quickstep/src/com/android/quickstep/logging/StatsLogCompatManager.java
index 2daaaf9..9bfe71f 100644
--- a/quickstep/src/com/android/quickstep/logging/StatsLogCompatManager.java
+++ b/quickstep/src/com/android/quickstep/logging/StatsLogCompatManager.java
@@ -733,48 +733,40 @@
.getQueryLength() : -1;
}
default:
- return info.getFolderIcon().getCardinality();
+ return switch (info.getItemCase()) {
+ case FOLDER_ICON -> info.getFolderIcon().getCardinality();
+ case TASK_VIEW -> info.getTaskView().getCardinality();
+ default -> 0;
+ };
}
}
private static String getPackageName(LauncherAtom.ItemInfo info) {
- switch (info.getItemCase()) {
- case APPLICATION:
- return info.getApplication().getPackageName();
- case SHORTCUT:
- return info.getShortcut().getShortcutName();
- case WIDGET:
- return info.getWidget().getPackageName();
- case TASK:
- return info.getTask().getPackageName();
- case SEARCH_ACTION_ITEM:
- return info.getSearchActionItem().getPackageName();
- default:
- return null;
- }
+ return switch (info.getItemCase()) {
+ case APPLICATION -> info.getApplication().getPackageName();
+ case SHORTCUT -> info.getShortcut().getShortcutName();
+ case WIDGET -> info.getWidget().getPackageName();
+ case TASK -> info.getTask().getPackageName();
+ case SEARCH_ACTION_ITEM -> info.getSearchActionItem().getPackageName();
+ default -> null;
+ };
}
private static String getComponentName(LauncherAtom.ItemInfo info) {
- switch (info.getItemCase()) {
- case APPLICATION:
- return info.getApplication().getComponentName();
- case SHORTCUT:
- return info.getShortcut().getShortcutName();
- case WIDGET:
- return info.getWidget().getComponentName();
- case TASK:
- return info.getTask().getComponentName();
- case SEARCH_ACTION_ITEM:
- return info.getSearchActionItem().getTitle();
- case SLICE:
- return info.getSlice().getUri();
- default:
- return null;
- }
+ return switch (info.getItemCase()) {
+ case APPLICATION -> info.getApplication().getComponentName();
+ case SHORTCUT -> info.getShortcut().getShortcutName();
+ case WIDGET -> info.getWidget().getComponentName();
+ case TASK -> info.getTask().getComponentName();
+ case TASK_VIEW -> info.getTaskView().getComponentName();
+ case SEARCH_ACTION_ITEM -> info.getSearchActionItem().getTitle();
+ case SLICE -> info.getSlice().getUri();
+ default -> null;
+ };
}
private static int getGridX(LauncherAtom.ItemInfo info, boolean parent) {
- LauncherAtom.ContainerInfo containerInfo = info.getContainerInfo();
+ ContainerInfo containerInfo = info.getContainerInfo();
if (containerInfo.getContainerCase() == FOLDER) {
if (parent) {
return containerInfo.getFolder().getWorkspace().getGridX();
@@ -802,37 +794,38 @@
}
private static int getPageId(LauncherAtom.ItemInfo info) {
- if (info.hasTask()) {
- return info.getTask().getIndex();
- }
- switch (info.getContainerInfo().getContainerCase()) {
- case FOLDER:
- return info.getContainerInfo().getFolder().getPageIndex();
- case HOTSEAT:
- return info.getContainerInfo().getHotseat().getIndex();
- case PREDICTED_HOTSEAT_CONTAINER:
- return info.getContainerInfo().getPredictedHotseatContainer().getIndex();
- case TASK_BAR_CONTAINER:
- return info.getContainerInfo().getTaskBarContainer().getIndex();
- default:
- return info.getContainerInfo().getWorkspace().getPageIndex();
- }
+ return switch (info.getItemCase()) {
+ case TASK -> info.getTask().getIndex();
+ case TASK_VIEW -> info.getTaskView().getIndex();
+ default -> getPageIdFromContainerInfo(info.getContainerInfo());
+ };
+ }
+
+ private static int getPageIdFromContainerInfo(LauncherAtom.ContainerInfo containerInfo) {
+ return switch (containerInfo.getContainerCase()) {
+ case FOLDER -> containerInfo.getFolder().getPageIndex();
+ case HOTSEAT -> containerInfo.getHotseat().getIndex();
+ case PREDICTED_HOTSEAT_CONTAINER ->
+ containerInfo.getPredictedHotseatContainer().getIndex();
+ case TASK_BAR_CONTAINER -> containerInfo.getTaskBarContainer().getIndex();
+ default -> containerInfo.getWorkspace().getPageIndex();
+ };
}
private static int getParentPageId(LauncherAtom.ItemInfo info) {
- switch (info.getContainerInfo().getContainerCase()) {
- case FOLDER:
+ return switch (info.getContainerInfo().getContainerCase()) {
+ case FOLDER -> {
if (info.getContainerInfo().getFolder().getParentContainerCase()
== ParentContainerCase.HOTSEAT) {
- return info.getContainerInfo().getFolder().getHotseat().getIndex();
+ yield info.getContainerInfo().getFolder().getHotseat().getIndex();
}
- return info.getContainerInfo().getFolder().getWorkspace().getPageIndex();
- case SEARCH_RESULT_CONTAINER:
- return info.getContainerInfo().getSearchResultContainer().getWorkspace()
- .getPageIndex();
- default:
- return info.getContainerInfo().getWorkspace().getPageIndex();
- }
+ yield info.getContainerInfo().getFolder().getWorkspace().getPageIndex();
+ }
+ case SEARCH_RESULT_CONTAINER ->
+ info.getContainerInfo().getSearchResultContainer().getWorkspace()
+ .getPageIndex();
+ default -> info.getContainerInfo().getWorkspace().getPageIndex();
+ };
}
private static int getHierarchy(LauncherAtom.ItemInfo info) {
@@ -857,25 +850,21 @@
}
private static String getStateString(int state) {
- switch (state) {
- case LAUNCHER_UICHANGED__DST_STATE__BACKGROUND:
- return "BACKGROUND";
- case LAUNCHER_UICHANGED__DST_STATE__HOME:
- return "HOME";
- case LAUNCHER_UICHANGED__DST_STATE__OVERVIEW:
- return "OVERVIEW";
- case LAUNCHER_UICHANGED__DST_STATE__ALLAPPS:
- return "ALLAPPS";
- default:
- return "INVALID";
- }
+ return switch (state) {
+ case LAUNCHER_UICHANGED__DST_STATE__BACKGROUND -> "BACKGROUND";
+ case LAUNCHER_UICHANGED__DST_STATE__HOME -> "HOME";
+ case LAUNCHER_UICHANGED__DST_STATE__OVERVIEW -> "OVERVIEW";
+ case LAUNCHER_UICHANGED__DST_STATE__ALLAPPS -> "ALLAPPS";
+ default -> "INVALID";
+ };
}
private static int getFeatures(LauncherAtom.ItemInfo info) {
- if (info.getItemCase().equals(LauncherAtom.ItemInfo.ItemCase.WIDGET)) {
- return info.getWidget().getWidgetFeatures();
- }
- return 0;
+ return switch (info.getItemCase()) {
+ case WIDGET -> info.getWidget().getWidgetFeatures();
+ case TASK_VIEW -> info.getTaskView().getType();
+ default -> 0;
+ };
}
private static int getSearchAttributes(LauncherAtom.ItemInfo info) {
diff --git a/quickstep/src/com/android/quickstep/recents/di/RecentsDependencies.kt b/quickstep/src/com/android/quickstep/recents/di/RecentsDependencies.kt
index dd11d48..b78e214 100644
--- a/quickstep/src/com/android/quickstep/recents/di/RecentsDependencies.kt
+++ b/quickstep/src/com/android/quickstep/recents/di/RecentsDependencies.kt
@@ -36,9 +36,6 @@
import com.android.quickstep.task.viewmodel.TaskOverlayViewModel
import com.android.quickstep.task.viewmodel.TaskThumbnailViewModel
import com.android.quickstep.task.viewmodel.TaskThumbnailViewModelImpl
-import com.android.quickstep.task.viewmodel.TaskViewData
-import com.android.quickstep.task.viewmodel.TaskViewModel
-import com.android.quickstep.views.TaskViewType
import com.android.systemui.shared.recents.model.Task
import kotlinx.coroutines.CoroutineName
import kotlinx.coroutines.CoroutineScope
@@ -186,17 +183,11 @@
}
}
RecentsViewData::class.java -> RecentsViewData()
- TaskViewModel::class.java -> TaskViewModel(taskViewData = inject(scopeId, extras))
- TaskViewData::class.java -> {
- val taskViewType = extras["TaskViewType"] as TaskViewType
- TaskViewData(taskViewType)
- }
TaskContainerData::class.java -> TaskContainerData()
TaskThumbnailViewData::class.java -> TaskThumbnailViewData()
TaskThumbnailViewModel::class.java ->
TaskThumbnailViewModelImpl(
recentsViewData = inject(),
- taskViewData = inject(scopeId, extras),
taskContainerData = inject(scopeId),
dispatcherProvider = inject(),
getThumbnailPositionUseCase = inject(),
diff --git a/quickstep/src/com/android/quickstep/recents/viewmodel/RecentsViewData.kt b/quickstep/src/com/android/quickstep/recents/viewmodel/RecentsViewData.kt
index 87446b0..6ccf372 100644
--- a/quickstep/src/com/android/quickstep/recents/viewmodel/RecentsViewData.kt
+++ b/quickstep/src/com/android/quickstep/recents/viewmodel/RecentsViewData.kt
@@ -22,9 +22,6 @@
class RecentsViewData {
val fullscreenProgress = MutableStateFlow(1f)
- // This is typically a View concern but it is used to invalidate rendering in other Views
- val scale = MutableStateFlow(1f)
-
// Whether the current RecentsView state supports task overlays.
// TODO(b/331753115): Derive from RecentsView state flow once migrated to MVVM.
val overlayEnabled = MutableStateFlow(false)
diff --git a/quickstep/src/com/android/quickstep/recents/viewmodel/RecentsViewModel.kt b/quickstep/src/com/android/quickstep/recents/viewmodel/RecentsViewModel.kt
index c511005..cfebb81 100644
--- a/quickstep/src/com/android/quickstep/recents/viewmodel/RecentsViewModel.kt
+++ b/quickstep/src/com/android/quickstep/recents/viewmodel/RecentsViewModel.kt
@@ -34,10 +34,6 @@
recentsTasksRepository.setVisibleTasks(visibleTaskIdList.toSet())
}
- fun updateScale(scale: Float) {
- recentsViewData.scale.value = scale
- }
-
fun updateFullscreenProgress(fullscreenProgress: Float) {
recentsViewData.fullscreenProgress.value = fullscreenProgress
}
diff --git a/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailView.kt b/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailView.kt
index a8c8659..0c783d3 100644
--- a/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailView.kt
+++ b/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailView.kt
@@ -17,7 +17,6 @@
package com.android.quickstep.task.thumbnail
import android.content.Context
-import android.content.res.Configuration
import android.graphics.Color
import android.graphics.Outline
import android.graphics.Rect
@@ -29,7 +28,6 @@
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.view.isInvisible
import com.android.launcher3.R
-import com.android.launcher3.Utilities
import com.android.launcher3.util.ViewPool
import com.android.quickstep.recents.di.RecentsDependencies
import com.android.quickstep.recents.di.get
@@ -39,9 +37,7 @@
import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.SnapshotSplash
import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.Uninitialized
import com.android.quickstep.task.viewmodel.TaskThumbnailViewModel
-import com.android.quickstep.util.TaskCornerRadius
import com.android.quickstep.views.FixedSizeImageView
-import com.android.systemui.shared.system.QuickStepContract
import kotlinx.coroutines.CoroutineName
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
@@ -63,18 +59,15 @@
private val splashIcon: FixedSizeImageView by lazy { findViewById(R.id.splash_icon) }
private var uiState: TaskThumbnailUiState = Uninitialized
- private var inheritedScale: Float = 1f
- private val _measuredBounds = Rect()
- private val measuredBounds: Rect
- get() {
- _measuredBounds.set(0, 0, measuredWidth, measuredHeight)
- return _measuredBounds
+ private val bounds = Rect()
+
+ var cornerRadius: Float = 0f
+ set(value) {
+ field = value
+ invalidateOutline()
}
- private var overviewCornerRadius: Float = TaskCornerRadius.get(context)
- private var fullscreenCornerRadius: Float = QuickStepContract.getWindowCornerRadius(context)
-
constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
@@ -114,19 +107,12 @@
splashIcon.alpha = splashAlpha
}
.launchIn(viewAttachedScope)
- viewModel.cornerRadiusProgress.onEach { invalidateOutline() }.launchIn(viewAttachedScope)
- viewModel.inheritedScale
- .onEach { viewModelInheritedScale ->
- inheritedScale = viewModelInheritedScale
- invalidateOutline()
- }
- .launchIn(viewAttachedScope)
clipToOutline = true
outlineProvider =
object : ViewOutlineProvider() {
override fun getOutline(view: View, outline: Outline) {
- outline.setRoundRect(measuredBounds, getCurrentCornerRadius())
+ outline.setRoundRect(bounds, cornerRadius)
}
}
}
@@ -157,6 +143,8 @@
if (uiState is SnapshotSplash) {
setImageMatrix()
}
+ bounds.set(0, 0, w, h)
+ invalidateOutline()
}
override fun setScaleX(scaleX: Float) {
@@ -171,14 +159,6 @@
splashIcon.scaleY = 1 / scaleY
}
- override fun onConfigurationChanged(newConfig: Configuration?) {
- super.onConfigurationChanged(newConfig)
-
- overviewCornerRadius = TaskCornerRadius.get(context)
- fullscreenCornerRadius = QuickStepContract.getWindowCornerRadius(context)
- invalidateOutline()
- }
-
private fun resetViews() {
liveTileView.isInvisible = true
thumbnailView.isInvisible = true
@@ -214,13 +194,6 @@
thumbnailView.imageMatrix = viewModel.getThumbnailPositionState(width, height, isLayoutRtl)
}
- private fun getCurrentCornerRadius() =
- Utilities.mapRange(
- viewModel.cornerRadiusProgress.value,
- overviewCornerRadius,
- fullscreenCornerRadius,
- ) / inheritedScale
-
private companion object {
const val TAG = "TaskThumbnailView"
}
diff --git a/quickstep/src/com/android/quickstep/task/viewmodel/TaskThumbnailViewModel.kt b/quickstep/src/com/android/quickstep/task/viewmodel/TaskThumbnailViewModel.kt
index f55462a..a048a1d 100644
--- a/quickstep/src/com/android/quickstep/task/viewmodel/TaskThumbnailViewModel.kt
+++ b/quickstep/src/com/android/quickstep/task/viewmodel/TaskThumbnailViewModel.kt
@@ -19,19 +19,9 @@
import android.graphics.Matrix
import com.android.quickstep.task.thumbnail.TaskThumbnailUiState
import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.StateFlow
/** ViewModel for representing TaskThumbnails */
interface TaskThumbnailViewModel {
- /**
- * Progress for changes in corner radius. progress: 0 = overview corner radius; 1 = fullscreen
- * corner radius.
- */
- val cornerRadiusProgress: StateFlow<Float>
-
- /** The accumulated View.scale value for parent Views up to and including RecentsView */
- val inheritedScale: Flow<Float>
-
/** Provides the level of dimming that the View should have */
val dimProgress: Flow<Float>
diff --git a/quickstep/src/com/android/quickstep/task/viewmodel/TaskThumbnailViewModelImpl.kt b/quickstep/src/com/android/quickstep/task/viewmodel/TaskThumbnailViewModelImpl.kt
index 8b15a82..b6cb984 100644
--- a/quickstep/src/com/android/quickstep/task/viewmodel/TaskThumbnailViewModelImpl.kt
+++ b/quickstep/src/com/android/quickstep/task/viewmodel/TaskThumbnailViewModelImpl.kt
@@ -38,7 +38,6 @@
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
-import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.flatMapLatest
@@ -50,7 +49,6 @@
@OptIn(ExperimentalCoroutinesApi::class)
class TaskThumbnailViewModelImpl(
recentsViewData: RecentsViewData,
- taskViewData: TaskViewData,
taskContainerData: TaskContainerData,
dispatcherProvider: DispatcherProvider,
private val tasksRepository: RecentTasksRepository,
@@ -61,15 +59,6 @@
private val splashProgress = MutableStateFlow(flowOf(0f))
private var taskId: Int = INVALID_TASK_ID
- override val cornerRadiusProgress =
- if (taskViewData.isOutlineFormedByThumbnailView) recentsViewData.fullscreenProgress
- else MutableStateFlow(1f).asStateFlow()
-
- override val inheritedScale =
- combine(recentsViewData.scale, taskViewData.scale) { recentsScale, taskScale ->
- recentsScale * taskScale
- }
-
override val dimProgress: Flow<Float> =
combine(taskContainerData.taskMenuOpenProgress, recentsViewData.tintAmount) {
taskMenuOpenProgress,
diff --git a/quickstep/src/com/android/quickstep/task/viewmodel/TaskViewData.kt b/quickstep/src/com/android/quickstep/task/viewmodel/TaskViewData.kt
deleted file mode 100644
index 7a9ecf2..0000000
--- a/quickstep/src/com/android/quickstep/task/viewmodel/TaskViewData.kt
+++ /dev/null
@@ -1,29 +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.quickstep.task.viewmodel
-
-import com.android.quickstep.views.TaskViewType
-import kotlinx.coroutines.flow.MutableStateFlow
-
-class TaskViewData(taskViewType: TaskViewType) {
- // This is typically a View concern but it is used to invalidate rendering in other Views
- val scale = MutableStateFlow(1f)
-
- // TODO(b/331753115): This property should not be in TaskViewData once TaskView is MVVM.
- /** Whether outline of TaskView is formed by outline thumbnail view(s). */
- val isOutlineFormedByThumbnailView: Boolean = taskViewType != TaskViewType.DESKTOP
-}
diff --git a/quickstep/src/com/android/quickstep/util/ContextualSearchInvoker.kt b/quickstep/src/com/android/quickstep/util/ContextualSearchInvoker.kt
index bd454c0..3be8ea6 100644
--- a/quickstep/src/com/android/quickstep/util/ContextualSearchInvoker.kt
+++ b/quickstep/src/com/android/quickstep/util/ContextualSearchInvoker.kt
@@ -21,8 +21,8 @@
import android.app.contextualsearch.ContextualSearchManager.FEATURE_CONTEXTUAL_SEARCH
import android.content.Context
import android.util.Log
+import androidx.annotation.VisibleForTesting
import com.android.internal.app.AssistUtils
-import com.android.launcher3.R
import com.android.launcher3.logging.StatsLogManager
import com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_LAUNCH_ASSISTANT_FAILED_SERVICE_ERROR
import com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_LAUNCH_OMNI_ATTEMPTED_OVER_KEYGUARD
@@ -31,23 +31,26 @@
import com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_LAUNCH_OMNI_FAILED_NOT_AVAILABLE
import com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_LAUNCH_OMNI_FAILED_SETTING_DISABLED
import com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_LAUNCH_OMNI_SUCCESSFUL_HOME
-import com.android.launcher3.util.ResourceBasedOverride
+import com.android.quickstep.BaseContainerInterface
import com.android.quickstep.DeviceConfigWrapper
+import com.android.quickstep.OverviewComponentObserver
+import com.android.quickstep.RecentsAnimationDeviceState
import com.android.quickstep.SystemUiProxy
import com.android.quickstep.TopTaskTracker
+import com.android.quickstep.views.RecentsView
import com.android.systemui.shared.system.QuickStepContract
/** Handles invocations and checks for Contextual Search. */
-open class ContextualSearchInvoker
+class ContextualSearchInvoker
internal constructor(
- protected val context: Context,
+ private val context: Context,
private val contextualSearchStateManager: ContextualSearchStateManager,
private val topTaskTracker: TopTaskTracker,
private val systemUiProxy: SystemUiProxy,
- protected val statsLogManager: StatsLogManager,
+ private val statsLogManager: StatsLogManager,
private val contextualSearchHapticManager: ContextualSearchHapticManager,
private val contextualSearchManager: ContextualSearchManager?,
-) : ResourceBasedOverride {
+) {
constructor(
context: Context
) : this(
@@ -61,7 +64,7 @@
)
/** @return Array of AssistUtils.INVOCATION_TYPE_* that we want to handle instead of SysUI. */
- open fun getSysUiAssistOverrideInvocationTypes(): IntArray {
+ fun getSysUiAssistOverrideInvocationTypes(): IntArray {
val overrideInvocationTypes = com.android.launcher3.util.IntArray()
if (context.packageManager.hasSystemFeature(FEATURE_CONTEXTUAL_SEARCH)) {
overrideInvocationTypes.add(AssistUtils.INVOCATION_TYPE_HOME_BUTTON_LONG_PRESS)
@@ -183,7 +186,15 @@
if (contextualSearchManager == null) {
return false
}
- contextualSearchManager.startContextualSearch(entryPoint)
+ val recentsContainerInterface = getRecentsContainerInterface()
+ if (recentsContainerInterface?.isInLiveTileMode() == true) {
+ Log.i(TAG, "Contextual Search invocation attempted: live tile")
+ endLiveTileMode(recentsContainerInterface) {
+ contextualSearchManager.startContextualSearch(entryPoint)
+ }
+ } else {
+ contextualSearchManager.startContextualSearch(entryPoint)
+ }
return true
}
@@ -199,6 +210,42 @@
return systemUiProxy.lastSystemUiStateFlags and KEYGUARD_SHOWING_SYSUI_FLAGS != 0L
}
+ @VisibleForTesting
+ fun getRecentsContainerInterface(): BaseContainerInterface<*, *>? {
+ val rads = RecentsAnimationDeviceState(context)
+ val observer = OverviewComponentObserver(context, rads)
+ try {
+ return observer.containerInterface
+ } finally {
+ observer.onDestroy()
+ rads.destroy()
+ }
+ }
+
+ /**
+ * End the live tile mode.
+ *
+ * @param onCompleteRunnable Runnable to run when the live tile is paused. May run immediately.
+ */
+ private fun endLiveTileMode(
+ recentsContainerInterface: BaseContainerInterface<*, *>?,
+ onCompleteRunnable: Runnable,
+ ) {
+ val recentsViewContainer = recentsContainerInterface?.createdContainer
+ if (recentsViewContainer == null) {
+ onCompleteRunnable.run()
+ return
+ }
+ val recentsView: RecentsView<*, *> = recentsViewContainer.getOverviewPanel()
+ recentsView.switchToScreenshot {
+ recentsView.finishRecentsAnimation(
+ true, /* toRecents */
+ false, /* shouldPip */
+ onCompleteRunnable,
+ )
+ }
+ }
+
companion object {
private const val TAG = "ContextualSearchInvoker"
const val SHADE_EXPANDED_SYSUI_FLAGS =
@@ -208,14 +255,5 @@
(QuickStepContract.SYSUI_STATE_BOUNCER_SHOWING or
QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING or
QuickStepContract.SYSUI_STATE_STATUS_BAR_KEYGUARD_SHOWING_OCCLUDED)
-
- @JvmStatic
- fun newInstance(context: Context): ContextualSearchInvoker {
- return ResourceBasedOverride.Overrides.getObject(
- ContextualSearchInvoker::class.java,
- context,
- R.string.contextual_search_invoker_class,
- )
- }
}
}
diff --git a/quickstep/src/com/android/quickstep/util/ContextualSearchStateManager.java b/quickstep/src/com/android/quickstep/util/ContextualSearchStateManager.java
index 083f192..f75d3b3 100644
--- a/quickstep/src/com/android/quickstep/util/ContextualSearchStateManager.java
+++ b/quickstep/src/com/android/quickstep/util/ContextualSearchStateManager.java
@@ -24,7 +24,6 @@
import static com.android.launcher3.util.MainThreadInitializedObject.forOverride;
import static com.android.quickstep.util.SystemActionConstants.SYSTEM_ACTION_ID_SEARCH_SCREEN;
-import android.annotation.Nullable;
import android.app.PendingIntent;
import android.app.RemoteAction;
import android.content.Context;
@@ -78,7 +77,6 @@
this::onContextualSearchSettingChanged;
protected final EventLogArray mEventLogArray = new EventLogArray(TAG, MAX_DEBUG_EVENT_SIZE);
- @Nullable private SettingsCache mSettingsCache;
// Cached value whether the ContextualSearch intent filter matched any enabled components.
private boolean mIsContextualSearchIntentAvailable;
private boolean mIsContextualSearchSettingEnabled;
@@ -108,11 +106,10 @@
context, mContextualSearchPackage, Intent.ACTION_PACKAGE_ADDED,
Intent.ACTION_PACKAGE_CHANGED, Intent.ACTION_PACKAGE_REMOVED);
- mSettingsCache = SettingsCache.INSTANCE.get(context);
- mSettingsCache.register(SEARCH_ALL_ENTRYPOINTS_ENABLED_URI,
+ SettingsCache.INSTANCE.get(context).register(SEARCH_ALL_ENTRYPOINTS_ENABLED_URI,
mContextualSearchSettingChangedListener);
onContextualSearchSettingChanged(
- mSettingsCache.getValue(SEARCH_ALL_ENTRYPOINTS_ENABLED_URI));
+ SettingsCache.INSTANCE.get(context).getValue(SEARCH_ALL_ENTRYPOINTS_ENABLED_URI));
SystemUiProxy.INSTANCE.get(mContext).addOnStateChangeListener(mSysUiStateChangeListener);
}
@@ -227,7 +224,7 @@
UI_HELPER_EXECUTOR.getHandler().postDelayed(
() -> {
boolean contextualSearchInvoked =
- ContextualSearchInvoker.newInstance(mContext).show(
+ new ContextualSearchInvoker(mContext).show(
ENTRYPOINT_SYSTEM_ACTION);
if (contextualSearchInvoked) {
String runningPackage =
@@ -266,11 +263,8 @@
public void close() {
mContextualSearchPackageReceiver.unregisterReceiverSafely(mContext);
unregisterSearchScreenSystemAction();
-
- if (mSettingsCache != null) {
- mSettingsCache.unregister(SEARCH_ALL_ENTRYPOINTS_ENABLED_URI,
- mContextualSearchSettingChangedListener);
- }
+ SettingsCache.INSTANCE.get(mContext).unregister(SEARCH_ALL_ENTRYPOINTS_ENABLED_URI,
+ mContextualSearchSettingChangedListener);
SystemUiProxy.INSTANCE.get(mContext).removeOnStateChangeListener(mSysUiStateChangeListener);
}
diff --git a/quickstep/src/com/android/quickstep/util/RecentsViewUtils.kt b/quickstep/src/com/android/quickstep/util/RecentsViewUtils.kt
index c3b072d..908e9f9 100644
--- a/quickstep/src/com/android/quickstep/util/RecentsViewUtils.kt
+++ b/quickstep/src/com/android/quickstep/util/RecentsViewUtils.kt
@@ -48,16 +48,6 @@
return otherTasks + desktopTasks
}
- /** Returns the expected index of the focus task. */
- fun getFocusedTaskIndex(taskGroups: List<GroupTask>): Int {
- // The focused task index is placed after the desktop tasks views.
- return if (enableLargeDesktopWindowingTile()) {
- taskGroups.count { it.taskViewType == TaskViewType.DESKTOP }
- } else {
- 0
- }
- }
-
/** Counts [TaskView]s that are [DesktopTaskView] instances. */
fun getDesktopTaskViewCount(taskViews: Iterable<TaskView>): Int =
taskViews.count { it is DesktopTaskView }
@@ -81,6 +71,30 @@
): TaskView? =
taskViews.firstOrNull { it.isLargeTile && !(splitSelectActive && it is DesktopTaskView) }
+ /** Returns the expected focus task. */
+ fun getExpectedFocusedTask(taskViews: Iterable<TaskView>): TaskView? =
+ if (enableLargeDesktopWindowingTile()) taskViews.firstOrNull { it !is DesktopTaskView }
+ else taskViews.firstOrNull()
+
+ /**
+ * Returns the [TaskView] that should be the current page during task binding, in the following
+ * priorities:
+ * 1. Running task
+ * 2. Focused task
+ * 3. First non-desktop task
+ * 4. Last desktop task
+ * 5. null otherwise
+ */
+ fun getExpectedCurrentTask(
+ runningTaskView: TaskView?,
+ focusedTaskView: TaskView?,
+ taskViews: Iterable<TaskView>,
+ ): TaskView? =
+ runningTaskView
+ ?: focusedTaskView
+ ?: taskViews.firstOrNull { it !is DesktopTaskView }
+ ?: taskViews.lastOrNull()
+
/**
* Returns the first TaskView that is not large
*
diff --git a/quickstep/src/com/android/quickstep/util/SplitAnimationTimings.java b/quickstep/src/com/android/quickstep/util/SplitAnimationTimings.java
index 90569b4..3a6d9b0 100644
--- a/quickstep/src/com/android/quickstep/util/SplitAnimationTimings.java
+++ b/quickstep/src/com/android/quickstep/util/SplitAnimationTimings.java
@@ -17,6 +17,7 @@
package com.android.quickstep.util;
import static com.android.app.animation.Interpolators.LINEAR;
+import static com.android.app.animation.Interpolators.STANDARD;
import android.view.animation.Interpolator;
@@ -38,6 +39,8 @@
int TABLET_APP_PAIR_LAUNCH_DURATION = 998;
/** Total duration (ms) for launching an app pair from its icon on phones. */
int PHONE_APP_PAIR_LAUNCH_DURATION = 915;
+ /** Total duration (ms) for fading out desktop tasks in split mode. */
+ int DESKTOP_FADE_OUT_DURATION = 200;
// Initialize timing classes so they can be accessed statically
SplitAnimationTimings TABLET_OVERVIEW_TO_SPLIT = new TabletOverviewToSplitTimings();
@@ -83,6 +86,10 @@
return (float) getStagedRectSlideEnd() / getDuration();
}
+ default float getDesktopFadeSplitAnimationEndOffset() {
+ return (float) DESKTOP_FADE_OUT_DURATION / getDuration();
+ }
+
// DEFAULT VALUES: We define default values here so that SplitAnimationTimings can be used
// flexibly in animation-running functions, e.g. a single function that handles 2 types of split
// animations. The values are not intended to be used, and can safely be removed if refactoring
@@ -124,5 +131,9 @@
default float getAppRevealEndOffset() { return 0; }
default Interpolator getCellSplitInterpolator() { return LINEAR; }
default Interpolator getIconFadeInterpolator() { return LINEAR; }
+
+ default Interpolator getDesktopTaskScaleInterpolator() {
+ return STANDARD;
+ }
}
diff --git a/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java b/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java
index d35a36a..1eb91ae 100644
--- a/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java
+++ b/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java
@@ -106,6 +106,7 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
+import java.util.Optional;
import java.util.function.Consumer;
/**
@@ -941,6 +942,10 @@
mLauncher, mLauncher.getDragLayer(),
null /* thumbnail */,
mAppIcon, new RectF());
+ floatingTaskView.setOnClickListener(view ->
+ getSplitAnimationController()
+ .playAnimPlaceholderToFullscreen(mContainer, view,
+ Optional.of(() -> resetState())));
floatingTaskView.setAlpha(1);
floatingTaskView.addStagingAnimation(anim, mTaskBounds, mTempRect,
false /* fadeWithThumbnail */, true /* isStagedTask */);
diff --git a/quickstep/src/com/android/quickstep/util/TaskViewSimulator.java b/quickstep/src/com/android/quickstep/util/TaskViewSimulator.java
index a4b8fec..706cfe4 100644
--- a/quickstep/src/com/android/quickstep/util/TaskViewSimulator.java
+++ b/quickstep/src/com/android/quickstep/util/TaskViewSimulator.java
@@ -50,9 +50,10 @@
import com.android.launcher3.util.TraceHelper;
import com.android.quickstep.BaseActivityInterface;
import com.android.quickstep.BaseContainerInterface;
+import com.android.quickstep.DesktopFullscreenDrawParams;
+import com.android.quickstep.FullscreenDrawParams;
import com.android.quickstep.TaskAnimationManager;
import com.android.quickstep.util.SurfaceTransaction.SurfaceProperties;
-import com.android.quickstep.views.TaskView.FullscreenDrawParams;
import com.android.systemui.shared.recents.model.ThumbnailData;
import com.android.systemui.shared.recents.utilities.PreviewPositionHelper;
@@ -116,20 +117,25 @@
private SplitBounds mSplitBounds;
private Boolean mDrawsBelowRecents = null;
private boolean mIsGridTask;
- private boolean mIsDesktopTask;
+ private final boolean mIsDesktopTask;
private boolean mScaleToCarouselTaskSize = false;
private int mTaskRectTranslationX;
private int mTaskRectTranslationY;
private int mDesktopTaskIndex = 0;
- public TaskViewSimulator(Context context, BaseContainerInterface sizeStrategy) {
+ public TaskViewSimulator(Context context, BaseContainerInterface sizeStrategy,
+ boolean isDesktop, int desktopTaskIndex) {
mContext = context;
mSizeStrategy = sizeStrategy;
+ mIsDesktopTask = isDesktop;
+ mDesktopTaskIndex = desktopTaskIndex;
mOrientationState = TraceHelper.allowIpcs("TaskViewSimulator.init",
() -> new RecentsOrientedState(context, sizeStrategy, i -> { }));
mOrientationState.setGestureActive(true);
- mCurrentFullscreenParams = new FullscreenDrawParams(context);
+ mCurrentFullscreenParams = mIsDesktopTask
+ ? new DesktopFullscreenDrawParams(context)
+ : new FullscreenDrawParams(context);
mOrientationStateId = mOrientationState.getStateId();
Resources resources = context.getResources();
mIsRecentsRtl = mOrientationState.getOrientationHandler().getRecentsRtlSetting(resources);
@@ -289,14 +295,6 @@
}
/**
- * Sets whether this task is part of desktop tasks in overview.
- */
- public void setIsDesktopTask(boolean desktop, int index) {
- mIsDesktopTask = desktop;
- mDesktopTaskIndex = index;
- }
-
- /**
* Apply translations on TaskRect's starting location.
*/
public void setTaskRectTranslation(int taskRectTranslationX, int taskRectTranslationY) {
@@ -558,7 +556,7 @@
* TaskView
*/
public float getCurrentCornerRadius() {
- float visibleRadius = mCurrentFullscreenParams.getCurrentDrawnCornerRadius();
+ float visibleRadius = mCurrentFullscreenParams.getCurrentCornerRadius();
mTempPoint[0] = visibleRadius;
mTempPoint[1] = 0;
mInversePositionMatrix.mapVectors(mTempPoint);
diff --git a/quickstep/src/com/android/quickstep/views/AddDesktopButton.kt b/quickstep/src/com/android/quickstep/views/AddDesktopButton.kt
new file mode 100644
index 0000000..f973dd0
--- /dev/null
+++ b/quickstep/src/com/android/quickstep/views/AddDesktopButton.kt
@@ -0,0 +1,30 @@
+/*
+ * 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.quickstep.views
+
+import android.content.Context
+import android.util.AttributeSet
+import android.widget.ImageButton
+
+/**
+ * Button for supporting multiple desktop sessions. The button will be next to the first TaskView
+ * inside overview, while clicking this button will create a new desktop session.
+ */
+class AddDesktopButton @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) :
+ ImageButton(context, attrs) {
+ // TODO(b/382057498): add this button the overview.
+}
diff --git a/quickstep/src/com/android/quickstep/views/DesktopTaskContentView.kt b/quickstep/src/com/android/quickstep/views/DesktopTaskContentView.kt
index 481acac..ef044f4 100644
--- a/quickstep/src/com/android/quickstep/views/DesktopTaskContentView.kt
+++ b/quickstep/src/com/android/quickstep/views/DesktopTaskContentView.kt
@@ -23,14 +23,15 @@
import android.view.View
import android.view.ViewOutlineProvider
import android.widget.FrameLayout
-import com.android.quickstep.views.TaskView.FullscreenDrawParams
class DesktopTaskContentView
@JvmOverloads
constructor(context: Context, attrs: AttributeSet? = null) : FrameLayout(context, attrs) {
- private val currentFullscreenParams = FullscreenDrawParams(context)
- private val taskCornerRadius: Float
- get() = currentFullscreenParams.cornerRadius
+ var cornerRadius: Float = 0f
+ set(value) {
+ field = value
+ invalidateOutline()
+ }
private val bounds = Rect()
@@ -39,7 +40,7 @@
outlineProvider =
object : ViewOutlineProvider() {
override fun getOutline(view: View, outline: Outline) {
- outline.setRoundRect(bounds, taskCornerRadius)
+ outline.setRoundRect(bounds, cornerRadius)
}
}
}
diff --git a/quickstep/src/com/android/quickstep/views/DesktopTaskView.kt b/quickstep/src/com/android/quickstep/views/DesktopTaskView.kt
index 5e842aa..576a56e 100644
--- a/quickstep/src/com/android/quickstep/views/DesktopTaskView.kt
+++ b/quickstep/src/com/android/quickstep/views/DesktopTaskView.kt
@@ -20,13 +20,10 @@
import android.graphics.Point
import android.graphics.PointF
import android.graphics.Rect
-import android.graphics.drawable.ShapeDrawable
-import android.graphics.drawable.shapes.RoundRectShape
import android.util.AttributeSet
import android.util.Log
import android.view.Gravity
import android.view.View
-import android.widget.FrameLayout
import androidx.core.content.res.ResourcesCompat
import androidx.core.view.updateLayoutParams
import com.android.launcher3.Flags.enableRefactorTaskThumbnail
@@ -39,6 +36,8 @@
import com.android.launcher3.util.ViewPool
import com.android.launcher3.util.rects.set
import com.android.quickstep.BaseContainerInterface
+import com.android.quickstep.DesktopFullscreenDrawParams
+import com.android.quickstep.FullscreenDrawParams
import com.android.quickstep.TaskOverlayFactory
import com.android.quickstep.ViewUtils
import com.android.quickstep.task.thumbnail.TaskThumbnailView
@@ -47,14 +46,13 @@
/** TaskView that contains all tasks that are part of the desktop. */
class DesktopTaskView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) :
- TaskView(context, attrs, type = TaskViewType.DESKTOP) {
-
- private val snapshotDrawParams =
- object : FullscreenDrawParams(context) {
- // DesktopTaskView thumbnail's corner radius is independent of fullscreenProgress.
- override fun computeTaskCornerRadius(context: Context) =
- computeWindowCornerRadius(context)
- }
+ TaskView(
+ context,
+ attrs,
+ type = TaskViewType.DESKTOP,
+ thumbnailFullscreenParams = DesktopFullscreenDrawParams(context),
+ ) {
+ private val contentViewFullscreenParams = FullscreenDrawParams(context)
private val taskThumbnailViewDeprecatedPool =
if (!enableRefactorTaskThumbnail()) {
@@ -80,28 +78,12 @@
private val tempPointF = PointF()
private val tempRect = Rect()
- private lateinit var backgroundView: View
private lateinit var iconView: TaskViewIcon
- private lateinit var contentView: FrameLayout
+ private lateinit var contentView: DesktopTaskContentView
+ private lateinit var backgroundView: View
override fun onFinishInflate() {
super.onFinishInflate()
- backgroundView =
- findViewById<View>(R.id.background).apply {
- updateLayoutParams<LayoutParams> {
- topMargin = container.deviceProfile.overviewTaskThumbnailTopMarginPx
- }
- background =
- ShapeDrawable(RoundRectShape(FloatArray(8) { taskCornerRadius }, null, null))
- .apply {
- setTint(
- resources.getColor(
- android.R.color.system_neutral2_300,
- context.theme,
- )
- )
- }
- }
iconView =
getOrInflateIconView(R.id.icon).apply {
setIcon(
@@ -115,10 +97,15 @@
setText(resources.getText(R.string.recent_task_desktop))
}
contentView =
- findViewById<FrameLayout>(R.id.desktop_content).apply {
+ findViewById<DesktopTaskContentView>(R.id.desktop_content).apply {
updateLayoutParams<LayoutParams> {
topMargin = container.deviceProfile.overviewTaskThumbnailTopMarginPx
}
+ cornerRadius = contentViewFullscreenParams.currentCornerRadius
+ backgroundView = findViewById(R.id.background)
+ backgroundView.setBackgroundColor(
+ resources.getColor(android.R.color.system_neutral2_300, context.theme)
+ )
}
}
@@ -135,6 +122,7 @@
Log.d(TAG, sb.toString())
}
cancelPendingLoadTasks()
+ val backgroundViewIndex = contentView.indexOfChild(backgroundView)
taskContainers =
tasks.map { task ->
val snapshotView =
@@ -143,7 +131,7 @@
} else {
taskThumbnailViewDeprecatedPool!!.view
}
- contentView.addView(snapshotView, 0)
+ contentView.addView(snapshotView, backgroundViewIndex + 1)
TaskContainer(
this,
@@ -157,8 +145,7 @@
taskOverlayFactory,
)
}
- taskContainers.forEach { it.bind() }
- setOrientationState(orientedState)
+ onBind(orientedState)
}
override fun onRecycle() {
@@ -242,8 +229,12 @@
}
}
- override fun needsUpdate(dataChange: Int, flag: Int) =
- if (flag == FLAG_UPDATE_CORNER_RADIUS) false else super.needsUpdate(dataChange, flag)
+ override fun onTaskListVisibilityChanged(visible: Boolean, changes: Int) {
+ super.onTaskListVisibilityChanged(visible, changes)
+ if (needsUpdate(changes, FLAG_UPDATE_CORNER_RADIUS)) {
+ contentViewFullscreenParams.updateCornerRadius(context)
+ }
+ }
override fun onIconLoaded(taskContainer: TaskContainer) {
// Update contentDescription of snapshotView only, individual task icon is unused.
@@ -258,9 +249,9 @@
override fun getThumbnailBounds(bounds: Rect, relativeToDragLayer: Boolean) {
if (relativeToDragLayer) {
- container.dragLayer.getDescendantRectRelativeToSelf(backgroundView, bounds)
+ container.dragLayer.getDescendantRectRelativeToSelf(contentView, bounds)
} else {
- bounds.set(backgroundView)
+ bounds.set(contentView)
}
}
@@ -306,13 +297,12 @@
backgroundView.alpha = 1 - fullscreenProgress
}
- override fun updateCurrentFullscreenParams() {
- super.updateCurrentFullscreenParams()
- updateFullscreenParams(snapshotDrawParams)
+ override fun updateFullscreenParams() {
+ super.updateFullscreenParams()
+ updateFullscreenParams(contentViewFullscreenParams)
+ contentView.cornerRadius = contentViewFullscreenParams.currentCornerRadius
}
- override fun getThumbnailFullscreenParams() = snapshotDrawParams
-
override fun addChildrenForAccessibility(outChildren: ArrayList<View>) {
super.addChildrenForAccessibility(outChildren)
ViewUtils.addAccessibleChildToList(backgroundView, outChildren)
diff --git a/quickstep/src/com/android/quickstep/views/GroupedTaskView.kt b/quickstep/src/com/android/quickstep/views/GroupedTaskView.kt
index 92c1e93..0d9583d 100644
--- a/quickstep/src/com/android/quickstep/views/GroupedTaskView.kt
+++ b/quickstep/src/com/android/quickstep/views/GroupedTaskView.kt
@@ -104,7 +104,7 @@
R.id.show_windows,
R.id.digital_wellbeing_toast,
STAGE_POSITION_TOP_OR_LEFT,
- taskOverlayFactory
+ taskOverlayFactory,
),
createTaskContainer(
secondaryTask,
@@ -113,14 +113,12 @@
R.id.show_windows_right,
R.id.bottomRight_digital_wellbeing_toast,
STAGE_POSITION_BOTTOM_OR_RIGHT,
- taskOverlayFactory
- )
+ taskOverlayFactory,
+ ),
)
- taskContainers.forEach { it.bind() }
-
this.splitBoundsConfig = splitBoundsConfig
taskContainers.forEach { it.digitalWellBeingToast?.splitBounds = splitBoundsConfig }
- setOrientationState(orientedState)
+ onBind(orientedState)
}
override fun setOrientationState(orientationState: RecentsOrientedState) {
@@ -131,7 +129,7 @@
container.deviceProfile,
it,
layoutParams.width,
- layoutParams.height
+ layoutParams.height,
)
val iconViewMarginStart =
resources.getDimensionPixelSize(
@@ -168,7 +166,7 @@
container.deviceProfile,
splitBoundsConfig,
layoutParams.width,
- layoutParams.height
+ layoutParams.height,
)
pagedOrientationHandler.setSplitIconParams(
taskContainers[0].iconView.asView(),
@@ -181,7 +179,7 @@
isRtl,
container.deviceProfile,
splitBoundsConfig,
- inSplitSelection
+ inSplitSelection,
)
} else {
pagedOrientationHandler.setSplitIconParams(
@@ -195,7 +193,7 @@
isRtl,
container.deviceProfile,
splitBoundsConfig,
- inSplitSelection
+ inSplitSelection,
)
}
}
@@ -216,7 +214,7 @@
InteractionJankMonitorWrapper.begin(
this,
Cuj.CUJ_SPLIT_SCREEN_ENTER,
- "Enter form GroupedTaskView"
+ "Enter form GroupedTaskView",
)
launchTaskInternal(isQuickSwitch = false, launchingExistingTaskView = true) {
endCallback.executeAllAndDestroy()
@@ -230,7 +228,7 @@
override fun launchWithoutAnimation(
isQuickSwitch: Boolean,
- callback: (launched: Boolean) -> Unit
+ callback: (launched: Boolean) -> Unit,
) {
launchTaskInternal(isQuickSwitch, launchingExistingTaskView = false, callback)
}
@@ -244,7 +242,7 @@
private fun launchTaskInternal(
isQuickSwitch: Boolean,
launchingExistingTaskView: Boolean,
- callback: (launched: Boolean) -> Unit
+ callback: (launched: Boolean) -> Unit,
) {
recentsView?.let {
it.splitSelectController.launchExistingSplitPair(
@@ -254,11 +252,11 @@
STAGE_POSITION_TOP_OR_LEFT,
callback,
isQuickSwitch,
- snapPosition
+ snapPosition,
)
Log.d(
TAG,
- "launchTaskInternal - launchExistingSplitPair: ${taskIds.contentToString()}, launchingExistingTaskView: $launchingExistingTaskView"
+ "launchTaskInternal - launchExistingSplitPair: ${taskIds.contentToString()}, launchingExistingTaskView: $launchingExistingTaskView",
)
}
}
diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java
index 92c93ff..32c7de4 100644
--- a/quickstep/src/com/android/quickstep/views/RecentsView.java
+++ b/quickstep/src/com/android/quickstep/views/RecentsView.java
@@ -29,7 +29,7 @@
import static com.android.app.animation.Interpolators.FAST_OUT_SLOW_IN;
import static com.android.app.animation.Interpolators.FINAL_FRAME;
import static com.android.app.animation.Interpolators.LINEAR;
-import static com.android.app.animation.Interpolators.OVERSHOOT_0_75;
+import static com.android.app.animation.Interpolators.EMPHASIZED;
import static com.android.app.animation.Interpolators.clampToProgress;
import static com.android.launcher3.AbstractFloatingView.TYPE_REBIND_SAFE;
import static com.android.launcher3.AbstractFloatingView.TYPE_TASK_MENU;
@@ -417,9 +417,6 @@
public void setValue(RecentsView view, float scale) {
view.setScaleX(scale);
view.setScaleY(scale);
- if (enableRefactorTaskThumbnail()) {
- view.mRecentsViewModel.updateScale(scale);
- }
view.mLastComputedTaskStartPushOutDistance = null;
view.mLastComputedTaskEndPushOutDistance = null;
view.runActionOnRemoteHandles(new Consumer<RemoteTargetHandle>() {
@@ -610,6 +607,8 @@
private int mKeyboardTaskFocusSnapAnimationDuration;
private int mKeyboardTaskFocusIndex = INVALID_PAGE;
+ private int[] mDismissPrimaryTranslations;
+
/**
* TODO: Call reloadIdNeeded in onTaskStackChanged.
*/
@@ -690,8 +689,6 @@
protected int mRunningTaskViewId = -1;
private int mTaskViewIdCount;
protected boolean mRunningTaskTileHidden;
- @Nullable
- private Task[] mTmpRunningTasks;
protected int mFocusedTaskViewId = INVALID_TASK_ID;
private boolean mTaskIconScaledDown = false;
@@ -1418,7 +1415,7 @@
if (showAsGrid()) {
int screenStart = getPagedOrientationHandler().getPrimaryScroll(this);
int screenEnd = screenStart + getPagedOrientationHandler().getMeasuredSize(this);
- return isTaskViewWithinBounds(tv, screenStart, screenEnd);
+ return isTaskViewWithinBounds(tv, screenStart, screenEnd, /*taskViewTranslation=*/ 0);
} else {
// For now, just check if it's the active task or an adjacent task
return Math.abs(indexOfChild(tv) - getNextPage()) <= 1;
@@ -1465,14 +1462,28 @@
return clearAllScroll + (mIsRtl ? distance : -distance);
}
- private boolean isTaskViewWithinBounds(TaskView tv, int start, int end) {
- int taskStart = getPagedOrientationHandler().getChildStart(tv)
- + (int) tv.getOffsetAdjustment(showAsGrid());
- int taskSize = (int) (getPagedOrientationHandler().getMeasuredSize(tv)
- * tv.getSizeAdjustment(showAsFullscreen()));
+ /*
+ * Returns if TaskView is within screen bounds defined in [screenStart, screenEnd].
+ *
+ * @param taskViewTranslation taskView is considered within bounds if either translated or
+ * original position of taskView is within screen bounds.
+ */
+ private boolean isTaskViewWithinBounds(TaskView taskView, int screenStart, int screenEnd,
+ int taskViewTranslation) {
+ int taskStart = getPagedOrientationHandler().getChildStart(taskView)
+ + (int) taskView.getOffsetAdjustment(showAsGrid());
+ int taskSize = (int) (getPagedOrientationHandler().getMeasuredSize(taskView)
+ * taskView.getSizeAdjustment(showAsFullscreen()));
int taskEnd = taskStart + taskSize;
- return (taskStart >= start && taskStart <= end) || (taskEnd >= start
- && taskEnd <= end);
+
+ int translatedTaskStart = taskStart + taskViewTranslation;
+ int translatedTaskEnd = taskEnd + taskViewTranslation;
+
+ taskStart = Math.min(taskStart, translatedTaskStart);
+ taskEnd = Math.max(taskEnd, translatedTaskEnd);
+
+ return (taskStart >= screenStart && taskStart <= screenEnd) || (taskEnd >= screenStart
+ && taskEnd <= screenEnd);
}
private boolean isTaskViewFullyWithinBounds(TaskView tv, int start, int end) {
@@ -1550,9 +1561,6 @@
updateTaskStackListenerState();
mOrientationState.setRotationWatcherEnabled(enabled);
if (!enabled) {
- // Reset the running task when leaving overview since it can still have a reference to
- // its thumbnail
- mTmpRunningTasks = null;
mSplitBoundsConfig = null;
mTaskOverlayFactory.clearAllActiveState();
}
@@ -1760,26 +1768,17 @@
}
/**
- * Moves the running task to the front of the carousel in tablets, to minimize animation
- * required to move the running task in grid.
+ * Moves the running task to the expected position in the carousel. In tablets, this minimize
+ * animation required to move the running task into focused task position.
*/
- public void moveRunningTaskToFront() {
- if (!mContainer.getDeviceProfile().isTablet) {
- return;
- }
-
+ public void moveRunningTaskToExpectedPosition() {
TaskView runningTaskView = getRunningTaskView();
- if (runningTaskView == null) {
+ if (runningTaskView == null || mCurrentPage != indexOfChild(runningTaskView)) {
return;
}
- if (indexOfChild(runningTaskView) != mCurrentPage) {
- return;
- }
-
- int frontIndex = enableLargeDesktopWindowingTile() ? getDesktopTaskViewCount() : 0;
-
- if (mCurrentPage <= frontIndex) {
+ int runningTaskExpectedIndex = getRunningTaskExpectedIndex(runningTaskView);
+ if (mCurrentPage == runningTaskExpectedIndex) {
return;
}
@@ -1792,12 +1791,31 @@
mMovingTaskView = null;
runningTaskView.resetPersistentViewTransforms();
- addView(runningTaskView, frontIndex);
- setCurrentPage(frontIndex);
+ addView(runningTaskView, runningTaskExpectedIndex);
+ setCurrentPage(runningTaskExpectedIndex);
updateTaskSize();
}
+ private int getRunningTaskExpectedIndex(TaskView runningTaskView) {
+ if (mContainer.getDeviceProfile().isTablet) {
+ if (runningTaskView instanceof DesktopTaskView) {
+ return 0; // Desktop running task is always in front.
+ } else if (enableLargeDesktopWindowingTile()) {
+ return getDesktopTaskViewCount(); // Other running task is behind desktop tasks.
+ } else {
+ return 0;
+ }
+ } else {
+ int currentIndex = indexOfChild(runningTaskView);
+ if (currentIndex != -1) {
+ return currentIndex; // Keep the position if running task already in layout.
+ } else {
+ return 0; // New running task are added to the front to begin with.
+ }
+ }
+ }
+
@Override
protected void onScrollerAnimationAborted() {
ActiveGestureProtoLogProxy.logOnScrollerAnimationAborted();
@@ -1939,18 +1957,20 @@
}
// Keep same previous focused task
- TaskView newFocusedTaskView = getTaskViewByTaskIds(focusedTaskIds);
- if (enableLargeDesktopWindowingTile() && newFocusedTaskView instanceof DesktopTaskView) {
- newFocusedTaskView = null;
+ TaskView newFocusedTaskView = null;
+ if (!enableGridOnlyOverview()) {
+ newFocusedTaskView = getTaskViewByTaskIds(focusedTaskIds);
+ if (enableLargeDesktopWindowingTile()
+ && newFocusedTaskView instanceof DesktopTaskView) {
+ newFocusedTaskView = null;
+ }
+ // If the list changed, maybe the focused task doesn't exist anymore.
+ if (newFocusedTaskView == null) {
+ newFocusedTaskView = mUtils.getExpectedFocusedTask(getTaskViews());
+ }
}
- // If the list changed, maybe the focused task doesn't exist anymore
- int newFocusedTaskViewIndex = mUtils.getFocusedTaskIndex(taskGroups);
- if (newFocusedTaskView == null && getTaskViewCount() > newFocusedTaskViewIndex) {
- newFocusedTaskView = getTaskViewAt(newFocusedTaskViewIndex);
- }
-
- setFocusedTaskViewId(newFocusedTaskView != null && !enableGridOnlyOverview()
- ? newFocusedTaskView.getTaskViewId() : INVALID_TASK_ID);
+ setFocusedTaskViewId(
+ newFocusedTaskView != null ? newFocusedTaskView.getTaskViewId() : INVALID_TASK_ID);
updateTaskSize();
updateChildTaskOrientations();
@@ -1969,6 +1989,7 @@
// for cases where the running task isn't included in this load plan (e.g. if
// the current running task is excludedFromRecents.)
showCurrentTask(mActiveGestureRunningTasks, "applyLoadPlan");
+ newRunningTaskView = getRunningTaskView();
} else {
setRunningTaskViewId(INVALID_TASK_ID);
}
@@ -1988,12 +2009,9 @@
} else if (previousFocusedPage != INVALID_PAGE) {
targetPage = previousFocusedPage;
} else {
- // Set the current page to the running task, but not if settling on new task.
- if (hasAllValidTaskIds(runningTaskIds)) {
- targetPage = indexOfChild(newRunningTaskView);
- } else if (getTaskViewCount() > newFocusedTaskViewIndex) {
- targetPage = indexOfChild(requireTaskViewAt(newFocusedTaskViewIndex));
- }
+ targetPage = indexOfChild(
+ mUtils.getExpectedCurrentTask(newRunningTaskView, newFocusedTaskView,
+ getTaskViews()));
}
if (targetPage != -1 && mCurrentPage != targetPage) {
int finalTargetPage = targetPage;
@@ -2470,7 +2488,8 @@
}
boolean visible;
if (showAsGrid()) {
- visible = isTaskViewWithinBounds(taskView, visibleStart, visibleEnd);
+ visible = isTaskViewWithinBounds(taskView, visibleStart, visibleEnd,
+ mDismissPrimaryTranslations != null ? mDismissPrimaryTranslations[i] : 0);
} else {
visible = lower <= i && i <= upper;
}
@@ -2479,13 +2498,6 @@
List<Task> tasksToUpdate = containers.stream()
.map(TaskContainer::getTask)
.collect(Collectors.toCollection(ArrayList::new));
- if (mTmpRunningTasks != null) {
- for (Task t : mTmpRunningTasks) {
- // Skip loading if this is the task that we are animating into
- // TODO(b/280812109) change this equality check to use A.equals(B)
- tasksToUpdate.removeIf(task -> task == t);
- }
- }
if (enableRefactorTaskThumbnail()) {
visibleTaskIds.addAll(
tasksToUpdate.stream().map((task) -> task.key.id).toList());
@@ -2493,6 +2505,7 @@
if (tasksToUpdate.isEmpty()) {
continue;
}
+ int visibilityChanges = 0;
for (Task task : tasksToUpdate) {
if (!mHasVisibleTaskData.get(task.key.id)) {
// Ignore thumbnail update if it's current running task during the gesture
@@ -2501,21 +2514,28 @@
if (taskView == getRunningTaskView() && isGestureActive()) {
changes &= ~TaskView.FLAG_UPDATE_THUMBNAIL;
}
- taskView.onTaskListVisibilityChanged(true /* visible */, changes);
+ visibilityChanges |= changes;
}
mHasVisibleTaskData.put(task.key.id, true);
}
+ if (visibilityChanges != 0) {
+ taskView.onTaskListVisibilityChanged(true /* visible */, visibilityChanges);
+ }
} else {
+ int visibilityChanges = 0;
for (TaskContainer container : containers) {
if (container == null) {
continue;
}
if (mHasVisibleTaskData.get(container.getTask().key.id)) {
- taskView.onTaskListVisibilityChanged(false /* visible */, dataChanges);
+ visibilityChanges = dataChanges;
}
mHasVisibleTaskData.delete(container.getTask().key.id);
}
+ if (visibilityChanges != 0) {
+ taskView.onTaskListVisibilityChanged(false /* visible */, visibilityChanges);
+ }
}
}
if (enableRefactorTaskThumbnail()) {
@@ -2948,25 +2968,20 @@
final TaskView taskView;
if (needDesktopTask) {
taskView = getTaskViewFromPool(TaskViewType.DESKTOP);
- mTmpRunningTasks = Arrays.copyOf(runningTasks, runningTasks.length);
- ((DesktopTaskView) taskView).bind(Arrays.asList(mTmpRunningTasks),
+ ((DesktopTaskView) taskView).bind(Arrays.asList(runningTasks),
mOrientationState, mTaskOverlayFactory);
} else if (needGroupTaskView) {
taskView = getTaskViewFromPool(TaskViewType.GROUPED);
- mTmpRunningTasks = new Task[]{runningTasks[0], runningTasks[1]};
// When we create a placeholder task view mSplitBoundsConfig will be null, but with
// the actual app running we won't need to show the thumbnail until all the tasks
// load later anyways
- ((GroupedTaskView) taskView).bind(mTmpRunningTasks[0], mTmpRunningTasks[1],
+ ((GroupedTaskView) taskView).bind(runningTasks[0], runningTasks[1],
mOrientationState, mTaskOverlayFactory, mSplitBoundsConfig);
} else {
taskView = getTaskViewFromPool(TaskViewType.SINGLE);
- // The temporary running task is only used for the duration between the start of the
- // gesture and the task list is loaded and applied
- mTmpRunningTasks = new Task[]{runningTasks[0]};
- taskView.bind(mTmpRunningTasks[0], mOrientationState, mTaskOverlayFactory);
+ taskView.bind(runningTasks[0], mOrientationState, mTaskOverlayFactory);
}
- addView(taskView, 0);
+ addView(taskView, getRunningTaskExpectedIndex(taskView));
runningTaskViewId = taskView.getTaskViewId();
if (wasEmpty) {
addView(mClearAllButton);
@@ -3632,6 +3647,7 @@
// Grid specific properties.
boolean isFocusedTaskDismissed = false;
boolean isStagingFocusedTask = false;
+ boolean isSlidingTasks = false;
TaskView nextFocusedTaskView = null;
boolean nextFocusedTaskFromTop = false;
float dismissedTaskWidth = 0;
@@ -3687,6 +3703,7 @@
scrollDiffPerPage = Math.abs(oldScroll[1] - oldScroll[0]);
}
+ isSlidingTasks = isStagingFocusedTask || areAllDesktopTasksDismissed;
float dismissTranslationInterpolationEnd = 1;
boolean closeGapBetweenClearAll = false;
boolean isClearAllHidden = isClearAllHidden();
@@ -3827,16 +3844,17 @@
AnimUtils.getDeviceOverviewToSplitTimings(mContainer.getDeviceProfile().isTablet);
int distanceFromDismissedTask = 1;
- int stagingTranslation = 0;
- if (isStagingFocusedTask || areAllDesktopTasksDismissed) {
+ int slidingTranslation = 0;
+ if (isSlidingTasks) {
int nextSnappedPage = isStagingFocusedTask
? indexOfChild(mUtils.getFirstSmallTaskView(getTaskViews()))
: mUtils.getDesktopTaskViewCount(getTaskViews());
- stagingTranslation = getPagedOrientationHandler().getPrimaryScroll(this)
+ slidingTranslation = getPagedOrientationHandler().getPrimaryScroll(this)
- getScrollForPage(nextSnappedPage);
- stagingTranslation += mIsRtl ? newClearAllShortTotalWidthTranslation
+ slidingTranslation += mIsRtl ? newClearAllShortTotalWidthTranslation
: -newClearAllShortTotalWidthTranslation;
}
+ mDismissPrimaryTranslations = new int[taskCount];
for (int i = 0; i < count; i++) {
View child = getChildAt(i);
if (child == dismissedTaskView) {
@@ -3854,19 +3872,19 @@
Math.abs(i - dismissedIndex),
scrollDiff,
anim,
- splitTimings);
+ splitTimings, i);
needsCurveUpdates = true;
}
} else if (child instanceof TaskView taskView) {
// Animate task with index >= dismissed index and in the same row as the
// dismissed index or next focused index. Offset successive task dismissal
// durations for a staggered effect.
- int staggerColumn = isStagingFocusedTask
+ int staggerColumn = isSlidingTasks
? (int) Math.ceil(distanceFromDismissedTask / 2f)
: distanceFromDismissedTask;
// Set timings based on if user is initiating splitscreen on the focused task,
// or splitting/dismissing some other task.
- float animationStartProgress = isStagingFocusedTask
+ float animationStartProgress = isSlidingTasks
? Utilities.boundToRange(
splitTimings.getGridSlideStartOffset()
+ (splitTimings.getGridSlideStaggerOffset()
@@ -3877,7 +3895,7 @@
INITIAL_DISMISS_TRANSLATION_INTERPOLATION_OFFSET
+ ADDITIONAL_DISMISS_TRANSLATION_INTERPOLATION_OFFSET
* staggerColumn, 0f, dismissTranslationInterpolationEnd);
- float animationEndProgress = isStagingFocusedTask
+ float animationEndProgress = isSlidingTasks
? Utilities.boundToRange(
splitTimings.getGridSlideStartOffset()
+ (splitTimings.getGridSlideStaggerOffset() * staggerColumn)
@@ -3885,7 +3903,8 @@
0f,
dismissTranslationInterpolationEnd)
: dismissTranslationInterpolationEnd;
- Interpolator dismissInterpolator = isStagingFocusedTask ? OVERSHOOT_0_75 : LINEAR;
+
+ Interpolator dismissInterpolator = isSlidingTasks ? EMPHASIZED : LINEAR;
float primaryTranslation = 0;
if (taskView == nextFocusedTaskView) {
@@ -3912,13 +3931,31 @@
primaryTranslation +=
nextFocusedTaskView != null ? nextFocusedTaskWidth : dismissedTaskWidth;
}
- primaryTranslation += mIsRtl ? stagingTranslation : -stagingTranslation;
+ if (!(taskView instanceof DesktopTaskView)) {
+ primaryTranslation += mIsRtl ? slidingTranslation : -slidingTranslation;
+ }
if (primaryTranslation != 0) {
- anim.setFloat(taskView, taskView.getPrimaryDismissTranslationProperty(),
- mIsRtl ? primaryTranslation : -primaryTranslation,
+ float finalTranslation = mIsRtl ? primaryTranslation : -primaryTranslation;
+ float startTranslation = 0;
+ if (!(taskView instanceof DesktopTaskView) && slidingTranslation != 0) {
+ startTranslation = isTaskViewVisible(taskView) ? 0
+ : finalTranslation + (mIsRtl ? -mLastComputedTaskSize.right
+ : mLastComputedTaskSize.right);
+ animationStartProgress = Utilities.boundToRange(
+ animationStartProgress
+ + splitTimings.getDesktopFadeSplitAnimationEndOffset(),
+ 0f,
+ dismissTranslationInterpolationEnd);
+ }
+ Animator dismissAnimator = ObjectAnimator.ofFloat(taskView,
+ taskView.getPrimaryDismissTranslationProperty(),
+ startTranslation, finalTranslation);
+ dismissAnimator.setInterpolator(
clampToProgress(dismissInterpolator, animationStartProgress,
animationEndProgress));
+ anim.add(dismissAnimator);
+ mDismissPrimaryTranslations[i] = (int) finalTranslation;
distanceFromDismissedTask++;
}
}
@@ -3937,7 +3974,7 @@
if (animateTaskView && dismissedTaskView != null) {
dismissedTaskView.setTranslationZ(0.1f);
}
-
+ loadVisibleTaskData(TaskView.FLAG_UPDATE_ALL);
mPendingAnimation = anim;
final TaskView finalNextFocusedTaskView = nextFocusedTaskView;
final boolean finalCloseGapBetweenClearAll = closeGapBetweenClearAll;
@@ -4155,6 +4192,7 @@
updateCurrentTaskActionsVisibility();
onDismissAnimationEnds();
mPendingAnimation = null;
+ mDismissPrimaryTranslations = null;
}
});
}
@@ -4193,7 +4231,8 @@
int indexDiff,
int scrollDiffPerPage,
PendingAnimation pendingAnimation,
- SplitAnimationTimings splitTimings) {
+ SplitAnimationTimings splitTimings,
+ int index) {
FloatProperty translationProperty = view instanceof TaskView
? ((TaskView) view).getPrimaryDismissTranslationProperty()
: getPagedOrientationHandler().getPrimaryViewTranslate();
@@ -4227,6 +4266,9 @@
)
);
+ if (view instanceof TaskView) {
+ mDismissPrimaryTranslations[index] = scrollDiffPerPage;
+ }
if (mEnableDrawingLiveTile && view instanceof TaskView
&& ((TaskView) view).isRunningTask()) {
pendingAnimation.addOnFrameCallback(() -> {
@@ -4675,6 +4717,7 @@
return;
}
setContentDescription(isEmpty ? mEmptyMessage : "");
+ setFocusable(isEmpty);
mShowEmptyMessage = isEmpty;
updateEmptyStateUi(hasSizeChanged);
invalidate();
@@ -5009,7 +5052,7 @@
private void updateTaskViewsSnapshotRadius() {
for (TaskView taskView : getTaskViews()) {
- taskView.updateSnapshotRadius();
+ taskView.updateFullscreenParams();
}
}
@@ -5089,13 +5132,37 @@
*/
public void handleDesktopTaskInSplitSelectState(PendingAnimation builder,
Interpolator deskTopFadeInterPolator) {
+ SplitAnimationTimings timings = AnimUtils.getDeviceOverviewToSplitTimings(
+ mContainer.getDeviceProfile().isTablet);
if (enableLargeDesktopWindowingTile()) {
- for (TaskView taskView : getTaskViews()) {
+ for (int i = 0; i < getTaskViewCount(); i++) {
+ TaskView taskView = requireTaskViewAt(i);
if (taskView instanceof DesktopTaskView) {
- // Correcting the animation for split mode since we hide DW in split.
+ // Setting pivot to scale down from screen centre.
+ if (i >= mCurrentPage - 1 && i <= mCurrentPage + 1) {
+ float pivotX;
+ if (i == mCurrentPage - 1) {
+ pivotX = mIsRtl ? taskView.getWidth() / 2f - mPageSpacing
+ - taskView.getWidth()
+ : taskView.getWidth() / 2f + mPageSpacing + taskView.getWidth();
+ } else if (i == mCurrentPage) {
+ pivotX = taskView.getWidth() / 2f;
+ } else {
+ pivotX = mIsRtl ? taskView.getWidth() + mPageSpacing
+ + taskView.getWidth()
+ : taskView.getWidth() - mPageSpacing - taskView.getWidth();
+ }
+ taskView.setPivotX(pivotX);
+ taskView.setPivotY(taskView.getHeight() / 2f);
+ builder.add(ObjectAnimator
+ .ofFloat(taskView, TaskView.DISMISS_SCALE, 0.95f),
+ clampToProgress(timings.getDesktopTaskScaleInterpolator(), 0f,
+ timings.getDesktopFadeSplitAnimationEndOffset()));
+ }
builder.addFloat(taskView.getSplitAlphaProperty(),
MULTI_PROPERTY_VALUE, 1f, 0f,
- clampToProgress(deskTopFadeInterPolator, 0f, 0.1f));
+ clampToProgress(deskTopFadeInterPolator, 0f,
+ timings.getDesktopFadeSplitAnimationEndOffset()));
}
}
}
@@ -5142,7 +5209,7 @@
if (!enableRefactorTaskThumbnail()) {
taskContainer.getThumbnailViewDeprecated().refreshSplashView();
}
- mSplitHiddenTaskView.updateSnapshotRadius();
+ mSplitHiddenTaskView.updateFullscreenParams();
});
} else if (isInitiatingSplitFromTaskView) {
if (Flags.enableHoverOfChildElementsInTaskview()) {
@@ -5255,12 +5322,12 @@
pendingAnimation.addEndListener(aBoolean -> {
mSplitSelectStateController.launchSplitTasks(
aBoolean1 -> {
+ InteractionJankMonitorWrapper.end(Cuj.CUJ_SPLIT_SCREEN_ENTER);
if (FeatureFlags.enableSplitContextually()) {
mSplitSelectStateController.resetState();
} else {
resetFromSplitSelectionState();
}
- InteractionJankMonitorWrapper.end(Cuj.CUJ_SPLIT_SCREEN_ENTER);
});
});
@@ -5676,43 +5743,6 @@
updateCurrentTaskActionsVisibility();
loadVisibleTaskData(TaskView.FLAG_UPDATE_ALL);
updateEnabledOverlays();
-
- if (enableRefactorTaskThumbnail()) {
- int screenStart = 0;
- int screenEnd = 0;
- int centerPageIndex = 0;
- if (showAsGrid()) {
- screenStart = getPagedOrientationHandler().getPrimaryScroll(this);
- int pageOrientedSize = getPagedOrientationHandler().getMeasuredSize(this);
- screenEnd = screenStart + pageOrientedSize;
- } else {
- centerPageIndex = getPageNearestToCenterOfScreen();
- }
-
- Set<Integer> fullyVisibleTaskIds = new HashSet<>();
-
- // Update the task data for the in/visible children
- for (int i = 0; i < getTaskViewCount(); i++) {
- TaskView taskView = requireTaskViewAt(i);
- List<TaskContainer> containers = taskView.getTaskContainers();
- if (containers.isEmpty()) {
- continue;
- }
- boolean isFullyVisible;
- if (showAsGrid()) {
- isFullyVisible = isTaskViewFullyWithinBounds(taskView, screenStart,
- screenEnd);
- } else {
- isFullyVisible = i == centerPageIndex;
- }
- if (isFullyVisible) {
- List<Integer> taskIds = containers.stream().map(
- taskContainer -> taskContainer.getTask().key.id).toList();
- fullyVisibleTaskIds.addAll(taskIds);
- }
- }
- mRecentsViewModel.updateTasksFullyVisible(fullyVisibleTaskIds);
- }
}
@Override
@@ -5854,22 +5884,15 @@
* Finish recents animation.
*/
public void finishRecentsAnimation(boolean toRecents, @Nullable Runnable onFinishComplete) {
- finishRecentsAnimation(toRecents, false, true /* shouldPip */, onFinishComplete);
+ finishRecentsAnimation(toRecents, true /* shouldPip */, onFinishComplete);
}
/**
- * Finish recents animation.
- */
- public void finishRecentsAnimation(boolean toRecents, boolean shouldPip,
- @Nullable Runnable onFinishComplete) {
- finishRecentsAnimation(toRecents, shouldPip, false, onFinishComplete);
- }
- /**
* NOTE: Whatever value gets passed through to the toRecents param may need to also be set on
* {@link #mRecentsAnimationController#setWillFinishToHome}.
*/
public void finishRecentsAnimation(boolean toRecents, boolean shouldPip,
- boolean allAppTargetsAreTranslucent, @Nullable Runnable onFinishComplete) {
+ @Nullable Runnable onFinishComplete) {
Log.d(TAG, "finishRecentsAnimation - mRecentsAnimationController: "
+ mRecentsAnimationController);
// TODO(b/197232424#comment#10) Move this back into onRecentsAnimationComplete(). Maybe?
@@ -5901,7 +5924,7 @@
tx, null /* overlay */);
}
}
- mRecentsAnimationController.finish(toRecents, allAppTargetsAreTranslucent, () -> {
+ mRecentsAnimationController.finish(toRecents, () -> {
if (onFinishComplete != null) {
onFinishComplete.run();
}
@@ -6278,17 +6301,27 @@
}
private void updateEnabledOverlays() {
- TaskView focusedTaskView = getFocusedTaskView();
- for (TaskView taskView : getTaskViews()) {
- if (taskView == focusedTaskView) {
- continue;
+ if (enableRefactorTaskThumbnail()) {
+ Set<Integer> fullyVisibleTaskIds = new HashSet<>();
+ for (TaskView taskView : getTaskViews()) {
+ if (isTaskViewFullyVisible(taskView)) {
+ fullyVisibleTaskIds.addAll(taskView.getTaskIdSet());
+ }
}
- taskView.setOverlayEnabled(mOverlayEnabled && isTaskViewFullyVisible(taskView));
- }
- // Focus task overlay should be enabled and refreshed at last
- if (focusedTaskView != null) {
- focusedTaskView.setOverlayEnabled(
- mOverlayEnabled && isTaskViewFullyVisible(focusedTaskView));
+ mRecentsViewModel.updateTasksFullyVisible(fullyVisibleTaskIds);
+ } else {
+ TaskView focusedTaskView = getFocusedTaskView();
+ for (TaskView taskView : getTaskViews()) {
+ if (taskView == focusedTaskView) {
+ continue;
+ }
+ taskView.setOverlayEnabled(mOverlayEnabled && isTaskViewFullyVisible(taskView));
+ }
+ // Focus task overlay should be enabled and refreshed at last
+ if (focusedTaskView != null) {
+ focusedTaskView.setOverlayEnabled(
+ mOverlayEnabled && isTaskViewFullyVisible(focusedTaskView));
+ }
}
}
diff --git a/quickstep/src/com/android/quickstep/views/TaskContainer.kt b/quickstep/src/com/android/quickstep/views/TaskContainer.kt
index c940fb4..5de8d1c 100644
--- a/quickstep/src/com/android/quickstep/views/TaskContainer.kt
+++ b/quickstep/src/com/android/quickstep/views/TaskContainer.kt
@@ -16,19 +16,13 @@
package com.android.quickstep.views
-import android.content.Intent
import android.graphics.Bitmap
import android.view.View
import com.android.launcher3.Flags.enableRefactorTaskThumbnail
-import com.android.launcher3.Flags.privateSpaceRestrictAccessibilityDrag
-import com.android.launcher3.LauncherSettings
-import com.android.launcher3.model.data.ItemInfoWithIcon
-import com.android.launcher3.model.data.WorkspaceItemInfo
-import com.android.launcher3.pm.UserCache
+import com.android.launcher3.model.data.TaskViewItemInfo
import com.android.launcher3.util.SplitConfigurationOptions
import com.android.launcher3.util.TransformingTouchDelegate
import com.android.quickstep.TaskOverlayFactory
-import com.android.quickstep.TaskUtils
import com.android.quickstep.ViewUtils.addAccessibleChildToList
import com.android.quickstep.recents.di.RecentsDependencies
import com.android.quickstep.recents.di.get
@@ -123,27 +117,8 @@
else thumbnailViewDeprecated.sysUiStatusNavFlags
/** Builds proto for logging */
- val itemInfo: WorkspaceItemInfo
- get() =
- WorkspaceItemInfo().apply {
- itemType = LauncherSettings.Favorites.ITEM_TYPE_TASK
- container = LauncherSettings.Favorites.CONTAINER_TASKSWITCHER
- val componentKey = TaskUtils.getLaunchComponentKeyForTask(task.key)
- user = componentKey.user
- intent = Intent().setComponent(componentKey.componentName)
- title = task.title
- taskView.recentsView?.let { screenId = it.indexOfChild(taskView) }
- if (privateSpaceRestrictAccessibilityDrag()) {
- if (
- UserCache.getInstance(taskView.context)
- .getUserInfo(componentKey.user)
- .isPrivate
- ) {
- runtimeStatusFlags =
- runtimeStatusFlags or ItemInfoWithIcon.FLAG_NOT_PINNABLE
- }
- }
- }
+ val itemInfo: TaskViewItemInfo
+ get() = TaskViewItemInfo(this)
fun bind() {
digitalWellBeingToast?.bind(task, taskView, snapshotView, stagePosition)
@@ -181,5 +156,6 @@
addAccessibleChildToList(snapshotView, outChildren)
showWindowsView?.let { addAccessibleChildToList(it, outChildren) }
digitalWellBeingToast?.let { addAccessibleChildToList(it, outChildren) }
+ overlay.addChildForAccessibility(outChildren)
}
}
diff --git a/quickstep/src/com/android/quickstep/views/TaskThumbnailViewDeprecated.java b/quickstep/src/com/android/quickstep/views/TaskThumbnailViewDeprecated.java
index 5dbc2ef..9f2bb9a 100644
--- a/quickstep/src/com/android/quickstep/views/TaskThumbnailViewDeprecated.java
+++ b/quickstep/src/com/android/quickstep/views/TaskThumbnailViewDeprecated.java
@@ -50,9 +50,9 @@
import com.android.launcher3.util.SystemUiController;
import com.android.launcher3.util.SystemUiController.SystemUiControllerFlags;
import com.android.launcher3.util.ViewPool;
+import com.android.quickstep.FullscreenDrawParams;
import com.android.quickstep.TaskOverlayFactory.TaskOverlay;
import com.android.quickstep.orientation.RecentsPagedOrientationHandler;
-import com.android.quickstep.views.TaskView.FullscreenDrawParams;
import com.android.systemui.shared.recents.model.Task;
import com.android.systemui.shared.recents.model.ThumbnailData;
import com.android.systemui.shared.recents.utilities.PreviewPositionHelper;
@@ -107,7 +107,7 @@
// Contains the portion of the thumbnail that is clipped when fullscreen progress = 0.
private final Rect mPreviewRect = new Rect();
private final PreviewPositionHelper mPreviewPositionHelper = new PreviewPositionHelper();
- private TaskView.FullscreenDrawParams mFullscreenParams;
+ private FullscreenDrawParams mFullscreenParams;
private ImageView mSplashView;
private Drawable mSplashViewDrawable;
private TaskView mTaskView;
@@ -279,7 +279,7 @@
canvas.save();
// Draw the insets if we're being drawn fullscreen (we do this for quick switch).
drawOnCanvas(canvas, 0, 0, getMeasuredWidth(), getMeasuredHeight(),
- mFullscreenParams.getCurrentDrawnCornerRadius());
+ mFullscreenParams.getCurrentCornerRadius());
canvas.restore();
}
@@ -287,7 +287,7 @@
return mPreviewPositionHelper;
}
- public void setFullscreenParams(TaskView.FullscreenDrawParams fullscreenParams) {
+ public void setFullscreenParams(FullscreenDrawParams fullscreenParams) {
mFullscreenParams = fullscreenParams;
invalidate();
}
@@ -473,7 +473,7 @@
mBitmapShader.setLocalMatrix(mPreviewPositionHelper.getMatrix());
mPaint.setShader(mBitmapShader);
}
- mTaskView.updateCurrentFullscreenParams();
+ mTaskView.updateFullscreenParams();
invalidate();
}
diff --git a/quickstep/src/com/android/quickstep/views/TaskView.kt b/quickstep/src/com/android/quickstep/views/TaskView.kt
index b1cb407..082971c 100644
--- a/quickstep/src/com/android/quickstep/views/TaskView.kt
+++ b/quickstep/src/com/android/quickstep/views/TaskView.kt
@@ -59,13 +59,11 @@
import com.android.launcher3.testing.TestLogging
import com.android.launcher3.testing.shared.TestProtocol
import com.android.launcher3.util.CancellableTask
-import com.android.launcher3.util.DisplayController
import com.android.launcher3.util.Executors
import com.android.launcher3.util.MultiPropertyFactory
import com.android.launcher3.util.MultiPropertyFactory.MULTI_PROPERTY_VALUE
import com.android.launcher3.util.MultiValueAlpha
import com.android.launcher3.util.RunnableList
-import com.android.launcher3.util.SafeCloseable
import com.android.launcher3.util.SplitConfigurationOptions
import com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_UNDEFINED
import com.android.launcher3.util.SplitConfigurationOptions.SplitPositionOption
@@ -74,16 +72,13 @@
import com.android.launcher3.util.TransformingTouchDelegate
import com.android.launcher3.util.ViewPool
import com.android.launcher3.util.rects.set
-import com.android.launcher3.views.ActivityContext
+import com.android.quickstep.FullscreenDrawParams
import com.android.quickstep.RecentsModel
import com.android.quickstep.RemoteAnimationTargets
import com.android.quickstep.TaskOverlayFactory
import com.android.quickstep.TaskViewUtils
import com.android.quickstep.orientation.RecentsPagedOrientationHandler
-import com.android.quickstep.recents.di.RecentsDependencies
-import com.android.quickstep.recents.di.get
import com.android.quickstep.task.thumbnail.TaskThumbnailView
-import com.android.quickstep.task.viewmodel.TaskViewModel
import com.android.quickstep.util.ActiveGestureErrorDetector
import com.android.quickstep.util.ActiveGestureLog
import com.android.quickstep.util.BorderAnimator
@@ -95,7 +90,6 @@
import com.android.systemui.shared.recents.model.Task
import com.android.systemui.shared.recents.model.ThumbnailData
import com.android.systemui.shared.system.ActivityManagerWrapper
-import com.android.systemui.shared.system.QuickStepContract
/** A task in the Recents view. */
open class TaskView
@@ -107,7 +101,8 @@
defStyleRes: Int = 0,
focusBorderAnimator: BorderAnimator? = null,
hoverBorderAnimator: BorderAnimator? = null,
- private val type: TaskViewType = TaskViewType.SINGLE,
+ val type: TaskViewType = TaskViewType.SINGLE,
+ protected val thumbnailFullscreenParams: FullscreenDrawParams = FullscreenDrawParams(context),
) : FrameLayout(context, attrs), ViewPool.Reusable {
/**
* Used in conjunction with [onTaskListVisibilityChanged], providing more granularity on which
@@ -117,8 +112,6 @@
@IntDef(FLAG_UPDATE_ALL, FLAG_UPDATE_ICON, FLAG_UPDATE_THUMBNAIL, FLAG_UPDATE_CORNER_RADIUS)
annotation class TaskDataChanges
- private lateinit var taskViewModel: TaskViewModel
-
val taskIds: IntArray
/** Returns a copy of integer array containing taskIds of all tasks in the TaskView. */
get() = taskContainers.map { it.task.key.id }.toIntArray()
@@ -142,9 +135,6 @@
this == recentsView?.focusedTaskView ||
(enableLargeDesktopWindowingTile() && type == TaskViewType.DESKTOP)
- val taskCornerRadius: Float
- get() = currentFullscreenParams.cornerRadius
-
val recentsView: RecentsView<*, *>?
get() = parent as? RecentsView<*, *>
@@ -157,15 +147,9 @@
get() = taskContainers[0].task
@get:Deprecated("Use [taskContainers] instead.")
- val firstSnapshotView: View
- /** Returns the first snapshotView of the TaskView. */
- get() = taskContainers[0].snapshotView
-
- @get:Deprecated("Use [taskContainers] instead.")
val firstItemInfo: ItemInfo
get() = taskContainers[0].itemInfo
- private val currentFullscreenParams = FullscreenDrawParams(context)
protected val container: RecentsViewContainer =
RecentsViewContainer.containerFromContext(context)
protected val lastTouchDownPosition = PointF()
@@ -489,17 +473,13 @@
init {
setOnClickListener { _ -> onClick() }
- if (enableRefactorTaskThumbnail()) {
- taskViewModel = RecentsDependencies.get(this, "TaskViewType" to type)
- }
-
val cursorHoverStatesEnabled = enableCursorHoverStates()
setWillNotDraw(!cursorHoverStatesEnabled)
context.obtainStyledAttributes(attrs, R.styleable.TaskView, defStyleAttr, defStyleRes).use {
this.focusBorderAnimator =
focusBorderAnimator
?: createSimpleBorderAnimator(
- currentFullscreenParams.cornerRadius.toInt(),
+ TaskCornerRadius.get(context).toInt(),
context.resources.getDimensionPixelSize(
R.dimen.keyboard_quick_switch_border_width
),
@@ -514,7 +494,7 @@
hoverBorderAnimator
?: if (cursorHoverStatesEnabled)
createSimpleBorderAnimator(
- currentFullscreenParams.cornerRadius.toInt(),
+ TaskCornerRadius.get(context).toInt(),
context.resources.getDimensionPixelSize(
R.dimen.task_hover_border_width
),
@@ -716,7 +696,16 @@
taskOverlayFactory,
)
)
- taskContainers.forEach { it.bind() }
+ onBind(orientedState)
+ }
+
+ open fun onBind(orientedState: RecentsOrientedState) {
+ taskContainers.forEach {
+ it.bind()
+ if (enableRefactorTaskThumbnail()) {
+ it.thumbnailView.cornerRadius = thumbnailFullscreenParams.currentCornerRadius
+ }
+ }
setOrientationState(orientedState)
}
@@ -935,7 +924,7 @@
}
}
if (needsUpdate(changes, FLAG_UPDATE_CORNER_RADIUS)) {
- currentFullscreenParams.updateCornerRadius(context)
+ thumbnailFullscreenParams.updateCornerRadius(context)
}
}
@@ -1514,10 +1503,7 @@
val scale = persistentScale * dismissScale
scaleX = scale
scaleY = scale
- if (enableRefactorTaskThumbnail()) {
- taskViewModel.updateScale(scale)
- }
- updateSnapshotRadius()
+ updateFullscreenParams()
}
protected open fun applyThumbnailSplashAlpha() {
@@ -1560,31 +1546,27 @@
}
focusTransitionFullscreen.value =
FOCUS_TRANSITION_FAST_OUT_INTERPOLATOR.getInterpolation(1 - fullscreenProgress)
- updateSnapshotRadius()
+ updateFullscreenParams()
}
- protected open fun updateSnapshotRadius() {
- updateCurrentFullscreenParams()
+ protected open fun updateFullscreenParams() {
+ updateFullscreenParams(thumbnailFullscreenParams)
taskContainers.forEach {
- if (!enableRefactorTaskThumbnail()) {
- it.thumbnailViewDeprecated.setFullscreenParams(getThumbnailFullscreenParams())
+ if (enableRefactorTaskThumbnail()) {
+ it.thumbnailView.cornerRadius = thumbnailFullscreenParams.currentCornerRadius
+ } else {
+ it.thumbnailViewDeprecated.setFullscreenParams(thumbnailFullscreenParams)
}
- it.overlay.setFullscreenParams(getThumbnailFullscreenParams())
+ it.overlay.setFullscreenParams(thumbnailFullscreenParams)
}
}
- protected open fun updateCurrentFullscreenParams() {
- updateFullscreenParams(currentFullscreenParams)
- }
-
protected fun updateFullscreenParams(fullscreenParams: FullscreenDrawParams) {
recentsView?.let { fullscreenParams.setProgress(fullscreenProgress, it.scaleX, scaleX) }
}
- protected open fun getThumbnailFullscreenParams(): FullscreenDrawParams =
- currentFullscreenParams
-
private fun onModalnessUpdated(modalness: Float) {
+ isClickable = modalness == 0f
taskContainers.forEach {
it.iconView.setModalAlpha(1 - modalness)
it.digitalWellBeingToast?.bannerOffsetPercentage = modalness
@@ -1630,56 +1612,6 @@
private fun getNonGridTrans(endTranslation: Float) =
endTranslation - getGridTrans(endTranslation)
- /** We update and subsequently draw these in [fullscreenProgress]. */
- open class FullscreenDrawParams(context: Context) : SafeCloseable {
- var cornerRadius = 0f
- private var windowCornerRadius = 0f
- var currentDrawnCornerRadius = 0f
-
- init {
- updateCornerRadius(context)
- }
-
- /** Recomputes the start and end corner radius for the given Context. */
- fun updateCornerRadius(context: Context) {
- cornerRadius = computeTaskCornerRadius(context)
- windowCornerRadius = computeWindowCornerRadius(context)
- }
-
- @VisibleForTesting(otherwise = VisibleForTesting.PROTECTED)
- open fun computeTaskCornerRadius(context: Context): Float {
- return TaskCornerRadius.get(context)
- }
-
- @VisibleForTesting(otherwise = VisibleForTesting.PROTECTED)
- open fun computeWindowCornerRadius(context: Context): Float {
- val activityContext: ActivityContext? = ActivityContext.lookupContextNoThrow(context)
-
- // The corner radius is fixed to match when Taskbar is persistent mode
- return if (
- activityContext != null &&
- activityContext.deviceProfile?.isTaskbarPresent == true &&
- DisplayController.isTransientTaskbar(context)
- ) {
- context.resources
- .getDimensionPixelSize(R.dimen.persistent_taskbar_corner_radius)
- .toFloat()
- } else {
- QuickStepContract.getWindowCornerRadius(context)
- }
- }
-
- /** Sets the progress in range [0, 1] */
- fun setProgress(fullscreenProgress: Float, parentScale: Float, taskViewScale: Float) {
- currentDrawnCornerRadius =
- Utilities.mapRange(fullscreenProgress, cornerRadius, windowCornerRadius) /
- parentScale /
- taskViewScale
- }
-
- override fun close() {}
- }
-
private fun MotionEvent.isWithinThumbnailBounds(): Boolean {
return thumbnailBounds.contains(x.toInt(), y.toInt())
}
diff --git a/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureProtoLogProxy.java b/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureProtoLogProxy.java
index f43a125..f25f6f4 100644
--- a/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureProtoLogProxy.java
+++ b/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureProtoLogProxy.java
@@ -38,6 +38,8 @@
import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.START_RECENTS_ANIMATION;
import static com.android.quickstep.util.QuickstepProtoLogGroup.ACTIVE_GESTURE_LOG;
+import android.graphics.Point;
+import android.graphics.RectF;
import android.view.MotionEvent;
import androidx.annotation.NonNull;
@@ -96,6 +98,12 @@
+ "force finish recents animation complete; clearing state callback.");
}
+ public static void logHandOffAnimation() {
+ ActiveGestureLog.INSTANCE.addLog("AbsSwipeUpHandler.handOffAnimation");
+ if (!enableActiveGestureProtoLog()) return;
+ ProtoLog.d(ACTIVE_GESTURE_LOG, "AbsSwipeUpHandler.handOffAnimation");
+ }
+
public static void logFinishRecentsAnimationOnTasksAppeared() {
ActiveGestureLog.INSTANCE.addLog("finishRecentsAnimationOnTasksAppeared");
if (!enableActiveGestureProtoLog()) return;
@@ -499,4 +507,16 @@
taskId,
packageName);
}
+
+ public static void logCreateTouchRegionForDisplay(int displayRotation,
+ @NonNull Point displaySize, @NonNull RectF swipeRegion, @NonNull RectF ohmRegion,
+ int gesturalHeight, int largerGesturalHeight, @NonNull String reason) {
+ if (!enableActiveGestureProtoLog()) return;
+ ProtoLog.d(ACTIVE_GESTURE_LOG,
+ "OrientationTouchTransformer.createRegionForDisplay: "
+ + "dispRot=%d, dispSize=%s, swipeRegion=%s, ohmRegion=%s, "
+ + "gesturalHeight=%d, largerGesturalHeight=%d, reason=%s",
+ displayRotation, displaySize.flattenToString(), swipeRegion.toShortString(),
+ ohmRegion.toShortString(), gesturalHeight, largerGesturalHeight, reason);
+ }
}
diff --git a/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/FakeTaskThumbnailViewModel.kt b/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/FakeTaskThumbnailViewModel.kt
index ff5d8bd..47d2bfc 100644
--- a/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/FakeTaskThumbnailViewModel.kt
+++ b/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/FakeTaskThumbnailViewModel.kt
@@ -22,8 +22,6 @@
import kotlinx.coroutines.flow.MutableStateFlow
class FakeTaskThumbnailViewModel : TaskThumbnailViewModel {
- override val cornerRadiusProgress = MutableStateFlow(0f)
- override val inheritedScale = MutableStateFlow(1f)
override val dimProgress = MutableStateFlow(0f)
override val splashAlpha = MutableStateFlow(0f)
override val uiState = MutableStateFlow<TaskThumbnailUiState>(Uninitialized)
diff --git a/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/TaskThumbnailViewScreenshotTest.kt b/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/TaskThumbnailViewScreenshotTest.kt
index 75769e9..49fe614 100644
--- a/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/TaskThumbnailViewScreenshotTest.kt
+++ b/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/TaskThumbnailViewScreenshotTest.kt
@@ -66,11 +66,13 @@
val di = RecentsDependencies.initialize(context)
val taskThumbnailView =
LayoutInflater.from(context).inflate(R.layout.task_thumbnail, null, false)
+ as TaskThumbnailView
+ taskThumbnailView.cornerRadius = CORNER_RADIUS
val ttvDiScopeId = di.getScope(taskThumbnailView).scopeId
di.provide(TaskThumbnailViewData::class.java, ttvDiScopeId) { TaskThumbnailViewData() }
di.provide(TaskThumbnailViewModel::class.java, ttvDiScopeId) { taskThumbnailViewModel }
- return taskThumbnailView as TaskThumbnailView
+ return taskThumbnailView
}
companion object {
@@ -82,5 +84,7 @@
isDarkTheme = false,
isLandscape = false,
)
+
+ const val CORNER_RADIUS = 56f
}
}
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/model/data/TaskViewItemInfoTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/model/data/TaskViewItemInfoTest.kt
new file mode 100644
index 0000000..5cee434
--- /dev/null
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/model/data/TaskViewItemInfoTest.kt
@@ -0,0 +1,184 @@
+/*
+ * 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.launcher3.model.data
+
+import android.content.ComponentName
+import android.content.Intent
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.platform.app.InstrumentationRegistry
+import com.android.launcher3.Flags.enableRefactorTaskThumbnail
+import com.android.launcher3.model.data.ItemInfoWithIcon.FLAG_NOT_PINNABLE
+import com.android.launcher3.model.data.TaskViewItemInfo.Companion.createTaskViewAtom
+import com.android.launcher3.pm.UserCache
+import com.android.launcher3.util.MainThreadInitializedObject.SandboxContext
+import com.android.launcher3.util.SplitConfigurationOptions
+import com.android.launcher3.util.TransformingTouchDelegate
+import com.android.launcher3.util.UserIconInfo
+import com.android.quickstep.TaskOverlayFactory
+import com.android.quickstep.TaskOverlayFactory.TaskOverlay
+import com.android.quickstep.recents.di.RecentsDependencies
+import com.android.quickstep.task.thumbnail.TaskThumbnailView
+import com.android.quickstep.views.RecentsView
+import com.android.quickstep.views.TaskContainer
+import com.android.quickstep.views.TaskThumbnailViewDeprecated
+import com.android.quickstep.views.TaskView
+import com.android.quickstep.views.TaskViewIcon
+import com.android.quickstep.views.TaskViewType
+import com.android.systemui.shared.recents.model.Task
+import com.android.systemui.shared.recents.model.Task.TaskKey
+import com.google.common.truth.Truth.assertThat
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.kotlin.any
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.whenever
+
+/** Test for [TaskViewItemInfo] */
+@RunWith(AndroidJUnit4::class)
+class TaskViewItemInfoTest {
+ private val context = SandboxContext(InstrumentationRegistry.getInstrumentation().targetContext)
+ private val taskView = mock<TaskView>()
+ private val recentsView = mock<RecentsView<*, *>>()
+ private val overlayFactory = mock<TaskOverlayFactory>()
+ private val userCache = mock<UserCache>()
+ private val userInfo = mock<UserIconInfo>()
+
+ @Before
+ fun setUp() {
+ whenever(overlayFactory.createOverlay(any())).thenReturn(mock<TaskOverlay<*>>())
+ whenever(taskView.context).thenReturn(context)
+ whenever(taskView.recentsView).thenReturn(recentsView)
+ whenever(recentsView.indexOfChild(taskView)).thenReturn(TASK_VIEW_INDEX)
+ whenever(userInfo.isPrivate).thenReturn(false)
+ whenever(userCache.getUserInfo(any())).thenReturn(userInfo)
+ context.putObject(UserCache.INSTANCE, userCache)
+ RecentsDependencies.initialize(context)
+ }
+
+ @Test
+ fun singleTask() {
+ val taskContainers = listOf(createTaskContainer(createTask(1)))
+ whenever(taskView.type).thenReturn(TaskViewType.SINGLE)
+ whenever(taskView.taskContainers).thenReturn(taskContainers)
+
+ val taskViewItemInfo = TaskViewItemInfo(taskContainers[0])
+
+ assertThat(taskViewItemInfo.taskViewAtom)
+ .isEqualTo(
+ createTaskViewAtom(
+ type = 0,
+ index = TASK_VIEW_INDEX,
+ componentName = "${PACKAGE}/${CLASS}",
+ cardinality = 1,
+ )
+ )
+ assertThat(taskViewItemInfo.runtimeStatusFlags and FLAG_NOT_PINNABLE).isEqualTo(0)
+ }
+
+ @Test
+ fun splitTask() {
+ val taskContainers =
+ listOf(createTaskContainer(createTask(1)), createTaskContainer(createTask(2)))
+ whenever(taskView.type).thenReturn(TaskViewType.GROUPED)
+ whenever(taskView.taskContainers).thenReturn(taskContainers)
+
+ val taskViewItemInfo = TaskViewItemInfo(taskContainers[0])
+
+ assertThat(taskViewItemInfo.taskViewAtom)
+ .isEqualTo(
+ createTaskViewAtom(
+ type = 1,
+ index = TASK_VIEW_INDEX,
+ componentName = "${PACKAGE}/${CLASS}",
+ cardinality = 2,
+ )
+ )
+ assertThat(taskViewItemInfo.runtimeStatusFlags and FLAG_NOT_PINNABLE).isEqualTo(0)
+ }
+
+ @Test
+ fun desktopTask() {
+ val taskContainers =
+ listOf(
+ createTaskContainer(createTask(1)),
+ createTaskContainer(createTask(2)),
+ createTaskContainer(createTask(3)),
+ )
+ whenever(taskView.type).thenReturn(TaskViewType.DESKTOP)
+ whenever(taskView.taskContainers).thenReturn(taskContainers)
+
+ val taskViewItemInfo = TaskViewItemInfo(taskContainers[0])
+
+ assertThat(taskViewItemInfo.taskViewAtom)
+ .isEqualTo(
+ createTaskViewAtom(
+ type = 2,
+ index = TASK_VIEW_INDEX,
+ componentName = "${PACKAGE}/${CLASS}",
+ cardinality = 3,
+ )
+ )
+ assertThat(taskViewItemInfo.runtimeStatusFlags and FLAG_NOT_PINNABLE).isEqualTo(0)
+ }
+
+ @Test
+ fun privateTask() {
+ val taskContainers = listOf(createTaskContainer(createTask(1)))
+ whenever(taskView.type).thenReturn(TaskViewType.SINGLE)
+ whenever(taskView.taskContainers).thenReturn(taskContainers)
+ whenever(userInfo.isPrivate).thenReturn(true)
+
+ val taskViewItemInfo = TaskViewItemInfo(taskContainers[0])
+
+ assertThat(taskViewItemInfo.taskViewAtom)
+ .isEqualTo(
+ createTaskViewAtom(
+ type = 0,
+ index = TASK_VIEW_INDEX,
+ componentName = "${PACKAGE}/${CLASS}",
+ cardinality = 1,
+ )
+ )
+ assertThat(taskViewItemInfo.runtimeStatusFlags and FLAG_NOT_PINNABLE)
+ .isEqualTo(FLAG_NOT_PINNABLE)
+ }
+
+ private fun createTask(id: Int) =
+ Task(TaskKey(id, 0, Intent(), ComponentName(PACKAGE, CLASS), 0, 2000))
+
+ private fun createTaskContainer(task: Task): TaskContainer {
+ return TaskContainer(
+ taskView,
+ task,
+ if (enableRefactorTaskThumbnail()) mock<TaskThumbnailView>()
+ else mock<TaskThumbnailViewDeprecated>(),
+ mock<TaskViewIcon>(),
+ mock<TransformingTouchDelegate>(),
+ SplitConfigurationOptions.STAGE_POSITION_UNDEFINED,
+ digitalWellBeingToast = null,
+ showWindowsView = null,
+ overlayFactory,
+ )
+ }
+
+ companion object {
+ const val PACKAGE = "package"
+ const val CLASS = "class"
+ const val TASK_VIEW_INDEX = 4
+ }
+}
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarNavButtonControllerTest.java b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarNavButtonControllerTest.java
index 4b04dba..c682990 100644
--- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarNavButtonControllerTest.java
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarNavButtonControllerTest.java
@@ -15,9 +15,11 @@
import static com.android.launcher3.taskbar.TaskbarNavButtonController.BUTTON_RECENTS;
import static com.android.launcher3.taskbar.TaskbarNavButtonController.SCREEN_PIN_LONG_PRESS_THRESHOLD;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SCREEN_PINNING;
+import static com.android.window.flags.Flags.FLAG_PREDICTIVE_BACK_THREE_BUTTON_NAV;
import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
@@ -28,6 +30,10 @@
import static org.mockito.Mockito.when;
import android.os.Handler;
+import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.flag.junit.CheckFlagsRule;
+import android.platform.test.flag.junit.DeviceFlagsValueProvider;
+import android.view.KeyEvent;
import android.view.View;
import android.view.inputmethod.Flags;
@@ -43,8 +49,10 @@
import com.android.systemui.contextualeducation.GestureType;
import org.junit.Before;
+import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@@ -76,6 +84,9 @@
@Mock
View mockView;
+ @Rule
+ public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+
private int mHomePressCount;
private int mOverviewToggleCount;
private final TaskbarNavButtonCallbacks mCallbacks = new TaskbarNavButtonCallbacks() {
@@ -333,4 +344,46 @@
verify(mockStatsLogger, times(1)).log(LAUNCHER_TASKBAR_BACK_BUTTON_LONGPRESS);
verify(mockStatsLogger, times(0)).log(LAUNCHER_TASKBAR_BACK_BUTTON_TAP);
}
+
+ @Test
+ @RequiresFlagsEnabled(FLAG_PREDICTIVE_BACK_THREE_BUTTON_NAV)
+ public void testPredictiveBackInvoked() {
+ ArgumentCaptor<KeyEvent> keyEventCaptor = ArgumentCaptor.forClass(KeyEvent.class);
+ mNavButtonController.sendBackKeyEvent(KeyEvent.ACTION_DOWN, false);
+ mNavButtonController.sendBackKeyEvent(KeyEvent.ACTION_UP, false);
+ verify(mockSystemUiProxy, times(2)).onBackEvent(keyEventCaptor.capture());
+ verifyKeyEvent(keyEventCaptor.getAllValues().getFirst(), KeyEvent.ACTION_DOWN, false);
+ verifyKeyEvent(keyEventCaptor.getAllValues().getLast(), KeyEvent.ACTION_UP, false);
+ }
+
+ @Test
+ @RequiresFlagsEnabled(FLAG_PREDICTIVE_BACK_THREE_BUTTON_NAV)
+ public void testPredictiveBackCancelled() {
+ ArgumentCaptor<KeyEvent> keyEventCaptor = ArgumentCaptor.forClass(KeyEvent.class);
+ mNavButtonController.sendBackKeyEvent(KeyEvent.ACTION_DOWN, false);
+ mNavButtonController.sendBackKeyEvent(KeyEvent.ACTION_UP, true);
+ verify(mockSystemUiProxy, times(2)).onBackEvent(keyEventCaptor.capture());
+ verifyKeyEvent(keyEventCaptor.getAllValues().getFirst(), KeyEvent.ACTION_DOWN, false);
+ verifyKeyEvent(keyEventCaptor.getAllValues().getLast(), KeyEvent.ACTION_UP, true);
+ }
+
+ @Test
+ @RequiresFlagsEnabled(FLAG_PREDICTIVE_BACK_THREE_BUTTON_NAV)
+ public void testButtonsDisabledWhileBackPressed() {
+ mNavButtonController.sendBackKeyEvent(KeyEvent.ACTION_DOWN, false);
+ mNavButtonController.onButtonClick(BUTTON_HOME, mockView);
+ mNavButtonController.onButtonClick(BUTTON_RECENTS, mockView);
+ mNavButtonController.onButtonLongClick(BUTTON_A11Y, mockView);
+ mNavButtonController.onButtonClick(BUTTON_IME_SWITCH, mockView);
+ mNavButtonController.sendBackKeyEvent(KeyEvent.ACTION_UP, false);
+ assertThat(mHomePressCount).isEqualTo(0);
+ verify(mockSystemUiProxy, never()).notifyAccessibilityButtonLongClicked();
+ assertThat(mOverviewToggleCount).isEqualTo(0);
+ verify(mockSystemUiProxy, never()).onImeSwitcherPressed();
+ }
+
+ private void verifyKeyEvent(KeyEvent keyEvent, int action, boolean isCancelled) {
+ assertEquals(isCancelled, keyEvent.isCanceled());
+ assertEquals(action, KeyEvent.ACTION_DOWN, keyEvent.getAction());
+ }
}
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarOverflowTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarOverflowTest.kt
new file mode 100644
index 0000000..011ba7e
--- /dev/null
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarOverflowTest.kt
@@ -0,0 +1,323 @@
+/*
+ * 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.launcher3.taskbar
+
+import android.animation.AnimatorTestRule
+import android.content.ComponentName
+import android.content.Intent
+import android.platform.test.annotations.EnableFlags
+import android.platform.test.flag.junit.SetFlagsRule
+import com.android.launcher3.Flags.FLAG_TASKBAR_OVERFLOW
+import com.android.launcher3.taskbar.TaskbarControllerTestUtil.runOnMainSync
+import com.android.launcher3.taskbar.bubbles.BubbleBarViewController
+import com.android.launcher3.taskbar.bubbles.stashing.BubbleStashController
+import com.android.launcher3.taskbar.rules.MockedRecentsModelTestRule
+import com.android.launcher3.taskbar.rules.TaskbarModeRule
+import com.android.launcher3.taskbar.rules.TaskbarModeRule.Mode.PINNED
+import com.android.launcher3.taskbar.rules.TaskbarModeRule.Mode.TRANSIENT
+import com.android.launcher3.taskbar.rules.TaskbarModeRule.TaskbarMode
+import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule
+import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule.InjectController
+import com.android.launcher3.taskbar.rules.TaskbarWindowSandboxContext
+import com.android.launcher3.util.LauncherMultivalentJUnit
+import com.android.launcher3.util.LauncherMultivalentJUnit.EmulatedDevices
+import com.android.launcher3.util.TestUtil.getOnUiThread
+import com.android.quickstep.SystemUiProxy
+import com.android.quickstep.util.DesktopTask
+import com.android.systemui.shared.recents.model.Task
+import com.android.window.flags.Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE
+import com.android.window.flags.Flags.FLAG_ENABLE_DESKTOP_WINDOWING_TASKBAR_RUNNING_APPS
+import com.android.wm.shell.Flags.FLAG_ENABLE_BUBBLE_BAR
+import com.android.wm.shell.desktopmode.IDesktopTaskListener
+import com.google.common.truth.Truth.assertThat
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(LauncherMultivalentJUnit::class)
+@EmulatedDevices(["pixelTablet2023"])
+@EnableFlags(
+ FLAG_TASKBAR_OVERFLOW,
+ FLAG_ENABLE_DESKTOP_WINDOWING_TASKBAR_RUNNING_APPS,
+ FLAG_ENABLE_DESKTOP_WINDOWING_MODE,
+ FLAG_ENABLE_BUBBLE_BAR,
+)
+class TaskbarOverflowTest {
+ @get:Rule(order = 0) val setFlagsRule = SetFlagsRule()
+
+ @get:Rule(order = 1)
+ val context =
+ TaskbarWindowSandboxContext.create { builder ->
+ builder.bindSystemUiProxy(
+ object : SystemUiProxy(this) {
+ override fun setDesktopTaskListener(listener: IDesktopTaskListener?) {
+ desktopTaskListener = listener
+ }
+ }
+ )
+ }
+
+ @get:Rule(order = 2) val recentsModel = MockedRecentsModelTestRule(context)
+
+ @get:Rule(order = 3) val taskbarModeRule = TaskbarModeRule(context)
+
+ @get:Rule(order = 4) val animatorTestRule = AnimatorTestRule(this)
+
+ @get:Rule(order = 5) val taskbarUnitTestRule = TaskbarUnitTestRule(this, context)
+
+ @InjectController lateinit var taskbarViewController: TaskbarViewController
+ @InjectController lateinit var recentAppsController: TaskbarRecentAppsController
+ @InjectController lateinit var bubbleBarViewController: BubbleBarViewController
+ @InjectController lateinit var bubbleStashController: BubbleStashController
+
+ private var desktopTaskListener: IDesktopTaskListener? = null
+
+ @Before
+ fun ensureRunningAppsShowing() {
+ runOnMainSync {
+ if (!recentAppsController.canShowRunningApps) {
+ recentAppsController.onDestroy()
+ recentAppsController.canShowRunningApps = true
+ recentAppsController.init(taskbarUnitTestRule.activityContext.controllers)
+ }
+ recentsModel.resolvePendingTaskRequests()
+ }
+ }
+
+ @Test
+ @TaskbarMode(PINNED)
+ fun testTaskbarWithMaxNumIcons_pinned() {
+ addRunningAppsAndVerifyOverflowState(0)
+
+ assertThat(taskbarIconsCentered).isTrue()
+ assertThat(taskbarEndMargin).isAtLeast(navButtonEndSpacing)
+ }
+
+ @Test
+ @TaskbarMode(TRANSIENT)
+ fun testTaskbarWithMaxNumIcons_transient() {
+ addRunningAppsAndVerifyOverflowState(0)
+
+ assertThat(taskbarIconsCentered).isTrue()
+ assertThat(taskbarEndMargin).isAtLeast(navButtonEndSpacing)
+ }
+
+ @Test
+ @TaskbarMode(PINNED)
+ fun testOverflownTaskbar_pinned() {
+ addRunningAppsAndVerifyOverflowState(5)
+
+ assertThat(taskbarIconsCentered).isTrue()
+ assertThat(taskbarEndMargin).isAtLeast(navButtonEndSpacing)
+ }
+
+ @Test
+ @TaskbarMode(TRANSIENT)
+ fun testOverflownTaskbar_transient() {
+ addRunningAppsAndVerifyOverflowState(5)
+
+ assertThat(taskbarIconsCentered).isTrue()
+ assertThat(taskbarEndMargin).isAtLeast(navButtonEndSpacing)
+ }
+
+ @Test
+ @TaskbarMode(PINNED)
+ fun testBubbleBarReducesTaskbarMaxNumIcons_pinned() {
+ var initialMaxNumIconViews = maxNumberOfTaskbarIcons
+ assertThat(initialMaxNumIconViews).isGreaterThan(0)
+
+ runOnMainSync { bubbleBarViewController.setHiddenForBubbles(false) }
+
+ val maxNumIconViews = addRunningAppsAndVerifyOverflowState(2)
+ assertThat(maxNumIconViews).isLessThan(initialMaxNumIconViews)
+
+ assertThat(taskbarIconsCentered).isTrue()
+ }
+
+ @Test
+ @TaskbarMode(TRANSIENT)
+ fun testBubbleBarReducesTaskbarMaxNumIcons_transient() {
+ var initialMaxNumIconViews = maxNumberOfTaskbarIcons
+ assertThat(initialMaxNumIconViews).isGreaterThan(0)
+
+ runOnMainSync { bubbleBarViewController.setHiddenForBubbles(false) }
+
+ val maxNumIconViews = addRunningAppsAndVerifyOverflowState(2)
+ assertThat(maxNumIconViews).isLessThan(initialMaxNumIconViews)
+
+ assertThat(taskbarIconsCentered).isTrue()
+ assertThat(taskbarEndMargin)
+ .isAtLeast(
+ navButtonEndSpacing +
+ bubbleBarViewController.collapsedWidthWithMaxVisibleBubbles.toInt()
+ )
+ }
+
+ @Test
+ @TaskbarMode(TRANSIENT)
+ fun testBubbleBarReducesTaskbarMaxNumIcons_transientBubbleInitiallyStashed() {
+ var initialMaxNumIconViews = maxNumberOfTaskbarIcons
+ assertThat(initialMaxNumIconViews).isGreaterThan(0)
+ runOnMainSync {
+ bubbleStashController.stashBubbleBarImmediate()
+ bubbleBarViewController.setHiddenForBubbles(false)
+ }
+
+ val maxNumIconViews = addRunningAppsAndVerifyOverflowState(2)
+ assertThat(maxNumIconViews).isLessThan(initialMaxNumIconViews)
+
+ assertThat(taskbarIconsCentered).isTrue()
+ assertThat(taskbarEndMargin)
+ .isAtLeast(
+ navButtonEndSpacing +
+ bubbleBarViewController.collapsedWidthWithMaxVisibleBubbles.toInt()
+ )
+ }
+
+ @Test
+ @TaskbarMode(TRANSIENT)
+ fun testStashingBubbleBarMaintainsMaxNumIcons_transient() {
+ runOnMainSync { bubbleBarViewController.setHiddenForBubbles(false) }
+
+ val initialNumIcons = currentNumberOfTaskbarIcons
+ val maxNumIconViews = addRunningAppsAndVerifyOverflowState(2)
+
+ runOnMainSync { bubbleStashController.stashBubbleBarImmediate() }
+ assertThat(maxNumberOfTaskbarIcons).isEqualTo(maxNumIconViews)
+ assertThat(currentNumberOfTaskbarIcons).isEqualTo(maxNumIconViews)
+ assertThat(taskbarOverflowIconIndex).isEqualTo(initialNumIcons.coerceAtLeast(2))
+ }
+
+ @Test
+ @TaskbarMode(PINNED)
+ fun testHidingBubbleBarIncreasesMaxNumIcons_pinned() {
+ runOnMainSync { bubbleBarViewController.setHiddenForBubbles(false) }
+
+ val initialNumIcons = currentNumberOfTaskbarIcons
+ val initialMaxNumIconViews = addRunningAppsAndVerifyOverflowState(5)
+
+ runOnMainSync {
+ bubbleBarViewController.setHiddenForBubbles(true)
+ animatorTestRule.advanceTimeBy(150)
+ }
+
+ val maxNumIconViews = maxNumberOfTaskbarIcons
+ assertThat(maxNumIconViews).isGreaterThan(initialMaxNumIconViews)
+ assertThat(currentNumberOfTaskbarIcons).isEqualTo(maxNumIconViews)
+ assertThat(taskbarOverflowIconIndex).isEqualTo(initialNumIcons.coerceAtLeast(2))
+
+ assertThat(taskbarIconsCentered).isTrue()
+ }
+
+ @Test
+ @TaskbarMode(TRANSIENT)
+ fun testHidingBubbleBarIncreasesMaxNumIcons_transient() {
+ runOnMainSync { bubbleBarViewController.setHiddenForBubbles(false) }
+
+ val initialNumIcons = currentNumberOfTaskbarIcons
+ val initialMaxNumIconViews = addRunningAppsAndVerifyOverflowState(5)
+
+ runOnMainSync {
+ bubbleBarViewController.setHiddenForBubbles(true)
+ animatorTestRule.advanceTimeBy(150)
+ }
+
+ val maxNumIconViews = maxNumberOfTaskbarIcons
+ assertThat(maxNumIconViews).isGreaterThan(initialMaxNumIconViews)
+ assertThat(currentNumberOfTaskbarIcons).isEqualTo(maxNumIconViews)
+ assertThat(taskbarOverflowIconIndex).isEqualTo(initialNumIcons.coerceAtLeast(2))
+
+ assertThat(taskbarIconsCentered).isTrue()
+ }
+
+ private fun createDesktopTask(tasksToAdd: Int) {
+ val tasks =
+ (0..<tasksToAdd).map {
+ Task(Task.TaskKey(it, 0, Intent(), ComponentName("", ""), 0, 2000))
+ }
+ recentsModel.updateRecentTasks(listOf(DesktopTask(tasks)))
+ desktopTaskListener?.onTasksVisibilityChanged(
+ context.virtualDisplay.display.displayId,
+ tasksToAdd,
+ )
+ runOnMainSync { recentsModel.resolvePendingTaskRequests() }
+ }
+
+ private val navButtonEndSpacing: Int
+ get() {
+ return taskbarUnitTestRule.activityContext.resources.getDimensionPixelSize(
+ taskbarUnitTestRule.activityContext.deviceProfile.inv.inlineNavButtonsEndSpacing
+ )
+ }
+
+ private val taskbarOverflowIconIndex: Int
+ get() {
+ return getOnUiThread {
+ taskbarViewController.iconViews.indexOfFirst { it is TaskbarOverflowView }
+ }
+ }
+
+ private val maxNumberOfTaskbarIcons: Int
+ get() = getOnUiThread { taskbarViewController.maxNumIconViews }
+
+ private val currentNumberOfTaskbarIcons: Int
+ get() = getOnUiThread { taskbarViewController.iconViews.size }
+
+ private val taskbarIconsCentered: Boolean
+ get() {
+ return getOnUiThread {
+ val iconLayoutBounds =
+ taskbarViewController.transientTaskbarIconLayoutBoundsInParent
+ val availableWidth = taskbarUnitTestRule.activityContext.deviceProfile.widthPx
+ iconLayoutBounds.left - (availableWidth - iconLayoutBounds.right) < 2
+ }
+ }
+
+ private val taskbarEndMargin: Int
+ get() {
+ return getOnUiThread {
+ taskbarUnitTestRule.activityContext.deviceProfile.widthPx -
+ taskbarViewController.transientTaskbarIconLayoutBoundsInParent.right
+ }
+ }
+
+ /**
+ * Adds enough running apps for taskbar to enter overflow of `targetOverflowSize`, and verifies
+ * * max number of icons in the taskbar remains unchanged
+ * * number of icons in the taskbar is at most max number of icons
+ * * whether the taskbar overflow icon is shown, and its position in taskbar.
+ *
+ * Returns max number of icons.
+ */
+ private fun addRunningAppsAndVerifyOverflowState(targetOverflowSize: Int): Int {
+ val maxNumIconViews = maxNumberOfTaskbarIcons
+ assertThat(maxNumIconViews).isGreaterThan(0)
+ // Assume there are at least all apps and divider icon, as they would appear once running
+ // apps are added, even if not present initially.
+ val initialIconCount = currentNumberOfTaskbarIcons.coerceAtLeast(2)
+ assertThat(initialIconCount).isLessThan(maxNumIconViews)
+
+ createDesktopTask(maxNumIconViews - initialIconCount + targetOverflowSize)
+
+ assertThat(maxNumberOfTaskbarIcons).isEqualTo(maxNumIconViews)
+ assertThat(currentNumberOfTaskbarIcons).isEqualTo(maxNumIconViews)
+ assertThat(taskbarOverflowIconIndex)
+ .isEqualTo(if (targetOverflowSize > 0) initialIconCount else -1)
+ return maxNumIconViews
+ }
+}
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewTest.kt
new file mode 100644
index 0000000..0bb404b
--- /dev/null
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewTest.kt
@@ -0,0 +1,157 @@
+/*
+ * 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.launcher3.taskbar
+
+import android.platform.test.flag.junit.FlagsParameterization
+import android.platform.test.flag.junit.FlagsParameterization.allCombinationsOf
+import android.platform.test.flag.junit.SetFlagsRule
+import com.android.launcher3.Flags.FLAG_TASKBAR_RECENTS_LAYOUT_TRANSITION
+import com.android.launcher3.R
+import com.android.launcher3.taskbar.TaskbarControllerTestUtil.runOnMainSync
+import com.android.launcher3.taskbar.TaskbarIconType.ALL_APPS
+import com.android.launcher3.taskbar.TaskbarIconType.DIVIDER
+import com.android.launcher3.taskbar.TaskbarIconType.HOTSEAT
+import com.android.launcher3.taskbar.TaskbarIconType.RECENT
+import com.android.launcher3.taskbar.TaskbarViewTestUtil.assertThat
+import com.android.launcher3.taskbar.TaskbarViewTestUtil.createHotseatItems
+import com.android.launcher3.taskbar.TaskbarViewTestUtil.createRecents
+import com.android.launcher3.taskbar.rules.TaskbarDeviceEmulationRule
+import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule
+import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule.ForceRtl
+import com.android.launcher3.taskbar.rules.TaskbarWindowSandboxContext
+import com.android.launcher3.util.LauncherMultivalentJUnit.Companion.isRunningInRobolectric
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import platform.test.runner.parameterized.ParameterizedAndroidJunit4
+import platform.test.runner.parameterized.Parameters
+
+@RunWith(ParameterizedAndroidJunit4::class)
+class TaskbarViewTest(deviceName: String, flags: FlagsParameterization) {
+
+ companion object {
+ @JvmStatic
+ @Parameters(name = "{0},{1}")
+ fun getParams(): List<Array<Any>> {
+ val devices =
+ if (isRunningInRobolectric) {
+ listOf("pixelFoldable2023", "pixelTablet2023")
+ } else {
+ listOf("onDevice") // Unused.
+ }
+ val flags = allCombinationsOf(FLAG_TASKBAR_RECENTS_LAYOUT_TRANSITION)
+ return devices.flatMap { d -> flags.map { f -> arrayOf(d, f) } } // Cartesian product.
+ }
+ }
+
+ @get:Rule(order = 0) val setFlagsRule = SetFlagsRule(flags)
+ @get:Rule(order = 1) val context = TaskbarWindowSandboxContext.create()
+ @get:Rule(order = 2) val deviceEmulationRule = TaskbarDeviceEmulationRule(context, deviceName)
+ @get:Rule(order = 3) val taskbarUnitTestRule = TaskbarUnitTestRule(this, context)
+
+ private lateinit var taskbarView: TaskbarView
+
+ @Before
+ fun obtainView() {
+ taskbarView = taskbarUnitTestRule.activityContext.dragLayer.findViewById(R.id.taskbar_view)
+ }
+
+ @Test
+ fun testUpdateItems_noItems_hasOnlyAllApps() {
+ runOnMainSync { taskbarView.updateItems(emptyArray(), emptyList()) }
+ assertThat(taskbarView).hasIconTypes(ALL_APPS)
+ }
+
+ @Test
+ fun testUpdateItems_hotseatItems_hasDividerBetweenAllAppsAndHotseat() {
+ runOnMainSync { taskbarView.updateItems(createHotseatItems(2), emptyList()) }
+ assertThat(taskbarView).hasIconTypes(ALL_APPS, DIVIDER, HOTSEAT, HOTSEAT)
+ }
+
+ @Test
+ @ForceRtl
+ fun testUpdateItems_rtlWithHotseatItems_hasDividerBetweenHotseatAndAllApps() {
+ runOnMainSync { taskbarView.updateItems(createHotseatItems(2), emptyList()) }
+ assertThat(taskbarView).hasIconTypes(HOTSEAT, HOTSEAT, DIVIDER, ALL_APPS)
+ }
+
+ @Test
+ fun testUpdateItems_withNullHotseatItem_filtersNullItem() {
+ runOnMainSync {
+ taskbarView.updateItems(arrayOf(*createHotseatItems(2), null), emptyList())
+ }
+ assertThat(taskbarView).hasIconTypes(ALL_APPS, DIVIDER, HOTSEAT, HOTSEAT)
+ }
+
+ @Test
+ @ForceRtl
+ fun testUpdateItems_rtlWithNullHotseatItem_filtersNullItem() {
+ runOnMainSync {
+ taskbarView.updateItems(arrayOf(*createHotseatItems(2), null), emptyList())
+ }
+ assertThat(taskbarView).hasIconTypes(HOTSEAT, HOTSEAT, DIVIDER, ALL_APPS)
+ }
+
+ @Test
+ fun testUpdateItems_recentsItems_hasDividerBetweenAllAppsAndRecents() {
+ runOnMainSync { taskbarView.updateItems(emptyArray(), createRecents(4)) }
+ assertThat(taskbarView).hasIconTypes(ALL_APPS, DIVIDER, *RECENT * 4)
+ }
+
+ @Test
+ fun testUpdateItems_hotseatItemsAndRecents_hasDividerBetweenHotseatAndRecents() {
+ runOnMainSync { taskbarView.updateItems(createHotseatItems(3), createRecents(2)) }
+ assertThat(taskbarView).hasIconTypes(ALL_APPS, *HOTSEAT * 3, DIVIDER, *RECENT * 2)
+ }
+
+ @Test
+ fun testUpdateItems_addHotseatItem_updatesHotseat() {
+ runOnMainSync {
+ taskbarView.updateItems(createHotseatItems(1), createRecents(1))
+ taskbarView.updateItems(createHotseatItems(2), createRecents(1))
+ }
+ assertThat(taskbarView).hasIconTypes(ALL_APPS, *HOTSEAT * 2, DIVIDER, RECENT)
+ }
+
+ @Test
+ fun testUpdateItems_removeHotseatItem_updatesHotseat() {
+ runOnMainSync {
+ taskbarView.updateItems(createHotseatItems(2), createRecents(1))
+ taskbarView.updateItems(createHotseatItems(1), createRecents(1))
+ }
+ assertThat(taskbarView).hasIconTypes(ALL_APPS, HOTSEAT, DIVIDER, RECENT)
+ }
+
+ @Test
+ fun testUpdateItems_addRecentsItem_updatesRecents() {
+ runOnMainSync {
+ taskbarView.updateItems(createHotseatItems(1), createRecents(1))
+ taskbarView.updateItems(createHotseatItems(1), createRecents(2))
+ }
+ assertThat(taskbarView).hasIconTypes(ALL_APPS, HOTSEAT, DIVIDER, *RECENT * 2)
+ }
+
+ @Test
+ fun testUpdateItems_removeRecentsItem_updatesRecents() {
+ runOnMainSync {
+ taskbarView.updateItems(createHotseatItems(1), createRecents(2))
+ taskbarView.updateItems(createHotseatItems(1), createRecents(1))
+ }
+ assertThat(taskbarView).hasIconTypes(ALL_APPS, HOTSEAT, DIVIDER, RECENT)
+ }
+}
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewTestUtil.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewTestUtil.kt
new file mode 100644
index 0000000..a6bdbb0
--- /dev/null
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewTestUtil.kt
@@ -0,0 +1,123 @@
+/*
+ * 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.launcher3.taskbar
+
+import android.content.ComponentName
+import android.content.Intent
+import android.os.Process
+import com.android.launcher3.model.data.AppInfo
+import com.android.launcher3.model.data.ItemInfo
+import com.android.launcher3.model.data.WorkspaceItemInfo
+import com.android.launcher3.taskbar.TaskbarIconType.ALL_APPS
+import com.android.launcher3.taskbar.TaskbarIconType.DIVIDER
+import com.android.launcher3.taskbar.TaskbarIconType.HOTSEAT
+import com.android.launcher3.taskbar.TaskbarIconType.OVERFLOW
+import com.android.launcher3.taskbar.TaskbarIconType.RECENT
+import com.android.quickstep.util.GroupTask
+import com.android.systemui.shared.recents.model.Task
+import com.android.systemui.shared.recents.model.Task.TaskKey
+import com.google.common.truth.FailureMetadata
+import com.google.common.truth.Subject
+import com.google.common.truth.Truth.assertAbout
+import com.google.common.truth.Truth.assertThat
+
+/** Common utilities for testing [TaskbarView]. */
+object TaskbarViewTestUtil {
+
+ /** Begins an assertion about a [TaskbarView]. */
+ fun assertThat(view: TaskbarView): TaskbarViewSubject {
+ return assertAbout(::TaskbarViewSubject).that(view)
+ }
+
+ /** Creates an array of fake hotseat items. */
+ fun createHotseatItems(size: Int): Array<ItemInfo> {
+ return Array(size) {
+ WorkspaceItemInfo(
+ AppInfo(TEST_COMPONENT, "Test App $it", Process.myUserHandle(), Intent())
+ )
+ .apply { id = it }
+ }
+ }
+
+ /** Creates a list of fake recent tasks. */
+ fun createRecents(size: Int): List<GroupTask> {
+ return List(size) {
+ GroupTask(
+ Task().apply {
+ key =
+ TaskKey(
+ it,
+ 5,
+ TEST_INTENT,
+ TEST_COMPONENT,
+ Process.myUserHandle().identifier,
+ System.currentTimeMillis(),
+ )
+ }
+ )
+ }
+ }
+}
+
+/** A `Truth` [Subject] with extensions for verifying [TaskbarView]. */
+class TaskbarViewSubject(failureMetadata: FailureMetadata, private val view: TaskbarView) :
+ Subject(failureMetadata, view) {
+
+ /** Verifies that the types of icons match [expectedTypes] in order. */
+ fun hasIconTypes(vararg expectedTypes: TaskbarIconType) {
+ val actualTypes =
+ view.iconViews.map {
+ when (it) {
+ view.allAppsButtonContainer -> ALL_APPS
+ view.taskbarDividerViewContainer -> DIVIDER
+ view.taskbarOverflowView -> OVERFLOW
+ else ->
+ when (it.tag) {
+ is ItemInfo -> HOTSEAT
+ is GroupTask -> RECENT
+ else -> throw IllegalStateException("Unknown type for $it")
+ }
+ }
+ }
+ assertThat(actualTypes).containsExactly(*expectedTypes).inOrder()
+ }
+
+ /** Verifies that recents from [startIndex] have IDs that match [expectedIds] in order. */
+ fun hasRecentsOrder(startIndex: Int, expectedIds: List<Int>) {
+ val actualIds =
+ view.iconViews.slice(startIndex..<expectedIds.size).map {
+ assertThat(it.tag).isInstanceOf(GroupTask::class.java)
+ (it.tag as? GroupTask)?.task1?.key?.id
+ }
+ assertThat(actualIds).containsExactlyElementsIn(expectedIds).inOrder()
+ }
+}
+
+/** Types of icons in the [TaskbarView]. */
+enum class TaskbarIconType {
+ ALL_APPS,
+ DIVIDER,
+ HOTSEAT,
+ RECENT,
+ OVERFLOW;
+
+ operator fun times(size: Int) = Array(size) { this }
+}
+
+private const val TEST_PACKAGE = "com.android.launcher3.taskbar"
+private val TEST_COMPONENT = ComponentName(TEST_PACKAGE, "Activity")
+private val TEST_INTENT = Intent().apply { `package` = TEST_PACKAGE }
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewWithLayoutTransitionTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewWithLayoutTransitionTest.kt
new file mode 100644
index 0000000..78d8e5d
--- /dev/null
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewWithLayoutTransitionTest.kt
@@ -0,0 +1,134 @@
+/*
+ * 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.launcher3.taskbar
+
+import android.platform.test.annotations.EnableFlags
+import android.platform.test.flag.junit.SetFlagsRule
+import com.android.launcher3.Flags.FLAG_TASKBAR_RECENTS_LAYOUT_TRANSITION
+import com.android.launcher3.R
+import com.android.launcher3.taskbar.TaskbarControllerTestUtil.runOnMainSync
+import com.android.launcher3.taskbar.TaskbarIconType.ALL_APPS
+import com.android.launcher3.taskbar.TaskbarIconType.DIVIDER
+import com.android.launcher3.taskbar.TaskbarIconType.HOTSEAT
+import com.android.launcher3.taskbar.TaskbarIconType.RECENT
+import com.android.launcher3.taskbar.TaskbarViewTestUtil.assertThat
+import com.android.launcher3.taskbar.TaskbarViewTestUtil.createHotseatItems
+import com.android.launcher3.taskbar.TaskbarViewTestUtil.createRecents
+import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule
+import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule.ForceRtl
+import com.android.launcher3.taskbar.rules.TaskbarWindowSandboxContext
+import com.android.launcher3.util.LauncherMultivalentJUnit
+import com.android.launcher3.util.LauncherMultivalentJUnit.EmulatedDevices
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(LauncherMultivalentJUnit::class)
+@EmulatedDevices(["pixelFoldable2023", "pixelTablet2023"])
+@EnableFlags(FLAG_TASKBAR_RECENTS_LAYOUT_TRANSITION)
+class TaskbarViewWithLayoutTransitionTest {
+
+ @get:Rule(order = 0) val setFlagsRule = SetFlagsRule()
+ @get:Rule(order = 1) val context = TaskbarWindowSandboxContext.create()
+ @get:Rule(order = 2) val taskbarUnitTestRule = TaskbarUnitTestRule(this, context)
+
+ private lateinit var taskbarView: TaskbarView
+
+ @Before
+ fun obtainView() {
+ taskbarView = taskbarUnitTestRule.activityContext.dragLayer.findViewById(R.id.taskbar_view)
+ }
+
+ @Test
+ @ForceRtl
+ fun testUpdateItems_rtl_hotseatItems_hasDividerBetweenHotseatAndAllApps() {
+ runOnMainSync { taskbarView.updateItems(createHotseatItems(2), emptyList()) }
+ assertThat(taskbarView).hasIconTypes(*HOTSEAT * 2, DIVIDER, ALL_APPS)
+ }
+
+ @Test
+ @ForceRtl
+ fun testUpdateItems_rtl_recentsItems_hasDividerBetweenRecentsAndAllApps() {
+ runOnMainSync { taskbarView.updateItems(emptyArray(), createRecents(4)) }
+ assertThat(taskbarView).hasIconTypes(*RECENT * 4, DIVIDER, ALL_APPS)
+ }
+
+ @Test
+ @ForceRtl
+ fun testUpdateItems_rtl_recentsItems_recentsAreReversed() {
+ runOnMainSync { taskbarView.updateItems(emptyArray(), createRecents(4)) }
+ assertThat(taskbarView).hasRecentsOrder(startIndex = 0, expectedIds = listOf(3, 2, 1, 0))
+ }
+
+ @Test
+ @ForceRtl
+ fun testUpdateItems_rtl_hotseatItemsAndRecents_hasDividerBetweenRecentsAndHotseat() {
+ runOnMainSync { taskbarView.updateItems(createHotseatItems(3), createRecents(2)) }
+ assertThat(taskbarView).hasIconTypes(*RECENT * 2, DIVIDER, *HOTSEAT * 3, ALL_APPS)
+ }
+
+ @Test
+ @ForceRtl
+ fun testUpdateItems_rtl_addHotseatItemWithoutRecents_updatesHotseat() {
+ runOnMainSync {
+ taskbarView.updateItems(createHotseatItems(1), emptyList())
+ taskbarView.updateItems(createHotseatItems(2), emptyList())
+ }
+ assertThat(taskbarView).hasIconTypes(*HOTSEAT * 2, DIVIDER, ALL_APPS)
+ }
+
+ @Test
+ @ForceRtl
+ fun testUpdateItems_rtl_addHotseatItemWithRecents_updatesHotseat() {
+ runOnMainSync {
+ taskbarView.updateItems(createHotseatItems(1), createRecents(1))
+ taskbarView.updateItems(createHotseatItems(2), createRecents(1))
+ }
+ assertThat(taskbarView).hasIconTypes(RECENT, DIVIDER, *HOTSEAT * 2, ALL_APPS)
+ }
+
+ @Test
+ @ForceRtl
+ fun testUpdateItems_rtl_removeHotseatItem_updatesHotseat() {
+ runOnMainSync {
+ taskbarView.updateItems(createHotseatItems(2), createRecents(1))
+ taskbarView.updateItems(createHotseatItems(1), createRecents(1))
+ }
+ assertThat(taskbarView).hasIconTypes(RECENT, DIVIDER, HOTSEAT, ALL_APPS)
+ }
+
+ @Test
+ @ForceRtl
+ fun testUpdateItems_rtl_addRecentsItem_updatesRecents() {
+ runOnMainSync {
+ taskbarView.updateItems(createHotseatItems(1), createRecents(1))
+ taskbarView.updateItems(createHotseatItems(1), createRecents(2))
+ }
+ assertThat(taskbarView).hasIconTypes(*RECENT * 2, DIVIDER, HOTSEAT, ALL_APPS)
+ }
+
+ @Test
+ @ForceRtl
+ fun testUpdateItems_rtl_removeRecentsItem_updatesRecents() {
+ runOnMainSync {
+ taskbarView.updateItems(createHotseatItems(1), createRecents(2))
+ taskbarView.updateItems(createHotseatItems(1), createRecents(1))
+ }
+ assertThat(taskbarView).hasIconTypes(RECENT, DIVIDER, HOTSEAT, ALL_APPS)
+ }
+}
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/BubbleBarSwipeControllerTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/BubbleBarSwipeControllerTest.kt
index 2e471b8..024ec4c 100644
--- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/BubbleBarSwipeControllerTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/BubbleBarSwipeControllerTest.kt
@@ -36,6 +36,7 @@
import org.mockito.kotlin.any
import org.mockito.kotlin.argumentCaptor
import org.mockito.kotlin.atLeastOnce
+import org.mockito.kotlin.eq
import org.mockito.kotlin.never
import org.mockito.kotlin.times
import org.mockito.kotlin.verify
@@ -206,7 +207,7 @@
bubbleBarSwipeController.start()
bubbleBarSwipeController.swipeTo(UP_ABOVE_UNSTASH)
}
- verify(bubbleStashController).showBubbleBar(expandBubbles = false)
+ verify(bubbleStashController).showBubbleBar(expandBubbles = false, bubbleBarGesture = true)
}
@Test
@@ -227,11 +228,12 @@
bubbleBarSwipeController.swipeTo(UP_ABOVE_UNSTASH)
bubbleBarSwipeController.swipeTo(UP_BELOW_UNSTASH)
}
- verify(bubbleStashController).showBubbleBar(expandBubbles = false)
+ verify(bubbleStashController).showBubbleBar(expandBubbles = false, bubbleBarGesture = true)
verify(bubbleStashController).stashBubbleBar()
getInstrumentation().runOnMainSync { bubbleBarSwipeController.swipeTo(UP_ABOVE_UNSTASH) }
- verify(bubbleStashController, times(2)).showBubbleBar(expandBubbles = false)
+ verify(bubbleStashController, times(2))
+ .showBubbleBar(expandBubbles = false, bubbleBarGesture = true)
}
@Test
@@ -241,9 +243,9 @@
bubbleBarSwipeController.start()
bubbleBarSwipeController.swipeTo(UP_ABOVE_UNSTASH)
}
- verify(bubbleStashController, never()).showBubbleBar(expandBubbles = true)
+ verify(bubbleStashController, never()).showBubbleBar(expandBubbles = eq(true), any())
getInstrumentation().runOnMainSync { bubbleBarSwipeController.finish() }
- verify(bubbleStashController).showBubbleBar(expandBubbles = true)
+ verify(bubbleStashController).showBubbleBar(expandBubbles = true, bubbleBarGesture = true)
}
@Test
@@ -253,12 +255,12 @@
bubbleBarSwipeController.start()
bubbleBarSwipeController.swipeTo(UP_ABOVE_UNSTASH)
}
- verify(bubbleStashController).showBubbleBar(expandBubbles = false)
+ verify(bubbleStashController).showBubbleBar(expandBubbles = false, bubbleBarGesture = true)
getInstrumentation().runOnMainSync {
bubbleBarSwipeController.swipeTo(UP_BELOW_UNSTASH)
bubbleBarSwipeController.finish()
}
- verify(bubbleStashController, never()).showBubbleBar(expandBubbles = true)
+ verify(bubbleStashController, never()).showBubbleBar(expandBubbles = eq(true), any())
}
@Test
@@ -334,7 +336,7 @@
bubbleBarSwipeController.swipeTo(UP_ABOVE_UNSTASH)
bubbleBarSwipeController.finish()
}
- verify(bubbleStashController).showBubbleBar(expandBubbles = true)
+ verify(bubbleStashController).showBubbleBar(expandBubbles = true, bubbleBarGesture = true)
}
@Test
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/animation/BubbleAnimatorTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/animation/BubbleAnimatorTest.kt
index d5a76a2..eae181f 100644
--- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/animation/BubbleAnimatorTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/animation/BubbleAnimatorTest.kt
@@ -40,7 +40,7 @@
iconSize = 40f,
expandedBarIconSpacing = 10f,
bubbleCount = 5,
- onLeft = false
+ onLeft = false,
)
val listener = TestBubbleAnimatorListener()
InstrumentationRegistry.getInstrumentation().runOnMainSync {
@@ -61,7 +61,7 @@
iconSize = 40f,
expandedBarIconSpacing = 10f,
bubbleCount = 5,
- onLeft = false
+ onLeft = false,
)
val listener = TestBubbleAnimatorListener()
InstrumentationRegistry.getInstrumentation().runOnMainSync {
@@ -69,7 +69,8 @@
bubbleIndex = 2,
selectedBubbleIndex = 3,
removingLastBubble = false,
- listener
+ removingLastRemainingBubble = false,
+ listener,
)
}
@@ -87,14 +88,14 @@
iconSize = 40f,
expandedBarIconSpacing = 10f,
bubbleCount = 5,
- onLeft = false
+ onLeft = false,
)
val listener = TestBubbleAnimatorListener()
InstrumentationRegistry.getInstrumentation().runOnMainSync {
bubbleAnimator.animateNewAndRemoveOld(
selectedBubbleIndex = 3,
removedBubbleIndex = 2,
- listener
+ listener,
)
}
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimatorTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimatorTest.kt
index 582ea54..06227e2 100644
--- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimatorTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimatorTest.kt
@@ -36,6 +36,7 @@
import com.android.launcher3.R
import com.android.launcher3.taskbar.bubbles.BubbleBarBubble
import com.android.launcher3.taskbar.bubbles.BubbleBarOverflow
+import com.android.launcher3.taskbar.bubbles.BubbleBarParentViewHeightUpdateNotifier
import com.android.launcher3.taskbar.bubbles.BubbleBarView
import com.android.launcher3.taskbar.bubbles.BubbleView
import com.android.launcher3.taskbar.bubbles.flyout.BubbleBarFlyoutController
@@ -48,12 +49,15 @@
import com.android.wm.shell.shared.animation.PhysicsAnimatorTestUtils
import com.android.wm.shell.shared.bubbles.BubbleInfo
import com.google.common.truth.Truth.assertThat
+import java.util.concurrent.Semaphore
+import java.util.concurrent.TimeUnit
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.kotlin.any
import org.mockito.kotlin.atLeastOnce
+import org.mockito.kotlin.eq
import org.mockito.kotlin.mock
import org.mockito.kotlin.verify
import org.mockito.kotlin.whenever
@@ -66,6 +70,7 @@
private val context = ApplicationProvider.getApplicationContext<Context>()
private lateinit var animatorScheduler: TestBubbleBarViewAnimatorScheduler
+ private lateinit var bubbleBarParentViewController: TestBubbleBarParentViewHeightUpdateNotifier
private lateinit var overflowView: BubbleView
private lateinit var bubbleView: BubbleView
private lateinit var bubble: BubbleBarBubble
@@ -81,6 +86,7 @@
@Before
fun setUp() {
animatorScheduler = TestBubbleBarViewAnimatorScheduler()
+ bubbleBarParentViewController = TestBubbleBarParentViewHeightUpdateNotifier()
PhysicsAnimatorTestUtils.prepareForTest()
setupFlyoutController()
}
@@ -99,6 +105,7 @@
bubbleBarView,
bubbleStashController,
flyoutController,
+ bubbleBarParentViewController,
onExpandedNoOp,
animatorScheduler,
)
@@ -119,7 +126,7 @@
assertThat(bubbleBarView.scaleY).isEqualTo(1)
assertThat(bubbleBarView.translationY).isEqualTo(BAR_TRANSLATION_Y_FOR_TASKBAR)
assertThat(animator.isAnimating).isTrue()
-
+ assertThat(bubbleBarParentViewController.timesInvoked).isEqualTo(1)
waitForFlyoutToShow()
// execute the hide bubble animation
@@ -132,6 +139,7 @@
InstrumentationRegistry.getInstrumentation().runOnMainSync {}
PhysicsAnimatorTestUtils.blockUntilAnimationsEnd(DynamicAnimation.TRANSLATION_Y)
+ assertThat(bubbleBarParentViewController.timesInvoked).isEqualTo(2)
assertThat(handle.alpha).isEqualTo(1)
assertThat(handle.translationY).isEqualTo(0)
assertThat(bubbleBarView.alpha).isEqualTo(0)
@@ -153,6 +161,7 @@
bubbleBarView,
bubbleStashController,
flyoutController,
+ bubbleBarParentViewController,
onExpandedNoOp,
animatorScheduler,
)
@@ -175,7 +184,7 @@
assertThat(animator.isAnimating).isTrue()
verify(bubbleStashController, atLeastOnce()).updateTaskbarTouchRegion()
-
+ assertThat(bubbleBarParentViewController.timesInvoked).isEqualTo(1)
waitForFlyoutToShow()
// verify the hide bubble animation is pending
@@ -185,8 +194,11 @@
waitForFlyoutToHide()
+ assertThat(bubbleBarParentViewController.timesInvoked).isEqualTo(2)
assertThat(animatorScheduler.delayedBlock).isNull()
assertThat(bubbleBarView.alpha).isEqualTo(1)
+ assertThat(bubbleBarView.scaleX).isEqualTo(1)
+ assertThat(bubbleBarView.scaleY).isEqualTo(1)
assertThat(bubbleBarView.visibility).isEqualTo(VISIBLE)
assertThat(bubbleBarView.translationY).isEqualTo(BAR_TRANSLATION_Y_FOR_TASKBAR)
assertThat(animator.isAnimating).isFalse()
@@ -206,6 +218,7 @@
bubbleBarView,
bubbleStashController,
flyoutController,
+ bubbleBarParentViewController,
onExpandedNoOp,
animatorScheduler,
)
@@ -230,6 +243,8 @@
// verify that the hide animation was canceled
assertThat(animatorScheduler.delayedBlock).isNull()
assertThat(animator.isAnimating).isFalse()
+ assertThat(bubbleBarView.scaleX).isEqualTo(1)
+ assertThat(bubbleBarView.scaleY).isEqualTo(1)
verify(bubbleStashController).onNewBubbleAnimationInterrupted(any(), any())
// PhysicsAnimatorTestUtils posts the cancellation to the main thread so we need to wait
@@ -252,6 +267,7 @@
bubbleBarView,
bubbleStashController,
flyoutController,
+ bubbleBarParentViewController,
onExpandedNoOp,
animatorScheduler,
)
@@ -263,7 +279,7 @@
// let the animation start and wait for it to complete
InstrumentationRegistry.getInstrumentation().runOnMainSync {}
PhysicsAnimatorTestUtils.blockUntilAnimationsEnd(DynamicAnimation.TRANSLATION_Y)
-
+ assertThat(bubbleBarParentViewController.timesInvoked).isEqualTo(1)
waitForFlyoutToShow()
// execute the hide bubble animation
@@ -279,7 +295,7 @@
InstrumentationRegistry.getInstrumentation().runOnMainSync {
animator.onStashStateChangingWhileAnimating()
}
-
+ assertThat(bubbleBarParentViewController.timesInvoked).isEqualTo(2)
assertThat(animator.isAnimating).isFalse()
verify(bubbleStashController).onNewBubbleAnimationInterrupted(any(), any())
@@ -303,6 +319,7 @@
bubbleBarView,
bubbleStashController,
flyoutController,
+ bubbleBarParentViewController,
onExpandedNoOp,
animatorScheduler,
)
@@ -341,6 +358,7 @@
bubbleBarView,
bubbleStashController,
flyoutController,
+ bubbleBarParentViewController,
onExpanded,
animatorScheduler,
)
@@ -386,6 +404,7 @@
bubbleBarView,
bubbleStashController,
flyoutController,
+ bubbleBarParentViewController,
onExpanded,
animatorScheduler,
)
@@ -437,6 +456,7 @@
bubbleBarView,
bubbleStashController,
flyoutController,
+ bubbleBarParentViewController,
onExpanded,
animatorScheduler,
)
@@ -451,7 +471,7 @@
PhysicsAnimatorTestUtils.blockUntilAnimationsEnd(DynamicAnimation.TRANSLATION_Y)
assertThat(animator.isAnimating).isTrue()
-
+ assertThat(bubbleBarParentViewController.timesInvoked).isEqualTo(1)
waitForFlyoutToShow()
// verify the hide bubble animation is pending
@@ -466,6 +486,7 @@
waitForFlyoutToHide()
+ assertThat(bubbleBarParentViewController.timesInvoked).isEqualTo(2)
assertThat(handle.alpha).isEqualTo(0)
assertThat(handle.translationY)
.isEqualTo(DIFF_BETWEEN_HANDLE_AND_BAR_CENTERS + BAR_TRANSLATION_Y_FOR_TASKBAR)
@@ -492,6 +513,7 @@
bubbleBarView,
bubbleStashController,
flyoutController,
+ bubbleBarParentViewController,
onExpandedNoOp,
animatorScheduler,
)
@@ -507,7 +529,7 @@
assertThat(animator.isAnimating).isTrue()
assertThat(bubbleBarView.alpha).isEqualTo(1)
assertThat(bubbleBarView.translationY).isEqualTo(BAR_TRANSLATION_Y_FOR_TASKBAR)
-
+ assertThat(bubbleBarParentViewController.timesInvoked).isEqualTo(1)
waitForFlyoutToShow()
assertThat(animatorScheduler.delayedBlock).isNotNull()
@@ -519,6 +541,7 @@
PhysicsAnimatorTestUtils.blockUntilAnimationsEnd(DynamicAnimation.TRANSLATION_Y)
InstrumentationRegistry.getInstrumentation().waitForIdleSync()
+ assertThat(bubbleBarParentViewController.timesInvoked).isEqualTo(2)
assertThat(animator.isAnimating).isFalse()
assertThat(bubbleBarView.alpha).isEqualTo(0)
assertThat(handle.translationY).isEqualTo(0)
@@ -547,6 +570,7 @@
bubbleBarView,
bubbleStashController,
flyoutController,
+ bubbleBarParentViewController,
onExpanded,
animatorScheduler,
)
@@ -582,6 +606,7 @@
bubbleBarView,
bubbleStashController,
flyoutController,
+ bubbleBarParentViewController,
onExpandedNoOp,
animatorScheduler,
)
@@ -597,7 +622,7 @@
assertThat(animator.isAnimating).isTrue()
assertThat(bubbleBarView.alpha).isEqualTo(1)
assertThat(bubbleBarView.translationY).isEqualTo(BAR_TRANSLATION_Y_FOR_HOTSEAT)
-
+ assertThat(bubbleBarParentViewController.timesInvoked).isEqualTo(1)
waitForFlyoutToShow()
assertThat(animatorScheduler.delayedBlock).isNotNull()
@@ -605,6 +630,7 @@
waitForFlyoutToHide()
+ assertThat(bubbleBarParentViewController.timesInvoked).isEqualTo(2)
assertThat(animator.isAnimating).isFalse()
assertThat(bubbleBarView.alpha).isEqualTo(1)
assertThat(bubbleBarView.translationY).isEqualTo(BAR_TRANSLATION_Y_FOR_HOTSEAT)
@@ -626,6 +652,7 @@
bubbleBarView,
bubbleStashController,
flyoutController,
+ bubbleBarParentViewController,
onExpanded,
animatorScheduler,
)
@@ -675,6 +702,7 @@
bubbleBarView,
bubbleStashController,
flyoutController,
+ bubbleBarParentViewController,
onExpanded,
animatorScheduler,
)
@@ -686,7 +714,7 @@
// wait for the animation to start
InstrumentationRegistry.getInstrumentation().runOnMainSync {}
PhysicsAnimatorTestUtils.blockUntilAnimationsEnd(DynamicAnimation.TRANSLATION_Y)
-
+ assertThat(bubbleBarParentViewController.timesInvoked).isEqualTo(1)
waitForFlyoutToShow()
assertThat(animator.isAnimating).isTrue()
@@ -701,6 +729,7 @@
// verify that the hide animation was canceled
assertThat(animatorScheduler.delayedBlock).isNull()
+ assertThat(bubbleBarParentViewController.timesInvoked).isEqualTo(2)
verifyBubbleBarIsExpandedWithTranslation(BAR_TRANSLATION_Y_FOR_HOTSEAT)
assertThat(animator.isAnimating).isFalse()
@@ -721,6 +750,7 @@
bubbleBarView,
bubbleStashController,
flyoutController,
+ bubbleBarParentViewController,
onExpandedNoOp,
animatorScheduler,
)
@@ -742,7 +772,7 @@
InstrumentationRegistry.getInstrumentation().runOnMainSync {}
barAnimator.assertIsRunning()
PhysicsAnimatorTestUtils.blockUntilAnimationsEnd(DynamicAnimation.TRANSLATION_Y)
-
+ assertThat(bubbleBarParentViewController.timesInvoked).isEqualTo(1)
waitForFlyoutToShow()
assertThat(animatorScheduler.delayedBlock).isNotNull()
@@ -751,6 +781,7 @@
waitForFlyoutToHide()
assertThat(animator.isAnimating).isFalse()
+ assertThat(bubbleBarParentViewController.timesInvoked).isEqualTo(2)
// the bubble bar translation y should be back to its initial value
assertThat(bubbleBarView.translationY).isEqualTo(BAR_TRANSLATION_Y_FOR_HOTSEAT)
@@ -764,15 +795,18 @@
whenever(bubbleStashController.bubbleBarTranslationY)
.thenReturn(BAR_TRANSLATION_Y_FOR_HOTSEAT)
- val barAnimator = PhysicsAnimator.getInstance(bubbleBarView)
-
+ val semaphore = Semaphore(0)
var notifiedExpanded = false
- val onExpanded = Runnable { notifiedExpanded = true }
+ val onExpanded = Runnable {
+ notifiedExpanded = true
+ semaphore.release()
+ }
val animator =
BubbleBarViewAnimator(
bubbleBarView,
bubbleStashController,
flyoutController,
+ bubbleBarParentViewController,
onExpanded,
animatorScheduler,
)
@@ -792,7 +826,12 @@
// the lift animation is complete; the spring back animation should start now
InstrumentationRegistry.getInstrumentation().runOnMainSync {}
- barAnimator.assertIsRunning()
+
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync()
+
+ assertThat(semaphore.tryAcquire(5, TimeUnit.SECONDS)).isTrue()
+ // we should be expanded now
+ assertThat(bubbleBarView.isExpanded).isTrue()
PhysicsAnimatorTestUtils.blockUntilAnimationsEnd(DynamicAnimation.TRANSLATION_Y)
// verify there is no hide animation
@@ -800,7 +839,6 @@
assertThat(animator.isAnimating).isFalse()
assertThat(bubbleBarView.translationY).isEqualTo(BAR_TRANSLATION_Y_FOR_HOTSEAT)
- assertThat(bubbleBarView.isExpanded).isTrue()
verify(bubbleStashController).showBubbleBarImmediate()
assertThat(notifiedExpanded).isTrue()
}
@@ -812,15 +850,18 @@
whenever(bubbleStashController.bubbleBarTranslationY)
.thenReturn(BAR_TRANSLATION_Y_FOR_HOTSEAT)
- val barAnimator = PhysicsAnimator.getInstance(bubbleBarView)
-
+ val semaphore = Semaphore(0)
var notifiedExpanded = false
- val onExpanded = Runnable { notifiedExpanded = true }
+ val onExpanded = Runnable {
+ notifiedExpanded = true
+ semaphore.release()
+ }
val animator =
BubbleBarViewAnimator(
bubbleBarView,
bubbleStashController,
flyoutController,
+ bubbleBarParentViewController,
onExpanded,
animatorScheduler,
)
@@ -838,6 +879,10 @@
animatorTestRule.advanceTimeBy(100)
}
+ // verify there is a pending hide animation
+ assertThat(animatorScheduler.delayedBlock).isNotNull()
+ assertThat(animator.isAnimating).isTrue()
+
// send the expand signal in the middle of the lift animation
InstrumentationRegistry.getInstrumentation().runOnMainSync {
animator.expandedWhileAnimating()
@@ -848,14 +893,11 @@
animatorTestRule.advanceTimeBy(150)
}
- // verify there is a pending hide animation
- assertThat(animatorScheduler.delayedBlock).isNotNull()
- assertThat(animator.isAnimating).isTrue()
-
// the lift animation is complete; the spring back animation should start now. wait for it
// to complete
InstrumentationRegistry.getInstrumentation().runOnMainSync {}
- barAnimator.assertIsRunning()
+
+ assertThat(semaphore.tryAcquire(5, TimeUnit.SECONDS)).isTrue()
PhysicsAnimatorTestUtils.blockUntilAnimationsEnd(DynamicAnimation.TRANSLATION_Y)
// verify that the hide animation was canceled
@@ -884,6 +926,7 @@
bubbleBarView,
bubbleStashController,
flyoutController,
+ bubbleBarParentViewController,
onExpanded,
animatorScheduler,
)
@@ -909,7 +952,7 @@
// verify there is a pending hide animation
assertThat(animatorScheduler.delayedBlock).isNotNull()
assertThat(animator.isAnimating).isTrue()
-
+ assertThat(bubbleBarParentViewController.timesInvoked).isEqualTo(1)
waitForFlyoutToShow()
InstrumentationRegistry.getInstrumentation().runOnMainSync {
@@ -921,6 +964,7 @@
waitForFlyoutToHide()
+ assertThat(bubbleBarParentViewController.timesInvoked).isEqualTo(2)
assertThat(animator.isAnimating).isFalse()
assertThat(bubbleBarView.translationY).isEqualTo(BAR_TRANSLATION_Y_FOR_HOTSEAT)
assertThat(bubbleBarView.isExpanded).isTrue()
@@ -942,6 +986,7 @@
bubbleBarView,
bubbleStashController,
flyoutController,
+ bubbleBarParentViewController,
onExpandedNoOp,
animatorScheduler,
)
@@ -974,7 +1019,7 @@
assertThat(bubbleBarView.scaleY).isEqualTo(1)
assertThat(bubbleBarView.translationY).isEqualTo(BAR_TRANSLATION_Y_FOR_TASKBAR)
assertThat(animator.isAnimating).isTrue()
-
+ assertThat(bubbleBarParentViewController.timesInvoked).isEqualTo(1)
waitForFlyoutToShow()
assertThat(flyoutView!!.findViewById<TextView>(R.id.bubble_flyout_text).text)
.isEqualTo("updated message")
@@ -989,6 +1034,7 @@
InstrumentationRegistry.getInstrumentation().runOnMainSync {}
PhysicsAnimatorTestUtils.blockUntilAnimationsEnd(DynamicAnimation.TRANSLATION_Y)
+ assertThat(bubbleBarParentViewController.timesInvoked).isEqualTo(2)
assertThat(handle.alpha).isEqualTo(1)
assertThat(handle.translationY).isEqualTo(0)
assertThat(bubbleBarView.alpha).isEqualTo(0)
@@ -1010,6 +1056,7 @@
bubbleBarView,
bubbleStashController,
flyoutController,
+ bubbleBarParentViewController,
onExpandedNoOp,
animatorScheduler,
)
@@ -1030,7 +1077,7 @@
assertThat(bubbleBarView.scaleY).isEqualTo(1)
assertThat(bubbleBarView.translationY).isEqualTo(BAR_TRANSLATION_Y_FOR_TASKBAR)
assertThat(animator.isAnimating).isTrue()
-
+ assertThat(bubbleBarParentViewController.timesInvoked).isEqualTo(1)
waitForFlyoutToShow()
assertThat(flyoutView!!.findViewById<TextView>(R.id.bubble_flyout_text).text)
@@ -1063,6 +1110,7 @@
InstrumentationRegistry.getInstrumentation().runOnMainSync {}
PhysicsAnimatorTestUtils.blockUntilAnimationsEnd(DynamicAnimation.TRANSLATION_Y)
+ assertThat(bubbleBarParentViewController.timesInvoked).isEqualTo(2)
assertThat(handle.alpha).isEqualTo(1)
assertThat(handle.translationY).isEqualTo(0)
assertThat(bubbleBarView.alpha).isEqualTo(0)
@@ -1084,6 +1132,7 @@
bubbleBarView,
bubbleStashController,
flyoutController,
+ bubbleBarParentViewController,
onExpandedNoOp,
animatorScheduler,
)
@@ -1104,7 +1153,7 @@
assertThat(bubbleBarView.scaleY).isEqualTo(1)
assertThat(bubbleBarView.translationY).isEqualTo(BAR_TRANSLATION_Y_FOR_TASKBAR)
assertThat(animator.isAnimating).isTrue()
-
+ assertThat(bubbleBarParentViewController.timesInvoked).isEqualTo(1)
waitForFlyoutToShow()
assertThat(flyoutView!!.findViewById<TextView>(R.id.bubble_flyout_text).text)
@@ -1125,6 +1174,7 @@
// the flyout should now reverse and expand
animatorTestRule.advanceTimeBy(400)
}
+ assertThat(bubbleBarParentViewController.timesInvoked).isEqualTo(2)
assertThat(flyoutView!!.findViewById<TextView>(R.id.bubble_flyout_text).text)
.isEqualTo("updated message")
@@ -1147,6 +1197,7 @@
InstrumentationRegistry.getInstrumentation().runOnMainSync {}
PhysicsAnimatorTestUtils.blockUntilAnimationsEnd(DynamicAnimation.TRANSLATION_Y)
+ assertThat(bubbleBarParentViewController.timesInvoked).isEqualTo(3)
assertThat(handle.alpha).isEqualTo(1)
assertThat(handle.translationY).isEqualTo(0)
assertThat(bubbleBarView.alpha).isEqualTo(0)
@@ -1168,6 +1219,7 @@
bubbleBarView,
bubbleStashController,
flyoutController,
+ bubbleBarParentViewController,
onExpandedNoOp,
animatorScheduler,
)
@@ -1188,7 +1240,7 @@
assertThat(bubbleBarView.scaleY).isEqualTo(1)
assertThat(bubbleBarView.translationY).isEqualTo(BAR_TRANSLATION_Y_FOR_TASKBAR)
assertThat(animator.isAnimating).isTrue()
-
+ assertThat(bubbleBarParentViewController.timesInvoked).isEqualTo(1)
waitForFlyoutToShow()
assertThat(flyoutView!!.findViewById<TextView>(R.id.bubble_flyout_text).text)
@@ -1204,7 +1256,6 @@
PhysicsAnimatorTestUtils.blockUntilFirstAnimationFrameWhereTrue(handleAnimator) {
bubbleBarView.alpha < 0.5
}
-
// we're about to interrupt the animation which will cancel the current animation and start
// a new one. pause the scheduler to delay starting the new animation. this allows us to run
// the test deterministically
@@ -1217,9 +1268,11 @@
animator.animateBubbleInForStashed(updatedBubble, isExpanding = false)
}
+ // since animation was interrupted there shouldn`t be additional calls to adjust window
+ assertThat(bubbleBarParentViewController.timesInvoked).isEqualTo(1)
+
InstrumentationRegistry.getInstrumentation().runOnMainSync {}
PhysicsAnimatorTestUtils.blockUntilAnimationsEnd(DynamicAnimation.TRANSLATION_Y)
-
// verify there's a new job scheduled and start it. this is starting the animation from the
// handle back to the bar
assertThat(animatorScheduler.pausedBlock).isNotNull()
@@ -1228,9 +1281,9 @@
InstrumentationRegistry.getInstrumentation().runOnMainSync {}
PhysicsAnimatorTestUtils.blockUntilAnimationsEnd(DynamicAnimation.TRANSLATION_Y)
-
waitForFlyoutToShow()
+ assertThat(bubbleBarParentViewController.timesInvoked).isEqualTo(2)
assertThat(flyoutView!!.findViewById<TextView>(R.id.bubble_flyout_text).text)
.isEqualTo("updated message")
assertThat(handle.alpha).isEqualTo(0)
@@ -1246,7 +1299,6 @@
InstrumentationRegistry.getInstrumentation().runOnMainSync(animatorScheduler.delayedBlock!!)
waitForFlyoutToHide()
-
PhysicsAnimatorTestUtils.blockUntilAnimationsEnd(DynamicAnimation.TRANSLATION_Y)
// verify the hide animation was rescheduled and run it
@@ -1259,6 +1311,7 @@
InstrumentationRegistry.getInstrumentation().runOnMainSync {}
PhysicsAnimatorTestUtils.blockUntilAnimationsEnd(DynamicAnimation.TRANSLATION_Y)
+ assertThat(bubbleBarParentViewController.timesInvoked).isEqualTo(3)
assertThat(handle.alpha).isEqualTo(1)
assertThat(handle.translationY).isEqualTo(0)
assertThat(bubbleBarView.alpha).isEqualTo(0)
@@ -1266,6 +1319,51 @@
verify(bubbleStashController).stashBubbleBarImmediate()
}
+ @Test
+ fun interruptForIme() {
+ setUpBubbleBar()
+ setUpBubbleStashController()
+
+ val handle = View(context)
+ val handleAnimator = PhysicsAnimator.getInstance(handle)
+ whenever(bubbleStashController.getStashedHandlePhysicsAnimator()).thenReturn(handleAnimator)
+
+ val animator =
+ BubbleBarViewAnimator(
+ bubbleBarView,
+ bubbleStashController,
+ flyoutController,
+ bubbleBarParentViewController,
+ onExpandedNoOp,
+ animatorScheduler,
+ )
+
+ InstrumentationRegistry.getInstrumentation().runOnMainSync {
+ animator.animateBubbleInForStashed(bubble, isExpanding = false)
+ }
+
+ // wait for the animation to start
+ InstrumentationRegistry.getInstrumentation().runOnMainSync {}
+ PhysicsAnimatorTestUtils.blockUntilFirstAnimationFrameWhereTrue(handleAnimator) { true }
+
+ handleAnimator.assertIsRunning()
+ assertThat(animator.isAnimating).isTrue()
+ // verify the hide bubble animation is pending
+ assertThat(animatorScheduler.delayedBlock).isNotNull()
+
+ InstrumentationRegistry.getInstrumentation().runOnMainSync { animator.interruptForIme() }
+
+ // verify that the hide animation was canceled
+ assertThat(animatorScheduler.delayedBlock).isNull()
+ assertThat(animator.isAnimating).isFalse()
+ verify(bubbleStashController).onNewBubbleAnimationInterrupted(eq(true), any())
+
+ // PhysicsAnimatorTestUtils posts the cancellation to the main thread so we need to wait
+ // again
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync()
+ handleAnimator.assertIsNotRunning()
+ }
+
private fun setUpBubbleBar() {
bubbleBarView = BubbleBarView(context)
InstrumentationRegistry.getInstrumentation().runOnMainSync {
@@ -1336,10 +1434,6 @@
}
val flyoutCallbacks =
object : FlyoutCallbacks {
- override fun extendTopBoundary(space: Int) {}
-
- override fun resetTopBoundary() {}
-
override fun flyoutClicked() {}
}
val flyoutScheduler = FlyoutScheduler { block -> block.invoke() }
@@ -1422,6 +1516,16 @@
delayedBlock = null
}
}
+
+ private class TestBubbleBarParentViewHeightUpdateNotifier :
+ BubbleBarParentViewHeightUpdateNotifier {
+
+ var timesInvoked: Int = 0
+
+ override fun updateTopBoundary() {
+ timesInvoked++
+ }
+ }
}
private const val DIFF_BETWEEN_HANDLE_AND_BAR_CENTERS = -20f
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/flyout/BubbleBarFlyoutControllerTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/flyout/BubbleBarFlyoutControllerTest.kt
index 103c769..91fe6a6 100644
--- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/flyout/BubbleBarFlyoutControllerTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/flyout/BubbleBarFlyoutControllerTest.kt
@@ -128,46 +128,6 @@
}
@Test
- fun showFlyout_extendsTopBoundary() {
- // set negative translation for the flyout so that it will request to extend the top
- // boundary
- flyoutTy = -50f
- InstrumentationRegistry.getInstrumentation().runOnMainSync {
- setupAndShowFlyout()
- assertThat(flyoutContainer.childCount).isEqualTo(1)
- }
- InstrumentationRegistry.getInstrumentation().waitForIdleSync()
- InstrumentationRegistry.getInstrumentation().runOnMainSync {
- animatorTestRule.advanceTimeBy(showAnimationDuration)
- }
- assertThat(flyoutCallbacks.topBoundaryExtendedSpace).isEqualTo(50)
- }
-
- @Test
- fun showFlyout_withinBoundary() {
- InstrumentationRegistry.getInstrumentation().runOnMainSync {
- setupAndShowFlyout()
- assertThat(flyoutContainer.childCount).isEqualTo(1)
- }
- InstrumentationRegistry.getInstrumentation().waitForIdleSync()
- InstrumentationRegistry.getInstrumentation().runOnMainSync {
- animatorTestRule.advanceTimeBy(showAnimationDuration)
- }
- assertThat(flyoutCallbacks.topBoundaryExtendedSpace).isEqualTo(0)
- }
-
- @Test
- fun collapseFlyout_resetsTopBoundary() {
- InstrumentationRegistry.getInstrumentation().runOnMainSync {
- setupAndShowFlyout()
- assertThat(flyoutContainer.childCount).isEqualTo(1)
- flyoutController.collapseFlyout {}
- animatorTestRule.advanceTimeBy(hideAnimationDuration)
- }
- assertThat(flyoutCallbacks.topBoundaryReset).isTrue()
- }
-
- @Test
fun cancelFlyout_fadesOutFlyout() {
InstrumentationRegistry.getInstrumentation().runOnMainSync {
setupAndShowFlyout()
@@ -178,7 +138,6 @@
animatorTestRule.advanceTimeBy(hideAnimationDuration)
assertThat(flyoutView.alpha).isEqualTo(0f)
}
- assertThat(flyoutCallbacks.topBoundaryReset).isTrue()
}
@Test
@@ -217,7 +176,6 @@
assertThat(flyout.findViewById<TextView>(R.id.bubble_flyout_text).text)
.isEqualTo("new message")
}
- assertThat(flyoutCallbacks.topBoundaryExtendedSpace).isEqualTo(50)
}
@Test
@@ -246,7 +204,6 @@
animatorTestRule.advanceTimeBy(showAnimationDuration)
assertThat(flyout.alpha).isEqualTo(1)
}
- assertThat(flyoutCallbacks.topBoundaryExtendedSpace).isEqualTo(50)
}
@Test
@@ -290,18 +247,8 @@
class FakeFlyoutCallbacks : FlyoutCallbacks {
- var topBoundaryExtendedSpace = 0
- var topBoundaryReset = false
var flyoutClicked = false
- override fun extendTopBoundary(space: Int) {
- topBoundaryExtendedSpace = space
- }
-
- override fun resetTopBoundary() {
- topBoundaryReset = true
- }
-
override fun flyoutClicked() {
flyoutClicked = true
}
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/stashing/PersistentBubbleStashControllerTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/stashing/PersistentBubbleStashControllerTest.kt
index f795ab1..88b39d3 100644
--- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/stashing/PersistentBubbleStashControllerTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/stashing/PersistentBubbleStashControllerTest.kt
@@ -37,6 +37,7 @@
import org.mockito.Mock
import org.mockito.junit.MockitoJUnit
import org.mockito.junit.MockitoRule
+import org.mockito.kotlin.any
import org.mockito.kotlin.clearInvocations
import org.mockito.kotlin.never
import org.mockito.kotlin.verify
@@ -76,7 +77,7 @@
PersistentBubbleStashController(DefaultDimensionsProvider())
setUpBubbleBarView()
setUpBubbleBarController()
- persistentTaskBarStashController.setHotseatVerticalCenter(HOTSEAT_VERTICAL_CENTER)
+ persistentTaskBarStashController.bubbleBarVerticalCenterForHome = HOTSEAT_VERTICAL_CENTER
persistentTaskBarStashController.init(
taskbarInsetsController,
bubbleBarViewController,
@@ -342,6 +343,45 @@
verify(taskbarInsetsController, never()).onTaskbarOrBubblebarWindowHeightOrInsetsChanged()
}
+ @Test
+ fun showBubbleBar_expand_bubbleBarGesture() {
+ whenever(bubbleBarViewController.isHiddenForNoBubbles).thenReturn(false)
+ whenever(bubbleBarViewController.isExpanded).thenReturn(false)
+
+ persistentTaskBarStashController.showBubbleBar(
+ expandBubbles = true,
+ bubbleBarGesture = true,
+ )
+
+ verify(bubbleBarViewController).setExpanded(true, true)
+ }
+
+ @Test
+ fun showBubbleBar_expand_notBubbleBarGesture() {
+ whenever(bubbleBarViewController.isHiddenForNoBubbles).thenReturn(false)
+ whenever(bubbleBarViewController.isExpanded).thenReturn(false)
+
+ persistentTaskBarStashController.showBubbleBar(
+ expandBubbles = true,
+ bubbleBarGesture = false,
+ )
+
+ verify(bubbleBarViewController).setExpanded(true, false)
+ }
+
+ @Test
+ fun showBubbleBar_notExpanding_bubbleBarGesture() {
+ whenever(bubbleBarViewController.isHiddenForNoBubbles).thenReturn(false)
+ whenever(bubbleBarViewController.isExpanded).thenReturn(false)
+
+ persistentTaskBarStashController.showBubbleBar(
+ expandBubbles = false,
+ bubbleBarGesture = true,
+ )
+
+ verify(bubbleBarViewController, never()).setExpanded(any(), any())
+ }
+
private fun advanceTimeBy(advanceMs: Long) {
// Advance animator for on-device tests
getInstrumentation().runOnMainSync { animatorTestRule.advanceTimeBy(advanceMs) }
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/stashing/TransientBubbleStashControllerTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/stashing/TransientBubbleStashControllerTest.kt
index 1bbd12a..f642345 100644
--- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/stashing/TransientBubbleStashControllerTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/stashing/TransientBubbleStashControllerTest.kt
@@ -109,7 +109,7 @@
setUpStashedHandleView()
setUpBubbleStashedHandleViewController()
PhysicsAnimatorTestUtils.prepareForTest()
- mTransientBubbleStashController.setHotseatVerticalCenter(HOTSEAT_VERTICAL_CENTER)
+ mTransientBubbleStashController.bubbleBarVerticalCenterForHome = HOTSEAT_VERTICAL_CENTER
mTransientBubbleStashController.init(
taskbarInsetsController,
bubbleBarViewController,
@@ -362,6 +362,57 @@
}
@Test
+ fun updateStashedAndExpandedState_expand_bubbleBarGesture() {
+ mTransientBubbleStashController.isStashed = true
+ whenever(bubbleBarViewController.isHiddenForNoBubbles).thenReturn(false)
+ whenever(bubbleBarViewController.isExpanded).thenReturn(false)
+
+ getInstrumentation().runOnMainSync {
+ mTransientBubbleStashController.updateStashedAndExpandedState(
+ stash = false,
+ expand = true,
+ bubbleBarGesture = true,
+ )
+ }
+
+ verify(bubbleBarViewController).setExpanded(true, true)
+ }
+
+ @Test
+ fun updateStashedAndExpandedState_expand_notBubbleBarGesture() {
+ mTransientBubbleStashController.isStashed = true
+ whenever(bubbleBarViewController.isHiddenForNoBubbles).thenReturn(false)
+ whenever(bubbleBarViewController.isExpanded).thenReturn(false)
+
+ getInstrumentation().runOnMainSync {
+ mTransientBubbleStashController.updateStashedAndExpandedState(
+ stash = false,
+ expand = true,
+ bubbleBarGesture = false,
+ )
+ }
+
+ verify(bubbleBarViewController).setExpanded(true, false)
+ }
+
+ @Test
+ fun updateStashedAndExpandedState_notExpanding_bubbleBarGesture() {
+ mTransientBubbleStashController.isStashed = true
+ whenever(bubbleBarViewController.isHiddenForNoBubbles).thenReturn(false)
+ whenever(bubbleBarViewController.isExpanded).thenReturn(false)
+
+ getInstrumentation().runOnMainSync {
+ mTransientBubbleStashController.updateStashedAndExpandedState(
+ stash = false,
+ expand = false,
+ bubbleBarGesture = true,
+ )
+ }
+
+ verify(bubbleBarViewController, never()).setExpanded(any(), any())
+ }
+
+ @Test
fun isSysuiLockedSwitchedToFalseForOverview_unlockAnimationIsShown() {
// Given screen is locked and bubble bar has bubbles
getInstrumentation().runOnMainSync {
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/MockedRecentsModelTestRule.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/MockedRecentsModelTestRule.kt
new file mode 100644
index 0000000..ed1443d
--- /dev/null
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/MockedRecentsModelTestRule.kt
@@ -0,0 +1,97 @@
+/*
+ * 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.launcher3.taskbar.rules
+
+import com.android.quickstep.RecentsModel
+import com.android.quickstep.RecentsModel.RecentTasksChangedListener
+import com.android.quickstep.TaskIconCache
+import com.android.quickstep.util.GroupTask
+import java.util.function.Consumer
+import org.junit.rules.TestRule
+import org.junit.runner.Description
+import org.junit.runners.model.Statement
+import org.mockito.kotlin.any
+import org.mockito.kotlin.anyOrNull
+import org.mockito.kotlin.doAnswer
+import org.mockito.kotlin.doReturn
+import org.mockito.kotlin.mock
+
+class MockedRecentsModelTestRule(private val context: TaskbarWindowSandboxContext) : TestRule {
+
+ private val mockIconCache: TaskIconCache = mock()
+
+ private val mockRecentsModel: RecentsModel = mock {
+ on { iconCache } doReturn mockIconCache
+
+ on { unregisterRecentTasksChangedListener() } doAnswer { recentTasksChangedListener = null }
+
+ on { registerRecentTasksChangedListener(any<RecentTasksChangedListener>()) } doAnswer
+ {
+ recentTasksChangedListener = it.getArgument<RecentTasksChangedListener>(0)
+ }
+
+ on { getTasks(anyOrNull(), anyOrNull()) } doAnswer
+ {
+ val request = it.getArgument<Consumer<List<GroupTask>>?>(0)
+ if (request != null) {
+ taskRequests.add { response -> request.accept(response) }
+ }
+ taskListId
+ }
+
+ on { getTasks(anyOrNull()) } doAnswer
+ {
+ val request = it.getArgument<Consumer<List<GroupTask>>?>(0)
+ if (request != null) {
+ taskRequests.add { response -> request.accept(response) }
+ }
+ taskListId
+ }
+
+ on { isTaskListValid(any()) } doAnswer { taskListId == it.getArgument(0) }
+ }
+
+ private var recentTasks: List<GroupTask> = emptyList()
+ private var taskListId = 0
+ private var recentTasksChangedListener: RecentTasksChangedListener? = null
+ private var taskRequests: MutableList<(List<GroupTask>) -> Unit> = mutableListOf()
+
+ override fun apply(base: Statement?, description: Description?): Statement {
+ return object : Statement() {
+ override fun evaluate() {
+ context.putObject(RecentsModel.INSTANCE, mockRecentsModel)
+ base?.evaluate()
+ }
+ }
+ }
+
+ // NOTE: For the update to take effect, `resolvePendingTaskRequests()` needs to be called, so
+ // calbacks to any pending `RecentsModel.getTasks()` get called with the updated task list.
+ fun updateRecentTasks(tasks: List<GroupTask>) {
+ ++taskListId
+ recentTasks = tasks
+ recentTasksChangedListener?.onRecentTasksChanged()
+ }
+
+ fun resolvePendingTaskRequests() {
+ val requests = mutableListOf<(List<GroupTask>) -> Unit>()
+ requests.addAll(taskRequests)
+ taskRequests.clear()
+
+ requests.forEach { it(recentTasks) }
+ }
+}
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarUnitTestRule.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarUnitTestRule.kt
index 096f879..cd4e78b 100644
--- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarUnitTestRule.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarUnitTestRule.kt
@@ -37,6 +37,7 @@
import com.android.quickstep.AllAppsActionManager
import java.lang.reflect.Field
import java.lang.reflect.ParameterizedType
+import java.util.Locale
import java.util.Optional
import org.junit.Assume.assumeTrue
import org.junit.rules.TestRule
@@ -119,6 +120,15 @@
}
}
+ if (description.getAnnotation(ForceRtl::class.java) != null) {
+ // Needs to be set on window context instead of sandbox context, because it does
+ // does not propagate between them. However, this change will impact created
+ // TaskbarActivityContext instances, since they wrap the window context.
+ taskbarManager.windowContext.resources.configuration.setLayoutDirection(
+ RTL_LOCALE
+ )
+ }
+
try {
TaskbarViewController.enableModelLoadingForTests(false)
@@ -191,4 +201,11 @@
@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION)
annotation class NavBarKidsMode
+
+ /** Forces RTL UI for tests. */
+ @Retention(AnnotationRetention.RUNTIME)
+ @Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION)
+ annotation class ForceRtl
}
+
+private val RTL_LOCALE = Locale.of("ar", "XB")
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarUnitTestRuleTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarUnitTestRuleTest.kt
index 7daa142..b8b0b5d 100644
--- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarUnitTestRuleTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarUnitTestRuleTest.kt
@@ -19,11 +19,13 @@
import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import android.platform.test.flag.junit.SetFlagsRule
+import com.android.launcher3.Utilities
import com.android.launcher3.taskbar.TaskbarActivityContext
import com.android.launcher3.taskbar.TaskbarKeyguardController
import com.android.launcher3.taskbar.TaskbarManager
import com.android.launcher3.taskbar.TaskbarStashController
import com.android.launcher3.taskbar.bubbles.BubbleBarController
+import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule.ForceRtl
import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule.InjectController
import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule.NavBarKidsMode
import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule.UserSetupMode
@@ -197,6 +199,14 @@
}
}
+ @Test
+ fun testForceRtlAnnotation_setsActivityContextLayoutDirection() {
+ @ForceRtl class Rtl
+ onSetup(description = Description.createSuiteDescription(Rtl::class.java)) {
+ assertThat(Utilities.isRtl(activityContext.resources)).isTrue()
+ }
+ }
+
/**
* Executes [runTest] after the [testRule] setup phase completes.
*
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/AbsSwipeUpHandlerTestCase.java b/quickstep/tests/multivalentTests/src/com/android/quickstep/AbsSwipeUpHandlerTestCase.java
index 6b95f8d..970bdec 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/AbsSwipeUpHandlerTestCase.java
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/AbsSwipeUpHandlerTestCase.java
@@ -17,6 +17,7 @@
package com.android.quickstep;
import static com.android.quickstep.AbsSwipeUpHandler.STATE_HANDLER_INVALIDATED;
+import static com.android.wm.shell.shared.ShellSharedConstants.KEY_EXTRA_SHELL_CAN_HAND_OFF_ANIMATION;
import static junit.framework.TestCase.assertFalse;
import static junit.framework.TestCase.assertTrue;
@@ -28,6 +29,7 @@
import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -40,6 +42,9 @@
import android.graphics.Rect;
import android.os.Bundle;
import android.os.SystemClock;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
import android.view.RemoteAnimationTarget;
import android.view.SurfaceControl;
import android.view.ViewTreeObserver;
@@ -58,6 +63,7 @@
import com.android.quickstep.util.ContextInitListener;
import com.android.quickstep.views.RecentsView;
import com.android.quickstep.views.RecentsViewContainer;
+import com.android.systemui.shared.Flags;
import com.android.systemui.shared.system.InputConsumerController;
import org.junit.Before;
@@ -103,14 +109,8 @@
/* startBounds= */ null,
/* taskInfo= */ mRunningTaskInfo,
/* allowEnterPip= */ false);
- protected final RecentsAnimationTargets mRecentsAnimationTargets = new RecentsAnimationTargets(
- new RemoteAnimationTarget[] {mRemoteAnimationTarget},
- new RemoteAnimationTarget[] {mRemoteAnimationTarget},
- new RemoteAnimationTarget[] {mRemoteAnimationTarget},
- /* homeContentInsets= */ new Rect(),
- /* minimizedHomeBounds= */ null,
- new Bundle());
+ protected RecentsAnimationTargets mRecentsAnimationTargets;
protected TaskAnimationManager mTaskAnimationManager;
protected RecentsAnimationDeviceState mRecentsAnimationDeviceState;
@@ -127,6 +127,22 @@
@Rule
public final MockitoRule mMockitoRule = MockitoJUnit.rule();
+ @Rule
+ public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+
+ @Before
+ public void setUpAnimationTargets() {
+ Bundle extras = new Bundle();
+ extras.putBoolean(KEY_EXTRA_SHELL_CAN_HAND_OFF_ANIMATION, true);
+ mRecentsAnimationTargets = new RecentsAnimationTargets(
+ new RemoteAnimationTarget[] {mRemoteAnimationTarget},
+ new RemoteAnimationTarget[] {mRemoteAnimationTarget},
+ new RemoteAnimationTarget[] {mRemoteAnimationTarget},
+ /* homeContentInsets= */ new Rect(),
+ /* minimizedHomeBounds= */ null,
+ extras);
+ }
+
@Before
public void setUpRunningTaskInfo() {
mRunningTaskInfo.baseIntent = new Intent(Intent.ACTION_MAIN)
@@ -237,6 +253,30 @@
});
}
+ @EnableFlags({Flags.FLAG_RETURN_ANIMATION_FRAMEWORK_LIBRARY,
+ Flags.FLAG_RETURN_ANIMATION_FRAMEWORK_LONG_LIVED})
+ @Test
+ public void testHomeGesture_handsOffAnimation() {
+ createSwipeUpHandlerForGesture(GestureState.GestureEndTarget.HOME);
+
+ runOnMainSync(() -> {
+ verify(mRecentsAnimationController).handOffAnimation(any(), any());
+ verifyRecentsAnimationFinishedAndCallCallback();
+ });
+ }
+
+ @DisableFlags({Flags.FLAG_RETURN_ANIMATION_FRAMEWORK_LIBRARY,
+ Flags.FLAG_RETURN_ANIMATION_FRAMEWORK_LONG_LIVED})
+ @Test
+ public void testHomeGesture_doesNotHandOffAnimation_withFlagsDisabled() {
+ createSwipeUpHandlerForGesture(GestureState.GestureEndTarget.HOME);
+
+ runOnMainSync(() -> {
+ verify(mRecentsAnimationController, never()).handOffAnimation(any(), any());
+ verifyRecentsAnimationFinishedAndCallCallback();
+ });
+ }
+
@Test
public void testHomeGesture_invalidatesHandlerAfterParallelAnim() {
ValueAnimator parallelAnim = new ValueAnimator();
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/DesktopFullscreenDrawParamsTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/DesktopFullscreenDrawParamsTest.kt
new file mode 100644
index 0000000..e62455f
--- /dev/null
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/DesktopFullscreenDrawParamsTest.kt
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.quickstep
+
+import android.content.Context
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.kotlin.mock
+
+/** Test for [DesktopFullscreenDrawParams] class. */
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class DesktopFullscreenDrawParamsTest() {
+ private val params =
+ DesktopFullscreenDrawParams(mock<Context>(), cornerRadiusProvider = { CORNER_RADIUS })
+
+ @Test
+ fun setMiddleProgress_invariantCornerRadiusForDesktop() {
+ params.setProgress(fullscreenProgress = 0f, parentScale = 1f, taskViewScale = 1f)
+ assertThat(params.currentCornerRadius).isEqualTo(CORNER_RADIUS)
+
+ params.setProgress(fullscreenProgress = 0.67f, parentScale = 1f, taskViewScale = 1f)
+ assertThat(params.currentCornerRadius).isEqualTo(CORNER_RADIUS)
+
+ params.setProgress(fullscreenProgress = 1f, parentScale = 1f, taskViewScale = 1f)
+ assertThat(params.currentCornerRadius).isEqualTo(CORNER_RADIUS)
+ }
+
+ companion object {
+ const val CORNER_RADIUS = 32f
+ }
+}
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/FullscreenDrawParamsTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/FullscreenDrawParamsTest.kt
index 5d62a4c..99b81e0 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/FullscreenDrawParamsTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/FullscreenDrawParamsTest.kt
@@ -20,21 +20,17 @@
import androidx.test.filters.SmallTest
import com.android.launcher3.FakeInvariantDeviceProfileTest
import com.android.quickstep.util.TaskCornerRadius
-import com.android.quickstep.views.TaskView.FullscreenDrawParams
import com.android.systemui.shared.system.QuickStepContract
import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
-import org.mockito.Mockito.doReturn
-import org.mockito.Mockito.mock
-import org.mockito.Mockito.spy
+import org.mockito.kotlin.mock
-/** Test for FullscreenDrawParams class. */
+/** Test for [FullscreenDrawParams] class. */
@SmallTest
@RunWith(AndroidJUnit4::class)
class FullscreenDrawParamsTest : FakeInvariantDeviceProfileTest() {
-
private lateinit var params: FullscreenDrawParams
@Before
@@ -46,115 +42,108 @@
fun setStartProgress_correctCornerRadiusForTablet() {
initializeVarsForTablet()
- params.setProgress(
- /* fullscreenProgress= */ 0f,
- /* parentScale= */ 1.0f,
- /* taskViewScale= */ 1.0f
- )
+ params.setProgress(fullscreenProgress = 0f, parentScale = 1.0f, taskViewScale = 1.0f)
val expectedRadius = TaskCornerRadius.get(context)
- assertThat(params.currentDrawnCornerRadius).isEqualTo(expectedRadius)
+ assertThat(params.currentCornerRadius).isEqualTo(expectedRadius)
}
@Test
fun setFullProgress_correctCornerRadiusForTablet() {
initializeVarsForTablet()
- params.setProgress(
- /* fullscreenProgress= */ 1.0f,
- /* parentScale= */ 1.0f,
- /* taskViewScale= */ 1.0f
- )
+ params.setProgress(fullscreenProgress = 1.0f, parentScale = 1f, taskViewScale = 1f)
val expectedRadius = QuickStepContract.getWindowCornerRadius(context)
- assertThat(params.currentDrawnCornerRadius).isEqualTo(expectedRadius)
+ assertThat(params.currentCornerRadius).isEqualTo(expectedRadius)
}
@Test
fun setStartProgress_correctCornerRadiusForPhone() {
initializeVarsForPhone()
- params.setProgress(
- /* fullscreenProgress= */ 0f,
- /* parentScale= */ 1.0f,
- /* taskViewScale= */ 1.0f
- )
+ params.setProgress(fullscreenProgress = 0f, parentScale = 1f, taskViewScale = 1f)
val expectedRadius = TaskCornerRadius.get(context)
- assertThat(params.currentDrawnCornerRadius).isEqualTo(expectedRadius)
+ assertThat(params.currentCornerRadius).isEqualTo(expectedRadius)
}
@Test
fun setFullProgress_correctCornerRadiusForPhone() {
initializeVarsForPhone()
- params.setProgress(
- /* fullscreenProgress= */ 1.0f,
- /* parentScale= */ 1.0f,
- /* taskViewScale= */ 1.0f
- )
+ params.setProgress(fullscreenProgress = 1.0f, parentScale = 1f, taskViewScale = 1f)
val expectedRadius = QuickStepContract.getWindowCornerRadius(context)
- assertThat(params.currentDrawnCornerRadius).isEqualTo(expectedRadius)
+ assertThat(params.currentCornerRadius).isEqualTo(expectedRadius)
}
@Test
fun setStartProgress_correctCornerRadiusForMultiDisplay() {
- val display1Context = context
- val display2Context = mock(Context::class.java)
- val spyParams = spy(params)
+ val display1Context = mock<Context>()
+ val display2Context = mock<Context>()
+ val display1TaskRadius = TASK_CORNER_RADIUS + 1
+ val display2TaskRadius = TASK_CORNER_RADIUS + 2
- val display1TaskRadius = TaskCornerRadius.get(display1Context)
- val display1WindowRadius = QuickStepContract.getWindowCornerRadius(display1Context)
- val display2TaskRadius = display1TaskRadius * 2 + 1 // Arbitrarily different.
- val display2WindowRadius = display1WindowRadius * 2 + 1 // Arbitrarily different.
- doReturn(display2TaskRadius).`when`(spyParams).computeTaskCornerRadius(display2Context)
- doReturn(display2WindowRadius).`when`(spyParams).computeWindowCornerRadius(display2Context)
+ val params =
+ FullscreenDrawParams(
+ context,
+ taskCornerRadiusProvider = { context ->
+ when (context) {
+ display1Context -> display1TaskRadius
+ display2Context -> display2TaskRadius
+ else -> TASK_CORNER_RADIUS
+ }
+ },
+ windowCornerRadiusProvider = { 0f },
+ )
- spyParams.updateCornerRadius(display1Context)
- spyParams.setProgress(
- /* fullscreenProgress= */ 0f,
- /* parentScale= */ 1.0f,
- /* taskViewScale= */ 1.0f
- )
- assertThat(spyParams.currentDrawnCornerRadius).isEqualTo(display1TaskRadius)
+ params.setProgress(fullscreenProgress = 0f, parentScale = 1f, taskViewScale = 1f)
+ assertThat(params.currentCornerRadius).isEqualTo(TASK_CORNER_RADIUS)
- spyParams.updateCornerRadius(display2Context)
- spyParams.setProgress(
- /* fullscreenProgress= */ 0f,
- /* parentScale= */ 1.0f,
- /* taskViewScale= */ 1.0f
- )
- assertThat(spyParams.currentDrawnCornerRadius).isEqualTo(display2TaskRadius)
+ params.updateCornerRadius(display1Context)
+ params.setProgress(fullscreenProgress = 0f, parentScale = 1f, taskViewScale = 1f)
+ assertThat(params.currentCornerRadius).isEqualTo(display1TaskRadius)
+
+ params.updateCornerRadius(display2Context)
+ params.setProgress(fullscreenProgress = 0f, parentScale = 1f, taskViewScale = 1f)
+ assertThat(params.currentCornerRadius).isEqualTo(display2TaskRadius)
}
@Test
fun setFullProgress_correctCornerRadiusForMultiDisplay() {
- val display1Context = context
- val display2Context = mock(Context::class.java)
- val spyParams = spy(params)
+ val display1Context = mock<Context>()
+ val display2Context = mock<Context>()
+ val display1WindowRadius = WINDOW_CORNER_RADIUS + 1
+ val display2WindowRadius = WINDOW_CORNER_RADIUS + 2
- val display1TaskRadius = TaskCornerRadius.get(display1Context)
- val display1WindowRadius = QuickStepContract.getWindowCornerRadius(display1Context)
- val display2TaskRadius = display1TaskRadius * 2 + 1 // Arbitrarily different.
- val display2WindowRadius = display1WindowRadius * 2 + 1 // Arbitrarily different.
- doReturn(display2TaskRadius).`when`(spyParams).computeTaskCornerRadius(display2Context)
- doReturn(display2WindowRadius).`when`(spyParams).computeWindowCornerRadius(display2Context)
+ val params =
+ FullscreenDrawParams(
+ context,
+ taskCornerRadiusProvider = { 0f },
+ windowCornerRadiusProvider = { context ->
+ when (context) {
+ display1Context -> display1WindowRadius
+ display2Context -> display2WindowRadius
+ else -> WINDOW_CORNER_RADIUS
+ }
+ },
+ )
- spyParams.updateCornerRadius(display1Context)
- spyParams.setProgress(
- /* fullscreenProgress= */ 1.0f,
- /* parentScale= */ 1.0f,
- /* taskViewScale= */ 1.0f
- )
- assertThat(spyParams.currentDrawnCornerRadius).isEqualTo(display1WindowRadius)
+ params.setProgress(fullscreenProgress = 1f, parentScale = 1f, taskViewScale = 1f)
+ assertThat(params.currentCornerRadius).isEqualTo(WINDOW_CORNER_RADIUS)
- spyParams.updateCornerRadius(display2Context)
- spyParams.setProgress(
- /* fullscreenProgress= */ 1.0f,
- /* parentScale= */ 1.0f,
- /* taskViewScale= */ 1.0f,
- )
- assertThat(spyParams.currentDrawnCornerRadius).isEqualTo(display2WindowRadius)
+ params.updateCornerRadius(display1Context)
+ params.setProgress(fullscreenProgress = 1f, parentScale = 1f, taskViewScale = 1f)
+ assertThat(params.currentCornerRadius).isEqualTo(display1WindowRadius)
+
+ params.updateCornerRadius(display2Context)
+ params.setProgress(fullscreenProgress = 1f, parentScale = 1f, taskViewScale = 1f)
+ assertThat(params.currentCornerRadius).isEqualTo(display2WindowRadius)
+ }
+
+ companion object {
+ const val TASK_CORNER_RADIUS = 56f
+ const val WINDOW_CORNER_RADIUS = 32f
}
}
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/task/thumbnail/TaskThumbnailViewModelImplTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/task/thumbnail/TaskThumbnailViewModelImplTest.kt
index e3a6adf..a777bd4 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/task/thumbnail/TaskThumbnailViewModelImplTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/task/thumbnail/TaskThumbnailViewModelImplTest.kt
@@ -37,8 +37,6 @@
import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.Uninitialized
import com.android.quickstep.task.viewmodel.TaskContainerData
import com.android.quickstep.task.viewmodel.TaskThumbnailViewModelImpl
-import com.android.quickstep.task.viewmodel.TaskViewData
-import com.android.quickstep.views.TaskViewType
import com.android.systemui.shared.recents.model.Task
import com.android.systemui.shared.recents.model.ThumbnailData
import com.google.common.truth.Truth.assertThat
@@ -57,9 +55,7 @@
private val dispatcher = StandardTestDispatcher()
private val testScope = TestScope(dispatcher)
- private var taskViewType = TaskViewType.SINGLE
private val recentsViewData = RecentsViewData()
- private val taskViewData by lazy { TaskViewData(taskViewType) }
private val taskContainerData = TaskContainerData()
private val dispatcherProvider = TestDispatcherProvider(dispatcher)
private val tasksRepository = FakeTasksRepository()
@@ -69,7 +65,6 @@
private val systemUnderTest by lazy {
TaskThumbnailViewModelImpl(
recentsViewData,
- taskViewData,
taskContainerData,
dispatcherProvider,
tasksRepository,
@@ -124,40 +119,6 @@
}
@Test
- fun setRecentsFullscreenProgress_thenCornerRadiusProgressIsPassedThrough() =
- testScope.runTest {
- recentsViewData.fullscreenProgress.value = 0.5f
-
- assertThat(systemUnderTest.cornerRadiusProgress.first()).isEqualTo(0.5f)
-
- recentsViewData.fullscreenProgress.value = 0.6f
-
- assertThat(systemUnderTest.cornerRadiusProgress.first()).isEqualTo(0.6f)
- }
-
- @Test
- fun setRecentsFullscreenProgress_thenCornerRadiusProgressIsConstantForDesktop() =
- testScope.runTest {
- taskViewType = TaskViewType.DESKTOP
- recentsViewData.fullscreenProgress.value = 0.5f
-
- assertThat(systemUnderTest.cornerRadiusProgress.first()).isEqualTo(1f)
-
- recentsViewData.fullscreenProgress.value = 0.6f
-
- assertThat(systemUnderTest.cornerRadiusProgress.first()).isEqualTo(1f)
- }
-
- @Test
- fun setAncestorScales_thenScaleIsCalculated() =
- testScope.runTest {
- recentsViewData.scale.value = 0.5f
- taskViewData.scale.value = 0.6f
-
- assertThat(systemUnderTest.inheritedScale.first()).isEqualTo(0.3f)
- }
-
- @Test
fun bindRunningTaskThenStoppedTaskWithoutThumbnail_thenStateChangesToBackgroundOnly() =
testScope.runTest {
val runningTaskId = 1
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/util/ContextualSearchInvokerTest.java b/quickstep/tests/multivalentTests/src/com/android/quickstep/util/ContextualSearchInvokerTest.java
index 543ffe6..88774be 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/util/ContextualSearchInvokerTest.java
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/util/ContextualSearchInvokerTest.java
@@ -31,6 +31,8 @@
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
@@ -46,13 +48,17 @@
import androidx.test.filters.SmallTest;
import com.android.launcher3.logging.StatsLogManager;
+import com.android.quickstep.BaseContainerInterface;
import com.android.quickstep.DeviceConfigWrapper;
import com.android.quickstep.SystemUiProxy;
import com.android.quickstep.TopTaskTracker;
+import com.android.quickstep.views.RecentsView;
+import com.android.quickstep.views.RecentsViewContainer;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@@ -73,6 +79,9 @@
private @Mock StatsLogManager.StatsLogger mMockStatsLogger;
private @Mock ContextualSearchHapticManager mMockContextualSearchHapticManager;
private @Mock ContextualSearchManager mMockContextualSearchManager;
+ private @Mock BaseContainerInterface mMockContainerInterface;
+ private @Mock RecentsViewContainer mMockRecentsViewContainer;
+ private @Mock RecentsView mMockRecentsView;
private ContextualSearchInvoker mContextualSearchInvoker;
@Before
@@ -86,10 +95,15 @@
when(mMockStateManager.isContextualSearchIntentAvailable()).thenReturn(true);
when(mMockStateManager.isContextualSearchSettingEnabled()).thenReturn(true);
when(mMockStatsLogManager.logger()).thenReturn(mMockStatsLogger);
+ when(mMockContainerInterface.getCreatedContainer()).thenReturn(mMockRecentsViewContainer);
+ when(mMockRecentsViewContainer.getOverviewPanel()).thenReturn(mMockRecentsView);
- mContextualSearchInvoker = new ContextualSearchInvoker(context, mMockStateManager,
+ mContextualSearchInvoker = spy(new ContextualSearchInvoker(context, mMockStateManager,
mMockTopTaskTracker, mMockSystemUiProxy, mMockStatsLogManager,
- mMockContextualSearchHapticManager, mMockContextualSearchManager);
+ mMockContextualSearchHapticManager, mMockContextualSearchManager
+ ));
+ doReturn(mMockContainerInterface).when(mContextualSearchInvoker)
+ .getRecentsContainerInterface();
}
@Test
@@ -244,6 +258,64 @@
}
}
+ @Test
+ public void invokeContextualSearchUncheckedWithHaptic_liveTile() {
+ when(mMockContainerInterface.isInLiveTileMode()).thenReturn(true);
+ ArgumentCaptor<Runnable> switchToScreenshotCaptor = ArgumentCaptor.forClass(Runnable.class);
+ ArgumentCaptor<Runnable> finishRecentsAnimationCaptor =
+ ArgumentCaptor.forClass(Runnable.class);
+
+ assertTrue("Expected invocation unchecked to succeed",
+ mContextualSearchInvoker.invokeContextualSearchUncheckedWithHaptic(
+ CONTEXTUAL_SEARCH_ENTRY_POINT));
+ verify(mMockRecentsView).switchToScreenshot(switchToScreenshotCaptor.capture());
+ switchToScreenshotCaptor.getValue().run();
+ verify(mMockRecentsView).finishRecentsAnimation(anyBoolean(), anyBoolean(),
+ finishRecentsAnimationCaptor.capture());
+ finishRecentsAnimationCaptor.getValue().run();
+ verify(mMockContextualSearchManager).startContextualSearch(CONTEXTUAL_SEARCH_ENTRY_POINT);
+ verifyNoMoreInteractions(mMockStatsLogManager);
+ }
+
+ @Test
+ public void invokeContextualSearchUncheckedWithHaptic_liveTile_failsToSwitchToScreenshot() {
+ when(mMockContainerInterface.isInLiveTileMode()).thenReturn(true);
+ ArgumentCaptor<Runnable> switchToScreenshotCaptor = ArgumentCaptor.forClass(Runnable.class);
+ ArgumentCaptor<Runnable> finishRecentsAnimationCaptor =
+ ArgumentCaptor.forClass(Runnable.class);
+
+ assertTrue("Expected invocation unchecked to succeed",
+ mContextualSearchInvoker.invokeContextualSearchUncheckedWithHaptic(
+ CONTEXTUAL_SEARCH_ENTRY_POINT));
+ verify(mMockRecentsView).switchToScreenshot(switchToScreenshotCaptor.capture());
+
+ // Don't run switchToScreenshot's callback. Therefore, recents animation should not finish.
+ verify(mMockRecentsView, never()).finishRecentsAnimation(anyBoolean(), anyBoolean(),
+ finishRecentsAnimationCaptor.capture());
+ // And ContextualSearch should not start.
+ verify(mMockContextualSearchManager, never()).startContextualSearch(anyInt());
+ verifyNoMoreInteractions(mMockStatsLogManager);
+ }
+
+ @Test
+ public void invokeContextualSearchUncheckedWithHaptic_liveTile_failsToFinishRecentsAnimation() {
+ when(mMockContainerInterface.isInLiveTileMode()).thenReturn(true);
+ ArgumentCaptor<Runnable> switchToScreenshotCaptor = ArgumentCaptor.forClass(Runnable.class);
+ ArgumentCaptor<Runnable> finishRecentsAnimationCaptor =
+ ArgumentCaptor.forClass(Runnable.class);
+
+ assertTrue("Expected invocation unchecked to succeed",
+ mContextualSearchInvoker.invokeContextualSearchUncheckedWithHaptic(
+ CONTEXTUAL_SEARCH_ENTRY_POINT));
+ verify(mMockRecentsView).switchToScreenshot(switchToScreenshotCaptor.capture());
+ switchToScreenshotCaptor.getValue().run();
+ verify(mMockRecentsView).finishRecentsAnimation(anyBoolean(), anyBoolean(),
+ finishRecentsAnimationCaptor.capture());
+ // Don't run finishRecentsAnimation's callback. Therefore ContextualSearch should not start.
+ verify(mMockContextualSearchManager, never()).startContextualSearch(anyInt());
+ verifyNoMoreInteractions(mMockStatsLogManager);
+ }
+
private AutoCloseable overrideSearchHapticCommitFlag(boolean value) {
return TestExtensions.overrideNavConfigFlag(
"ENABLE_SEARCH_HAPTIC_COMMIT",
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/util/SplitSelectStateControllerTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/util/SplitSelectStateControllerTest.kt
index cb70694..708273e 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/util/SplitSelectStateControllerTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/util/SplitSelectStateControllerTest.kt
@@ -40,6 +40,7 @@
import com.android.quickstep.views.RecentsViewContainer
import com.android.systemui.shared.recents.model.Task
import com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_2_50_50
+import java.util.function.Consumer
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertNull
@@ -54,7 +55,6 @@
import org.mockito.kotlin.times
import org.mockito.kotlin.verify
import org.mockito.kotlin.whenever
-import java.util.function.Consumer
@RunWith(AndroidJUnit4::class)
class SplitSelectStateControllerTest {
@@ -625,6 +625,21 @@
verify(splitFromDesktopController).onDestroy()
}
+ @Test
+ fun splitSelectStateControllerDestroyed_doNotResetDeskTopTasks() {
+ whenever(context.getOverviewPanel<RecentsView<*, *>>()).thenReturn(recentsView)
+ splitSelectStateController.setInitialTaskSelect(
+ Intent(), /*intent*/
+ -1, /*stagePosition*/
+ ItemInfo(),
+ null, /*splitEvent*/
+ -1,
+ )
+ splitSelectStateController.onDestroy()
+ splitSelectStateController.resetState()
+ verify(recentsView, times(0)).resetDesktopTaskFromSplitSelectState()
+ }
+
// Generate GroupTask with default userId.
private fun generateGroupTask(
task1ComponentName: ComponentName,
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/util/TaskViewSimulatorTest.java b/quickstep/tests/multivalentTests/src/com/android/quickstep/util/TaskViewSimulatorTest.java
index 72cfd92..fa81680 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/util/TaskViewSimulatorTest.java
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/util/TaskViewSimulatorTest.java
@@ -202,7 +202,7 @@
mDeviceProfile.updateInsets(mLauncherInsets);
TaskViewSimulator tvs = new TaskViewSimulator(helper.sandboxContext,
- FallbackActivityInterface.INSTANCE);
+ FallbackActivityInterface.INSTANCE, false, 0);
tvs.setDp(mDeviceProfile);
int launcherRotation = info.rotation;
diff --git a/quickstep/tests/src/com/android/launcher3/taskbar/TaskbarRecentAppsControllerTest.kt b/quickstep/tests/src/com/android/launcher3/taskbar/TaskbarRecentAppsControllerTest.kt
index 066ddc0..ed0c928 100644
--- a/quickstep/tests/src/com/android/launcher3/taskbar/TaskbarRecentAppsControllerTest.kt
+++ b/quickstep/tests/src/com/android/launcher3/taskbar/TaskbarRecentAppsControllerTest.kt
@@ -847,12 +847,42 @@
verify(taskbarViewController, times(2)).commitRunningAppsToUI()
}
+ @Test
+ fun onRecentTasksChanged_inDesktopMode_sameHotseatPackage_differentUser_isInShownTasks() {
+ setInDesktopMode(true)
+ val hotseatPackageUser = PackageUser(HOTSEAT_PACKAGE_1, USER_HANDLE_2)
+ val hotseatPackageUsers = listOf(hotseatPackageUser)
+ val runningTask = createTask(id = 1, HOTSEAT_PACKAGE_1, localUserHandle = USER_HANDLE_1)
+ val runningTasks = listOf(runningTask)
+ prepareHotseatAndRunningAndRecentAppsInternal(
+ hotseatPackageUsers = hotseatPackageUsers,
+ runningTasks = runningTasks,
+ recentTaskPackages = emptyList(),
+ )
+ val shownTasks = recentAppsController.shownTasks.map { it.task1 }
+ assertThat(shownTasks).contains(runningTask)
+ assertThat(recentAppsController.runningTaskIds).containsExactlyElementsIn(listOf(1))
+ }
+
private fun prepareHotseatAndRunningAndRecentApps(
hotseatPackages: List<String>,
runningTasks: List<Task>,
recentTaskPackages: List<String>,
): Array<ItemInfo?> {
- val hotseatItems = createHotseatItemsFromPackageNames(hotseatPackages)
+ val hotseatPackageUsers = hotseatPackages.map { PackageUser(it, myUserHandle) }
+ return prepareHotseatAndRunningAndRecentAppsInternal(
+ hotseatPackageUsers,
+ runningTasks,
+ recentTaskPackages,
+ )
+ }
+
+ private fun prepareHotseatAndRunningAndRecentAppsInternal(
+ hotseatPackageUsers: List<PackageUser>,
+ runningTasks: List<Task>,
+ recentTaskPackages: List<String>,
+ ): Array<ItemInfo?> {
+ val hotseatItems = createHotseatItemsFromPackageUsers(hotseatPackageUsers)
recentAppsController.updateHotseatItemInfos(hotseatItems.toTypedArray())
updateRecentTasks(runningTasks, recentTaskPackages)
return recentAppsController.shownHotseatItems.toTypedArray()
@@ -877,12 +907,14 @@
recentTasksChangedListener?.onRecentTasksChanged()
}
- private fun createHotseatItemsFromPackageNames(packageNames: List<String>): List<ItemInfo> {
- return packageNames
+ private fun createHotseatItemsFromPackageUsers(
+ packageUsers: List<PackageUser>
+ ): List<ItemInfo> {
+ return packageUsers
.map {
- createTestAppInfo(packageName = it).apply {
+ createTestAppInfo(packageName = it.packageName, userHandle = it.userHandle).apply {
container =
- if (it.startsWith("predicted")) {
+ if (it.packageName.startsWith("predicted")) {
CONTAINER_HOTSEAT_PREDICTION
} else {
CONTAINER_HOTSEAT
@@ -895,13 +927,8 @@
private fun createTestAppInfo(
packageName: String = "testPackageName",
className: String = "testClassName",
- ) =
- AppInfo(
- ComponentName(packageName, className),
- className /* title */,
- myUserHandle,
- Intent(),
- )
+ userHandle: UserHandle,
+ ) = AppInfo(ComponentName(packageName, className), className /* title */, userHandle, Intent())
private fun createRecentTasksFromPackageNames(packageNames: List<String>): List<GroupTask> {
return packageNames.map { packageName ->
@@ -969,4 +996,6 @@
const val RECENT_PACKAGE_3 = "recent3"
const val RECENT_SPLIT_PACKAGES_1 = "split1_split2"
}
+
+ data class PackageUser(val packageName: String, val userHandle: UserHandle)
}
diff --git a/quickstep/tests/src/com/android/quickstep/DesktopSystemShortcutTest.kt b/quickstep/tests/src/com/android/quickstep/DesktopSystemShortcutTest.kt
index 231c113..94e7c2e 100644
--- a/quickstep/tests/src/com/android/quickstep/DesktopSystemShortcutTest.kt
+++ b/quickstep/tests/src/com/android/quickstep/DesktopSystemShortcutTest.kt
@@ -18,8 +18,6 @@
import android.content.ComponentName
import android.content.Intent
-import android.platform.test.flag.junit.SetFlagsRule
-import com.android.dx.mockito.inline.extended.ExtendedMockito
import com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession
import com.android.dx.mockito.inline.extended.StaticMockitoSession
import com.android.launcher3.AbstractFloatingView
@@ -27,7 +25,7 @@
import com.android.launcher3.Flags.enableRefactorTaskThumbnail
import com.android.launcher3.logging.StatsLogManager
import com.android.launcher3.logging.StatsLogManager.LauncherEvent
-import com.android.launcher3.model.data.WorkspaceItemInfo
+import com.android.launcher3.model.data.TaskViewItemInfo
import com.android.launcher3.uioverrides.QuickstepLauncher
import com.android.launcher3.util.SplitConfigurationOptions
import com.android.launcher3.util.TransformingTouchDelegate
@@ -40,14 +38,13 @@
import com.android.quickstep.views.TaskViewIcon
import com.android.systemui.shared.recents.model.Task
import com.android.systemui.shared.recents.model.Task.TaskKey
-import com.android.window.flags.Flags
import com.android.wm.shell.shared.desktopmode.DesktopModeStatus
import com.android.wm.shell.shared.desktopmode.DesktopModeTransitionSource
import com.google.common.truth.Truth.assertThat
import org.junit.After
import org.junit.Before
-import org.junit.Rule
import org.junit.Test
+import org.mockito.Mockito.`when`
import org.mockito.kotlin.any
import org.mockito.kotlin.doReturn
import org.mockito.kotlin.eq
@@ -57,24 +54,18 @@
import org.mockito.kotlin.whenever
import org.mockito.quality.Strictness
-/** Test for DesktopSystemShortcut */
+/** Test for [DesktopSystemShortcut] */
class DesktopSystemShortcutTest {
- @get:Rule val setFlagsRule = SetFlagsRule(SetFlagsRule.DefaultInitValueType.DEVICE_DEFAULT)
-
private val launcher: QuickstepLauncher = mock()
private val statsLogManager: StatsLogManager = mock()
private val statsLogger: StatsLogManager.StatsLogger = mock()
private val recentsView: LauncherRecentsView = mock()
private val taskView: TaskView = mock()
- private val workspaceItemInfo: WorkspaceItemInfo = mock()
private val abstractFloatingViewHelper: AbstractFloatingViewHelper = mock()
- private val iconView: TaskViewIcon = mock()
- private val transformingTouchDelegate: TransformingTouchDelegate = mock()
+ private val overlayFactory: TaskOverlayFactory = mock()
private val factory: TaskShortcutFactory =
DesktopSystemShortcut.createFactory(abstractFloatingViewHelper)
- private val overlayFactory: TaskOverlayFactory = mock()
- private val overlay: TaskOverlay<*> = mock()
private lateinit var mockitoSession: StaticMockitoSession
@@ -83,11 +74,10 @@
mockitoSession =
mockitoSession()
.strictness(Strictness.LENIENT)
- .spyStatic(DesktopModeStatus::class.java)
+ .mockStatic(DesktopModeStatus::class.java)
.startMocking()
- ExtendedMockito.doReturn(true).`when` { DesktopModeStatus.enforceDeviceRestrictions() }
- ExtendedMockito.doReturn(true).`when` { DesktopModeStatus.isDesktopModeSupported(any()) }
- whenever(overlayFactory.createOverlay(any())).thenReturn(overlay)
+ whenever(DesktopModeStatus.canEnterDesktopMode(any())).thenReturn(true)
+ whenever(overlayFactory.createOverlay(any())).thenReturn(mock<TaskOverlay<*>>())
}
@After
@@ -97,22 +87,7 @@
@Test
fun createDesktopTaskShortcutFactory_desktopModeDisabled() {
- setFlagsRule.disableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE)
-
- val task =
- Task(TaskKey(1, 0, Intent(), ComponentName("", ""), 0, 2000)).apply {
- isDockable = true
- }
- val taskContainer = createTaskContainer(task)
-
- val shortcuts = factory.getShortcuts(launcher, taskContainer)
- assertThat(shortcuts).isNull()
- }
-
- @Test
- fun createDesktopTaskShortcutFactory_desktopModeEnabled_DeviceNotSupported() {
- setFlagsRule.enableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE)
- ExtendedMockito.doReturn(false).`when` { DesktopModeStatus.isDesktopModeSupported(any()) }
+ `when`(DesktopModeStatus.canEnterDesktopMode(any())).thenReturn(false)
val taskContainer = createTaskContainer(createTask())
@@ -121,22 +96,7 @@
}
@Test
- fun createDesktopTaskShortcutFactory_desktopModeEnabled_DeviceNotSupported_OverrideEnabled() {
- setFlagsRule.enableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE)
- ExtendedMockito.doReturn(false).`when` { DesktopModeStatus.isDesktopModeSupported(any()) }
- ExtendedMockito.doReturn(false).`when` { DesktopModeStatus.enforceDeviceRestrictions() }
-
- val taskContainer = spy(createTaskContainer(createTask()))
- doReturn(workspaceItemInfo).whenever(taskContainer).itemInfo
-
- val shortcuts = factory.getShortcuts(launcher, taskContainer)
- assertThat(shortcuts).isNotNull()
- }
-
- @Test
fun createDesktopTaskShortcutFactory_undockable() {
- setFlagsRule.enableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE)
-
val unDockableTask = createTask().apply { isDockable = false }
val taskContainer = createTaskContainer(unDockableTask)
@@ -146,8 +106,6 @@
@Test
fun desktopSystemShortcutClicked() {
- setFlagsRule.enableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE)
-
val task = createTask()
val taskContainer = spy(createTaskContainer(task))
@@ -159,13 +117,14 @@
val successCallback = it.getArgument<Runnable>(2)
successCallback.run()
}
- doReturn(workspaceItemInfo).whenever(taskContainer).itemInfo
+ val taskViewItemInfo = mock<TaskViewItemInfo>()
+ doReturn(taskViewItemInfo).whenever(taskContainer).itemInfo
val shortcuts = factory.getShortcuts(launcher, taskContainer)
- assertThat(shortcuts).hasSize(1)
- assertThat(shortcuts!!.first()).isInstanceOf(DesktopSystemShortcut::class.java)
+ assertThat(shortcuts).isNotNull()
+ assertThat(shortcuts!!.single()).isInstanceOf(DesktopSystemShortcut::class.java)
- val desktopShortcut = shortcuts.first() as DesktopSystemShortcut
+ val desktopShortcut = shortcuts.single() as DesktopSystemShortcut
desktopShortcut.onClick(taskView)
@@ -178,30 +137,24 @@
eq(DesktopModeTransitionSource.APP_FROM_OVERVIEW),
any(),
)
- verify(statsLogger).withItemInfo(workspaceItemInfo)
+ verify(statsLogger).withItemInfo(taskViewItemInfo)
verify(statsLogger).log(LauncherEvent.LAUNCHER_SYSTEM_SHORTCUT_DESKTOP_TAP)
}
- private fun createTask(): Task {
- return Task(TaskKey(1, 0, Intent(), ComponentName("", ""), 0, 2000)).apply {
- isDockable = true
- }
- }
+ private fun createTask() =
+ Task(TaskKey(1, 0, Intent(), ComponentName("", ""), 0, 2000)).apply { isDockable = true }
- private fun createTaskContainer(task: Task): TaskContainer {
- val snapshotView =
- if (enableRefactorTaskThumbnail()) mock<TaskThumbnailView>()
- else mock<TaskThumbnailViewDeprecated>()
- return TaskContainer(
+ private fun createTaskContainer(task: Task) =
+ TaskContainer(
taskView,
task,
- snapshotView,
- iconView,
- transformingTouchDelegate,
+ if (enableRefactorTaskThumbnail()) mock<TaskThumbnailView>()
+ else mock<TaskThumbnailViewDeprecated>(),
+ mock<TaskViewIcon>(),
+ mock<TransformingTouchDelegate>(),
SplitConfigurationOptions.STAGE_POSITION_UNDEFINED,
digitalWellBeingToast = null,
showWindowsView = null,
overlayFactory,
)
- }
}
diff --git a/quickstep/tests/src/com/android/quickstep/ExternalDisplaySystemShortcutTest.kt b/quickstep/tests/src/com/android/quickstep/ExternalDisplaySystemShortcutTest.kt
index 8968b9c..9c2c13c 100644
--- a/quickstep/tests/src/com/android/quickstep/ExternalDisplaySystemShortcutTest.kt
+++ b/quickstep/tests/src/com/android/quickstep/ExternalDisplaySystemShortcutTest.kt
@@ -18,10 +18,8 @@
import android.content.ComponentName
import android.content.Intent
-import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import android.platform.test.flag.junit.SetFlagsRule
-import com.android.dx.mockito.inline.extended.ExtendedMockito
import com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession
import com.android.dx.mockito.inline.extended.StaticMockitoSession
import com.android.launcher3.AbstractFloatingView
@@ -29,7 +27,7 @@
import com.android.launcher3.Flags.enableRefactorTaskThumbnail
import com.android.launcher3.logging.StatsLogManager
import com.android.launcher3.logging.StatsLogManager.LauncherEvent
-import com.android.launcher3.model.data.WorkspaceItemInfo
+import com.android.launcher3.model.data.TaskViewItemInfo
import com.android.launcher3.uioverrides.QuickstepLauncher
import com.android.launcher3.util.SplitConfigurationOptions
import com.android.launcher3.util.TransformingTouchDelegate
@@ -49,6 +47,7 @@
import org.junit.Before
import org.junit.Rule
import org.junit.Test
+import org.mockito.Mockito.`when`
import org.mockito.kotlin.any
import org.mockito.kotlin.doReturn
import org.mockito.kotlin.eq
@@ -58,7 +57,7 @@
import org.mockito.kotlin.whenever
import org.mockito.quality.Strictness
-/** Test for ExternalDisplaySystemShortcut */
+/** Test for [ExternalDisplaySystemShortcut] */
class ExternalDisplaySystemShortcutTest {
@get:Rule val setFlagsRule = SetFlagsRule(SetFlagsRule.DefaultInitValueType.DEVICE_DEFAULT)
@@ -68,14 +67,10 @@
private val statsLogger: StatsLogManager.StatsLogger = mock()
private val recentsView: LauncherRecentsView = mock()
private val taskView: TaskView = mock()
- private val workspaceItemInfo: WorkspaceItemInfo = mock()
private val abstractFloatingViewHelper: AbstractFloatingViewHelper = mock()
- private val iconView: TaskViewIcon = mock()
- private val transformingTouchDelegate: TransformingTouchDelegate = mock()
+ private val overlayFactory: TaskOverlayFactory = mock()
private val factory: TaskShortcutFactory =
ExternalDisplaySystemShortcut.createFactory(abstractFloatingViewHelper)
- private val overlayFactory: TaskOverlayFactory = mock()
- private val overlay: TaskOverlay<*> = mock()
private lateinit var mockitoSession: StaticMockitoSession
@@ -84,11 +79,10 @@
mockitoSession =
mockitoSession()
.strictness(Strictness.LENIENT)
- .spyStatic(DesktopModeStatus::class.java)
+ .mockStatic(DesktopModeStatus::class.java)
.startMocking()
- ExtendedMockito.doReturn(true).`when` { DesktopModeStatus.enforceDeviceRestrictions() }
- ExtendedMockito.doReturn(true).`when` { DesktopModeStatus.isDesktopModeSupported(any()) }
- whenever(overlayFactory.createOverlay(any())).thenReturn(overlay)
+ whenever(DesktopModeStatus.canEnterDesktopMode(any())).thenReturn(true)
+ whenever(overlayFactory.createOverlay(any())).thenReturn(mock<TaskOverlay<*>>())
}
@After
@@ -97,23 +91,9 @@
}
@Test
- @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE)
@EnableFlags(Flags.FLAG_MOVE_TO_EXTERNAL_DISPLAY_SHORTCUT)
fun createExternalDisplayTaskShortcut_desktopModeDisabled() {
- val task = createTask()
- val taskContainer = createTaskContainer(task)
-
- val shortcuts = factory.getShortcuts(launcher, taskContainer)
- assertThat(shortcuts).isNull()
- }
-
- @Test
- @EnableFlags(
- Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE,
- Flags.FLAG_MOVE_TO_EXTERNAL_DISPLAY_SHORTCUT,
- )
- fun createExternalDisplayTaskShortcut_desktopModeEnabled_deviceNotSupported() {
- ExtendedMockito.doReturn(false).`when` { DesktopModeStatus.isDesktopModeSupported(any()) }
+ `when`(DesktopModeStatus.canEnterDesktopMode(any())).thenReturn(false)
val taskContainer = createTaskContainer(createTask())
@@ -122,26 +102,7 @@
}
@Test
- @EnableFlags(
- Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE,
- Flags.FLAG_MOVE_TO_EXTERNAL_DISPLAY_SHORTCUT,
- )
- fun createExternalDisplayTaskShortcut_desktopModeEnabled_deviceNotSupported_overrideEnabled() {
- ExtendedMockito.doReturn(false).`when` { DesktopModeStatus.isDesktopModeSupported(any()) }
- ExtendedMockito.doReturn(false).`when` { DesktopModeStatus.enforceDeviceRestrictions() }
-
- val taskContainer = spy(createTaskContainer(createTask()))
- doReturn(workspaceItemInfo).whenever(taskContainer).itemInfo
-
- val shortcuts = factory.getShortcuts(launcher, taskContainer)
- assertThat(shortcuts).isNotNull()
- }
-
- @Test
- @EnableFlags(
- Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE,
- Flags.FLAG_MOVE_TO_EXTERNAL_DISPLAY_SHORTCUT,
- )
+ @EnableFlags(Flags.FLAG_MOVE_TO_EXTERNAL_DISPLAY_SHORTCUT)
fun externalDisplaySystemShortcutClicked() {
val task = createTask()
val taskContainer = spy(createTaskContainer(task))
@@ -154,7 +115,8 @@
val successCallback = it.getArgument<Runnable>(1)
successCallback.run()
}
- doReturn(workspaceItemInfo).whenever(taskContainer).itemInfo
+ val taskViewItemInfo = mock<TaskViewItemInfo>()
+ doReturn(taskViewItemInfo).whenever(taskContainer).itemInfo
val shortcuts = factory.getShortcuts(launcher, taskContainer)
assertThat(shortcuts).hasSize(1)
@@ -168,26 +130,23 @@
AbstractFloatingView.TYPE_ALL and AbstractFloatingView.TYPE_REBIND_SAFE.inv()
verify(abstractFloatingViewHelper).closeOpenViews(launcher, true, allTypesExceptRebindSafe)
verify(recentsView).moveTaskToExternalDisplay(eq(taskContainer), any())
- verify(statsLogger).withItemInfo(workspaceItemInfo)
+ verify(statsLogger).withItemInfo(taskViewItemInfo)
verify(statsLogger).log(LauncherEvent.LAUNCHER_SYSTEM_SHORTCUT_EXTERNAL_DISPLAY_TAP)
}
- private fun createTask(): Task = Task(TaskKey(1, 0, Intent(), ComponentName("", ""), 0, 2000))
+ private fun createTask() = Task(TaskKey(1, 0, Intent(), ComponentName("", ""), 0, 2000))
- private fun createTaskContainer(task: Task): TaskContainer {
- val snapshotView =
- if (enableRefactorTaskThumbnail()) mock<TaskThumbnailView>()
- else mock<TaskThumbnailViewDeprecated>()
- return TaskContainer(
+ private fun createTaskContainer(task: Task) =
+ TaskContainer(
taskView,
task,
- snapshotView,
- iconView,
- transformingTouchDelegate,
+ if (enableRefactorTaskThumbnail()) mock<TaskThumbnailView>()
+ else mock<TaskThumbnailViewDeprecated>(),
+ mock<TaskViewIcon>(),
+ mock<TransformingTouchDelegate>(),
SplitConfigurationOptions.STAGE_POSITION_UNDEFINED,
digitalWellBeingToast = null,
showWindowsView = null,
overlayFactory,
)
- }
}
diff --git a/quickstep/tests/src/com/android/quickstep/FallbackRecentsTest.java b/quickstep/tests/src/com/android/quickstep/FallbackRecentsTest.java
index aa105f9..695211b 100644
--- a/quickstep/tests/src/com/android/quickstep/FallbackRecentsTest.java
+++ b/quickstep/tests/src/com/android/quickstep/FallbackRecentsTest.java
@@ -19,6 +19,7 @@
import static androidx.test.InstrumentationRegistry.getInstrumentation;
+import static com.android.launcher3.Flags.enableFallbackOverviewInWindow;
import static com.android.launcher3.tapl.LauncherInstrumentation.WAIT_TIME_MS;
import static com.android.launcher3.tapl.TestHelpers.getHomeIntentInPackage;
import static com.android.launcher3.tapl.TestHelpers.getLauncherInMyProcess;
@@ -63,7 +64,9 @@
import com.android.launcher3.util.rule.TestIsolationRule;
import com.android.launcher3.util.rule.TestStabilityRule;
import com.android.launcher3.util.rule.ViewCaptureRule;
+import com.android.quickstep.fallback.window.RecentsWindowManager;
import com.android.quickstep.views.RecentsView;
+import com.android.quickstep.views.RecentsViewContainer;
import org.junit.After;
import org.junit.Before;
@@ -191,27 +194,29 @@
@Test
public void goToOverviewFromApp() {
startAppFast(resolveSystemApp(Intent.CATEGORY_APP_CALCULATOR));
- waitForRecentsActivityStop();
+ waitForRecentsClosed();
mLauncher.getLaunchedAppState().switchToOverview();
}
- protected void executeOnRecents(Consumer<RecentsActivity> f) {
+ protected void executeOnRecents(Consumer<RecentsViewContainer> f) {
getFromRecents(r -> {
f.accept(r);
return true;
});
}
- protected <T> T getFromRecents(Function<RecentsActivity, T> f) {
+ protected <T> T getFromRecents(Function<RecentsViewContainer, T> f) {
if (!TestHelpers.isInLauncherProcess()) return null;
Object[] result = new Object[1];
Wait.atMost("Failed to get from recents", () -> MAIN_EXECUTOR.submit(() -> {
- RecentsActivity activity = RecentsActivity.ACTIVITY_TRACKER.getCreatedContext();
- if (activity == null) {
+ RecentsViewContainer recentsViewContainer = enableFallbackOverviewInWindow()
+ ? RecentsWindowManager.getRecentsWindowTracker().getCreatedContext()
+ : RecentsActivity.ACTIVITY_TRACKER.getCreatedContext();
+ if (recentsViewContainer == null) {
return false;
}
- result[0] = f.apply(activity);
+ result[0] = f.apply(recentsViewContainer);
return true;
}).get(), mLauncher);
return (T) result[0];
@@ -224,14 +229,19 @@
private void pressHomeAndWaitForOverviewClose() {
mDevice.pressHome();
- waitForRecentsActivityStop();
+ waitForRecentsClosed();
}
- private void waitForRecentsActivityStop() {
+ private void waitForRecentsClosed() {
try {
- final boolean recentsActivityIsNull = MAIN_EXECUTOR.submit(
- () -> RecentsActivity.ACTIVITY_TRACKER.getCreatedContext() == null).get();
- if (recentsActivityIsNull) {
+ final boolean isRecentsContainerNUll = MAIN_EXECUTOR.submit(() -> {
+ RecentsViewContainer recentsViewContainer = enableFallbackOverviewInWindow()
+ ? RecentsWindowManager.getRecentsWindowTracker().getCreatedContext()
+ : RecentsActivity.ACTIVITY_TRACKER.getCreatedContext();
+
+ return recentsViewContainer == null;
+ }).get();
+ if (isRecentsContainerNUll) {
// Null activity counts as a "stopped" one.
return;
}
@@ -241,7 +251,7 @@
throw new RuntimeException(e);
}
- Wait.atMost("Recents activity didn't stop",
+ Wait.atMost("Recents view container didn't close",
() -> getFromRecents(recents -> !recents.isStarted()),
mLauncher);
}
@@ -251,7 +261,7 @@
startAppFast(getAppPackageName());
startAppFast(resolveSystemApp(Intent.CATEGORY_APP_CALCULATOR));
startTestActivity(2);
- waitForRecentsActivityStop();
+ waitForRecentsClosed();
Wait.atMost("Expected three apps in the task list",
() -> mLauncher.getRecentTasks().size() >= 3,
mLauncher);
@@ -312,12 +322,12 @@
);
}
- private int getCurrentOverviewPage(RecentsActivity recents) {
- return recents.<RecentsView>getOverviewPanel().getCurrentPage();
+ private int getCurrentOverviewPage(RecentsViewContainer recentsViewContainer) {
+ return recentsViewContainer.<RecentsView>getOverviewPanel().getCurrentPage();
}
- private int getTaskCount(RecentsActivity recents) {
- return recents.<RecentsView>getOverviewPanel().getTaskViewCount();
+ private int getTaskCount(RecentsViewContainer recentsViewContainer) {
+ return recentsViewContainer.<RecentsView>getOverviewPanel().getTaskViewCount();
}
private class OverviewUpdateHandler {
diff --git a/quickstep/tests/src/com/android/quickstep/InputConsumerUtilsTest.java b/quickstep/tests/src/com/android/quickstep/InputConsumerUtilsTest.java
new file mode 100644
index 0000000..5dc6932
--- /dev/null
+++ b/quickstep/tests/src/com/android/quickstep/InputConsumerUtilsTest.java
@@ -0,0 +1,593 @@
+/*
+ * 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.quickstep;
+
+import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
+
+import static com.android.quickstep.InputConsumerUtils.newBaseConsumer;
+import static com.android.quickstep.InputConsumerUtils.newConsumer;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.os.Looper;
+import android.view.Choreographer;
+import android.view.MotionEvent;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import com.android.launcher3.DeviceProfile;
+import com.android.launcher3.anim.AnimatedFloat;
+import com.android.launcher3.taskbar.TaskbarActivityContext;
+import com.android.launcher3.taskbar.TaskbarManager;
+import com.android.launcher3.taskbar.bubbles.BubbleBarController;
+import com.android.launcher3.taskbar.bubbles.BubbleBarPinController;
+import com.android.launcher3.taskbar.bubbles.BubbleBarSwipeController;
+import com.android.launcher3.taskbar.bubbles.BubbleBarViewController;
+import com.android.launcher3.taskbar.bubbles.BubbleControllers;
+import com.android.launcher3.taskbar.bubbles.BubbleCreator;
+import com.android.launcher3.taskbar.bubbles.BubbleDismissController;
+import com.android.launcher3.taskbar.bubbles.BubbleDragController;
+import com.android.launcher3.taskbar.bubbles.BubblePinController;
+import com.android.launcher3.taskbar.bubbles.BubbleStashedHandleViewController;
+import com.android.launcher3.taskbar.bubbles.stashing.BubbleStashController;
+import com.android.launcher3.util.LockedUserState;
+import com.android.launcher3.util.MainThreadInitializedObject;
+import com.android.launcher3.views.BaseDragLayer;
+import com.android.quickstep.fallback.window.RecentsWindowManager;
+import com.android.quickstep.inputconsumers.AccessibilityInputConsumer;
+import com.android.quickstep.inputconsumers.BubbleBarInputConsumer;
+import com.android.quickstep.inputconsumers.DeviceLockedInputConsumer;
+import com.android.quickstep.inputconsumers.NavHandleLongPressInputConsumer;
+import com.android.quickstep.inputconsumers.OneHandedModeInputConsumer;
+import com.android.quickstep.inputconsumers.OtherActivityInputConsumer;
+import com.android.quickstep.inputconsumers.OverviewInputConsumer;
+import com.android.quickstep.inputconsumers.OverviewWithoutFocusInputConsumer;
+import com.android.quickstep.inputconsumers.ProgressDelegateInputConsumer;
+import com.android.quickstep.inputconsumers.ResetGestureInputConsumer;
+import com.android.quickstep.inputconsumers.ScreenPinnedInputConsumer;
+import com.android.quickstep.inputconsumers.SysUiOverlayInputConsumer;
+import com.android.quickstep.inputconsumers.TrackpadStatusBarInputConsumer;
+import com.android.quickstep.util.ActiveGestureLog;
+import com.android.quickstep.util.NavBarPosition;
+import com.android.quickstep.views.RecentsViewContainer;
+import com.android.systemui.shared.system.InputChannelCompat;
+import com.android.systemui.shared.system.InputMonitorCompat;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+
+import java.util.Optional;
+import java.util.function.Function;
+
+import javax.inject.Provider;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class InputConsumerUtilsTest {
+
+ @NonNull private final MainThreadInitializedObject.SandboxContext mContext =
+ new MainThreadInitializedObject.SandboxContext(getApplicationContext());
+ @NonNull private final TaskAnimationManager mTaskAnimationManager = new TaskAnimationManager(
+ mContext, mock(RecentsWindowManager.class));
+ @NonNull private final InputMonitorCompat mInputMonitorCompat = new InputMonitorCompat("", 0);
+
+ private InputChannelCompat.InputEventReceiver mInputEventReceiver;
+ @Nullable private ResetGestureInputConsumer mResetGestureInputConsumer;
+ @NonNull private Function<GestureState, AnimatedFloat> mSwipeUpProxyProvider = (state) -> null;
+
+ @NonNull @Mock private TaskbarActivityContext mTaskbarActivityContext;
+ @NonNull @Mock private OverviewComponentObserver mOverviewComponentObserver;
+ @NonNull @Mock private RecentsAnimationDeviceState mDeviceState;
+ @NonNull @Mock private AbsSwipeUpHandler.Factory mSwipeUpHandlerFactory;
+ @NonNull @Mock private TaskbarManager mTaskbarManager;
+ @NonNull @Mock private OverviewCommandHelper mOverviewCommandHelper;
+ @NonNull @Mock private GestureState mPreviousGestureState;
+ @NonNull @Mock private GestureState mCurrentGestureState;
+ @NonNull @Mock private LockedUserState mLockedUserState;
+ @NonNull @Mock private TopTaskTracker.CachedTaskInfo mRunningTask;
+ @NonNull @Mock private BaseContainerInterface<?, ?> mContainerInterface;
+ @NonNull @Mock private BaseDragLayer<?> mBaseDragLayer;
+
+ @Rule
+ public final MockitoRule mMockitoRule = MockitoJUnit.rule();
+
+ @Before
+ public void setupMainThreadInitializedObjects() {
+ mContext.putObject(LockedUserState.INSTANCE, mLockedUserState);
+ }
+
+ @Before
+ public void setUpInputEventReceiver() {
+ runOnMainSync(() ->
+ mInputEventReceiver = mInputMonitorCompat.getInputReceiver(
+ Looper.getMainLooper(),
+ Choreographer.getInstance(),
+ event -> {}));
+ }
+
+ @Before
+ public void setUpTaskbarActivityContext() {
+ NavHandle navHandle = mock(NavHandle.class);
+
+ when(navHandle.canNavHandleBeLongPressed()).thenReturn(true);
+
+ when(mTaskbarActivityContext.getDeviceProfile()).thenReturn(new DeviceProfile());
+ when(mTaskbarActivityContext.getNavHandle()).thenReturn(navHandle);
+ }
+
+ @Before
+ public void setUpTaskbarManager() {
+ when(mTaskbarManager.getCurrentActivityContext()).thenReturn(mTaskbarActivityContext);
+ }
+
+ @Before
+ public void setUpResetGestureInputConsumer() {
+ mResetGestureInputConsumer = new ResetGestureInputConsumer(
+ mTaskAnimationManager, mTaskbarManager::getCurrentActivityContext);
+ }
+
+ @Before
+ public void setupLockedUserState() {
+ when(mLockedUserState.isUserUnlocked()).thenReturn(true);
+ }
+
+ @Before
+ public void setupGestureStates() {
+ when(mCurrentGestureState.getRunningTask()).thenReturn(mRunningTask);
+ doReturn(mContainerInterface).when(mCurrentGestureState).getContainerInterface();
+ }
+
+ @Before
+ public void setUpContainerInterface() {
+ RecentsViewContainer recentsViewContainer = mock(RecentsViewContainer.class);
+
+ when(recentsViewContainer.getDragLayer()).thenReturn(mBaseDragLayer);
+ when(recentsViewContainer.getRootView()).thenReturn(mBaseDragLayer);
+ when(recentsViewContainer.asContext()).thenReturn(mContext);
+
+ doReturn(recentsViewContainer).when(mContainerInterface).getCreatedContainer();
+ }
+
+ @Before
+ public void setupBaseDragLayer() {
+ when(mBaseDragLayer.hasWindowFocus()).thenReturn(true);
+ }
+
+ @Before
+ public void setupDeviceState() {
+ when(mDeviceState.canStartTrackpadGesture()).thenReturn(true);
+ when(mDeviceState.canStartSystemGesture()).thenReturn(true);
+ when(mDeviceState.isFullyGesturalNavMode()).thenReturn(true);
+ when(mDeviceState.getNavBarPosition()).thenReturn(mock(NavBarPosition.class));
+ when(mDeviceState.getRotationTouchHelper()).thenReturn(mock(RotationTouchHelper.class));
+ }
+
+ @After
+ public void cleanUp() {
+ mInputMonitorCompat.dispose();
+ mInputEventReceiver.dispose();
+ }
+
+ @Test
+ public void testNewBaseConsumer_onKeyguard_returnsDeviceLockedInputConsumer() {
+ when(mDeviceState.isKeyguardShowingOccluded()).thenReturn(true);
+
+ assertCorrectInputConsumer(
+ this::createBaseInputConsumer,
+ DeviceLockedInputConsumer.class,
+ InputConsumer.TYPE_DEVICE_LOCKED);
+ }
+
+ @Test
+ public void testNewBaseConsumer_onLiveTileModeWithNoContainer_returnsDefaultInputConsumer() {
+ when(mContainerInterface.isInLiveTileMode()).thenReturn(true);
+ when(mContainerInterface.getCreatedContainer()).thenReturn(null);
+
+ assertEqualsDefaultInputConsumer(this::createBaseInputConsumer);
+ }
+
+ @Test
+ public void testNewBaseConsumer_onLiveTileMode_returnsOverviewInputConsumer() {
+ when(mContainerInterface.isInLiveTileMode()).thenReturn(true);
+
+ assertCorrectInputConsumer(
+ this::createBaseInputConsumer,
+ OverviewInputConsumer.class,
+ InputConsumer.TYPE_OVERVIEW);
+ }
+
+ @Test
+ public void testNewBaseConsumer_withNoRunningTask_returnsDefaultInputConsumer() {
+ when(mCurrentGestureState.getRunningTask()).thenReturn(null);
+
+ assertEqualsDefaultInputConsumer(this::createBaseInputConsumer);
+ }
+
+ @Test
+ public void testNewBaseConsumer_prevGestureAnimatingToLauncher_returnsOverviewInputConsumer() {
+ when(mPreviousGestureState.isRunningAnimationToLauncher()).thenReturn(true);
+
+ assertCorrectInputConsumer(
+ this::createBaseInputConsumer,
+ OverviewInputConsumer.class,
+ InputConsumer.TYPE_OVERVIEW);
+ }
+
+ @Test
+ public void testNewBaseConsumer_predictiveBackToHomeInProgress_returnsOverviewInputConsumer() {
+ when(mDeviceState.isPredictiveBackToHomeInProgress()).thenReturn(true);
+
+ assertCorrectInputConsumer(
+ this::createBaseInputConsumer,
+ OverviewInputConsumer.class,
+ InputConsumer.TYPE_OVERVIEW);
+ }
+
+ @Test
+ public void testNewBaseConsumer_resumedThroughShellTransition_returnsOverviewInputConsumer() {
+ when(mContainerInterface.isResumed()).thenReturn(true);
+
+ assertCorrectInputConsumer(
+ this::createBaseInputConsumer,
+ OverviewInputConsumer.class,
+ InputConsumer.TYPE_OVERVIEW);
+ }
+
+ @Test
+ public void testNewBaseConsumer_shellNoWindowFocus_returnsOverviewWithoutFocusInputConsumer() {
+ when(mContainerInterface.isResumed()).thenReturn(true);
+ when(mBaseDragLayer.hasWindowFocus()).thenReturn(false);
+
+ assertCorrectInputConsumer(
+ this::createBaseInputConsumer,
+ OverviewWithoutFocusInputConsumer.class,
+ InputConsumer.TYPE_OVERVIEW_WITHOUT_FOCUS);
+ }
+
+ @Test
+ public void testNewBaseConsumer_forceOverviewInputConsumer_returnsOverviewInputConsumer() {
+ when(mContainerInterface.isResumed()).thenReturn(true);
+ when(mRunningTask.isRootChooseActivity()).thenReturn(true);
+
+ assertCorrectInputConsumer(
+ this::createBaseInputConsumer,
+ OverviewInputConsumer.class,
+ InputConsumer.TYPE_OVERVIEW);
+ }
+
+ @Test
+ public void testNewBaseConsumer_launcherChildActivityResumed_returnsDefaultInputConsumer() {
+ when(mRunningTask.isHomeTask()).thenReturn(true);
+ when(mOverviewComponentObserver.isHomeAndOverviewSame()).thenReturn(true);
+
+ assertEqualsDefaultInputConsumer(this::createBaseInputConsumer);
+ }
+
+ @Test
+ public void testNewBaseConsumer_onGestureBlockedTask_returnsDefaultInputConsumer() {
+ when(mDeviceState.isGestureBlockedTask(any())).thenReturn(true);
+
+ assertEqualsDefaultInputConsumer(this::createBaseInputConsumer);
+ }
+
+ @Test
+ public void testNewBaseConsumer_containsOtherActivityInputConsumer() {
+ // OtherActivityInputConsumer needs to be initialized on the main thread because of
+ // MotionPauseDetector.mForcePauseTimeout
+ assertCorrectInputConsumer(
+ this::createBaseInputConsumer,
+ OtherActivityInputConsumer.class,
+ InputConsumer.TYPE_OTHER_ACTIVITY);
+ }
+
+ @Test
+ public void testNewConsumer_containsOtherActivityInputConsumer() {
+ assertCorrectInputConsumer(
+ this::createInputConsumer,
+ NavHandleLongPressInputConsumer.class,
+ OtherActivityInputConsumer.class,
+ InputConsumer.TYPE_OTHER_ACTIVITY | InputConsumer.TYPE_NAV_HANDLE_LONG_PRESS);
+ }
+
+ @Test
+ public void testNewConsumer_eventCanTriggerAssistantAction_containsAssistantInputConsumer() {
+ when(mDeviceState.canTriggerAssistantAction(any())).thenReturn(true);
+
+ assertCorrectInputConsumer(
+ this::createInputConsumer,
+ NavHandleLongPressInputConsumer.class,
+ OtherActivityInputConsumer.class,
+ InputConsumer.TYPE_OTHER_ACTIVITY
+ | InputConsumer.TYPE_NAV_HANDLE_LONG_PRESS
+ | InputConsumer.TYPE_ASSISTANT);
+ }
+
+ @Test
+ public void testNewConsumer_taskbarIsPresent_containsTaskbarUnstashInputConsumer() {
+ DeviceProfile deviceProfile = new DeviceProfile();
+ deviceProfile.isTaskbarPresent = true;
+ when(mTaskbarActivityContext.getDeviceProfile()).thenReturn(deviceProfile);
+
+ assertCorrectInputConsumer(
+ this::createInputConsumer,
+ NavHandleLongPressInputConsumer.class,
+ OtherActivityInputConsumer.class,
+ InputConsumer.TYPE_OTHER_ACTIVITY
+ | InputConsumer.TYPE_TASKBAR_STASH
+ | InputConsumer.TYPE_NAV_HANDLE_LONG_PRESS
+ | InputConsumer.TYPE_CURSOR_HOVER);
+ }
+
+ @Test
+ public void testNewConsumer_whileSystemUiDialogShowing_returnsSysUiOverlayInputConsumer() {
+ when(mDeviceState.isSystemUiDialogShowing()).thenReturn(true);
+
+ assertCorrectInputConsumer(
+ this::createInputConsumer,
+ SysUiOverlayInputConsumer.class,
+ InputConsumer.TYPE_SYSUI_OVERLAY);
+ }
+
+ @Test
+ public void testNewConsumer_onTrackpadGesture_returnsTrackpadStatusBarInputConsumer() {
+ when(mCurrentGestureState.isTrackpadGesture()).thenReturn(true);
+
+ assertCorrectInputConsumer(
+ this::createInputConsumer,
+ TrackpadStatusBarInputConsumer.class,
+ OtherActivityInputConsumer.class,
+ InputConsumer.TYPE_OTHER_ACTIVITY
+ | InputConsumer.TYPE_NAV_HANDLE_LONG_PRESS
+ | InputConsumer.TYPE_STATUS_BAR);
+ }
+
+ @Test
+ public void testNewConsumer_whileScreenPinningActive_returnsScreenPinnedInputConsumer() {
+ when(mDeviceState.isScreenPinningActive()).thenReturn(true);
+
+ assertCorrectInputConsumer(
+ this::createInputConsumer,
+ ScreenPinnedInputConsumer.class,
+ InputConsumer.TYPE_SCREEN_PINNED);
+ }
+
+ @Test
+ public void testNewConsumer_canTriggerOneHandedAction_returnsOneHandedModeInputConsumer() {
+ when(mDeviceState.canTriggerOneHandedAction(any())).thenReturn(true);
+
+ assertCorrectInputConsumer(
+ this::createInputConsumer,
+ OneHandedModeInputConsumer.class,
+ OtherActivityInputConsumer.class,
+ InputConsumer.TYPE_OTHER_ACTIVITY
+ | InputConsumer.TYPE_NAV_HANDLE_LONG_PRESS
+ | InputConsumer.TYPE_ONE_HANDED);
+ }
+
+ @Test
+ public void testNewConsumer_accessibilityMenuAvailable_returnsAccessibilityInputConsumer() {
+ when(mDeviceState.isAccessibilityMenuAvailable()).thenReturn(true);
+
+ assertCorrectInputConsumer(
+ this::createInputConsumer,
+ AccessibilityInputConsumer.class,
+ OtherActivityInputConsumer.class,
+ InputConsumer.TYPE_OTHER_ACTIVITY
+ | InputConsumer.TYPE_NAV_HANDLE_LONG_PRESS
+ | InputConsumer.TYPE_ACCESSIBILITY);
+ }
+
+ @Test
+ public void testNewConsumer_onStashedBubbleBar_returnsBubbleBarInputConsumer() {
+ BubbleControllers bubbleControllers = createBubbleControllers(/* isStashed= */ true);
+
+ when(mTaskbarActivityContext.isBubbleBarEnabled()).thenReturn(true);
+ when(mTaskbarActivityContext.getBubbleControllers()).thenReturn(bubbleControllers);
+
+ assertCorrectInputConsumer(
+ this::createInputConsumer,
+ BubbleBarInputConsumer.class,
+ InputConsumer.TYPE_BUBBLE_BAR);
+ }
+
+ @Test
+ public void testNewConsumer_onVisibleBubbleBar_returnsBubbleBarInputConsumer() {
+ BubbleControllers bubbleControllers = createBubbleControllers(/* isStashed= */ false);
+
+ when(mTaskbarActivityContext.isBubbleBarEnabled()).thenReturn(true);
+ when(mTaskbarActivityContext.getBubbleControllers()).thenReturn(bubbleControllers);
+
+ assertCorrectInputConsumer(
+ this::createInputConsumer,
+ BubbleBarInputConsumer.class,
+ InputConsumer.TYPE_BUBBLE_BAR);
+ }
+
+ @Test
+ public void testNewConsumer_withSwipeUpProxyProvider_returnsProgressDelegateInputConsumer() {
+ mSwipeUpProxyProvider = (state) -> new AnimatedFloat();
+
+ assertCorrectInputConsumer(
+ this::createInputConsumer,
+ ProgressDelegateInputConsumer.class,
+ InputConsumer.TYPE_PROGRESS_DELEGATE);
+ }
+
+ @Test
+ public void testNewConsumer_onLockedState_returnsDeviceLockedInputConsumer() {
+ when(mLockedUserState.isUserUnlocked()).thenReturn(false);
+
+ assertCorrectInputConsumer(
+ this::createInputConsumer,
+ DeviceLockedInputConsumer.class,
+ InputConsumer.TYPE_DEVICE_LOCKED);
+ }
+
+ @Test
+ public void testNewConsumer_cannotStartSysGestureOnLockedState_returnsDefaultInputConsumer() {
+ when(mLockedUserState.isUserUnlocked()).thenReturn(false);
+ when(mDeviceState.canStartSystemGesture()).thenReturn(false);
+
+ assertEqualsDefaultInputConsumer(this::createInputConsumer);
+ }
+
+ @Test
+ public void testNewConsumer_cannotStartTrackGestureOnLockedState_returnsDefaultInputConsumer() {
+ when(mLockedUserState.isUserUnlocked()).thenReturn(false);
+ when(mCurrentGestureState.isTrackpadGesture()).thenReturn(true);
+ when(mDeviceState.canStartTrackpadGesture()).thenReturn(false);
+
+ assertEqualsDefaultInputConsumer(this::createInputConsumer);
+ }
+
+ private InputConsumer createInputConsumer() {
+ MotionEvent event = MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 0, 0, 0);
+ InputConsumer inputConsumer = newConsumer(
+ mContext,
+ mContext,
+ mResetGestureInputConsumer,
+ mOverviewComponentObserver,
+ mDeviceState,
+ mPreviousGestureState,
+ mCurrentGestureState,
+ mTaskAnimationManager,
+ mInputMonitorCompat,
+ mSwipeUpHandlerFactory,
+ otherActivityInputConsumer -> {},
+ mInputEventReceiver,
+ mTaskbarManager,
+ mSwipeUpProxyProvider,
+ mOverviewCommandHelper,
+ event);
+
+ event.recycle();
+
+ return inputConsumer;
+ }
+
+ private InputConsumer createBaseInputConsumer() {
+ MotionEvent event = MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 0, 0, 0);
+ InputConsumer inputConsumer = newBaseConsumer(
+ mContext,
+ mResetGestureInputConsumer,
+ mOverviewComponentObserver,
+ mDeviceState,
+ mPreviousGestureState,
+ mCurrentGestureState,
+ mTaskAnimationManager,
+ mInputMonitorCompat,
+ mSwipeUpHandlerFactory,
+ otherActivityInputConsumer -> {},
+ mInputEventReceiver,
+ event,
+ ActiveGestureLog.CompoundString.NO_OP);
+
+ event.recycle();
+
+ return inputConsumer;
+ }
+
+ private void assertEqualsDefaultInputConsumer(
+ @NonNull Provider<InputConsumer> inputConsumerProvider) {
+ assertCorrectInputConsumer(
+ inputConsumerProvider,
+ ResetGestureInputConsumer.class,
+ InputConsumer.TYPE_RESET_GESTURE);
+
+ mResetGestureInputConsumer = null;
+
+ runOnMainSync(() -> assertThat(inputConsumerProvider.get()).isEqualTo(InputConsumer.NO_OP));
+ }
+
+ private static void assertCorrectInputConsumer(
+ @NonNull Provider<InputConsumer> inputConsumerProvider,
+ @NonNull Class<? extends InputConsumer> expectedOutputConsumer,
+ int expectedType) {
+ assertCorrectInputConsumer(
+ inputConsumerProvider,
+ expectedOutputConsumer,
+ expectedOutputConsumer,
+ expectedType);
+ }
+
+ private static void assertCorrectInputConsumer(
+ @NonNull Provider<InputConsumer> inputConsumerProvider,
+ @NonNull Class<? extends InputConsumer> expectedOutputConsumer,
+ @NonNull Class<? extends InputConsumer> expectedActiveConsumer,
+ int expectedType) {
+ runOnMainSync(() -> {
+ InputConsumer inputConsumer = inputConsumerProvider.get();
+
+ assertThat(inputConsumer).isInstanceOf(expectedOutputConsumer);
+ assertThat(inputConsumer.getActiveConsumerInHierarchy())
+ .isInstanceOf(expectedActiveConsumer);
+ assertThat(inputConsumer.getType()).isEqualTo(expectedType);
+ });
+ }
+
+ private static void runOnMainSync(@NonNull Runnable runnable) {
+ InstrumentationRegistry.getInstrumentation().runOnMainSync(runnable);
+ }
+
+ private static BubbleControllers createBubbleControllers(boolean isStashed) {
+ BubbleBarController bubbleBarController = mock(BubbleBarController.class);
+ BubbleBarViewController bubbleBarViewController = mock(BubbleBarViewController.class);
+ BubbleStashController bubbleStashController = mock(BubbleStashController.class);
+ BubbleStashedHandleViewController bubbleStashedHandleViewController =
+ mock(BubbleStashedHandleViewController.class);
+ BubbleDragController bubbleDragController = mock(BubbleDragController.class);
+ BubbleDismissController bubbleDismissController = mock(BubbleDismissController.class);
+ BubbleBarPinController bubbleBarPinController = mock(BubbleBarPinController.class);
+ BubblePinController bubblePinController = mock(BubblePinController.class);
+ BubbleBarSwipeController bubbleBarSwipeController = mock(BubbleBarSwipeController.class);
+ BubbleCreator bubbleCreator = mock(BubbleCreator.class);
+ BubbleControllers bubbleControllers = new BubbleControllers(
+ bubbleBarController,
+ bubbleBarViewController,
+ bubbleStashController,
+ Optional.of(bubbleStashedHandleViewController),
+ bubbleDragController,
+ bubbleDismissController,
+ bubbleBarPinController,
+ bubblePinController,
+ Optional.of(bubbleBarSwipeController),
+ bubbleCreator);
+
+ when(bubbleBarViewController.hasBubbles()).thenReturn(true);
+ when(bubbleStashController.isStashed()).thenReturn(isStashed);
+ when(bubbleStashedHandleViewController.isEventOverHandle(any())).thenReturn(true);
+ when(bubbleBarViewController.isBubbleBarVisible()).thenReturn(!isStashed);
+ when(bubbleBarViewController.isEventOverBubbleBar(any())).thenReturn(true);
+
+ return bubbleControllers;
+ }
+}
diff --git a/quickstep/tests/src/com/android/quickstep/OrientationTouchTransformerTest.java b/quickstep/tests/src/com/android/quickstep/OrientationTouchTransformerTest.java
index f5d082d..ff0ad53 100644
--- a/quickstep/tests/src/com/android/quickstep/OrientationTouchTransformerTest.java
+++ b/quickstep/tests/src/com/android/quickstep/OrientationTouchTransformerTest.java
@@ -90,7 +90,7 @@
float landscapeRegionY =
generateTouchRegionHeight(NORMAL_SCREEN_SIZE, Surface.ROTATION_90) + 1;
- mTouchTransformer.createOrAddTouchRegion(mInfo);
+ mTouchTransformer.createOrAddTouchRegion(mInfo, "test");
tapAndAssertTrue(100, portraitRegionY,
event -> mTouchTransformer.touchInValidSwipeRegions(event.getX(), event.getY()));
tapAndAssertFalse(100, landscapeRegionY,
@@ -102,7 +102,8 @@
// Override region
mTouchTransformer
- .createOrAddTouchRegion(createDisplayInfo(NORMAL_SCREEN_SIZE, Surface.ROTATION_90));
+ .createOrAddTouchRegion(createDisplayInfo(NORMAL_SCREEN_SIZE, Surface.ROTATION_90),
+ "test");
tapAndAssertFalse(100, portraitRegionY,
event -> mTouchTransformer.touchInValidSwipeRegions(event.getX(), event.getY()));
tapAndAssertTrue(100, landscapeRegionY,
@@ -113,7 +114,7 @@
event -> mTouchTransformer.touchInAssistantRegion(event));
// Override region again
- mTouchTransformer.createOrAddTouchRegion(mInfo);
+ mTouchTransformer.createOrAddTouchRegion(mInfo, "test");
tapAndAssertTrue(100, portraitRegionY,
event -> mTouchTransformer.touchInValidSwipeRegions(event.getX(), event.getY()));
tapAndAssertFalse(100, landscapeRegionY,
@@ -132,7 +133,8 @@
generateTouchRegionHeight(NORMAL_SCREEN_SIZE, Surface.ROTATION_90) + 1;
mTouchTransformer
- .createOrAddTouchRegion(createDisplayInfo(NORMAL_SCREEN_SIZE, Surface.ROTATION_90));
+ .createOrAddTouchRegion(createDisplayInfo(NORMAL_SCREEN_SIZE, Surface.ROTATION_90),
+ "test");
tapAndAssertFalse(100, portraitRegionY,
event -> mTouchTransformer.touchInValidSwipeRegions(event.getX(), event.getY()));
tapAndAssertTrue(100, landscapeRegionY,
@@ -144,7 +146,7 @@
// We have to add 0 rotation second so that gets set as the current rotation, otherwise
// matrix transform will fail (tests only work in Portrait at the moment)
mTouchTransformer.enableMultipleRegions(true, mInfo);
- mTouchTransformer.createOrAddTouchRegion(mInfo);
+ mTouchTransformer.createOrAddTouchRegion(mInfo, "test");
tapAndAssertTrue(100, portraitRegionY,
event -> mTouchTransformer.touchInValidSwipeRegions(event.getX(), event.getY()));
@@ -165,8 +167,9 @@
mTouchTransformer.enableMultipleRegions(true, mInfo);
mTouchTransformer
- .createOrAddTouchRegion(createDisplayInfo(NORMAL_SCREEN_SIZE, Surface.ROTATION_90));
- mTouchTransformer.createOrAddTouchRegion(mInfo);
+ .createOrAddTouchRegion(createDisplayInfo(NORMAL_SCREEN_SIZE, Surface.ROTATION_90),
+ "test");
+ mTouchTransformer.createOrAddTouchRegion(mInfo, "test");
tapAndAssertTrue(0, portraitRegionY,
event -> mTouchTransformer.touchInAssistantRegion(event));
tapAndAssertFalse(0, landscapeRegionY,
@@ -181,9 +184,10 @@
generateTouchRegionHeight(NORMAL_SCREEN_SIZE, Surface.ROTATION_90) + 1;
mTouchTransformer.enableMultipleRegions(true, mInfo);
- mTouchTransformer.createOrAddTouchRegion(mInfo);
+ mTouchTransformer.createOrAddTouchRegion(mInfo, "test");
mTouchTransformer
- .createOrAddTouchRegion(createDisplayInfo(NORMAL_SCREEN_SIZE, Surface.ROTATION_90));
+ .createOrAddTouchRegion(createDisplayInfo(NORMAL_SCREEN_SIZE, Surface.ROTATION_90),
+ "test");
mTouchTransformer.enableMultipleRegions(false, mInfo);
tapAndAssertTrue(0, portraitRegionY,
event -> mTouchTransformer.touchInAssistantRegion(event));
@@ -213,14 +217,14 @@
@Test
public void applyTransform_taskNotFrozen_notInRegion() {
- mTouchTransformer.createOrAddTouchRegion(mInfo);
+ mTouchTransformer.createOrAddTouchRegion(mInfo, "test");
tapAndAssertFalse(100, 100,
event -> mTouchTransformer.touchInValidSwipeRegions(event.getX(), event.getY()));
}
@Test
public void applyTransform_taskFrozen_noRotate_outOfRegion() {
- mTouchTransformer.createOrAddTouchRegion(mInfo);
+ mTouchTransformer.createOrAddTouchRegion(mInfo, "test");
mTouchTransformer.enableMultipleRegions(true, mInfo);
tapAndAssertFalse(100, 100,
event -> mTouchTransformer.touchInValidSwipeRegions(event.getX(), event.getY()));
@@ -228,7 +232,7 @@
@Test
public void applyTransform_taskFrozen_noRotate_inRegion() {
- mTouchTransformer.createOrAddTouchRegion(mInfo);
+ mTouchTransformer.createOrAddTouchRegion(mInfo, "test");
mTouchTransformer.enableMultipleRegions(true, mInfo);
float y = generateTouchRegionHeight(NORMAL_SCREEN_SIZE, Surface.ROTATION_0) + 1;
tapAndAssertTrue(100, y,
@@ -237,7 +241,7 @@
@Test
public void applyTransform_taskNotFrozen_noRotate_inDefaultRegion() {
- mTouchTransformer.createOrAddTouchRegion(mInfo);
+ mTouchTransformer.createOrAddTouchRegion(mInfo, "test");
float y = generateTouchRegionHeight(NORMAL_SCREEN_SIZE, Surface.ROTATION_0) + 1;
tapAndAssertTrue(100, y,
event -> mTouchTransformer.touchInValidSwipeRegions(event.getX(), event.getY()));
@@ -246,7 +250,8 @@
@Test
public void applyTransform_taskNotFrozen_90Rotate_inRegion() {
mTouchTransformer
- .createOrAddTouchRegion(createDisplayInfo(NORMAL_SCREEN_SIZE, Surface.ROTATION_90));
+ .createOrAddTouchRegion(createDisplayInfo(NORMAL_SCREEN_SIZE, Surface.ROTATION_90),
+ "test");
float y = generateTouchRegionHeight(NORMAL_SCREEN_SIZE, Surface.ROTATION_90) + 1;
tapAndAssertTrue(100, y,
event -> mTouchTransformer.touchInValidSwipeRegions(event.getX(), event.getY()));
@@ -254,10 +259,11 @@
@Test
public void applyTransform_taskNotFrozen_90Rotate_withTwoRegions() {
- mTouchTransformer.createOrAddTouchRegion(mInfo);
+ mTouchTransformer.createOrAddTouchRegion(mInfo, "test");
mTouchTransformer.enableMultipleRegions(true, mInfo);
mTouchTransformer
- .createOrAddTouchRegion(createDisplayInfo(NORMAL_SCREEN_SIZE, Surface.ROTATION_90));
+ .createOrAddTouchRegion(createDisplayInfo(NORMAL_SCREEN_SIZE, Surface.ROTATION_90),
+ "test");
// Landscape point
float y1 = generateTouchRegionHeight(NORMAL_SCREEN_SIZE, Surface.ROTATION_90) + 1;
MotionEvent inRegion1_down = generateMotionEvent(MotionEvent.ACTION_DOWN, 10, y1);
@@ -278,10 +284,11 @@
@Test
public void applyTransform_90Rotate_inRotatedRegion() {
// Create regions for both 0 Rotation and 90 Rotation
- mTouchTransformer.createOrAddTouchRegion(mInfo);
+ mTouchTransformer.createOrAddTouchRegion(mInfo, "test");
mTouchTransformer.enableMultipleRegions(true, mInfo);
mTouchTransformer
- .createOrAddTouchRegion(createDisplayInfo(NORMAL_SCREEN_SIZE, Surface.ROTATION_90));
+ .createOrAddTouchRegion(createDisplayInfo(NORMAL_SCREEN_SIZE, Surface.ROTATION_90),
+ "test");
// Portrait point in landscape orientation axis
float x1 = generateTouchRegionHeight(NORMAL_SCREEN_SIZE, Surface.ROTATION_0);
// bottom of screen, from landscape perspective right side of screen
diff --git a/quickstep/tests/src/com/android/quickstep/desktop/DesktopAppLaunchTransitionManagerTest.kt b/quickstep/tests/src/com/android/quickstep/desktop/DesktopAppLaunchTransitionManagerTest.kt
index 26189df..ae96c09c 100644
--- a/quickstep/tests/src/com/android/quickstep/desktop/DesktopAppLaunchTransitionManagerTest.kt
+++ b/quickstep/tests/src/com/android/quickstep/desktop/DesktopAppLaunchTransitionManagerTest.kt
@@ -30,6 +30,7 @@
import com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession
import com.android.quickstep.SystemUiProxy
import com.android.window.flags.Flags.FLAG_ENABLE_DESKTOP_APP_LAUNCH_TRANSITIONS
+import com.android.window.flags.Flags.FLAG_ENABLE_DESKTOP_APP_LAUNCH_TRANSITIONS_BUGFIX
import com.android.wm.shell.shared.desktopmode.DesktopModeStatus
import com.google.common.truth.Truth.assertThat
import org.junit.After
@@ -74,7 +75,10 @@
}
@Test
- @EnableFlags(FLAG_ENABLE_DESKTOP_APP_LAUNCH_TRANSITIONS)
+ @EnableFlags(
+ FLAG_ENABLE_DESKTOP_APP_LAUNCH_TRANSITIONS,
+ FLAG_ENABLE_DESKTOP_APP_LAUNCH_TRANSITIONS_BUGFIX,
+ )
fun registerTransitions_appLaunchFlagEnabled_registersTransition() {
transitionManager.registerTransitions()
@@ -82,7 +86,10 @@
}
@Test
- @DisableFlags(FLAG_ENABLE_DESKTOP_APP_LAUNCH_TRANSITIONS)
+ @DisableFlags(
+ FLAG_ENABLE_DESKTOP_APP_LAUNCH_TRANSITIONS,
+ FLAG_ENABLE_DESKTOP_APP_LAUNCH_TRANSITIONS_BUGFIX,
+ )
fun registerTransitions_appLaunchFlagDisabled_doesntRegisterTransition() {
transitionManager.registerTransitions()
@@ -90,7 +97,10 @@
}
@Test
- @EnableFlags(FLAG_ENABLE_DESKTOP_APP_LAUNCH_TRANSITIONS)
+ @EnableFlags(
+ FLAG_ENABLE_DESKTOP_APP_LAUNCH_TRANSITIONS,
+ FLAG_ENABLE_DESKTOP_APP_LAUNCH_TRANSITIONS_BUGFIX,
+ )
fun registerTransitions_usesCorrectFilter() {
transitionManager.registerTransitions()
val filterArgumentCaptor = argumentCaptor<TransitionFilter>()
diff --git a/res/color-night-v31/popup_shade_first.xml b/res/color-night-v31/popup_shade_first.xml
index 28995e3..e62ed9c 100644
--- a/res/color-night-v31/popup_shade_first.xml
+++ b/res/color-night-v31/popup_shade_first.xml
@@ -13,5 +13,5 @@
limitations under the License.
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:color="?attr/materialColorSurfaceContainer"/>
+ <item android:color="@color/materialColorSurfaceContainer"/>
</selector>
diff --git a/res/color-v31/popup_shade_first.xml b/res/color-v31/popup_shade_first.xml
index be73698..9a71cae 100644
--- a/res/color-v31/popup_shade_first.xml
+++ b/res/color-v31/popup_shade_first.xml
@@ -14,5 +14,5 @@
limitations under the License.
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:color="?attr/materialColorSurfaceContainer"/>
+ <item android:color="@color/materialColorSurfaceContainer"/>
</selector>
diff --git a/res/color/overview_button.xml b/res/color/overview_button.xml
index 0b317bd..aa6c618e 100644
--- a/res/color/overview_button.xml
+++ b/res/color/overview_button.xml
@@ -2,10 +2,10 @@
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:alpha="1"
- android:color="?attr/materialColorOnSurface"
+ android:color="@color/materialColorOnSurface"
android:state_enabled="true" />
<item
android:alpha="?android:disabledAlpha"
- android:color="?attr/materialColorOnSurface"
+ android:color="@color/materialColorOnSurface"
android:state_enabled="false" />
</selector>
\ No newline at end of file
diff --git a/res/color/popup_shade_first.xml b/res/color/popup_shade_first.xml
index be73698..9a71cae 100644
--- a/res/color/popup_shade_first.xml
+++ b/res/color/popup_shade_first.xml
@@ -14,5 +14,5 @@
limitations under the License.
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
- <item android:color="?attr/materialColorSurfaceContainer"/>
+ <item android:color="@color/materialColorSurfaceContainer"/>
</selector>
diff --git a/res/drawable/all_apps_tabs_background_selected.xml b/res/drawable/all_apps_tabs_background_selected.xml
index 47f95dd..f7873da 100644
--- a/res/drawable/all_apps_tabs_background_selected.xml
+++ b/res/drawable/all_apps_tabs_background_selected.xml
@@ -15,13 +15,13 @@
-->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
- android:bottom="@dimen/all_apps_tabs_focus_width"
- android:end="@dimen/all_apps_tabs_focus_width"
- android:start="@dimen/all_apps_tabs_focus_width"
- android:top="@dimen/all_apps_tabs_focus_width">
+ android:bottom="@dimen/all_apps_tabs_focus_vertical_inset"
+ android:end="@dimen/all_apps_tabs_focus_horizontal_inset"
+ android:start="@dimen/all_apps_tabs_focus_horizontal_inset"
+ android:top="@dimen/all_apps_tabs_focus_vertical_inset">
<shape android:shape="rectangle">
<corners android:radius="@dimen/all_apps_header_pill_corner_radius" />
- <solid android:color="?attr/materialColorPrimary" />
+ <solid android:color="@color/materialColorPrimary" />
</shape>
</item>
</layer-list>
\ No newline at end of file
diff --git a/res/drawable/all_apps_tabs_background_selected_focused.xml b/res/drawable/all_apps_tabs_background_selected_focused.xml
index e3d86c0..2840262 100644
--- a/res/drawable/all_apps_tabs_background_selected_focused.xml
+++ b/res/drawable/all_apps_tabs_background_selected_focused.xml
@@ -17,7 +17,7 @@
<item>
<shape>
<corners android:radius="16dp" />
- <solid android:color="?attr/materialColorPrimary" />
+ <solid android:color="@color/materialColorPrimary" />
</shape>
</item>
@@ -28,10 +28,10 @@
android:top="@dimen/all_apps_tabs_focus_border">
<shape android:shape="rectangle">
<corners android:radius="13dp" />
- <solid android:color="?attr/materialColorPrimary" />
+ <solid android:color="@color/materialColorPrimary" />
<stroke
android:width="@dimen/all_apps_tabs_focus_padding"
- android:color="?attr/materialColorSurfaceDim" />
+ android:color="@color/materialColorSurfaceDim" />
</shape>
</item>
</layer-list>
\ No newline at end of file
diff --git a/res/drawable/all_apps_tabs_background_unselected.xml b/res/drawable/all_apps_tabs_background_unselected.xml
index ab592a8..4004021 100644
--- a/res/drawable/all_apps_tabs_background_unselected.xml
+++ b/res/drawable/all_apps_tabs_background_unselected.xml
@@ -15,13 +15,13 @@
-->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
- android:bottom="@dimen/all_apps_tabs_focus_width"
- android:end="@dimen/all_apps_tabs_focus_width"
- android:start="@dimen/all_apps_tabs_focus_width"
- android:top="@dimen/all_apps_tabs_focus_width">
+ android:bottom="@dimen/all_apps_tabs_focus_vertical_inset"
+ android:end="@dimen/all_apps_tabs_focus_horizontal_inset"
+ android:start="@dimen/all_apps_tabs_focus_horizontal_inset"
+ android:top="@dimen/all_apps_tabs_focus_vertical_inset">
<shape android:shape="rectangle">
<corners android:radius="@dimen/all_apps_header_pill_corner_radius" />
- <solid android:color="?attr/materialColorSurfaceBright" />
+ <solid android:color="@color/materialColorSurfaceBright" />
</shape>
</item>
</layer-list>
\ No newline at end of file
diff --git a/res/drawable/all_apps_tabs_background_unselected_focused.xml b/res/drawable/all_apps_tabs_background_unselected_focused.xml
index 0016102..3564a07 100644
--- a/res/drawable/all_apps_tabs_background_unselected_focused.xml
+++ b/res/drawable/all_apps_tabs_background_unselected_focused.xml
@@ -17,7 +17,7 @@
<item>
<shape>
<corners android:radius="16dp" />
- <solid android:color="?attr/materialColorPrimary" />
+ <solid android:color="@color/materialColorPrimary" />
</shape>
</item>
@@ -28,10 +28,10 @@
android:top="@dimen/all_apps_tabs_focus_border">
<shape android:shape="rectangle">
<corners android:radius="13dp" />
- <solid android:color="?attr/materialColorSurfaceBright" />
+ <solid android:color="@color/materialColorSurfaceBright" />
<stroke
android:width="@dimen/all_apps_tabs_focus_padding"
- android:color="?attr/materialColorSurfaceDim" />
+ android:color="@color/materialColorSurfaceDim" />
</shape>
</item>
</layer-list>
\ No newline at end of file
diff --git a/res/drawable/bg_letter_list_text.xml b/res/drawable/bg_letter_list_text.xml
index bfdd35c..073730c 100644
--- a/res/drawable/bg_letter_list_text.xml
+++ b/res/drawable/bg_letter_list_text.xml
@@ -15,7 +15,7 @@
-->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
- <solid android:color="?attr/materialColorSurface" />
+ <solid android:color="@color/materialColorSurface" />
<corners android:radius="100dp"/>
<size
android:width="@dimen/bg_letter_list_text_size"
diff --git a/res/drawable/bg_ps_header.xml b/res/drawable/bg_ps_header.xml
index da31445..87a21e4 100644
--- a/res/drawable/bg_ps_header.xml
+++ b/res/drawable/bg_ps_header.xml
@@ -20,7 +20,7 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="@dimen/ps_container_corner_radius" />
- <solid android:color="?attr/materialColorSurfaceContainerHigh" />
+ <solid android:color="@color/materialColorSurfaceContainerHigh" />
</shape>
</item>
</ripple>
diff --git a/res/drawable/bg_ps_lock_button.xml b/res/drawable/bg_ps_lock_button.xml
index aef1e81..7a20e49 100644
--- a/res/drawable/bg_ps_lock_button.xml
+++ b/res/drawable/bg_ps_lock_button.xml
@@ -21,12 +21,12 @@
android:viewportHeight="36">
<path
android:pathData="M18,0L71,0A18,18 0,0 1,89 18L89,18A18,18 0,0 1,71 36L18,36A18,18 0,0 1,0 18L0,18A18,18 0,0 1,18 0z"
- android:fillColor="?attr/materialColorPrimaryFixedDim"/>
+ android:fillColor="@color/materialColorPrimaryFixedDim"/>
<path
android:pathData="M26.167,14.667H27C27.917,14.667 28.667,15.417 28.667,16.333V24.667C28.667,25.583 27.917,26.333 27,26.333H17C16.083,26.333 15.333,25.583 15.333,24.667V16.333C15.333,15.417 16.083,14.667 17,14.667H17.833V13C17.833,10.7 19.7,8.833 22,8.833C24.3,8.833 26.167,10.7 26.167,13V14.667ZM22,10.5C20.617,10.5 19.5,11.617 19.5,13V14.667H24.5V13C24.5,11.617 23.383,10.5 22,10.5ZM17,24.667V16.333H27V24.667H17ZM23.667,20.5C23.667,21.417 22.917,22.167 22,22.167C21.083,22.167 20.333,21.417 20.333,20.5C20.333,19.583 21.083,18.833 22,18.833C22.917,18.833 23.667,19.583 23.667,20.5Z"
- android:fillColor="?attr/materialColorOnPrimaryFixed"
+ android:fillColor="@color/materialColorOnPrimaryFixed"
android:fillType="evenOdd"/>
<path
android:pathData="M41.204,23V12.976H42.73V21.544H47.504V23H41.204ZM52.352,23.224C51.615,23.224 50.976,23.061 50.434,22.734C49.893,22.398 49.473,21.936 49.174,21.348C48.885,20.76 48.74,20.083 48.74,19.318C48.74,18.543 48.885,17.867 49.174,17.288C49.473,16.7 49.893,16.243 50.434,15.916C50.976,15.58 51.615,15.412 52.352,15.412C53.099,15.412 53.738,15.58 54.27,15.916C54.812,16.243 55.227,16.7 55.516,17.288C55.815,17.867 55.964,18.543 55.964,19.318C55.964,20.083 55.815,20.76 55.516,21.348C55.227,21.936 54.812,22.398 54.27,22.734C53.738,23.061 53.099,23.224 52.352,23.224ZM52.352,21.838C52.772,21.838 53.141,21.74 53.458,21.544C53.776,21.348 54.023,21.063 54.2,20.69C54.378,20.307 54.466,19.85 54.466,19.318C54.466,18.777 54.378,18.319 54.2,17.946C54.023,17.573 53.776,17.288 53.458,17.092C53.141,16.896 52.777,16.798 52.366,16.798C51.946,16.798 51.578,16.896 51.26,17.092C50.943,17.288 50.691,17.573 50.504,17.946C50.327,18.319 50.238,18.777 50.238,19.318C50.238,19.859 50.327,20.317 50.504,20.69C50.691,21.063 50.943,21.348 51.26,21.544C51.587,21.74 51.951,21.838 52.352,21.838ZM60.899,23.224C60.199,23.224 59.583,23.065 59.051,22.748C58.528,22.421 58.118,21.964 57.819,21.376C57.529,20.788 57.385,20.102 57.385,19.318C57.385,18.525 57.534,17.839 57.833,17.26C58.141,16.672 58.561,16.219 59.093,15.902C59.634,15.575 60.255,15.412 60.955,15.412C61.832,15.412 62.556,15.631 63.125,16.07C63.694,16.509 64.039,17.111 64.161,17.876L62.705,18.114C62.611,17.713 62.411,17.395 62.103,17.162C61.804,16.919 61.412,16.798 60.927,16.798C60.544,16.798 60.199,16.896 59.891,17.092C59.583,17.279 59.335,17.559 59.149,17.932C58.972,18.305 58.883,18.767 58.883,19.318C58.883,19.859 58.972,20.321 59.149,20.704C59.326,21.077 59.569,21.362 59.877,21.558C60.185,21.745 60.535,21.838 60.927,21.838C61.394,21.838 61.771,21.721 62.061,21.488C62.36,21.255 62.579,20.909 62.719,20.452L64.133,20.788C63.956,21.507 63.596,22.095 63.055,22.552C62.514,23 61.795,23.224 60.899,23.224ZM65.985,23V12.136H67.483V18.688L70.381,15.636H72.187V15.72L69.499,18.492L72.257,22.916V23H70.549L68.435,19.598L67.483,20.564V23H65.985Z"
- android:fillColor="?attr/materialColorOnPrimaryFixed"/>
+ android:fillColor="@color/materialColorOnPrimaryFixed"/>
</vector>
\ No newline at end of file
diff --git a/res/drawable/bg_ps_transition_image.xml b/res/drawable/bg_ps_transition_image.xml
index dfad3cf..694303c 100644
--- a/res/drawable/bg_ps_transition_image.xml
+++ b/res/drawable/bg_ps_transition_image.xml
@@ -23,13 +23,13 @@
<path
android:name="path"
android:pathData="M 19.998 36.668 C 10.816 36.668 3.332 29.184 3.332 20 C 3.332 10.818 10.816 3.334 19.998 3.334 C 20.916 3.334 21.666 4.084 21.666 5 C 21.666 5.918 20.916 6.668 19.998 6.668 C 12.648 6.668 6.666 12.65 6.666 20 C 6.666 27.35 12.648 33.334 19.998 33.334 C 27.348 33.334 33.332 27.35 33.332 20 C 33.332 19.084 34.082 18.334 34.998 18.334 C 35.916 18.334 36.666 19.084 36.666 20 C 36.666 29.184 29.182 36.668 19.998 36.668 Z"
- android:fillColor="?attr/materialColorOnPrimaryFixed"/>
+ android:fillColor="@color/materialColorOnPrimaryFixed"/>
<path
android:name="path_3"
android:pathData="M 20 0 C 25.302 0 30.393 2.109 34.142 5.858 C 37.891 9.607 40 14.698 40 20 C 40 25.302 37.891 30.393 34.142 34.142 C 30.393 37.891 25.302 40 20 40 C 14.698 40 9.607 37.891 5.858 34.142 C 2.109 30.393 0 25.302 0 20 C 0 14.698 2.109 9.607 5.858 5.858 C 9.607 2.109 14.698 0 20 0"
- android:fillColor="?attr/materialColorPrimaryFixedDim"/>
+ android:fillColor="@color/materialColorPrimaryFixedDim"/>
<path
android:name="path_4"
android:pathData="M 19.999 28.334 C 15.408 28.334 11.666 24.592 11.666 20 C 11.666 15.409 15.408 11.667 19.999 11.667 C 20.458 11.667 20.833 12.042 20.833 12.5 C 20.833 12.959 20.458 13.334 19.999 13.334 C 16.324 13.334 13.333 16.325 13.333 20 C 13.333 23.675 16.324 26.667 19.999 26.667 C 23.674 26.667 26.666 23.675 26.666 20 C 26.666 19.542 27.041 19.167 27.499 19.167 C 27.958 19.167 28.333 19.542 28.333 20 C 28.333 24.592 24.591 28.334 19.999 28.334 Z"
- android:fillColor="?attr/materialColorOnPrimaryFixed"/>
+ android:fillColor="@color/materialColorOnPrimaryFixed"/>
</vector>
\ No newline at end of file
diff --git a/res/drawable/bg_ps_unlock_button.xml b/res/drawable/bg_ps_unlock_button.xml
index d5eedd2..563c3f6 100644
--- a/res/drawable/bg_ps_unlock_button.xml
+++ b/res/drawable/bg_ps_unlock_button.xml
@@ -21,9 +21,9 @@
android:viewportHeight="36">
<path
android:pathData="M18,0L18,0A18,18 0,0 1,36 18L36,18A18,18 0,0 1,18 36L18,36A18,18 0,0 1,0 18L0,18A18,18 0,0 1,18 0z"
- android:fillColor="?attr/materialColorPrimaryFixedDim"/>
+ android:fillColor="@color/materialColorPrimaryFixedDim"/>
<path
android:pathData="M22.167,14.667H23C23.917,14.667 24.667,15.417 24.667,16.333V24.667C24.667,25.583 23.917,26.333 23,26.333H13C12.083,26.333 11.333,25.583 11.333,24.667V16.333C11.333,15.417 12.083,14.667 13,14.667H13.833V13C13.833,10.7 15.7,8.833 18,8.833C20.3,8.833 22.167,10.7 22.167,13V14.667ZM18,10.5C16.617,10.5 15.5,11.617 15.5,13V14.667H20.5V13C20.5,11.617 19.383,10.5 18,10.5ZM13,24.667V16.333H23V24.667H13ZM19.667,20.5C19.667,21.417 18.917,22.167 18,22.167C17.083,22.167 16.333,21.417 16.333,20.5C16.333,19.583 17.083,18.833 18,18.833C18.917,18.833 19.667,19.583 19.667,20.5Z"
- android:fillColor="?attr/materialColorOnPrimaryFixed"
+ android:fillColor="@color/materialColorOnPrimaryFixed"
android:fillType="evenOdd"/>
</vector>
\ No newline at end of file
diff --git a/res/drawable/bg_rounded_corner_bottom_sheet_handle.xml b/res/drawable/bg_rounded_corner_bottom_sheet_handle.xml
index a19465d..b0bd33b 100644
--- a/res/drawable/bg_rounded_corner_bottom_sheet_handle.xml
+++ b/res/drawable/bg_rounded_corner_bottom_sheet_handle.xml
@@ -16,6 +16,6 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
- <solid android:color="?attr/materialColorOutlineVariant"/>
+ <solid android:color="@color/materialColorOutlineVariant"/>
<corners android:radius="@dimen/bottom_sheet_handle_corner_radius" />
</shape>
diff --git a/res/drawable/button_top_rounded_bordered_ripple.xml b/res/drawable/button_top_rounded_bordered_ripple.xml
index 13959f6..723668f 100644
--- a/res/drawable/button_top_rounded_bordered_ripple.xml
+++ b/res/drawable/button_top_rounded_bordered_ripple.xml
@@ -25,7 +25,7 @@
android:topRightRadius="12dp"
android:bottomLeftRadius="4dp"
android:bottomRightRadius="4dp" />
- <solid android:color="?attr/materialColorSurfaceContainerHighest"/>
+ <solid android:color="@color/materialColorSurfaceContainerHighest"/>
<stroke
android:width="2dp"
android:color="@color/button_bg"/>
diff --git a/res/drawable/ic_close_work_edu.xml b/res/drawable/ic_close_work_edu.xml
index e4053e3..24f61dd 100644
--- a/res/drawable/ic_close_work_edu.xml
+++ b/res/drawable/ic_close_work_edu.xml
@@ -20,6 +20,6 @@
android:viewportWidth="960"
android:viewportHeight="960">
<path
- android:fillColor="?attr/materialColorOnSurface"
+ android:fillColor="@color/materialColorOnSurface"
android:pathData="M256,760L200,704L424,480L200,256L256,200L480,424L704,200L760,256L536,480L760,704L704,760L480,536L256,760Z"/>
</vector>
diff --git a/res/drawable/ic_corp_off.xml b/res/drawable/ic_corp_off.xml
index d4bb2f3..e58e172 100644
--- a/res/drawable/ic_corp_off.xml
+++ b/res/drawable/ic_corp_off.xml
@@ -19,6 +19,6 @@
android:viewportHeight="24">
<path
android:pathData="M16,6H20C21.11,6 22,6.89 22,8V18.99C22,19.021 21.994,19.05 21.989,19.077C21.984,19.102 21.98,19.126 21.98,19.15L20,17.17V8H10.83L8,5.17V4C8,2.89 8.89,2 10,2H14C15.11,2 16,2.89 16,4V6ZM10,6H14V4H10V6ZM19,19L8,8L6,6L2.81,2.81L1.39,4.22L3.3,6.13C2.54,6.41 2.01,7.14 2.01,8L2,19C2,20.11 2.89,21 4,21H18.17L19.78,22.61L21.19,21.2L20.82,20.83L19,19ZM4,8V19H16.17L5.17,8H4Z"
- android:fillColor="?attr/materialColorOnPrimary"
+ android:fillColor="@color/materialColorOnPrimary"
android:fillType="evenOdd"/>
</vector>
diff --git a/res/drawable/ic_desktop_add.xml b/res/drawable/ic_desktop_add.xml
new file mode 100644
index 0000000..fa5e0de
--- /dev/null
+++ b/res/drawable/ic_desktop_add.xml
@@ -0,0 +1,24 @@
+<!--
+ ~ 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.
+ -->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="48dp"
+ android:height="48dp"
+ android:viewportWidth="960"
+ android:viewportHeight="960">
+ <path
+ android:pathData="M140,740v-520,520ZM240,640v-200h360v200L240,640ZM140,800q-24,0 -42,-18t-18,-42v-520q0,-24 18,-42t42,-18h680q24,0 42,18t18,42v300h-60v-300L140,220v520h420v60L140,800ZM680,520v-160L360,360v-40h360v200h-40ZM740,880v-120L620,760v-60h120v-120h60v120h120v60L800,760v120h-60Z"
+ android:fillColor="#5f6368"/>
+</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_info_no_shadow.xml b/res/drawable/ic_info_no_shadow.xml
index 29a81bd..31cf512 100644
--- a/res/drawable/ic_info_no_shadow.xml
+++ b/res/drawable/ic_info_no_shadow.xml
@@ -18,7 +18,7 @@
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
- android:tint="?attr/materialColorOnSurface">
+ android:tint="@color/materialColorOnSurface">
<path
android:fillColor="@android:color/white"
diff --git a/res/drawable/ic_install_no_shadow.xml b/res/drawable/ic_install_no_shadow.xml
index 6e0125a..be06c7d 100644
--- a/res/drawable/ic_install_no_shadow.xml
+++ b/res/drawable/ic_install_no_shadow.xml
@@ -18,7 +18,7 @@
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
- android:tint="?attr/materialColorOnSurface">
+ android:tint="@color/materialColorOnSurface">
<path
android:fillColor="@android:color/white"
diff --git a/res/drawable/ic_install_to_private.xml b/res/drawable/ic_install_to_private.xml
index a16d35a..9b7a218 100644
--- a/res/drawable/ic_install_to_private.xml
+++ b/res/drawable/ic_install_to_private.xml
@@ -20,7 +20,7 @@
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
- android:tint="?attr/materialColorOnSurface">
+ android:tint="@color/materialColorOnSurface">
<group>
<clip-path
diff --git a/res/drawable/ic_lock.xml b/res/drawable/ic_lock.xml
index 055e6b4..40de060 100644
--- a/res/drawable/ic_lock.xml
+++ b/res/drawable/ic_lock.xml
@@ -19,6 +19,6 @@
android:viewportWidth="960"
android:viewportHeight="960">
<path
- android:fillColor="?attr/materialColorOnPrimaryFixed"
+ android:fillColor="@color/materialColorOnPrimaryFixed"
android:pathData="M263.72,864Q234,864 213,842.85Q192,821.7 192,792L192,408Q192,378.3 213.15,357.15Q234.3,336 264,336L288,336L288,240Q288,160.32 344.23,104.16Q400.45,48 480.23,48Q560,48 616,104.16Q672,160.32 672,240L672,336L696,336Q725.7,336 746.85,357.15Q768,378.3 768,408L768,792Q768,821.7 746.84,842.85Q725.68,864 695.96,864L263.72,864ZM264,792L696,792Q696,792 696,792Q696,792 696,792L696,408Q696,408 696,408Q696,408 696,408L264,408Q264,408 264,408Q264,408 264,408L264,792Q264,792 264,792Q264,792 264,792ZM480.21,672Q510,672 531,650.79Q552,629.58 552,599.79Q552,570 530.79,549Q509.58,528 479.79,528Q450,528 429,549.21Q408,570.42 408,600.21Q408,630 429.21,651Q450.42,672 480.21,672ZM360,336L600,336L600,240Q600,190 565,155Q530,120 480,120Q430,120 395,155Q360,190 360,240L360,336ZM264,792Q264,792 264,792Q264,792 264,792L264,408Q264,408 264,408Q264,408 264,408L264,408Q264,408 264,408Q264,408 264,408L264,792Q264,792 264,792Q264,792 264,792L264,792Z"/>
</vector>
diff --git a/res/drawable/ic_private_profile_divider_badge.xml b/res/drawable/ic_private_profile_divider_badge.xml
index 07c740d..92292f6 100644
--- a/res/drawable/ic_private_profile_divider_badge.xml
+++ b/res/drawable/ic_private_profile_divider_badge.xml
@@ -21,6 +21,6 @@
<group>
<path
android:pathData="M5,9L15,9A1,1 0,0 1,16 10L16,10A1,1 0,0 1,15 11L5,11A1,1 0,0 1,4 10L4,10A1,1 0,0 1,5 9z"
- android:fillColor="?attr/materialColorOnSurface"/>
+ android:fillColor="@color/materialColorOnSurface"/>
</group>
</vector>
diff --git a/res/drawable/ic_private_space_with_background.xml b/res/drawable/ic_private_space_with_background.xml
index cc73f6d..d66549d 100644
--- a/res/drawable/ic_private_space_with_background.xml
+++ b/res/drawable/ic_private_space_with_background.xml
@@ -19,13 +19,13 @@
android:height="48dp">
<path
android:pathData="M48 24A24 24 0 0 1 0 24A24 24 0 0 1 48 24Z"
- android:fillColor="?attr/materialColorSurfaceContainerLowest" />
+ android:fillColor="@color/materialColorSurfaceContainerLowest" />
<path
android:pathData="M24.0021 10.6641L13.3354 14.6641V22.7841C13.3354 29.5174 17.8821 35.7974 24.0021 37.3307C30.1221 35.7974 34.6688 29.5174 34.6688 22.7841V14.6641L24.0021 10.6641ZM32.0021 22.7841C32.0021 28.1174 28.6021 33.0507 24.0021 34.5574C19.4021 33.0507 16.0021 28.1307 16.0021 22.7841V16.5174L24.0021 13.5174L32.0021 16.5174V22.7841Z"
android:fillType="evenOdd"
- android:fillColor="?attr/materialColorOnSurface" />
+ android:fillColor="@color/materialColorOnSurface" />
<path
android:pathData="M19.3354 20.6657C19.3354 22.7724 20.7488 24.5457 22.6688 25.119V31.999H25.3354V30.6657H28.0021V27.999H25.3354V25.119C27.2554 24.5457 28.6688 22.7857 28.6688 20.6657C28.6688 18.0924 26.5754 15.999 24.0021 15.999C21.4288 15.999 19.3354 18.0924 19.3354 20.6657ZM26.0021 20.6657C26.0021 21.7724 25.1088 22.6657 24.0021 22.6657C22.8954 22.6657 22.0021 21.7724 22.0021 20.6657C22.0021 19.559 22.8954 18.6657 24.0021 18.6657C25.1088 18.6657 26.0021 19.559 26.0021 20.6657Z"
android:fillType="evenOdd"
- android:fillColor="?attr/materialColorOnSurface" />
+ android:fillColor="@color/materialColorOnSurface" />
</vector>
diff --git a/res/drawable/ic_ps_settings.xml b/res/drawable/ic_ps_settings.xml
index 47edeb8..5453f35 100644
--- a/res/drawable/ic_ps_settings.xml
+++ b/res/drawable/ic_ps_settings.xml
@@ -24,9 +24,9 @@
android:pathData="M10,10h20v20h-20z"/>
<path
android:pathData="M21.542,28.542H18.458C17.841,28.542 17.325,28.092 17.25,27.483L17.025,25.908C16.8,25.792 16.583,25.667 16.367,25.525L14.866,26.125C14.283,26.342 13.642,26.1 13.358,25.583L11.833,22.942C11.542,22.392 11.667,21.742 12.133,21.375L13.408,20.383C13.4,20.258 13.392,20.133 13.392,20C13.392,19.875 13.4,19.742 13.408,19.617L12.142,18.625C11.65,18.25 11.525,17.575 11.833,17.058L13.375,14.4C13.658,13.883 14.3,13.65 14.866,13.875L16.375,14.483C16.591,14.342 16.808,14.217 17.025,14.1L17.25,12.508C17.325,11.925 17.841,11.467 18.45,11.467H21.533C22.15,11.467 22.667,11.917 22.742,12.525L22.966,14.1C23.191,14.217 23.408,14.342 23.625,14.483L25.125,13.883C25.716,13.667 26.358,13.908 26.642,14.425L28.175,17.075C28.475,17.625 28.341,18.275 27.875,18.642L26.608,19.633C26.617,19.758 26.625,19.883 26.625,20.017C26.625,20.15 26.617,20.275 26.608,20.4L27.875,21.392C28.341,21.767 28.475,22.417 28.183,22.942L26.633,25.625C26.35,26.142 25.708,26.375 25.133,26.15L23.633,25.55C23.417,25.692 23.2,25.817 22.983,25.933L22.758,27.525C22.675,28.092 22.158,28.542 21.542,28.542ZM21.1,27.267C21.1,27.275 21.1,27.275 21.1,27.283V27.267ZM18.9,27.25V27.267C18.908,27.267 18.908,27.258 18.9,27.25ZM18.85,26.875H21.15L21.458,24.75L21.9,24.567C22.267,24.417 22.633,24.2 23.017,23.917L23.392,23.633L25.375,24.433L26.525,22.433L24.833,21.117L24.892,20.65C24.917,20.433 24.941,20.225 24.941,20C24.941,19.775 24.917,19.558 24.892,19.35L24.833,18.883L26.525,17.567L25.367,15.567L23.375,16.367L23,16.075C22.65,15.808 22.275,15.592 21.892,15.433L21.458,15.25L21.15,13.125H18.85L18.542,15.25L18.1,15.425C17.733,15.583 17.367,15.792 16.983,16.083L16.608,16.358L14.625,15.567L13.467,17.558L15.158,18.875L15.1,19.342C15.075,19.558 15.05,19.783 15.05,20C15.05,20.217 15.066,20.442 15.1,20.65L15.158,21.117L13.467,22.433L14.616,24.433L16.608,23.633L16.983,23.925C17.341,24.2 17.7,24.408 18.091,24.567L18.533,24.75L18.85,26.875ZM25.183,24.767C25.183,24.775 25.175,24.783 25.175,24.792L25.183,24.767ZM14.808,24.758L14.816,24.775C14.816,24.767 14.808,24.758 14.808,24.758ZM25.183,15.225C25.183,15.233 25.191,15.242 25.191,15.242L25.183,15.225ZM14.825,15.208L14.816,15.225C14.816,15.225 14.825,15.217 14.825,15.208ZM21.091,12.733C21.091,12.742 21.091,12.742 21.091,12.75V12.733ZM18.908,12.717V12.733C18.908,12.725 18.908,12.725 18.908,12.717Z"
- android:fillColor="?attr/materialColorOnSurfaceVariant"/>
+ android:fillColor="@color/materialColorOnSurfaceVariant"/>
<path
android:pathData="M20,22.917C21.611,22.917 22.916,21.611 22.916,20C22.916,18.389 21.611,17.083 20,17.083C18.389,17.083 17.083,18.389 17.083,20C17.083,21.611 18.389,22.917 20,22.917Z"
- android:fillColor="?attr/materialColorOnSurfaceVariant"/>
+ android:fillColor="@color/materialColorOnSurfaceVariant"/>
</group>
</vector>
\ No newline at end of file
diff --git a/res/drawable/ic_schedule.xml b/res/drawable/ic_schedule.xml
index 3eeb6a2..d57b0a7 100644
--- a/res/drawable/ic_schedule.xml
+++ b/res/drawable/ic_schedule.xml
@@ -20,6 +20,6 @@
android:viewportHeight="960"
android:tint="?attr/colorControlNormal">
<path
- android:fillColor="?attr/materialColorOnPrimary"
+ android:fillColor="@color/materialColorOnPrimary"
android:pathData="M612,668L668,612L520,464L520,280L440,280L440,496L612,668ZM480,880Q397,880 324,848.5Q251,817 197,763Q143,709 111.5,636Q80,563 80,480Q80,397 111.5,324Q143,251 197,197Q251,143 324,111.5Q397,80 480,80Q563,80 636,111.5Q709,143 763,197Q817,251 848.5,324Q880,397 880,480Q880,563 848.5,636Q817,709 763,763Q709,817 636,848.5Q563,880 480,880Z"/>
</vector>
diff --git a/res/drawable/ic_uninstall_no_shadow.xml b/res/drawable/ic_uninstall_no_shadow.xml
index 6200054..829e590 100644
--- a/res/drawable/ic_uninstall_no_shadow.xml
+++ b/res/drawable/ic_uninstall_no_shadow.xml
@@ -18,7 +18,7 @@
android:height="20dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0"
- android:tint="?attr/materialColorOnSurface" >
+ android:tint="@color/materialColorOnSurface" >
<path
android:fillColor="@android:color/white"
android:pathData="M15,4V3H9v1H4v2h1v13c0,1.1,0.9,2,2,2h10c1.1,0,2-0.9,2-2V6h1V4H15z M17,19H7V6h10V19z" />
diff --git a/res/drawable/icon_menu_arrow_background.xml b/res/drawable/icon_menu_arrow_background.xml
index 6345c2b..1de111a 100644
--- a/res/drawable/icon_menu_arrow_background.xml
+++ b/res/drawable/icon_menu_arrow_background.xml
@@ -21,7 +21,7 @@
android:angle="0"
android:startColor="#00000000"
android:centerX="0.25"
- android:centerColor="?attr/materialColorSurfaceBright"
- android:endColor="?attr/materialColorSurfaceBright" />
+ android:centerColor="@color/materialColorSurfaceBright"
+ android:endColor="@color/materialColorSurfaceBright" />
<corners android:radius="@dimen/dialogCornerRadius" />
</shape>
\ No newline at end of file
diff --git a/res/drawable/inset_rounded_action_button.xml b/res/drawable/inset_rounded_action_button.xml
new file mode 100644
index 0000000..8ae40c0
--- /dev/null
+++ b/res/drawable/inset_rounded_action_button.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ ~ Copyright (C) 2024 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<inset xmlns:android="http://schemas.android.com/apk/res/android"
+ android:insetTop="@dimen/inset_rounded_action_button"
+ android:insetBottom="@dimen/inset_rounded_action_button"
+ android:insetLeft="@dimen/inset_rounded_action_button"
+ android:insetRight="@dimen/inset_rounded_action_button">
+ <shape
+ android:shape="rectangle">
+ <solid android:color="@color/materialColorSurfaceContainerLow" />
+ <corners android:radius="@dimen/rounded_button_radius" />
+ <stroke
+ android:width="1dp"
+ android:color="@color/materialColorSurfaceContainerLow" />
+ </shape>
+</inset>
diff --git a/res/drawable/popup_background.xml b/res/drawable/popup_background.xml
index 4ddd228..686456f 100644
--- a/res/drawable/popup_background.xml
+++ b/res/drawable/popup_background.xml
@@ -15,6 +15,6 @@
-->
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
- <solid android:color="?attr/materialColorSurfaceContainer"/>
+ <solid android:color="@color/materialColorSurfaceContainer"/>
<corners android:radius="@dimen/dialogCornerRadius"/>
</shape>
\ No newline at end of file
diff --git a/res/drawable/private_space_app_divider.xml b/res/drawable/private_space_app_divider.xml
index 1ea12b3..f92dca7 100644
--- a/res/drawable/private_space_app_divider.xml
+++ b/res/drawable/private_space_app_divider.xml
@@ -16,6 +16,6 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
- <solid android:color="?attr/materialColorOutlineVariant"/>
+ <solid android:color="@color/materialColorOutlineVariant"/>
<size android:height="@dimen/all_apps_divider_height" />
</shape>
\ No newline at end of file
diff --git a/res/drawable/ps_lock_background.xml b/res/drawable/ps_lock_background.xml
index 0be83db..bc66595 100644
--- a/res/drawable/ps_lock_background.xml
+++ b/res/drawable/ps_lock_background.xml
@@ -21,7 +21,7 @@
<inset android:inset="4dp">
<shape android:shape="rectangle">
<corners android:radius="@dimen/ps_lock_corner_radius" />
- <solid android:color="?attr/materialColorPrimaryFixedDim" />
+ <solid android:color="@color/materialColorPrimaryFixedDim" />
<padding
android:left="@dimen/ps_lock_button_background_padding"
android:right="@dimen/ps_lock_button_background_padding" />
diff --git a/res/drawable/ps_settings_background.xml b/res/drawable/ps_settings_background.xml
index b0c6b5b..7746012 100644
--- a/res/drawable/ps_settings_background.xml
+++ b/res/drawable/ps_settings_background.xml
@@ -18,6 +18,6 @@
android:inset="4dp">
<shape android:shape="rectangle">
<corners android:radius="@dimen/ps_lock_corner_radius" />
- <solid android:color="?attr/materialColorSurfaceBright" />
+ <solid android:color="@color/materialColorSurfaceBright" />
</shape>
</inset>
\ No newline at end of file
diff --git a/res/drawable/rounded_action_button.xml b/res/drawable/rounded_action_button.xml
index ebfa996..6ee6d65 100644
--- a/res/drawable/rounded_action_button.xml
+++ b/res/drawable/rounded_action_button.xml
@@ -17,10 +17,10 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
- <solid android:color="?attr/materialColorSurfaceContainerLow" />
+ <solid android:color="@color/materialColorSurfaceContainerLow" />
<corners android:radius="@dimen/rounded_button_radius" />
<stroke
android:width="1dp"
- android:color="?attr/materialColorSurfaceContainerLow" />
+ android:color="@color/materialColorSurfaceContainerLow" />
</shape>
diff --git a/res/drawable/work_card.xml b/res/drawable/work_card.xml
index 01ec947..0e37d4f 100644
--- a/res/drawable/work_card.xml
+++ b/res/drawable/work_card.xml
@@ -17,7 +17,7 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
- <solid android:color="?attr/materialColorSurfaceContainerHighest" />
+ <solid android:color="@color/materialColorSurfaceContainerHighest" />
<corners android:radius="@dimen/work_edu_card_radius" />
</shape>
diff --git a/res/drawable/work_mode_fab_background.xml b/res/drawable/work_mode_fab_background.xml
index 5bad965..ad795eb 100644
--- a/res/drawable/work_mode_fab_background.xml
+++ b/res/drawable/work_mode_fab_background.xml
@@ -18,7 +18,7 @@
<item>
<shape android:shape="rectangle">
<corners android:radius="@dimen/work_fab_radius" />
- <solid android:color="?attr/materialColorPrimary" />
+ <solid android:color="@color/materialColorPrimary" />
<padding
android:left="@dimen/work_mode_fab_background_horizontal_padding"
android:right="@dimen/work_mode_fab_background_horizontal_padding"/>
diff --git a/res/drawable/work_scheduler_background.xml b/res/drawable/work_scheduler_background.xml
index 6bbf029..50c8183 100644
--- a/res/drawable/work_scheduler_background.xml
+++ b/res/drawable/work_scheduler_background.xml
@@ -18,7 +18,7 @@
<item>
<shape android:shape="rectangle">
<corners android:radius="@dimen/work_fab_radius" />
- <solid android:color="?attr/materialColorPrimary" />
+ <solid android:color="@color/materialColorPrimary" />
<padding
android:padding="@dimen/work_scheduler_background_padding" />
</shape>
diff --git a/res/layout/add_item_confirmation_activity.xml b/res/layout/add_item_confirmation_activity.xml
index d113a38..2bb2eb3 100644
--- a/res/layout/add_item_confirmation_activity.xml
+++ b/res/layout/add_item_confirmation_activity.xml
@@ -71,7 +71,8 @@
android:id="@+id/widget_preview_scroll_view"
android:layout_width="match_parent"
android:layout_height="0dp"
- android:layout_marginVertical="16dp"
+ android:layout_margin="16dp"
+ android:background="@drawable/widgets_surface_background"
android:layout_weight="1">
<include
diff --git a/res/layout/all_apps_personal_work_tabs.xml b/res/layout/all_apps_personal_work_tabs.xml
index ecc5a14..b6a8ed8 100644
--- a/res/layout/all_apps_personal_work_tabs.xml
+++ b/res/layout/all_apps_personal_work_tabs.xml
@@ -21,8 +21,6 @@
android:layout_width="match_parent"
android:layout_height="@dimen/all_apps_header_pill_height"
android:layout_gravity="center_horizontal"
- android:paddingTop="@dimen/all_apps_tabs_vertical_padding_focus"
- android:paddingBottom="@dimen/all_apps_tabs_vertical_padding_focus"
android:layout_marginTop="@dimen/all_apps_tabs_margin_top"
android:orientation="horizontal"
style="@style/TextHeadline"
diff --git a/res/layout/private_space_header.xml b/res/layout/private_space_header.xml
index 6bce220..29da5aa 100644
--- a/res/layout/private_space_header.xml
+++ b/res/layout/private_space_header.xml
@@ -61,7 +61,7 @@
android:layout_marginBottom="@dimen/ps_lock_icon_margin_bottom"
android:importantForAccessibility="no"
android:src="@drawable/ic_lock"
- app:tint="?attr/materialColorPrimaryFixedDim"
+ app:tint="@color/materialColorPrimaryFixedDim"
android:scaleType="center"/>
<TextView
android:id="@+id/lock_text"
@@ -69,7 +69,7 @@
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/ps_lock_icon_text_margin_start_expanded"
android:layout_marginEnd="@dimen/ps_lock_icon_text_margin_end_expanded"
- android:textColor="?attr/materialColorOnPrimaryFixed"
+ android:textColor="@color/materialColorOnPrimaryFixed"
android:textSize="14sp"
android:text="@string/ps_container_lock_title"
android:maxLines="1"
diff --git a/res/layout/work_apps_edu.xml b/res/layout/work_apps_edu.xml
index a45d585..0e2c19a 100644
--- a/res/layout/work_apps_edu.xml
+++ b/res/layout/work_apps_edu.xml
@@ -25,9 +25,8 @@
android:orientation="horizontal"
android:background="@drawable/work_card"
android:layout_gravity="center_horizontal"
- android:paddingEnd="@dimen/work_card_margin"
android:paddingStart="@dimen/work_card_margin"
- android:paddingTop="@dimen/work_card_margin"
+ android:paddingEnd="@dimen/work_card_margin_end"
android:paddingBottom="@dimen/work_card_margin"
android:id="@+id/wrapper">
<TextView
@@ -37,18 +36,22 @@
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
+ android:layout_marginTop="@dimen/work_card_margin"
android:paddingEnd="@dimen/work_edu_card_text_end_margin"
android:text="@string/work_profile_edu_work_apps"
android:textDirection="locale"
android:textSize="18sp" />
<FrameLayout
+ android:id="@+id/action_btn"
android:layout_width="@dimen/rounded_button_width"
android:layout_height="@dimen/rounded_button_width"
- android:background="@drawable/rounded_action_button">
+ android:layout_marginTop="@dimen/work_edu_card_button_margin_top"
+ android:gravity="center"
+ android:background="@drawable/inset_rounded_action_button">
<ImageButton
- android:id="@+id/action_btn"
android:layout_width="@dimen/x_icon_size"
android:layout_height="@dimen/x_icon_size"
+ android:clickable="false"
android:scaleType="centerInside"
android:layout_gravity="center"
android:contentDescription="@string/accessibility_close"
diff --git a/res/layout/work_mode_fab.xml b/res/layout/work_mode_fab.xml
index e2f0e09..d6d83e4 100644
--- a/res/layout/work_mode_fab.xml
+++ b/res/layout/work_mode_fab.xml
@@ -37,7 +37,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxWidth="@dimen/work_fab_width"
- android:textColor="?attr/materialColorOnPrimary"
+ android:textColor="@color/materialColorOnPrimary"
android:textSize="14sp"
android:includeFontPadding="false"
android:textDirection="locale"
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 5181bb7..d28e1f5 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -21,9 +21,9 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name" msgid="649227358658669779">"Launcher3"</string>
<string name="work_folder_name" msgid="3753320833950115786">"Werk"</string>
- <string name="activity_not_found" msgid="8071924732094499514">"Program is nie geïnstalleer nie."</string>
- <string name="activity_not_available" msgid="7456344436509528827">"Program is nie beskikbaar nie"</string>
- <string name="safemode_shortcut_error" msgid="9160126848219158407">"Afgelaaide program in veiligmodus gedeaktiveer"</string>
+ <string name="activity_not_found" msgid="8071924732094499514">"App is nie geïnstalleer nie."</string>
+ <string name="activity_not_available" msgid="7456344436509528827">"App is nie beskikbaar nie"</string>
+ <string name="safemode_shortcut_error" msgid="9160126848219158407">"Afgelaaide app in veiligmodus gedeaktiveer"</string>
<string name="safemode_widget_error" msgid="4863470563535682004">"Legstukke gedeaktiveer in Veiligmodus"</string>
<string name="shortcut_not_available" msgid="2536503539825726397">"Kortpad is nie beskikbaar nie"</string>
<string name="home_screen" msgid="5629429142036709174">"Tuis"</string>
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Programinligting vir %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Gebruikinstellings vir %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Nuwe venster"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Bestuur vensters"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Stoor apppaar"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Hierdie apppaar word nie op hierdie toestel gesteun nie"</string>
@@ -69,18 +70,15 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Neem notas"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Voeg by"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Voeg <xliff:g id="WIDGET_NAME">%1$s</xliff:g>-legstuk by"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Wys almal"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Wys alle legstukke"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Wys tans alle legstukke"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Tik om legstukinstellings te verander"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Verander legstukinstellings"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Deursoek programme"</string>
<string name="all_apps_loading_message" msgid="5813968043155271636">"Laai tans programme …"</string>
<string name="all_apps_no_search_results" msgid="3200346862396363786">"Kon geen programme kry wat by \"<xliff:g id="QUERY">%1$s</xliff:g>\" pas nie"</string>
- <string name="label_application" msgid="8531721983832654978">"Program"</string>
+ <string name="label_application" msgid="8531721983832654978">"App"</string>
<string name="all_apps_label" msgid="5015784846527570951">"Alle apps"</string>
<string name="notifications_header" msgid="1404149926117359025">"Kennisgewings"</string>
<string name="long_press_shortcut_to_add" msgid="5405328730817637737">"Raak en hou om \'n kortpad te skuif."</string>
@@ -101,7 +99,7 @@
<string name="pin_prediction" msgid="4196423321649756498">"Vasspeldvoorspelling"</string>
<string name="bubble" msgid="3072951361014076670">"Borrel"</string>
<string name="permlab_install_shortcut" msgid="5632423390354674437">"installeer kortpaaie"</string>
- <string name="permdesc_install_shortcut" msgid="923466509822011139">"Laat \'n program toe om kortpaaie by te voeg sonder gebruikerinmenging."</string>
+ <string name="permdesc_install_shortcut" msgid="923466509822011139">"Laat \'n app toe om kortpaaie by te voeg sonder gebruikerinmenging."</string>
<string name="permlab_read_settings" msgid="5136500343007704955">"lees tuis-instellings en -kortpaaie"</string>
<string name="permdesc_read_settings" msgid="4208061150510996676">"Laat die program toe om die instellings en kortpaaie op tuisskerm te lees."</string>
<string name="permlab_write_settings" msgid="4820028712156303762">"skryf tuis-instellings en -kortpaaie"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Gedeaktiveer deur jou administrateur"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Laat toe dat tuisskerm gedraai word"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Wanneer foon gedraai word"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Landskapmodus"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Stel foon op landskapmodus"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Kennisgewingkolle"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Aan"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Af"</string>
@@ -147,8 +143,8 @@
<string name="package_state_unknown" msgid="7592128424511031410">"Onbekend"</string>
<string name="abandoned_clean_this" msgid="7610119707847920412">"Verwyder"</string>
<string name="abandoned_search" msgid="891119232568284442">"Soek"</string>
- <string name="abandoned_promises_title" msgid="7096178467971716750">"Hierdie program is nie geïnstalleer nie"</string>
- <string name="abandoned_promise_explanation" msgid="3990027586878167529">"Die program vir hierdie ikoon is nie geïnstalleer nie. Jy kan dit verwyder of die program soek en dit self installeer."</string>
+ <string name="abandoned_promises_title" msgid="7096178467971716750">"Hierdie app is nie geïnstalleer nie"</string>
+ <string name="abandoned_promise_explanation" msgid="3990027586878167529">"Die app vir hierdie ikoon is nie geïnstalleer nie. Jy kan dit verwyder of die app soek en dit self installeer."</string>
<string name="app_installing_title" msgid="5864044122733792085">"<xliff:g id="NAME">%1$s</xliff:g> installeer tans; <xliff:g id="PROGRESS">%2$s</xliff:g> voltooi"</string>
<string name="app_downloading_title" msgid="8336702962104482644">"<xliff:g id="NAME">%1$s</xliff:g> laai tans af, <xliff:g id="PROGRESS">%2$s</xliff:g> voltooid"</string>
<string name="app_waiting_download_title" msgid="7053938513995617849">"<xliff:g id="NAME">%1$s</xliff:g> wag tans om te installeer"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Verminder breedte"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Verminder hoogte"</string>
<string name="widget_resized" msgid="9130327887929620">"Legstukgrootte is verander na breedte <xliff:g id="NUMBER_0">%1$s</xliff:g> hoogte <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Kortpaaie"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Kortpadkieslys"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Maak toe"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Maak toe"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Persoonlik"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"Het dit"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Onderbreek werkprogramme"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Hervat"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Skedule van werkapps"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filter"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Misluk: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Privaat ruimte"</string>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index a217bb6..6ed533e 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"የመተግበሪያ መረጃ ለ%1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"የ%1$s የአጠቃቀም ቅንብሮች"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"አዲስ መስኮት"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"መስኮቶችን ያስተዳድሩ"</string>
<string name="save_app_pair" msgid="5647523853662686243">"የመተግበሪያ ጥምረትን ያስቀምጡ"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"ይህ የመተግበሪያ ጥምረት በዚህ መሣሪያ ላይ አይደገፍም"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"የማስታወሻ አያያዝ"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"አክል"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"ምግብር <xliff:g id="WIDGET_NAME">%1$s</xliff:g>ን አክል"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"ሁሉንም አሳይ"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"ሁሉንም ምግብሮች አሳይ"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"ሁሉንም ምግብሮች በማሳየት ላይ"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"የምግብር ቅንብሮችን ለመለወጥ መታ ያድርጉ"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"የምግብር ቅንብሮችን ይለውጡ"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"መተግበሪያዎችን ፈልግ"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"በእርስዎ አስተዳዳሪ የተሰናከለ"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"የመነሻ ማያ ገፅ ማሽከርከርን ይፍቀዱ"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"ስልኩ ሲዞር"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"የመሬት አቀማመጥ ሁኔታ"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"ስልክን ወደ የመሬት አቀማመጥ ሁኔታ ያቀናብሩ"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"የማሳወቂያ ነጥቦች"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"አብራ"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"ጠፍቷል"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"ስፋት ይቀንሱ"</string>
<string name="action_decrease_height" msgid="282377193880900022">"ቁመት ይቀንሱ"</string>
<string name="widget_resized" msgid="9130327887929620">"የመግብር መጠን ወደ ስፋት <xliff:g id="NUMBER_0">%1$s</xliff:g> ቁመት <xliff:g id="NUMBER_1">%2$s</xliff:g> ተለውጧል"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"አቋራጮች"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"የአቋራጭ ምናሌ"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"አሰናብት"</string>
<string name="accessibility_close" msgid="2277148124685870734">"ዝጋ"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"የግል"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"ገባኝ"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"የሥራ መተግበሪያዎችን ባሉበት አቁም"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"ካቆመበት ቀጥል"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"የሥራ መተግበሪያዎች መርሐግብር"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"አጣራ"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"አልተሳካም፦ <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"የግል ቦታ"</string>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index c08254a..e924f4d 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"معلومات تطبيق %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"إعدادات استخدام \"%1$s\""</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"نافذة جديدة"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"إدارة النوافذ"</string>
<string name="save_app_pair" msgid="5647523853662686243">"حفظ استخدام التطبيقين معًا"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"لا يمكن استخدام هذين التطبيقَين في الوقت نفسه على هذا الجهاز"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"تدوين الملاحظات"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"إضافة"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"إضافة التطبيق المصغّر \"<xliff:g id="WIDGET_NAME">%1$s</xliff:g>\""</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"عرض الكل"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"عرض كل التطبيقات المصغّرة"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"جارٍ عرض كل التطبيقات المصغّرة"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"انقر لتغيير إعدادات الأداة"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"تغيير إعدادات الأداة"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"بحث في التطبيقات"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"أوقف المشرف هذه الميزة"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"السماح بتدوير الشاشة الرئيسية"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"عند تدوير الهاتف"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"الوضع الأفقي"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"ضبط الهاتف على الوضع الأفقي"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"نقاط الإشعارات"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"الإعداد مفعّل"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"غير مفعّل"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"تقليل العرض"</string>
<string name="action_decrease_height" msgid="282377193880900022">"تقليل الارتفاع"</string>
<string name="widget_resized" msgid="9130327887929620">"تم تغيير حجم الأداة إلى العرض <xliff:g id="NUMBER_0">%1$s</xliff:g> والارتفاع <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"الاختصارات"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"قائمة الاختصارات"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"تجاهل"</string>
<string name="accessibility_close" msgid="2277148124685870734">"إغلاق"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"شخصية"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"حسنًا"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"إيقاف تطبيقات العمل مؤقتًا"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"إلغاء الإيقاف المؤقت"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"الجدول الزمني لتطبيقات العمل"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"فلتر"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"تعذَّر <xliff:g id="WHAT">%1$s</xliff:g>."</string>
<string name="private_space_label" msgid="2359721649407947001">"مساحة خاصة"</string>
diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml
index ccfb10e..1e88444 100644
--- a/res/values-as/strings.xml
+++ b/res/values-as/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$sৰ বাবে এপৰ তথ্য"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$sৰ বাবে ব্যৱহাৰৰ ছেটিং"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"নতুন ৱিণ্ড’"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Windows পৰিচালনা কৰক"</string>
<string name="save_app_pair" msgid="5647523853662686243">"এপৰ পেয়াৰ ছেভ কৰক"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"এই ডিভাইচটোত এই এপ্ পেয়াৰ কৰাৰ সুবিধাটো সমৰ্থিত নহয়"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"টোকা গ্ৰহণ কৰা"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"যোগ দিয়ক"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> ৱিজেট যোগ দিয়ক"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"আটাইবোৰ দেখুৱাওক"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"আটাইবোৰ ৱিজেট দেখুৱাওক"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"আটাইবোৰ ৱিজেট দেখুৱাই থকা হৈছে"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"ৱিজেটৰ ছেটিং সলনি কৰিবলৈ টিপক"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"ৱিজেটৰ ছেটিং সলনি কৰক"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"এপ্সমূহ সন্ধান কৰক"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"আপোনাৰ প্ৰশাসকে অক্ষম কৰি ৰাখিছে"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"গৃহ স্ক্ৰীন ঘূৰোৱাৰ অনুমতি দিয়ক"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"ফ\'নটো যেতিয়া ঘূৰোৱা হয়"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"লেণ্ডস্কেইপ ম’ড"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"ফ’নটো লেণ্ডস্কেইপ ম’ডলৈ ছেট কৰক"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"জাননী বিন্দু"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"অন কৰা আছে"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"অফ আছে"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"প্ৰস্থ হ্ৰাস কৰক"</string>
<string name="action_decrease_height" msgid="282377193880900022">"উচ্চতা হ্ৰাস কৰক"</string>
<string name="widget_resized" msgid="9130327887929620">"ৱিজেটৰ আকাৰ সলনি কৰি প্ৰস্থ <xliff:g id="NUMBER_0">%1$s</xliff:g> আৰু উচ্চতা <xliff:g id="NUMBER_1">%2$s</xliff:g> কৰা হ’ল"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"শ্বৰ্টকাটসমূহ"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"শ্বৰ্টকাটৰ মেনু"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"অগ্ৰাহ্য কৰক"</string>
<string name="accessibility_close" msgid="2277148124685870734">"বন্ধ কৰক"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"ব্যক্তিগত"</string>
@@ -198,13 +194,12 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"বুজি পালোঁ"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"কৰ্মস্থানৰ এপ্ পজ কৰক"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"আনপজ কৰক"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"কাম সম্পৰ্কীয় এপৰ সময়সূচী"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"ফিল্টাৰ"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"বিফল: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"প্ৰাইভেট স্পে\'চ"</string>
<string name="private_space_secondary_label" msgid="9203933341714508907">"ছেট আপ কৰিবলৈ টিপক অথবা খোলক"</string>
- <string name="ps_container_title" msgid="4391796149519594205">"ব্যক্তিগত"</string>
+ <string name="ps_container_title" msgid="4391796149519594205">"প্ৰাইভেট"</string>
<string name="ps_container_settings" msgid="6059734123353320479">"ব্যক্তিগত স্পে’চৰ ছেটিং"</string>
<string name="ps_container_unlock_button_content_description" msgid="9181551784092204234">"ব্যক্তিগত, আনলক কৰা আছে।"</string>
<string name="ps_container_lock_button_content_description" msgid="5961993384382649530">"ব্যক্তিগত, লক কৰা আছে।"</string>
diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml
index c85f271..516b401 100644
--- a/res/values-az/strings.xml
+++ b/res/values-az/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s ilə bağlı tətbiq məlumatı"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$s üzrə istifadə ayarları"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Yeni Pəncərə"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Pəncərələri idarə edin"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Tətbiq cütünü saxlayın"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Bu tətbiq cütü bu cihazda dəstəklənmir"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Qeydgötürmə"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Əlavə edin"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> vidcet əlavə edin"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Hamısını göstər"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Bütün vidcetləri göstərin"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Bütün vidcetlər göstərilir"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Vidcet ayarlarını dəyişmək üçün toxunun"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Vidcet ayarlarını dəyişin"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Tətbiqləri axtarın"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Admininiz tərəfindən deaktiv edilib"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Əsas ekran çevrilsin"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Telefon çevrilən zaman"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Landşaft rejimi"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Telefonu landşaft rejiminə ayarlayın"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Bildiriş nöqtələri"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Aktiv"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Deaktiv"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Eni azaldın"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Hündürlüyü azaldın"</string>
<string name="widget_resized" msgid="9130327887929620">"Vidcetin eni <xliff:g id="NUMBER_0">%1$s</xliff:g> hündürlüyü <xliff:g id="NUMBER_1">%2$s</xliff:g> kimi ölçüləndirildi"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Qısa yollar"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Qısayol menyusu"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Rədd edin"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Bağlayın"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Şəxsi"</string>
@@ -198,13 +194,12 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"Anladım"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"İş tətbiqlərini durdurun"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Davam etdirin"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"İş tətbiqləri cədvəli"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filtr"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Alınmadı: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Məxfi sahə"</string>
<string name="private_space_secondary_label" msgid="9203933341714508907">"Toxunaraq ayarlayın və ya açın"</string>
- <string name="ps_container_title" msgid="4391796149519594205">"Şəxsi"</string>
+ <string name="ps_container_title" msgid="4391796149519594205">"Məxfi"</string>
<string name="ps_container_settings" msgid="6059734123353320479">"Şəxsi məkan ayarları"</string>
<string name="ps_container_unlock_button_content_description" msgid="9181551784092204234">"Şəxsi, kilidli deyil."</string>
<string name="ps_container_lock_button_content_description" msgid="5961993384382649530">"Şəxsi, kilidli."</string>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index e8b55b7..c8aaa88 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Informacije o aplikaciji za: %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Podešavanja potrošnje za %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Novi prozor"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Upravljajte prozorima"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Sačuvaj par aplikacija"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Ovaj par aplikacija nije podržan na ovom uređaju"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Pravljenje beležaka"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Dodaj"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Dodajte vidžet <xliff:g id="WIDGET_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Prikaži sve"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Prikažite sve vidžete"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Prikazuju se svi vidžeti"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Dodirnite da biste promenili podešavanja vidžeta"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Promenite podešavanja vidžeta"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Pretražite aplikacije"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Administrator je onemogućio"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Dozvoli rotaciju početnog ekrana"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Kada se telefon rotira"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Vodoravni režim"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Podesite telefon na vodoravni režim"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Tačke za obaveštenja"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Uključeno"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Isključeno"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Smanji širinu"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Smanji visinu"</string>
<string name="widget_resized" msgid="9130327887929620">"Veličina vidžeta je promenjena na širinu <xliff:g id="NUMBER_0">%1$s</xliff:g> i visinu <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Prečice"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Meni sa prečicama"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Odbaci"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Zatvori"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Lično"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"Važi"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Pauziraj poslovne aplikacije"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Ponovo aktiviraj"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Raspored za poslovne aplikacije"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filter"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Nije uspelo: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Privatni prostor"</string>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index 6d714bc..b2f2f32 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Інфармацыя пра праграму для: %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$s: налады выкарыстання"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Новае акно"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Кіраваць вокнамі"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Захаваць спалучэнне праграм"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Дадзенае спалучэнне праграм не падтрымліваецца на гэтай прыладзе"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Стварэнне нататак"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Дадаць"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Дадаць віджэт \"<xliff:g id="WIDGET_NAME">%1$s</xliff:g>\""</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Паказаць усе"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Паказаць усе віджэты"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Паказаны ўсе віджэты"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Націсніце, каб змяніць налады віджэта"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Змяніць налады віджэта"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Пошук праграм"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Адключаная адміністратарам"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Дазволіць паварот галоўнага экрана"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Пры павароце тэлефона"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Альбомная арыентацыя"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Перавядзіце тэлефон у альбомную арыентацыю"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Значкі апавяшчэнняў"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Уключана"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Выкл."</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Паменшыць шырыню"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Паменшыць вышыню"</string>
<string name="widget_resized" msgid="9130327887929620">"Памеры віджэта зменены на: шырыня <xliff:g id="NUMBER_0">%1$s</xliff:g>, вышыня <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Ярлыкі"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Меню спалучэнняў клавіш"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Адхіліць"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Закрыць"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Асабістыя"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"Зразумела"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Прыпыніць працоўныя праграмы"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Актываваць"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Расклад працоўных праграм"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Фільтр"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Не ўдалося: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Прыватная прастора"</string>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index 191ef03..f4fb396 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Информация за приложението за %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Настройки за използването на %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Нов прозорец"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Управление на прозорците"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Запазване на двойката приложения"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Тази двойка приложения не се поддържа на устройството"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Водене на бележки"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Добавяне"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Добавяне на приспособлението „<xliff:g id="WIDGET_NAME">%1$s</xliff:g>“"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Вижте всички"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Показване на всички приспособления"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Показват се всички приспособления"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Докоснете, за да промените настройките на приспособлението"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Промяна на настройките на приспособлението"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Търсене в приложенията"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Деактивирано от администратора ви"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Разрешаване на завъртането на началния екран"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"При завъртане на телефона"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Хоризонтален режим"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Поставете телефона в хоризонтален режим"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Точки за известия"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Вкл."</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Изкл."</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Намаляване на ширината"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Намаляване на височината"</string>
<string name="widget_resized" msgid="9130327887929620">"Приспособлението е преоразмерено към ширина <xliff:g id="NUMBER_0">%1$s</xliff:g> и височина <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Преки пътища"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Меню за клавишните комбинации"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Отхвърляне"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Затваряне"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Лични"</string>
@@ -198,13 +194,12 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"Разбрах"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Поставяне на пауза на служебните приложения"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Отмяна на паузата"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"График за служебните приложения"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Филтър"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Неуспешно: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Частно пространство"</string>
<string name="private_space_secondary_label" msgid="9203933341714508907">"Докоснете за настройване или отваряне"</string>
- <string name="ps_container_title" msgid="4391796149519594205">"Лично"</string>
+ <string name="ps_container_title" msgid="4391796149519594205">"Частно"</string>
<string name="ps_container_settings" msgid="6059734123353320479">"Настройки за частното пространство"</string>
<string name="ps_container_unlock_button_content_description" msgid="9181551784092204234">"Частно, отключено."</string>
<string name="ps_container_lock_button_content_description" msgid="5961993384382649530">"Частно, заключено."</string>
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
index 43834af..1d38e66 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s-এর জন্য অ্যাপ সম্পর্কিত তথ্য"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$s-এর জন্য ব্যবহারের সেটিংস"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"নতুন উইন্ডো"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"উইন্ডো ম্যানেজ করুন"</string>
<string name="save_app_pair" msgid="5647523853662686243">"অ্যাপ পেয়ার সেভ করুন"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"এই ডিভাইসে এই অ্যাপ পেয়ারটি কাজ করে না"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"নোট নেওয়া"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"যোগ করুন"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> উইজেট যোগ করুন"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"সব দেখুন"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"সব উইজেট দেখুন"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"সব উইজেট দেখানো হচ্ছে"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"উইজেট সেটিংস পরিবর্তন করতে ট্যাপ করুন"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"উইজেট সেটিংস পরিবর্তন করুন"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"অ্যাপ খুঁজুন"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"আপনার প্রশাসক দ্বারা অক্ষম করা হয়েছে"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"হোম স্ক্রিন রোটেট করার অনুমতি দিন"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"যখন ফোনটি ঘোরানো হয়"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"ভূদৃশ্য মোড"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"ভূদৃশ্য মোডে ফোন সেট করুন"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"বিজ্ঞপ্তি ডট"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"চালু করা আছে"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"বন্ধ"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"প্রস্থ কমান"</string>
<string name="action_decrease_height" msgid="282377193880900022">"উচ্চতা কমান"</string>
<string name="widget_resized" msgid="9130327887929620">"উইজেটের আকার প্রস্থ <xliff:g id="NUMBER_0">%1$s</xliff:g> উচ্চতা <xliff:g id="NUMBER_1">%2$s</xliff:g> তে পরিবর্তন করা হয়েছে"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"শর্টকাট"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"শর্টকাট মেনু"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"খারিজ করুন"</string>
<string name="accessibility_close" msgid="2277148124685870734">"বন্ধ করুন"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"ব্যক্তিগত"</string>
@@ -198,13 +194,12 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"বুঝেছি"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"অফিসের অ্যাপ পজ করুন"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"আনপজ করুন"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"অফিসের অ্যাপের শিডিউল"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"ফিল্টার"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"কাজটি করা যায়নি: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"ব্যক্তিগত স্পেস"</string>
<string name="private_space_secondary_label" msgid="9203933341714508907">"সেট-আপ করতে বা খুলতে ট্যাপ করুন"</string>
- <string name="ps_container_title" msgid="4391796149519594205">"ব্যক্তিগত"</string>
+ <string name="ps_container_title" msgid="4391796149519594205">"প্রাইভেট"</string>
<string name="ps_container_settings" msgid="6059734123353320479">"ব্যক্তিগত স্পেসের সেটিংস"</string>
<string name="ps_container_unlock_button_content_description" msgid="9181551784092204234">"ব্যক্তিগত, আনলক করা আছে।"</string>
<string name="ps_container_lock_button_content_description" msgid="5961993384382649530">"ব্যক্তিগত, লক করা আছে।"</string>
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
index 0beeafe..57b475c 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Informacije o aplikaciji %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Postavke korištenja za: %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Novi prozor"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Upravljajte prozorima"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Sačuvaj par aplikacija"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Par aplikacija nije podržan na uređaju"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Pisanje bilješki"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Dodajte"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Dodavanje vidžeta <xliff:g id="WIDGET_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Prikaži sve"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Prikaz svih vidžeta"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Prikazivanje svih vidžeta"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Dodirnite da promijenite postavke vidžeta"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Promjena postavki vidžeta"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Pretražite aplikacije"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Onemogućio vaš administrator"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Dozvoli rotiranje početnog ekrana"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Kada se telefon zarotira"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Vodoravni način"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Postavite telefon u vodoravni način"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Tačke za obavještenja"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Uključeno"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Isključeno"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Smanji širinu"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Smanji visinu"</string>
<string name="widget_resized" msgid="9130327887929620">"Veličina vidžeta je promijenjena na širinu <xliff:g id="NUMBER_0">%1$s</xliff:g> visinu <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Prečice"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Meni prečica"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Odbaci"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Zatvaranje"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Lično"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"Razumijem"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Pauziraj poslovne aplikacije"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Ponovo pokreni"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Raspored poslovnih aplikacija"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filtrirajte"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Nije uspjelo: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Privatni prostor"</string>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 94a7b41..5c7409f 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Informació de l\'aplicació %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Configuració d\'ús de %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Finestra nova"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Gestiona les finestres"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Desa la parella d\'aplicacions"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Aquesta parella d\'aplicacions no s\'admet en aquest dispositiu"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Presa de notes"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Afegeix"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Afegeix el widget <xliff:g id="WIDGET_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Mostra-ho tot"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Mostra tots els widgets"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"S\'estan mostrant tots els widgets"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Toca per canviar la configuració del widget"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Canvia la configuració del widget"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Cerca aplicacions"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Desactivada per l\'administrador"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Permet la rotació de la pantalla d\'inici"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"En girar el telèfon"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Mode horitzontal"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Posa el telèfon en mode horitzontal"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Punts de notificació"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Activats"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Desactivats"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Redueix l\'amplada"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Redueix l\'alçada"</string>
<string name="widget_resized" msgid="9130327887929620">"S\'ha canviat la mida del widget a l\'amplada <xliff:g id="NUMBER_0">%1$s</xliff:g> i l\'alçada <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Dreceres"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Menú de dreceres"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Ignora"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Tanca"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personal"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"Entesos"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Posa en pausa les aplicacions de treball"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Reactiva"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Programació de les aplicacions de treball"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filtra"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Error: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Espai privat"</string>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index 93017bf..e5f26da 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Informace o aplikaci %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Nastavení využití pro aplikaci %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Nové okno"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Spravovat okna"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Uložit dvojici aplikací"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Tento pár aplikací není na tomto zařízení podporován"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Psaní poznámek"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Přidat"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Přidat widget <xliff:g id="WIDGET_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Zobrazit vše"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Zobrazit všechny widgety"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Zobrazují se všechny widgety"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Klepnutím změníte nastavení widgetu"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Změnit nastavení widgetu"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Hledat v aplikacích"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Zakázáno administrátorem"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Povolit otáčení plochy"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Při otočení telefonu"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Režim na šířku"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Nastavit telefon do režimu na šířku"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Puntíky s oznámením"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Zapnuto"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Vypnuto"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Snížit šířku"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Snížit výšku"</string>
<string name="widget_resized" msgid="9130327887929620">"Velikost widgetu upravena: šířka <xliff:g id="NUMBER_0">%1$s</xliff:g>, výška <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Zkratky"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Nabídka zkratek"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Zavřít"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Zavřít"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Osobní"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"OK"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Pozastavit pracovní aplikace"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Zrušit pozastavení"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Plán pracovních aplikací"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filtr"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Selhalo: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Soukromý prostor"</string>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index c22d0dc..1fb015f 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Appinfo for %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Indstillinger for brug af %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Nyt vindue"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Administrer vinduer"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Gem appsammenknytning"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Denne appsammenknytning understøttes ikke på enheden"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Notetagning"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Tilføj"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Tilføj <xliff:g id="WIDGET_NAME">%1$s</xliff:g>-widget"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Vis alle"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Vis alle widgets"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Viser alle widgets"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Tryk for at ændre widgetindstillinger"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Skift widgetindstillinger"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Søg efter apps"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Deaktiveret af din administrator"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Tillad rotation af startskærmen"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Når telefonen roteres"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Liggende format"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Indstil telefonen til liggende format"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Notifikationsprikker"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Til"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Fra"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Reducer bredden"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Reducer højden"</string>
<string name="widget_resized" msgid="9130327887929620">"Størrelsen for widgetten er ændret til bredde <xliff:g id="NUMBER_0">%1$s</xliff:g> og højde <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Genveje"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Genvejsmenu"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Afvis"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Luk"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personlig"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"OK"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Sæt arbejdsapps på pause"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Genoptag"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Tidsplan for arbejdsapps"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filter"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Mislykket: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Privat område"</string>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 21ada28..6eb50a7 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"App-Info für %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Nutzungseinstellungen für %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Neues Fenster"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Fenster verwalten"</string>
<string name="save_app_pair" msgid="5647523853662686243">"App-Paar speichern"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Dieses App-Paar wird auf diesem Gerät nicht unterstützt"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Notizen"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Hinzufügen"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Widget „<xliff:g id="WIDGET_NAME">%1$s</xliff:g>“ hinzufügen"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Alle anzeigen"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Alle Widgets anzeigen"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Es werden alle Widgets angezeigt"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Tippen, um die Widget-Einstellungen zu ändern"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Widget-Einstellungen ändern"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Apps finden"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Von deinem Administrator deaktiviert"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Drehen des Startbildschirms zulassen"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Beim Drehen des Smartphones"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Querformat"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Smartphone auf Querformat einstellen"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"App-Benachrichtigungspunkte"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"An"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Aus"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Breite verringern"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Höhe verringern"</string>
<string name="widget_resized" msgid="9130327887929620">"Größe des Widgets zu Breite <xliff:g id="NUMBER_0">%1$s</xliff:g> und Höhe <xliff:g id="NUMBER_1">%2$s</xliff:g> geändert"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Verknüpfungen"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Menü für Tastenkombinationen"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Schließen"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Schließen"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Privat"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"OK"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Geschäftliche Apps pausieren"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Nicht mehr pausieren"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Zeitplan für geschäftliche Apps"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filter"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Fehler: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Vertrauliches Profil"</string>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index 1e18977..deaf4ff 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Πληροφορίες εφαρμογής για %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Ρυθμίσεις χρήσης για %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Νέο παράθυρο"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Διαχείριση παραθύρων"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Αποθήκευση ζεύγους εφαρμογών"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Αυτό το ζεύγος εφαρμογών δεν υποστηρίζεται σε αυτή τη συσκευή"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Δημιουργία σημειώσεων"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Προσθήκη"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Προσθήκη του γραφικού στοιχείου <xliff:g id="WIDGET_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Εμφάνιση όλων"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Εμφάνιση συνόλου γραφικών στοιχείων"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Εμφάνιση όλων των γραφικών στοιχείων"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Πατήστε για αλλαγή των ρυθμίσεων του γραφικού στοιχείου"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Αλλαγή ρυθμίσεων γραφικού στοιχείου"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Αναζήτηση εφαρμογών"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Απενεργοποιήθηκε από τον διαχειριστή σας"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Να επιτρέπεται η περιστροφή της αρχικής οθόνης"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Όταν το τηλέφωνο περιστρέφεται"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Οριζόντιος προσανατολισμός"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Ορισμός τηλεφώνου σε οριζόντιο προσανατολισμό"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Κουκκίδες ειδοποίησης"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Ενεργοποίηση"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Απενεργοποίηση"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"μείωση του πλάτους"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Μείωση του ύψους"</string>
<string name="widget_resized" msgid="9130327887929620">"Έγινε προσαρμογή του μεγέθους του γραφικού στοιχείου σε <xliff:g id="NUMBER_0">%1$s</xliff:g> πλάτος και <xliff:g id="NUMBER_1">%2$s</xliff:g> ύψος"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Συντομεύσεις"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Μενού συντομεύσεων"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Παράβλεψη"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Κλείσιμο"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Προσωπικές"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"Το κατάλαβα"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Παύση εφαρμογών εργασιών"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Αναίρεση παύσης"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Πρόγραμμα εφαρμογών εργασιών"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Φίλτρο"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Αποτυχία: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Ιδιωτικός χώρος"</string>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index a2a4145..1175601 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"App info for %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Usage settings for %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"New window"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Manage windows"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Save app pair"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"This app pair isn\'t supported on this device"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Note-taking"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Add"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Add <xliff:g id="WIDGET_NAME">%1$s</xliff:g> widget"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Show all"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Show all widgets"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Showing all widgets"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Tap to change widget settings"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Change widget settings"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Search apps"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Disabled by your admin"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Allow home screen rotation"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"When phone is rotated"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Landscape mode"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Set phone into landscape mode"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Notification dots"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"On"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Off"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Decrease width"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Decrease height"</string>
<string name="widget_resized" msgid="9130327887929620">"Widget re-sized to width <xliff:g id="NUMBER_0">%1$s</xliff:g> height <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Short cuts"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Shortcut menu"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Dismiss"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Close"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personal"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"OK"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Pause work apps"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Unpause"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Work apps schedule"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filter"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Failed: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Private space"</string>
diff --git a/res/values-en-rCA/strings.xml b/res/values-en-rCA/strings.xml
index c600680..1dc6d16 100644
--- a/res/values-en-rCA/strings.xml
+++ b/res/values-en-rCA/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"App info for %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Usage settings for %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"New Window"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Manage Windows"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Save app pair"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"This app pair isn\'t supported on this device"</string>
@@ -177,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Decrease width"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Decrease height"</string>
<string name="widget_resized" msgid="9130327887929620">"Widget resized to width <xliff:g id="NUMBER_0">%1$s</xliff:g> height <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Shortcuts"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Shortcut Menu"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Dismiss"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Close"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personal"</string>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index a2a4145..1175601 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"App info for %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Usage settings for %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"New window"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Manage windows"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Save app pair"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"This app pair isn\'t supported on this device"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Note-taking"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Add"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Add <xliff:g id="WIDGET_NAME">%1$s</xliff:g> widget"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Show all"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Show all widgets"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Showing all widgets"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Tap to change widget settings"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Change widget settings"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Search apps"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Disabled by your admin"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Allow home screen rotation"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"When phone is rotated"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Landscape mode"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Set phone into landscape mode"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Notification dots"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"On"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Off"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Decrease width"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Decrease height"</string>
<string name="widget_resized" msgid="9130327887929620">"Widget re-sized to width <xliff:g id="NUMBER_0">%1$s</xliff:g> height <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Short cuts"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Shortcut menu"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Dismiss"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Close"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personal"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"OK"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Pause work apps"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Unpause"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Work apps schedule"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filter"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Failed: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Private space"</string>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index a2a4145..1175601 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"App info for %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Usage settings for %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"New window"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Manage windows"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Save app pair"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"This app pair isn\'t supported on this device"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Note-taking"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Add"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Add <xliff:g id="WIDGET_NAME">%1$s</xliff:g> widget"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Show all"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Show all widgets"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Showing all widgets"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Tap to change widget settings"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Change widget settings"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Search apps"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Disabled by your admin"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Allow home screen rotation"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"When phone is rotated"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Landscape mode"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Set phone into landscape mode"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Notification dots"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"On"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Off"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Decrease width"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Decrease height"</string>
<string name="widget_resized" msgid="9130327887929620">"Widget re-sized to width <xliff:g id="NUMBER_0">%1$s</xliff:g> height <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Short cuts"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Shortcut menu"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Dismiss"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Close"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personal"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"OK"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Pause work apps"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Unpause"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Work apps schedule"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filter"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Failed: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Private space"</string>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 44147c2..7006bfb 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Información de la app de %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Configuración del uso de %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Ventana nueva"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Administrar ventanas"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Guardar vinculación"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"No se admite esta vinculación de apps en este dispositivo"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Tomar notas"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Agregar"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Agregar widget <xliff:g id="WIDGET_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Mostrar todos"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Mostrar todos los widgets"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Mostrando todos los widgets"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Presiona para cambiar la configuración del widget"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Cambiar la configuración del widget"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Buscar apps"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"El administrador inhabilitó esta función"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Permitir la rotación de la pantalla principal"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Al girar el teléfono"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Modo horizontal"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Establecer el teléfono en modo horizontal"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Puntos de notificación"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Activados"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Desactivados"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Reducir el ancho"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Reducir la altura"</string>
<string name="widget_resized" msgid="9130327887929620">"Se cambió la dimensión del widget a <xliff:g id="NUMBER_0">%1$s</xliff:g> de ancho y <xliff:g id="NUMBER_1">%2$s</xliff:g> de alto."</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Accesos directos"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Menú de accesos directos"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Descartar"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Cerrar"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personal"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"Entendido"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Detener apps de trabajo"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Reanudar"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Programa de las apps de trabajo"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filtro"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Error: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Espacio privado"</string>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index 40e04d5..dabba16 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Información de la aplicación %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Ajustes de uso para %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Ventana nueva"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Gestionar ventanas"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Guardar apps emparejadas"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"El dispositivo no admite esta aplicación emparejada"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Toma de notas"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Añadir"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Añadir widget <xliff:g id="WIDGET_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Mostrar todo"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Mostrar todos los widgets"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Mostrando todos los widgets"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Toca para cambiar los ajustes del widget"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Cambiar ajustes del widget"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Buscar aplicaciones"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Inhabilitado por el administrador"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Permitir rotación de la pantalla de inicio"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Al girar el teléfono"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Modo de vista horizontal"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Pon el teléfono en modo de vista horizontal"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Burbujas de notificación"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Activado"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Desactivadas"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Reducir ancho"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Reducir altura"</string>
<string name="widget_resized" msgid="9130327887929620">"Se ha modificado el tamaño del widget a <xliff:g id="NUMBER_0">%1$s</xliff:g> de ancho y <xliff:g id="NUMBER_1">%2$s</xliff:g> de alto"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Accesos directos"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Menú de combinaciones de teclas"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Cerrar"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Cerrar"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personal"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"Entendido"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Pausar aplicaciones de trabajo"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Reanudar"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Horario de aplicaciones de trabajo"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filtro"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Se ha producido un error: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Espacio privado"</string>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index de62de1..72f6bb8 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Rakenduse teave: %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Kasutuse seaded: %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Uus aken"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Akende haldamine"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Salvesta rakendusepaar"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"See rakendusepaar ei ole selles seadmes toetatud"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Märkmete tegemine"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Lisa"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Lisa vidin <xliff:g id="WIDGET_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Kuva kõik"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Kuva kõik vidinad"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Kõik vidinad on kuvatud"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Puudutage vidina seadete muutmiseks"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Vidina seadete muutmine"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Otsige rakendusi"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Keelas administraator"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Luba avakuva pööramine"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Kui telefoni pööratakse"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Horisontaalrežiim"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Sea telefon horisontaalrežiimi"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Märguandetäpid"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Sees"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Väljas"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Vähenda laiust"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Vähenda kõrgust"</string>
<string name="widget_resized" msgid="9130327887929620">"Vidina suurust muudeti. Laius: <xliff:g id="NUMBER_0">%1$s</xliff:g>. Kõrgus: <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Otseteed"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Kiirmenüü"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Loobu"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Sule"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Isiklik"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"Selge"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Peata töörakendused"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Lõpeta peatamine"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Töörakenduste ajakava"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filter"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Nurjus: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Privaatne ruum"</string>
diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml
index 27510b3..37d3e4f 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s aplikazioari buruzko informazioa"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$s aplikazioaren erabilera-ezarpenak"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Leiho berria"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Kudeatu leihoak"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Gorde aplikazio parea"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Aplikazio pare hori ez da gailu honekin bateragarria"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Oharrak idazteko"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Gehitu"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Gehitu <xliff:g id="WIDGET_NAME">%1$s</xliff:g> widgeta"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Erakutsi guztiak"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Erakutsi widget guztiak"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Widget guztiak erakusten"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Sakatu hau widgeten ezarpenak aldatzeko"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Aldatu widgeten ezarpenak"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Bilatu aplikazioetan"</string>
@@ -93,7 +91,7 @@
<string name="all_apps_button_work_label" msgid="7270707118948892488">"Laneko aplikazioen zerrenda"</string>
<string name="remove_drop_target_label" msgid="7812859488053230776">"Kendu"</string>
<string name="uninstall_drop_target_label" msgid="4722034217958379417">"Desinstalatu"</string>
- <string name="app_info_drop_target_label" msgid="692894985365717661">"Aplikazioaren informazioa"</string>
+ <string name="app_info_drop_target_label" msgid="692894985365717661">"Aplik. buruzko info."</string>
<string name="install_private_system_shortcut_label" msgid="1616889277073184841">"Instalatu pribatuan"</string>
<string name="uninstall_private_system_shortcut_label" msgid="8423460530441627982">"Desinstalatu aplikazioa"</string>
<string name="install_drop_target_label" msgid="2539096853673231757">"Instalatu"</string>
@@ -126,14 +124,12 @@
<string name="app_pair_name_format" msgid="8134106404716224054">"Aplikazio parea: <xliff:g id="APP1">%1$s</xliff:g> eta <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Horma-papera eta estiloa"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Editatu orri nagusia"</string>
- <string name="settings_button_text" msgid="8873672322605444408">"Orri nagusiko ezarpenak"</string>
+ <string name="settings_button_text" msgid="8873672322605444408">"Orri nagusiaren ezarpenak"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Administratzaileak desgaitu du"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Eman orri nagusia biratzeko baimena"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Telefonoa biratzean"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Ikuspegi horizontala"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Ezarri telefonoa ikuspegi horizontalean"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Jakinarazpen-biribiltxoak"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Aktibatuta"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Desaktibatuta"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Txikitu zabalera"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Txikitu altuera"</string>
<string name="widget_resized" msgid="9130327887929620">"Aldatu da widgetaren tamaina. Zabalera: <xliff:g id="NUMBER_0">%1$s</xliff:g>. Altuera: <xliff:g id="NUMBER_1">%2$s</xliff:g>."</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Lasterbideak"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Lasterbideen menua"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Baztertu"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Itxi"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Pertsonalak"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"Ados"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Pausatu laneko aplikazioak"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Aktibatu berriro"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Laneko aplikazioen programazioa"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Iragazi"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Huts egin du: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Eremu pribatua"</string>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 8a21dc7..11130e4 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"اطلاعات برنامه %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"تنظیمات مصرف برای %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"پنجره جدید"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"مدیریت کردن پنجرهها"</string>
<string name="save_app_pair" msgid="5647523853662686243">"ذخیره جفت برنامه"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"از این جفت برنامه در این دستگاه پشتیبانی نمیشود"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"یادداشتبرداری"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"افزودن"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"افزودن ابزاره <xliff:g id="WIDGET_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"نمایش همه"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"نمایش همه ابزارهها"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"درحال نمایش دادن همه ابزارهها"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"برای تغییر تنظیمات ابزاره، تکضرب بزنید"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"تغییر تنظیمات ابزاره"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"جستجوی برنامهها"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"توسط سرپرست سیستم غیرفعال شده است"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"مجاز کردن چرخش صفحه اصلی"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"وقتی تلفن چرخانده میشود"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"حالت افقی"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"تنظیم تلفن روی حالت افقی"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"نقطههای اعلان"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"روشن"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"خاموش"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"کاهش عرض"</string>
<string name="action_decrease_height" msgid="282377193880900022">"کاهش ارتفاع"</string>
<string name="widget_resized" msgid="9130327887929620">"اندازه ابزاره به عرض <xliff:g id="NUMBER_0">%1$s</xliff:g> ارتفاع <xliff:g id="NUMBER_1">%2$s</xliff:g> تغییر کرد"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"میانبرها"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"منو میانبر"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"رد کردن"</string>
<string name="accessibility_close" msgid="2277148124685870734">"بستن"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"شخصی"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"متوجهام"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"توقف موقت برنامههای کاری"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"ازسرگیری"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"برنامه زمانی برنامههای کاری"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"فیلتر"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"ناموفق بود: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"فضای خصوصی"</string>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index c778a61..3a25c51 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Sovellustiedot: %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Käyttöasetus tälle: %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Uusi ikkuna"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Hallinnoi ikkunoita"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Tallenna sovelluspari"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Sovellusparia ei tueta tällä laitteella"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Muistiinpanojen tekeminen"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Lisää"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Lisää widget: <xliff:g id="WIDGET_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Näytä kaikki"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Näytä kaikki widgetit"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Näytetään kaikki widgetit"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Napauta, niin voit muuttaa widgetin asetuksia"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Muuta widgetin asetuksia"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Hae sovelluksia"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Järjestelmänvalvoja on poistanut toiminnon käytöstä."</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Salli aloitusnäytön kiertäminen"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Kun puhelinta kierretään"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Vaakasuunta"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Aseta puhelin vaakasuuntaan"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Pistemerkit"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Päällä"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Ei päällä"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Vähennä leveyttä"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Vähennä korkeutta"</string>
<string name="widget_resized" msgid="9130327887929620">"Widgetin kokoa muutettiin. Sen leveys on nyt <xliff:g id="NUMBER_0">%1$s</xliff:g> ja korkeus <xliff:g id="NUMBER_1">%2$s</xliff:g>."</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Pikakuvakkeet"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Pikanäppäinvalikko"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Hylkää"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Sulje"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Henkilökohtaiset"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"OK"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Keskeytä työsovellusten käyttö"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Jatka"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Työsovellusten aikataulu"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Suodatin"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Epäonnistui: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Yksityinen tila"</string>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 1f5e264..45a0403 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Renseignements sur l\'appli pour %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Paramètres d\'utilisation pour %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Nouvelle fenêtre"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Gérer les fenêtres"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Enr. paire d\'applis"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Cette paire d\'applis n\'est pas prise en charge sur cet appareil"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Prise de note"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Ajouter"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Ajoutez le widget <xliff:g id="WIDGET_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Tout afficher"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Afficher tous les widgets"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Tous les widgets affichés"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Touchez pour modifier les paramètres du widget"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Modifier les paramètres du widget"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Rechercher dans les applis"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Cette fonction est désactivée par votre administrateur"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Autoriser la rotation de l\'écran d\'accueil"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Lorsque vous faites pivoter le téléphone"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Mode paysage"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Configurer le téléphone en mode paysage"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Pastilles de notification"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Activé"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Désactivé"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Diminuer la largeur"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Diminuer la hauteur"</string>
<string name="widget_resized" msgid="9130327887929620">"Le widget a été redimensionné (largeur : <xliff:g id="NUMBER_0">%1$s</xliff:g>, hauteur : <xliff:g id="NUMBER_1">%2$s</xliff:g>)"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Raccourcis"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Menu des raccourcis"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Ignorer"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Fermer"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personnel"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"OK"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Mettre en pause les applis professionnelles"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Réactiver"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Horaire des applis professionnelles"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filtrer"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Échec : <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Espace privé"</string>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index a5b9a32..0a61189 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Infos sur l\'appli pour %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Paramètres d\'utilisation pour %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Nouvelle fenêtre"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Gérer les fenêtres"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Enregistrer une paire d\'applis"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Cette paire d\'applications n\'est pas prise en charge sur cet appareil"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Prise de notes"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Ajouter"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Ajoutez un widget <xliff:g id="WIDGET_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Tout afficher"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Afficher tous les widgets"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Afficher tous les widgets"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Appuyez pour modifier les paramètres du widget"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Modifier les paramètres du widget"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Rechercher dans les applications"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Désactivé par votre administrateur"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Autoriser la rotation de l\'écran d\'accueil"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Lorsque vous faites pivoter le téléphone"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Mode Paysage"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Placez le téléphone en mode Paysage"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Pastilles de notification"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Activées"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Désactivées"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Diminuer la largeur"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Diminuer la hauteur"</string>
<string name="widget_resized" msgid="9130327887929620">"Le widget a bien été redimensionné (largeur : <xliff:g id="NUMBER_0">%1$s</xliff:g>, hauteur : <xliff:g id="NUMBER_1">%2$s</xliff:g>)."</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Raccourcis"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Menu de raccourci"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Ignorer"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Fermer"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personnel"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"OK"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Mettre en pause les applis professionnelles"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Réactiver"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Planifier l\'activation des applis pros"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filtre"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Échec : <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Espace privé"</string>
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index ca2861a..293a6b3 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Información da aplicación para %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Configuración de uso para %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Ventá nova"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Xestionar ventás"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Gardar parella de apps"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"O dispositivo non admite este emparellamento de aplicacións"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Toma de notas"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Engadir"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Engadir o widget <xliff:g id="WIDGET_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Mostrar todo"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Mostrar todos os widgets"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Mostrando todos os widgets"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Toca para cambiar a configuración do widget"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Cambiar configuración do widget"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Buscar aplicacións"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Función desactivada polo administrador"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Permitir xirar a pantalla de inicio"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Ao xirar o teléfono"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Modo horizontal"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Pon o teléfono no modo horizontal"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Puntos de notificacións"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Opción activada"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Desactivados"</string>
@@ -141,7 +137,7 @@
<string name="msg_missing_notification_access" msgid="281113995110910548">"Para que se mostren os puntos de notificacións, activa as notificacións da aplicación <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="title_change_settings" msgid="1376365968844349552">"Cambiar configuración"</string>
<string name="notification_dots_service_title" msgid="4284221181793592871">"Mostra puntos de notificacións"</string>
- <string name="developer_options_title" msgid="700788437593726194">"Opcións de programador"</string>
+ <string name="developer_options_title" msgid="700788437593726194">"Opcións de programación"</string>
<string name="auto_add_shortcuts_label" msgid="4926805029653694105">"Engadir iconas de aplicacións á pantalla de inicio"</string>
<string name="auto_add_shortcuts_description" msgid="7117251166066978730">"Para novas aplicacións"</string>
<string name="package_state_unknown" msgid="7592128424511031410">"Descoñecido"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Reducir ancho"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Reducir altura"</string>
<string name="widget_resized" msgid="9130327887929620">"Cambiouse o tamaño do widget polo ancho <xliff:g id="NUMBER_0">%1$s</xliff:g> e a altura <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Atallos"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Menú do atallo"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Pechar"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Pechar"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Persoal"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"Entendido"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Pór en pausa aplicacións do traballo"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Volver activar"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Horario das aplicacións do traballo"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filtra"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Erro: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Espazo privado"</string>
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
index 59e3134..c7d3a10 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s માટે ઍપ માહિતી"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$sના વપરાશ સંબંધિત સેટિંગ"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"નવી વિન્ડો"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"વિન્ડો મેનેજ કરો"</string>
<string name="save_app_pair" msgid="5647523853662686243">"ઍપની જોડી સાચવો"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"આ ડિવાઇસ પર, આ ઍપની જોડીને સપોર્ટ આપવામાં આવતો નથી"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"નોંધ લેવી"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"ઉમેરો"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> વિજેટ ઉમેરો"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"બધા બતાવો"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"બધા વિજેટ બતાવો"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"બધા વિજેટ બતાવી રહ્યાં છીએ"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"વિજેટના સેટિંગ બદલવા માટે ટૅપ કરો"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"વિજેટના સેટિંગ બદલો"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"ઍપ શોધો"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"તમારા વ્યવસ્થાપક દ્વારા અક્ષમ કરેલ"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"હોમ સ્ક્રીનને ફેરવવાની મંજૂરી આપો"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"જ્યારે ફોન ફેરવવામાં આવે ત્યારે"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"લૅન્ડસ્કેપ મોડ"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"ફોનને લૅન્ડસ્કેપ મોડમાં સેટ કરો"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"નોટિફિકેશન માટેના ચિહ્નો"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"ચાલુ છે"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"બંધ છે"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"પહોળાઈ ઘટાડો"</string>
<string name="action_decrease_height" msgid="282377193880900022">"ઊંચાઈ ઘટાડો"</string>
<string name="widget_resized" msgid="9130327887929620">"વિજેટનો આકાર બદલીને <xliff:g id="NUMBER_0">%1$s</xliff:g> પહોળાઈ <xliff:g id="NUMBER_1">%2$s</xliff:g> ઊંચાઈ કર્યો"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"શૉર્ટકટ્સ"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"શૉર્ટકટ મેનૂ"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"છોડી દો"</string>
<string name="accessibility_close" msgid="2277148124685870734">"બંધ કરો"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"વ્યક્તિગત ઍપ"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"સમજાઈ ગયું"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"ઑફિસની ઍપ થોભાવો"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"ફરી ચાલુ કરો"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"ઑફિસ માટેની ઍપનું શેડ્યૂલ"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"ફિલ્ટર કરો"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"નિષ્ફળ: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"ખાનગી સ્પેસ"</string>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index c26cafb..1bf63d6 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s के लिए ऐप्लिकेशन की जानकारी"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$s के लिए खर्च की सेटिंग"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"नई विंडो"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"विंडो मैनेज करें"</string>
<string name="save_app_pair" msgid="5647523853662686243">"ऐप पेयर सेव करें"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"साथ में इस्तेमाल किए जा सकने वाले ये ऐप्लिकेशन, इस डिवाइस पर काम नहीं कर सकते"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"नोट बनाने से जुड़े विजेट"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"जोड़ें"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> विजेट जोड़ें"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"सभी दिखाएं"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"सभी विजेट दिखाएं"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"सभी विजेट दिखाए जा रहे हैं"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"विजेट की सेटिंग में बदलाव करने के लिए टैप करें"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"विजेट की सेटिंग में बदलाव करें"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"ऐप्लिकेशन खोजें"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"आपके एडमिन ने बंद किया हुआ है"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"होम स्क्रीन घुमाने की अनुमति दें"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"फ़ोन घुुमाए जाने पर"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"लैंडस्केप मोड"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"फ़ोन को लैंडस्केप मोड में सेट करें"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"सूचनाएं बताने वाला डॉट"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"चालू है"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"चालू"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"चौड़ाई घटाएं"</string>
<string name="action_decrease_height" msgid="282377193880900022">"ऊंचाई घटाएं"</string>
<string name="widget_resized" msgid="9130327887929620">"विजेट का आकार बदलकर उसकी चौड़ाई <xliff:g id="NUMBER_0">%1$s</xliff:g> और ऊंचाई <xliff:g id="NUMBER_1">%2$s</xliff:g> कर दी गई"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"शॉर्टकट"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"शॉर्टकट मेन्यू"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"खारिज करें"</string>
<string name="accessibility_close" msgid="2277148124685870734">"बंद करें"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"निजी ऐप्लिकेशन"</string>
@@ -198,13 +194,12 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"ठीक है"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"वर्क ऐप्लिकेशन रोकें"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"चालू करें"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"वर्क ऐप्लिकेशन के लिए शेड्यूल"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"फ़िल्टर"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"पूरा नहीं हुआ: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"प्राइवेट स्पेस"</string>
<string name="private_space_secondary_label" msgid="9203933341714508907">"सेट अप करने या खोलने के लिए टैप करें"</string>
- <string name="ps_container_title" msgid="4391796149519594205">"निजी"</string>
+ <string name="ps_container_title" msgid="4391796149519594205">"प्राइवेट"</string>
<string name="ps_container_settings" msgid="6059734123353320479">"प्राइवेट स्पेस सेटिंग"</string>
<string name="ps_container_unlock_button_content_description" msgid="9181551784092204234">"प्राइवेट स्पेस को अनलॉक किया गया."</string>
<string name="ps_container_lock_button_content_description" msgid="5961993384382649530">"प्राइवेट स्पेस को लॉक किया गया."</string>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 4a29979..7bf6f33 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Informacije o aplikaciji %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Postavke upotrebe za %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Novi prozor"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Upravljanje prozorima"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Spremi par aplikacija"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Taj par aplikacija nije podržan na ovom uređaju"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Pisanje bilježaka"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Dodaj"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Dodaj widget <xliff:g id="WIDGET_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Prikaži sve"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Prikaži sve widgete"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Prikazuju se svi widgeti"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Dodirnite da biste promijenili postavke widgeta"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Promijenite postavke widgeta"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Pretraži aplikacije"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Onemogućio administrator"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Dopusti zakretanje početnog zaslona"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Kada se telefon zakrene"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Pejzažni način"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Postavljanje telefona u pejzažni način"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Točke obavijesti"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Uključeno"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Isključeno"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Smanjenje širine"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Smanjenje visine"</string>
<string name="widget_resized" msgid="9130327887929620">"Širina widgeta promijenjena je na <xliff:g id="NUMBER_0">%1$s</xliff:g>, a visina na <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Prečaci"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Izbornik prečaca"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Odbaci"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Zatvori"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Osobno"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"Shvaćam"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Pauziraj poslovne aplikacije"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Ponovno pokreni"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Raspored za poslovne aplikacije"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filtrirajte"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Nije uspjelo: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Privatni prostor"</string>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index aa1167d..e82566e 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Alkalmazásinformáció a következőhöz: %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"A(z) %1$s használati beállításai"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Új ablak"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Ablakok kezelése"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Alkalmazáspár mentése"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Ezt az alkalmazáspárt nem támogatja az eszköz"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Jegyzetelés"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Hozzáadás"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> modul hozzáadása"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Az összes megjelenítése"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Minden modul mutatása"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Összes modul megjelenítése…"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Ide koppintva módosíthatja a modulbeállításokat"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"A modulbeállítások módosítása"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Alkalmazások keresése"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"A rendszergazda letiltotta"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"A kezdőképernyő elforgatásának engedélyezése"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"A telefon elforgatásakor"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Fekvő tájolás"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Állítsa a telefont fekvő tájolásúra"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Értesítési pöttyök"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Be"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Ki"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Szélesség csökkentése"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Magasság csökkentése"</string>
<string name="widget_resized" msgid="9130327887929620">"Modul átméretezve <xliff:g id="NUMBER_0">%1$s</xliff:g> szélességre és <xliff:g id="NUMBER_1">%2$s</xliff:g> magasságra"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Gyorsparancsok"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Gyorsparancsok menüje"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Elvetés"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Bezárás"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Személyes"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"Értem"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Munkahelyi alkalmazások szüneteltetése"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Folytatás"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Munkahelyi alkalmazások ütemezése"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Szűrő"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Sikertelen: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Privát terület"</string>
diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml
index 692984e..4879d4d 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Տեղեկություններ %1$s հավելվածի մասին"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Օգտագործման կարգավորումներ (%1$s)"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Նոր պատուհան"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Կառավարել պատուհանները"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Պահել հավելվ. զույգը"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Հավելվածների զույգը չի աջակցվում այս սարքում"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Նշումների ստեղծում"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Ավելացնել"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Ավելացնել <xliff:g id="WIDGET_NAME">%1$s</xliff:g> վիջեթը"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Բոլորը"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Ցույց տալ բոլոր վիջեթները"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Բոլոր վիջեթները ցուցադրված են"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Հպեք՝ վիջեթի կարգավորումները փոփոխելու համար"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Փոխել վիջեթի կարգավորումները"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Որոնել հավելվածներ"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Անջատվել է ձեր ադմինիստրատորի կողմից"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Թույլ տալ հիմնական էկրանի պտտումը"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Հեռախոսը պտտելու դեպքում"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Հորիզոնական"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Հեռախոսն օգտագործել հորիզոնական ռեժիմում"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Ծանուցումների կետիկներ"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Միացված է"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Անջատված է"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Նվազեցնել լայնությունը"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Նվազեցնել բարձրությունը"</string>
<string name="widget_resized" msgid="9130327887929620">"Վիջեթի լայնությունը փոխվել է <xliff:g id="NUMBER_0">%1$s</xliff:g>-ի, իսկ բարձրությունը՝ <xliff:g id="NUMBER_1">%2$s</xliff:g>-ի"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Դյուրանցումներ"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Դյուրանցման ընտրացանկ"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Անտեսել"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Փակել"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Անձնական"</string>
@@ -198,11 +194,10 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"Եղավ"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Դադարեցնել աշխատանքային հավելվածները"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Վերսկսել"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Աշխատանքային հավելվածների ժամանակացույց"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Զտեք"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Չհաջողվեց կատարել գործողությունը (<xliff:g id="WHAT">%1$s</xliff:g>)"</string>
- <string name="private_space_label" msgid="2359721649407947001">"Անձնական տարածք"</string>
+ <string name="private_space_label" msgid="2359721649407947001">"Մասնավոր տարածք"</string>
<string name="private_space_secondary_label" msgid="9203933341714508907">"Հպեք կարգավորելու կամ բացելու համար"</string>
<string name="ps_container_title" msgid="4391796149519594205">"Մասնավոր"</string>
<string name="ps_container_settings" msgid="6059734123353320479">"Անձնական տարածքի կարգավորումներ"</string>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index 1870055..dde261a 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Info aplikasi untuk %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Setelan penggunaan untuk %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Jendela Baru"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Kelola Jendela"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Simpan pasangan aplikasi"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Pasangan aplikasi ini tidak didukung di perangkat ini"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Pembuatan catatan"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Tambahkan"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Tambahkan widget <xliff:g id="WIDGET_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Tampilkan semua"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Tampilkan semua widget"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Menampilkan semua widget"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Ketuk untuk mengubah setelan widget"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Ubah setelan widget"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Telusuri aplikasi"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Dinonaktifkan oleh admin"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Izinkan layar utama diputar"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Saat ponsel diputar"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Mode lanskap"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Setel ponsel ke mode lanskap"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Titik notifikasi"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Aktif"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Nonaktif"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Kurangi lebar"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Kurangi tinggi"</string>
<string name="widget_resized" msgid="9130327887929620">"Widget diubah ukurannya menjadi lebar <xliff:g id="NUMBER_0">%1$s</xliff:g> tinggi <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Pintasan"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Menu Pintasan"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Tutup"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Tutup"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Pribadi"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"Oke"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Jeda aplikasi kerja"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Aktifkan lagi"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Jadwal aplikasi kerja"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filter"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Gagal: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Ruang privasi"</string>
diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml
index 393589a..0698bab 100644
--- a/res/values-is/strings.xml
+++ b/res/values-is/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Upplýsingar um forrit fyrir %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Notkunarstillingar fyrir %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Nýr gluggi"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Stjórna gluggum"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Vista forritapar"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Þetta forritapar er ekki stutt í þessu tæki"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Glósugerð"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Bæta við"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Bæta græjunni <xliff:g id="WIDGET_NAME">%1$s</xliff:g> við"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Sýna allt"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Sýna allar græjur"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Sýnir allar græjur"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Ýttu til að breyta græjustillingum"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Breyta græjustillingum"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Leita í forritum"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Gert óvirkt af kerfisstjóra"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Leyfa snúning á heimaskjá"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Þegar símanum er snúið"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Langsnið"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Stilla síma á langsnið"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Tilkynningapunktar"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Kveikt"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Slökkt"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Minnka breidd"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Minnka hæð"</string>
<string name="widget_resized" msgid="9130327887929620">"Stærð græju breytt í <xliff:g id="NUMBER_0">%1$s</xliff:g> á breidd og <xliff:g id="NUMBER_1">%2$s</xliff:g> á hæð"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Flýtileiðir"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Flýtileiðavalmynd"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Hunsa"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Loka"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Persónulegt"</string>
@@ -198,13 +194,12 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"Ég skil"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Setja vinnuforrit í bið"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Ljúka hléi"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Áætlun vinnuforrita"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Sía"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Mistókst: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Leynirými"</string>
<string name="private_space_secondary_label" msgid="9203933341714508907">"Ýttu til að setja upp eða opna"</string>
- <string name="ps_container_title" msgid="4391796149519594205">"Lokað"</string>
+ <string name="ps_container_title" msgid="4391796149519594205">"Leynilegt"</string>
<string name="ps_container_settings" msgid="6059734123353320479">"Stillingar einkarýmis"</string>
<string name="ps_container_unlock_button_content_description" msgid="9181551784092204234">"Lokað, ólæst."</string>
<string name="ps_container_lock_button_content_description" msgid="5961993384382649530">"Lokað, læst."</string>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 2a14445..fdd62a4 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Informazioni sull\'app %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Impostazioni di utilizzo per %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Nuova finestra"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Gestisci finestre"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Salva coppia di app"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Questa coppia di app non è supportata su questo dispositivo"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Aggiunta di note"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Aggiungi"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Aggiungi widget <xliff:g id="WIDGET_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Mostra tutto"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Mostra tutti i widget"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Visualizzazione di tutti i widget"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Tocca per modificare le impostazioni del widget"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Modifica le impostazioni del widget"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Cerca nelle app"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Disattivata dall\'amministratore"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Consenti rotazione della schermata Home"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Con il telefono ruotato"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Modalità Orizzontale"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Imposta lo smartphone in modalità Orizzontale"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Indicatori di notifica"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"On"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Off"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Riduci larghezza"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Riduci altezza"</string>
<string name="widget_resized" msgid="9130327887929620">"Widget ridimensionato a larghezza <xliff:g id="NUMBER_0">%1$s</xliff:g>, altezza <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Scorciatoie"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Menu scorciatoie"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Ignora"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Esci"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personali"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"OK"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Metti in pausa le app di lavoro"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Riattiva"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Programmazione app di lavoro"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filtra"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Operazione non riuscita: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Spazio privato"</string>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 724742a..cfc0291 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"פרטים על האפליקציה %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"הגדרות שימוש ב-%1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"חלון חדש"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"ניהול החלונות"</string>
<string name="save_app_pair" msgid="5647523853662686243">"שמירת צמד אפליקציות"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"צמד האפליקציות הזה לא נתמך במכשיר הזה"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"כתיבת הערות"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"הוספה"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"הוספת הווידג\'ט <xliff:g id="WIDGET_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"הצגת הכול"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"הצגת כל הווידג\'טים"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"כל הווידג\'טים מוצגים"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"אפשר לשנות את הגדרות הווידג\'ט בהקשה"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"שינוי הגדרות הווידג\'ט"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"חיפוש אפליקציות"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"הושבת על ידי מנהל המערכת שלך"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"סיבוב מסך הבית"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"כאשר מסובבים את הטלפון"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"פריסה לרוחב"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"העברת הטלפון לפריסה לרוחב"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"סימני ההתראות"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"מופעל"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"כבוי"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"הקטנת רוחב"</string>
<string name="action_decrease_height" msgid="282377193880900022">"הקטנת גובה"</string>
<string name="widget_resized" msgid="9130327887929620">"גודל הווידג\'ט שונה - רוחב <xliff:g id="NUMBER_0">%1$s</xliff:g> גובה <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"קיצורי דרך"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"תפריט קיצורי הדרך"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"סגירה"</string>
<string name="accessibility_close" msgid="2277148124685870734">"סגירה"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"אישי"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"הבנתי"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"השהיית האפליקציות לעבודה"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"ביטול ההשהיה"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"לוח זמנים להשהיית אפליקציות לעבודה"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"סינון"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"הפעולה נכשלה: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"מרחב פרטי"</string>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 29dbf26..01626ab 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s のアプリ情報"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$s の使用設定"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"新しいウィンドウ"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"ウィンドウを管理"</string>
<string name="save_app_pair" msgid="5647523853662686243">"アプリのペア設定を保存"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"このデバイスは、このアプリのペア設定に対応していません"</string>
@@ -45,7 +46,7 @@
<string name="widget_accessible_dims_format" msgid="3640149169885301790">"幅 %1$d、高さ %2$d"</string>
<string name="widget_preview_context_description" msgid="9045841361655787574">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> ウィジェット"</string>
<string name="widget_preview_name_and_dims_content_description" msgid="8489038126122831595">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g>ウィジェット、幅%2$d、高さ%3$d"</string>
- <string name="add_item_request_drag_hint" msgid="8730547755622776606">"ウィジェットを押し続けると、ホーム画面上に移動できます"</string>
+ <string name="add_item_request_drag_hint" msgid="8730547755622776606">"ウィジェットを長押しすると、ホーム画面上の任意の場所に移動できます"</string>
<string name="add_to_home_screen" msgid="9168649446635919791">"ホーム画面に追加"</string>
<string name="added_to_home_screen_accessibility_text" msgid="4451545765448884415">"「<xliff:g id="WIDGET_NAME">%1$s</xliff:g>」ウィジェットをホーム画面に追加しました"</string>
<string name="suggested_widgets_header_title" msgid="1844314680798145222">"候補"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"メモ"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"追加"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g>ウィジェットを追加"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"すべて表示"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"すべてのウィジェットを表示"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"すべてのウィジェットを表示しています"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"タップしてウィジェットの設定を変更する"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"ウィジェットの設定を変更します"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"アプリを検索"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"管理者により無効にされています"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"ホーム画面の回転を許可"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"スマートフォンの向きに合わせます"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"横表示"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"スマートフォンを横表示にしてください"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"通知ドット"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"ON"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"OFF"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"幅を狭くする"</string>
<string name="action_decrease_height" msgid="282377193880900022">"高さを低くする"</string>
<string name="widget_resized" msgid="9130327887929620">"ウィジェットのサイズを幅<xliff:g id="NUMBER_0">%1$s</xliff:g>、高さ<xliff:g id="NUMBER_1">%2$s</xliff:g>に変更しました"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"ショートカット"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"ショートカット メニュー"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"表示しない"</string>
<string name="accessibility_close" msgid="2277148124685870734">"閉じる"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"個人用"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"OK"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"仕事用アプリを一時停止"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"停止解除"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"仕事用アプリのスケジュール"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"フィルタ"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"失敗: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"プライベート スペース"</string>
diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml
index 876ab11..536c1ad 100644
--- a/res/values-ka/strings.xml
+++ b/res/values-ka/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s-ის აპის ინფო"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"გამოყენების პარამეტრები %1$s-ისთვის"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"ახალი ფანჯარა"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"ფანჯრების მართვა"</string>
<string name="save_app_pair" msgid="5647523853662686243">"აპთა წყვილის შენახვა"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"ამ მოწყობილობაზე აღნიშნული აპთა წყვილი არ არის მხარდაჭერილი"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"ჩანიშვნა"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"დამატება"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> ვიჯეტის დამატება"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"ყველას ჩვენება"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"ყველა ვიჯეტის ჩვენება"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"ნაჩვენებია ყველა ვიჯეტი"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"შეეხეთ ვიჯეტის პარამეტრების შესაცვლელად"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"ვიჯეტის პარამეტრების შეცვლა"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"აპების ძიება"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"გათიშულია თქვენი ადმინისტრატორის მიერ"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"მთავარი ეკრანის შეტრიალების დაშვება"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"ტელეფონის შეტრიალებისას"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"პეიზაჟის რეჟიმი"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"ტელეფონის დაყენება პეიზაჟის რეჟიმში"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"შეტყობინების ნიშნულები"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"ჩართულია"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"გამორთულია"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"სიგანის შემცირება"</string>
<string name="action_decrease_height" msgid="282377193880900022">"სიმაღლის შემცირება"</string>
<string name="widget_resized" msgid="9130327887929620">"ვიჯეტის ზომები შეიცვალა: სიგანე <xliff:g id="NUMBER_0">%1$s</xliff:g> სიმაღლე <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"მალსახმობები"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"მალსახმობის მენიუ"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"დახურვა"</string>
<string name="accessibility_close" msgid="2277148124685870734">"დახურვა"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"პირადი"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"გასაგებია"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"სამსახურის აპების დაპაუზება"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"პაუზის გაუქმება"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"სამსახურის აპების განრიგი"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"ფილტრი"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"ვერ მოხერხდა: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"პირადი სივრცე"</string>
diff --git a/res/values-kk/strings.xml b/res/values-kk/strings.xml
index bc1c380..b7f38b9 100644
--- a/res/values-kk/strings.xml
+++ b/res/values-kk/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s қолданбасы туралы ақпарат"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$s пайдалану параметрлері"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Жаңа терезе"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Терезелерді басқару"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Қолданбаларды жұптау әрекетін сақтау"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Бұл құрылғы қолданбаларды жұптау функциясын қолдамайды."</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Ескертпе жазу"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Қосу"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Виджет (<xliff:g id="WIDGET_NAME">%1$s</xliff:g>) қосу"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Барлығын көру"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Барлық виджетті көрсету"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Барлық виджет көрсетіліп тұр."</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Виджет параметрлерін өзгерту үшін түртіңіз."</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Виджет параметрлерін өзгерту"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Қолданбаларды іздеу"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Әкімші өшірді"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Негізгі экранды бұруға рұқсат ету"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Телефон бұрылғанда"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Альбом режимі"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Телефонды альбом режиміне қою"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Хабарландыру белгілері"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Қосулы"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Өшірулі"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Енін азайту"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Биіктігін азайту"</string>
<string name="widget_resized" msgid="9130327887929620">"Виджет өлшемінің ені <xliff:g id="NUMBER_0">%1$s</xliff:g>, биіктігі <xliff:g id="NUMBER_1">%2$s</xliff:g> болып өзгертілді"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Жылдам пәрмендер"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Жылдам пәрмен мәзірі"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Бас тарту"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Жабу"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Жеке"</string>
@@ -198,13 +194,12 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"Түсінікті"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Жұмыс қолданбаларын кідірту"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Қайта қосу"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Жұмыс қолданбаларының кестесі"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Сүзгі"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Қате шықты: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Құпия кеңістік"</string>
<string name="private_space_secondary_label" msgid="9203933341714508907">"Реттеу немесе ашу үшін түртіңіз"</string>
- <string name="ps_container_title" msgid="4391796149519594205">"Жеке"</string>
+ <string name="ps_container_title" msgid="4391796149519594205">"Құпия"</string>
<string name="ps_container_settings" msgid="6059734123353320479">"Құпия кеңістік параметрлері"</string>
<string name="ps_container_unlock_button_content_description" msgid="9181551784092204234">"Құпия (құлыпталмаған)."</string>
<string name="ps_container_lock_button_content_description" msgid="5961993384382649530">"Құпия (құлыптаулы)."</string>
diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml
index 813b5a2..6a707ae 100644
--- a/res/values-km/strings.xml
+++ b/res/values-km/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"ព័ត៌មានកម្មវិធីសម្រាប់ %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"ការកំណត់ការប្រើប្រាស់សម្រាប់ %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"វិនដូថ្មី"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"គ្រប់គ្រងវិនដូ"</string>
<string name="save_app_pair" msgid="5647523853662686243">"រក្សាទុកគូកម្មវិធី"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"មិនអាចប្រើគូកម្មវិធីនេះនៅលើឧបករណ៍នេះបានទេ"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"ការកត់ត្រា"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"បញ្ចូល"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"បញ្ចូលធាតុក្រាហ្វិក <xliff:g id="WIDGET_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"បង្ហាញទាំងអស់"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"បង្ហាញធាតុក្រាហ្វិកទាំងអស់"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"កំពុងបង្ហាញធាតុក្រាហ្វិកទាំងអស់"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"ចុចដើម្បីប្ដូរការកំណត់ធាតុក្រាហ្វិក"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"ប្ដូរការកំណត់ធាតុក្រាហ្វិក"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"ស្វែងរកកម្មវិធី"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"បានបិទដំណើរការដោយអ្នកគ្រប់គ្រងរបស់អ្នក"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"អនុញ្ញាតការបងិ្វលអេក្រង់ដើម"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"នៅពេលដែលបង្វិលទូរសព្ទ"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"ផ្ដេក"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"កំណត់ទូរសព្ទទៅផ្ដេក"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"ស្លាកជូនដំណឹង"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"បើក"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"បិទ"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"បន្ថយទទឹង"</string>
<string name="action_decrease_height" msgid="282377193880900022">"បន្ថយកម្ពស់"</string>
<string name="widget_resized" msgid="9130327887929620">"ធាតុក្រាហ្វិកដែលបានប្តូរទំហំទៅទទឹងប្រវែង <xliff:g id="NUMBER_0">%1$s</xliff:g> កម្ពស់ប្រវែង <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"ផ្លូវកាត់"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"ម៉ឺនុយផ្លូវកាត់"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"ច្រានចោល"</string>
<string name="accessibility_close" msgid="2277148124685870734">"បិទ"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"ផ្ទាល់ខ្លួន"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"យល់ហើយ"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"ផ្អាកកម្មវិធីការងារ"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"ឈប់ផ្អាក"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"កាលវិភាគកម្មវិធីការងារ"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"តម្រង"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"បានបរាជ័យ៖ <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"បន្ទប់ឯកជន"</string>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
index b4bc3a1..0ce1a0f 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s ಗಾಗಿ ಆ್ಯಪ್ ಮಾಹಿತಿ"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$s ಗೆ ಸಂಬಂಧಿಸಿದ ಬಳಕೆಯ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"ಹೊಸ ವಿಂಡೋ"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"ವಿಂಡೋಗಳನ್ನು ನಿರ್ವಹಿಸಿ"</string>
<string name="save_app_pair" msgid="5647523853662686243">"ಆ್ಯಪ್ ಪೇರ್ ಸೇವ್ ಮಾಡಿ"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"ಈ ಆ್ಯಪ್ ಜೋಡಿಯು ಈ ಸಾಧನದಲ್ಲಿ ಬೆಂಬಲಿತವಾಗಿಲ್ಲ"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"ಟಿಪ್ಪಣಿ ತೆಗೆದುಕೊಳ್ಳುವುದು"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"ಸೇರಿಸಿ"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> ವಿಜೆಟ್ ಸೇರಿಸಿ"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"ಎಲ್ಲಾ ತೋರಿಸಿ"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"ಎಲ್ಲಾ ವಿಜೆಟ್ಗಳನ್ನು ತೋರಿಸಿ"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"ಎಲ್ಲಾ ವಿಜೆಟ್ಗಳನ್ನು ತೋರಿಸಲಾಗುತ್ತಿದೆ"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"ವಿಜೆಟ್ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಬದಲಾಯಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"ವಿಜೆಟ್ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಬದಲಾಯಿಸಿ"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"ಆ್ಯಪ್ಗಳನ್ನು ಹುಡುಕಿ"</string>
@@ -114,8 +112,8 @@
<string name="disabled_app_label" msgid="6673129024321402780">"<xliff:g id="APP_NAME">%1$s</xliff:g> ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string>
<string name="dotted_app_label" msgid="1865617679843363410">"{count,plural, =1{{app_name} ಆ್ಯಪ್ # ಅಧಿಸೂಚನೆಯನ್ನು ಹೊಂದಿದೆ}one{{app_name} ಆ್ಯಪ್ # ಅಧಿಸೂಚನೆಗಳನ್ನು ಹೊಂದಿದೆ}other{{app_name} ಆ್ಯಪ್ # ಅಧಿಸೂಚನೆಗಳನ್ನು ಹೊಂದಿದೆ}}"</string>
<string name="default_scroll_format" msgid="7475544710230993317">"%2$d ರಲ್ಲಿ %1$d ಪುಟ"</string>
- <string name="workspace_scroll_format" msgid="8458889198184077399">"%2$d ರಲ್ಲಿ %1$d ಮುಖಪುಟದ ಪರದೆ"</string>
- <string name="workspace_new_page" msgid="257366611030256142">"ಹೊಸ ಮುಖಪುಟ ಪರದೆ"</string>
+ <string name="workspace_scroll_format" msgid="8458889198184077399">"%2$d ರಲ್ಲಿ %1$d ಮುಖಪುಟದ ಸ್ಕ್ರೀನ್"</string>
+ <string name="workspace_new_page" msgid="257366611030256142">"ಹೊಸ ಮುಖಪುಟ ಸ್ಕ್ರೀನ್"</string>
<string name="folder_opened" msgid="94695026776264709">"ಫೋಲ್ಡರ್ ತೆರೆಯಲಾಗಿದೆ, <xliff:g id="WIDTH">%1$d</xliff:g> ಬೈ <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
<string name="folder_tap_to_close" msgid="4625795376335528256">"ಫೋಲ್ಡರ್ ಮುಚ್ಚಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
<string name="folder_tap_to_rename" msgid="4017685068016979677">"ಮರುಹೆಸರನ್ನು ಉಳಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ್ದಾರೆ"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"ಹೋಮ್ ಸ್ಕ್ರೀನ್ ತಿರುಗುವಿಕೆಯನ್ನು ಅನುಮತಿಸಿ"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"ಫೋನ್ ತಿರುಗಿಸಿದಾಗ"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"ಲ್ಯಾಂಡ್ಸ್ಕೇಪ್ ಮೋಡ್"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"ಫೋನ್ ಅನ್ನು ಲ್ಯಾಂಡ್ಸ್ಕೇಪ್ ಮೋಡ್ಗೆ ಸೆಟ್ ಮಾಡಿ"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"ನೋಟಿಫಿಕೇಶನ್ ಡಾಟ್ಗಳು"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"ಆನ್ ಆಗಿದೆ"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"ಆಫ್ ಆಗಿದೆ"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"ಅಗಲವನ್ನು ಕಡಿಮೆ ಮಾಡಿ"</string>
<string name="action_decrease_height" msgid="282377193880900022">"ಎತ್ತರವನ್ನು ಕಡಿಮೆ ಮಾಡಿ"</string>
<string name="widget_resized" msgid="9130327887929620">"ವಿಜೆಟ್ ಅನ್ನು <xliff:g id="NUMBER_0">%1$s</xliff:g> ಅಗಲ <xliff:g id="NUMBER_1">%2$s</xliff:g> ಎತ್ತರಕ್ಕೆ ಮರುಗಾತ್ರಗೊಳಿಸಲಾಗಿದೆ"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"ಶಾರ್ಟ್ಕಟ್ಗಳು"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"ಶಾರ್ಟ್ಕಟ್ ಮೆನು"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"ವಜಾಗೊಳಿಸಿ"</string>
<string name="accessibility_close" msgid="2277148124685870734">"ಮುಚ್ಚಿರಿ"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"ವೈಯಕ್ತಿಕ"</string>
@@ -198,13 +194,12 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"ಅರ್ಥವಾಯಿತು"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"ಕೆಲಸಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಆ್ಯಪ್ಗಳನ್ನು ವಿರಾಮಗೊಳಿಸಿ"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"ವಿರಾಮವನ್ನು ರದ್ದುಗೊಳಿಸಿ"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"ಕೆಲಸಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಆ್ಯಪ್ಗಳ ವೇಳಾಪಟ್ಟಿ"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"ಫಿಲ್ಟರ್"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"ವಿಫಲವಾಗಿದೆ: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"ಖಾಸಗಿ ಸ್ಪೇಸ್"</string>
<string name="private_space_secondary_label" msgid="9203933341714508907">"ಸೆಟಪ್ ಮಾಡಲು ಅಥವಾ ತೆರೆಯಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
- <string name="ps_container_title" msgid="4391796149519594205">"ಖಾಸಗಿ"</string>
+ <string name="ps_container_title" msgid="4391796149519594205">"ಪ್ರೈವೆಟ್"</string>
<string name="ps_container_settings" msgid="6059734123353320479">"ಖಾಸಗಿ ಸ್ಪೇಸ್ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
<string name="ps_container_unlock_button_content_description" msgid="9181551784092204234">"ಖಾಸಗಿ, ಅನ್ಲಾಕ್ ಮಾಡಲಾಗಿದೆ."</string>
<string name="ps_container_lock_button_content_description" msgid="5961993384382649530">"ಖಾಸಗಿ, ಲಾಕ್ ಮಾಡಲಾಗಿದೆ."</string>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 4baba23..19e75d1 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s 앱 정보"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$s의 사용량 설정"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"새 창"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"창 관리"</string>
<string name="save_app_pair" msgid="5647523853662686243">"앱 페어링 저장"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"이 앱 페어링은 이 기기에서 지원되지 않습니다"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"메모"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"추가"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> 위젯 추가"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"모두 표시"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"모든 위젯 표시"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"모든 위젯 표시"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"탭하여 위젯 설정 변경"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"위젯 설정 변경"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"앱 검색"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"관리자가 사용 중지함"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"홈 화면 회전 허용"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"휴대전화 회전 시"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"가로 모드"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"휴대전화를 가로 모드로 설정"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"알림 표시 점"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"사용"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"사용 안함"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"폭 줄이기"</string>
<string name="action_decrease_height" msgid="282377193880900022">"높이 줄이기"</string>
<string name="widget_resized" msgid="9130327887929620">"폭 <xliff:g id="NUMBER_0">%1$s</xliff:g>, 높이 <xliff:g id="NUMBER_1">%2$s</xliff:g>로 위젯 크기 조정됨"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"바로가기"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"바로가기 메뉴"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"닫기"</string>
<string name="accessibility_close" msgid="2277148124685870734">"닫기"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"개인"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"확인"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"직장 앱 일시중지"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"일시중지 해제"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"직장 앱 일정"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"필터"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"실패: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"비공개 스페이스"</string>
diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml
index 83b0fa8..901b2bd 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s колдонмосу жөнүндө маалымат"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$s колдонмосун пайдалануу параметрлери"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Жаңы терезе"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Терезелерди тескөө"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Колдонмолорду сактап коюу"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Бул эки колдонмону бул түзмөктө бир маалда пайдаланууга болбойт"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Эскертме жазуу"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Кошуу"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> виджетин кошуу"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Баарын көрсөтүү"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Виджеттин баарын көрсөтүү"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Бардык виджеттерди көрсөтүү"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Виджеттин параметрлерин өзгөртүү үчүн таптап коюңуз"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Виджеттин параметрлерин өзгөртүү"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Колдонмолорду издөө"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Администраторуңуз өчүрүп койгон"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Башкы экранды бурууга уруксат берүү"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Телефон бурулганда"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Туурасынан"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Телефонду туурасынан коюңуз"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Билдирмелер белгилери"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Күйүк"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Өчүк"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Ичкертүү"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Жапыздатуу"</string>
<string name="widget_resized" msgid="9130327887929620">"Виджеттин кеңдиги <xliff:g id="NUMBER_0">%1$s</xliff:g> бийиктиги <xliff:g id="NUMBER_1">%2$s</xliff:g> болду"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Кыска жолдор"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Ыкчам баскычтын менюсу"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Этибарга албоо"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Жабуу"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Жеке колдонмолор"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"Түшүндүм"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Жумуш колдонмолорун тындыруу"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Улантуу"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Жумуш колдонмолорунун графиги"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Чыпкалоо"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Аткарылган жок: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Жеке мейкиндик"</string>
diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml
index 767c574..f01dc67 100644
--- a/res/values-lo/strings.xml
+++ b/res/values-lo/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"ຂໍ້ມູນແອັບສຳລັບ %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"ການຕັ້ງຄ່າການນຳໃຊ້ສຳລັບ %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"ໜ້າຈໍໃໝ່"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"ຈັດການໜ້າຈໍ"</string>
<string name="save_app_pair" msgid="5647523853662686243">"ບັນທຶກຈັບຄູ່ແອັບ"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"ການຈັບຄູ່ແອັບນີ້ບໍ່ຮອງຮັບຢູ່ອຸປະກອນນີ້"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"ການຈົດບັນທຶກ"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"ເພີ່ມ"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"ເພີ່ມວິດເຈັດ <xliff:g id="WIDGET_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"ສະແດງທັງໝົດ"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"ສະແດງວິດເຈັດທັງໝົດ"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"ກໍາລັງສະແດງວິດເຈັດທັງໝົດ"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"ແຕະເພື່ອປ່ຽນການຕັ້ງຄ່າວິດເຈັດ"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"ປ່ຽນການຕັ້ງຄ່າວິດເຈັດ"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"ຊອກຫາແອັບ"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"ຖືກປິດການນຳໃຊ້ໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"ອະນຸຍາດໃຫ້ໝຸນໜ້າຈໍຢູ່ໂຮມສະກຣີນໄດ້"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"ເມື່ອໝຸນໂທລະສັບ"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"ໂໝດແນວນອນ"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"ຕັ້ງຄ່າໂທລະສັບເປັນໂໝດແນວນອນ"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"ຈຸດການແຈ້ງເຕືອນ"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"ເປີດ"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"ປິດ"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"ຫຼຸດລວງກ້ວາງລົງ"</string>
<string name="action_decrease_height" msgid="282377193880900022">"ຫຼຸດລວງສູງລົງ"</string>
<string name="widget_resized" msgid="9130327887929620">"ປ່ຽນຂະໜາດວິດເຈັດເປັນລວງກ້ວາງ <xliff:g id="NUMBER_0">%1$s</xliff:g> ລວງສູງ <xliff:g id="NUMBER_1">%2$s</xliff:g> ແລ້ວ"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"ທາງລັດ"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"ເມນູທາງລັດ"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"ປິດໄວ້"</string>
<string name="accessibility_close" msgid="2277148124685870734">"ປິດ"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"ສ່ວນຕົວ"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"ເຂົ້າໃຈແລ້ວ"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"ຢຸດແອັບບ່ອນເຮັດວຽກຊົ່ວຄາວ"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"ຍົກເລີກການຢຸດຊົ່ວຄາວ"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"ກຳນົດເວລາຂອງແອັບບ່ອນເຮັດວຽກ"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"ກັ່ນຕອງ"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"ບໍ່ສຳເລັດ: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"ພື້ນທີ່ສ່ວນຕົວ"</string>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 08b603d..f5e21de 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Programos „%1$s“ informacija"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"„%1$s“ naudojimo nustatymai"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Naujas langas"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Tvarkyti langus"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Išsaugoti programų porą"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Ši programų pora šiame įrenginyje nepalaikoma"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Užrašų kūrimas"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Pridėti"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Pridėti valdiklį: <xliff:g id="WIDGET_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Rodyti viską"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Rodyti visus valdiklius"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Rodomi visi valdikliai"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Palieskite, kad pakeistumėte valdiklio nustatymus"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Pakeisti valdiklio nustatymus"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Paieškos programos"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Išjungė administratorius"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Leisti pasukti pagrindinį ekraną"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Kai telefonas pasukamas"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Gulsčiojo ekrano režimas"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Nustatykite telefoną į gulsčiojo ekrano režimą"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Pranešimų taškai"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Įjungta"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Išjungta"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Sumažinti plotį"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Sumažinti aukštį"</string>
<string name="widget_resized" msgid="9130327887929620">"Valdiklio dydis pakeistas: plotis – <xliff:g id="NUMBER_0">%1$s</xliff:g>, aukštis – <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Spartieji klavišai"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Sparčiųjų klavišų meniu"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Atsisakyti"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Uždaryti"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Asmeninės"</string>
@@ -198,13 +194,12 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"Supratau"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Pristabdyti darbo programas"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Atšaukti pristabdymą"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Darbo programų tvarkaraštis"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filtruoti"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Nepavyko: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Privati erdvė"</string>
<string name="private_space_secondary_label" msgid="9203933341714508907">"Palieskite, kad nustatytumėte arba atidarytumėte"</string>
- <string name="ps_container_title" msgid="4391796149519594205">"Privatus"</string>
+ <string name="ps_container_title" msgid="4391796149519594205">"Privati"</string>
<string name="ps_container_settings" msgid="6059734123353320479">"Privačios erdvės nustatymai"</string>
<string name="ps_container_unlock_button_content_description" msgid="9181551784092204234">"Privatus, atrakintas."</string>
<string name="ps_container_lock_button_content_description" msgid="5961993384382649530">"Privatus, užrakintas."</string>
diff --git a/res/values-lv/strings.xml b/res/values-lv/strings.xml
index e02abe0..3eafd9a 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s: informācija par lietotni"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Lietojuma iestatījumi: %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Jauns logs"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Pārvaldīt logus"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Saglabāt lietotņu pāri"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Šis lietotņu pāris netiek atbalstīts šajā ierīcē"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Piezīmju pierakstīšana"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Pievienot"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Pievienot logrīku <xliff:g id="WIDGET_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Rādīt visus"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Rādīt visus logrīkus"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Tiek rādīti visi logrīki"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Pieskarieties, lai mainītu logrīka iestatījumus."</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Mainīt logrīka iestatījumus"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Meklēt lietotnes"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Atspējojis administrators"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Atļaut sākuma ekrāna pagriešanu"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Pagriežot tālruni"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Ainavas režīms"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Iestatīt tālrunī ainavas režīmu"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Paziņojumu punkti"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Ieslēgti"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Izslēgts"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Samazināt platumu"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Samazināt augstumu"</string>
<string name="widget_resized" msgid="9130327887929620">"Logrīka lielums mainīts — platums: <xliff:g id="NUMBER_0">%1$s</xliff:g>, augstums: <xliff:g id="NUMBER_1">%2$s</xliff:g>."</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Saīsnes"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Saīsnes izvēlne"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Nerādīt"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Aizvērt"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personīgās lietotnes"</string>
@@ -198,13 +194,12 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"Labi"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Pārtraukt darba lietotņu darbību"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Atsākt"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Darba lietotņu grafiks"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filtrs"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Neizdevās: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Privātā telpa"</string>
<string name="private_space_secondary_label" msgid="9203933341714508907">"Pieskarieties, lai iestatītu vai atvērtu"</string>
- <string name="ps_container_title" msgid="4391796149519594205">"Privātā mape"</string>
+ <string name="ps_container_title" msgid="4391796149519594205">"Privātā telpa"</string>
<string name="ps_container_settings" msgid="6059734123353320479">"Privātās mapes iestatījumi"</string>
<string name="ps_container_unlock_button_content_description" msgid="9181551784092204234">"Privāta un nav bloķēta."</string>
<string name="ps_container_lock_button_content_description" msgid="5961993384382649530">"Privāta un bloķēta."</string>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
index e524d82..2b85e12 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Податоци за апликација за %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Поставки за користење за %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Нов прозорец"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Управувајте со прозорците"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Зачувај го парот апликации"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Паров апликации не е поддржан на уредов"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Фаќање белешки"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Додај"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Додај го виџетот <xliff:g id="WIDGET_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Прикажи ги сите"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Прикажи ги сите виџети"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Се прикажуваат сите виџети"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Допрете за да ги промените поставките за виџетот"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Промени ги поставките за виџетот"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Пребарувајте апликации"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Оневозможено од администраторот"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Дозволи ротирање на почетниот екран"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Кога телефонот се ротира"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Хоризонтален режим"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Поставете го телефонот во „Хоризонтален режим“"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Точки за известување"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Вклучено"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Исклучено"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Намали ширина"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Намали висина"</string>
<string name="widget_resized" msgid="9130327887929620">"Големината на виџетот е променета на ширина <xliff:g id="NUMBER_0">%1$s</xliff:g> висина <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Кратенки"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Мени за кратенки"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Отфрли"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Затвори"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Лично"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"Сфатив"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Паузирај ги работните апликации"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Прекини ја паузата"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Распоред на работните апликации"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Филтер"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Не успеа: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Приватен простор"</string>
diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml
index e273e14..df98b72 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s എന്നതിന്റെ ആപ്പ് വിവരങ്ങൾ"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$s എന്നതിനുള്ള ഉപയോഗ ക്രമീകരണം"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"പുതിയ വിന്ഡോ"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"വിൻഡോകൾ മാനേജ് ചെയ്യുക"</string>
<string name="save_app_pair" msgid="5647523853662686243">"ആപ്പ് ജോടി സംരക്ഷിക്കുക"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"ഈ ഉപകരണത്തിൽ ഈ ആപ്പ് ജോടിക്ക് പിന്തുണയില്ല"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"കുറിപ്പ് രേഖപ്പെടുത്തൽ"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"ചേർക്കുക"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> വിജറ്റ് ചേർക്കുക"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"എല്ലാം കാണിക്കൂ"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"എല്ലാ വിജറ്റും കാണിക്കുക"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"എല്ലാ വിജറ്റുകളും കാണിക്കുന്നു"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"വിജറ്റ് ക്രമീകരണം മാറ്റാൻ ടാപ്പ് ചെയ്യുക"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"വിജറ്റ് ക്രമീകരണം മാറ്റുക"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"ആപ്പുകൾ തിരയുക"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"അഡ്മിൻ പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"ഹോം സ്ക്രീൻ റൊട്ടേഷൻ അനുവദിക്കുക"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"ഫോൺ തിരിച്ച നിലയിലായിരിക്കുമ്പോൾ"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"ലാൻഡ്സ്കേപ്പ് മോഡ്"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"ഫോൺ ലാൻഡ്സ്കേപ്പ് മോഡിലേക്ക് സജ്ജീകരിക്കുക"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"അറിയിപ്പ് ഡോട്ടുകൾ"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"ഓണാണ്"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"ഓഫാണ്"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"വീതി കുറയ്ക്കുക"</string>
<string name="action_decrease_height" msgid="282377193880900022">"ഉയരം കുറയ്ക്കുക"</string>
<string name="widget_resized" msgid="9130327887929620">"വീതി <xliff:g id="NUMBER_0">%1$s</xliff:g> ഉയരം <xliff:g id="NUMBER_1">%2$s</xliff:g>-ലേക്ക് വിഡ്ജെറ്റിന്റെ വലുപ്പം മാറ്റി"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"കുറുക്കുവഴികൾ"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"കുറുക്കുവഴി മെനു"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"നിരസിക്കുക"</string>
<string name="accessibility_close" msgid="2277148124685870734">"അടയ്ക്കൂ"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"വ്യക്തിപരം"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"മനസ്സിലായി"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"ഔദ്യോഗിക ആപ്പുകൾ താൽക്കാലികമായി നിർത്തുക"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"താൽക്കാലികമായി നിർത്തിയത് മാറ്റുക"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"ഔദ്യോഗിക ആപ്പുകൾക്കുള്ള ഷെഡ്യൂൾ"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"ഫിൽട്ടർ ചെയ്യുക"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"പരാജയപ്പെട്ടു: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"സ്വകാര്യ സ്പേസ്"</string>
diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml
index 7e5ed73..9fdaf13 100644
--- a/res/values-mn/strings.xml
+++ b/res/values-mn/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s-н аппын мэдээлэл"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$s-н ашиглалтын тохиргоо"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Шинэ цонх"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Цонхнуудыг удирдах"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Апп хослуулалтыг хадгалах"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Энэ апп хослуулалтыг уг төхөөрөмж дээр дэмждэггүй"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Тэмдэглэл хөтлөх"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Нэмэх"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> виджетийг нэмэх"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Бүгдийг харуул"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Бүх виджетийг харуулах"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Бүх виджетийг харуулж байна"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Жижиг хэрэгслийн тохиргоог өөрчлөхийн тулд товшино уу"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Жижиг хэрэгслийн тохиргоог өөрчлөх"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Апп хайх"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Таны админ идэвхгүй болгосон"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Үндсэн нүүрийг эргүүлэхийг зөвшөөрөх"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Утсыг эргүүлсэн үед"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Хэвтээ горим"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Утсыг хэвтээ горимд тохируулах"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Мэдэгдлийн цэг"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Асаалттай"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Унтраалттай"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Нарийсгах"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Намсгах"</string>
<string name="widget_resized" msgid="9130327887929620">"Виджэтийн өргөн <xliff:g id="NUMBER_0">%1$s</xliff:g>, өндөр <xliff:g id="NUMBER_1">%2$s</xliff:g> болсон"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Товчлол"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Товчлолын цэс"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Хаах"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Хаах"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Хувийн"</string>
@@ -198,13 +194,12 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"Ойлголоо"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Ажлын аппуудыг түр зогсоох"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Түр зогсоохоо болих"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Ажлын аппуудын хуваарь"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Шүүлтүүр"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Амжилтгүй болсон: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Хувийн орон зай"</string>
<string name="private_space_secondary_label" msgid="9203933341714508907">"Тохируулах эсвэл нээхийн тулд товших"</string>
- <string name="ps_container_title" msgid="4391796149519594205">"Хувийн"</string>
+ <string name="ps_container_title" msgid="4391796149519594205">"Хаалттай"</string>
<string name="ps_container_settings" msgid="6059734123353320479">"Private Space-н тохиргоо"</string>
<string name="ps_container_unlock_button_content_description" msgid="9181551784092204234">"Хувийн, түгжээг тайлсан."</string>
<string name="ps_container_lock_button_content_description" msgid="5961993384382649530">"Хувийн, түгжээтэй."</string>
diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml
index b5d4f71..e596193 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s साठी ॲपशी संबंधित माहिती"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$s साठी वापरासंबंधित सेटिंग्ज"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"नवीन विंडो"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"विंडो व्यवस्थापित करा"</string>
<string name="save_app_pair" msgid="5647523853662686243">"ॲपची जोडी सेव्ह करा"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"या ॲपची जोडीला या डिव्हाइसवर सपोर्ट नाही"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"टिपा घेणे"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"जोडा"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> विजेट जोडा"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"सर्व दाखवा"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"सर्व विजेट दाखवा"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"सर्व विजेट दाखवत आहे"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"विजेट सेटिंग्ज बदलण्यासाठी टॅप करा"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"विजेट सेटिंग्ज बदला"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"अॅप्स शोधा"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"आपल्या प्रशासकाने अक्षम केले"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"होम स्क्रीन फिरवण्याची अनुमती द्या"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"फोन फिरवला जातो तेव्हा"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"लँडस्केप मोड"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"फोन लँडस्केप मोडमध्ये सेट करा"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"नोटिफिकेशन डॉट"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"सुरू"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"बंद"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"रुंदी कमी करा"</string>
<string name="action_decrease_height" msgid="282377193880900022">"उंची कमी करा"</string>
<string name="widget_resized" msgid="9130327887929620">"विजेटचा आकार रुंदी <xliff:g id="NUMBER_0">%1$s</xliff:g> उंची <xliff:g id="NUMBER_1">%2$s</xliff:g> मध्ये बदलला"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"शॉर्टकट"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"शॉर्टकट मेनू"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"डिसमिस करा"</string>
<string name="accessibility_close" msgid="2277148124685870734">"बंद करा"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"वैयक्तिक"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"समजले"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"कार्य ॲप्स थांबवा"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"अनपॉझ करा"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Work apps साठी शेड्यूल"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"फिल्टर"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"हे करता आले नाही: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"खाजगी स्पेस"</string>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index a48d518..91c85de 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Maklumat apl untuk %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Tetapan penggunaan sebanyak %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Tetingkap Baharu"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Urus Tetingkap"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Simpan gandingan apl"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Gandingan apl ini tidak disokong pada peranti ini"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Pengambilan nota"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Tambah"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Tambahkan widget <xliff:g id="WIDGET_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Tunjukkan semua"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Tunjukkan semua widget"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Menunjukkan semua widget"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Ketik untuk menukar tetapan widget"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Tukar tetapan widget"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Cari apl"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Dilumpuhkan oleh pentadbir anda"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Benarkan putaran skrin utama"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Apabila telefon diputar"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Mod landskap"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Tetapkan telefon kepada mod landskap"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Titik pemberitahuan"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Hidup"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Mati"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Kurangkan kelebaran"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Kurangkan ketinggian"</string>
<string name="widget_resized" msgid="9130327887929620">"Saiz widget diubah menjadi <xliff:g id="NUMBER_0">%1$s</xliff:g> lebar <xliff:g id="NUMBER_1">%2$s</xliff:g> tinggi"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Pintasan"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Menu Pintasan"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Ketepikan"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Tutup"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Peribadi"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"OK"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Jeda apl kerja"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Nyahjeda"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Jadual apl kerja"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Tapis"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Gagal: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Ruang persendirian"</string>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index f892a1b..8ed7980 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s အတွက် အက်ပ်အချက်အလက်"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$s အတွက် အသုံးပြုမှုဆက်တင်များ"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"ဝင်းဒိုးအသစ်"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"ဝင်းဒိုးများ စီမံရန်"</string>
<string name="save_app_pair" msgid="5647523853662686243">"အက်ပ်တွဲချိတ်ခြင်း သိမ်းရန်"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"ဤအက်ပ်တွဲချိတ်ခြင်းကို ဤစက်တွင် ပံ့ပိုးမထားပါ"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"မှတ်စုလိုက်ခြင်း"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"ထည့်ရန်"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> ဝိဂျက်ထည့်ရန်"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"အားလုံးပြပါ"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"ဝိဂျက်အားလုံး ပြပါ"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"ဝိဂျက်အားလုံးကို ပြထားသည်"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"ဝိဂျက် ဆက်တင်များကို ပြောင်းရန် တို့ပါ"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"ဝိဂျက် ဆက်တင်များကို ပြောင်းပါ"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"ရှာဖွေမှု အက်ပ်များ"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"သင့်စီမံခန့်ခွဲသူက ပိတ်လိုက်ပါသည်"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"ပင်မစာမျက်နှာလှည့်ခြင်းကို ခွင့်ပြုခြင်း"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"ဖုန်းကိုလှည့်ထားစဉ်"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"အလျားလိုက်"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"ဖုန်းကို အလျားလိုက်သို့ သတ်မှတ်နိုင်သည်"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"သတိပေးချက် အစက်များ"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"ဖွင့်"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"ပိတ်"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"အကျယ်အား လျှော့ပါ"</string>
<string name="action_decrease_height" msgid="282377193880900022">"အမြင့်အား လျှော့ပါ"</string>
<string name="widget_resized" msgid="9130327887929620">"Widget အား အကျယ် <xliff:g id="NUMBER_0">%1$s</xliff:g> အမြင့် <xliff:g id="NUMBER_1">%2$s</xliff:g> အရွယ်အစားပြန်လည်ချိန်ညှိပြီး၏"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"ဖြတ်လမ်းများ"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"ဖြတ်လမ်းလင့်ခ် မီနူး"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"ပယ်ရန်"</string>
<string name="accessibility_close" msgid="2277148124685870734">"ပိတ်ရန်"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"ကိုယ်ပိုင်"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"နားလည်ပြီ"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"အလုပ်သုံးအက်ပ်များကို ခဏရပ်ရန်"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"ပြန်ဖွင့်ရန်"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"အလုပ်သုံးအက်ပ်များ အချိန်ဇယား"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"စစ်ထုတ်ရန်"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"မအောင်မြင်ပါ− <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"သီးသန့်ချတ်ခန်း"</string>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index b9b69a0..fa7a047 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Appinformasjon for %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Bruksinnstillinger for %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Nytt vindu"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Administrer vinduene"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Lagre app-paret"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Denne apptilkoblingen støttes ikke på denne enheten"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Notatskriving"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Legg til"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Legg til <xliff:g id="WIDGET_NAME">%1$s</xliff:g>-modulen"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Vis alle"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Vis alle moduler"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Viser alle moduler"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Trykk for å endre modulinnstillinger"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Endre modulinnstillinger"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Søk etter apper"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Administratoren har slått av funksjonen"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Tillat at startskjermen roterer"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Når telefonen roteres"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Liggende retning"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Plasser telefonen i liggende retning"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Varselsprikker"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"På"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Av"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Reduser bredden"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Reduser høyden"</string>
<string name="widget_resized" msgid="9130327887929620">"Størrelsen på modulen er endret til bredde <xliff:g id="NUMBER_0">%1$s</xliff:g> og høyde <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Snarveier"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Hurtigtastmeny"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Avvis"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Lukk"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personlig"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"Greit"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Sett jobbapper på pause"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Gjenoppta"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Tidsplan for jobbapper"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filter"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Mislyktes: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Privat område"</string>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
index 6f93761..86ebc7b 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s का हकमा एपसम्बन्धी जानकारी"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$s को प्रयोगसम्बन्धी सेटिङ"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"नयाँ विन्डो"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"विन्डोहरू व्यवस्थापन गर्नुहोस्"</string>
<string name="save_app_pair" msgid="5647523853662686243">"एपको पेयर सेभ गर्नुहोस्"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"यस डिभाइसमा यो एप पेयर प्रयोग गर्न मिल्दैन"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"नोट लेख्ने कार्य"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"हाल्नुहोस्"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> विजेट हाल्नुहोस्"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"सबै देखाउनुहोस्"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"सबै विजेटहरू देखाउनुहोस्"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"सबै विजेटहरू देखाइँदै छन्"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"विजेटका सेटिङ बदल्न ट्याप गर्नुहोस्"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"विजेटका सेटिङ बदल्नुहोस्"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"एपहरू खोज्नुहोस्"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"तपाईँको प्रशासकद्वारा असक्षम गरिएको"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"होम स्क्रिन रोटेट हुन दिइयोस्"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"फोन घुमाउँदा"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"ल्यान्डस्केप मोड"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"फोनमा ल्यान्डस्केप मोड अन गर्नुहोस्"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"नोटिफिकेसन डट"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"सक्रिय"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"निष्क्रिय"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"चौडाइ घटाउनुहोस्"</string>
<string name="action_decrease_height" msgid="282377193880900022">"उँचाइ घटाउनुहोस्"</string>
<string name="widget_resized" msgid="9130327887929620">"विजेट चौडाइ <xliff:g id="NUMBER_0">%1$s</xliff:g> उचाइ <xliff:g id="NUMBER_1">%2$s</xliff:g> मा पुनः आकार मिलाइयो"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"सर्टकटहरू"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"सर्टकटसम्बन्धी मेनु"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"खारेज गर्नुहोस्"</string>
<string name="accessibility_close" msgid="2277148124685870734">"बन्द गर्नुहोस्"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"व्यक्तिगत"</string>
@@ -198,13 +194,12 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"बुझेँ"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"कामसम्बन्धी एपहरू पज गर्नुहोस्"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"सुचारु गर्नुहोस्"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"कामसम्बन्धी एपहरूको समयतालिका"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"फिल्टर"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"कार्य पूरा गर्न सकिएन: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"निजी स्पेस"</string>
<string name="private_space_secondary_label" msgid="9203933341714508907">"सेटअप गर्न वा खोल्न ट्याप गर्नुहोस्"</string>
- <string name="ps_container_title" msgid="4391796149519594205">"निजी"</string>
+ <string name="ps_container_title" msgid="4391796149519594205">"निजी स्पेस"</string>
<string name="ps_container_settings" msgid="6059734123353320479">"निजी स्पेससम्बन्धी सेटिङ"</string>
<string name="ps_container_unlock_button_content_description" msgid="9181551784092204234">"निजी, अनलक गरिएको।"</string>
<string name="ps_container_lock_button_content_description" msgid="5961993384382649530">"निजी, लक गरिएको।"</string>
diff --git a/res/values-night/colors.xml b/res/values-night/colors.xml
index 887a2a5..004f12f 100644
--- a/res/values-night/colors.xml
+++ b/res/values-night/colors.xml
@@ -17,4 +17,50 @@
<resources>
<color name="material_color_surface_container_lowest">#0D0E11</color>
<color name="material_color_on_surface">#E3E2E6</color>
+
+ <color name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</color>
+ <color name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</color>
+ <color name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</color>
+ <color name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</color>
+ <color name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</color>
+ <color name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</color>
+ <color name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</color>
+ <color name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</color>
+ <color name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</color>
+ <color name="materialColorOnErrorContainer">@color/system_on_error_container_dark</color>
+ <color name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</color>
+ <color name="materialColorInverseOnSurface">@color/system_on_surface_light</color>
+ <color name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</color>
+ <color name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</color>
+ <color name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</color>
+ <color name="materialColorSecondaryContainer">@color/system_secondary_container_dark</color>
+ <color name="materialColorErrorContainer">@color/system_error_container_dark</color>
+ <color name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</color>
+ <color name="materialColorInversePrimary">@color/system_primary_light</color>
+ <color name="materialColorSecondaryFixed">@color/system_secondary_fixed</color>
+ <color name="materialColorInverseSurface">@color/system_surface_light</color>
+ <color name="materialColorSurfaceVariant">@color/system_surface_variant_dark</color>
+ <color name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</color>
+ <color name="materialColorTertiaryFixed">@color/system_tertiary_fixed</color>
+ <color name="materialColorPrimaryContainer">@color/system_primary_container_dark</color>
+ <color name="materialColorOnBackground">@color/system_on_background_dark</color>
+ <color name="materialColorPrimaryFixed">@color/system_primary_fixed</color>
+ <color name="materialColorOnSecondary">@color/system_on_secondary_dark</color>
+ <color name="materialColorOnTertiary">@color/system_on_tertiary_dark</color>
+ <color name="materialColorSurfaceDim">@color/system_surface_dim_dark</color>
+ <color name="materialColorSurfaceBright">@color/system_surface_bright_dark</color>
+ <color name="materialColorOnError">@color/system_on_error_dark</color>
+ <color name="materialColorSurface">@color/system_surface_dark</color>
+ <color name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</color>
+ <color name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</color>
+ <color name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</color>
+ <color name="materialColorOutline">@color/system_outline_dark</color>
+ <color name="materialColorOutlineVariant">@color/system_outline_variant_dark</color>
+ <color name="materialColorOnPrimary">@color/system_on_primary_dark</color>
+ <color name="materialColorOnSurface">@color/system_on_surface_dark</color>
+ <color name="materialColorSurfaceContainer">@color/system_surface_container_dark</color>
+ <color name="materialColorPrimary">@color/system_primary_dark</color>
+ <color name="materialColorSecondary">@color/system_secondary_dark</color>
+ <color name="materialColorTertiary">@color/system_tertiary_dark</color>
+ <color name="materialColorError">@color/system_error_dark</color>
</resources>
\ No newline at end of file
diff --git a/res/values-night/styles.xml b/res/values-night/styles.xml
index a891e39..89b635d 100644
--- a/res/values-night/styles.xml
+++ b/res/values-night/styles.xml
@@ -27,51 +27,6 @@
</style>
<style name="DynamicColorsBaseLauncherTheme" parent="@style/BaseLauncherTheme">
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_dark</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_dark</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_dark</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_dark</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_dark</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_dark</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorInverseOnSurface">@color/system_on_surface_light</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_dark</item>
- <item name="materialColorErrorContainer">@color/system_error_container_dark</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorInversePrimary">@color/system_primary_light</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorInverseSurface">@color/system_surface_light</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_dark</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_dark</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_dark</item>
- <item name="materialColorOnBackground">@color/system_on_background_dark</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_dark</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_dark</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_dark</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_dark</item>
- <item name="materialColorOnError">@color/system_on_error_dark</item>
- <item name="materialColorSurface">@color/system_surface_dark</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_dark</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_dark</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_dark</item>
- <item name="materialColorOutline">@color/system_outline_dark</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_dark</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_dark</item>
- <item name="materialColorOnSurface">@color/system_on_surface_dark</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_dark</item>
- <item name="materialColorPrimary">@color/system_primary_dark</item>
- <item name="materialColorSecondary">@color/system_secondary_dark</item>
- <item name="materialColorTertiary">@color/system_tertiary_dark</item>
- <item name="materialColorError">@color/system_error_dark</item>
</style>
<style name="WidgetPickerActivityTheme" parent="@android:style/Theme.DeviceDefault.DayNight">
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index a38971f..1e3e166 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"App-info voor %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Gebruiksinstellingen voor %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Nieuw venster"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Vensters beheren"</string>
<string name="save_app_pair" msgid="5647523853662686243">"App-paar opslaan"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Dit app-paar wordt niet ondersteund op dit apparaat"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Aantekeningen maken"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Toevoegen"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Widget <xliff:g id="WIDGET_NAME">%1$s</xliff:g> toevoegen"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Alles tonen"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Alle widgets tonen"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Alle widgets worden getoond"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Tik om de widgetinstellingen te wijzigen"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Widgetinstellingen wijzigen"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Apps zoeken"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Uitgezet door je beheerder"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Draaien van startscherm toestaan"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Als de telefoon gedraaid is"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Liggende modus"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Telefoon instellen op liggende modus"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Meldingsstipjes"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Aan"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Uit"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Breedte verkleinen"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Hoogte verkleinen"</string>
<string name="widget_resized" msgid="9130327887929620">"Formaat van widget gewijzigd in breedte <xliff:g id="NUMBER_0">%1$s</xliff:g> en hoogte <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Snelkoppelingen"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Snelmenu"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Sluiten"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Sluiten"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Privé"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"OK"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Werk-apps pauzeren"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Hervatten"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Planning voor werk-apps"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filteren"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Mislukt: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Privéruimte"</string>
diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml
index a20e0fc..f8d68ae 100644
--- a/res/values-or/strings.xml
+++ b/res/values-or/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s ପାଇଁ ଆପ ସୂଚନା"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$s ପାଇଁ ବ୍ୟବହାର ସେଟିଂସ"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"ନୂଆ ୱିଣ୍ଡୋ"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"ୱିଣ୍ଡୋଗୁଡ଼ିକୁ ପରିଚାଳନା କରନ୍ତୁ"</string>
<string name="save_app_pair" msgid="5647523853662686243">"ଆପ ପେୟାର ସେଭ କରନ୍ତୁ"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"ଏହି ଆପ ପେୟାର ଏ ଡିଭାଇସରେ ସମର୍ଥିତ ନୁହେଁ"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"ନୋଟ-ଟେକିଂ"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"ଯୋଗ କରନ୍ତୁ"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> ୱିଜେଟ ଯୋଗ କରନ୍ତୁ"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"ସବୁ ଦେଖାନ୍ତୁ"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"ସମସ୍ତ ୱିଜେଟ ଦେଖାନ୍ତୁ"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"ସମସ୍ତ ୱିଜେଟ ଦେଖାଉଛି"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"ୱିଜେଟ ସେଟିଂସ ପରିବର୍ତ୍ତନ କରିବାକୁ ଟାପ କରନ୍ତୁ"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"ୱିଜେଟ ସେଟିଂସ ପରିବର୍ତ୍ତନ କରନ୍ତୁ"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"ଆପ ସର୍ଚ୍ଚ କରନ୍ତୁ"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"ଆପଣଙ୍କ ଆଡମିନଙ୍କ ଦ୍ୱାରା ଅକ୍ଷମ କରାଯାଇଛି"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"ହୋମ ସ୍କ୍ରିନ ରୋଟେସନକୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"ଯେତେବେଳେ ଫୋନକୁ ରୋଟେଟ କରାଯାଇଥାଏ"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"ଲେଣ୍ଡସ୍କେପ ମୋଡ"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"ଫୋନକୁ ଲେଣ୍ଡସ୍କେପ ମୋଡରେ ସେଟ କରନ୍ତୁ"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"ବିଜ୍ଞପ୍ତି ଡଟ୍ସ"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"ଚାଲୁ"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"ବନ୍ଦ କରନ୍ତୁ"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"ଚଉଡ଼ା କମ୍ କରନ୍ତୁ"</string>
<string name="action_decrease_height" msgid="282377193880900022">"ଉଚ୍ଚତା କମ୍ କରନ୍ତୁ"</string>
<string name="widget_resized" msgid="9130327887929620">"ୱିଜେଟକୁ <xliff:g id="NUMBER_0">%1$s</xliff:g> ଓସାର ଓ <xliff:g id="NUMBER_1">%2$s</xliff:g> ଉଚ୍ଚରେ ପୁନଃଆକାର ଦିଆଗଲା"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"ଶର୍ଟକଟ୍"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"ସର୍ଟକଟ ମେନୁ"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"ଖାରଜ କରନ୍ତୁ"</string>
<string name="accessibility_close" msgid="2277148124685870734">"ବନ୍ଦ କରନ୍ତୁ"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"ବ୍ୟକ୍ତିଗତ"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"ବୁଝିଗଲି"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"ୱାର୍କ ଆପ୍ସ ବିରତ କରନ୍ତୁ"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"ପୁଣି ଚାଲୁ କରନ୍ତୁ"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"ୱାର୍କ ଆପ୍ସ ସିଡୁଲ"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"ଫିଲ୍ଟର୍"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"ବିଫଳ ହୋଇଛି: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"ପ୍ରାଇଭେଟ ସ୍ପେସ"</string>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index 65187bf..07aae76 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s ਲਈ ਐਪ ਜਾਣਕਾਰੀ"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$s ਲਈ ਵਰਤੋਂ ਸੈਟਿੰਗਾਂ"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"ਨਵੀਂ ਵਿੰਡੋ"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"ਵਿੰਡੋਆਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ"</string>
<string name="save_app_pair" msgid="5647523853662686243">"ਐਪ ਜੋੜਾਬੱਧ ਰੱਖਿਅਤ ਕਰੋ"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"ਇਸ ਐਪ ਜੋੜਾਬੱਧ ਦਾ ਇਸ ਡੀਵਾਈਸ \'ਤੇ ਸਮਰਥਨ ਨਹੀਂ ਕੀਤਾ ਜਾਂਦਾ"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"ਨੋਟ ਬਣਾਉਣਾ"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"ਸ਼ਾਮਲ ਕਰੋ"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> ਵਿਜੇਟ ਸ਼ਾਮਲ ਕਰੋ"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"ਸਭ ਦਿਖਾਓ"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"ਸਭ ਵਿਜੇਟ ਦਿਖਾਓ"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"ਸਭ ਵਿਜੇਟ ਦਿਖਾਏ ਜਾ ਰਹੇ ਹਨ"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"ਵਿਜੇਟ ਸੈਟਿੰਗਾਂ ਨੂੰ ਬਦਲਣ ਲਈ ਟੈਪ ਕਰੋ"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"ਵਿਜੇਟ ਸੈਟਿੰਗਾਂ ਬਦਲੋ"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"ਐਪਾਂ ਖੋਜੋ"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਦੁਆਰਾ ਅਯੋਗ ਬਣਾਈ ਗਈ"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"ਹੋਮ ਸਕ੍ਰੀਨ ਨੂੰ ਘੁਮਾਉਣ ਦੀ ਆਗਿਆ ਦਿਓ"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"ਜਦੋਂ ਫ਼ੋਨ ਘੁਮਾਇਆ ਜਾਂਦਾ ਹੈ"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"ਲੈਂਡਸਕੇਪ ਮੋਡ"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"ਫ਼ੋਨ ਨੂੰ ਲੈਂਡਸਕੇਪ ਮੋਡ ਵਿੱਚ ਸੈੱਟ ਕਰੋ"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"ਸੂਚਨਾ ਬਿੰਦੂ"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"ਚਾਲੂ"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"ਬੰਦ"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"ਚੌੜਾਈ ਘਟਾਓ"</string>
<string name="action_decrease_height" msgid="282377193880900022">"ਉਂਚਾਈ ਘਟਾਓ"</string>
<string name="widget_resized" msgid="9130327887929620">"ਵਿਜੈਟ ਨੂੰ ਚੌੜਾਈ <xliff:g id="NUMBER_0">%1$s</xliff:g> ਉਂਚਾਈ <xliff:g id="NUMBER_1">%2$s</xliff:g> ਨੂੰ ਮੁੜ ਆਕਾਰ ਦਿੱਤਾ"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"ਸ਼ਾਰਟਕੱਟ"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"ਸ਼ਾਰਟਕੱਟ ਮੀਨੂ"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"ਖਾਰਜ ਕਰੋ"</string>
<string name="accessibility_close" msgid="2277148124685870734">"ਬੰਦ ਕਰੋ"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"ਨਿੱਜੀ"</string>
@@ -198,13 +194,12 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"ਸਮਝ ਲਿਆ"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"ਕੰਮ ਸੰਬੰਧੀ ਐਪਾਂ ਰੋਕੋ"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"ਰੋਕ ਹਟਾਓ"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"ਕੰਮ ਸੰਬੰਧੀ ਐਪਾਂ ਦੀ ਸਮਾਂ-ਸੂਚੀ"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"ਫਿਲਟਰ"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"ਇਹ ਕਾਰਵਾਈ ਅਸਫਲ ਹੋਈ: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"ਪ੍ਰਾਈਵੇਟ ਸਪੇਸ"</string>
<string name="private_space_secondary_label" msgid="9203933341714508907">"ਸੈੱਟਅੱਪ ਕਰਨ ਜਾਂ ਖੋਲ੍ਹਣ ਲਈ ਟੈਪ ਕਰੋ"</string>
- <string name="ps_container_title" msgid="4391796149519594205">"ਨਿੱਜੀ"</string>
+ <string name="ps_container_title" msgid="4391796149519594205">"ਪ੍ਰਾਈਵੇਟ"</string>
<string name="ps_container_settings" msgid="6059734123353320479">"ਪ੍ਰਾਈਵੇਟ ਸਪੇਸ ਸੰਬੰਧੀ ਸੈਟਿੰਗਾਂ"</string>
<string name="ps_container_unlock_button_content_description" msgid="9181551784092204234">"ਨਿੱਜੀ, ਅਣਲਾਕ ਕੀਤਾ ਗਿਆ।"</string>
<string name="ps_container_lock_button_content_description" msgid="5961993384382649530">"ਨਿੱਜੀ, ਲਾਕ ਕੀਤਾ ਗਿਆ।"</string>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 861be1e..f76e37b 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Informacje o aplikacji: %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$s – ustawienia użycia"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Nowe okno"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Zarządzaj oknami"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Zapisz parę aplikacji"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Ta para aplikacji nie jest obsługiwana na tym urządzeniu"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Notatki"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Dodaj"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Dodaj widżet <xliff:g id="WIDGET_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Pokaż wszystko"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Pokaż wszystkie widżety"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Wyświetlam wszystkie widżety"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Kliknij, aby zmienić ustawienia widżetu"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Zmień ustawienia widżetu"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Wyszukaj aplikacje"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Funkcja wyłączona przez administratora"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Zezwalaj na obrót ekranu głównego"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Po obróceniu telefonu"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Tryb poziomy"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Przestaw telefon w tryb poziomy"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Kropki powiadomień"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Włączone"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Wyłączone"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Zmniejsz szerokość"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Zmniejsz wysokość"</string>
<string name="widget_resized" msgid="9130327887929620">"Szerokość i wysokość widżetu zmieniła się na <xliff:g id="NUMBER_0">%1$s</xliff:g> x <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Skróty"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Menu skrótów"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Zamknij"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Zamknij"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Osobiste"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"OK"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Wstrzymaj aplikacje służbowe"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Cofnij wstrzymywanie"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Harmonogram aplikacji służbowych"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filtruj"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Niepowodzenie: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Przestrzeń prywatna"</string>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 04bff1f..66dc18f 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Informações da app para %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Definições de utilização para %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Nova janela"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Gerir janelas"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Guardar par de apps"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Este par de apps não é suportado neste dispositivo"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Tomar notas"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Adicionar"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Adicione o widget <xliff:g id="WIDGET_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Mostrar tudo"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Mostrar todos os widgets"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"A mostrar todos os widgets"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Toque para alterar as definições do widget"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Alterar definições do widget"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Pesquisar apps"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Desativada pelo gestor"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Permitir rotação do ecrã principal"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Quando o telemóvel é rodado"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Modo horizontal"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Defina o telemóvel para o modo horizontal"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Pontos de notificação"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Ativados"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Desativados"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Diminuir largura"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Diminuir altura"</string>
<string name="widget_resized" msgid="9130327887929620">"Widget redimensionado para a largura <xliff:g id="NUMBER_0">%1$s</xliff:g>, altura <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Atalhos"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Menu de atalho"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Ignorar"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Fechar"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Pessoal"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"OK"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Pausar apps de trabalho"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Retomar"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Horário das apps de trabalho"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filtrar"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Falhou: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Espaço privado"</string>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index 20cc9fb..b9ead80 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Informações do app %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Configurações de uso de %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Nova janela"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Gerenciar janelas"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Salvar par de apps"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Este Par de apps não está disponível no dispositivo"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Anotações"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Adicionar"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Adicionar o widget <xliff:g id="WIDGET_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Mostrar tudo"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Mostrar todos os widgets"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Mostrando todos os widgets"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Toque para mudar as configurações do widget"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Mudar as configurações do widget"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Pesquisar apps"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Desativado pelo administrador"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Permitir a rotação da tela inicial"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Quando o smartphone for girado"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Modo paisagem"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Definir o smartphone para o modo paisagem"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Pontos de notificação"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Ativados"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Desativado"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Diminuir largura"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Diminuir altura"</string>
<string name="widget_resized" msgid="9130327887929620">"Widget redimensionado para a largura <xliff:g id="NUMBER_0">%1$s</xliff:g>, altura <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Atalhos"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Menu de atalhos"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Dispensar"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Fechar"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Pessoais"</string>
@@ -198,13 +194,12 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"Ok"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Pausar apps de trabalho"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Ativar"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Programação de apps de trabalho"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filtrar"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Falha: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Espaço privado"</string>
<string name="private_space_secondary_label" msgid="9203933341714508907">"Toque para configurar ou abrir"</string>
- <string name="ps_container_title" msgid="4391796149519594205">"Particular"</string>
+ <string name="ps_container_title" msgid="4391796149519594205">"Privado"</string>
<string name="ps_container_settings" msgid="6059734123353320479">"Configurações do Espaço particular"</string>
<string name="ps_container_unlock_button_content_description" msgid="9181551784092204234">"Privada, desbloqueado."</string>
<string name="ps_container_lock_button_content_description" msgid="5961993384382649530">"Privada, bloqueado."</string>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 4226920..73a5ffb 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Informații despre aplicație pentru %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Setări de utilizare pentru %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Fereastră nouă"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Gestionează ferestrele"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Salvează perechea de aplicații"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Perechea de aplicații nu este acceptată pe acest dispozitiv"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Luare de notițe"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Adaugă"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Adaugă widgetul <xliff:g id="WIDGET_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Afișează tot"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Afișează toate widgeturile"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Se afișează toate widgeturile"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Atinge ca să schimbi setările pentru widgeturi"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Modifică setările pentru widgeturi"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Caută aplicații"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Dezactivată de administrator"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Permite rotirea ecranului de pornire"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Când telefonul este rotit"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Modul Peisaj"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Setează telefonul în modul Peisaj"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Puncte de notificare"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Activate"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Dezactivate"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Redu lățimea"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Redu înălțimea"</string>
<string name="widget_resized" msgid="9130327887929620">"Widgetul a fost redimensionat la lățimea <xliff:g id="NUMBER_0">%1$s</xliff:g> și înălțimea <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Comenzi rapide"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Meniu de comenzi rapide"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Închide"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Închide"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personale"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"OK"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Întrerupe aplicațiile pentru lucru"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Anulează întreruperea"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Programul aplicațiilor pentru lucru"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filtru"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Eșuare: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Spațiu privat"</string>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 2b827ef..54a1024 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Сведения о приложении \"%1$s\""</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Настройки использования приложения \"%1$s\""</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Новое окно"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Управление окнами"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Сохранить приложения"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Одновременно использовать эти два приложения на устройстве нельзя."</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Создание заметок"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Добавить"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Добавить виджет \"<xliff:g id="WIDGET_NAME">%1$s</xliff:g>\""</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Показать все"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Показать все виджеты"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Показаны все виджеты"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Нажмите, чтобы изменить настройки виджета"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Изменить настройки виджета"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Поиск приложений"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Функция отключена администратором"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Разрешить поворачивать главный экран"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"При повороте телефона"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Горизонтальный режим"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Перевести телефон в горизонтальный режим"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Значки уведомлений"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Включены"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Отключены"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Уменьшить ширину"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Уменьшить высоту"</string>
<string name="widget_resized" msgid="9130327887929620">"Изменен размер виджета: до <xliff:g id="NUMBER_0">%1$s</xliff:g> в ширину и <xliff:g id="NUMBER_1">%2$s</xliff:g> в высоту"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Ярлыки"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Быстрое меню"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Закрыть"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Закрыть"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Личные"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"ОК"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Приостановить рабочие приложения"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Возобновить"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Расписание рабочих приложений"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Фильтр"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Не удалось выполнить действие (<xliff:g id="WHAT">%1$s</xliff:g>)."</string>
<string name="private_space_label" msgid="2359721649407947001">"Частное пространство"</string>
diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml
index 646443e..21ac9ac 100644
--- a/res/values-si/strings.xml
+++ b/res/values-si/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s සඳහා යෙදුම් තතු"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$s සඳහා භාවිත සැකසීම්"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"නව කවුළුව"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"කවුළු කළමනාකරණය කරන්න"</string>
<string name="save_app_pair" msgid="5647523853662686243">"යෙදුම් යුගල සුරකින්න"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"මෙම යෙදුම් යුගලය මෙම උපාංගයෙහි සහාය නොදක්වයි"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"සටහන් කර ගැනීම"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"එක් කරන්න"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> විජට්ටුව එක් කරන්න"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"සියල්ල පෙන්වන්න"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"සියලු ම විජට් පෙන්වන්න"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"සියලුම විජට් පෙන්වමින්"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"විජට් සැකසීම් වෙනස් කිරීමට තට්ටු කරන්න"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"විජට් සැකසීම් වෙනස් කරන්න"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"යෙදුම් සොයන්න"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"ඔබගේ පරිපාලක විසින් අබල කරන ලදී"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"මුල් තිරය කරකැවීමට ඉඩ දෙන්න"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"දුරකථනය කරකවන විට"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"භූ දර්ශන ආකාරය"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"දුරකථනය භූ දර්ශන ආකාරයට සකසන්න"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"දැනුම්දීම් තිත්"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"ක්රියාත්මකයි"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"ක්රියාවිරහිතයි"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"පළල අඩු කරන්න"</string>
<string name="action_decrease_height" msgid="282377193880900022">"උස අඩු කරන්න"</string>
<string name="widget_resized" msgid="9130327887929620">"විජට් පළල <xliff:g id="NUMBER_0">%1$s</xliff:g> උස <xliff:g id="NUMBER_1">%2$s</xliff:g> වෙත ප්රමාණකරණය කරන ලදි"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"කෙටිමං"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"කෙටිමං මෙනුව"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"ඉවතලන්න"</string>
<string name="accessibility_close" msgid="2277148124685870734">"වසන්න"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"පුද්ගලික"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"තේරුණා"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"කාර්යාල යෙදුම් විරාම කරන්න"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"විරාම නොකරන්න"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"කාර්යාල යෙදුම් කාල සටහන"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"පෙරහන"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"අසාර්ථකයි: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"පෞද්ගලික ඉඩ"</string>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index f9245cd..bf96af6 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Informácie o aplikácii pre %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Nastavenia používania pre %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Nové okno"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Spravovať okná"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Uložiť pár aplikácií"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Tento pár aplikácií nie je v tomto zariadení podporovaný"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Zapisovanie poznámok"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Pridať"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Pridať miniaplikáciu <xliff:g id="WIDGET_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Zobraziť všetko"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Zobraziť všetky miniaplikácie"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Zobrazujú sa všetky miniaplikácie"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Klepnutím zmeňte nastavenia miniaplikácie"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Zmena nastavení miniaplikácie"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Hľadať aplikácie"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Zakázané vaším správcom"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Povoliť otáčanie plochy"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Pri otočení telefónu"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Režim na šírku"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Nastavte v telefóne režim na šírku"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Bodky upozornení"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Zapnuté"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Vypnuté"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Znížiť šírku"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Znížiť výšku"</string>
<string name="widget_resized" msgid="9130327887929620">"Veľkosť miniaplikácie bola zmenená na <xliff:g id="NUMBER_0">%1$s</xliff:g> x <xliff:g id="NUMBER_1">%2$s</xliff:g> (šírka x výška)"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Skratky"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Ponuka skratiek"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Zavrieť"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Zavrieť"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Osobné"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"Dobre"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Pozastaviť pracovné aplikácie"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Zrušiť pozastavenie"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Plán pre pracovné aplikácie"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filtrujte"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Zlyhalo: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Súkromný priestor"</string>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index e8d8702..b7ecd50 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Podatki o aplikaciji za: %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Nastavitve uporabe za »%1$s«"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Novo okno"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Upravljanje oken"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Shrani par aplikacij"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Ta par aplikacij ni podprt v tej napravi"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Ustvarjanje zapiskov"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Dodaj"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Dodajanje pripomočka »<xliff:g id="WIDGET_NAME">%1$s</xliff:g>«"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Pokaži vse"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Prikaz vseh pripomočkov"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Prikazani so vsi pripomočki"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Dotaknite se, če želite spremeniti nastavitve pripomočka."</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Spreminjanje nastavitev pripomočka"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Iskanje programov"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Onemogočil skrbnik."</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Dovoli sukanje začetnega zaslona"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Ko se telefon zasuka"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Ležeči način"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Telefon preklopite v ležeči način"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Obvestilne pike"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Vklopljeno"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Izklopljeno"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Zmanjšanje širine"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Zmanjšanje višine"</string>
<string name="widget_resized" msgid="9130327887929620">"Velikost pripomočka je bila spremenjena na <xliff:g id="NUMBER_0">%1$s</xliff:g> širine in <xliff:g id="NUMBER_1">%2$s</xliff:g> višine"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Bližnjice"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Meni z bližnjicami"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Opusti"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Zapri"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Osebno"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"V redu"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Začasno zaustavi delovne aplikacije"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Znova aktiviraj"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Razpored delovnih aplikacij"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filtriranje"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Ni uspelo: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Zasebni prostor"</string>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index 1e5420a..64bb03f 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Informacioni i aplikacionit për %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Cilësimet e përdorimit për \"%1$s\""</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Dritare e re"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Menaxho dritaret"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Ruaj çiftin e aplikacioneve"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Ky çift aplikacionesh nuk mbështetet në këtë pajisje"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Mbajtja e shënimeve"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Shto"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Shto miniaplikacionin <xliff:g id="WIDGET_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Shfaq të gjitha"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Shfaq të gjitha miniaplikacionet"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Po shfaqen të gjitha miniaplikacionet"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Trokit për të ndryshuar cilësimet e miniaplikacionit"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Ndrysho cilësimet e miniaplikacionit"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Kërko për aplikacione"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Çaktivizuar nga administratori"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Lejo rrotullimin e ekranit bazë"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Kur telefoni rrotullohet"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Modaliteti horizontal"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Vendose telefonin në modalitetin horizontal"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Pikat e njoftimeve"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Aktiv"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Joaktiv"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Zvogëlo gjerësinë"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Zvogëlo lartësinë"</string>
<string name="widget_resized" msgid="9130327887929620">"Madhësia e miniaplikacionit u ndryshua me gjerësinë <xliff:g id="NUMBER_0">%1$s</xliff:g> dhe lartësinë <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Shkurtoret"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Menyja e shkurtoreve"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Hiqe"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Mbyll"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personale"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"E kuptova"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Vendos në pauzë aplikacionet e punës"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Hiq nga pauza"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Orari për aplikacionet e punës"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filtro"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Dështoi: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Hapësira private"</string>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index c5b7bd0..44bc9b5 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Информације о апликацији за: %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Подешавања потрошње за %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Нови прозор"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Управљајте прозорима"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Сачувај пар апликација"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Овај пар апликација није подржан на овом уређају"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Прављење бележака"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Додај"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Додајте виџет <xliff:g id="WIDGET_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Прикажи све"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Прикажите све виџете"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Приказују се сви виџети"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Додирните да бисте променили подешавања виџета"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Промените подешавања виџета"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Претражите апликације"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Администратор је онемогућио"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Дозволи ротацију почетног екрана"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Када се телефон ротира"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Водоравни режим"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Подесите телефон на водоравни режим"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Тачке за обавештења"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Укључено"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Искључено"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Смањи ширину"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Смањи висину"</string>
<string name="widget_resized" msgid="9130327887929620">"Величина виџета је промењена на ширину <xliff:g id="NUMBER_0">%1$s</xliff:g> и висину <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Пречице"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Мени са пречицама"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Одбаци"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Затвори"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Лично"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"Важи"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Паузирај пословне апликације"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Поново активирај"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Распоред за пословне апликације"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Филтер"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Није успело: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Приватни простор"</string>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index 9ebf366..217e116 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Appinformation för %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Användningsinställningar för %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Nytt fönster"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Hantera fönster"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Spara app-par"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"De här apparna som ska användas tillsammans stöds inte på den här enheten"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Anteckna"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Lägg till"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Lägg till widgeten <xliff:g id="WIDGET_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Visa alla"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Visa alla widgetar"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Visar alla widgetar"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Tryck för att ändra inställningarna för widgeten"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Ändra inställningarna för widgeten"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Sök efter appar"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Inaktiverat av administratören"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Tillåt rotering av startskärmen"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"När telefonen vrids"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Liggande"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Ställ in telefonen på liggande läge"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Aviseringsprickar"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"På"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Av"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Minska bredden"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Minska höjden"</string>
<string name="widget_resized" msgid="9130327887929620">"Widgetens storlek har ändrats till: bredd <xliff:g id="NUMBER_0">%1$s</xliff:g>, höjd <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Genvägar"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Snabbmeny"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Ignorera"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Stäng"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Privat"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"OK"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Pausa jobbappar"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Återuppta"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Schema för jobbappar"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filter"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Misslyckades: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Privat rum"</string>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index a7725f3..4a2db28 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Maelezo ya programu ya %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Mipangilio ya matumizi ya %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Dirisha Jipya"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Dhibiti Windows"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Hifadhi jozi ya programu"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Jozi hii ya programu haitumiki kwenye kifaa hiki"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Kuandika madokezo"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Weka"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Weka wijeti ya <xliff:g id="WIDGET_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Onyesha zote"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Onyesha wijeti zote"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Inaonyesha wijeti zote"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Gusa ili ubadilishe mipangilio ya wijeti"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Badilisha mipangilio ya wijeti"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Tafuta programu"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Imezimwa na msimamizi wako"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Ruhusu kipengele cha kuzungusha skrini ya kwanza"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Simu inapozungushwa"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Mkao wa mlalo"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Weka simu katika mkao wa mlalo"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Vitone vya arifa"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Imewashwa"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Imezimwa"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Punguza upana"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Punguza urefu"</string>
<string name="widget_resized" msgid="9130327887929620">"Wijeti imepunguzwa hadi upana <xliff:g id="NUMBER_0">%1$s</xliff:g> urefu <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Njia za mkato"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Menyu ya Njia za Mkato"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Ondoa"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Funga"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Binafsi"</string>
@@ -198,13 +194,12 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"Nimeelewa"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Simamisha programu za kazini"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Acha kusimamisha"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Ratiba ya programu za kazini"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Kichujio"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Hitilafu: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Nafasi ya faragha"</string>
<string name="private_space_secondary_label" msgid="9203933341714508907">"Gusa uweke mipangilio au ufungue"</string>
- <string name="ps_container_title" msgid="4391796149519594205">"Faragha"</string>
+ <string name="ps_container_title" msgid="4391796149519594205">"Sehemu ya Faragha"</string>
<string name="ps_container_settings" msgid="6059734123353320479">"Mipangilio ya Nafasi ya Faragha"</string>
<string name="ps_container_unlock_button_content_description" msgid="9181551784092204234">"Ya faragha, imefunguliwa."</string>
<string name="ps_container_lock_button_content_description" msgid="5961993384382649530">"Ya faragha, imefungwa."</string>
diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml
index 295367d..e724f36 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$sக்கான ஆப்ஸ் தகவல்கள்"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$sக்கான உபயோக அமைப்புகள்"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"புதிய சாளரம்"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"சாளரங்களை நிர்வகியுங்கள்"</string>
<string name="save_app_pair" msgid="5647523853662686243">"ஆப்ஸ் ஜோடியைச் சேமி"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"இந்தச் சாதனத்தில் இந்த ஆப்ஸ் ஜோடி ஆதரிக்கப்படவில்லை"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"குறிப்பெடுத்தல்"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"சேர்"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> விட்ஜெட்டைச் சேர்க்கும்"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"எல்லாம் காட்டு"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"அனைத்து விட்ஜெட்களையும் காட்டும்"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"அனைத்து விட்ஜெட்களையும் காட்டுகிறது"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"விட்ஜெட் அமைப்புகளை மாற்றத் தட்டவும்"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"விட்ஜெட் அமைப்புகளை மாற்றும்"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"ஆப்ஸில் தேடுக"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"உங்கள் நிர்வாகி முடக்கியுள்ளார்"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"முகப்புத் திரை சுழற்சியை அனுமதித்தல்"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"மொபைலைச் சுழற்றும் போது"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"லேண்ட்ஸ்கேப் பயன்முறை"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"மொபைலை லேண்ட்ஸ்கேப் பயன்முறையில் அமையுங்கள்"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"அறிவிப்புப் புள்ளிகள்"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"ஆன்"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"ஆஃப்"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"அகலத்தைக் குறை"</string>
<string name="action_decrease_height" msgid="282377193880900022">"உயரத்தைக் குறை"</string>
<string name="widget_resized" msgid="9130327887929620">"அகலம் <xliff:g id="NUMBER_0">%1$s</xliff:g> மற்றும் உயரம் <xliff:g id="NUMBER_1">%2$s</xliff:g>க்கு விட்ஜெட் அளவு மாற்றப்பட்டது"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"ஷார்ட்கட்கள்"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"ஷார்ட்கட் மெனு"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"நிராகரி"</string>
<string name="accessibility_close" msgid="2277148124685870734">"மூடும் பட்டன்"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"தனிப்பட்டவை"</string>
@@ -198,13 +194,12 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"சரி"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"பணி ஆப்ஸை இடைநிறுத்து"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"மீண்டும் இயக்கு"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"பணி ஆப்ஸுக்கான திட்ட அட்டவணை"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"வடிப்பான்"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"தோல்வி: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
- <string name="private_space_label" msgid="2359721649407947001">"தனிப்பட்ட சேமிப்பிடம்"</string>
+ <string name="private_space_label" msgid="2359721649407947001">"ரகசிய இடம்"</string>
<string name="private_space_secondary_label" msgid="9203933341714508907">"அமைக்கவோ திறக்கவோ தட்டுங்கள்"</string>
- <string name="ps_container_title" msgid="4391796149519594205">"தனிப்பட்டது"</string>
+ <string name="ps_container_title" msgid="4391796149519594205">"ரகசிய இடம்"</string>
<string name="ps_container_settings" msgid="6059734123353320479">"தனிப்பட்ட சேமிப்பிட அமைப்புகள்"</string>
<string name="ps_container_unlock_button_content_description" msgid="9181551784092204234">"தனிப்பட்டது, அன்லாக் செய்யப்பட்டுள்ளது."</string>
<string name="ps_container_lock_button_content_description" msgid="5961993384382649530">"தனிப்பட்டது, லாக் செய்யப்பட்டுள்ளது."</string>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index 5859665..186e94d 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s కోసం యాప్ సమాచారం"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$sకు సంబంధించిన వినియోగ సెట్టింగ్లు"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"కొత్త విండో"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"విండోలను మేనేజ్ చేయండి"</string>
<string name="save_app_pair" msgid="5647523853662686243">"యాప్ పెయిర్ను సేవ్ చేయండి"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"ఈ పరికరంలో ఈ యాప్ పెయిర్ సపోర్ట్ చేయదు"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"నోట్-టేకింగ్"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"జోడించండి"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> విడ్జెట్ను జోడించండి"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"అన్నీ చూడండి"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"అన్ని విడ్జెట్లను చూపండి"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"అన్ని విడ్జెట్లు చూపబడుతున్నాయి"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"విడ్జెట్ సెట్టింగ్లను మార్చడానికి ట్యాప్ చేయండి"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"విడ్జెట్ సెట్టింగ్లను మార్చండి"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"యాప్ల కోసం సెర్చ్ చేయండి"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"మీ నిర్వాహకులు నిలిపివేసారు"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"మొదటి స్క్రీన్ రొటేషన్ను అనుమతించండి"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"ఫోన్ను తిప్పినప్పుడు"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"ల్యాండ్స్కేప్ మోడ్"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"ఫోన్ను ల్యాండ్స్కేప్ మోడ్కు సెట్ చేయండి"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"నోటిఫికేషన్ డాట్లు"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"ఆన్"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"ఆఫ్"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"వెడల్పును తగ్గించు"</string>
<string name="action_decrease_height" msgid="282377193880900022">"ఎత్తును తగ్గించు"</string>
<string name="widget_resized" msgid="9130327887929620">"విడ్జెట్ సైజ్ వెడల్పు <xliff:g id="NUMBER_0">%1$s</xliff:g>కి, ఎత్తు <xliff:g id="NUMBER_1">%2$s</xliff:g>కి మార్చబడింది"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"షార్ట్కట్స్"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"షార్ట్కట్ మెనూ"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"తీసివేయండి"</string>
<string name="accessibility_close" msgid="2277148124685870734">"మూసివేస్తుంది"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"వ్యక్తిగతం"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"అర్థమైంది"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"వర్క్ యాప్లను పాజ్ చేయండి"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"పాజ్ నుండి తీసివేయండి"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"వర్క్ యాప్ల షెడ్యూల్"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"ఫిల్టర్ చేయి"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"విఫలమైంది: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"ప్రైవేట్ స్పేస్"</string>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index fd2ba21..b5373f6 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"ข้อมูลแอปสำหรับ %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"การตั้งค่าการใช้งานสำหรับ %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"หน้าต่างใหม่"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"จัดการหน้าต่าง"</string>
<string name="save_app_pair" msgid="5647523853662686243">"บันทึกคู่แอป"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"ไม่รองรับคู่แอปนี้ในอุปกรณ์เครื่องนี้"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"การจดบันทึก"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"เพิ่ม"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"เพิ่มวิดเจ็ต <xliff:g id="WIDGET_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"แสดงทั้งหมด"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"แสดงวิดเจ็ตทั้งหมด"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"กำลังแสดงวิดเจ็ตทั้งหมด"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"แตะเพื่อเปลี่ยนการตั้งค่าวิดเจ็ต"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"เปลี่ยนการตั้งค่าวิดเจ็ต"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"ค้นหาแอป"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"ปิดใช้โดยผู้ดูแลระบบ"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"อนุญาตให้หมุนหน้าจอหลัก"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"เมื่อหมุนโทรศัพท์"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"โหมดแนวนอน"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"ตั้งค่าโทรศัพท์เป็นโหมดแนวนอน"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"เครื่องหมายจุดแสดงการแจ้งเตือน"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"เปิด"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"ปิด"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"ลดความกว้าง"</string>
<string name="action_decrease_height" msgid="282377193880900022">"ลดความสูง"</string>
<string name="widget_resized" msgid="9130327887929620">"ปรับขนาดของวิดเจ็ตเป็นกว้าง <xliff:g id="NUMBER_0">%1$s</xliff:g> สูง <xliff:g id="NUMBER_1">%2$s</xliff:g> แล้ว"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"ทางลัด"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"เมนูแป้นพิมพ์ลัด"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"ปิด"</string>
<string name="accessibility_close" msgid="2277148124685870734">"ปิด"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"ส่วนตัว"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"รับทราบ"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"หยุดแอปงานชั่วคราว"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"ยกเลิกการหยุดชั่วคราว"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"กำหนดเวลาของแอปงาน"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"ตัวกรอง"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"ไม่สำเร็จ: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"พื้นที่ส่วนตัว"</string>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 69f88e1..7bc7f9d 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Impormasyon ng app para sa %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Mga setting ng paggamit para sa %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Bagong Window"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Pamahalaan ang Mga Window"</string>
<string name="save_app_pair" msgid="5647523853662686243">"I-save ang app pair"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Hindi sinusuportahan sa device na ito ang pares ng app na ito"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Pagtatala"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Idagdag"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Idagdag ang widget na <xliff:g id="WIDGET_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Ipakita lahat"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Ipakita ang lahat ng widget"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Ipinapakita ang lahat ng widget"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"I-tap para baguhin ang mga setting ng widget"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Baguhin ang mga setting ng widget"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Maghanap ng mga app"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Na-disable ng iyong admin"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Payagan ang pag-rotate ng home screen"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Kailan maro-rotate ang telepono"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Landscape mode"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Itakda ang telepono sa landscape mode"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Mga notification dot"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Naka-on"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Naka-off"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Bawasan ang lapad"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Bawasan ang taas"</string>
<string name="widget_resized" msgid="9130327887929620">"Na-resize ang widget sa lapad <xliff:g id="NUMBER_0">%1$s</xliff:g> taas <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Mga Shortcut"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Menu ng Shortcut"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"I-dismiss"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Isara"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personal"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"OK"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"I-pause ang mga app para sa trabaho"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"I-unpause"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Iskedyul ng mga app para sa trabaho"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filter"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Hindi nagawa: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Pribadong space"</string>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index e61b670..9990967 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s uygulama bilgileri"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$s ile ilgili kullanım ayarları"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Yeni Pencere"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Pencereleri yönet"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Uygulama çiftini kaydedin"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Bu uygulama çifti bu cihazda desteklenmiyor"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Not alma"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Ekle"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> widget\'ı ekle"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Tümünü göster"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Tüm widget\'ları göster"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Tüm widget\'lar gösteriliyor"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Widget ayarlarını değiştirmek için dokunun"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Widget ayarlarını değiştir"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Uygulamalarda ara"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Yöneticiniz tarafından devre dışı bırakıldı"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Ana ekranı döndürmeye izin ver"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Telefon döndürüldüğünde"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Yatay mod"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Telefonu yatay moda ayarlayın"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Bildirim noktaları"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Açık"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Kapalı"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Genişliği azalt"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Yüksekliği azalt"</string>
<string name="widget_resized" msgid="9130327887929620">"Widget, <xliff:g id="NUMBER_0">%1$s</xliff:g> genişlik ve <xliff:g id="NUMBER_1">%2$s</xliff:g> yükseklik değerine yeniden boyutlandırıldı"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Kısayollar"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Kısayol Menüsü"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Kapat"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Kapat"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Kişisel"</string>
@@ -198,13 +194,12 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"Anladım"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"İş uygulamalarını duraklat"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Devam ettir"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"İş uygulamaları programı"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Filtre"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Başarısız: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Gizli alan"</string>
<string name="private_space_secondary_label" msgid="9203933341714508907">"Kurmak veya açmak için dokunun"</string>
- <string name="ps_container_title" msgid="4391796149519594205">"Gizli"</string>
+ <string name="ps_container_title" msgid="4391796149519594205">"Özel"</string>
<string name="ps_container_settings" msgid="6059734123353320479">"Gizli Alan Ayarları"</string>
<string name="ps_container_unlock_button_content_description" msgid="9181551784092204234">"Gizli, kilidi açık."</string>
<string name="ps_container_lock_button_content_description" msgid="5961993384382649530">"Gizli, kilitli."</string>
diff --git a/res/values-uk/strings.xml b/res/values-uk/strings.xml
index fd293e3..165ab49 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Інформація про додаток для %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Параметри використання (%1$s)"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Нове вікно"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Керувати вікнами"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Зберегти пару додатків"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Ці два додатки не можна одночасно використовувати на цьому пристрої"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Створення нотаток"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Додати"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Додати віджет \"<xliff:g id="WIDGET_NAME">%1$s</xliff:g>\""</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Показати всі"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Показати всі віджети"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Показано всі віджети"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Натисніть, щоб змінити налаштування віджета"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Змінити налаштування віджета"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Пошук додатків"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Вимкнув адміністратор"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Дозволити обертання головного екрана"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Коли телефон обертається"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Альбомна орієнтація"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Змінити орієнтацію екрана телефона на альбомну"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Значки сповіщень"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Увімкнено"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Вимкнено"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Зменшити ширину"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Зменшити висоту"</string>
<string name="widget_resized" msgid="9130327887929620">"Розміри віджета змінено на <xliff:g id="NUMBER_0">%1$s</xliff:g> завширшки та <xliff:g id="NUMBER_1">%2$s</xliff:g> заввишки"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Ярлики"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Меню швидкого доступу"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Закрити"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Закрити"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Особисті додатки"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"Зрозуміло"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Призупинити робочі додатки"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Відновити"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Розклад призупинення робочих додатків"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Фільтр"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Не вдалося <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Приватний простір"</string>
diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml
index 911a2d5..1bd2e4a 100644
--- a/res/values-ur/strings.xml
+++ b/res/values-ur/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s کے لیے ایپ کی معلومات"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$s کیلئے استعمال کی ترتیبات"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"نئی ونڈو"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Windows کا نظم کریں"</string>
<string name="save_app_pair" msgid="5647523853662686243">"ایپس کے جوڑے کو محفوظ کریں"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"ایپس کا یہ جوڑا اس آلے پر تعاون یافتہ نہیں ہے"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"نوٹ لکھنا"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"شامل کریں"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> ویجیٹ شامل کریں"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"سبھی دکھائیں"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"سبھی ویجیٹس دکھائیں"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"سبھی ویجیٹس دکھائے جا رہے ہیں"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"ویجیٹ ترتیبات تبدیل کرنے کے لیے تھپتھپائیں"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"ویجیٹ ترتیبات تبدیل کریں"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"ایپس تلاش کریں"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"آپ کے منتظم کی طرف سے غیر فعال کر دیا گیا"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"ہوم اسکرین گھمانے کی اجازت دیں"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"جب فون گھمایا جاتا ہے"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"لینڈ اسکیپ وضع"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"فون کو لینڈ اسکیپ وضع میں سیٹ کریں"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"اطلاعاتی ڈاٹس"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"آن ہے"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"آف ہے"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"چوڑائی کم کریں"</string>
<string name="action_decrease_height" msgid="282377193880900022">"اونچائی کم کریں"</string>
<string name="widget_resized" msgid="9130327887929620">"ویجیٹ کے سائز کو چوڑائی <xliff:g id="NUMBER_0">%1$s</xliff:g> اونچائی <xliff:g id="NUMBER_1">%2$s</xliff:g> میں تبدیل کر دیا گیا"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"شارٹ کٹس"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"شارٹ کٹ مینیو"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"برخاست کریں"</string>
<string name="accessibility_close" msgid="2277148124685870734">"بند کریں"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"ذاتی"</string>
@@ -198,13 +194,12 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"سمجھ آ گئی"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"ورک ایپس موقوف کریں"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"چلائیں"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"ورک ایپس کا شیڈول"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"فلٹر"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"ناکام ہو گيا: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"نجی اسپیس"</string>
<string name="private_space_secondary_label" msgid="9203933341714508907">"سیٹ اپ کرنے یا کھولنے کے لیے تھپتھپائیں"</string>
- <string name="ps_container_title" msgid="4391796149519594205">"نجی"</string>
+ <string name="ps_container_title" msgid="4391796149519594205">"پرائیویٹ"</string>
<string name="ps_container_settings" msgid="6059734123353320479">"نجی اسپیس کی ترتیبات"</string>
<string name="ps_container_unlock_button_content_description" msgid="9181551784092204234">"نجی اسپیس غیر مقفل ہے۔"</string>
<string name="ps_container_lock_button_content_description" msgid="5961993384382649530">"نجی اسپیس مقفل ہے۔"</string>
diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml
index aacb35f..b9286ec 100644
--- a/res/values-uz/strings.xml
+++ b/res/values-uz/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s ilovasi axboroti"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$s uchun sarf sozlamalari"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Yangi oyna"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Oynalarni boshqarish"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Ilova juftini saqlash"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Bu ilova jufti ushbu qurilmada ishlamaydi"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Qayd olish"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Chiqarish"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"<xliff:g id="WIDGET_NAME">%1$s</xliff:g> vidjetini chiqarish"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Hammasi"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Barcha vidjetlar"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Barcha vidjetlar chiqarilgan"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Vidjet sozlamalarini oʻzgartirish uchun bosing"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Vidjet sozlamalarini oʻzgartirish"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Ilovalarni qidirish"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Administrator tomonidan o‘chirilgan"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Bosh ekranni burishga ruxsat"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Telefon burilganda"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Yotiq rejim"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Telefonni yotiq rejimga oʻtkazish"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Bildirishnoma belgilari"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Yoniq"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Oʻchiq"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Enini kichraytirish"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Bo‘yini kichraytirish"</string>
<string name="widget_resized" msgid="9130327887929620">"Vidjetning eni <xliff:g id="NUMBER_0">%1$s</xliff:g>, bo‘yi <xliff:g id="NUMBER_1">%2$s</xliff:g> qilib o‘zgartirildi"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Tezkor tugmalar"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Tezkor tugma menyusi"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Yopish"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Yopish"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Shaxsiy"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"OK"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Ishga oid ilovalarni pauza qilish"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Pauzadan chiqarish"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Ishga oid ilovalar jadvali"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Saralash"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Xato: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Shaxsiy xona"</string>
diff --git a/res/values-v30/styles.xml b/res/values-v30/styles.xml
index a5c57c8..ec5c113 100644
--- a/res/values-v30/styles.xml
+++ b/res/values-v30/styles.xml
@@ -29,6 +29,5 @@
<item name="android:windowLayoutInDisplayCutoutMode">always</item>
<item name="android:enforceStatusBarContrast">false</item>
<item name="android:enforceNavigationBarContrast">false</item>
- <item name="materialColorOnPrimaryFixed">#FFFFFFFF</item>
</style>
</resources>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index cea93da..6082ef6 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Thông tin ứng dụng cho %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Chế độ cài đặt mức sử dụng %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Cửa sổ mới"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Quản lý cửa sổ"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Lưu cặp ứng dụng"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Cặp ứng dụng này không hoạt động được trên thiết bị này"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Ghi chú"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Thêm"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Thêm tiện ích <xliff:g id="WIDGET_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Hiện tất cả"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Hiện tất cả tiện ích"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Đang hiện tất cả tiện ích"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Nhấn để thay đổi chế độ cài đặt tiện ích"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Thay đổi chế độ cài đặt tiện ích"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Tìm kiếm ứng dụng"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Bị tắt bởi quản trị viên của bạn"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Cho phép xoay màn hình chính"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Khi xoay điện thoại"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Chế độ ngang"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Đặt điện thoại ở chế độ ngang"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Dấu chấm thông báo"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Đang bật"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Tắt"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Giảm chiều rộng"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Giảm chiều cao"</string>
<string name="widget_resized" msgid="9130327887929620">"Đã đổi kích thước tiện ích thành chiều rộng <xliff:g id="NUMBER_0">%1$s</xliff:g> chiều cao <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Lối tắt"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Trình đơn lối tắt"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Loại bỏ"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Đóng"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Cá nhân"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"Tôi hiểu"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Tạm dừng các ứng dụng công việc"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Bỏ tạm dừng"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Lịch biểu cho ứng dụng công việc"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Bộ lọc"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Không thực hiện được thao tác: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Không gian riêng tư"</string>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 9efd6c3..c1917a9 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s 的应用信息"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$s的使用设置"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"新窗口"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"管理窗口"</string>
<string name="save_app_pair" msgid="5647523853662686243">"保存应用组合"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"在该设备上无法使用此应用对"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"记事"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"添加"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"添加“<xliff:g id="WIDGET_NAME">%1$s</xliff:g>”微件"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"全部显示"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"显示所有微件"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"正在显示所有微件"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"点按即可更改微件设置"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"更改微件设置"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"搜索应用"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"已被您的管理员停用"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"允许旋转主屏幕"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"手机旋转时"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"横屏模式"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"将手机设为横屏模式"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"通知圆点"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"已开启"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"已关闭"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"减小宽度"</string>
<string name="action_decrease_height" msgid="282377193880900022">"减小高度"</string>
<string name="widget_resized" msgid="9130327887929620">"微件尺寸已调整为:宽度 <xliff:g id="NUMBER_0">%1$s</xliff:g>,高度 <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"快捷方式"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"快捷键菜单"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"关闭"</string>
<string name="accessibility_close" msgid="2277148124685870734">"关闭"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"个人"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"知道了"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"暂停工作应用"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"取消暂停"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"工作应用时间表"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"过滤器"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"失败:<xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"私密空间"</string>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index c944240..d29653c 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s 的應用程式資料"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"「%1$s」的用量設定"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"新視窗"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"管理視窗"</string>
<string name="save_app_pair" msgid="5647523853662686243">"儲存應用程式配對"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"此裝置不支援此應用程式配對"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"做筆記"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"新增"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"加<xliff:g id="WIDGET_NAME">%1$s</xliff:g>小工具"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"顯示全部"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"顯示所有小工具"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"顯示所有小工具"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"輕按即可變更小工具設定"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"變更小工具設定"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"搜尋應用程式"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"已由你的管理員停用"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"允許旋轉主畫面"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"隨手機旋轉"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"水平模式"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"將手機設定為水平模式"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"通知圓點"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"開啟"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"關閉"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"減少闊度"</string>
<string name="action_decrease_height" msgid="282377193880900022">"減少高度"</string>
<string name="widget_resized" msgid="9130327887929620">"已調整小工具的大小至闊 <xliff:g id="NUMBER_0">%1$s</xliff:g> 高 <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"捷徑"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"快速鍵選單"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"關閉"</string>
<string name="accessibility_close" msgid="2277148124685870734">"關閉"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"個人"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"知道了"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"暫停工作應用程式"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"取消暫停"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"工作應用程式時間表"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"篩選器"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"操作失敗:<xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"私人空間"</string>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 476c0e5..eaa5a73 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"「%1$s」的應用程式資訊"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"「%1$s」的用量設定"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"新視窗"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"管理視窗"</string>
<string name="save_app_pair" msgid="5647523853662686243">"儲存應用程式配對"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"這部裝置不支援這組應用程式配對"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"做筆記"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"新增"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"新增「<xliff:g id="WIDGET_NAME">%1$s</xliff:g>」小工具"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"全部顯示"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"顯示所有小工具"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"現已顯示所有小工具"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"輕觸即可變更小工具設定"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"變更小工具設定"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"搜尋應用程式"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"已由你的管理員停用"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"允許旋轉主畫面"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"當手機旋轉時"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"橫向模式"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"將手機設為橫向模式"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"通知圓點"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"開啟"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"關閉"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"減少寬度"</string>
<string name="action_decrease_height" msgid="282377193880900022">"減少高度"</string>
<string name="widget_resized" msgid="9130327887929620">"已將小工具的寬度和高度分別調整為 <xliff:g id="NUMBER_0">%1$s</xliff:g> 和 <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"捷徑"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"快速鍵選單"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"關閉"</string>
<string name="accessibility_close" msgid="2277148124685870734">"關閉"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"個人"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"我知道了"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"暫停工作應用程式"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"取消暫停"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"工作應用程式時間表"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"篩選器"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"失敗:<xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"私人空間"</string>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index 623454b..60dffeb 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -32,6 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Ulwazi lwe-App ye-%1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Amasethingi okusetshenziswa ka-%1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Iwindi Elisha"</string>
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Phatha Amawindi"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Londoloza i-app ebhangqiwe"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Lokhu kubhanqwa kwe-app akusekelwa kule divayisi"</string>
@@ -69,12 +70,9 @@
<string name="widget_category_note_taking" msgid="3469689394504266039">"Ukuthatha amanothi"</string>
<string name="widget_add_button_label" msgid="2761267068711937179">"Engeza"</string>
<string name="widget_add_button_content_description" msgid="1810530016360039643">"Engeza iwijethi ye-<xliff:g id="WIDGET_NAME">%1$s</xliff:g>"</string>
- <!-- no translation found for widgets_list_expand_button_label (7912016136574932622) -->
- <skip />
- <!-- no translation found for widgets_list_expand_button_content_description (4600513860973450888) -->
- <skip />
- <!-- no translation found for widgets_list_expanded (7374857868788557730) -->
- <skip />
+ <string name="widgets_list_expand_button_label" msgid="7912016136574932622">"Bonisa konke"</string>
+ <string name="widgets_list_expand_button_content_description" msgid="4600513860973450888">"Bonisa wonke amawijethi"</string>
+ <string name="widgets_list_expanded" msgid="7374857868788557730">"Ibonisa wonke amawijethi"</string>
<string name="reconfigurable_widget_education_tip" msgid="6336962690888067057">"Thepha ukuze ushintshe amasethingi ewijethi"</string>
<string name="widget_reconfigure_button_content_description" msgid="8811472721881205250">"Shintsha amasethingi ewijethi"</string>
<string name="all_apps_search_bar_hint" msgid="1390553134053255246">"Sesha izinhlelo zokusebenza"</string>
@@ -130,10 +128,8 @@
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Kukhutshazwe umlawuli wakho"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Vumela ukuzungezisa kwesikrini sasekhaya"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Uma ifoni iphendukiswa"</string>
- <!-- no translation found for landscape_mode_title (5138814555934843926) -->
- <skip />
- <!-- no translation found for landscape_mode_desc (7372569859592816793) -->
- <skip />
+ <string name="landscape_mode_title" msgid="5138814555934843926">"Imodi yokuvundla"</string>
+ <string name="landscape_mode_desc" msgid="7372569859592816793">"Setha ifoni kumodi yokuvundla"</string>
<string name="notification_dots_title" msgid="9062440428204120317">"Amacashazi esaziso"</string>
<string name="notification_dots_desc_on" msgid="1679848116452218908">"Vuliwe"</string>
<string name="notification_dots_desc_off" msgid="1760796511504341095">"Valiwe"</string>
@@ -182,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Nciphisa ububanzi"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Nciphisa ubude"</string>
<string name="widget_resized" msgid="9130327887929620">"Iwijethi inikezwe usayizi omusha ngobubanzi obungu-<xliff:g id="NUMBER_0">%1$s</xliff:g> ubude obungu-<xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Izinqamuleli"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Imenyu Yezinqamuleli"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Cashisa"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Vala"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Okomuntu siqu"</string>
@@ -198,8 +194,7 @@
<string name="work_apps_paused_edu_accept" msgid="6377476824357318532">"Ngiyezwa"</string>
<string name="work_apps_pause_btn_text" msgid="4669288269140620646">"Misa ama-app omsebenzi"</string>
<string name="work_apps_enable_btn_text" msgid="1736198302467317371">"Susa ukumisa"</string>
- <!-- no translation found for work_scheduler_button_content_description (917340740986764967) -->
- <skip />
+ <string name="work_scheduler_button_content_description" msgid="917340740986764967">"Ishejuli yama-app omsebenzi"</string>
<string name="developer_options_filter_hint" msgid="5896817443635989056">"Hlunga"</string>
<string name="remote_action_failed" msgid="1383965239183576790">"Yehlulekile: <xliff:g id="WHAT">%1$s</xliff:g>"</string>
<string name="private_space_label" msgid="2359721649407947001">"Isikhala esiyimfihlo"</string>
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index 8bd25dd..698877a 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -44,54 +44,6 @@
<attr name="focusOutlineColor" format="color" />
<attr name="focusInnerOutlineColor" format="color" />
- <!-- Recreating Dynamic Color attributes found in the system. This should be the way to go on
- all launcher projects since they all inherit from launcher3. Avoid creating other color
- attributes if these can be user directly. -->
- <attr name="materialColorOnSecondaryFixedVariant" format="color" />
- <attr name="materialColorOnTertiaryFixedVariant" format="color" />
- <attr name="materialColorSurfaceContainerLowest" format="color" />
- <attr name="materialColorOnPrimaryFixedVariant" format="color" />
- <attr name="materialColorOnSecondaryContainer" format="color" />
- <attr name="materialColorOnTertiaryContainer" format="color" />
- <attr name="materialColorSurfaceContainerLow" format="color" />
- <attr name="materialColorOnPrimaryContainer" format="color" />
- <attr name="materialColorSecondaryFixedDim" format="color" />
- <attr name="materialColorOnErrorContainer" format="color" />
- <attr name="materialColorOnSecondaryFixed" format="color" />
- <attr name="materialColorInverseOnSurface" format="color" />
- <attr name="materialColorTertiaryFixedDim" format="color" />
- <attr name="materialColorOnTertiaryFixed" format="color" />
- <attr name="materialColorPrimaryFixedDim" format="color" />
- <attr name="materialColorSecondaryContainer" format="color" />
- <attr name="materialColorErrorContainer" format="color" />
- <attr name="materialColorOnPrimaryFixed" format="color" />
- <attr name="materialColorInversePrimary" format="color" />
- <attr name="materialColorSecondaryFixed" format="color" />
- <attr name="materialColorInverseSurface" format="color" />
- <attr name="materialColorSurfaceVariant" format="color" />
- <attr name="materialColorTertiaryContainer" format="color" />
- <attr name="materialColorTertiaryFixed" format="color" />
- <attr name="materialColorPrimaryContainer" format="color" />
- <attr name="materialColorOnBackground" format="color" />
- <attr name="materialColorPrimaryFixed" format="color" />
- <attr name="materialColorOnSecondary" format="color" />
- <attr name="materialColorOnTertiary" format="color" />
- <attr name="materialColorSurfaceDim" format="color" />
- <attr name="materialColorSurfaceBright" format="color" />
- <attr name="materialColorOnError" format="color" />
- <attr name="materialColorSurface" format="color" />
- <attr name="materialColorSurfaceContainerHigh" format="color" />
- <attr name="materialColorSurfaceContainerHighest" format="color" />
- <attr name="materialColorOnSurfaceVariant" format="color" />
- <attr name="materialColorOutline" format="color" />
- <attr name="materialColorOutlineVariant" format="color" />
- <attr name="materialColorOnPrimary" format="color" />
- <attr name="materialColorOnSurface" format="color" />
- <attr name="materialColorSurfaceContainer" format="color" />
- <attr name="materialColorPrimary" format="color" />
- <attr name="materialColorSecondary" format="color" />
- <attr name="materialColorTertiary" format="color" />
- <attr name="materialColorError" format="color" />
<attr name="pageIndicatorDotColor" format="color" />
<attr name="folderPreviewColor" format="color" />
@@ -210,10 +162,11 @@
<attr name="layout_sticky" format="boolean" />
</declare-styleable>
- <declare-styleable name="NumRows">
- <attr name="minDeviceWidthPx" format="float"/>
- <attr name="minDeviceHeightPx" format="float"/>
- <attr name="numRowsNew" format="integer"/>
+ <declare-styleable name="GridSize">
+ <attr name="minDeviceWidthDp" format="float"/>
+ <attr name="minDeviceHeightDp" format="float"/>
+ <attr name="numGridRows" format="integer"/>
+ <attr name="numGridColumns" format="integer"/>
<attr name="dbFile" />
<attr name="defaultLayoutId"/>
<attr name="demoModeLayoutId"/>
@@ -309,7 +262,7 @@
<!-- File that contains the specs for all apps icon and text size.
Needs FeatureFlags.ENABLE_RESPONSIVE_WORKSPACE enabled -->
<attr name="allAppsCellSpecsId" format="reference" />
- <attr name="rowCountSpecsId" format="reference" />
+ <attr name="gridSizeSpecsId" format="reference" />
<!-- defaults to allAppsCellSpecsId, if not specified -->
<attr name="allAppsCellSpecsTwoPanelId" format="reference" />
<!-- defaults to false, if not specified -->
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 4549b86..967d97d 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -256,4 +256,50 @@
<color name="system_tertiary_fixed_dim">#E0BBDD</color>
<color name="system_on_tertiary_fixed">#2A122C</color>
<color name="system_on_tertiary_fixed_variant">#593D59</color>
+
+ <color name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</color>
+ <color name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</color>
+ <color name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</color>
+ <color name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</color>
+ <color name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</color>
+ <color name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</color>
+ <color name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</color>
+ <color name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</color>
+ <color name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</color>
+ <color name="materialColorOnErrorContainer">@color/system_on_error_container_light</color>
+ <color name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</color>
+ <color name="materialColorInverseOnSurface">@color/system_on_surface_dark</color>
+ <color name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</color>
+ <color name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</color>
+ <color name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</color>
+ <color name="materialColorSecondaryContainer">@color/system_secondary_container_light</color>
+ <color name="materialColorErrorContainer">@color/system_error_container_light</color>
+ <color name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</color>
+ <color name="materialColorInversePrimary">@color/system_primary_dark</color>
+ <color name="materialColorSecondaryFixed">@color/system_secondary_fixed</color>
+ <color name="materialColorInverseSurface">@color/system_surface_dark</color>
+ <color name="materialColorSurfaceVariant">@color/system_surface_variant_light</color>
+ <color name="materialColorTertiaryContainer">@color/system_tertiary_container_light</color>
+ <color name="materialColorTertiaryFixed">@color/system_tertiary_fixed</color>
+ <color name="materialColorPrimaryContainer">@color/system_primary_container_light</color>
+ <color name="materialColorOnBackground">@color/system_on_background_light</color>
+ <color name="materialColorPrimaryFixed">@color/system_primary_fixed</color>
+ <color name="materialColorOnSecondary">@color/system_on_secondary_light</color>
+ <color name="materialColorOnTertiary">@color/system_on_tertiary_light</color>
+ <color name="materialColorSurfaceDim">@color/system_surface_dim_light</color>
+ <color name="materialColorSurfaceBright">@color/system_surface_bright_light</color>
+ <color name="materialColorOnError">@color/system_on_error_light</color>
+ <color name="materialColorSurface">@color/system_surface_light</color>
+ <color name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</color>
+ <color name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</color>
+ <color name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</color>
+ <color name="materialColorOutline">@color/system_outline_light</color>
+ <color name="materialColorOutlineVariant">@color/system_outline_variant_light</color>
+ <color name="materialColorOnPrimary">@color/system_on_primary_light</color>
+ <color name="materialColorOnSurface">@color/system_on_surface_light</color>
+ <color name="materialColorSurfaceContainer">@color/system_surface_container_light</color>
+ <color name="materialColorPrimary">@color/system_primary_light</color>
+ <color name="materialColorSecondary">@color/system_secondary_light</color>
+ <color name="materialColorTertiary">@color/system_tertiary_light</color>
+ <color name="materialColorError">@color/system_error_light</color>
</resources>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 61d99d7..c0bd956 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -125,9 +125,8 @@
<dimen name="all_apps_work_profile_tab_footer_top_padding">16dp</dimen>
<dimen name="all_apps_work_profile_tab_footer_bottom_padding">20dp</dimen>
<dimen name="all_apps_tabs_button_horizontal_padding">4dp</dimen>
- <dimen name="all_apps_tabs_vertical_padding">6dp</dimen>
- <dimen name="all_apps_tabs_vertical_padding_focus">1dp</dimen>
- <dimen name="all_apps_tabs_focus_width">5dp</dimen>
+ <dimen name="all_apps_tabs_focus_horizontal_inset">5dp</dimen>
+ <dimen name="all_apps_tabs_focus_vertical_inset">6dp</dimen>
<dimen name="all_apps_tabs_focus_border">3dp</dimen>
<dimen name="all_apps_tabs_focus_padding">2dp</dimen>
<dimen name="all_apps_tabs_margin_top">8dp</dimen>
@@ -174,13 +173,16 @@
<dimen name="work_edu_card_margin">16dp</dimen>
<dimen name="work_edu_card_radius">16dp</dimen>
<dimen name="work_edu_card_bottom_margin">26dp</dimen>
- <dimen name="work_edu_card_text_end_margin">32dp</dimen>
+ <dimen name="work_edu_card_text_end_margin">12dp</dimen>
<dimen name="work_apps_paused_button_stroke">1dp</dimen>
+ <dimen name="work_edu_card_button_margin_top">12dp</dimen>
<dimen name="work_card_margin">24dp</dimen>
+ <dimen name="work_card_margin_end">12dp</dimen>
<!-- (x) icon button inside work edu card -->
- <dimen name="rounded_button_width">24dp</dimen>
+ <dimen name="rounded_button_width">48dp</dimen>
<dimen name="x_icon_size">16dp</dimen>
+ <dimen name="inset_rounded_action_button">12dp</dimen>
<!-- rounded button shown inside card views, and snack bars -->
<dimen name="padded_rounded_button_height">48dp</dimen>
@@ -569,4 +571,8 @@
<!-- WindowManagerProxy -->
<dimen name="max_width_and_height_of_small_display_cutout">136px</dimen>
+
+ <!-- App Title Pill -->
+ <dimen name="app_title_pill_horizontal_padding">4dp</dimen>
+ <dimen name="app_title_pill_round_rect_padding">2dp</dimen>
</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index c280307..cdfbefe 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -154,6 +154,10 @@
<!-- A widget category label for grouping widgets related to note taking. [CHAR_LIMIT=30] -->
<string name="widget_category_note_taking">Note-taking</string>
+ <!-- Accessibility label on the widget preview that on click (if add button is hidden) shows the button to add widget to the home screen. [CHAR_LIMIT=none] -->
+ <string name="widget_cell_tap_to_show_add_button_label">Show add button</string>
+ <!-- Accessibility label on the widget preview that on click (if add button is showing) hides the button to add widget to the home screen. [CHAR_LIMIT=none] -->
+ <string name="widget_cell_tap_to_hide_add_button_label">Hide add button</string>
<!-- Text on the button that adds a widget to the home screen. [CHAR_LIMIT=15] -->
<string name="widget_add_button_label">Add</string>
<!-- Accessibility content description for the button that adds a widget to the home screen. The
@@ -458,7 +462,7 @@
<string name="widget_resized">Widget resized to width <xliff:g id="number" example="2">%1$s</xliff:g> height <xliff:g id="number" example="1">%2$s</xliff:g></string>
<!-- Accessibility action to show quick actions menu for an icon. [CHAR_LIMIT=30] -->
- <string name="action_deep_shortcut">Shortcuts</string>
+ <string name="action_deep_shortcut">Shortcut Menu</string>
<!-- Accessibility action to dismiss a notification in the shortcuts menu for an icon. [CHAR_LIMIT=30] -->
<string name="action_dismiss_notification">Dismiss</string>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 1c70d6c..04421c0 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -30,51 +30,6 @@
</style>
<style name="DynamicColorsBaseLauncherTheme" parent="@style/BaseLauncherTheme">
- <item name="materialColorOnSecondaryFixedVariant">@color/system_on_secondary_fixed_variant</item>
- <item name="materialColorOnTertiaryFixedVariant">@color/system_on_tertiary_fixed_variant</item>
- <item name="materialColorSurfaceContainerLowest">@color/system_surface_container_lowest_light</item>
- <item name="materialColorOnPrimaryFixedVariant">@color/system_on_primary_fixed_variant</item>
- <item name="materialColorOnSecondaryContainer">@color/system_on_secondary_container_light</item>
- <item name="materialColorOnTertiaryContainer">@color/system_on_tertiary_container_light</item>
- <item name="materialColorSurfaceContainerLow">@color/system_surface_container_low_light</item>
- <item name="materialColorOnPrimaryContainer">@color/system_on_primary_container_light</item>
- <item name="materialColorSecondaryFixedDim">@color/system_secondary_fixed_dim</item>
- <item name="materialColorOnErrorContainer">@color/system_on_error_container_light</item>
- <item name="materialColorOnSecondaryFixed">@color/system_on_secondary_fixed</item>
- <item name="materialColorInverseOnSurface">@color/system_on_surface_dark</item>
- <item name="materialColorTertiaryFixedDim">@color/system_tertiary_fixed_dim</item>
- <item name="materialColorOnTertiaryFixed">@color/system_on_tertiary_fixed</item>
- <item name="materialColorPrimaryFixedDim">@color/system_primary_fixed_dim</item>
- <item name="materialColorSecondaryContainer">@color/system_secondary_container_light</item>
- <item name="materialColorErrorContainer">@color/system_error_container_light</item>
- <item name="materialColorOnPrimaryFixed">@color/system_on_primary_fixed</item>
- <item name="materialColorInversePrimary">@color/system_primary_dark</item>
- <item name="materialColorSecondaryFixed">@color/system_secondary_fixed</item>
- <item name="materialColorInverseSurface">@color/system_surface_dark</item>
- <item name="materialColorSurfaceVariant">@color/system_surface_variant_light</item>
- <item name="materialColorTertiaryContainer">@color/system_tertiary_container_light</item>
- <item name="materialColorTertiaryFixed">@color/system_tertiary_fixed</item>
- <item name="materialColorPrimaryContainer">@color/system_primary_container_light</item>
- <item name="materialColorOnBackground">@color/system_on_background_light</item>
- <item name="materialColorPrimaryFixed">@color/system_primary_fixed</item>
- <item name="materialColorOnSecondary">@color/system_on_secondary_light</item>
- <item name="materialColorOnTertiary">@color/system_on_tertiary_light</item>
- <item name="materialColorSurfaceDim">@color/system_surface_dim_light</item>
- <item name="materialColorSurfaceBright">@color/system_surface_bright_light</item>
- <item name="materialColorOnError">@color/system_on_error_light</item>
- <item name="materialColorSurface">@color/system_surface_light</item>
- <item name="materialColorSurfaceContainerHigh">@color/system_surface_container_high_light</item>
- <item name="materialColorSurfaceContainerHighest">@color/system_surface_container_highest_light</item>
- <item name="materialColorOnSurfaceVariant">@color/system_on_surface_variant_light</item>
- <item name="materialColorOutline">@color/system_outline_light</item>
- <item name="materialColorOutlineVariant">@color/system_outline_variant_light</item>
- <item name="materialColorOnPrimary">@color/system_on_primary_light</item>
- <item name="materialColorOnSurface">@color/system_on_surface_light</item>
- <item name="materialColorSurfaceContainer">@color/system_surface_container_light</item>
- <item name="materialColorPrimary">@color/system_primary_light</item>
- <item name="materialColorSecondary">@color/system_secondary_light</item>
- <item name="materialColorTertiary">@color/system_tertiary_light</item>
- <item name="materialColorError">@color/system_error_light</item>
</style>
<style name="DynamicColorsBaseLauncherTheme.NoActionBar">
@@ -84,8 +39,8 @@
<style name="LauncherTheme" parent="@style/DynamicColorsBaseLauncherTheme">
<item name="android:textColorSecondary">#DE000000</item>
- <item name="allAppsScrimColor">?attr/materialColorSurfaceDim</item>
- <item name="allappsHeaderProtectionColor">?attr/materialColorSurfaceContainerHighest</item>
+ <item name="allAppsScrimColor">@color/materialColorSurfaceDim</item>
+ <item name="allappsHeaderProtectionColor">@color/materialColorSurfaceContainerHighest</item>
<item name="allAppsNavBarScrimColor">#66FFFFFF</item>
<item name="popupColorPrimary">@color/popup_color_primary_light</item>
<item name="popupColorSecondary">@color/popup_color_secondary_light</item>
@@ -104,15 +59,15 @@
<item name="workspaceKeyShadowColor">#89000000</item>
<item name="widgetsTheme">@style/WidgetContainerTheme</item>
<item name="pageIndicatorDotColor">@color/page_indicator_dot_color_light</item>
- <item name="focusOutlineColor">?attr/materialColorSecondaryFixed</item>
- <item name="focusInnerOutlineColor">?attr/materialColorOnSecondaryFixedVariant</item>
+ <item name="focusOutlineColor">@color/materialColorSecondaryFixed</item>
+ <item name="focusInnerOutlineColor">@color/materialColorOnSecondaryFixedVariant</item>
<item name="folderPreviewColor">@color/folder_preview_light</item>
<item name="folderBackgroundColor">@color/folder_background_light</item>
<item name="folderIconBorderColor">?android:attr/colorPrimary</item>
<item name="isFolderDarkText">true</item>
<item name="folderTextColor">@color/folder_text_color_light</item>
<item name="folderHintTextColor">@color/folder_hint_text_color_light</item>
- <item name="appPairSurfaceInFolder">?attr/materialColorSurfaceContainerLowest</item>
+ <item name="appPairSurfaceInFolder">@color/materialColorSurfaceContainerLowest</item>
<item name="loadingIconColor">#CCFFFFFF</item>
<item name="iconOnlyShortcutColor">?android:attr/textColorSecondary</item>
<item name="eduHalfSheetBGColor">?android:attr/colorAccent</item>
@@ -158,8 +113,8 @@
<item name="android:textColorHint">#A0FFFFFF</item>
<item name="android:colorControlHighlight">#19FFFFFF</item>
<item name="android:colorPrimary">#FF212121</item>
- <item name="allAppsScrimColor">?attr/materialColorSurfaceDim</item>
- <item name="allappsHeaderProtectionColor">?attr/materialColorSurfaceContainerLow</item>
+ <item name="allAppsScrimColor">@color/materialColorSurfaceDim</item>
+ <item name="allappsHeaderProtectionColor">@color/materialColorSurfaceContainerLow</item>
<item name="allAppsNavBarScrimColor">#80000000</item>
<item name="popupColorPrimary">@color/popup_color_primary_dark</item>
<item name="popupColorSecondary">@color/popup_color_secondary_dark</item>
@@ -178,7 +133,7 @@
<item name="isFolderDarkText">false</item>
<item name="folderTextColor">@color/folder_text_color_dark</item>
<item name="folderHintTextColor">@color/folder_hint_text_color_dark</item>
- <item name="appPairSurfaceInFolder">?attr/materialColorSurfaceContainerLowest</item>
+ <item name="appPairSurfaceInFolder">@color/materialColorSurfaceContainerLowest</item>
<item name="isMainColorDark">true</item>
<item name="loadingIconColor">#99FFFFFF</item>
<item name="iconOnlyShortcutColor">#B3FFFFFF</item>
@@ -482,7 +437,7 @@
<style name="PrivateSpaceHeaderTextStyle">
<item name="android:textSize">16sp</item>
- <item name="android:textColor">?attr/materialColorOnSurface</item>
+ <item name="android:textColor">@color/materialColorOnSurface</item>
<item name="android:fontFamily">google-sans-text-medium</item>
<item name="android:ellipsize">end</item>
</style>
diff --git a/res/xml/backupscheme.xml b/res/xml/backupscheme.xml
index 34b80b1..083af5c 100644
--- a/res/xml/backupscheme.xml
+++ b/res/xml/backupscheme.xml
@@ -11,6 +11,7 @@
<include domain="database" path="launcher_3_by_3.db" />
<include domain="database" path="launcher_2_by_2.db" />
<include domain="database" path="launcher_7_by_3.db" />
+ <include domain="database" path="launcher_8_by_3.db" />
<include domain="sharedpref" path="com.android.launcher3.prefs.xml" />
<include domain="file" path="downgrade_schema.json" />
diff --git a/src/com/android/launcher3/BaseDraggingActivity.java b/src/com/android/launcher3/BaseDraggingActivity.java
index 50e78ac..3b93cf4 100644
--- a/src/com/android/launcher3/BaseDraggingActivity.java
+++ b/src/com/android/launcher3/BaseDraggingActivity.java
@@ -80,12 +80,16 @@
updateTheme();
}
- protected void updateTheme() {
+ private void updateTheme() {
if (mThemeRes != Themes.getActivityThemeRes(this)) {
- recreate();
+ recreateToUpdateTheme();
}
}
+ protected void recreateToUpdateTheme() {
+ recreate();
+ }
+
@Override
public void onActionModeStarted(ActionMode mode) {
super.onActionModeStarted(mode);
diff --git a/src/com/android/launcher3/BubbleTextView.java b/src/com/android/launcher3/BubbleTextView.java
index ef5c88a..247ee48 100644
--- a/src/com/android/launcher3/BubbleTextView.java
+++ b/src/com/android/launcher3/BubbleTextView.java
@@ -730,16 +730,27 @@
Paint.FontMetrics fm = getPaint().getFontMetrics();
Rect tmpRect = new Rect();
getDrawingRect(tmpRect);
+ CharSequence text = getText();
- if (mIcon == null) {
- appTitleBounds = new RectF(0, 0, tmpRect.right,
- (int) Math.ceil(fm.bottom - fm.top));
- } else {
+ int mAppTitleHorizontalPadding = getResources().getDimensionPixelSize(
+ R.dimen.app_title_pill_horizontal_padding);
+ int mRoundRectPadding = getResources().getDimensionPixelSize(
+ R.dimen.app_title_pill_round_rect_padding);
+
+ float titleLength = (getPaint().measureText(text, 0, text.length())
+ + (mAppTitleHorizontalPadding + mRoundRectPadding) * 2);
+ titleLength = Math.min(titleLength, tmpRect.width());
+ appTitleBounds = new RectF((tmpRect.width() - titleLength) / 2.f - getCompoundPaddingLeft(),
+ 0, (tmpRect.width() + titleLength) / 2.f + getCompoundPaddingRight(),
+ (int) Math.ceil(fm.bottom - fm.top));
+ appTitleBounds.inset(mRoundRectPadding * 2, 0);
+
+
+ if (mIcon != null) {
Rect iconBounds = new Rect();
getIconBounds(iconBounds);
int textStart = iconBounds.bottom + getCompoundDrawablePadding();
- appTitleBounds = new RectF(tmpRect.left, textStart, tmpRect.right,
- textStart + (int) Math.ceil(fm.bottom - fm.top));
+ appTitleBounds.offset(0, textStart);
}
canvas.drawRoundRect(appTitleBounds, appTitleBounds.height() / 2,
@@ -851,6 +862,16 @@
setPadding(getPaddingLeft(), (height - cellHeightPx) / 2, getPaddingRight(),
getPaddingBottom());
}
+ if (shouldDrawAppContrastTile()) {
+ int mAppTitleHorizontalPadding = getResources().getDimensionPixelSize(
+ R.dimen.app_title_pill_horizontal_padding);
+ int mRoundRectPadding = getResources().getDimensionPixelSize(
+ R.dimen.app_title_pill_round_rect_padding);
+
+ setPadding(mAppTitleHorizontalPadding + mRoundRectPadding, getPaddingTop(),
+ mAppTitleHorizontalPadding + mRoundRectPadding,
+ getPaddingBottom());
+ }
// Only apply two line for all_apps and device search only if necessary.
if (shouldUseTwoLine() && (mLastOriginalText != null)) {
int allowedVerticalSpace = height - getPaddingTop() - getPaddingBottom()
@@ -959,7 +980,7 @@
public boolean shouldDrawAppContrastTile() {
return mDisplay == DISPLAY_WORKSPACE && shouldTextBeVisible()
&& PillColorProvider.getInstance(getContext()).isMatchaEnabled()
- && enableContrastTiles();
+ && enableContrastTiles() && !TextUtils.isEmpty(getText());
}
public void setTextVisibility(boolean visible) {
diff --git a/src/com/android/launcher3/ButtonDropTarget.java b/src/com/android/launcher3/ButtonDropTarget.java
index 3d715e5..18619f5 100644
--- a/src/com/android/launcher3/ButtonDropTarget.java
+++ b/src/com/android/launcher3/ButtonDropTarget.java
@@ -41,8 +41,11 @@
import com.android.launcher3.dragndrop.DragOptions;
import com.android.launcher3.dragndrop.DragView;
import com.android.launcher3.model.data.ItemInfo;
+import com.android.launcher3.util.MSDLPlayerWrapper;
import com.android.launcher3.views.ActivityContext;
+import com.google.android.msdl.data.model.MSDLToken;
+
/**
* Implements a DropTarget.
*/
@@ -62,6 +65,7 @@
protected final ActivityContext mActivityContext;
protected final DropTargetHandler mDropTargetHandler;
protected DropTargetBar mDropTargetBar;
+ private MSDLPlayerWrapper mMSDLPlayerWrapper;
/** Whether this drop target is active for the current drag */
protected boolean mActive;
@@ -94,6 +98,7 @@
super(context, attrs, defStyle);
mActivityContext = ActivityContext.lookupContext(context);
mDropTargetHandler = mActivityContext.getDropTargetHandler();
+ mMSDLPlayerWrapper = MSDLPlayerWrapper.INSTANCE.get(context);
Resources resources = getResources();
mDragDistanceThreshold = resources.getDimensionPixelSize(R.dimen.drag_distanceThreshold);
@@ -142,6 +147,10 @@
@Override
public final void onDragEnter(DragObject d) {
+ // Perform Haptic feedback
+ if (Flags.msdlFeedback()) {
+ mMSDLPlayerWrapper.playToken(MSDLToken.SWIPE_THRESHOLD_INDICATOR);
+ }
if (!mAccessibleDrag && !mTextVisible) {
// Show tooltip
hideTooltip();
@@ -429,6 +438,11 @@
return textHeight + getPaddingTop() + getPaddingBottom() >= availableHeight;
}
+ @VisibleForTesting
+ public void setMSDLPlayerWrapper(MSDLPlayerWrapper wrapper) {
+ mMSDLPlayerWrapper = wrapper;
+ }
+
/**
* Reduce the size of the text until it fits the measured width or reaches a minimum.
*
diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java
index ee72c22..df5f520 100644
--- a/src/com/android/launcher3/CellLayout.java
+++ b/src/com/android/launcher3/CellLayout.java
@@ -71,6 +71,7 @@
import com.android.launcher3.model.data.LauncherAppWidgetInfo;
import com.android.launcher3.util.CellAndSpan;
import com.android.launcher3.util.GridOccupancy;
+import com.android.launcher3.util.MSDLPlayerWrapper;
import com.android.launcher3.util.MultiTranslateDelegate;
import com.android.launcher3.util.ParcelableSparseArray;
import com.android.launcher3.util.Themes;
@@ -78,6 +79,8 @@
import com.android.launcher3.views.ActivityContext;
import com.android.launcher3.widget.LauncherAppWidgetHostView;
+import com.google.android.msdl.data.model.MSDLToken;
+
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
@@ -204,6 +207,8 @@
private static final Paint sPaint = new Paint();
+ private final MSDLPlayerWrapper mMSDLPlayerWrapper;
+
// Related to accessible drag and drop
DragAndDropAccessibilityDelegate mTouchHelper;
@@ -237,6 +242,8 @@
mContainerType = a.getInteger(R.styleable.CellLayout_containerType, WORKSPACE);
a.recycle();
+ mMSDLPlayerWrapper = MSDLPlayerWrapper.INSTANCE.get(context);
+
// A ViewGroup usually does not draw, but CellLayout needs to draw a rectangle to show
// the user where a dragged item will land when dropped.
setWillNotDraw(false);
@@ -1153,6 +1160,9 @@
DropTarget.DragObject dragObject) {
if (mDragCell[0] != cellX || mDragCell[1] != cellY || mDragCellSpan[0] != spanX
|| mDragCellSpan[1] != spanY) {
+ if (Flags.msdlFeedback()) {
+ mMSDLPlayerWrapper.playToken(MSDLToken.DRAG_INDICATOR_DISCRETE);
+ }
mDragCell[0] = cellX;
mDragCell[1] = cellY;
mDragCellSpan[0] = spanX;
diff --git a/src/com/android/launcher3/DeleteDropTarget.java b/src/com/android/launcher3/DeleteDropTarget.java
index 58789fd..425f277 100644
--- a/src/com/android/launcher3/DeleteDropTarget.java
+++ b/src/com/android/launcher3/DeleteDropTarget.java
@@ -130,7 +130,6 @@
public void completeDrop(DragObject d) {
ItemInfo item = d.dragInfo;
if (canRemove(item)) {
- onAccessibilityDrop(null, item);
mDropTargetHandler.onDeleteComplete(item);
}
}
diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java
index 78535a1..f1274dc 100644
--- a/src/com/android/launcher3/DeviceProfile.java
+++ b/src/com/android/launcher3/DeviceProfile.java
@@ -425,7 +425,9 @@
&& WindowManagerProxy.INSTANCE.get(context).isTaskbarDrawnInProcess();
// Some more constants.
- context = getContext(context, info, isVerticalBarLayout() || (isTablet && isLandscape)
+ context = getContext(context, info, inv.isFixedLandscape
+ || isVerticalBarLayout()
+ || (isTablet && isLandscape)
? Configuration.ORIENTATION_LANDSCAPE
: Configuration.ORIENTATION_PORTRAIT,
windowBounds);
@@ -865,7 +867,7 @@
canQsbInline = canQsbInline && hotseatQsbHeight > 0;
return (mIsScalableGrid && inv.inlineQsb[mTypeIndex] && canQsbInline)
- || inv.isFixedLandscapeMode;
+ || inv.isFixedLandscape;
}
private static DotRenderer createDotRenderer(
@@ -1833,7 +1835,8 @@
workspacePageIndicatorHeight - mWorkspacePageIndicatorOverlapWorkspace;
}
int paddingTop = workspaceTopPadding + (mIsScalableGrid ? 0 : edgeMarginPx);
- int paddingSide = desiredWorkspaceHorizontalMarginPx;
+ // On isFixedLandscapeMode on phones we already have padding because of the camera hole
+ int paddingSide = inv.isFixedLandscape ? 0 : desiredWorkspaceHorizontalMarginPx;
padding.set(paddingSide, paddingTop, paddingSide, paddingBottom);
}
@@ -1860,13 +1863,15 @@
* the bubble bar.
*
* <p>Does not check for visible bubbles persistence, so caller should call
- * {@link #shouldAdjustHotseatForBubbleBar} first.
+ * {@link #shouldAdjustHotseatOrQsbForBubbleBar} first.
*
* <p>If there's no adjustment needed, this method returns {@code 0}.
- * @see #shouldAdjustHotseatForBubbleBar(Context, boolean)
+ * @see #shouldAdjustHotseatOrQsbForBubbleBar(Context, boolean)
*/
public float getHotseatAdjustedBorderSpaceForBubbleBar(Context context) {
- if (!shouldAdjustHotseatForBubbleBar(context)) return 0;
+ if (shouldAlignBubbleBarWithQSB() || !shouldAdjustHotseatOrQsbForBubbleBar(context)) {
+ return 0;
+ }
// The adjustment is shrinking the hotseat's width by 1 icon on either side.
int iconsWidth =
iconSizePx * numShownHotseatIcons + hotseatBorderSpace * (numShownHotseatIcons - 1);
@@ -1879,27 +1884,37 @@
* Returns the hotseat icon translation X for the cellX index.
*
* <p>Does not check for visible bubbles persistence, so caller should call
- * {@link #shouldAdjustHotseatForBubbleBar} first.
+ * {@link #shouldAdjustHotseatOrQsbForBubbleBar} first.
*
* <p>If there's no adjustment needed, this method returns {@code 0}.
- * @see #shouldAdjustHotseatForBubbleBar(Context, boolean)
+ * @see #shouldAdjustHotseatOrQsbForBubbleBar(Context, boolean)
*/
public float getHotseatAdjustedTranslation(Context context, int cellX) {
- if (!shouldAdjustHotseatForBubbleBar(context)) return 0;
float borderSpace = getHotseatAdjustedBorderSpaceForBubbleBar(context);
+ if (borderSpace == 0) return borderSpace;
float borderSpaceDelta = borderSpace - hotseatBorderSpace;
return iconSizePx + cellX * borderSpaceDelta;
}
- /** Returns whether hotseat should be adjusted for the bubble bar. */
- public boolean shouldAdjustHotseatForBubbleBar(Context context, boolean hasBubbles) {
- return hasBubbles && shouldAdjustHotseatForBubbleBar(context);
+ /** Returns whether hotseat or QSB should be adjusted for the bubble bar. */
+ public boolean shouldAdjustHotseatOrQsbForBubbleBar(Context context, boolean hasBubbles) {
+ return hasBubbles && shouldAdjustHotseatOrQsbForBubbleBar(context);
}
- private boolean shouldAdjustHotseatForBubbleBar(Context context) {
- // only need to adjust if bubble bar is enabled, when QSB is on top of the hotseat and
- // there's not enough space for the bubble bar to the right of the hotseat.
- return !isQsbInline && getHotseatLayoutPadding(context).right <= mBubbleBarSpaceThresholdPx;
+ /** Returns whether hotseat should be adjusted for the bubble bar. */
+ public boolean shouldAdjustHotseatForBubbleBar(Context context, boolean hasBubbles) {
+ return shouldAlignBubbleBarWithHotseat()
+ && shouldAdjustHotseatOrQsbForBubbleBar(context, hasBubbles);
+ }
+
+ /** Returns whether hotseat or QSB should be adjusted for the bubble bar. */
+ public boolean shouldAdjustHotseatOrQsbForBubbleBar(Context context) {
+ // only need to adjust if QSB is on top of the hotseat and there's not enough space for the
+ // bubble bar to either side of the hotseat.
+ if (isQsbInline) return false;
+ Rect hotseatPadding = getHotseatLayoutPadding(context);
+ int hotseatMinHorizontalPadding = Math.min(hotseatPadding.left, hotseatPadding.right);
+ return hotseatMinHorizontalPadding <= mBubbleBarSpaceThresholdPx;
}
/**
@@ -1921,7 +1936,7 @@
hotseatBarPadding.set(mHotseatBarWorkspaceSpacePx, paddingTop,
mInsets.right + mHotseatBarEdgePaddingPx, paddingBottom);
}
- } else if (isTaskbarPresent || inv.isFixedLandscapeMode) {
+ } else if (isTaskbarPresent || inv.isFixedLandscape) {
// Center the QSB vertically with hotseat
int hotseatBarBottomPadding = getHotseatBarBottomPadding();
int hotseatBarTopPadding =
@@ -1940,11 +1955,9 @@
}
startSpacing += getAdditionalQsbSpace();
- if (inv.isFixedLandscapeMode) {
- endSpacing += workspacePadding.right + cellLayoutPaddingPx.right
- + mInsets.right;
- startSpacing += workspacePadding.left + cellLayoutPaddingPx.left
- + mInsets.left;
+ if (inv.isFixedLandscape) {
+ endSpacing += mInsets.right;
+ startSpacing += mInsets.left;
}
hotseatBarPadding.top = hotseatBarTopPadding;
@@ -2056,15 +2069,29 @@
}
/**
- * Returns the number of pixels the hotseat icons vertical center is translated from the bottom
- * of the screen.
+ * Returns the number of pixels the hotseat icons or QSB vertical center is translated from the
+ * bottom of the screen.
*/
- public int getHotseatVerticalCenter() {
- return hotseatBarSizePx
- - (isQsbInline ? 0 : hotseatQsbVisualHeight)
- - hotseatQsbSpace
- - (hotseatCellHeightPx / 2)
- + ((hotseatCellHeightPx - iconSizePx) / 2);
+ public int getBubbleBarVerticalCenterForHome() {
+ if (shouldAlignBubbleBarWithHotseat()) {
+ return hotseatBarSizePx
+ - (isQsbInline ? 0 : hotseatQsbVisualHeight)
+ - hotseatQsbSpace
+ - (hotseatCellHeightPx / 2)
+ + ((hotseatCellHeightPx - iconSizePx) / 2);
+ } else {
+ return hotseatBarSizePx - (hotseatQsbVisualHeight / 2);
+ }
+ }
+
+ /** Returns whether bubble bar should be aligned with the hotseat. */
+ public boolean shouldAlignBubbleBarWithQSB() {
+ return !shouldAlignBubbleBarWithHotseat();
+ }
+
+ /** Returns whether bubble bar should be aligned with the hotseat. */
+ public boolean shouldAlignBubbleBarWithHotseat() {
+ return isQsbInline || isGestureMode;
}
/**
@@ -2543,7 +2570,7 @@
}
if (mTransposeLayoutWithOrientation == null) {
mTransposeLayoutWithOrientation =
- !(mInfo.isTablet(mWindowBounds) || mInv.isFixedLandscapeMode);
+ !(mInfo.isTablet(mWindowBounds) || mInv.isFixedLandscape);
}
if (mIsGestureMode == null) {
mIsGestureMode = mInfo.getNavigationMode().hasGestures;
diff --git a/src/com/android/launcher3/DropTargetHandler.kt b/src/com/android/launcher3/DropTargetHandler.kt
index f1029b1..4d3fe52 100644
--- a/src/com/android/launcher3/DropTargetHandler.kt
+++ b/src/com/android/launcher3/DropTargetHandler.kt
@@ -65,6 +65,7 @@
}
fun onDeleteComplete(item: ItemInfo) {
+ removeItemAndStripEmptyScreens(null /* view */, item)
var pageItem: ItemInfo = item
if (item.container <= 0) {
val v = mLauncher.workspace.getHomescreenIconByItemId(item.container)
@@ -90,11 +91,7 @@
}
fun onAccessibilityDelete(view: View?, item: ItemInfo, announcement: CharSequence) {
- // Remove the item from launcher and the db, we can ignore the containerInfo in this call
- // because we already remove the drag view from the folder (if the drag originated from
- // a folder) in Folder.beginDrag()
- mLauncher.removeItem(view, item, true /* deleteFromDb */, "removed by accessibility drop")
- mLauncher.workspace.stripEmptyScreens()
+ removeItemAndStripEmptyScreens(view, item)
mLauncher.dragLayer.announceForAccessibility(announcement)
}
@@ -105,4 +102,12 @@
fun onClick(buttonDropTarget: ButtonDropTarget) {
mLauncher.accessibilityDelegate.handleAccessibleDrop(buttonDropTarget, null, null)
}
+
+ private fun removeItemAndStripEmptyScreens(view: View?, item: ItemInfo) {
+ // Remove the item from launcher and the db, we can ignore the containerInfo in this call
+ // because we already remove the drag view from the folder (if the drag originated from
+ // a folder) in Folder.beginDrag()
+ mLauncher.removeItem(view, item, true /* deleteFromDb */, "removed by accessibility drop")
+ mLauncher.workspace.stripEmptyScreens()
+ }
}
diff --git a/src/com/android/launcher3/Hotseat.java b/src/com/android/launcher3/Hotseat.java
index b2ccba4..6be8098 100644
--- a/src/com/android/launcher3/Hotseat.java
+++ b/src/com/android/launcher3/Hotseat.java
@@ -186,9 +186,10 @@
*/
public void adjustForBubbleBar(boolean isBubbleBarVisible) {
DeviceProfile dp = mActivity.getDeviceProfile();
- float adjustedBorderSpace = dp.getHotseatAdjustedBorderSpaceForBubbleBar(getContext());
- boolean shouldAdjustHotseat = isBubbleBarVisible
- && Float.compare(adjustedBorderSpace, 0f) != 0;
+ boolean shouldAdjust = isBubbleBarVisible
+ && dp.shouldAdjustHotseatOrQsbForBubbleBar(getContext());
+ boolean shouldAdjustHotseat = shouldAdjust
+ && dp.shouldAlignBubbleBarWithHotseat();
ShortcutAndWidgetContainer icons = getShortcutsAndWidgets();
// update the translation provider for future layout passes of hotseat icons.
if (shouldAdjustHotseat) {
@@ -209,9 +210,12 @@
animatorSet.play(ObjectAnimator.ofFloat(child, VIEW_TRANSLATE_X, tx));
}
}
+ //TODO(b/381109832) refactor & simplify adjustment logic
+ boolean shouldAdjustQsb =
+ shouldAdjustHotseat || (shouldAdjust && dp.shouldAlignBubbleBarWithQSB());
if (mQsb instanceof HorizontalInsettableView horizontalInsettableQsb) {
final float currentInsetFraction = horizontalInsettableQsb.getHorizontalInsets();
- final float targetInsetFraction = shouldAdjustHotseat
+ final float targetInsetFraction = shouldAdjustQsb
? (float) dp.iconSizePx / dp.hotseatQsbWidth : 0;
ValueAnimator qsbAnimator =
ValueAnimator.ofFloat(currentInsetFraction, targetInsetFraction);
diff --git a/src/com/android/launcher3/InvariantDeviceProfile.java b/src/com/android/launcher3/InvariantDeviceProfile.java
index e18862a..5becdde 100644
--- a/src/com/android/launcher3/InvariantDeviceProfile.java
+++ b/src/com/android/launcher3/InvariantDeviceProfile.java
@@ -63,6 +63,7 @@
import com.android.launcher3.util.ResourceHelper;
import com.android.launcher3.util.SafeCloseable;
import com.android.launcher3.util.WindowBounds;
+import com.android.launcher3.util.window.CachedDisplayInfo;
import com.android.launcher3.util.window.WindowManagerProxy;
import org.xmlpull.v1.XmlPullParser;
@@ -188,7 +189,7 @@
@XmlRes
public int workspaceSpecsId = INVALID_RESOURCE_HANDLE;
@XmlRes
- public int rowCountSpecsId = INVALID_RESOURCE_HANDLE;;
+ public int gridSizeSpecsId = INVALID_RESOURCE_HANDLE;;
@XmlRes
public int workspaceSpecsTwoPanelId = INVALID_RESOURCE_HANDLE;
@XmlRes
@@ -216,7 +217,7 @@
/**
* Fixed landscape mode is the landscape on the phones.
*/
- public boolean isFixedLandscapeMode = false;
+ public boolean isFixedLandscape = false;
private LauncherPrefChangeListener mLandscapeModePreferenceListener;
public String dbFile;
@@ -240,10 +241,7 @@
@TargetApi(23)
private InvariantDeviceProfile(Context context) {
String gridName = getCurrentGridName(context);
- String newGridName = initGrid(context, gridName);
- if (!newGridName.equals(gridName)) {
- LauncherPrefs.get(context).put(GRID_NAME, newGridName);
- }
+ initGrid(context, gridName);
DisplayController.INSTANCE.get(context).setPriorityListener(
(displayContext, info, flags) -> {
@@ -255,9 +253,12 @@
});
if (Flags.oneGridSpecs()) {
mLandscapeModePreferenceListener = (String s) -> {
- boolean newFixedLandscapeValue = FIXED_LANDSCAPE_MODE.get(context);
- if (isFixedLandscapeMode != newFixedLandscapeValue) {
- setFixedLandscape(context, newFixedLandscapeValue);
+ if (isFixedLandscape != FIXED_LANDSCAPE_MODE.get(context)) {
+ MAIN_EXECUTOR.execute(() -> {
+ Trace.beginSection("InvariantDeviceProfile#setFixedLandscape");
+ onConfigChanged(context.getApplicationContext());
+ Trace.endSection();
+ });
}
};
LauncherPrefs.INSTANCE.get(context).addListener(
@@ -295,7 +296,7 @@
gridName,
defaultInfo,
/*allowDisabledGrid=*/false,
- isFixedLandscapeMode
+ FIXED_LANDSCAPE_MODE.get(context)
),
defaultDeviceType);
@@ -309,7 +310,7 @@
gridName,
myInfo,
/*allowDisabledGrid=*/false,
- isFixedLandscapeMode
+ FIXED_LANDSCAPE_MODE.get(context)
),
deviceType);
@@ -345,13 +346,7 @@
}
private String initGrid(Context context, String gridName) {
- if (!Flags.oneGridSpecs() && (isFixedLandscapeMode || FIXED_LANDSCAPE_MODE.get(context))) {
- LauncherPrefs.get(context).put(FIXED_LANDSCAPE_MODE, false);
- isFixedLandscapeMode = false;
- }
-
Info displayInfo = DisplayController.INSTANCE.get(context).getInfo();
-
List<DisplayOption> allOptions = getPredefinedDeviceProfiles(
context,
gridName,
@@ -370,6 +365,11 @@
? new ArrayList<>(allOptions)
: new ArrayList<>(allOptionsFilteredByColCount),
displayInfo.getDeviceType());
+
+ if (!displayOption.grid.name.equals(gridName)) {
+ LauncherPrefs.get(context).put(GRID_NAME, displayOption.grid.name);
+ }
+
initGrid(context, displayInfo, displayOption);
return displayOption.grid.name;
}
@@ -413,7 +413,7 @@
isScalable = closestProfile.isScalable;
devicePaddingId = closestProfile.devicePaddingId;
workspaceSpecsId = closestProfile.mWorkspaceSpecsId;
- rowCountSpecsId = closestProfile.mRowCountSpecsId;
+ gridSizeSpecsId = closestProfile.mGridSizeSpecsId;
workspaceSpecsTwoPanelId = closestProfile.mWorkspaceSpecsTwoPanelId;
allAppsSpecsId = closestProfile.mAllAppsSpecsId;
allAppsSpecsTwoPanelId = closestProfile.mAllAppsSpecsTwoPanelId;
@@ -473,7 +473,7 @@
startAlignTaskbar = displayOption.startAlignTaskbar;
// Fixed Landscape mode
- isFixedLandscapeMode = FIXED_LANDSCAPE_MODE.get(context) && Flags.oneGridSpecs();
+ isFixedLandscape = closestProfile.mIsFixedLandscape;
// If the partner customization apk contains any grid overrides, apply them
// Supported overrides: numRows, numColumns, iconSize
@@ -543,24 +543,6 @@
});
}
- /**
- * Updates the fixed landscape mode, this triggers a new IDP, reloads the database and triggers
- * a grid migration.
- */
- public void setFixedLandscape(Context context, boolean isFixedLandscape) {
- this.isFixedLandscapeMode = isFixedLandscape;
- if (isFixedLandscape) {
- // When in isFixedLandscape there should only be one default grid to choose from
- MAIN_EXECUTOR.execute(() -> {
- Trace.beginSection("InvariantDeviceProfile#setFixedLandscape");
- onConfigChanged(context.getApplicationContext());
- Trace.endSection();
- });
- } else {
- setCurrentGrid(context, LauncherPrefs.get(context).get(GRID_NAME));
- }
- }
-
private Object[] toModelState() {
return new Object[]{
numColumns, numRows, numSearchContainerColumns, numDatabaseHotseatIcons,
@@ -651,14 +633,14 @@
}
/**
- * Parses through the xml to find NumRows specs. Then calls findBestRowCount to get the correct
- * row count for this GridOption.
+ * Parses through the xml to find GridSize specs. Then calls findBestGridSize to get the
+ * correct grid size for this GridOption.
*
- * @return the result of {@link #findBestRowCount(List, Info)}.
+ * @return the result of {@link #findBestGridSize(List, int, int)}.
*/
- public static NumRows getRowCount(ResourceHelper resourceHelper, Context context,
+ private static GridSize getGridSize(ResourceHelper resourceHelper, Context context,
Info displayInfo) {
- ArrayList<NumRows> rowCounts = new ArrayList<>();
+ ArrayList<GridSize> gridSizes = new ArrayList<>();
try (XmlResourceParser parser = resourceHelper.getXml()) {
final int depth = parser.getDepth();
@@ -666,52 +648,49 @@
while (((type = parser.next()) != XmlPullParser.END_TAG
|| parser.getDepth() > depth) && type != XmlPullParser.END_DOCUMENT) {
if ((type == XmlPullParser.START_TAG)
- && "NumRows".equals(parser.getName())) {
- rowCounts.add(new NumRows(context, Xml.asAttributeSet(parser)));
+ && "GridSize".equals(parser.getName())) {
+ gridSizes.add(new GridSize(context, Xml.asAttributeSet(parser)));
}
}
} catch (IOException | XmlPullParserException e) {
throw new RuntimeException(e);
}
- return findBestRowCount(rowCounts, displayInfo);
+ // Finds the min width and height in dp for all displays.
+ int[] dimens = findMinWidthAndHeightDpForDevice(displayInfo);
+
+ return findBestGridSize(gridSizes, dimens[0], dimens[1]);
}
/**
- * @return the biggest row count that fits the display dimensions spec using NumRows to
- * determine that. If no best row count is found, return -1.
+ * @return the biggest grid size that fits the display dimensions.
+ * If no best grid size is found, return null.
*/
- public static NumRows findBestRowCount(List<NumRows> list, Info displayInfo) {
- int minWidthPx = Integer.MAX_VALUE;
- int minHeightPx = Integer.MAX_VALUE;
- for (WindowBounds bounds : displayInfo.supportedBounds) {
- boolean isTablet = displayInfo.isTablet(bounds);
- if (isTablet && displayInfo.getDeviceType() == TYPE_MULTI_DISPLAY) {
- // For split displays, take half width per page
- minWidthPx = Math.min(minWidthPx, bounds.availableSize.x / 2);
- minHeightPx = Math.min(minHeightPx, bounds.availableSize.y);
- } else if (!isTablet && bounds.isLandscape()) {
- // We will use transposed layout in this case
- minWidthPx = Math.min(minWidthPx, bounds.availableSize.y);
- minHeightPx = Math.min(minHeightPx, bounds.availableSize.x);
- } else {
- minWidthPx = Math.min(minWidthPx, bounds.availableSize.x);
- minHeightPx = Math.min(minHeightPx, bounds.availableSize.y);
- }
- }
-
- NumRows selectedRow = null;
- for (NumRows item: list) {
- if (minWidthPx >= item.mMinDeviceWidthPx && minHeightPx >= item.mMinDeviceHeightPx) {
- if (selectedRow == null || selectedRow.mNumRowsNew < item.mNumRowsNew) {
- selectedRow = item;
+ private static GridSize findBestGridSize(List<GridSize> list, int minWidthDp,
+ int minHeightDp) {
+ GridSize selectedGridSize = null;
+ for (GridSize item: list) {
+ if (minWidthDp >= item.mMinDeviceWidthDp && minHeightDp >= item.mMinDeviceHeightDp) {
+ if (selectedGridSize == null
+ || (selectedGridSize.mNumColumns <= item.mNumColumns
+ && selectedGridSize.mNumRows <= item.mNumRows)) {
+ selectedGridSize = item;
}
}
}
- if (selectedRow != null) {
- return selectedRow;
+ return selectedGridSize;
+ }
+
+ private static int[] findMinWidthAndHeightDpForDevice(Info displayInfo) {
+ int minDisplayWidthDp = Integer.MAX_VALUE;
+ int minDisplayHeightDp = Integer.MAX_VALUE;
+ for (CachedDisplayInfo display: displayInfo.getAllDisplays()) {
+ minDisplayWidthDp = Math.min(minDisplayWidthDp,
+ (int) dpiFromPx(display.size.x, DisplayMetrics.DENSITY_DEVICE_STABLE));
+ minDisplayHeightDp = Math.min(minDisplayHeightDp,
+ (int) dpiFromPx(display.size.y, DisplayMetrics.DENSITY_DEVICE_STABLE));
}
- return null;
+ return new int[]{minDisplayWidthDp, minDisplayHeightDp};
}
/**
@@ -759,7 +738,7 @@
return parseAllDefinedGridOptions(context, displayInfo)
.stream()
.filter(go -> go.isEnabled(deviceType))
- .filter(go -> go.filterByFlag(deviceType, isFixedLandscapeMode))
+ .filter(go -> go.filterByFlag(deviceType, isFixedLandscape))
.collect(Collectors.toList());
}
@@ -1029,7 +1008,7 @@
private final int mWorkspaceCellSpecsTwoPanelId;
private final int mAllAppsCellSpecsId;
private final int mAllAppsCellSpecsTwoPanelId;
- private final int mRowCountSpecsId;
+ private final int mGridSizeSpecsId;
private final boolean mIsFixedLandscape;
private final boolean mIsOldGrid;
@@ -1040,18 +1019,20 @@
title = a.getString(R.styleable.GridDisplayOption_title);
deviceCategory = a.getInt(R.styleable.GridDisplayOption_deviceCategory,
DEVICE_CATEGORY_ALL);
- mRowCountSpecsId = a.getResourceId(
- R.styleable.GridDisplayOption_rowCountSpecsId, INVALID_RESOURCE_HANDLE);
+ mGridSizeSpecsId = a.getResourceId(
+ R.styleable.GridDisplayOption_gridSizeSpecsId, INVALID_RESOURCE_HANDLE);
mIsDualGrid = a.getBoolean(R.styleable.GridDisplayOption_isDualGrid, false);
- if (mRowCountSpecsId != INVALID_RESOURCE_HANDLE) {
- ResourceHelper resourceHelper = new ResourceHelper(context, mRowCountSpecsId);
- NumRows numR = getRowCount(resourceHelper, context, displayInfo);
- numRows = numR.mNumRowsNew;
- dbFile = numR.mDbFile;
- defaultLayoutId = numR.mDefaultLayoutId;
- demoModeLayoutId = numR.mDemoModeLayoutId;
+ if (mGridSizeSpecsId != INVALID_RESOURCE_HANDLE) {
+ ResourceHelper resourceHelper = new ResourceHelper(context, mGridSizeSpecsId);
+ GridSize gridSize = getGridSize(resourceHelper, context, displayInfo);
+ numColumns = gridSize.mNumColumns;
+ numRows = gridSize.mNumRows;
+ dbFile = gridSize.mDbFile;
+ defaultLayoutId = gridSize.mDefaultLayoutId;
+ demoModeLayoutId = gridSize.mDemoModeLayoutId;
} else {
numRows = a.getInt(R.styleable.GridDisplayOption_numRows, 0);
+ numColumns = a.getInt(R.styleable.GridDisplayOption_numColumns, 0);
dbFile = a.getString(R.styleable.GridDisplayOption_dbFile);
defaultLayoutId = a.getResourceId(
R.styleable.GridDisplayOption_defaultLayoutId, 0);
@@ -1059,7 +1040,6 @@
R.styleable.GridDisplayOption_demoModeLayoutId, defaultLayoutId);
}
- numColumns = a.getInt(R.styleable.GridDisplayOption_numColumns, 0);
numSearchContainerColumns = a.getInt(
R.styleable.GridDisplayOption_numSearchContainerColumns, numColumns);
@@ -1222,7 +1202,7 @@
}
// Here we return true if we want to show the new grids.
- if (mRowCountSpecsId != INVALID_RESOURCE_HANDLE) {
+ if (mGridSizeSpecsId != INVALID_RESOURCE_HANDLE) {
return Flags.oneGridSpecs();
}
@@ -1235,26 +1215,28 @@
}
}
- public static final class NumRows {
- final int mNumRowsNew;
- final float mMinDeviceWidthPx;
- final float mMinDeviceHeightPx;
+ public static final class GridSize {
+ final int mNumRows;
+ final int mNumColumns;
+ final float mMinDeviceWidthDp;
+ final float mMinDeviceHeightDp;
final String mDbFile;
final int mDefaultLayoutId;
final int mDemoModeLayoutId;
- NumRows(Context context, AttributeSet attrs) {
- TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.NumRows);
+ GridSize(Context context, AttributeSet attrs) {
+ TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.GridSize);
- mNumRowsNew = (int) a.getFloat(R.styleable.NumRows_numRowsNew, 0);
- mMinDeviceWidthPx = a.getFloat(R.styleable.NumRows_minDeviceWidthPx, 0);
- mMinDeviceHeightPx = a.getFloat(R.styleable.NumRows_minDeviceHeightPx, 0);
- mDbFile = a.getString(R.styleable.NumRows_dbFile);
+ mNumRows = (int) a.getFloat(R.styleable.GridSize_numGridRows, 0);
+ mNumColumns = (int) a.getFloat(R.styleable.GridSize_numGridColumns, 0);
+ mMinDeviceWidthDp = a.getFloat(R.styleable.GridSize_minDeviceWidthDp, 0);
+ mMinDeviceHeightDp = a.getFloat(R.styleable.GridSize_minDeviceHeightDp, 0);
+ mDbFile = a.getString(R.styleable.GridSize_dbFile);
mDefaultLayoutId = a.getResourceId(
- R.styleable.NumRows_defaultLayoutId, 0);
+ R.styleable.GridSize_defaultLayoutId, 0);
mDemoModeLayoutId = a.getResourceId(
- R.styleable.NumRows_demoModeLayoutId, mDefaultLayoutId);
+ R.styleable.GridSize_demoModeLayoutId, mDefaultLayoutId);
a.recycle();
}
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index 74dd971..5b8d2fc 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -46,6 +46,7 @@
import static com.android.launcher3.LauncherConstants.SavedInstanceKeys.RUNTIME_STATE_PENDING_ACTIVITY_RESULT;
import static com.android.launcher3.LauncherConstants.SavedInstanceKeys.RUNTIME_STATE_PENDING_REQUEST_ARGS;
import static com.android.launcher3.LauncherConstants.SavedInstanceKeys.RUNTIME_STATE_PENDING_REQUEST_CODE;
+import static com.android.launcher3.LauncherConstants.SavedInstanceKeys.RUNTIME_STATE_RECREATE_TO_UPDATE_THEME;
import static com.android.launcher3.LauncherConstants.SavedInstanceKeys.RUNTIME_STATE_WIDGET_PANEL;
import static com.android.launcher3.LauncherConstants.TraceEvents.COLD_STARTUP_TRACE_COOKIE;
import static com.android.launcher3.LauncherConstants.TraceEvents.COLD_STARTUP_TRACE_METHOD_NAME;
@@ -233,6 +234,7 @@
import com.android.launcher3.util.ItemInflater;
import com.android.launcher3.util.KeyboardShortcutsDelegate;
import com.android.launcher3.util.LockedUserState;
+import com.android.launcher3.util.MSDLPlayerWrapper;
import com.android.launcher3.util.PackageUserKey;
import com.android.launcher3.util.PendingRequestArgs;
import com.android.launcher3.util.PluginManagerWrapper;
@@ -421,6 +423,8 @@
private final SettingsCache.OnChangeListener mNaturalScrollingChangedListener =
enabled -> mIsNaturalScrollingEnabled = enabled;
+ private boolean mRecreateToUpdateTheme = false;
+
public static Launcher getLauncher(Context context) {
return fromContext(context);
}
@@ -784,11 +788,11 @@
}
// When the flag oneGridSpecs is on we want to disable ALLOW_ROTATION which is replaced
// by FIXED_LANDSCAPE_MODE, ALLOW_ROTATION will only be used on Tablets afterwards.
- if (!getDeviceProfile().isTablet) {
+ if (getDeviceProfile().isPhone || getDeviceProfile().isTwoPanels) {
LauncherPrefs.get(this).put(LauncherPrefs.ALLOW_ROTATION, false);
}
getRotationHelper().setFixedLandscape(
- Objects.requireNonNull(mDeviceProfile.inv).isFixedLandscapeMode
+ Objects.requireNonNull(mDeviceProfile.inv).isFixedLandscape
);
}
@@ -1351,7 +1355,8 @@
NonConfigInstance lastInstance = (NonConfigInstance) getLastNonConfigurationInstance();
boolean forceRestore = lastInstance != null
- && (lastInstance.config.diff(mOldConfig) & CONFIG_UI_MODE) != 0;
+ && ((lastInstance.config.diff(mOldConfig) & CONFIG_UI_MODE) != 0
+ || savedState.getBoolean(RUNTIME_STATE_RECREATE_TO_UPDATE_THEME));
if (forceRestore || !state.shouldDisableRestore()) {
mStateManager.goToState(state, false /* animated */);
}
@@ -1746,6 +1751,12 @@
}
@Override
+ protected void recreateToUpdateTheme() {
+ mRecreateToUpdateTheme = true;
+ super.recreateToUpdateTheme();
+ }
+
+ @Override
public void onRestoreInstanceState(Bundle state) {
super.onRestoreInstanceState(state);
IntSet synchronouslyBoundPages = mModelCallbacks.getSynchronouslyBoundPages();
@@ -1790,6 +1801,8 @@
outState.putParcelable(RUNTIME_STATE_PENDING_ACTIVITY_RESULT, mPendingActivityResult);
}
+ outState.putBoolean(RUNTIME_STATE_RECREATE_TO_UPDATE_THEME, mRecreateToUpdateTheme);
+
super.onSaveInstanceState(outState);
}
@@ -2745,6 +2758,7 @@
mModel.dumpState(prefix, fd, writer, args);
mOverlayManager.dump(prefix, writer);
ACTIVITY_TRACKER.dump(prefix, writer);
+ MSDLPlayerWrapper.INSTANCE.get(getApplicationContext()).dump(prefix, writer);
}
/**
diff --git a/src/com/android/launcher3/LauncherConstants.java b/src/com/android/launcher3/LauncherConstants.java
index 445fb41..0ed239d 100644
--- a/src/com/android/launcher3/LauncherConstants.java
+++ b/src/com/android/launcher3/LauncherConstants.java
@@ -67,5 +67,8 @@
static final String RUNTIME_STATE_WIDGET_PANEL = "launcher.widget_panel";
// Type int[]
static final String RUNTIME_STATE_CURRENT_SCREEN_IDS = "launcher.current_screen_ids";
+ // Type: boolean
+ static final String RUNTIME_STATE_RECREATE_TO_UPDATE_THEME =
+ "launcher.recreate_to_update_theme";
}
}
diff --git a/src/com/android/launcher3/LauncherFiles.java b/src/com/android/launcher3/LauncherFiles.java
index df75470..c702414 100644
--- a/src/com/android/launcher3/LauncherFiles.java
+++ b/src/com/android/launcher3/LauncherFiles.java
@@ -25,6 +25,7 @@
public static final String LAUNCHER_3_BY_3_DB = "launcher_3_by_3.db";
public static final String LAUNCHER_2_BY_2_DB = "launcher_2_by_2.db";
public static final String LAUNCHER_7_BY_3_DB = "launcher_7_by_3.db";
+ public static final String LAUNCHER_8_BY_3_DB = "launcher_8_by_3.db";
public static final String BACKUP_DB = "backup.db";
public static final String SHARED_PREFERENCES_KEY = "com.android.launcher3.prefs";
public static final String MANAGED_USER_PREFERENCES_KEY =
@@ -45,7 +46,8 @@
LAUNCHER_4_BY_4_DB,
LAUNCHER_3_BY_3_DB,
LAUNCHER_2_BY_2_DB,
- LAUNCHER_7_BY_3_DB));
+ LAUNCHER_7_BY_3_DB,
+ LAUNCHER_8_BY_3_DB));
public static final List<String> OTHER_FILES = Collections.unmodifiableList(Arrays.asList(
BACKUP_DB,
diff --git a/src/com/android/launcher3/LauncherRootView.java b/src/com/android/launcher3/LauncherRootView.java
index d645734..a5b95c7 100644
--- a/src/com/android/launcher3/LauncherRootView.java
+++ b/src/com/android/launcher3/LauncherRootView.java
@@ -10,7 +10,6 @@
import android.view.WindowInsets;
import com.android.launcher3.graphics.SysUiScrim;
-import com.android.launcher3.statemanager.StatefulActivity;
import com.android.launcher3.statemanager.StatefulContainer;
import com.android.launcher3.util.window.WindowManagerProxy;
@@ -56,7 +55,10 @@
public WindowInsets onApplyWindowInsets(WindowInsets insets) {
mStatefulContainer.handleConfigurationChanged(
mStatefulContainer.getContext().getResources().getConfiguration());
+ return updateInsets(insets);
+ }
+ private WindowInsets updateInsets(WindowInsets insets) {
insets = WindowManagerProxy.INSTANCE.get(getContext())
.normalizeWindowInsets(getContext(), insets, mTempRect);
handleSystemWindowInsets(mTempRect);
@@ -74,7 +76,11 @@
}
public void dispatchInsets() {
- mStatefulContainer.getDeviceProfile().updateInsets(mInsets);
+ if (isAttachedToWindow()) {
+ updateInsets(getRootWindowInsets());
+ } else {
+ mStatefulContainer.getDeviceProfile().updateInsets(mInsets);
+ }
super.setInsets(mInsets);
}
diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java
index 95dbf5f..69a5a83 100644
--- a/src/com/android/launcher3/Workspace.java
+++ b/src/com/android/launcher3/Workspace.java
@@ -116,6 +116,7 @@
import com.android.launcher3.util.IntSet;
import com.android.launcher3.util.IntSparseArrayMap;
import com.android.launcher3.util.LauncherBindableItemsContainer;
+import com.android.launcher3.util.MSDLPlayerWrapper;
import com.android.launcher3.util.OverlayEdgeEffect;
import com.android.launcher3.util.PackageUserKey;
import com.android.launcher3.util.RunnableList;
@@ -133,6 +134,8 @@
import com.android.systemui.plugins.shared.LauncherOverlayManager.LauncherOverlayCallbacks;
import com.android.systemui.plugins.shared.LauncherOverlayManager.LauncherOverlayTouchProxy;
+import com.google.android.msdl.data.model.MSDLToken;
+
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
@@ -299,6 +302,8 @@
private final StatsLogManager mStatsLogManager;
+ private final MSDLPlayerWrapper mMSDLPlayerWrapper;
+
/**
* Used to inflate the Workspace from XML.
*
@@ -331,6 +336,7 @@
setMotionEventSplittingEnabled(true);
setOnTouchListener(new WorkspaceTouchListener(mLauncher, this));
mStatsLogManager = StatsLogManager.newInstance(context);
+ mMSDLPlayerWrapper = MSDLPlayerWrapper.INSTANCE.get(context);
}
@Override
@@ -2679,7 +2685,9 @@
ItemInfo info = dragObject.dragInfo;
boolean userFolderPending = willCreateUserFolder(info, mDragOverView, false);
if (mDragMode == DRAG_MODE_NONE && userFolderPending) {
-
+ if (Flags.msdlFeedback()) {
+ mMSDLPlayerWrapper.playToken(MSDLToken.DRAG_INDICATOR_DISCRETE);
+ }
mFolderCreateBg = new PreviewBackground(getContext());
mFolderCreateBg.setup(mLauncher, mLauncher, null,
mDragOverView.getMeasuredWidth(), mDragOverView.getPaddingTop());
diff --git a/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java b/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java
index 814d142..548bc35 100644
--- a/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java
+++ b/src/com/android/launcher3/accessibility/LauncherAccessibilityDelegate.java
@@ -415,7 +415,6 @@
screenId, coordinates[0], coordinates[1]);
bindItem(info, accessibility, finishCallback);
- announceConfirmation(R.string.item_added_to_workspace);
} else if (item instanceof PendingAddItemInfo) {
PendingAddItemInfo info = (PendingAddItemInfo) item;
if (info instanceof PendingAddWidgetInfo widgetInfo
diff --git a/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java b/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java
index c938482..8505a6d 100644
--- a/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java
+++ b/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java
@@ -315,8 +315,7 @@
0,
0 // Bottom left
};
- mBottomSheetBackgroundColor =
- Themes.getAttrColor(getContext(), R.attr.materialColorSurfaceDim);
+ mBottomSheetBackgroundColor = getContext().getColor(R.color.materialColorSurfaceDim);
updateBackgroundVisibility(mActivityContext.getDeviceProfile());
mSearchUiManager.initializeSearch(this);
}
diff --git a/src/com/android/launcher3/allapps/AllAppsGridAdapter.java b/src/com/android/launcher3/allapps/AllAppsGridAdapter.java
index df383bf..b6ba264 100644
--- a/src/com/android/launcher3/allapps/AllAppsGridAdapter.java
+++ b/src/com/android/launcher3/allapps/AllAppsGridAdapter.java
@@ -125,6 +125,12 @@
}
@Override
+ public int getColumnCountForAccessibility(RecyclerView.Recycler recycler,
+ RecyclerView.State state) {
+ return mAppsPerRow;
+ }
+
+ @Override
public void onInitializeAccessibilityNodeInfoForItem(RecyclerView.Recycler recycler,
RecyclerView.State state, View host, AccessibilityNodeInfoCompat info) {
super.onInitializeAccessibilityNodeInfoForItem(recycler, state, host, info);
diff --git a/src/com/android/launcher3/allapps/LetterListTextView.java b/src/com/android/launcher3/allapps/LetterListTextView.java
index 8586078..e3fea3c 100644
--- a/src/com/android/launcher3/allapps/LetterListTextView.java
+++ b/src/com/android/launcher3/allapps/LetterListTextView.java
@@ -31,7 +31,6 @@
import com.android.launcher3.R;
import com.android.launcher3.Utilities;
-import com.android.launcher3.util.Themes;
/**
* A TextView that is used to display the letter list in the fast scroller.
@@ -56,7 +55,7 @@
mLetterBackground = context.getDrawable(R.drawable.bg_letter_list_text);
mLetterListTextWidthAndHeight = context.getResources().getDimensionPixelSize(
R.dimen.fastscroll_list_letter_size);
- mTextColor = Themes.getAttrColor(context, R.attr.materialColorOnSurface);
+ mTextColor = context.getColor(R.color.materialColorOnSurface);
}
@Override
diff --git a/src/com/android/launcher3/allapps/SectionDecorationHandler.java b/src/com/android/launcher3/allapps/SectionDecorationHandler.java
index eaeb8bb..cae76ec 100644
--- a/src/com/android/launcher3/allapps/SectionDecorationHandler.java
+++ b/src/com/android/launcher3/allapps/SectionDecorationHandler.java
@@ -27,7 +27,6 @@
import androidx.annotation.Nullable;
import com.android.launcher3.R;
-import com.android.launcher3.util.Themes;
public class SectionDecorationHandler {
@@ -60,10 +59,8 @@
mContext = context;
mFillAlpha = fillAlpha;
- mFocusColor = Themes.getAttrColor(context,
- R.attr.materialColorSurfaceBright); // UX recommended
- mFillColor = Themes.getAttrColor(context,
- R.attr.materialColorSurfaceContainerHigh); // UX recommended
+ mFocusColor = context.getColor(R.color.materialColorSurfaceBright); // UX recommended
+ mFillColor = context.getColor(R.color.materialColorSurfaceContainerHigh); // UX recommended
mIsTopLeftRound = isTopLeftRound;
mIsTopRightRound = isTopRightRound;
diff --git a/src/com/android/launcher3/allapps/WorkPausedCard.java b/src/com/android/launcher3/allapps/WorkPausedCard.java
index e1eeabe..a14ac98 100644
--- a/src/com/android/launcher3/allapps/WorkPausedCard.java
+++ b/src/com/android/launcher3/allapps/WorkPausedCard.java
@@ -79,7 +79,6 @@
@Override
public void onClick(View view) {
- setEnabled(false);
mActivityContext.getAppsView().getWorkManager().setWorkProfileEnabled(true);
mActivityContext.getStatsLogManager().logger().log(LAUNCHER_TURN_ON_WORK_APPS_TAP);
}
diff --git a/src/com/android/launcher3/allapps/WorkUtilityView.java b/src/com/android/launcher3/allapps/WorkUtilityView.java
index 4b58ab0..5949b78 100644
--- a/src/com/android/launcher3/allapps/WorkUtilityView.java
+++ b/src/com/android/launcher3/allapps/WorkUtilityView.java
@@ -33,6 +33,7 @@
import android.widget.TextView;
import androidx.annotation.NonNull;
+import androidx.annotation.VisibleForTesting;
import androidx.core.graphics.Insets;
import androidx.core.view.WindowInsetsCompat;
@@ -126,6 +127,7 @@
setInsets(mActivityContext.getDeviceProfile().getInsets());
updateStringFromCache();
mSchedulerButton.setVisibility(GONE);
+ mSchedulerButton.setOnClickListener(null);
if (shouldUseScheduler()) {
mSchedulerButton.setVisibility(VISIBLE);
mSchedulerButton.setOnClickListener(view ->
@@ -393,7 +395,13 @@
}
}
- private boolean shouldUseScheduler() {
+ @VisibleForTesting
+ boolean shouldUseScheduler() {
return Flags.workSchedulerInWorkProfile() && !mWorkSchedulerIntentAction.isEmpty();
}
+
+ @VisibleForTesting
+ ImageButton getSchedulerButton() {
+ return mSchedulerButton;
+ }
}
diff --git a/src/com/android/launcher3/allapps/search/AllAppsSearchBarController.java b/src/com/android/launcher3/allapps/search/AllAppsSearchBarController.java
index 7e3e392..fe11ee2 100644
--- a/src/com/android/launcher3/allapps/search/AllAppsSearchBarController.java
+++ b/src/com/android/launcher3/allapps/search/AllAppsSearchBarController.java
@@ -150,6 +150,7 @@
mCallback.clearSearchResult();
mInput.reset();
mInput.clearFocus();
+ mInput.hideKeyboard();
mQuery = null;
}
diff --git a/src/com/android/launcher3/backuprestore/LauncherRestoreEventLogger.kt b/src/com/android/launcher3/backuprestore/LauncherRestoreEventLogger.kt
index b05539a..1502811 100644
--- a/src/com/android/launcher3/backuprestore/LauncherRestoreEventLogger.kt
+++ b/src/com/android/launcher3/backuprestore/LauncherRestoreEventLogger.kt
@@ -16,11 +16,16 @@
@Retention(AnnotationRetention.SOURCE)
@StringDef(
RestoreError.PROFILE_DELETED,
- RestoreError.MISSING_INFO,
RestoreError.MISSING_WIDGET_PROVIDER,
- RestoreError.INVALID_LOCATION,
+ RestoreError.OVERLAPPING_ITEM,
+ RestoreError.INVALID_WIDGET_SIZE,
+ RestoreError.INVALID_WIDGET_CONTAINER,
RestoreError.SHORTCUT_NOT_FOUND,
- RestoreError.APP_NOT_INSTALLED,
+ RestoreError.APP_NO_TARGET_PACKAGE,
+ RestoreError.APP_NO_DB_INTENT,
+ RestoreError.APP_NO_LAUNCH_INTENT,
+ RestoreError.APP_NOT_RESTORED_OR_INSTALLING,
+ RestoreError.APP_NOT_INSTALLED_EXTERNAL_MEDIA,
RestoreError.WIDGETS_DISABLED,
RestoreError.PROFILE_NOT_RESTORED,
RestoreError.WIDGET_REMOVED,
@@ -28,15 +33,24 @@
RestoreError.GRID_MIGRATION_FAILURE,
RestoreError.NO_SEARCH_WIDGET,
RestoreError.INVALID_WIDGET_ID,
+ RestoreError.OTHER_WIDGET_INFLATION_FAIL,
+ RestoreError.UNSPECIFIED_WIDGET_INFLATION_RESULT,
+ RestoreError.UNRESTORED_PENDING_WIDGET,
+ RestoreError.INVALID_CUSTOM_WIDGET_ID,
)
annotation class RestoreError {
companion object {
const val PROFILE_DELETED = "user_profile_deleted"
- const val MISSING_INFO = "missing_information_when_loading"
const val MISSING_WIDGET_PROVIDER = "missing_widget_provider"
- const val INVALID_LOCATION = "invalid_size_or_location"
+ const val OVERLAPPING_ITEM = "overlapping_item"
+ const val INVALID_WIDGET_SIZE = "invalid_widget_size"
+ const val INVALID_WIDGET_CONTAINER = "invalid_widget_container"
const val SHORTCUT_NOT_FOUND = "shortcut_not_found"
- const val APP_NOT_INSTALLED = "app_not_installed"
+ const val APP_NO_TARGET_PACKAGE = "app_no_target_package"
+ const val APP_NO_DB_INTENT = "app_no_db_intent"
+ const val APP_NO_LAUNCH_INTENT = "app_no_launch_intent"
+ const val APP_NOT_RESTORED_OR_INSTALLING = "app_not_restored_or_installed"
+ const val APP_NOT_INSTALLED_EXTERNAL_MEDIA = "app_not_installed_external_media"
const val WIDGETS_DISABLED = "widgets_disabled"
const val PROFILE_NOT_RESTORED = "profile_not_restored"
const val DATABASE_FILE_NOT_RESTORED = "db_file_not_restored"
@@ -44,6 +58,10 @@
const val GRID_MIGRATION_FAILURE = "grid_migration_failed"
const val NO_SEARCH_WIDGET = "no_search_widget"
const val INVALID_WIDGET_ID = "invalid_widget_id"
+ const val OTHER_WIDGET_INFLATION_FAIL = "other_widget_fail"
+ const val UNSPECIFIED_WIDGET_INFLATION_RESULT = "unspecified_widget_inflation_result"
+ const val UNRESTORED_PENDING_WIDGET = "unrestored_pending_widget"
+ const val INVALID_CUSTOM_WIDGET_ID = "invalid_custom_widget_id"
}
}
diff --git a/src/com/android/launcher3/dagger/LauncherBaseAppComponent.java b/src/com/android/launcher3/dagger/LauncherBaseAppComponent.java
index fb486f7..1e3df1e 100644
--- a/src/com/android/launcher3/dagger/LauncherBaseAppComponent.java
+++ b/src/com/android/launcher3/dagger/LauncherBaseAppComponent.java
@@ -24,6 +24,7 @@
import com.android.launcher3.pm.InstallSessionHelper;
import com.android.launcher3.util.ApiWrapper;
import com.android.launcher3.util.DaggerSingletonTracker;
+import com.android.launcher3.util.DynamicResource;
import com.android.launcher3.util.MSDLPlayerWrapper;
import com.android.launcher3.util.PackageManagerHelper;
import com.android.launcher3.util.PluginManagerWrapper;
@@ -48,6 +49,7 @@
ApiWrapper getApiWrapper();
ContextualEduStatsManager getContextualEduStatsManager();
CustomWidgetManager getCustomWidgetManager();
+ DynamicResource getDynamicResource();
IconShape getIconShape();
InstallSessionHelper getInstallSessionHelper();
ItemInstallQueue getItemInstallQueue();
diff --git a/src/com/android/launcher3/logging/StatsLogManager.java b/src/com/android/launcher3/logging/StatsLogManager.java
index 2550ebb..dbab52a 100644
--- a/src/com/android/launcher3/logging/StatsLogManager.java
+++ b/src/com/android/launcher3/logging/StatsLogManager.java
@@ -843,6 +843,13 @@
@UiEvent(doc = "User long press nav handle and a long press runnable was created.")
LAUNCHER_OMNI_GET_LONG_PRESS_RUNNABLE(1545),
+
+ // One Grid Flags
+ @UiEvent(doc = "User sets the device in Fixed Landscape")
+ FIXED_LANDSCAPE_TOGGLE_ENABLE(2014),
+
+ @UiEvent(doc = "User sets the device in Fixed Landscape")
+ FIXED_LANDSCAPE_TOGGLE_DISABLED(2020),
// ADD MORE
;
diff --git a/src/com/android/launcher3/model/DatabaseHelper.java b/src/com/android/launcher3/model/DatabaseHelper.java
index 8368256..ed4f492 100644
--- a/src/com/android/launcher3/model/DatabaseHelper.java
+++ b/src/com/android/launcher3/model/DatabaseHelper.java
@@ -56,6 +56,7 @@
import java.net.URISyntaxException;
import java.util.Arrays;
import java.util.Locale;
+import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.ToLongFunction;
import java.util.stream.Collectors;
@@ -79,8 +80,8 @@
private final Context mContext;
private final ToLongFunction<UserHandle> mUserSerialProvider;
private final Runnable mOnEmptyDbCreateCallback;
+ private final AtomicInteger mMaxItemId = new AtomicInteger(-1);
- private int mMaxItemId = -1;
public boolean mHotseatRestoreTableExists;
/**
@@ -97,21 +98,19 @@
protected void initIds() {
// In the case where neither onCreate nor onUpgrade gets called, we read the maxId from
// the DB here
- if (mMaxItemId == -1) {
- mMaxItemId = initializeMaxItemId(getWritableDatabase());
- }
+ mMaxItemId.compareAndSet(-1, initializeMaxItemId(getWritableDatabase()));
}
@Override
public void onCreate(SQLiteDatabase db) {
if (LOGD) Log.d(TAG, "creating new launcher database");
- mMaxItemId = 1;
+ mMaxItemId.set(1);
addTableToDb(db, getDefaultUserSerial(), false /* optional */);
// Fresh and clean launcher DB.
- mMaxItemId = initializeMaxItemId(db);
+ mMaxItemId.set(initializeMaxItemId(db));
mOnEmptyDbCreateCallback.run();
}
@@ -451,11 +450,10 @@
// after that point
@Override
public int generateNewItemId() {
- if (mMaxItemId < 0) {
+ if (mMaxItemId.get() < 0) {
throw new RuntimeException("Error: max item id was not initialized");
}
- mMaxItemId += 1;
- return mMaxItemId;
+ return mMaxItemId.incrementAndGet();
}
/**
@@ -484,7 +482,7 @@
public void checkId(ContentValues values) {
int id = values.getAsInteger(Favorites._ID);
- mMaxItemId = Math.max(id, mMaxItemId);
+ mMaxItemId.accumulateAndGet(id, Math::max);
}
private int initializeMaxItemId(SQLiteDatabase db) {
@@ -508,7 +506,7 @@
int count = loader.loadLayout(db);
// Ensure that the max ids are initialized
- mMaxItemId = initializeMaxItemId(db);
+ mMaxItemId.set(initializeMaxItemId(db));
return count;
}
diff --git a/src/com/android/launcher3/model/GridSizeMigrationLogic.kt b/src/com/android/launcher3/model/GridSizeMigrationLogic.kt
index 3f52d8a..75fd31e 100644
--- a/src/com/android/launcher3/model/GridSizeMigrationLogic.kt
+++ b/src/com/android/launcher3/model/GridSizeMigrationLogic.kt
@@ -58,12 +58,17 @@
}
val isFirstLoad = get(context).get(LauncherPrefs.IS_FIRST_LOAD_AFTER_RESTORE)
- Log.d(TAG, "Begin grid migration. First load: $isFirstLoad")
+ Log.d(
+ TAG,
+ "Begin grid migration. First load: $isFirstLoad\n srcDeviceState: " +
+ "$srcDeviceState\ndestDeviceState: $destDeviceState\nisDestNewDb: $isDestNewDb",
+ )
// This is a special case where if the grid is the same amount of columns but a larger
// amount of rows we simply copy over the source grid to the destination grid, rather
// than undergoing the general grid migration.
if (shouldMigrateToStrictlyTallerGrid(isDestNewDb, srcDeviceState, destDeviceState)) {
+ Log.d(TAG, "Migrating to strictly taller grid")
copyTable(source, TABLE_NAME, target.writableDatabase, TABLE_NAME, context)
if (oneGridSpecs()) {
val destReader = DbReader(target.writableDatabase, TABLE_NAME, context)
diff --git a/src/com/android/launcher3/model/LoaderCursor.java b/src/com/android/launcher3/model/LoaderCursor.java
index 84130c7..c01b1b6 100644
--- a/src/com/android/launcher3/model/LoaderCursor.java
+++ b/src/com/android/launcher3/model/LoaderCursor.java
@@ -498,7 +498,7 @@
mRestoreEventLogger.logSingleFavoritesItemRestored(itemType);
}
} else {
- markDeleted("Item position overlap", RestoreError.INVALID_LOCATION);
+ markDeleted("Item position overlap", RestoreError.OVERLAPPING_ITEM);
}
}
diff --git a/src/com/android/launcher3/model/LoaderTask.java b/src/com/android/launcher3/model/LoaderTask.java
index 83eace8..f96e959 100644
--- a/src/com/android/launcher3/model/LoaderTask.java
+++ b/src/com/android/launcher3/model/LoaderTask.java
@@ -389,7 +389,7 @@
}
} catch (CancellationException e) {
// Loader stopped, ignore
- logASplit("Cancelled");
+ FileLog.w(TAG, "LoaderTask cancelled:", e);
} catch (Exception e) {
memoryLogger.printLogs();
throw e;
@@ -398,6 +398,7 @@
}
public synchronized void stopLocked() {
+ FileLog.w(TAG, "LoaderTask#stopLocked:", new Exception());
mStopped = true;
this.notify();
}
diff --git a/src/com/android/launcher3/model/WorkspaceItemProcessor.kt b/src/com/android/launcher3/model/WorkspaceItemProcessor.kt
index c02336e..e86b592 100644
--- a/src/com/android/launcher3/model/WorkspaceItemProcessor.kt
+++ b/src/com/android/launcher3/model/WorkspaceItemProcessor.kt
@@ -141,7 +141,7 @@
var allowMissingTarget = false
var intent = c.parseIntent()
if (intent == null) {
- c.markDeleted("Null intent from db for item id=${c.id}", RestoreError.MISSING_INFO)
+ c.markDeleted("Null intent from db for item id=${c.id}", RestoreError.APP_NO_DB_INTENT)
return
}
var disabledState =
@@ -151,7 +151,10 @@
val cn = intent.component
val targetPkg = cn?.packageName ?: intent.getPackage()
if (targetPkg.isNullOrEmpty()) {
- c.markDeleted("No target package for item id=${c.id}", RestoreError.MISSING_INFO)
+ c.markDeleted(
+ "No target package for item id=${c.id}",
+ RestoreError.APP_NO_TARGET_PACKAGE,
+ )
return
}
val appInfoWrapper = ApplicationInfoWrapper(app.context, targetPkg, c.user)
@@ -180,7 +183,7 @@
c.markDeleted(
"No Activities found for id=${c.id}, targetPkg=$targetPkg, component=$cn." +
" Unable to create launch Intent.",
- RestoreError.MISSING_INFO,
+ RestoreError.APP_NO_LAUNCH_INTENT,
)
return
}
@@ -215,7 +218,7 @@
else -> {
c.markDeleted(
"removing app that is not restored and not installing. package: $targetPkg",
- RestoreError.APP_NOT_INSTALLED,
+ RestoreError.APP_NOT_RESTORED_OR_INSTALLING,
)
return
}
@@ -240,7 +243,7 @@
// Do not wait for external media load anymore.
c.markDeleted(
"Invalid package removed: $targetPkg",
- RestoreError.APP_NOT_INSTALLED,
+ RestoreError.APP_NOT_INSTALLED_EXTERNAL_MEDIA,
)
return
}
@@ -448,7 +451,7 @@
", id=${c.id}," +
", appWidgetId=${c.appWidgetId}," +
", component=${component}",
- RestoreError.INVALID_LOCATION,
+ RestoreError.INVALID_WIDGET_SIZE,
)
return
}
@@ -459,7 +462,7 @@
", appWidgetId=${c.appWidgetId}," +
", component=${component}," +
", container=${c.container}",
- RestoreError.INVALID_LOCATION,
+ RestoreError.INVALID_WIDGET_CONTAINER,
)
return
}
@@ -500,7 +503,7 @@
", appWidgetId=${c.appWidgetId}" +
", component=${component}" +
", restoreFlag:=${c.restoreFlag}",
- RestoreError.APP_NOT_INSTALLED,
+ RestoreError.UNRESTORED_PENDING_WIDGET,
)
return
} else if (
diff --git a/src/com/android/launcher3/popup/ArrowPopup.java b/src/com/android/launcher3/popup/ArrowPopup.java
index c2debfa..6174d06 100644
--- a/src/com/android/launcher3/popup/ArrowPopup.java
+++ b/src/com/android/launcher3/popup/ArrowPopup.java
@@ -138,7 +138,7 @@
// Initialize arrow view
final Resources resources = getResources();
- mArrowColor = Themes.getAttrColor(getContext(), R.attr.materialColorSurfaceContainer);
+ mArrowColor = getContext().getColor(R.color.materialColorSurfaceContainer);
mChildContainerMargin = resources.getDimensionPixelSize(R.dimen.popup_margin);
mArrowWidth = resources.getDimensionPixelSize(R.dimen.popup_arrow_width);
mArrowHeight = resources.getDimensionPixelSize(R.dimen.popup_arrow_height);
@@ -170,8 +170,7 @@
getContext().getColor(R.color.popup_shade_third)
};
} else {
- mColors = new int[]{Themes.getAttrColor(getContext(),
- R.attr.materialColorSurfaceContainer)};
+ mColors = new int[]{getContext().getColor(R.color.materialColorSurfaceContainer)};
}
}
diff --git a/src/com/android/launcher3/popup/PopupPopulator.java b/src/com/android/launcher3/popup/PopupPopulator.java
index 755c3eb..b748011 100644
--- a/src/com/android/launcher3/popup/PopupPopulator.java
+++ b/src/com/android/launcher3/popup/PopupPopulator.java
@@ -116,7 +116,7 @@
final UserHandle user = originalInfo.user;
return () -> {
ApplicationInfoWrapper infoWrapper =
- new ApplicationInfoWrapper(context, activity.getPackageName(), user);
+ new ApplicationInfoWrapper(context, originalInfo.getTargetPackage(), user);
List<ShortcutInfo> shortcuts = new ShortcutRequest(context, user)
.withContainer(activity)
.query(ShortcutRequest.PUBLISHED);
diff --git a/src/com/android/launcher3/settings/SettingsActivity.java b/src/com/android/launcher3/settings/SettingsActivity.java
index 5068b48..6008287 100644
--- a/src/com/android/launcher3/settings/SettingsActivity.java
+++ b/src/com/android/launcher3/settings/SettingsActivity.java
@@ -23,6 +23,7 @@
import static com.android.launcher3.BuildConfig.IS_DEBUG_DEVICE;
import static com.android.launcher3.BuildConfig.IS_STUDIO_BUILD;
import static com.android.launcher3.InvariantDeviceProfile.TYPE_MULTI_DISPLAY;
+import static com.android.launcher3.InvariantDeviceProfile.TYPE_TABLET;
import static com.android.launcher3.states.RotationHelper.ALLOW_ROTATION_PREFERENCE_KEY;
import android.app.Activity;
@@ -315,7 +316,9 @@
if (!Flags.oneGridSpecs()
// adding this condition until fixing b/378972567
|| InvariantDeviceProfile.INSTANCE.get(getContext()).deviceType
- == TYPE_MULTI_DISPLAY) {
+ == TYPE_MULTI_DISPLAY
+ || InvariantDeviceProfile.INSTANCE.get(getContext()).deviceType
+ == TYPE_TABLET) {
return false;
}
// When the setting changes rotate the screen accordingly to showcase the result
diff --git a/src/com/android/launcher3/util/ContextTracker.java b/src/com/android/launcher3/util/ContextTracker.java
index c729b4b..3201bd1 100644
--- a/src/com/android/launcher3/util/ContextTracker.java
+++ b/src/com/android/launcher3/util/ContextTracker.java
@@ -35,7 +35,7 @@
private static final String TAG = "ContextTracker";
private WeakReference<CONTEXT> mCurrentContext = new WeakReference<>(null);
- private CopyOnWriteArrayList<SchedulerCallback<CONTEXT>> mCallbacks =
+ private final CopyOnWriteArrayList<SchedulerCallback<CONTEXT>> mCallbacks =
new CopyOnWriteArrayList<>();
@Nullable
@@ -81,7 +81,7 @@
public boolean handleCreate(CONTEXT context) {
mCurrentContext = new WeakReference<>(context);
- return handleCreate(context, /* alreadyOnHome= */ false);
+ return handleCreate(context, isHomeStarted(context));
}
public boolean handleNewIntent(CONTEXT context) {
diff --git a/src/com/android/launcher3/util/DynamicResource.java b/src/com/android/launcher3/util/DynamicResource.java
index fbdb5c2..fe9fd7c 100644
--- a/src/com/android/launcher3/util/DynamicResource.java
+++ b/src/com/android/launcher3/util/DynamicResource.java
@@ -22,35 +22,39 @@
import androidx.annotation.FractionRes;
import androidx.annotation.IntegerRes;
+import com.android.launcher3.dagger.ApplicationContext;
+import com.android.launcher3.dagger.LauncherAppSingleton;
+import com.android.launcher3.dagger.LauncherBaseAppComponent;
import com.android.systemui.plugins.PluginListener;
import com.android.systemui.plugins.ResourceProvider;
+import javax.inject.Inject;
+
/**
* Utility class to support customizing resource values using plugins
*
* To load resources, call
- * DynamicResource.provider(context).getInt(resId) or any other supported methods
+ * DynamicResource.provider(context).getInt(resId) or any other supported methods
*
* To allow customization for a particular resource, add them to dynamic_resources.xml
*/
+@LauncherAppSingleton
public class DynamicResource implements
- ResourceProvider, PluginListener<ResourceProvider>, SafeCloseable {
+ ResourceProvider, PluginListener<ResourceProvider> {
- private static final MainThreadInitializedObject<DynamicResource> INSTANCE =
- new MainThreadInitializedObject<>(DynamicResource::new);
+ private static final DaggerSingletonObject<DynamicResource> INSTANCE =
+ new DaggerSingletonObject<>(LauncherBaseAppComponent::getDynamicResource);
private final Context mContext;
private ResourceProvider mPlugin;
- private DynamicResource(Context context) {
+ @Inject
+ public DynamicResource(@ApplicationContext Context context,
+ PluginManagerWrapper pluginManagerWrapper, DaggerSingletonTracker tracker) {
mContext = context;
- PluginManagerWrapper.INSTANCE.get(context).addPluginListener(this,
+ pluginManagerWrapper.addPluginListener(this,
ResourceProvider.class, false /* allowedMultiple */);
- }
-
- @Override
- public void close() {
- PluginManagerWrapper.INSTANCE.get(mContext).removePluginListener(this);
+ tracker.addCloseable(() -> pluginManagerWrapper.removePluginListener(this));
}
@Override
diff --git a/src/com/android/launcher3/util/MSDLPlayerWrapper.java b/src/com/android/launcher3/util/MSDLPlayerWrapper.java
index 1e53ac1..8a1d923 100644
--- a/src/com/android/launcher3/util/MSDLPlayerWrapper.java
+++ b/src/com/android/launcher3/util/MSDLPlayerWrapper.java
@@ -28,6 +28,10 @@
import com.google.android.msdl.data.model.MSDLToken;
import com.google.android.msdl.domain.InteractionProperties;
import com.google.android.msdl.domain.MSDLPlayer;
+import com.google.android.msdl.logging.MSDLEvent;
+
+import java.io.PrintWriter;
+import java.util.List;
import javax.inject.Inject;
@@ -58,4 +62,18 @@
public void playToken(MSDLToken token) {
mMSDLPlayer.playToken(token, null);
}
+
+ public List<MSDLEvent> getHistory() {
+ return mMSDLPlayer.getHistory();
+ }
+
+ /** Print the latest history of MSDL tokens played */
+ public void dump(String prefix, PrintWriter writer) {
+ writer.println(prefix + mMSDLPlayer.toString());
+ writer.println(prefix + "MSDLPlayerWrapper history of latest events:");
+ List<MSDLEvent> events = getHistory();
+ for (MSDLEvent event: events) {
+ writer.println(prefix + "\t" + event);
+ }
+ }
}
diff --git a/src/com/android/launcher3/util/SplitConfigurationOptions.java b/src/com/android/launcher3/util/SplitConfigurationOptions.java
index f457e4e..44a7c6f 100644
--- a/src/com/android/launcher3/util/SplitConfigurationOptions.java
+++ b/src/com/android/launcher3/util/SplitConfigurationOptions.java
@@ -73,7 +73,27 @@
*/
public static final int STAGE_TYPE_SIDE = 1;
- @IntDef({STAGE_TYPE_UNDEFINED, STAGE_TYPE_MAIN, STAGE_TYPE_SIDE})
+ /**
+ * Position independent stage identifier for a given Stage
+ */
+ public static final int STAGE_TYPE_A = 2;
+ /**
+ * Position independent stage identifier for a given Stage
+ */
+ public static final int STAGE_TYPE_B = 3;
+ /**
+ * Position independent stage identifier for a given Stage
+ */
+ public static final int STAGE_TYPE_C = 4;
+
+ @IntDef({
+ STAGE_TYPE_UNDEFINED,
+ STAGE_TYPE_MAIN,
+ STAGE_TYPE_SIDE,
+ STAGE_TYPE_A,
+ STAGE_TYPE_B,
+ STAGE_TYPE_C
+ })
public @interface StageType {}
///////////////////////////////////
diff --git a/src/com/android/launcher3/views/RecyclerViewFastScroller.java b/src/com/android/launcher3/views/RecyclerViewFastScroller.java
index 6fd18be..4acdf19 100644
--- a/src/com/android/launcher3/views/RecyclerViewFastScroller.java
+++ b/src/com/android/launcher3/views/RecyclerViewFastScroller.java
@@ -180,7 +180,7 @@
mTrackPaint.setAlpha(MAX_TRACK_ALPHA);
mThumbColor = Themes.getColorAccent(context);
- mThumbLetterScrollerColor = Themes.getAttrColor(context, R.attr.materialColorSurfaceBright);
+ mThumbLetterScrollerColor = context.getColor(R.color.materialColorSurfaceBright);
mThumbPaint = new Paint();
mThumbPaint.setAntiAlias(true);
mThumbPaint.setColor(mThumbColor);
diff --git a/src/com/android/launcher3/widget/LauncherAppWidgetHostView.java b/src/com/android/launcher3/widget/LauncherAppWidgetHostView.java
index 44ab966..0cf1f2e 100644
--- a/src/com/android/launcher3/widget/LauncherAppWidgetHostView.java
+++ b/src/com/android/launcher3/widget/LauncherAppWidgetHostView.java
@@ -68,6 +68,8 @@
private static final String TRACE_METHOD_NAME = "appwidget load-widget ";
+ private static final Integer NO_LAYOUT_ID = Integer.valueOf(0);
+
private final CheckLongPressHelper mLongPressHelper;
protected final ActivityContext mActivityContext;
@@ -164,6 +166,21 @@
return false;
}
+ private boolean isTaggedAsScrollable() {
+ // TODO: Introduce new api in AppWidgetHostView to indicate whether the widget is
+ // scrollable.
+ for (int i = 0; i < this.getChildCount(); i++) {
+ View child = this.getChildAt(i);
+ final Integer layoutId = (Integer) child.getTag(android.R.id.widget_frame);
+ if (layoutId != null) {
+ // The layout id is only set to 0 when RemoteViews is created from
+ // DrawInstructions.
+ return NO_LAYOUT_ID.equals(layoutId);
+ }
+ }
+ return false;
+ }
+
/**
* Returns true if the application of {@link RemoteViews} through {@link #updateAppWidget} are
* currently being deferred.
@@ -266,7 +283,7 @@
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
- mIsScrollable = checkScrollableRecursively(this);
+ mIsScrollable = isTaggedAsScrollable() || checkScrollableRecursively(this);
}
/**
diff --git a/src/com/android/launcher3/widget/RoundedCornerEnforcement.java b/src/com/android/launcher3/widget/RoundedCornerEnforcement.java
index e190dc3..2c07fd9 100644
--- a/src/com/android/launcher3/widget/RoundedCornerEnforcement.java
+++ b/src/com/android/launcher3/widget/RoundedCornerEnforcement.java
@@ -16,7 +16,7 @@
package com.android.launcher3.widget;
-import static com.android.launcher3.Flags.enforceSystemRadiusForAppWidgets;
+import static com.android.launcher3.Flags.useSystemRadiusForAppWidgets;
import android.appwidget.AppWidgetHostView;
import android.content.Context;
@@ -99,7 +99,7 @@
public static float computeEnforcedRadius(@NonNull Context context) {
Resources res = context.getResources();
float systemRadius = res.getDimension(android.R.dimen.system_app_widget_background_radius);
- if (enforceSystemRadiusForAppWidgets()) {
+ if (useSystemRadiusForAppWidgets()) {
return systemRadius;
}
diff --git a/src/com/android/launcher3/widget/WidgetCell.java b/src/com/android/launcher3/widget/WidgetCell.java
index b7ad95e..9e635a3 100644
--- a/src/com/android/launcher3/widget/WidgetCell.java
+++ b/src/com/android/launcher3/widget/WidgetCell.java
@@ -17,6 +17,7 @@
package com.android.launcher3.widget;
import static android.appwidget.AppWidgetProviderInfo.WIDGET_CATEGORY_HOME_SCREEN;
+import static android.view.accessibility.AccessibilityNodeInfo.ACTION_CLICK;
import static com.android.launcher3.Flags.enableWidgetTapToAdd;
import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_WIDGETS_TRAY;
@@ -40,6 +41,7 @@
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewPropertyAnimator;
+import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
@@ -154,7 +156,21 @@
mWidgetDescription = findViewById(R.id.widget_description);
mWidgetTextContainer = findViewById(R.id.widget_text_container);
mWidgetAddButton = findViewById(R.id.widget_add_button);
+
if (enableWidgetTapToAdd()) {
+
+ setAccessibilityDelegate(new AccessibilityDelegate() {
+ @Override
+ public void onInitializeAccessibilityNodeInfo(View host,
+ AccessibilityNodeInfo info) {
+ super.onInitializeAccessibilityNodeInfo(host, info);
+ String accessibilityLabel = getResources().getString(mWidgetAddButton.isShown()
+ ? R.string.widget_cell_tap_to_hide_add_button_label
+ : R.string.widget_cell_tap_to_show_add_button_label);
+ info.addAction(new AccessibilityNodeInfo.AccessibilityAction(ACTION_CLICK,
+ accessibilityLabel));
+ }
+ });
mWidgetAddButton.setVisibility(INVISIBLE);
}
}
diff --git a/src/com/android/launcher3/widget/WidgetInflater.kt b/src/com/android/launcher3/widget/WidgetInflater.kt
index 271c9c2..d6cadc7 100644
--- a/src/com/android/launcher3/widget/WidgetInflater.kt
+++ b/src/com/android/launcher3/widget/WidgetInflater.kt
@@ -30,16 +30,14 @@
private val widgetHelper = WidgetManagerHelper(context)
- fun inflateAppWidget(
- item: LauncherAppWidgetInfo,
- ): InflationResult {
+ fun inflateAppWidget(item: LauncherAppWidgetInfo): InflationResult {
if (item.hasOptionFlag(LauncherAppWidgetInfo.OPTION_SEARCH_WIDGET)) {
item.providerName = QsbContainerView.getSearchComponentName(context)
if (item.providerName == null) {
return InflationResult(
TYPE_DELETE,
reason = "search widget removed because search component cannot be found",
- restoreErrorType = RestoreError.NO_SEARCH_WIDGET
+ restoreErrorType = RestoreError.NO_SEARCH_WIDGET,
)
}
}
@@ -48,7 +46,7 @@
}
val appWidgetInfo: LauncherAppWidgetProviderInfo?
var removalReason = ""
- @RestoreError var logReason = RestoreError.APP_NOT_INSTALLED
+ @RestoreError var logReason = RestoreError.OTHER_WIDGET_INFLATION_FAIL
var update = false
if (item.hasRestoreFlag(LauncherAppWidgetInfo.FLAG_ID_NOT_VALID)) {
@@ -74,7 +72,7 @@
if (appWidgetInfo == null) {
if (item.appWidgetId <= LauncherAppWidgetInfo.CUSTOM_WIDGET_ID) {
removalReason = "CustomWidgetManager cannot find provider from that widget id."
- logReason = RestoreError.MISSING_INFO
+ logReason = RestoreError.INVALID_CUSTOM_WIDGET_ID
} else {
removalReason =
("AppWidgetManager cannot find provider for that widget id." +
@@ -96,7 +94,7 @@
type = TYPE_DELETE,
reason =
"Removing restored widget: id=${item.appWidgetId} belongs to component ${item.providerName} user ${item.user}, as the provider is null and $removalReason",
- restoreErrorType = logReason
+ restoreErrorType = logReason,
)
}
@@ -132,7 +130,7 @@
widgetHelper.bindAppWidgetIdIfAllowed(
item.appWidgetId,
appWidgetInfo,
- options
+ options,
)
// We tried to bind once. If we were not able to bind, we would need to
@@ -189,9 +187,10 @@
data class InflationResult(
val type: Int,
val reason: String? = null,
- @RestoreError val restoreErrorType: String = RestoreError.APP_NOT_INSTALLED,
+ @RestoreError
+ val restoreErrorType: String = RestoreError.UNSPECIFIED_WIDGET_INFLATION_RESULT,
val isUpdate: Boolean = false,
- val widgetInfo: LauncherAppWidgetProviderInfo? = null
+ val widgetInfo: LauncherAppWidgetProviderInfo? = null,
)
companion object {
diff --git a/tests/AndroidManifest-common.xml b/tests/AndroidManifest-common.xml
index 1ddd453..68e493d 100644
--- a/tests/AndroidManifest-common.xml
+++ b/tests/AndroidManifest-common.xml
@@ -183,6 +183,7 @@
</activity>
<activity-alias android:name="Activity2"
android:label="TestActivity2"
+ android:icon="@drawable/test_icon"
android:exported="true"
android:targetActivity="com.android.launcher3.testcomponent.BaseTestingActivity">
<intent-filter>
@@ -192,6 +193,7 @@
</activity-alias>
<activity-alias android:name="Activity3"
android:label="TestActivity3"
+ android:icon="@drawable/test_icon"
android:exported="true"
android:targetActivity="com.android.launcher3.testcomponent.BaseTestingActivity">
<intent-filter>
@@ -201,6 +203,7 @@
</activity-alias>
<activity-alias android:name="Activity4"
android:label="TestActivity4"
+ android:icon="@drawable/test_icon"
android:exported="true"
android:targetActivity="com.android.launcher3.testcomponent.BaseTestingActivity">
<intent-filter>
@@ -210,6 +213,7 @@
</activity-alias>
<activity-alias android:name="Activity5"
android:label="TestActivity5"
+ android:icon="@drawable/test_icon"
android:exported="true"
android:targetActivity="com.android.launcher3.testcomponent.BaseTestingActivity">
<intent-filter>
@@ -219,6 +223,7 @@
</activity-alias>
<activity-alias android:name="Activity6"
android:label="TestActivity6"
+ android:icon="@drawable/test_icon"
android:exported="true"
android:targetActivity="com.android.launcher3.testcomponent.BaseTestingActivity">
<intent-filter>
@@ -228,6 +233,7 @@
</activity-alias>
<activity-alias android:name="Activity7"
android:label="TestActivity7"
+ android:icon="@drawable/test_icon"
android:exported="true"
android:targetActivity="com.android.launcher3.testcomponent.BaseTestingActivity">
<intent-filter>
@@ -237,6 +243,7 @@
</activity-alias>
<activity-alias android:name="Activity8"
android:label="TestActivity8"
+ android:icon="@drawable/test_icon"
android:exported="true"
android:targetActivity="com.android.launcher3.testcomponent.BaseTestingActivity">
<intent-filter>
@@ -246,6 +253,7 @@
</activity-alias>
<activity-alias android:name="Activity9" android:exported="true"
android:label="TestActivity9"
+ android:icon="@drawable/test_icon"
android:targetActivity="com.android.launcher3.testcomponent.OtherBaseTestingActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@@ -254,6 +262,7 @@
</activity-alias>
<activity-alias android:name="Activity10" android:exported="true"
android:label="TestActivity10"
+ android:icon="@drawable/test_icon"
android:targetActivity="com.android.launcher3.testcomponent.OtherBaseTestingActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@@ -262,6 +271,7 @@
</activity-alias>
<activity-alias android:name="Activity11" android:exported="true"
android:label="TestActivity11"
+ android:icon="@drawable/test_icon"
android:targetActivity="com.android.launcher3.testcomponent.OtherBaseTestingActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@@ -270,6 +280,7 @@
</activity-alias>
<activity-alias android:name="Activity12" android:exported="true"
android:label="TestActivity12"
+ android:icon="@drawable/test_icon"
android:targetActivity="com.android.launcher3.testcomponent.OtherBaseTestingActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@@ -278,6 +289,7 @@
</activity-alias>
<activity-alias android:name="Activity13" android:exported="true"
android:label="TestActivity13"
+ android:icon="@drawable/test_icon"
android:targetActivity="com.android.launcher3.testcomponent.OtherBaseTestingActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@@ -286,6 +298,7 @@
</activity-alias>
<activity-alias android:name="Activity14" android:exported="true"
android:label="TestActivity14"
+ android:icon="@drawable/test_icon"
android:targetActivity="com.android.launcher3.testcomponent.OtherBaseTestingActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@@ -363,7 +376,7 @@
</activity>
<activity android:name="com.android.launcher3.testcomponent.ImeTestActivity"
android:label="ImeTestActivity"
- android:icon="@drawable/test_theme_icon"
+ android:icon="@drawable/test_icon"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
diff --git a/tests/Launcher3Tests.xml b/tests/Launcher3Tests.xml
index 270a610..a876860 100644
--- a/tests/Launcher3Tests.xml
+++ b/tests/Launcher3Tests.xml
@@ -48,6 +48,8 @@
<option name="run-command" value="settings put system pointer_location 1" />
<option name="run-command" value="settings put system show_touches 1" />
+
+ <option name="run-command" value="setprop pixel_legal_joint_permission_v2 true" />
</target_preparer>
<target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
diff --git a/tests/assets/databases/GridMigrationTest/result5x5to3x3.db b/tests/assets/databases/GridMigrationTest/result5x5to3x3.db
index 686056d..6050251 100644
--- a/tests/assets/databases/GridMigrationTest/result5x5to3x3.db
+++ b/tests/assets/databases/GridMigrationTest/result5x5to3x3.db
Binary files differ
diff --git a/tests/assets/databases/GridMigrationTest/result5x5to4x7.db b/tests/assets/databases/GridMigrationTest/result5x5to4x7.db
index cd105c5..e6cd6f0 100644
--- a/tests/assets/databases/GridMigrationTest/result5x5to4x7.db
+++ b/tests/assets/databases/GridMigrationTest/result5x5to4x7.db
Binary files differ
diff --git a/tests/assets/databases/GridMigrationTest/result5x5to5x8.db b/tests/assets/databases/GridMigrationTest/result5x5to5x8.db
index 4b46969..311a112 100644
--- a/tests/assets/databases/GridMigrationTest/result5x5to5x8.db
+++ b/tests/assets/databases/GridMigrationTest/result5x5to5x8.db
Binary files differ
diff --git a/tests/assets/databases/GridMigrationTest/flagged_result5x5to5x8.db b/tests/assets/databases/GridMigrationTest/result5x5to5x8WithShift.db
similarity index 92%
rename from tests/assets/databases/GridMigrationTest/flagged_result5x5to5x8.db
rename to tests/assets/databases/GridMigrationTest/result5x5to5x8WithShift.db
index 8bea3ce..d750774 100644
--- a/tests/assets/databases/GridMigrationTest/flagged_result5x5to5x8.db
+++ b/tests/assets/databases/GridMigrationTest/result5x5to5x8WithShift.db
Binary files differ
diff --git a/tests/assets/databases/GridMigrationTest/test_launcher_2.db b/tests/assets/databases/GridMigrationTest/test_launcher_2.db
new file mode 100644
index 0000000..b538e26
--- /dev/null
+++ b/tests/assets/databases/GridMigrationTest/test_launcher_2.db
Binary files differ
diff --git a/tests/multivalentTests/src/com/android/launcher3/AbstractDeviceProfileTest.kt b/tests/multivalentTests/src/com/android/launcher3/AbstractDeviceProfileTest.kt
index f8794f8..c4519eb 100644
--- a/tests/multivalentTests/src/com/android/launcher3/AbstractDeviceProfileTest.kt
+++ b/tests/multivalentTests/src/com/android/launcher3/AbstractDeviceProfileTest.kt
@@ -168,7 +168,6 @@
isLandscape: Boolean = false,
isGestureMode: Boolean = true,
isFolded: Boolean = false,
- isFixedLandscape: Boolean = false,
) {
val (unfoldedNaturalX, unfoldedNaturalY) = deviceSpecUnfolded.naturalSize
val unfoldedWindowsBounds =
@@ -195,7 +194,6 @@
rotation = if (isLandscape) Surface.ROTATION_90 else Surface.ROTATION_0,
isGestureMode = isGestureMode,
densityDpi = deviceSpecFolded.densityDpi,
- isFixedLandscape = isFixedLandscape,
)
} else {
initializeCommonVars(
@@ -204,7 +202,6 @@
rotation = if (isLandscape) Surface.ROTATION_0 else Surface.ROTATION_90,
isGestureMode = isGestureMode,
densityDpi = deviceSpecUnfolded.densityDpi,
- isFixedLandscape = isFixedLandscape,
)
}
}
diff --git a/tests/multivalentTests/src/com/android/launcher3/DeleteDropTargetTest.kt b/tests/multivalentTests/src/com/android/launcher3/DeleteDropTargetTest.kt
index 46e66e4..fa368e5 100644
--- a/tests/multivalentTests/src/com/android/launcher3/DeleteDropTargetTest.kt
+++ b/tests/multivalentTests/src/com/android/launcher3/DeleteDropTargetTest.kt
@@ -1,20 +1,36 @@
package com.android.launcher3
import android.content.Context
+import android.platform.test.annotations.EnableFlags
+import android.platform.test.flag.junit.SetFlagsRule
import androidx.test.core.app.ApplicationProvider.getApplicationContext
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.launcher3.Utilities.*
+import com.android.launcher3.dragndrop.DragView
import com.android.launcher3.util.ActivityContextWrapper
+import com.android.launcher3.util.MSDLPlayerWrapper
+import com.google.android.msdl.data.model.MSDLToken
import com.google.common.truth.Truth.assertThat
import org.junit.Before
+import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
+import org.mockito.Mock
+import org.mockito.kotlin.eq
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.times
+import org.mockito.kotlin.verify
+import org.mockito.kotlin.verifyNoMoreInteractions
@SmallTest
@RunWith(AndroidJUnit4::class)
class DeleteDropTargetTest {
+ @get:Rule val mSetFlagsRule = SetFlagsRule()
+
+ @Mock private val msdlPlayerWrapper = mock<MSDLPlayerWrapper>()
+
private var mContext: Context = ActivityContextWrapper(getApplicationContext())
// Use a non-abstract class implementation
@@ -37,4 +53,16 @@
// A lot of space for text so the text should not be clipped
assertThat(buttonDropTarget.isTextClippedVertically(1000)).isFalse()
}
+
+ @Test
+ @EnableFlags(Flags.FLAG_MSDL_FEEDBACK)
+ fun onDragEnter_performsMSDLSwipeThresholdFeedback() {
+ buttonDropTarget.setMSDLPlayerWrapper(msdlPlayerWrapper)
+ val target = DropTarget.DragObject(mContext)
+ target.dragView = mock<DragView<*>>()
+ buttonDropTarget.onDragEnter(target)
+
+ verify(msdlPlayerWrapper, times(1)).playToken(eq(MSDLToken.SWIPE_THRESHOLD_INDICATOR))
+ verifyNoMoreInteractions(msdlPlayerWrapper)
+ }
}
diff --git a/tests/multivalentTests/src/com/android/launcher3/icons/IconCacheTest.java b/tests/multivalentTests/src/com/android/launcher3/icons/IconCacheTest.java
index ce00b28..9b4bd71 100644
--- a/tests/multivalentTests/src/com/android/launcher3/icons/IconCacheTest.java
+++ b/tests/multivalentTests/src/com/android/launcher3/icons/IconCacheTest.java
@@ -71,6 +71,7 @@
import com.google.common.truth.Truth;
+import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -99,6 +100,11 @@
new LauncherIconProvider(mContext));
}
+ @After
+ public void tearDown() {
+ mIconCache.close();
+ }
+
@Test
public void getShortcutInfoBadge_nullComponent_overrideAllowed() throws Exception {
String overridePackage = "com.android.settings";
diff --git a/tests/multivalentTests/src/com/android/launcher3/model/DatabaseHelperTest.kt b/tests/multivalentTests/src/com/android/launcher3/model/DatabaseHelperTest.kt
index c9ea421..09752b8 100644
--- a/tests/multivalentTests/src/com/android/launcher3/model/DatabaseHelperTest.kt
+++ b/tests/multivalentTests/src/com/android/launcher3/model/DatabaseHelperTest.kt
@@ -1,5 +1,6 @@
package com.android.launcher3.model
+import android.content.Context
import android.database.sqlite.SQLiteDatabase
import android.os.UserHandle
import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -11,8 +12,10 @@
import com.android.launcher3.pm.UserCache
import com.android.launcher3.provider.LauncherDbUtils
import java.util.function.ToLongFunction
+import org.junit.After
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
+import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
@@ -24,6 +27,19 @@
@SmallTest
@RunWith(AndroidJUnit4::class)
class DatabaseHelperTest {
+ val context: Context = InstrumentationRegistry.getInstrumentation().targetContext
+ // v30 - 21 columns
+ lateinit var db: SQLiteDatabase
+
+ @Before
+ fun setUp() {
+ db = FactitiousDbController(context, INSERTION_SQL).inMemoryDb
+ }
+
+ @After
+ fun tearDown() {
+ db.close()
+ }
/**
* b/304687723 occurred when a return was accidentally added to a case statement in
@@ -33,13 +49,11 @@
*/
@Test
fun onUpgrade_to_version_32_from_30() {
- val context = InstrumentationRegistry.getInstrumentation().targetContext
val userSerialProvider =
ToLongFunction<UserHandle> {
UserCache.INSTANCE.get(context).getSerialNumberForUser(it)
}
val dbHelper = DatabaseHelper(context, null, userSerialProvider) {}
- val db = FactitiousDbController(context, INSERTION_SQL).inMemoryDb
dbHelper.onUpgrade(db, 30, 32)
@@ -54,9 +68,6 @@
*/
@Test
fun after_migrating_from_db_v30_to_v32_copy_table() {
- val context = InstrumentationRegistry.getInstrumentation().targetContext
- val db = FactitiousDbController(context, INSERTION_SQL).inMemoryDb // v30 - 21 columns
-
addTableToDb(db, 1, true, TMP_TABLE)
LauncherDbUtils.copyTable(db, TABLE_NAME, db, TMP_TABLE, context)
diff --git a/tests/multivalentTests/src/com/android/launcher3/model/FolderIconLoadTest.kt b/tests/multivalentTests/src/com/android/launcher3/model/FolderIconLoadTest.kt
index 7cd5da4..e8f778f 100644
--- a/tests/multivalentTests/src/com/android/launcher3/model/FolderIconLoadTest.kt
+++ b/tests/multivalentTests/src/com/android/launcher3/model/FolderIconLoadTest.kt
@@ -18,6 +18,7 @@
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.launcher3.LauncherAppState
+import com.android.launcher3.icons.BitmapInfo
import com.android.launcher3.icons.waitForUpdateHandlerToFinish
import com.android.launcher3.model.data.WorkspaceItemInfo
import com.android.launcher3.util.Executors
@@ -160,6 +161,9 @@
assertWithMessage("Index $index was not highRes")
.that(items[index].bitmap.isNullOrLowRes)
.isFalse()
+ assertWithMessage("Index $index was the default icon")
+ .that(isDefaultIcon(items[index].bitmap))
+ .isFalse()
}
}
@@ -168,9 +172,17 @@
assertWithMessage("Index $index was not lowRes")
.that(items[index].bitmap.isNullOrLowRes)
.isTrue()
+ assertWithMessage("Index $index was the default icon")
+ .that(isDefaultIcon(items[index].bitmap))
+ .isFalse()
}
}
+ private fun isDefaultIcon(bitmap: BitmapInfo) =
+ LauncherAppState.getInstance(modelHelper.sandboxContext)
+ .iconCache
+ .isDefaultIcon(bitmap, modelHelper.sandboxContext.user)
+
/** Recreate DeviceProfiles after changing InvariantDeviceProfile */
private fun recreateSupportedDeviceProfiles() {
LauncherAppState.getIDP(modelHelper.sandboxContext).supportedProfiles =
diff --git a/tests/multivalentTests/src/com/android/launcher3/model/GridSizeMigrationTest.kt b/tests/multivalentTests/src/com/android/launcher3/model/GridSizeMigrationTest.kt
index 7933331..eee6191 100644
--- a/tests/multivalentTests/src/com/android/launcher3/model/GridSizeMigrationTest.kt
+++ b/tests/multivalentTests/src/com/android/launcher3/model/GridSizeMigrationTest.kt
@@ -82,6 +82,7 @@
@After
fun tearDown() {
+ db.close()
modelHelper.destroy()
}
diff --git a/tests/multivalentTests/src/com/android/launcher3/model/LoaderCursorTest.java b/tests/multivalentTests/src/com/android/launcher3/model/LoaderCursorTest.java
index b4945d7..63359ec 100644
--- a/tests/multivalentTests/src/com/android/launcher3/model/LoaderCursorTest.java
+++ b/tests/multivalentTests/src/com/android/launcher3/model/LoaderCursorTest.java
@@ -109,6 +109,7 @@
@After
public void tearDown() {
+ mCursor.close();
mModelHelper.destroy();
}
diff --git a/tests/multivalentTests/src/com/android/launcher3/model/WorkspaceItemProcessorTest.kt b/tests/multivalentTests/src/com/android/launcher3/model/WorkspaceItemProcessorTest.kt
index ed8b397..7099d38 100644
--- a/tests/multivalentTests/src/com/android/launcher3/model/WorkspaceItemProcessorTest.kt
+++ b/tests/multivalentTests/src/com/android/launcher3/model/WorkspaceItemProcessorTest.kt
@@ -36,10 +36,7 @@
import com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_DEEP_SHORTCUT
import com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_FOLDER
import com.android.launcher3.Utilities.EMPTY_PERSON_ARRAY
-import com.android.launcher3.backuprestore.LauncherRestoreEventLogger
-import com.android.launcher3.backuprestore.LauncherRestoreEventLogger.RestoreError.Companion.MISSING_INFO
-import com.android.launcher3.backuprestore.LauncherRestoreEventLogger.RestoreError.Companion.MISSING_WIDGET_PROVIDER
-import com.android.launcher3.backuprestore.LauncherRestoreEventLogger.RestoreError.Companion.PROFILE_DELETED
+import com.android.launcher3.backuprestore.LauncherRestoreEventLogger.RestoreError
import com.android.launcher3.icons.CacheableShortcutInfo
import com.android.launcher3.model.data.FolderInfo
import com.android.launcher3.model.data.IconRequestInfo
@@ -224,7 +221,8 @@
itemProcessorUnderTest.processItem()
// Then
- verify(mockCursor).markDeleted("User has been deleted for item id=1", PROFILE_DELETED)
+ verify(mockCursor)
+ .markDeleted("User has been deleted for item id=1", RestoreError.PROFILE_DELETED)
verify(mockCursor, times(0)).checkAndAddItem(any(), any(), anyOrNull())
}
@@ -237,7 +235,8 @@
itemProcessorUnderTest = createWorkspaceItemProcessorUnderTest()
itemProcessorUnderTest.processItem()
// Then
- verify(mockCursor).markDeleted("Null intent from db for item id=1", MISSING_INFO)
+ verify(mockCursor)
+ .markDeleted("Null intent from db for item id=1", RestoreError.APP_NO_DB_INTENT)
verify(mockCursor, times(0)).checkAndAddItem(any(), any(), anyOrNull())
}
@@ -255,7 +254,8 @@
itemProcessorUnderTest.processItem()
// Then
- verify(mockCursor).markDeleted("No target package for item id=1", MISSING_INFO)
+ verify(mockCursor)
+ .markDeleted("No target package for item id=1", RestoreError.APP_NO_TARGET_PACKAGE)
verify(mockCursor, times(0)).checkAndAddItem(any(), any(), anyOrNull())
}
@@ -272,7 +272,8 @@
itemProcessorUnderTest.processItem()
// Then
- verify(mockCursor).markDeleted("No target package for item id=1", MISSING_INFO)
+ verify(mockCursor)
+ .markDeleted("No target package for item id=1", RestoreError.APP_NO_TARGET_PACKAGE)
verify(mockCursor, times(0)).checkAndAddItem(any(), any(), anyOrNull())
}
@@ -350,7 +351,7 @@
" targetPkg=package," +
" component=ComponentInfo{package/class}." +
" Unable to create launch Intent.",
- MISSING_INFO,
+ RestoreError.APP_NO_LAUNCH_INTENT,
)
verify(mockCursor, times(0)).checkAndAddItem(any(), any(), anyOrNull())
}
@@ -663,7 +664,7 @@
verify(mockCursor)
.markDeleted(
"processWidget: Unrestored Pending widget removed: id=1, appWidgetId=0, component=$expectedComponentName, restoreFlag:=4",
- LauncherRestoreEventLogger.RestoreError.APP_NOT_INSTALLED,
+ RestoreError.UNRESTORED_PENDING_WIDGET,
)
}
@@ -689,7 +690,7 @@
type = WidgetInflater.TYPE_DELETE,
widgetInfo = null,
reason = "test_delete_reason",
- restoreErrorType = MISSING_WIDGET_PROVIDER,
+ restoreErrorType = RestoreError.MISSING_WIDGET_PROVIDER,
)
mockWidgetInflater =
mock<WidgetInflater>().apply {
diff --git a/tests/multivalentTests/src/com/android/launcher3/provider/RestoreDbTaskTest.java b/tests/multivalentTests/src/com/android/launcher3/provider/RestoreDbTaskTest.java
index d0c168a..c30b730 100644
--- a/tests/multivalentTests/src/com/android/launcher3/provider/RestoreDbTaskTest.java
+++ b/tests/multivalentTests/src/com/android/launcher3/provider/RestoreDbTaskTest.java
@@ -92,6 +92,7 @@
private Cursor mMockCursor;
private LauncherPrefs mPrefs;
private LauncherRestoreEventLogger mMockRestoreEventLogger;
+ private SQLiteDatabase mDb;
@Before
public void setup() {
@@ -107,57 +108,60 @@
@After
public void teardown() {
+ if (mDb != null) {
+ mDb.close();
+ }
mModelHelper.destroy();
LauncherPrefs.get(mContext).removeSync(RESTORE_DEVICE);
}
@Test
public void testGetProfileId() throws Exception {
- SQLiteDatabase db = new MyModelDbController(23).getDb();
- assertEquals(23, new RestoreDbTask().getDefaultProfileId(db));
+ mDb = new MyModelDbController(23).getDb();
+ assertEquals(23, new RestoreDbTask().getDefaultProfileId(mDb));
}
@Test
public void testMigrateProfileId() throws Exception {
- SQLiteDatabase db = new MyModelDbController(42).getDb();
+ mDb = new MyModelDbController(42).getDb();
// Add some mock data
for (int i = 0; i < 5; i++) {
ContentValues values = new ContentValues();
values.put(Favorites._ID, i);
values.put(Favorites.TITLE, "item " + i);
- db.insert(Favorites.TABLE_NAME, null, values);
+ mDb.insert(Favorites.TABLE_NAME, null, values);
}
// Verify item add
- assertEquals(5, getCount(db, "select * from favorites where profileId = 42"));
+ assertEquals(5, getCount(mDb, "select * from favorites where profileId = 42"));
- new RestoreDbTask().migrateProfileId(db, 42, 33);
+ new RestoreDbTask().migrateProfileId(mDb, 42, 33);
// verify data migrated
- assertEquals(0, getCount(db, "select * from favorites where profileId = 42"));
- assertEquals(5, getCount(db, "select * from favorites where profileId = 33"));
+ assertEquals(0, getCount(mDb, "select * from favorites where profileId = 42"));
+ assertEquals(5, getCount(mDb, "select * from favorites where profileId = 33"));
}
@Test
public void testChangeDefaultColumn() throws Exception {
- SQLiteDatabase db = new MyModelDbController(42).getDb();
+ mDb = new MyModelDbController(42).getDb();
// Add some mock data
for (int i = 0; i < 5; i++) {
ContentValues values = new ContentValues();
values.put(Favorites._ID, i);
values.put(Favorites.TITLE, "item " + i);
- db.insert(Favorites.TABLE_NAME, null, values);
+ mDb.insert(Favorites.TABLE_NAME, null, values);
}
// Verify default column is 42
- assertEquals(5, getCount(db, "select * from favorites where profileId = 42"));
+ assertEquals(5, getCount(mDb, "select * from favorites where profileId = 42"));
- new RestoreDbTask().changeDefaultColumn(db, 33);
+ new RestoreDbTask().changeDefaultColumn(mDb, 33);
// Verify default value changed
ContentValues values = new ContentValues();
values.put(Favorites._ID, 100);
values.put(Favorites.TITLE, "item 100");
- db.insert(Favorites.TABLE_NAME, null, values);
- assertEquals(1, getCount(db, "select * from favorites where profileId = 33"));
+ mDb.insert(Favorites.TABLE_NAME, null, values);
+ assertEquals(1, getCount(mDb, "select * from favorites where profileId = 33"));
}
@Test
@@ -170,7 +174,7 @@
long workProfileId_old = myProfileId + 3;
MyModelDbController controller = new MyModelDbController(myProfileId);
- SQLiteDatabase db = controller.getDb();
+ mDb = controller.getDb();
BackupManager bm = spy(new BackupManager(mContext));
doReturn(myUserHandle()).when(bm).getUserForAncestralSerialNumber(eq(myProfileId_old));
doReturn(mWorkUser).when(bm).getUserForAncestralSerialNumber(eq(workProfileId_old));
@@ -178,16 +182,16 @@
addIconsBulk(controller, 10, 1, myProfileId_old);
addIconsBulk(controller, 6, 2, workProfileId_old);
- assertEquals(10, getItemCountForProfile(db, myProfileId_old));
- assertEquals(6, getItemCountForProfile(db, workProfileId_old));
+ assertEquals(10, getItemCountForProfile(mDb, myProfileId_old));
+ assertEquals(6, getItemCountForProfile(mDb, workProfileId_old));
mTask.sanitizeDB(mContext, controller, controller.getDb(), bm, mMockRestoreEventLogger);
// All the data has been migrated to the new user ids
- assertEquals(0, getItemCountForProfile(db, myProfileId_old));
- assertEquals(0, getItemCountForProfile(db, workProfileId_old));
- assertEquals(10, getItemCountForProfile(db, myProfileId));
- assertEquals(6, getItemCountForProfile(db, workProfileId));
+ assertEquals(0, getItemCountForProfile(mDb, myProfileId_old));
+ assertEquals(0, getItemCountForProfile(mDb, workProfileId_old));
+ assertEquals(10, getItemCountForProfile(mDb, myProfileId));
+ assertEquals(6, getItemCountForProfile(mDb, workProfileId));
}
@Test
@@ -199,7 +203,7 @@
long workProfileId_old = myProfileId + 3;
MyModelDbController controller = new MyModelDbController(myProfileId);
- SQLiteDatabase db = controller.getDb();
+ mDb = controller.getDb();
BackupManager bm = spy(new BackupManager(mContext));
doReturn(myUserHandle()).when(bm).getUserForAncestralSerialNumber(eq(myProfileId_old));
// Work profile is not migrated
@@ -207,16 +211,16 @@
addIconsBulk(controller, 10, 1, myProfileId_old);
addIconsBulk(controller, 6, 2, workProfileId_old);
- assertEquals(10, getItemCountForProfile(db, myProfileId_old));
- assertEquals(6, getItemCountForProfile(db, workProfileId_old));
+ assertEquals(10, getItemCountForProfile(mDb, myProfileId_old));
+ assertEquals(6, getItemCountForProfile(mDb, workProfileId_old));
mTask.sanitizeDB(mContext, controller, controller.getDb(), bm, mMockRestoreEventLogger);
// All the data has been migrated to the new user ids
- assertEquals(0, getItemCountForProfile(db, myProfileId_old));
- assertEquals(0, getItemCountForProfile(db, workProfileId_old));
- assertEquals(10, getItemCountForProfile(db, myProfileId));
- assertEquals(10, getCount(db, "select * from favorites"));
+ assertEquals(0, getItemCountForProfile(mDb, myProfileId_old));
+ assertEquals(0, getItemCountForProfile(mDb, workProfileId_old));
+ assertEquals(10, getItemCountForProfile(mDb, myProfileId));
+ assertEquals(10, getCount(mDb, "select * from favorites"));
}
@Test
@@ -342,24 +346,24 @@
}
private void runRemoveScreenIdGapsTest(int[] screenIds, int[] expectedScreenIds) {
- SQLiteDatabase db = new MyModelDbController(42).getDb();
+ mDb = new MyModelDbController(42).getDb();
// Add some mock data
for (int i = 0; i < screenIds.length; i++) {
ContentValues values = new ContentValues();
values.put(Favorites._ID, i);
values.put(Favorites.SCREEN, screenIds[i]);
values.put(Favorites.CONTAINER, CONTAINER_DESKTOP);
- db.insert(Favorites.TABLE_NAME, null, values);
+ mDb.insert(Favorites.TABLE_NAME, null, values);
}
// Verify items are added
assertEquals(screenIds.length,
- getCount(db, "select * from favorites where container = -100"));
+ getCount(mDb, "select * from favorites where container = -100"));
- new RestoreDbTask().removeScreenIdGaps(db);
+ new RestoreDbTask().removeScreenIdGaps(mDb);
// verify screenId gaps removed
int[] resultScreenIds = new int[screenIds.length];
- try (Cursor c = db.rawQuery(
+ try (Cursor c = mDb.rawQuery(
"select screen from favorites where container = -100 order by screen", null)) {
int i = 0;
while (c.moveToNext()) {
diff --git a/tests/multivalentTests/src/com/android/launcher3/widget/GeneratedPreviewTest.kt b/tests/multivalentTests/src/com/android/launcher3/widget/GeneratedPreviewTest.kt
index 7484bce..ac5fda2 100644
--- a/tests/multivalentTests/src/com/android/launcher3/widget/GeneratedPreviewTest.kt
+++ b/tests/multivalentTests/src/com/android/launcher3/widget/GeneratedPreviewTest.kt
@@ -26,6 +26,7 @@
import com.android.launcher3.util.ActivityContextWrapper
import com.android.launcher3.util.Executors
import com.google.common.truth.Truth.assertThat
+import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
@@ -38,7 +39,7 @@
@get:Rule val checkFlagsRule: CheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule()
private val providerName =
ComponentName(
- getInstrumentation().getContext().getPackageName(),
+ getInstrumentation().context.packageName,
"com.android.launcher3.testcomponent.AppWidgetNoConfig",
)
private val generatedPreviewLayout =
@@ -51,6 +52,7 @@
private lateinit var helper: WidgetManagerHelper
private lateinit var appWidgetProviderInfo: LauncherAppWidgetProviderInfo
private lateinit var widgetItem: WidgetItem
+ private lateinit var iconCache: IconCache
@Before
fun setup() {
@@ -88,17 +90,17 @@
createWidgetItem()
}
+ @After
+ fun tearDown() {
+ iconCache.close()
+ }
+
private fun createWidgetItem() {
Executors.MODEL_EXECUTOR.submit {
val idp = InvariantDeviceProfile()
- widgetItem =
- WidgetItem(
- appWidgetProviderInfo,
- idp,
- IconCache(context, idp, null, IconProvider(context)),
- context,
- helper,
- )
+ if (::iconCache.isInitialized) iconCache.close()
+ iconCache = IconCache(context, idp, null, IconProvider(context))
+ widgetItem = WidgetItem(appWidgetProviderInfo, idp, iconCache, context, helper)
}
.get()
}
diff --git a/tests/multivalentTests/src/com/android/launcher3/widget/RoundedCornerEnforcementTest.kt b/tests/multivalentTests/src/com/android/launcher3/widget/RoundedCornerEnforcementTest.kt
index c82e84c..13e23c9 100644
--- a/tests/multivalentTests/src/com/android/launcher3/widget/RoundedCornerEnforcementTest.kt
+++ b/tests/multivalentTests/src/com/android/launcher3/widget/RoundedCornerEnforcementTest.kt
@@ -86,7 +86,7 @@
}
@Test
- @DisableFlags(Flags.FLAG_ENFORCE_SYSTEM_RADIUS_FOR_APP_WIDGETS)
+ @DisableFlags(Flags.FLAG_USE_SYSTEM_RADIUS_FOR_APP_WIDGETS)
fun `Compute system radius when smaller`() {
val mockContext = mock(Context::class.java)
val mockRes = mock(Resources::class.java)
@@ -103,7 +103,7 @@
}
@Test
- @DisableFlags(Flags.FLAG_ENFORCE_SYSTEM_RADIUS_FOR_APP_WIDGETS)
+ @DisableFlags(Flags.FLAG_USE_SYSTEM_RADIUS_FOR_APP_WIDGETS)
fun `Compute launcher radius when smaller`() {
val mockContext = mock(Context::class.java)
val mockRes = mock(Resources::class.java)
@@ -120,7 +120,7 @@
}
@Test
- @EnableFlags(Flags.FLAG_ENFORCE_SYSTEM_RADIUS_FOR_APP_WIDGETS)
+ @EnableFlags(Flags.FLAG_USE_SYSTEM_RADIUS_FOR_APP_WIDGETS)
fun `Compute system radius ignoring launcher radius`() {
val mockContext = mock(Context::class.java)
val mockRes = mock(Resources::class.java)
diff --git a/tests/res/drawable/test_icon.xml b/tests/res/drawable/test_icon.xml
new file mode 100644
index 0000000..72ebfeb
--- /dev/null
+++ b/tests/res/drawable/test_icon.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2024 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+ <background android:drawable="@android:color/white"/>
+ <foreground>
+ <color android:color="#FFFF0000" />
+ </foreground>
+ <monochrome>
+ <vector android:width="48dp" android:height="48dp" android:viewportWidth="48.0" android:viewportHeight="48.0">
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M0,24L48,24 48,48, 0,48 Z"/>
+ </vector>
+ </monochrome>
+</adaptive-icon>
diff --git a/tests/src/com/android/launcher3/allapps/WorkUtilityViewTest.java b/tests/src/com/android/launcher3/allapps/WorkUtilityViewTest.java
new file mode 100644
index 0000000..b88d12e
--- /dev/null
+++ b/tests/src/com/android/launcher3/allapps/WorkUtilityViewTest.java
@@ -0,0 +1,87 @@
+/*
+ * 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.launcher3.allapps;
+
+import static android.view.View.GONE;
+import static android.view.View.VISIBLE;
+
+import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
+
+import static com.android.launcher3.Flags.FLAG_WORK_SCHEDULER_IN_WORK_PROFILE;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.doReturn;
+
+import android.content.Context;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
+import android.view.ViewGroup;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+
+import com.android.launcher3.util.ActivityContextWrapper;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class WorkUtilityViewTest {
+
+ @Rule
+ public final SetFlagsRule mSetFlagsRule =
+ new SetFlagsRule(SetFlagsRule.DefaultInitValueType.DEVICE_DEFAULT);
+
+ private WorkUtilityView mVut;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ Context context = new ActivityContextWrapper(getApplicationContext(),
+ com.android.launcher3.R.style.DynamicColorsBaseLauncherTheme);
+ mVut = (WorkUtilityView) ViewGroup.inflate(context,
+ com.android.launcher3.R.layout.work_mode_utility_view, null);
+ }
+
+ @Test
+ @EnableFlags(FLAG_WORK_SCHEDULER_IN_WORK_PROFILE)
+ public void testInflateFlagOn_visible() {
+ WorkUtilityView workUtilityView = Mockito.spy(mVut);
+ doReturn(true).when(workUtilityView).shouldUseScheduler();
+
+ workUtilityView.onFinishInflate();
+
+ assertThat(workUtilityView.getSchedulerButton().getVisibility()).isEqualTo(VISIBLE);
+ assertThat(workUtilityView.getSchedulerButton().hasOnClickListeners()).isEqualTo(true);
+ }
+
+ @Test
+ @DisableFlags(FLAG_WORK_SCHEDULER_IN_WORK_PROFILE)
+ public void testInflateFlagOff_gone() {
+ mVut.onFinishInflate();
+
+ assertThat(mVut.getSchedulerButton().getVisibility()).isEqualTo(GONE);
+ assertThat(mVut.getSchedulerButton().hasOnClickListeners()).isEqualTo(false);
+ }
+}
diff --git a/tests/src/com/android/launcher3/model/GridMigrationTest.kt b/tests/src/com/android/launcher3/model/GridMigrationTest.kt
index 379e98d..b8ffe74 100644
--- a/tests/src/com/android/launcher3/model/GridMigrationTest.kt
+++ b/tests/src/com/android/launcher3/model/GridMigrationTest.kt
@@ -17,6 +17,7 @@
package com.android.launcher3.model
import android.platform.test.flag.junit.SetFlagsRule
+import android.util.Log
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import androidx.test.platform.app.InstrumentationRegistry
@@ -34,7 +35,14 @@
private val phoneContext = InstrumentationRegistry.getInstrumentation().targetContext
-data class EntryData(val x: Int, val y: Int, val spanX: Int, val spanY: Int, val rank: Int)
+data class EntryData(
+ val x: Int,
+ val y: Int,
+ val screenId: Int,
+ val spanX: Int,
+ val spanY: Int,
+ val rank: Int,
+)
/**
* Holds the data needed to run a test in GridMigrationTest, usually we would have a src
@@ -72,24 +80,16 @@
@RunWith(AndroidJUnit4::class)
class GridMigrationTest {
private val DB_FILE = "test_launcher.db"
+ // This DB is used for testing the heuristic where we add an extra row at the bottom.
+ private val DB_FILE_NO_SHIFT = "test_launcher_2.db"
@JvmField
@Rule
val setFlagsRule = SetFlagsRule(SetFlagsRule.DefaultInitValueType.DEVICE_DEFAULT)
- // Copying the src db for all tests.
- @JvmField
- @Rule
- val fileCopier =
- TestToPhoneFileCopier(
- src = "databases/GridMigrationTest/$DB_FILE",
- dest = "databases/$DB_FILE",
- removeOnFinish = true,
- )
-
@Before
fun setup() {
- setFlagsRule.setFlags(false, Flags.FLAG_ENABLE_GRID_MIGRATION_FIX)
+ setFlagsRule.setFlags(true, Flags.FLAG_ONE_GRID_SPECS)
}
private fun migrate(src: GridMigrationData, dst: GridMigrationData) {
@@ -101,7 +101,7 @@
dst.gridState,
dst.dbHelper,
src.dbHelper.readableDatabase,
- false,
+ true,
)
} else {
GridSizeMigrationDBController.migrateGridIfNeeded(
@@ -110,7 +110,7 @@
dst.gridState,
dst.dbHelper,
src.dbHelper.readableDatabase,
- false,
+ true,
)
}
}
@@ -131,12 +131,18 @@
}
}
- private fun compare(dst: GridMigrationData, target: GridMigrationData) {
- val sort = compareBy<DbEntry>({ it.cellX }, { it.cellY })
- val mapF = { it: DbEntry -> EntryData(it.cellX, it.cellY, it.spanX, it.spanY, it.rank) }
+ private fun compare(dst: GridMigrationData, target: GridMigrationData, src: GridMigrationData) {
+ val sort = compareBy<DbEntry>({ it.screenId }, { it.cellX }, { it.cellY })
+ val mapF = { it: DbEntry ->
+ EntryData(it.cellX, it.cellY, it.screenId, it.spanX, it.spanY, it.rank)
+ }
val entriesDst = dst.readEntries().sortedWith(sort).map(mapF)
val entriesTarget = target.readEntries().sortedWith(sort).map(mapF)
-
+ val entriesSrc = src.readEntries().sortedWith(sort).map(mapF)
+ Log.i(
+ TAG,
+ "entriesSrc: $entriesSrc\n entriesDst: $entriesDst\n entriesTarget: $entriesTarget",
+ )
assert(entriesDst == entriesTarget) {
"The elements on the dst database is not the same as in the target"
}
@@ -155,9 +161,19 @@
"Source db and destination db do not contain the same number of elements"
}
validateDb(dst)
- compare(dst, target)
+ compare(dst, target, src)
}
+ // Copying the src db for all tests.
+ @JvmField
+ @Rule
+ val fileCopier =
+ TestToPhoneFileCopier(
+ src = "databases/GridMigrationTest/$DB_FILE",
+ dest = "databases/$DB_FILE",
+ removeOnFinish = true,
+ )
+
@JvmField
@Rule
val result5x5to3x3 =
@@ -173,8 +189,8 @@
src = GridMigrationData(DB_FILE, DeviceGridState(5, 5, 5, TYPE_PHONE, DB_FILE)),
dst =
GridMigrationData(
- null, // in memory db, to download a new db change null for the filename of the
- // db name to store it. Do not use existing names.
+ null, // in memory db, to download a new db change null for
+ // the filename of the db name to store it. Do not use existing names.
DeviceGridState(3, 3, 3, TYPE_PHONE, ""),
),
target =
@@ -196,8 +212,8 @@
src = GridMigrationData(DB_FILE, DeviceGridState(5, 5, 5, TYPE_PHONE, DB_FILE)),
dst =
GridMigrationData(
- null, // in memory db, to download a new db change null for the filename of the
- // db name to store it. Do not use existing names.
+ null, // in memory db, to download a new db change null for
+ // the filename of the db name to store it. Do not use existing names.
DeviceGridState(4, 7, 4, TYPE_PHONE, ""),
),
target =
@@ -206,6 +222,42 @@
@JvmField
@Rule
+ val result5x5to5x8WithShift =
+ TestToPhoneFileCopier(
+ src = "databases/GridMigrationTest/result5x5to5x8WithShift.db",
+ dest = "databases/result5x5to5x8WithShift.db",
+ removeOnFinish = true,
+ )
+
+ @Test
+ fun `5x5 to 5x8 with cells shifting down`() =
+ runTest(
+ src = GridMigrationData(DB_FILE, DeviceGridState(5, 5, 5, TYPE_PHONE, DB_FILE)),
+ dst =
+ GridMigrationData(
+ null, // in memory db, to download a new db change null
+ // for
+ // the filename of the db name to store it. Do not use existing names.
+ DeviceGridState(5, 8, 5, TYPE_PHONE, ""),
+ ),
+ target =
+ GridMigrationData(
+ "result5x5to5x8WithShift.db",
+ DeviceGridState(5, 8, 5, TYPE_PHONE, ""),
+ ),
+ )
+
+ @JvmField
+ @Rule
+ val fileCopierNoShift =
+ TestToPhoneFileCopier(
+ src = "databases/GridMigrationTest/$DB_FILE_NO_SHIFT",
+ dest = "databases/$DB_FILE_NO_SHIFT",
+ removeOnFinish = true,
+ )
+
+ @JvmField
+ @Rule
val result5x5to5x8 =
TestToPhoneFileCopier(
src = "databases/GridMigrationTest/result5x5to5x8.db",
@@ -214,44 +266,24 @@
)
@Test
- fun `5x5 to 5x8`() =
+ fun `5x5 to 5x8 without cell shift`() =
runTest(
- src = GridMigrationData(DB_FILE, DeviceGridState(5, 5, 5, TYPE_PHONE, DB_FILE)),
+ src =
+ GridMigrationData(
+ DB_FILE_NO_SHIFT,
+ DeviceGridState(5, 5, 5, TYPE_PHONE, DB_FILE_NO_SHIFT),
+ ),
dst =
GridMigrationData(
- null, // in memory db, to download a new db change null for the filename of the
- // db name to store it. Do not use existing names.
+ null, // in memory db, to download a new db change null for
+ // the filename of the db name to store it. Do not use existing names.
DeviceGridState(5, 8, 5, TYPE_PHONE, ""),
),
target =
GridMigrationData("result5x5to5x8.db", DeviceGridState(5, 8, 5, TYPE_PHONE, "")),
)
- @JvmField
- @Rule
- val flaggedResult5x5to5x8 =
- TestToPhoneFileCopier(
- src = "databases/GridMigrationTest/flagged_result5x5to5x8.db",
- dest = "databases/flagged_result5x5to5x8.db",
- removeOnFinish = true,
- )
-
- @Test
- fun `flagged 5x5 to 5x8`() {
- setFlagsRule.setFlags(true, Flags.FLAG_ENABLE_GRID_MIGRATION_FIX)
- runTest(
- src = GridMigrationData(DB_FILE, DeviceGridState(5, 5, 5, TYPE_PHONE, DB_FILE)),
- dst =
- GridMigrationData(
- null, // in memory db, to download a new db change null for the filename of the
- // db name to store it. Do not use existing names.
- DeviceGridState(5, 8, 5, TYPE_PHONE, ""),
- ),
- target =
- GridMigrationData(
- "flagged_result5x5to5x8.db",
- DeviceGridState(5, 8, 5, TYPE_PHONE, ""),
- ),
- )
+ companion object {
+ private const val TAG = "GridMigrationTest"
}
}
diff --git a/tests/src/com/android/launcher3/ui/widget/AddConfigWidgetTest.java b/tests/src/com/android/launcher3/ui/widget/AddConfigWidgetTest.java
index bb645d7..64ad305 100644
--- a/tests/src/com/android/launcher3/ui/widget/AddConfigWidgetTest.java
+++ b/tests/src/com/android/launcher3/ui/widget/AddConfigWidgetTest.java
@@ -123,7 +123,7 @@
v instanceof WidgetCell
&& v.getTag() instanceof PendingAddWidgetInfo pawi
&& mWidgetInfo.provider.equals(pawi.componentName)));
- addToWorkspace(widgetView);
+ addWidgetToWorkspace(widgetView);
// Widget id for which the config activity was opened
mWidgetId = monitor.getWidgetId();
diff --git a/tests/src/com/android/launcher3/util/BaseLauncherActivityTest.kt b/tests/src/com/android/launcher3/util/BaseLauncherActivityTest.kt
index 6446592..b5702c9 100644
--- a/tests/src/com/android/launcher3/util/BaseLauncherActivityTest.kt
+++ b/tests/src/com/android/launcher3/util/BaseLauncherActivityTest.kt
@@ -124,9 +124,10 @@
@JvmOverloads
protected fun injectKeyEvent(keyCode: Int, actionDown: Boolean, metaState: Int = 0) {
+ uiDevice.waitForIdle()
val eventTime = SystemClock.uptimeMillis()
val event =
- KeyEvent.obtain(
+ KeyEvent(
eventTime,
eventTime,
if (actionDown) KeyEvent.ACTION_DOWN else MotionEvent.ACTION_UP,
@@ -137,10 +138,8 @@
/* scancode= */ 0,
/* flags= */ 0,
InputDevice.SOURCE_KEYBOARD,
- /* characters =*/ null,
)
executeOnLauncher { it.dispatchKeyEvent(event) }
- event.recycle()
}
@JvmOverloads
@@ -171,6 +170,18 @@
UiDevice.getInstance(getInstrumentation()).waitForIdle()
}
+ /**
+ * Match the behavior with how widget is added in reality with "tap to add" (even with screen
+ * readers).
+ */
+ fun addWidgetToWorkspace(view: View) {
+ executeOnLauncher {
+ view.performClick()
+ UiDevice.getInstance(getInstrumentation()).waitForIdle()
+ view.findViewById<View>(R.id.widget_add_button).performClick()
+ }
+ }
+
fun ViewGroup.searchView(filter: Predicate<View>): View? {
if (filter.test(this)) return this
for (child in children) {