summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--AndroidManifest.xml1
-rw-r--r--aconfig/launcher.aconfig10
-rw-r--r--go/AndroidManifest-launcher.xml1
-rw-r--r--proguard.flags20
-rw-r--r--quickstep/AndroidManifest-launcher.xml1
-rw-r--r--quickstep/res/drawable/ic_save_app_pair_left_right.xml47
-rw-r--r--quickstep/res/drawable/ic_save_app_pair_up_down.xml49
-rw-r--r--quickstep/res/values-af/strings.xml9
-rw-r--r--quickstep/res/values-am/strings.xml9
-rw-r--r--quickstep/res/values-ar/strings.xml9
-rw-r--r--quickstep/res/values-as/strings.xml9
-rw-r--r--quickstep/res/values-az/strings.xml9
-rw-r--r--quickstep/res/values-b+sr+Latn/strings.xml9
-rw-r--r--quickstep/res/values-be/strings.xml9
-rw-r--r--quickstep/res/values-bg/strings.xml9
-rw-r--r--quickstep/res/values-bn/strings.xml9
-rw-r--r--quickstep/res/values-bs/strings.xml9
-rw-r--r--quickstep/res/values-ca/strings.xml9
-rw-r--r--quickstep/res/values-cs/strings.xml9
-rw-r--r--quickstep/res/values-da/strings.xml9
-rw-r--r--quickstep/res/values-de/strings.xml9
-rw-r--r--quickstep/res/values-el/strings.xml9
-rw-r--r--quickstep/res/values-en-rAU/strings.xml9
-rw-r--r--quickstep/res/values-en-rCA/strings.xml6
-rw-r--r--quickstep/res/values-en-rGB/strings.xml9
-rw-r--r--quickstep/res/values-en-rIN/strings.xml9
-rw-r--r--quickstep/res/values-es-rUS/strings.xml11
-rw-r--r--quickstep/res/values-es/strings.xml9
-rw-r--r--quickstep/res/values-et/strings.xml9
-rw-r--r--quickstep/res/values-eu/strings.xml9
-rw-r--r--quickstep/res/values-fa/strings.xml9
-rw-r--r--quickstep/res/values-fi/strings.xml9
-rw-r--r--quickstep/res/values-fr-rCA/strings.xml9
-rw-r--r--quickstep/res/values-fr/strings.xml9
-rw-r--r--quickstep/res/values-gl/strings.xml9
-rw-r--r--quickstep/res/values-gu/strings.xml9
-rw-r--r--quickstep/res/values-hi/strings.xml9
-rw-r--r--quickstep/res/values-hr/strings.xml9
-rw-r--r--quickstep/res/values-hy/strings.xml9
-rw-r--r--quickstep/res/values-in/strings.xml9
-rw-r--r--quickstep/res/values-is/strings.xml9
-rw-r--r--quickstep/res/values-it/strings.xml9
-rw-r--r--quickstep/res/values-iw/strings.xml9
-rw-r--r--quickstep/res/values-ka/strings.xml9
-rw-r--r--quickstep/res/values-kk/strings.xml9
-rw-r--r--quickstep/res/values-km/strings.xml9
-rw-r--r--quickstep/res/values-kn/strings.xml9
-rw-r--r--quickstep/res/values-ko/strings.xml9
-rw-r--r--quickstep/res/values-ky/strings.xml9
-rw-r--r--quickstep/res/values-lo/strings.xml9
-rw-r--r--quickstep/res/values-lt/strings.xml9
-rw-r--r--quickstep/res/values-lv/strings.xml9
-rw-r--r--quickstep/res/values-mk/strings.xml9
-rw-r--r--quickstep/res/values-ml/strings.xml9
-rw-r--r--quickstep/res/values-mn/strings.xml9
-rw-r--r--quickstep/res/values-mr/strings.xml9
-rw-r--r--quickstep/res/values-my/strings.xml9
-rw-r--r--quickstep/res/values-nb/strings.xml9
-rw-r--r--quickstep/res/values-ne/strings.xml9
-rw-r--r--quickstep/res/values-nl/strings.xml9
-rw-r--r--quickstep/res/values-or/strings.xml9
-rw-r--r--quickstep/res/values-pa/strings.xml9
-rw-r--r--quickstep/res/values-pl/strings.xml9
-rw-r--r--quickstep/res/values-pt/strings.xml9
-rw-r--r--quickstep/res/values-ro/strings.xml9
-rw-r--r--quickstep/res/values-ru/strings.xml9
-rw-r--r--quickstep/res/values-si/strings.xml9
-rw-r--r--quickstep/res/values-sk/strings.xml9
-rw-r--r--quickstep/res/values-sq/strings.xml9
-rw-r--r--quickstep/res/values-sr/strings.xml9
-rw-r--r--quickstep/res/values-sv/strings.xml9
-rw-r--r--quickstep/res/values-sw/strings.xml9
-rw-r--r--quickstep/res/values-ta/strings.xml9
-rw-r--r--quickstep/res/values-te/strings.xml9
-rw-r--r--quickstep/res/values-th/strings.xml9
-rw-r--r--quickstep/res/values-tl/strings.xml9
-rw-r--r--quickstep/res/values-tr/strings.xml9
-rw-r--r--quickstep/res/values-uk/strings.xml9
-rw-r--r--quickstep/res/values-ur/strings.xml9
-rw-r--r--quickstep/res/values-uz/strings.xml9
-rw-r--r--quickstep/res/values-vi/strings.xml9
-rw-r--r--quickstep/res/values-zh-rCN/strings.xml9
-rw-r--r--quickstep/res/values-zh-rHK/strings.xml9
-rw-r--r--quickstep/res/values-zh-rTW/strings.xml9
-rw-r--r--quickstep/res/values-zu/strings.xml9
-rw-r--r--quickstep/res/values/config.xml1
-rw-r--r--quickstep/src/com/android/launcher3/QuickstepTransitionManager.java66
-rw-r--r--quickstep/src/com/android/launcher3/dagger/Modules.kt9
-rw-r--r--quickstep/src/com/android/launcher3/statehandlers/DesktopVisibilityController.kt71
-rw-r--r--quickstep/src/com/android/launcher3/taskbar/BarsLocationAnimatorHelper.kt34
-rw-r--r--quickstep/src/com/android/launcher3/taskbar/BaseTaskbarContext.java46
-rw-r--r--quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java25
-rw-r--r--quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java59
-rw-r--r--quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java35
-rw-r--r--quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java140
-rw-r--r--quickstep/src/com/android/launcher3/taskbar/TaskbarDesktopModeController.kt9
-rw-r--r--quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java15
-rw-r--r--quickstep/src/com/android/launcher3/taskbar/TaskbarEduTooltipController.kt3
-rw-r--r--quickstep/src/com/android/launcher3/taskbar/TaskbarHoverToolTipController.java15
-rw-r--r--quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt3
-rw-r--r--quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java94
-rw-r--r--quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java32
-rw-r--r--quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java2
-rw-r--r--quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java15
-rw-r--r--quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java17
-rw-r--r--quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacks.java8
-rw-r--r--quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacksFactory.kt3
-rw-r--r--quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java14
-rw-r--r--quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarView.java57
-rw-r--r--quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java81
-rw-r--r--quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleStashedHandleViewController.java5
-rw-r--r--quickstep/src/com/android/launcher3/taskbar/bubbles/stashing/BubbleStashController.kt9
-rw-r--r--quickstep/src/com/android/launcher3/taskbar/bubbles/stashing/TransientBubbleStashController.kt132
-rw-r--r--quickstep/src/com/android/launcher3/taskbar/growth/ActionPerformers.kt50
-rw-r--r--quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayContext.java36
-rw-r--r--quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayController.java2
-rw-r--r--quickstep/src/com/android/launcher3/uioverrides/PredictedAppIcon.java8
-rw-r--r--quickstep/src/com/android/launcher3/uioverrides/QuickstepAppWidgetHost.java74
-rw-r--r--quickstep/src/com/android/launcher3/uioverrides/QuickstepAppWidgetHostProvider.kt48
-rw-r--r--quickstep/src/com/android/launcher3/uioverrides/QuickstepInteractionHandler.java10
-rw-r--r--quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java12
-rw-r--r--quickstep/src/com/android/launcher3/uioverrides/QuickstepWidgetHolder.java125
-rw-r--r--quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.kt7
-rw-r--r--quickstep/src/com/android/launcher3/uioverrides/states/OverviewModalTaskState.java7
-rw-r--r--quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewDismissTouchController.kt11
-rw-r--r--quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java2
-rw-r--r--quickstep/src/com/android/quickstep/BaseContainerInterface.java2
-rw-r--r--quickstep/src/com/android/quickstep/DisplayModel.kt16
-rw-r--r--quickstep/src/com/android/quickstep/FallbackActivityInterface.java8
-rw-r--r--quickstep/src/com/android/quickstep/FallbackWindowInterface.java21
-rw-r--r--quickstep/src/com/android/quickstep/HomeVisibilityState.kt10
-rw-r--r--quickstep/src/com/android/quickstep/InputConsumerUtils.kt2
-rw-r--r--quickstep/src/com/android/quickstep/LauncherActivityInterface.java14
-rw-r--r--quickstep/src/com/android/quickstep/OverviewCommandHelper.kt15
-rw-r--r--quickstep/src/com/android/quickstep/OverviewComponentObserver.java21
-rw-r--r--quickstep/src/com/android/quickstep/RecentTasksList.java2
-rw-r--r--quickstep/src/com/android/quickstep/RemoteTargetGluer.java4
-rw-r--r--quickstep/src/com/android/quickstep/SystemDecorationChangeObserver.kt81
-rw-r--r--quickstep/src/com/android/quickstep/TaskAnimationManager.java16
-rw-r--r--quickstep/src/com/android/quickstep/TaskOverlayFactory.java8
-rw-r--r--quickstep/src/com/android/quickstep/TopTaskTracker.java25
-rw-r--r--quickstep/src/com/android/quickstep/TouchInteractionService.java60
-rw-r--r--quickstep/src/com/android/quickstep/dagger/QuickstepBaseAppComponent.java2
-rw-r--r--quickstep/src/com/android/quickstep/fallback/FallbackRecentsStateController.java5
-rw-r--r--quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java15
-rw-r--r--quickstep/src/com/android/quickstep/fallback/RecentsState.java34
-rw-r--r--quickstep/src/com/android/quickstep/fallback/RecentsStateUtils.kt33
-rw-r--r--quickstep/src/com/android/quickstep/fallback/window/RecentsWindowManager.kt36
-rw-r--r--quickstep/src/com/android/quickstep/fallback/window/RecentsWindowSwipeHandler.java3
-rw-r--r--quickstep/src/com/android/quickstep/inputconsumers/NavHandleLongPressHandler.java4
-rw-r--r--quickstep/src/com/android/quickstep/inputconsumers/NavHandleLongPressInputConsumer.java7
-rw-r--r--quickstep/src/com/android/quickstep/inputconsumers/OtherActivityInputConsumer.java3
-rw-r--r--quickstep/src/com/android/quickstep/recents/di/RecentsDependencies.kt4
-rw-r--r--quickstep/src/com/android/quickstep/recents/domain/usecase/GetThumbnailPositionUseCase.kt3
-rw-r--r--quickstep/src/com/android/quickstep/recents/ui/viewmodel/TaskTileUiState.kt1
-rw-r--r--quickstep/src/com/android/quickstep/recents/ui/viewmodel/TaskViewModel.kt15
-rw-r--r--quickstep/src/com/android/quickstep/recents/viewmodel/RecentsViewData.kt3
-rw-r--r--quickstep/src/com/android/quickstep/recents/viewmodel/RecentsViewModel.kt4
-rw-r--r--quickstep/src/com/android/quickstep/util/AppPairsController.java19
-rw-r--r--quickstep/src/com/android/quickstep/util/ContextualSearchInvoker.kt3
-rw-r--r--quickstep/src/com/android/quickstep/util/ContextualSearchStateManager.java4
-rw-r--r--quickstep/src/com/android/quickstep/util/DesksUtils.kt5
-rw-r--r--quickstep/src/com/android/quickstep/util/ExternalDisplays.kt16
-rw-r--r--quickstep/src/com/android/quickstep/util/SplitSelectStateController.java2
-rw-r--r--quickstep/src/com/android/quickstep/views/IconAppChipView.kt20
-rw-r--r--quickstep/src/com/android/quickstep/views/LauncherRecentsView.java15
-rw-r--r--quickstep/src/com/android/quickstep/views/RecentsDismissUtils.kt87
-rw-r--r--quickstep/src/com/android/quickstep/views/RecentsView.java82
-rw-r--r--quickstep/src/com/android/quickstep/views/RecentsViewUtils.kt66
-rw-r--r--quickstep/src/com/android/quickstep/views/TaskContainer.kt5
-rw-r--r--quickstep/src/com/android/quickstep/views/TaskMenuView.kt9
-rw-r--r--quickstep/src/com/android/quickstep/views/TaskView.kt93
-rw-r--r--quickstep/src_protolog/com/android/quickstep/util/ActiveGestureProtoLogProxy.java12
-rw-r--r--quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarHoverToolTipControllerTest.kt154
-rw-r--r--quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarRecentAppsControllerTest.kt2
-rw-r--r--quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewTestUtil.kt27
-rw-r--r--quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarUnitTestRule.kt3
-rw-r--r--quickstep/tests/multivalentTests/src/com/android/quickstep/AbsSwipeUpHandlerTestCase.java4
-rw-r--r--quickstep/tests/multivalentTests/src/com/android/quickstep/fallback/RecentsStateUtilsTest.kt66
-rw-r--r--quickstep/tests/multivalentTests/src/com/android/quickstep/inputconsumers/NavHandleLongPressInputConsumerTest.java6
-rw-r--r--quickstep/tests/multivalentTests/src/com/android/quickstep/recents/domain/usecase/GetThumbnailPositionUseCaseTest.kt34
-rw-r--r--quickstep/tests/multivalentTests/src/com/android/quickstep/recents/ui/viewmodel/TaskViewModelTest.kt35
-rw-r--r--quickstep/tests/multivalentTests/src/com/android/quickstep/util/AppPairsControllerTest.kt11
-rw-r--r--quickstep/tests/src/com/android/launcher3/taskbar/TaskbarHoverToolTipControllerTest.java265
-rw-r--r--quickstep/tests/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimatorTest.kt (renamed from quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimatorTest.kt)0
-rw-r--r--quickstep/tests/src/com/android/quickstep/InputConsumerUtilsTest.java2
-rw-r--r--res/drawable/ic_split_horizontal.xml30
-rw-r--r--res/drawable/ic_split_vertical.xml30
-rw-r--r--res/values-af/strings.xml9
-rw-r--r--res/values-am/strings.xml9
-rw-r--r--res/values-ar/strings.xml12
-rw-r--r--res/values-as/strings.xml9
-rw-r--r--res/values-az/strings.xml12
-rw-r--r--res/values-b+sr+Latn/strings.xml12
-rw-r--r--res/values-be/strings.xml12
-rw-r--r--res/values-bg/strings.xml12
-rw-r--r--res/values-bn/strings.xml9
-rw-r--r--res/values-bs/strings.xml9
-rw-r--r--res/values-ca/strings.xml9
-rw-r--r--res/values-cs/strings.xml9
-rw-r--r--res/values-da/strings.xml9
-rw-r--r--res/values-de/strings.xml9
-rw-r--r--res/values-el/strings.xml12
-rw-r--r--res/values-en-rAU/strings.xml9
-rw-r--r--res/values-en-rGB/strings.xml9
-rw-r--r--res/values-en-rIN/strings.xml9
-rw-r--r--res/values-es-rUS/strings.xml11
-rw-r--r--res/values-es/strings.xml9
-rw-r--r--res/values-et/strings.xml9
-rw-r--r--res/values-eu/strings.xml9
-rw-r--r--res/values-fa/strings.xml12
-rw-r--r--res/values-fi/strings.xml9
-rw-r--r--res/values-fr-rCA/strings.xml12
-rw-r--r--res/values-fr/strings.xml9
-rw-r--r--res/values-gl/strings.xml9
-rw-r--r--res/values-gu/strings.xml15
-rw-r--r--res/values-hi/strings.xml9
-rw-r--r--res/values-hr/strings.xml9
-rw-r--r--res/values-hu/strings.xml9
-rw-r--r--res/values-hy/strings.xml9
-rw-r--r--res/values-in/strings.xml9
-rw-r--r--res/values-is/strings.xml9
-rw-r--r--res/values-it/strings.xml12
-rw-r--r--res/values-ja/strings.xml12
-rw-r--r--res/values-ka/strings.xml12
-rw-r--r--res/values-km/strings.xml12
-rw-r--r--res/values-kn/strings.xml12
-rw-r--r--res/values-ko/strings.xml9
-rw-r--r--res/values-ky/strings.xml12
-rw-r--r--res/values-lo/strings.xml12
-rw-r--r--res/values-lt/strings.xml9
-rw-r--r--res/values-mk/strings.xml12
-rw-r--r--res/values-ml/strings.xml12
-rw-r--r--res/values-mn/strings.xml9
-rw-r--r--res/values-mr/strings.xml12
-rw-r--r--res/values-ms/strings.xml12
-rw-r--r--res/values-my/strings.xml9
-rw-r--r--res/values-nb/strings.xml9
-rw-r--r--res/values-ne/strings.xml15
-rw-r--r--res/values-nl/strings.xml9
-rw-r--r--res/values-or/strings.xml9
-rw-r--r--res/values-pa/strings.xml12
-rw-r--r--res/values-pl/strings.xml9
-rw-r--r--res/values-pt-rPT/strings.xml12
-rw-r--r--res/values-ro/strings.xml9
-rw-r--r--res/values-ru/strings.xml12
-rw-r--r--res/values-si/strings.xml12
-rw-r--r--res/values-sk/strings.xml9
-rw-r--r--res/values-sl/strings.xml12
-rw-r--r--res/values-sq/strings.xml9
-rw-r--r--res/values-sr/strings.xml12
-rw-r--r--res/values-sv/strings.xml9
-rw-r--r--res/values-sw/strings.xml9
-rw-r--r--res/values-sw600dp/styles.xml5
-rw-r--r--res/values-ta/strings.xml9
-rw-r--r--res/values-te/strings.xml12
-rw-r--r--res/values-th/strings.xml12
-rw-r--r--res/values-tl/strings.xml12
-rw-r--r--res/values-tr/strings.xml9
-rw-r--r--res/values-ur/strings.xml9
-rw-r--r--res/values-uz/strings.xml12
-rw-r--r--res/values-v31/styles.xml7
-rw-r--r--res/values-vi/strings.xml9
-rw-r--r--res/values-zh-rCN/strings.xml9
-rw-r--r--res/values-zh-rHK/strings.xml9
-rw-r--r--res/values-zh-rTW/strings.xml9
-rw-r--r--res/values-zu/strings.xml9
-rw-r--r--res/values/config.xml1
-rw-r--r--res/values/dimens.xml2
-rw-r--r--res/values/styles.xml4
-rw-r--r--src/com/android/launcher3/GridType.kt33
-rw-r--r--src/com/android/launcher3/InvariantDeviceProfile.java16
-rw-r--r--src/com/android/launcher3/Launcher.java12
-rw-r--r--src/com/android/launcher3/LauncherPrefs.kt4
-rw-r--r--src/com/android/launcher3/allapps/AlphabeticalAppsList.java1
-rw-r--r--src/com/android/launcher3/allapps/PrivateProfileManager.java13
-rw-r--r--src/com/android/launcher3/config/FeatureFlags.java5
-rw-r--r--src/com/android/launcher3/dagger/LauncherAppModule.java1
-rw-r--r--src/com/android/launcher3/dagger/LauncherBaseAppComponent.java2
-rw-r--r--src/com/android/launcher3/dragndrop/FolderAdaptiveIcon.java11
-rw-r--r--src/com/android/launcher3/folder/Folder.java26
-rw-r--r--src/com/android/launcher3/icons/IconCache.java8
-rw-r--r--src/com/android/launcher3/logging/StatsLogManager.java6
-rw-r--r--src/com/android/launcher3/model/DeviceGridState.java20
-rw-r--r--src/com/android/launcher3/model/GridSizeMigrationDBController.java17
-rw-r--r--src/com/android/launcher3/model/GridSizeMigrationLogic.kt12
-rw-r--r--src/com/android/launcher3/model/LoaderCursor.java1
-rw-r--r--src/com/android/launcher3/model/LoaderTask.java7
-rw-r--r--src/com/android/launcher3/model/WorkspaceItemProcessor.kt15
-rw-r--r--src/com/android/launcher3/pageindicators/PageIndicatorDots.java7
-rw-r--r--src/com/android/launcher3/popup/PopupContainerWithArrow.java7
-rw-r--r--src/com/android/launcher3/shortcuts/DeepShortcutTextView.java7
-rw-r--r--src/com/android/launcher3/widget/LauncherAppWidgetHost.java68
-rw-r--r--src/com/android/launcher3/widget/LauncherWidgetHolder.java161
-rw-r--r--src/com/android/launcher3/widget/ListenableAppWidgetHost.kt72
-rw-r--r--src/com/android/launcher3/widget/PendingAppWidgetHostView.java2
-rw-r--r--src_no_quickstep/com/android/launcher3/dagger/Modules.kt9
-rw-r--r--tests/multivalentTests/src/com/android/launcher3/AbstractDeviceProfileTest.kt10
-rw-r--r--tests/multivalentTests/src/com/android/launcher3/model/gridmigration/ValidGridMigrationUnitTest.kt10
-rw-r--r--tests/multivalentTests/src/com/android/launcher3/util/DaggerGraphs.kt17
-rw-r--r--tests/multivalentTests/src/com/android/launcher3/widget/LauncherAppWidgetHostTest.kt21
-rw-r--r--tests/multivalentTests/src/com/android/launcher3/widget/LauncherWidgetHolderTest.kt22
-rw-r--r--tests/src/com/android/launcher3/model/GridMigrationTest.kt40
-rw-r--r--tests/src/com/android/launcher3/model/LoaderTaskTest.kt73
304 files changed, 3052 insertions, 2303 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 517bd6d70e..1bce9b3757 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -59,6 +59,7 @@
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.SHOW_WORK_APPS" />
+ <action android:name="android.intent.action.ALL_APPS" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.MONKEY"/>
diff --git a/aconfig/launcher.aconfig b/aconfig/launcher.aconfig
index d3c5c019fd..b083390b06 100644
--- a/aconfig/launcher.aconfig
+++ b/aconfig/launcher.aconfig
@@ -694,3 +694,13 @@ flag {
purpose: PURPOSE_BUGFIX
}
}
+
+flag {
+ name: "enable_taskbar_for_direct_boot"
+ namespace: "launcher"
+ description: "Initializes parts of Taskbar before onUserUnlocked"
+ bug: "324485921"
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
+}
diff --git a/go/AndroidManifest-launcher.xml b/go/AndroidManifest-launcher.xml
index 2223036a7a..bef7180cb5 100644
--- a/go/AndroidManifest-launcher.xml
+++ b/go/AndroidManifest-launcher.xml
@@ -57,6 +57,7 @@
android:enabled="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
+ <action android:name="android.intent.action.ALL_APPS" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.MONKEY"/>
diff --git a/proguard.flags b/proguard.flags
index da00c00b9b..c0a0042e81 100644
--- a/proguard.flags
+++ b/proguard.flags
@@ -1,6 +1,12 @@
--keep,allowshrinking,allowoptimization class com.android.launcher3.** {
- *;
-}
+
+-keep,allowshrinking,allowoptimization class com.android.launcher3.** {*;}
+-keepclasseswithmembernames class com.android.launcher3.** {*;}
+
+-keep,allowshrinking,allowoptimization class com.android.systemui.shared.** {*;}
+-keepclasseswithmembernames class com.android.systemui.shared.** {*;}
+
+-keep,allowshrinking,allowoptimization class com.android.quickstep.** {*;}
+-keepclasseswithmembernames class com.android.quickstep.** {*;}
# The support library contains references to newer platform versions.
# Don't warn about those in case this app is linking against an older
@@ -49,14 +55,6 @@
# Ignore warnings for hidden utility classes referenced from the shared lib
-dontwarn com.android.internal.util.**
-################ Do not optimize recents lib #############
--keep class com.android.systemui.shared.** {
- *;
-}
-
--keep class com.android.quickstep.** {
- *;
-}
-keep class com.android.internal.protolog.** {
*;
diff --git a/quickstep/AndroidManifest-launcher.xml b/quickstep/AndroidManifest-launcher.xml
index 80d8154ba1..d6aa886d8c 100644
--- a/quickstep/AndroidManifest-launcher.xml
+++ b/quickstep/AndroidManifest-launcher.xml
@@ -57,6 +57,7 @@
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.intent.action.SHOW_WORK_APPS" />
+ <action android:name="android.intent.action.ALL_APPS" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.MONKEY"/>
diff --git a/quickstep/res/drawable/ic_save_app_pair_left_right.xml b/quickstep/res/drawable/ic_save_app_pair_left_right.xml
index b104f44b76..509bc98f65 100644
--- a/quickstep/res/drawable/ic_save_app_pair_left_right.xml
+++ b/quickstep/res/drawable/ic_save_app_pair_left_right.xml
@@ -1,28 +1,25 @@
-<?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.
--->
-
+ ~ Copyright (C) 2025 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24"
- android:viewportHeight="24">
- <path
- android:pathData="M8.5,4.5H3.5C2.4,4.5 1.5,5.4 1.5,6.5V18.5C1.5,19.6 2.4,20.5 3.5,20.5H8.5C9.6,20.5 10.5,19.6 10.5,18.5V6.5C10.5,5.4 9.6,4.5 8.5,4.5ZM8.5,18.5H3.5V6.5H8.5V18.5ZM14.5,6.5H19.5V13.5H21.5V6.5C21.5,5.4 20.6,4.5 19.5,4.5H14.5C13.4,4.5 12.5,5.4 12.5,6.5V18.5C12.5,19.6 13.4,20.5 14.5,20.5H15.5V18.5H14.5V6.5ZM20.5,14.5V16.5H22.5V18.5H20.5V20.5H18.5V18.5H16.5V16.5H18.5V14.5H20.5Z"
- android:fillColor="#48473A"
- android:fillType="evenOdd"/>
+ android:width="20dp"
+ android:height="20dp"
+ android:tint="?attr/colorControlNormal"
+ android:viewportHeight="960"
+ android:viewportWidth="960">
+ <path
+ android:fillColor="@android:color/white"
+ android:pathData="M744,816L720,816Q704.7,816 694.35,805.71Q684,795.42 684,780.21Q684,765 694.35,754.5Q704.7,744 720,744L744,744L744,720Q744,704.7 754.29,694.35Q764.58,684 779.79,684Q795,684 805.5,694.35Q816,704.7 816,720L816,744L840,744Q855.3,744 865.65,754.29Q876,764.58 876,779.79Q876,795 865.65,805.5Q855.3,816 840,816L816,816L816,840Q816,855.3 805.71,865.65Q795.42,876 780.21,876Q765,876 754.5,865.65Q744,855.3 744,840L744,816ZM215.74,816Q186,816 165,794.85Q144,773.7 144,744L144,216Q144,186.3 165.18,165.15Q186.35,144 216.09,144L360.26,144Q390,144 411,165.15Q432,186.3 432,216L432,744Q432,773.7 410.82,794.85Q389.65,816 359.91,816L215.74,816ZM616,816Q581,816 554.5,796Q528,776 528,743.95L528,216Q528,186.3 549.18,165.15Q570.35,144 600.09,144L744.26,144Q774,144 795,165.15Q816,186.3 816,216L816,616Q807,614 798,613Q789,612 780,612Q709.79,612 660.9,661Q612,710 612,780Q612,789 613,798Q614,807 616,816Z" />
</vector>
diff --git a/quickstep/res/drawable/ic_save_app_pair_up_down.xml b/quickstep/res/drawable/ic_save_app_pair_up_down.xml
index 86f110ce5e..282751c84c 100644
--- a/quickstep/res/drawable/ic_save_app_pair_up_down.xml
+++ b/quickstep/res/drawable/ic_save_app_pair_up_down.xml
@@ -1,28 +1,25 @@
-<?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.
--->
-
+ ~ Copyright (C) 2025 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24"
- android:viewportHeight="24">
- <path
- android:pathData="M18,2L6,2C4.9,2 4,2.9 4,4L4,9C4,10.1 4.9,11 6,11L18,11C19.1,11 20,10.1 20,9L20,4C20,2.9 19.1,2 18,2ZM18,9L6,9L6,4L18,4L18,9ZM18,13L6,13C4.9,13 4,13.9 4,15L4,20C4,21.1 4.9,22 6,22L13,22L13,20L6,20L6,15L18,15L18,16L20,16L20,15C20,13.9 19.1,13 18,13ZM16,17L18,17L18,19L20,19L20,21L18,21L18,23L16,23L16,21L14,21L14,19L16,19L16,17Z"
- android:fillColor="#48473A"
- android:fillType="evenOdd"/>
-</vector>
+ android:width="20dp"
+ android:height="20dp"
+ android:tint="?attr/colorControlNormal"
+ android:viewportHeight="960"
+ android:viewportWidth="960">
+ <path
+ android:fillColor="@android:color/white"
+ android:pathData="M744,816L720,816Q704.7,816 694.35,805.71Q684,795.42 684,780.21Q684,765 694.35,754.5Q704.7,744 720,744L744,744L744,720Q744,704.7 754.29,694.35Q764.58,684 779.79,684Q795,684 805.5,694.35Q816,704.7 816,720L816,744L840,744Q855.3,744 865.65,754.29Q876,764.58 876,779.79Q876,795 865.65,805.5Q855.3,816 840,816L816,816L816,840Q816,855.3 805.71,865.65Q795.42,876 780.21,876Q765,876 754.5,865.65Q744,855.3 744,840L744,816ZM216,432Q183,432 163.5,412.5Q144,393 144,360L144,216Q144,183 163.5,163.5Q183,144 216,144L744,144Q777,144 796.5,163.5Q816,183 816,216L816,360Q816,393 796.5,412.5Q777,432 744,432L216,432ZM215.62,816Q183,816 163.5,796.5Q144,777 144,744L144,600Q144,567 163.5,547.5Q183,528 216,528L744,528Q777,528 796.5,547.5Q816,567 816,600L816,616Q808,614 798.06,613Q788.13,612 780,612Q709.44,612 660.72,661.5Q612,711 612,780Q612,789.94 612.5,798.97Q613,808 615,816L215.62,816Z" />
+</vector> \ No newline at end of file
diff --git a/quickstep/res/values-af/strings.xml b/quickstep/res/values-af/strings.xml
index c2f572b1b4..025a7d07c4 100644
--- a/quickstep/res/values-af/strings.xml
+++ b/quickstep/res/values-af/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Skuif na links bo"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Skuif na regs onder"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Maak app as ’n borrel oop"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Onlangse apps"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Onlangse applys"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{meer app}other{meer apps}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Werkskerm"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> en <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, item <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> van <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-am/strings.xml b/quickstep/res/values-am/strings.xml
index e335423776..fc4c4c46d3 100644
--- a/quickstep/res/values-am/strings.xml
+++ b/quickstep/res/values-am/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"ወደ ላይ/ግራ ይውሰዱ"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"ወደ ታች/ቀኝ ይውሰዱ"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"መተግበሪያን እንደ ዓረፋ ይክፈቱ"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"የቅርብ ጊዜ መተግበሪያዎች"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"የቅርብ ጊዜ መተግበሪያ ዝርዝር"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{ተጨማሪ መተግበሪያ}one{ተጨማሪ መተግበሪያ}other{ተጨማሪ መተግበሪያዎች}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"ዴስክቶፕ"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> እና <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>፣ ንጥል <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> ከ<xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-ar/strings.xml b/quickstep/res/values-ar/strings.xml
index 8fbc23b95f..17bcbee55b 100644
--- a/quickstep/res/values-ar/strings.xml
+++ b/quickstep/res/values-ar/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"الانتقال إلى يمين الشاشة أو أعلاها"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"الانتقال إلى يسار الشاشة أو أسفلها"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"فتح التطبيق كفقاعة"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"التطبيقات المستخدَمة مؤخرًا"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"قائمة التطبيقات المستخدَمة مؤخرًا"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{تطبيق واحد آخر}zero{تطبيق آخر}two{تطبيقان آخران}few{تطبيقات أخرى}many{تطبيقًا آخر}other{تطبيق آخر}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"وضع الكمبيوتر المكتبي"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"\"<xliff:g id="APP_NAME_1">%1$s</xliff:g>\" و\"<xliff:g id="APP_NAME_2">%2$s</xliff:g>\""</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"‫<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>، العنصر رقم <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> من إجمالي <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-as/strings.xml b/quickstep/res/values-as/strings.xml
index 8c1ccda9cf..0f8126beb4 100644
--- a/quickstep/res/values-as/strings.xml
+++ b/quickstep/res/values-as/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"ওপৰৰ বাঁওফাললৈ নিয়ক"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"তলৰ সোঁফাললৈ নিয়ক"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"বাবল হিচাপে এপ্‌টো খোলক"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"শেহতীয়া এপ্‌সমূহ"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"শেহতীয়া এপৰ সূচী"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{অধিক এপ্‌}one{অধিক এপ্‌}other{অধিক এপ্‌}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"ডেস্কটপ"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> আৰু <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>টাৰ ভিতৰত <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>তম বস্তু"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-az/strings.xml b/quickstep/res/values-az/strings.xml
index 53de211216..f88a48c54e 100644
--- a/quickstep/res/values-az/strings.xml
+++ b/quickstep/res/values-az/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Yuxarı/sola köçürün"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Aşağı/sağa köçürün"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Tətbiqi yumrucuq kimi açın"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Son tətbiqlər"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Son tətbiq siyahısı"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{əlavə tətbiq}other{əlavə tətbiq}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Masaüstü"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> və <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, element <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>/<xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-b+sr+Latn/strings.xml b/quickstep/res/values-b+sr+Latn/strings.xml
index 1db58bed6a..8b60c14da3 100644
--- a/quickstep/res/values-b+sr+Latn/strings.xml
+++ b/quickstep/res/values-b+sr+Latn/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Premesti gore levo"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Premesti dole desno"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Otvori aplikaciju kao oblačić"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Nedavne aplikacije"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Lista nedavnih aplikacija"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{dodatna aplikacija}one{dodatna aplikacija}few{dodatne aplikacije}other{dodatnih aplikacija}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Računar"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> i <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, stavka <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> od <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-be/strings.xml b/quickstep/res/values-be/strings.xml
index 20c914d9d3..f0d4ee4a0d 100644
--- a/quickstep/res/values-be/strings.xml
+++ b/quickstep/res/values-be/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Перамясціць уверх/улева"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Перамясціць уніз/управа"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Адкрыць праграму ва ўсплывальным акне"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Нядаўнія праграмы"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Спіс нядаўніх праграм"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{даступная праграма}one{даступная праграма}few{даступныя праграмы}many{даступных праграм}other{даступнай праграмы}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Працоўны стол"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> і <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, элемент <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> з <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-bg/strings.xml b/quickstep/res/values-bg/strings.xml
index 414219ad52..10401866a1 100644
--- a/quickstep/res/values-bg/strings.xml
+++ b/quickstep/res/values-bg/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Преместване горе/вляво"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Преместване долу/вдясно"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Отваряне на приложението като балонче"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Скорошни приложения"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Списък със скорошни приложения"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{допълнително приложение}other{допълнителни приложения}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Режим за настолни компютри"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> и <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, елемент <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> от <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-bn/strings.xml b/quickstep/res/values-bn/strings.xml
index 001c008be6..2c700670d5 100644
--- a/quickstep/res/values-bn/strings.xml
+++ b/quickstep/res/values-bn/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"উপরে/বাঁদিকে সরান"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"নিচে/ডানদিকে সরান"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"বাবল হিসেবে অ্যাপ খুলুন"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"সম্প্রতি ব্যবহৃত অ্যাপ"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"সাম্প্রতিক অ্যাপের তালিকা"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{আরও অ্যাপ}one{আরও অ্যাপ}other{আরও অ্যাপ}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"ডেস্কটপ"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> ও <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>টি টাস্কের মধ্যে <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> নম্বর আইটেম"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-bs/strings.xml b/quickstep/res/values-bs/strings.xml
index 1eb88aa1d5..45bde4ca18 100644
--- a/quickstep/res/values-bs/strings.xml
+++ b/quickstep/res/values-bs/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Premjesti gore lijevo"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Premjesti dolje desno"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Otvori aplikaciju kao oblačić"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Nedavne aplikacije"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Liste nedavnih aplikacija"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{dodatna aplikacija}one{dodatna aplikacija}few{dodatne aplikacije}other{dodatnih aplikacija}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Računar"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> i <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>. stavka od <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-ca/strings.xml b/quickstep/res/values-ca/strings.xml
index 6397b1438f..07a7349406 100644
--- a/quickstep/res/values-ca/strings.xml
+++ b/quickstep/res/values-ca/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Mou a la part superior o a l\'esquerra"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Mou a la part inferior o a la dreta"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Obre l\'aplicació com a bombolla"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Aplicacions recents"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Llista d\'aplicacions recents"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{aplicació més}other{aplicacions més}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Escriptori"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> i <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, element <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> de <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-cs/strings.xml b/quickstep/res/values-cs/strings.xml
index 3b000efc79..98ed9346df 100644
--- a/quickstep/res/values-cs/strings.xml
+++ b/quickstep/res/values-cs/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Přesunout doleva nahoru"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Přesunout doprava dolů"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Otevřít aplikaci jako bublinu"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Poslední aplikace"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Seznam posledních aplikací"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{další aplikace}few{další aplikace}many{další aplikace}other{dalších aplikací}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Počítač"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> a <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, položka <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> z <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-da/strings.xml b/quickstep/res/values-da/strings.xml
index cf45967422..d4ec1e681c 100644
--- a/quickstep/res/values-da/strings.xml
+++ b/quickstep/res/values-da/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Flyt til toppen eller venstre side"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Flyt til bunden eller højre side"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Åbn appen som en boble"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Seneste apps"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Liste over seneste apps"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{yderligere app}one{yderligere app}other{yderligere apps}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Computertilstand"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> og <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, element <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> af <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-de/strings.xml b/quickstep/res/values-de/strings.xml
index f15838e094..e3ab11cd95 100644
--- a/quickstep/res/values-de/strings.xml
+++ b/quickstep/res/values-de/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Nach oben / Nach links verschieben"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Nach unten / Nach rechts verschieben"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"App als Bubble öffnen"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Zuletzt aktive Apps"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Liste der zuletzt aktiven Apps"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{weitere App}other{weitere Apps}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Desktopmodus"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> und <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, Element <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> von <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-el/strings.xml b/quickstep/res/values-el/strings.xml
index a94a2f226d..eae51d1535 100644
--- a/quickstep/res/values-el/strings.xml
+++ b/quickstep/res/values-el/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Μετακίνηση επάνω/αριστερά"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Μετακίνηση κάτω/δεξιά"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Άνοιγμα εφαρμογής σε συννεφάκι"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Πρόσφατες εφαρμογές"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Λίστα πρόσφατων εφαρμογών"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{ακόμη εφαρμογή}other{ακόμη εφαρμογές}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Υπολογιστής"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> και <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, στοιχείο <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> από <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-en-rAU/strings.xml b/quickstep/res/values-en-rAU/strings.xml
index 9082df4293..6397fa5e8c 100644
--- a/quickstep/res/values-en-rAU/strings.xml
+++ b/quickstep/res/values-en-rAU/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Move to top/left"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Move to bottom/right"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Open app as a bubble"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Recent apps"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Recent app list"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{more app}other{more apps}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Desktop"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> and <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, item <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> of <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-en-rCA/strings.xml b/quickstep/res/values-en-rCA/strings.xml
index 0d9e57254d..fcd7c66490 100644
--- a/quickstep/res/values-en-rCA/strings.xml
+++ b/quickstep/res/values-en-rCA/strings.xml
@@ -146,10 +146,8 @@
<string name="quick_switch_desktop" msgid="8393802056024499749">"Desktop"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> and <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
<string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, item <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> of <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
- <!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
- <skip />
- <!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
- <skip />
+ <string name="quick_switch_scroll_arrow_left" msgid="6527033155534184309">"Scroll left"</string>
+ <string name="quick_switch_scroll_arrow_right" msgid="7319779291086916348">"Scroll right"</string>
<string name="bubble_bar_bubble_fallback_description" msgid="7811684548953452009">"Bubble"</string>
<string name="bubble_bar_overflow_description" msgid="8617628132733151708">"Overflow"</string>
<string name="bubble_bar_bubble_description" msgid="1882466152448446446">"<xliff:g id="NOTIFICATION_TITLE">%1$s</xliff:g> from <xliff:g id="APP_NAME">%2$s</xliff:g>"</string>
diff --git a/quickstep/res/values-en-rGB/strings.xml b/quickstep/res/values-en-rGB/strings.xml
index 9082df4293..6397fa5e8c 100644
--- a/quickstep/res/values-en-rGB/strings.xml
+++ b/quickstep/res/values-en-rGB/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Move to top/left"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Move to bottom/right"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Open app as a bubble"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Recent apps"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Recent app list"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{more app}other{more apps}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Desktop"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> and <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, item <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> of <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-en-rIN/strings.xml b/quickstep/res/values-en-rIN/strings.xml
index 9082df4293..6397fa5e8c 100644
--- a/quickstep/res/values-en-rIN/strings.xml
+++ b/quickstep/res/values-en-rIN/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Move to top/left"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Move to bottom/right"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Open app as a bubble"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Recent apps"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Recent app list"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{more app}other{more apps}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Desktop"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> and <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, item <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> of <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-es-rUS/strings.xml b/quickstep/res/values-es-rUS/strings.xml
index 78bb88a0bc..703c434b77 100644
--- a/quickstep/res/values-es-rUS/strings.xml
+++ b/quickstep/res/values-es-rUS/strings.xml
@@ -96,7 +96,7 @@
<string name="action_share" msgid="2648470652637092375">"Compartir"</string>
<string name="action_screenshot" msgid="8171125848358142917">"Captura de pantalla"</string>
<string name="action_split" msgid="2098009717623550676">"Pantalla dividida"</string>
- <string name="action_save_app_pair" msgid="5974823919237645229">"Guardar vinculación"</string>
+ <string name="action_save_app_pair" msgid="5974823919237645229">"Guardar grupo de apps"</string>
<string name="toast_split_select_app" msgid="8464310533320556058">"Presiona otra app para usar la pantalla dividida"</string>
<string name="toast_contextual_split_select_app" msgid="433510957123687090">"Elige otra app para usar la pantalla dividida"</string>
<string name="toast_split_select_app_cancel" msgid="1939025102486630426">"Cancelar"</string>
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Mover a la parte superior o izquierda"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Mover a la parte inferior o derecha"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Abrir app como burbuja"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Apps recientes"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Lista de apps recientes"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{app más}other{apps más}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Escritorio"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> y <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, elemento <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> de <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-es/strings.xml b/quickstep/res/values-es/strings.xml
index 542e8aacf3..56489dac40 100644
--- a/quickstep/res/values-es/strings.xml
+++ b/quickstep/res/values-es/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Mover arriba/a la izquierda"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Mover abajo/a la derecha"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Abrir aplicación como burbuja"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Aplicaciones recientes"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Lista de aplicaciones recientes"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{app más}other{apps más}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Ordenador"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> y <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, elemento <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> de <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-et/strings.xml b/quickstep/res/values-et/strings.xml
index 66d0b9f7f9..c37268221d 100644
--- a/quickstep/res/values-et/strings.xml
+++ b/quickstep/res/values-et/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Teisalda üles/vasakule"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Teisalda alla/paremale"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Rakenduse avamine mullina"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Hiljutised rakendused"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Hiljutiste rakenduste loend"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{rakendus veel}other{rakendust veel}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Lauaarvuti"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> ja <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, üksus <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>/<xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-eu/strings.xml b/quickstep/res/values-eu/strings.xml
index 618992c608..77b6b6decd 100644
--- a/quickstep/res/values-eu/strings.xml
+++ b/quickstep/res/values-eu/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Eraman gora, ezkerretara"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Eraman behera, eskuinetara"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Ireki aplikazioa burbuila gisa"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Azkenaldiko aplikazioak"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Azkenaldiko aplikazioen zerrenda"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{aplikazio gehiago}other{aplikazio gehiago}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Ordenagailua"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> eta <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="TOTAL_TASKS">%3$d</xliff:g> elementutatik <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>garrena"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-fa/strings.xml b/quickstep/res/values-fa/strings.xml
index 9745b58542..7b9b719c10 100644
--- a/quickstep/res/values-fa/strings.xml
+++ b/quickstep/res/values-fa/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"انتقال به بالا/ چپ"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"انتقال به پایین/ راست"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"باز کردن برنامه به‌صورت حبابک"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"برنامه‌های اخیر"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"فهرست برنامه‌های اخیر"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{برنامه دیگر}one{برنامه دیگر}other{برنامه دیگر}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"رایانه"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> و <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"‫<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>، مورد <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> از <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-fi/strings.xml b/quickstep/res/values-fi/strings.xml
index af132e7f61..03736047d0 100644
--- a/quickstep/res/values-fi/strings.xml
+++ b/quickstep/res/values-fi/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Siirrä ylös tai vasemmalle"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Siirrä alas tai oikealle"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Avaa sovellus kuplana"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Viimeaikaiset sovellukset"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Viimeaikaisten sovellusten lista"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{muu sovellus}other{muuta sovellusta}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Tietokone"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> ja <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, kohde <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>/<xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-fr-rCA/strings.xml b/quickstep/res/values-fr-rCA/strings.xml
index 6c4fcc4d72..fcf03bedf3 100644
--- a/quickstep/res/values-fr-rCA/strings.xml
+++ b/quickstep/res/values-fr-rCA/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Déplacer vers le coin supérieur gauche de l\'écran"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Déplacer vers le coin inférieur droit de l\'écran"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Ouvrir l\'appli sous forme de bulle"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Applis récentes"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Liste des applis récentes"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{autre appli}one{autre appli}other{autres applis}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Bureau"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> et <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, élément <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> de <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-fr/strings.xml b/quickstep/res/values-fr/strings.xml
index 09079d83d8..9a14df83c9 100644
--- a/quickstep/res/values-fr/strings.xml
+++ b/quickstep/res/values-fr/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Déplacer en haut ou à gauche"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Déplacer en bas ou à droite"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Ouvrir l\'appli sous forme de bulle"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Applis récentes"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Liste des applis récentes"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{autre application}one{autre application}other{autres applications}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Mode ordinateur"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> et <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"Élément <xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g> sur <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> : <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-gl/strings.xml b/quickstep/res/values-gl/strings.xml
index 3840b5edc6..9a3cfa01c5 100644
--- a/quickstep/res/values-gl/strings.xml
+++ b/quickstep/res/values-gl/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Mover á parte superior ou á esquerda"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Mover á parte inferior ou á dereita"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Abrir aplicación como unha burbulla"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Aplicacións recentes"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Lista de aplicacións recentes"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{aplicación máis}other{aplicacións máis}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Escritorio"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> e <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, artigo <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> de <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-gu/strings.xml b/quickstep/res/values-gu/strings.xml
index c39fe204f4..736ce925da 100644
--- a/quickstep/res/values-gu/strings.xml
+++ b/quickstep/res/values-gu/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"સૌથી ઉપર ડાબી બાજુએ ખસેડો"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"સૌથી નીચે જમણી બાજુએ ખસેડો"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"બબલ તરીકે ઍપ ખોલો"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"તાજેતરની ઍપ"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"તાજેતરની ઍપની સૂચિ"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{વધુ ઍપ}one{વધુ ઍપ}other{વધુ ઍપ}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"ડેસ્કટૉપ"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> અને <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>માંથી આઇટમ <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-hi/strings.xml b/quickstep/res/values-hi/strings.xml
index af248117cb..8c8d7ae029 100644
--- a/quickstep/res/values-hi/strings.xml
+++ b/quickstep/res/values-hi/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"ऊपर/बाईं तरफ़ ले जाएं"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"नीचे/दाईं तरफ़ ले जाएं"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"ऐप्लिकेशन को बबल के तौर पर खोलें"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"हाल ही में इस्तेमाल किए गए ऐप्लिकेशन"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"हाल ही में इस्तेमाल किए गए ऐप्लिकेशन की सूची"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{ज़्यादा ऐप्लिकेशन}one{ज़्यादा ऐप्लिकेशन}other{ज़्यादा ऐप्लिकेशन}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"डेस्कटॉप"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> और <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="TOTAL_TASKS">%3$d</xliff:g> में से <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> आइटम"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-hr/strings.xml b/quickstep/res/values-hr/strings.xml
index fca73aaa0f..2fb667909c 100644
--- a/quickstep/res/values-hr/strings.xml
+++ b/quickstep/res/values-hr/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Premjesti gore/lijevo"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Premjesti dolje/desno"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Otvori aplikaciju kao oblačić"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Nedavne aplikacije"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Popis nedavnih aplikacija"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{dodatna aplikacija}one{dodatna aplikacija}few{dodatne aplikacije}other{dodatnih aplikacija}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Računalo"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> i <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, stavka <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> od <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-hy/strings.xml b/quickstep/res/values-hy/strings.xml
index 184e281587..e418e8ee5b 100644
--- a/quickstep/res/values-hy/strings.xml
+++ b/quickstep/res/values-hy/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Տեղափոխել վերևի ձախ անկյուն"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Տեղափոխել ներքևի աջ անկյուն"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Բացել հավելվածը պղպջակի ձևով"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Վերջերս բացված հավելվածներ"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Վերջերս բացված հավելվածների ցանկ"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{լրացուցիչ հավելված}one{լրացուցիչ հավելված}other{լրացուցիչ հավելված}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Համակարգիչ"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> և <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, տարր <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>՝ <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>-ից"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-in/strings.xml b/quickstep/res/values-in/strings.xml
index 19ce0ad8bf..0fda663a0e 100644
--- a/quickstep/res/values-in/strings.xml
+++ b/quickstep/res/values-in/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Pindahkan ke atas/kiri"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Pindahkan ke bawah/kanan"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Buka aplikasi sebagai balon"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Aplikasi yang baru dibuka"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Daftar aplikasi yang baru dibuka"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{aplikasi lainnya}other{aplikasi lainnya}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Desktop"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> dan <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, item <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> dari <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-is/strings.xml b/quickstep/res/values-is/strings.xml
index 77e2fd0fb8..abfc7cf22a 100644
--- a/quickstep/res/values-is/strings.xml
+++ b/quickstep/res/values-is/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Færa efst/til vinstri"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Færa neðst/til hægri"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Opna forrit sem blöðru"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Nýleg forrit"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Listi yfir nýleg forrit"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{forrit til viðbótar}one{forrit til viðbótar}other{forrit til viðbótar}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Skjáborð"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> og <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, atriði <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> af <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-it/strings.xml b/quickstep/res/values-it/strings.xml
index 2069ecef15..00529b744a 100644
--- a/quickstep/res/values-it/strings.xml
+++ b/quickstep/res/values-it/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Sposta in alto/a sinistra"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Sposta in basso/a destra"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Apri l\'app come fumetto"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"App recenti"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Elenco app recenti"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{altra app}other{altre app}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Desktop"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> e <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, elemento <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> di <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-iw/strings.xml b/quickstep/res/values-iw/strings.xml
index 2b2302b7f3..32783628fd 100644
--- a/quickstep/res/values-iw/strings.xml
+++ b/quickstep/res/values-iw/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"העברה לפינה השמאלית/העליונה"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"העברה לפינה הימנית/התחתונה"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"פתיחת האפליקציה בבועה"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"אפליקציות אחרונות"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"רשימת האפליקציות האחרונות"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{אפליקציה נוספת}one{אפליקציות נוספות}two{אפליקציות נוספות}other{אפליקציות נוספות}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"מחשב"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> ו-<xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"‫<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, פריט <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> מתוך <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-ka/strings.xml b/quickstep/res/values-ka/strings.xml
index c590ade480..ac46836c49 100644
--- a/quickstep/res/values-ka/strings.xml
+++ b/quickstep/res/values-ka/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"ზემოთ/მარცხნივ გადატანა"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"ქვემოთ/მარჯვნივ გადატანა"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"აპის გახსნა ბუშტის სახით"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"ბოლოდროინდელი აპები"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"ბოლოდროინდელი აპების სია"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{სხვა აპი}other{სხვა აპი}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"დესკტოპი"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> და <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>-ე ერთეული <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>-დან"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-kk/strings.xml b/quickstep/res/values-kk/strings.xml
index b9785a4eaf..c2861d6c00 100644
--- a/quickstep/res/values-kk/strings.xml
+++ b/quickstep/res/values-kk/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Жоғары/солға жылжыту"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Төмен/оңға жылжыту"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Қолданбаны қалқыма терезе түрінде ашу"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Соңғы қолданбалар"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Соңғы қолданбалар тізімі"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{қосымша қолданба}other{қосымша қолданба}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Компьютер"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> және <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>/<xliff:g id="TOTAL_TASKS">%3$d</xliff:g> элемент"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-km/strings.xml b/quickstep/res/values-km/strings.xml
index a139ca39de..799bcda688 100644
--- a/quickstep/res/values-km/strings.xml
+++ b/quickstep/res/values-km/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"ផ្លាស់ទីទៅខាងលើ/ឆ្វេង"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"ផ្លាស់ទីទៅខាងក្រោម/ស្ដាំ"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"បើកកម្មវិធីជាផ្ទាំងសារ"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"កម្មវិធី​ថ្មីៗ"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"បញ្ជីកម្មវិធីថ្មីៗ"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{កម្មវិធីច្រើនទៀត}other{កម្មវិធីច្រើនទៀត}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"អេក្រង់ដើម"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> និង <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g> ធាតុទី <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> នៃ <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-kn/strings.xml b/quickstep/res/values-kn/strings.xml
index a1907d50a9..c88aed2e19 100644
--- a/quickstep/res/values-kn/strings.xml
+++ b/quickstep/res/values-kn/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"ಮೇಲಿನ/ಎಡಭಾಗಕ್ಕೆ ಸರಿಸಿ"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"ಕೆಳಗಿನ/ಬಲಭಾಗಕ್ಕೆ ಸರಿಸಿ"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"ಆ್ಯಪ್ ಅನ್ನು ಬಬಲ್ ಆಗಿ ತೆರೆಯಿರಿ"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"ಇತ್ತೀಚಿನ ಆ್ಯಪ್‌ಗಳು"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"ಇತ್ತೀಚಿನ ಆ್ಯಪ್ ಪಟ್ಟಿ"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{ಹೆಚ್ಚಿನ ಆ್ಯಪ್‌}one{ಹೆಚ್ಚಿನ ಆ್ಯಪ್‌ಗಳು}other{ಹೆಚ್ಚಿನ ಆ್ಯಪ್‌ಗಳು}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"ಡೆಸ್ಕ್‌ಟಾಪ್"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> ಮತ್ತು <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="TOTAL_TASKS">%3$d</xliff:g> ರಲ್ಲಿ <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> ಐಟಂ"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-ko/strings.xml b/quickstep/res/values-ko/strings.xml
index 1e7e850291..5df9fdd548 100644
--- a/quickstep/res/values-ko/strings.xml
+++ b/quickstep/res/values-ko/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"상단/왼쪽으로 이동"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"하단/오른쪽으로 이동"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"앱을 대화창으로 열기"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"최근 앱"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"최근 앱 목록"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{추가 앱}other{추가 앱}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"데스크톱"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> 및 <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>개 중 <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>번째 항목"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-ky/strings.xml b/quickstep/res/values-ky/strings.xml
index 3190dee37c..049da10fae 100644
--- a/quickstep/res/values-ky/strings.xml
+++ b/quickstep/res/values-ky/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Жогорку/сол бурчка жылдыруу"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Төмөнкү/оң бурчка жылдыруу"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Колдонмону көбүкчө катары ачуу"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Акыркы колдонмолор"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Акыркы колдонмолордун тизмеси"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{колдонмо бар}other{колдонмо бар}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Компьютер"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> жана <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="TOTAL_TASKS">%3$d</xliff:g> ичинен <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> нерсе"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-lo/strings.xml b/quickstep/res/values-lo/strings.xml
index 42b487eaad..9eb169adf7 100644
--- a/quickstep/res/values-lo/strings.xml
+++ b/quickstep/res/values-lo/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"ຍ້າຍໄປຊ້າຍ/ເທິງ"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"ຍ້າຍໄປຂວາ/ລຸ່ມ"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"ເປີດແອັບເປັນຟອງ"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"ແອັບຫຼ້າສຸດ"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"ລາຍຊື່ແອັບຫຼ້າສຸດ"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{ແອັບເພີ່ມເຕີມ}other{ແອັບເພີ່ມເຕີມ}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"ເດັສທັອບ"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> ແລະ <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, ລາຍການທີ <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> ຈາກທັງໝົດ <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-lt/strings.xml b/quickstep/res/values-lt/strings.xml
index 20fcc803cf..2cbdc8e4f4 100644
--- a/quickstep/res/values-lt/strings.xml
+++ b/quickstep/res/values-lt/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Perkelti aukštyn, kairėn"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Perkelti žemyn, dešinėn"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Atidaryti programą kaip burbulą"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Naujausios programos"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Naujausių programų sąrašas"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{papildoma programa}one{papildoma programa}few{papildomos programos}many{papildomos programos}other{papildomų programų}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Stalinis kompiuteris"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"„<xliff:g id="APP_NAME_1">%1$s</xliff:g>“ ir „<xliff:g id="APP_NAME_2">%2$s</xliff:g>“"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> element. iš <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-lv/strings.xml b/quickstep/res/values-lv/strings.xml
index 7b256a7f4e..f8cda4a2f2 100644
--- a/quickstep/res/values-lv/strings.xml
+++ b/quickstep/res/values-lv/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Pārvietot uz augšējo/kreiso stūri"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Pārvietot uz apakšējo/labo stūri"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Atvērt lietotni kā burbuli"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Pēdējās izmantotās lietotnes"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Pēdējo izmantoto lietotņu saraksts"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{papildu lietotne}zero{papildu lietotņu}one{papildu lietotne}other{papildu lietotnes}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Darbvirsma"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"“<xliff:g id="APP_NAME_1">%1$s</xliff:g>” un “<xliff:g id="APP_NAME_2">%2$s</xliff:g>”"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>; <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>. vienums no <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-mk/strings.xml b/quickstep/res/values-mk/strings.xml
index 08dc4591b4..d5fe673309 100644
--- a/quickstep/res/values-mk/strings.xml
+++ b/quickstep/res/values-mk/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Премести горе лево"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Премести долу десно"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Отвори апликација како балонче"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Неодамнешни апликации"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Список со неодамнешни апликации"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{дополнителна апликација}one{дополнителна апликација}other{дополнителни апликации}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Режим за компјутер"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> и <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, ставка <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> од <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-ml/strings.xml b/quickstep/res/values-ml/strings.xml
index 9b87841c50..099e0003e6 100644
--- a/quickstep/res/values-ml/strings.xml
+++ b/quickstep/res/values-ml/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"മുകളിലേക്കോ ഇടത്തേക്കോ നീക്കുക"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"താഴേക്കോ വലത്തേക്കോ നീക്കുക"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"ആപ്പ് ഒരു ബബിളായി തുറക്കുക"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"അടുത്തിടെ തുറന്ന ആപ്പുകൾ"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"അടുത്തിടെ തുറന്ന ആപ്പ് ലിസ്റ്റ്"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{കൂടുതൽ ആപ്പ്}other{കൂടുതൽ ആപ്പുകൾ}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"ഡെസ്‌ക്ടോപ്പ്"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g>, <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>-ൽ <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>-ാമത്തെ ഇനം"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-mn/strings.xml b/quickstep/res/values-mn/strings.xml
index f390e211da..d41faafd82 100644
--- a/quickstep/res/values-mn/strings.xml
+++ b/quickstep/res/values-mn/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Зүүн дээд хэсэг рүү зөөх"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Баруун доод хэсэг рүү зөөх"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Аппыг бөмбөлөг байдлаар нээх"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Саяхны апп"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Саяхны аппын жагсаалт"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{бусад апп}other{бусад апп}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Дэлгэц"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> болон <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>-н <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>-р зүйл"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-mr/strings.xml b/quickstep/res/values-mr/strings.xml
index 4e6d30951d..5aa9dfcba7 100644
--- a/quickstep/res/values-mr/strings.xml
+++ b/quickstep/res/values-mr/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"सर्वात वरती/डावीकडे हलवा"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"तळाशी/उजवीकडे हलवा"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"बबल म्हणून अ‍ॅप उघडा"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"अलीकडील ॲप्स"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"अलीकडील ॲपची सूची"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{आणखी अ‍ॅप}other{आणखी अ‍ॅप्स}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"डेस्कटॉप"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> आणि <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="TOTAL_TASKS">%3$d</xliff:g> पैकी <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> आयटम"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-my/strings.xml b/quickstep/res/values-my/strings.xml
index 8f90b8b1ce..499269c27f 100644
--- a/quickstep/res/values-my/strings.xml
+++ b/quickstep/res/values-my/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"အပေါ်/ဘယ်ဘက်သို့ ရွှေ့ရန်"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"အောက်ခြေ/ညာဘက်သို့ ရွှေ့ရန်"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"အက်ပ်ကို ပူဖောင်းကွက်အဖြစ် ဖွင့်ရန်"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"မကြာသေးမီက အက်ပ်များ"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"မကြာသေးမီက အက်ပ်စာရင်း"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{နောက်ထပ်အက်ပ်}other{နောက်ထပ်အက်ပ်များ}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"ဒက်စ်တော့"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> နှင့် <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>၊ <xliff:g id="TOTAL_TASKS">%3$d</xliff:g> ခုအနက် <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-nb/strings.xml b/quickstep/res/values-nb/strings.xml
index a5799c5525..7ec515ce98 100644
--- a/quickstep/res/values-nb/strings.xml
+++ b/quickstep/res/values-nb/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Flytt til øverst/venstre"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Flytt til nederst/høyre"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Åpne appen som en boble"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Nylige apper"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Liste over nylige apper"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{app til}other{apper til}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Skrivebord"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> og <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, element <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> av <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-ne/strings.xml b/quickstep/res/values-ne/strings.xml
index b1b03e4382..91c6bba275 100644
--- a/quickstep/res/values-ne/strings.xml
+++ b/quickstep/res/values-ne/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"सिरान/बायाँतिर सार्नुहोस्"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"फेद/दायाँतिर सार्नुहोस्"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"एपलाई बबलका रूपमा खोल्नुहोस्"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"हालसालै चलाइएका एपहरू"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"हालसालै चलाइएको एपको सूची"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{थप एप}other{थप एपहरू}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"डेस्कटप"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> र <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="TOTAL_TASKS">%3$d</xliff:g> मध्ये <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> औँ वस्तु"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-nl/strings.xml b/quickstep/res/values-nl/strings.xml
index bd4dfc5806..9e49f13252 100644
--- a/quickstep/res/values-nl/strings.xml
+++ b/quickstep/res/values-nl/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Naar boven/links verplaatsen"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Naar beneden/rechts verplaatsen"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"App openen als ballon"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Recente apps"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Lijst met recente apps"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{extra app}other{extra apps}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Desktop"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> en <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, item <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> van <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-or/strings.xml b/quickstep/res/values-or/strings.xml
index 7efa0266a9..4721e74cfb 100644
--- a/quickstep/res/values-or/strings.xml
+++ b/quickstep/res/values-or/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"ଶୀର୍ଷ/ବାମକୁ ମୁଭ କରନ୍ତୁ"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"ନିମ୍ନ/ଡାହାଣକୁ ମୁଭ କରନ୍ତୁ"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"ଏକ ବବଲ ଭାବେ ଆପ ଖୋଲନ୍ତୁ"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"ବର୍ତ୍ତମାନର ଆପ"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"ବର୍ତ୍ତମାନର ଆପ ତାଲିକା"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{ଅଧିକ ଆପ}other{ଅଧିକ ଆପ୍ସ}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"ଡେସ୍କଟପ"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> ଏବଂ <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>ର <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> ଆଇଟମ"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-pa/strings.xml b/quickstep/res/values-pa/strings.xml
index 798619bc66..f081b67b0e 100644
--- a/quickstep/res/values-pa/strings.xml
+++ b/quickstep/res/values-pa/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"ਸਿਖਰਲੇ/ਖੱਬੇ ਪਾਸੇ ਲੈ ਕੇ ਜਾਓ"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"ਹੇਠਾਂ/ਸੱਜੇ ਪਾਸੇ ਲੈ ਕੇ ਜਾਓ"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"ਐਪ ਨੂੰ ਬਬਲ ਵਜੋਂ ਖੋਲ੍ਹੋ"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"ਹਾਲੀਆ ਐਪਾਂ"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"ਹਾਲੀਆ ਐਪ ਸੂਚੀ"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{ਹੋਰ ਐਪ}one{ਹੋਰ ਐਪ}other{ਹੋਰ ਐਪਾਂ}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"ਡੈਸਕਟਾਪ"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> ਅਤੇ <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="TOTAL_TASKS">%3$d</xliff:g> ਵਿੱਚੋਂ <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> ਆਈਟਮ"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-pl/strings.xml b/quickstep/res/values-pl/strings.xml
index 6f6b08b08e..9970dee960 100644
--- a/quickstep/res/values-pl/strings.xml
+++ b/quickstep/res/values-pl/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Przesuń w górny lewy róg"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Przesuń w dolny prawy róg"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Otwórz aplikację jako dymek"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Ostatnie aplikacje"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Lista ostatnich aplikacji"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{inna aplikacja}few{inne aplikacje}many{innych aplikacji}other{innej aplikacji}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Pulpit"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> i <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, element <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> z <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-pt/strings.xml b/quickstep/res/values-pt/strings.xml
index 892881b28f..92fed63ed5 100644
--- a/quickstep/res/values-pt/strings.xml
+++ b/quickstep/res/values-pt/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Mover para cima/para a esquerda"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Mover para baixo/para a direita"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Abrir o app como um balão"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Apps recentes"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Lista de apps recentes"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{outro app}one{outro app}other{outros apps}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Computador"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> e <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, item <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> de <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-ro/strings.xml b/quickstep/res/values-ro/strings.xml
index 3be5fccb6d..4b1ee4d8ff 100644
--- a/quickstep/res/values-ro/strings.xml
+++ b/quickstep/res/values-ro/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Mută în stânga sus"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Mută în dreapta jos"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Deschide aplicația ca balon"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Aplicații recente"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Lista de aplicații recente"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{aplicație suplimentară}few{mai multe aplicații}other{mai multe aplicații}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Computer"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> și <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, articolul <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> din <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-ru/strings.xml b/quickstep/res/values-ru/strings.xml
index 8129585816..f46de34767 100644
--- a/quickstep/res/values-ru/strings.xml
+++ b/quickstep/res/values-ru/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Переместить вверх или влево"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Переместить вниз или вправо"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Открыть приложение во всплывающем окне"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Недавние приложения"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Список недавних приложений"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{дополнительное приложение}one{дополнительное приложение}few{дополнительных приложения}many{дополнительных приложений}other{дополнительного приложения}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Режим компьютера"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> и <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, элемент <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> из <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-si/strings.xml b/quickstep/res/values-si/strings.xml
index 2d6a3b97a1..d413b0dd70 100644
--- a/quickstep/res/values-si/strings.xml
+++ b/quickstep/res/values-si/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"ඉහළ/වම වෙත ගෙන යන්න"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"පහළ/දකුණ වෙත ගෙන යන්න"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"යෙදුම බුබුලක් ලෙස විවෘත කරන්න"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"මෑත යෙදුම්"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"මෑත යෙදුම් ලැයිස්තුව"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{තව යෙදුම}one{තවත් යෙදුම්}other{තවත් යෙදුම්}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"ඩෙස්ක්ටොපය"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> සහ <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, අයිතම <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>න් <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-sk/strings.xml b/quickstep/res/values-sk/strings.xml
index e3a86cbe00..8b87d38c27 100644
--- a/quickstep/res/values-sk/strings.xml
+++ b/quickstep/res/values-sk/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Presunúť hore alebo doľava"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Presunúť dole alebo doprava"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Otvoriť aplikáciu ako bublinu"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Nedávne aplikácie"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Zoznam nedávnych aplikácií"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{ďalšia aplikácia}few{ďalšie aplikácie}many{ďalšie aplikácie}other{ďalšie aplikácie}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Počítač"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> a <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>. položka z <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-sq/strings.xml b/quickstep/res/values-sq/strings.xml
index 0bea11d2ae..5ab85facaf 100644
--- a/quickstep/res/values-sq/strings.xml
+++ b/quickstep/res/values-sq/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Lëviz në krye/majtas"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Lëviz në fund/djathtas"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Hap aplikacionin si një flluskë"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Aplikacionet e fundit"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Lista e aplikacioneve të fundit"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{aplikacion tjetër}other{aplikacione të tjera}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Desktop"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> dhe <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, artikulli <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> nga <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-sr/strings.xml b/quickstep/res/values-sr/strings.xml
index 06ca295a01..4e32155e4c 100644
--- a/quickstep/res/values-sr/strings.xml
+++ b/quickstep/res/values-sr/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Премести горе лево"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Премести доле десно"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Отвори апликацију као облачић"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Недавне апликације"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Листа недавних апликација"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{додатна апликација}one{додатна апликација}few{додатне апликације}other{додатних апликација}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Рачунар"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> и <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, ставка <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> од <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-sv/strings.xml b/quickstep/res/values-sv/strings.xml
index 8f57cad05d..0ac4d4615b 100644
--- a/quickstep/res/values-sv/strings.xml
+++ b/quickstep/res/values-sv/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Flytta högst upp/till vänster"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Flytta längst ned/till höger"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Öppna appen som en bubbla"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Senaste apparna"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Lista över senaste appar"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{app till}other{appar till}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Skrivbordsläge"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> och <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, objekt <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> av <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-sw/strings.xml b/quickstep/res/values-sw/strings.xml
index 7aaf14ea93..b3afda5368 100644
--- a/quickstep/res/values-sw/strings.xml
+++ b/quickstep/res/values-sw/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Sogeza juu/kushoto"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Sogeza chini/kulia"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Fungua programu kama kiputo"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Programu ulizofungua hivi majuzi"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Orodha ya programu ulizofungua hivi majuzi"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{programu nyingine}other{programu zingine}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Kompyuta ya Mezani"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> na <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, kipengee cha <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> kati ya <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-ta/strings.xml b/quickstep/res/values-ta/strings.xml
index b0b771e647..f6e102124b 100644
--- a/quickstep/res/values-ta/strings.xml
+++ b/quickstep/res/values-ta/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"மேலே/இடதுபுறம் நகர்த்தும்"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"கீழே/வலதுபுறம் நகர்த்தும்"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"ஆப்ஸைக் குமிழாகத் திற"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"சமீபத்திய ஆப்ஸ்"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"சமீபத்திய ஆப்ஸ் பட்டியல்"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{கூடுதல் ஆப்ஸ்}other{கூடுதல் ஆப்ஸ்}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"டெஸ்க்டாப்"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> மற்றும் <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="TOTAL_TASKS">%3$d</xliff:g> இல் <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> கட்டம்"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-te/strings.xml b/quickstep/res/values-te/strings.xml
index 5f0e7a4fde..5ab198e81d 100644
--- a/quickstep/res/values-te/strings.xml
+++ b/quickstep/res/values-te/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"ఎగువ/ఎడమ వైపునకు తరలించండి"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"దిగువ/కుడి వైపునకు తరలించండి"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"యాప్‌ను బబుల్‌లాగా తెరవండి"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"ఇటీవలి యాప్‌లు"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"ఇటీవలి యాప్ లిస్ట్"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{మరో యాప్‌}other{మరిన్ని యాప్‌లు}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"డెస్క్‌టాప్"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g>, <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>‌లో <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>‌వ ఐటెమ్"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-th/strings.xml b/quickstep/res/values-th/strings.xml
index 9a88f92cfb..98380033c2 100644
--- a/quickstep/res/values-th/strings.xml
+++ b/quickstep/res/values-th/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"ย้ายไปที่ด้านบนหรือด้านซ้าย"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"ย้ายไปที่ด้านล่างหรือด้านขวา"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"เปิดแอปเป็นบับเบิล"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"แอปล่าสุด"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"รายการแอปล่าสุด"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{แอปเพิ่มเติม}other{แอปเพิ่มเติม}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"เดสก์ท็อป"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> และ <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, รายการที่ <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> จาก <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-tl/strings.xml b/quickstep/res/values-tl/strings.xml
index f85cce4d3c..52619b9880 100644
--- a/quickstep/res/values-tl/strings.xml
+++ b/quickstep/res/values-tl/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Ilipat sa itaas/kaliwa"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Ilipat sa ibaba/kanan"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Buksan ang app bilang bubble"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Mga kamakailang app"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Kamakailang listahan ng app"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{pang app}one{pang app}other{pang app}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Desktop"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> at <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, item <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> ng <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-tr/strings.xml b/quickstep/res/values-tr/strings.xml
index c39a65f35f..f30205a907 100644
--- a/quickstep/res/values-tr/strings.xml
+++ b/quickstep/res/values-tr/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Sol üste taşı"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Sağ alta taşı"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Uygulamayı balon olarak aç"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Son uygulamalar"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Son uygulama listesi"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{uygulama daha}other{uygulama daha}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Masaüstü"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> ve <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>/<xliff:g id="TOTAL_TASKS">%3$d</xliff:g> öğe"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-uk/strings.xml b/quickstep/res/values-uk/strings.xml
index 433e02017d..4cda8cfc79 100644
--- a/quickstep/res/values-uk/strings.xml
+++ b/quickstep/res/values-uk/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Перемістити вгору або вліво"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Перемістити вниз або вправо"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Відкрити додаток у спливаючому вікні"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Нещодавні додатки"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Список нещодавніх додатків"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{інший додаток}one{інший додаток}few{інші додатки}many{інших додатків}other{іншого додатка}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Комп’ютер"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> та <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, об’єкт <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> з <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-ur/strings.xml b/quickstep/res/values-ur/strings.xml
index 603760c6a7..a5508d47c5 100644
--- a/quickstep/res/values-ur/strings.xml
+++ b/quickstep/res/values-ur/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"اوپر/بائیں طرف منتقل کریں"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"نیچے/دائیں طرف منتقل کریں"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"ایپ کو بطور ببل کھولیں"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"حالیہ ایپس"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"حالیہ ایپ کی فہرست"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{مزید ایپ}other{مزید ایپس}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"ڈیسک ٹاپ"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> اور <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"‫<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>، آئٹم <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> از <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-uz/strings.xml b/quickstep/res/values-uz/strings.xml
index f28957383b..e091d69a33 100644
--- a/quickstep/res/values-uz/strings.xml
+++ b/quickstep/res/values-uz/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Yuqoriga yoki chapga oʻtkazish"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Pastga yoki oʻngga oʻtkazish"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Ilovani qalqib chiquvchi oynada ochish"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Oxirgi ilovalar"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Oxirgi ilovalar roʻyxati"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{boshqa ilova}other{boshqa ilovalar}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Kompyuter"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> va <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g>-element, jami: <xliff:g id="TOTAL_TASKS">%3$d</xliff:g> ta"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-vi/strings.xml b/quickstep/res/values-vi/strings.xml
index d0f5252f01..44cfb44b93 100644
--- a/quickstep/res/values-vi/strings.xml
+++ b/quickstep/res/values-vi/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Chuyển lên trên cùng/sang bên trái"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Chuyển xuống dưới cùng/sang bên phải"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Mở ứng dụng dưới dạng bong bóng"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Các ứng dụng gần đây"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Danh sách ứng dụng gần đây"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{ứng dụng khác}other{ứng dụng khác}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Máy tính"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g> và <xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, mục <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> trong số <xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-zh-rCN/strings.xml b/quickstep/res/values-zh-rCN/strings.xml
index 6548148b35..0494f54035 100644
--- a/quickstep/res/values-zh-rCN/strings.xml
+++ b/quickstep/res/values-zh-rCN/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"移到顶部/左侧"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"移到底部/右侧"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"以气泡的形式打开应用"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"最近打开过的应用"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"“最近打开过的应用”列表"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{多个应用}other{多个应用}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"桌面模式"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"<xliff:g id="APP_NAME_1">%1$s</xliff:g>和<xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>,第 <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> 项(共 <xliff:g id="TOTAL_TASKS">%3$d</xliff:g> 项)"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-zh-rHK/strings.xml b/quickstep/res/values-zh-rHK/strings.xml
index 0606463f80..d199ee1dec 100644
--- a/quickstep/res/values-zh-rHK/strings.xml
+++ b/quickstep/res/values-zh-rHK/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"移至上方/左側"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"移至底部/右側"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"在小視窗開啟應用程式"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"最近開啟的應用程式"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"「最近開啟的應用程式」清單"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{個其他應用程式}other{個其他應用程式}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"桌面"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"「<xliff:g id="APP_NAME_1">%1$s</xliff:g>」和「<xliff:g id="APP_NAME_2">%2$s</xliff:g>」"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>,第 <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> 個項目,總共有 <xliff:g id="TOTAL_TASKS">%3$d</xliff:g> 項"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-zh-rTW/strings.xml b/quickstep/res/values-zh-rTW/strings.xml
index 44c6fdfed3..7b9efb7ef5 100644
--- a/quickstep/res/values-zh-rTW/strings.xml
+++ b/quickstep/res/values-zh-rTW/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"移到上方/左側"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"移到底部/右側"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"以泡泡形式開啟應用程式"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"最近開啟的應用程式"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"「最近開啟的應用程式」清單"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{個其他應用程式}other{個其他應用程式}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"電腦模式"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"「<xliff:g id="APP_NAME_1">%1$s</xliff:g>」和「<xliff:g id="APP_NAME_2">%2$s</xliff:g>」"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>,第 <xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> 個項目,共 <xliff:g id="TOTAL_TASKS">%3$d</xliff:g> 項"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values-zu/strings.xml b/quickstep/res/values-zu/strings.xml
index c666ee7eac..8d344e2f7e 100644
--- a/quickstep/res/values-zu/strings.xml
+++ b/quickstep/res/values-zu/strings.xml
@@ -140,15 +140,12 @@
<string name="move_drop_target_top_or_left" msgid="2988702185049595807">"Hamba phezulu/kwesokunxele"</string>
<string name="move_drop_target_bottom_or_right" msgid="5431393418797620162">"Hamba phansi/kwesokudla"</string>
<string name="open_app_as_a_bubble" msgid="6642626287247807473">"Vula i-app njengebhamuza"</string>
- <!-- no translation found for quick_switch_pane_title (4677158207760585812) -->
- <skip />
- <!-- no translation found for quick_switch_content_description (2851244536728720005) -->
- <skip />
+ <string name="quick_switch_pane_title" msgid="4677158207760585812">"Ama-app wakamuva"</string>
+ <string name="quick_switch_content_description" msgid="2851244536728720005">"Uhlu lwe-app lwakamuva"</string>
<string name="quick_switch_overflow" msgid="3679780650881041632">"{count,plural, =1{i-app eyengeziwe}one{ama-app engeziwe}other{ama-app engeziwe}}"</string>
<string name="quick_switch_desktop" msgid="8393802056024499749">"Ideskithophu"</string>
<string name="quick_switch_split_task" msgid="5598194724255333896">"I-<xliff:g id="APP_NAME_1">%1$s</xliff:g> ne-<xliff:g id="APP_NAME_2">%2$s</xliff:g>"</string>
- <!-- no translation found for quick_switch_task_with_position_in_parent (4968670948331508951) -->
- <skip />
+ <string name="quick_switch_task_with_position_in_parent" msgid="4968670948331508951">"I-<xliff:g id="TASK_DESCRIPTION">%1$s</xliff:g>, into engu-<xliff:g id="INDEX_IN_PARENT">%2$d</xliff:g> kwezingu-<xliff:g id="TOTAL_TASKS">%3$d</xliff:g>"</string>
<!-- no translation found for quick_switch_scroll_arrow_left (6527033155534184309) -->
<skip />
<!-- no translation found for quick_switch_scroll_arrow_right (7319779291086916348) -->
diff --git a/quickstep/res/values/config.xml b/quickstep/res/values/config.xml
index 1ce28cf995..49cee0fa86 100644
--- a/quickstep/res/values/config.xml
+++ b/quickstep/res/values/config.xml
@@ -23,7 +23,6 @@
<string name="stats_log_manager_class" translatable="false">com.android.quickstep.logging.StatsLogCompatManager</string>
<string name="test_information_handler_class" translatable="false">com.android.quickstep.QuickstepTestInformationHandler</string>
- <string name="widget_holder_factory_class" translatable="false">com.android.launcher3.uioverrides.QuickstepWidgetHolder$QuickstepHolderFactory</string>
<string name="instant_app_resolver_class" translatable="false">com.android.quickstep.InstantAppResolverImpl</string>
<string name="app_launch_tracker_class" translatable="false">com.android.launcher3.appprediction.PredictionAppTracker</string>
<string name="main_process_initializer_class" translatable="false">com.android.quickstep.QuickstepProcessInitializer</string>
diff --git a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java
index 21af26ea6b..548fbefcae 100644
--- a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java
+++ b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java
@@ -68,6 +68,7 @@ import static com.android.quickstep.util.AnimUtils.completeRunnableListCallback;
import static com.android.systemui.shared.Flags.returnAnimationFrameworkLibrary;
import static com.android.systemui.shared.system.QuickStepContract.getWindowCornerRadius;
import static com.android.systemui.shared.system.QuickStepContract.supportsRoundedCornersOnWindows;
+import static com.android.wm.shell.Flags.enableDynamicInsetsForAppLaunch;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
@@ -283,6 +284,8 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
private final Interpolator mOpeningXInterpolator;
private final Interpolator mOpeningInterpolator;
+ private final SystemUiProxy mSystemUiProxy;
+
public QuickstepTransitionManager(Context context) {
mLauncher = Launcher.cast(Launcher.getLauncher(context));
mDragLayer = mLauncher.getDragLayer();
@@ -297,6 +300,7 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
mMaxShadowRadius = res.getDimensionPixelSize(R.dimen.max_shadow_radius);
mLauncher.addOnDeviceProfileChangeListener(this);
+ mSystemUiProxy = SystemUiProxy.INSTANCE.get(mLauncher);
if (ENABLE_SHELL_STARTING_SURFACE) {
mTaskStartParams = new LinkedHashMap<>(MAX_NUM_TASKS) {
@@ -306,8 +310,7 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
}
};
- SystemUiProxy.INSTANCE.get(mLauncher).setStartingWindowListener(
- mStartingWindowListener);
+ mSystemUiProxy.setStartingWindowListener(mStartingWindowListener);
}
mOpeningXInterpolator = AnimationUtils.loadInterpolator(context, R.interpolator.app_open_x);
@@ -522,12 +525,6 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
4 - rotationChange);
}
}
- if (mDeviceProfile.isTaskbarPresentInApps
- && !target.willShowImeOnTarget
- && !isTransientTaskbar(mLauncher)) {
- // Animate to above the taskbar.
- bounds.bottom -= target.contentInsets.bottom;
- }
return bounds;
}
@@ -694,6 +691,13 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
};
}
+ private boolean shouldCropToInset(RemoteAnimationTarget target) {
+ return enableDynamicInsetsForAppLaunch()
+ && mDeviceProfile.isTaskbarPresentInApps
+ && target != null && !target.willShowImeOnTarget
+ && !isTransientTaskbar(mLauncher);
+ }
+
/**
* @return Animator that controls the window of the opening targets from app icons.
*/
@@ -702,8 +706,19 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
RemoteAnimationTarget[] wallpaperTargets,
RemoteAnimationTarget[] nonAppTargets,
boolean launcherClosing) {
+ RemoteAnimationTargets openingTargets = new RemoteAnimationTargets(appTargets,
+ wallpaperTargets, nonAppTargets, MODE_OPENING);
int rotationChange = getRotationChange(appTargets);
Rect windowTargetBounds = getWindowTargetBounds(appTargets, rotationChange);
+ final int[] bottomInsetPos = new int[]{
+ mSystemUiProxy.getHomeVisibilityState().getNavbarInsetPosition()};
+ final RemoteAnimationTarget target = openingTargets.getFirstAppTarget();
+ final boolean cropToInset = shouldCropToInset(target);
+ if (cropToInset) {
+ // Animate to above the taskbar.
+ windowTargetBounds.bottom = Math.min(bottomInsetPos[0],
+ windowTargetBounds.bottom);
+ }
boolean appTargetsAreTranslucent = areAllTargetsTranslucent(appTargets);
RectF launcherIconBounds = new RectF();
@@ -716,8 +731,6 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
Rect crop = new Rect();
Matrix matrix = new Matrix();
- RemoteAnimationTargets openingTargets = new RemoteAnimationTargets(appTargets,
- wallpaperTargets, nonAppTargets, MODE_OPENING);
SurfaceTransactionApplier surfaceApplier =
new SurfaceTransactionApplier(floatingView);
openingTargets.addReleaseCheck(surfaceApplier);
@@ -823,6 +836,39 @@ public class QuickstepTransitionManager implements OnDeviceProfileChangeListener
@Override
public void onUpdate(float percent, boolean initOnly) {
+ if (cropToInset && bottomInsetPos[0] != mSystemUiProxy.getHomeVisibilityState()
+ .getNavbarInsetPosition()) {
+ final RemoteAnimationTarget target = openingTargets.getFirstAppTarget();
+ bottomInsetPos[0] = mSystemUiProxy.getHomeVisibilityState()
+ .getNavbarInsetPosition();
+ final Rect bounds = target != null
+ ? target.screenSpaceBounds : windowTargetBounds;
+ // Animate to above the taskbar.
+ int bottomLevel = Math.min(bottomInsetPos[0], bounds.bottom);
+ windowTargetBounds.bottom = bottomLevel;
+ final int endHeight = bottomLevel - bounds.top;
+
+ AnimOpenProperties prop = new AnimOpenProperties(mLauncher.getResources(),
+ mDeviceProfile, windowTargetBounds, launcherIconBounds, v,
+ dragLayerBounds[0], dragLayerBounds[1], hasSplashScreen,
+ floatingView.isDifferentFromAppIcon());
+ mCropRectCenterY = new FloatProp(prop.cropCenterYStart, prop.cropCenterYEnd,
+ mOpeningInterpolator);
+ mCropRectHeight = new FloatProp(prop.cropHeightStart, prop.cropHeightEnd,
+ mOpeningInterpolator);
+ mDy = new FloatProp(0, prop.dY, mOpeningInterpolator);
+ mIconScaleToFitScreen = new FloatProp(prop.initialAppIconScale,
+ prop.finalAppIconScale, mOpeningInterpolator);
+ float interpolatedPercent = mOpeningInterpolator.getInterpolation(percent);
+ mCropRectHeight.value = Utilities.mapRange(interpolatedPercent,
+ prop.cropHeightStart, prop.cropHeightEnd);
+ mCropRectCenterY.value = Utilities.mapRange(interpolatedPercent,
+ prop.cropCenterYStart, prop.cropCenterYEnd);
+ mDy.value = Utilities.mapRange(interpolatedPercent, 0, prop.dY);
+ mIconScaleToFitScreen.value = Utilities.mapRange(interpolatedPercent,
+ prop.initialAppIconScale, prop.finalAppIconScale);
+ }
+
// Calculate the size of the scaled icon.
float iconWidth = launcherIconBounds.width() * mIconScaleToFitScreen.value;
float iconHeight = launcherIconBounds.height() * mIconScaleToFitScreen.value;
diff --git a/quickstep/src/com/android/launcher3/dagger/Modules.kt b/quickstep/src/com/android/launcher3/dagger/Modules.kt
index 52be4132f2..7671a82869 100644
--- a/quickstep/src/com/android/launcher3/dagger/Modules.kt
+++ b/quickstep/src/com/android/launcher3/dagger/Modules.kt
@@ -16,11 +16,13 @@
package com.android.launcher3.dagger
+import com.android.launcher3.uioverrides.QuickstepWidgetHolder.QuickstepWidgetHolderFactory
import com.android.launcher3.uioverrides.SystemApiWrapper
import com.android.launcher3.uioverrides.plugins.PluginManagerWrapperImpl
import com.android.launcher3.util.ApiWrapper
import com.android.launcher3.util.PluginManagerWrapper
import com.android.launcher3.util.window.WindowManagerProxy
+import com.android.launcher3.widget.LauncherWidgetHolder.WidgetHolderFactory
import com.android.quickstep.util.GestureExclusionManager
import com.android.quickstep.util.SystemWindowManagerProxy
import dagger.Binds
@@ -40,6 +42,13 @@ abstract class ApiWrapperModule {
}
@Module
+abstract class WidgetModule {
+
+ @Binds
+ abstract fun bindWidgetHolderFactory(factor: QuickstepWidgetHolderFactory): WidgetHolderFactory
+}
+
+@Module
abstract class PluginManagerWrapperModule {
@Binds
abstract fun bindPluginManagerWrapper(impl: PluginManagerWrapperImpl): PluginManagerWrapper
diff --git a/quickstep/src/com/android/launcher3/statehandlers/DesktopVisibilityController.kt b/quickstep/src/com/android/launcher3/statehandlers/DesktopVisibilityController.kt
index 810fa6f082..1ac2d7c13e 100644
--- a/quickstep/src/com/android/launcher3/statehandlers/DesktopVisibilityController.kt
+++ b/quickstep/src/com/android/launcher3/statehandlers/DesktopVisibilityController.kt
@@ -40,7 +40,8 @@ import com.android.quickstep.SystemUiProxy
import com.android.quickstep.fallback.RecentsState
import com.android.wm.shell.desktopmode.DisplayDeskState
import com.android.wm.shell.desktopmode.IDesktopTaskListener.Stub
-import com.android.wm.shell.shared.desktopmode.DesktopModeStatus
+import com.android.wm.shell.shared.desktopmode.DesktopModeStatus.enableMultipleDesktops
+import com.android.wm.shell.shared.desktopmode.DesktopModeStatus.useRoundedCorners
import java.io.PrintWriter
import java.lang.ref.WeakReference
import javax.inject.Inject
@@ -89,8 +90,7 @@ constructor(
private val taskbarDesktopModeListeners: MutableSet<TaskbarDesktopModeListener> = HashSet()
// This simply indicates that user is currently in desktop mode or not.
- var isInDesktopMode = false
- private set
+ @Deprecated("Does not work with multi-desks") private var isInDesktopModeDeprecated = false
// to track if any pending notification to be done.
var isNotifyingDesktopVisibilityPending = false
@@ -104,12 +104,16 @@ constructor(
* Number of visible desktop windows in desktop mode. This can be > 0 when user goes to overview
* from desktop window mode.
*/
- var visibleDesktopTasksCount: Int = 0
+ @Deprecated("Does not work with multi-desks")
+ var visibleDesktopTasksCountDeprecated: Int = 0
/**
* Sets the number of desktop windows that are visible and updates launcher visibility based
* on it.
*/
set(visibleTasksCount) {
+ if (enableMultipleDesktops(context)) {
+ return
+ }
if (DEBUG) {
Log.d(
TAG,
@@ -121,11 +125,11 @@ constructor(
}
if (visibleTasksCount != field) {
- if (visibleDesktopTasksCount == 0 && visibleTasksCount == 1) {
- isInDesktopMode = true
+ if (visibleDesktopTasksCountDeprecated == 0 && visibleTasksCount == 1) {
+ isInDesktopModeDeprecated = true
}
- if (visibleDesktopTasksCount == 1 && visibleTasksCount == 0) {
- isInDesktopMode = false
+ if (visibleDesktopTasksCountDeprecated == 1 && visibleTasksCount == 0) {
+ isInDesktopModeDeprecated = false
}
val wasVisible = field > 0
val isVisible = visibleTasksCount > 0
@@ -171,7 +175,7 @@ constructor(
private var desktopTaskListener: DesktopTaskListenerImpl?
init {
- desktopTaskListener = DesktopTaskListenerImpl(this, context.displayId)
+ desktopTaskListener = DesktopTaskListenerImpl(this, context, context.displayId)
systemUiProxy.setDesktopTaskListener(desktopTaskListener)
lifecycleTracker.addCloseable {
@@ -185,7 +189,7 @@ constructor(
* [INACTIVE_DESK_ID] if no desk is currently active or the multiple desks feature is disabled.
*/
fun getActiveDeskId(displayId: Int): Int {
- if (!DesktopModeStatus.enableMultipleDesktops(context)) {
+ if (!enableMultipleDesktops(context)) {
// When the multiple desks feature is disabled, callers should not rely on the concept
// of a desk ID.
return INACTIVE_DESK_ID
@@ -196,8 +200,8 @@ constructor(
/** Returns whether a desk is currently active on the display with the given [displayId]. */
fun isInDesktopMode(displayId: Int): Boolean {
- if (!DesktopModeStatus.enableMultipleDesktops(context)) {
- return isInDesktopMode
+ if (!enableMultipleDesktops(context)) {
+ return isInDesktopModeDeprecated
}
val activeDeskId = getDisplayDeskConfig(displayId)?.activeDeskId ?: INACTIVE_DESK_ID
@@ -213,7 +217,7 @@ constructor(
* Overview is not active.
*/
fun isInDesktopModeAndNotInOverview(displayId: Int): Boolean {
- if (!DesktopModeStatus.enableMultipleDesktops(context)) {
+ if (!enableMultipleDesktops(context)) {
return areDesktopTasksVisibleAndNotInOverview()
}
@@ -225,7 +229,7 @@ constructor(
/** Whether desktop tasks are visible in desktop mode. */
private fun areDesktopTasksVisibleAndNotInOverview(): Boolean {
- val desktopTasksVisible: Boolean = visibleDesktopTasksCount > 0
+ val desktopTasksVisible: Boolean = visibleDesktopTasksCountDeprecated > 0
if (DEBUG) {
Log.d(
TAG,
@@ -309,7 +313,7 @@ constructor(
inOverviewState = overviewStateEnabled
val areDesktopTasksVisibleNow = areDesktopTasksVisibleAndNotInOverview()
- if (!DesktopModeStatus.enableMultipleDesktops(context)) {
+ if (!enableMultipleDesktops(context)) {
if (wereDesktopTasksVisibleBefore != areDesktopTasksVisibleNow) {
notifyIsInDesktopModeChanged(DEFAULT_DISPLAY, areDesktopTasksVisibleNow)
}
@@ -504,7 +508,7 @@ constructor(
displayDeskStates: Array<DisplayDeskState>,
canCreateDesks: Boolean,
) {
- if (!DesktopModeStatus.enableMultipleDesktops(context)) {
+ if (!enableMultipleDesktops(context)) {
return
}
@@ -527,7 +531,7 @@ constructor(
?: null.also { Slog.e(TAG, "Expected non-null desk config for display: $displayId") }
private fun onCanCreateDesksChanged(canCreateDesks: Boolean) {
- if (!DesktopModeStatus.enableMultipleDesktops(context)) {
+ if (!enableMultipleDesktops(context)) {
return
}
@@ -535,7 +539,7 @@ constructor(
}
private fun onDeskAdded(displayId: Int, deskId: Int) {
- if (!DesktopModeStatus.enableMultipleDesktops(context)) {
+ if (!enableMultipleDesktops(context)) {
return
}
@@ -549,7 +553,7 @@ constructor(
}
private fun onDeskRemoved(displayId: Int, deskId: Int) {
- if (!DesktopModeStatus.enableMultipleDesktops(context)) {
+ if (!enableMultipleDesktops(context)) {
return
}
@@ -566,7 +570,7 @@ constructor(
}
private fun onActiveDeskChanged(displayId: Int, newActiveDesk: Int, oldActiveDesk: Int) {
- if (!DesktopModeStatus.enableMultipleDesktops(context)) {
+ if (!enableMultipleDesktops(context)) {
return
}
@@ -626,7 +630,7 @@ constructor(
pw.println(prefix + "DesktopVisibilityController:")
pw.println("$prefix\tdesktopVisibilityListeners=$desktopVisibilityListeners")
- pw.println("$prefix\tvisibleDesktopTasksCount=$visibleDesktopTasksCount")
+ pw.println("$prefix\tvisibleDesktopTasksCount=$visibleDesktopTasksCountDeprecated")
pw.println("$prefix\tinOverviewState=$inOverviewState")
pw.println("$prefix\tbackgroundStateEnabled=$backgroundStateEnabled")
pw.println("$prefix\tgestureInProgress=$gestureInProgress")
@@ -640,6 +644,7 @@ constructor(
*/
private class DesktopTaskListenerImpl(
controller: DesktopVisibilityController,
+ @ApplicationContext private val context: Context,
private val displayId: Int,
) : Stub() {
private val controller = WeakReference(controller)
@@ -660,7 +665,7 @@ constructor(
if (DEBUG) {
Log.d(TAG, "desktop visible tasks count changed=$visibleTasksCount")
}
- visibleDesktopTasksCount = visibleTasksCount
+ visibleDesktopTasksCountDeprecated = visibleTasksCount
}
}
}
@@ -670,7 +675,7 @@ constructor(
}
override fun onTaskbarCornerRoundingUpdate(doesAnyTaskRequireTaskbarRounding: Boolean) {
- if (!DesktopModeStatus.useRoundedCorners()) return
+ if (!useRoundedCorners()) return
MAIN_EXECUTOR.execute {
controller.get()?.apply {
Log.d(
@@ -683,7 +688,10 @@ constructor(
}
}
+ // TODO: b/402496827 - The multi-desks backend needs to be updated to call this API only
+ // once, not between desk switches.
override fun onEnterDesktopModeTransitionStarted(transitionDuration: Int) {
+ val controller = controller.get() ?: return
MAIN_EXECUTOR.execute {
Log.d(
TAG,
@@ -691,15 +699,19 @@ constructor(
"duration= " +
transitionDuration),
)
- val controller = controller.get()
- if (controller != null && !controller.isInDesktopMode) {
- controller.isInDesktopMode = true
+ if (enableMultipleDesktops(context)) {
+ controller.notifyTaskbarDesktopModeListenersForEntry(transitionDuration)
+ } else if (!controller.isInDesktopModeDeprecated) {
+ controller.isInDesktopModeDeprecated = true
controller.notifyTaskbarDesktopModeListenersForEntry(transitionDuration)
}
}
}
+ // TODO: b/402496827 - The multi-desks backend needs to be updated to call this API only
+ // once, not between desk switches.
override fun onExitDesktopModeTransitionStarted(transitionDuration: Int) {
+ val controller = controller.get() ?: return
MAIN_EXECUTOR.execute {
Log.d(
TAG,
@@ -707,9 +719,10 @@ constructor(
"duration= " +
transitionDuration),
)
- val controller = controller.get()
- if (controller != null && controller.isInDesktopMode) {
- controller.isInDesktopMode = false
+ if (enableMultipleDesktops(context)) {
+ controller.notifyTaskbarDesktopModeListenersForExit(transitionDuration)
+ } else if (controller.isInDesktopModeDeprecated) {
+ controller.isInDesktopModeDeprecated = false
controller.notifyTaskbarDesktopModeListenersForExit(transitionDuration)
}
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/BarsLocationAnimatorHelper.kt b/quickstep/src/com/android/launcher3/taskbar/BarsLocationAnimatorHelper.kt
index b8060e1792..ad847b47ee 100644
--- a/quickstep/src/com/android/launcher3/taskbar/BarsLocationAnimatorHelper.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/BarsLocationAnimatorHelper.kt
@@ -20,6 +20,7 @@ import android.animation.Animator
import android.animation.AnimatorSet
import android.animation.ObjectAnimator
import android.animation.ValueAnimator
+import android.content.Context
import android.view.View
import androidx.dynamicanimation.animation.SpringForce
import com.android.app.animation.Interpolators
@@ -30,11 +31,10 @@ import com.android.wm.shell.shared.bubbles.BubbleBarLocation
/** Animator helper that creates bars animators. */
object BarsLocationAnimatorHelper {
-
- private const val FADE_OUT_ANIM_ALPHA_DURATION_MS: Long = 50L
- private const val FADE_OUT_ANIM_ALPHA_DELAY_MS: Long = 50L
- private const val FADE_OUT_ANIM_POSITION_DURATION_MS: Long = 100L
- private const val FADE_IN_ANIM_ALPHA_DURATION_MS: Long = 100L
+ const val FADE_OUT_ANIM_ALPHA_DURATION_MS: Long = 50L
+ const val FADE_OUT_ANIM_ALPHA_DELAY_MS: Long = 50L
+ const val FADE_OUT_ANIM_POSITION_DURATION_MS: Long = 100L
+ const val FADE_IN_ANIM_ALPHA_DURATION_MS: Long = 100L
// Use STIFFNESS_MEDIUMLOW which is not defined in the API constants
private const val FADE_IN_ANIM_POSITION_SPRING_STIFFNESS: Float = 400f
@@ -45,13 +45,13 @@ object BarsLocationAnimatorHelper {
// During fade in animation we shift the bubble bar 1/60th of the screen width
private const val FADE_IN_ANIM_POSITION_SHIFT: Float = 1 / 60f
- private val View.screenWidth: Int
+ private val Context.screenWidth: Int
get() = resources.displayMetrics.widthPixels
- private val View.outShift: Float
+ val Context.outShift: Float
get() = screenWidth * FADE_OUT_ANIM_POSITION_SHIFT
- private val View.inShiftX: Float
+ val Context.inShiftX: Float
get() = screenWidth * FADE_IN_ANIM_POSITION_SHIFT
/**
@@ -108,7 +108,7 @@ object BarsLocationAnimatorHelper {
targetViewAlphaAnim: ObjectAnimator,
bubbleBarView: View,
): Animator {
- val shift: Float = bubbleBarView.outShift
+ val shift: Float = bubbleBarView.context.outShift
val onLeft = newLocation.isOnLeft(bubbleBarView.isLayoutRtl)
val startTx: Float
@@ -132,15 +132,19 @@ object BarsLocationAnimatorHelper {
return createLocationInAnimator(startTx, finalTx, targetViewAlphaAnim, bubbleBarView)
}
- /** Creates an animator for the bubble bar view out part. */
+ /**
+ * Creates an animator for the bubble bar view out part.
+ *
+ * @param targetLocation the location bubble bar should animate to.
+ */
@JvmStatic
fun getBubbleBarLocationOutAnimator(
bubbleBarView: View,
- bubbleBarLocation: BubbleBarLocation,
+ targetLocation: BubbleBarLocation,
targetViewAlphaAnim: ObjectAnimator,
): Animator {
- val onLeft = bubbleBarLocation.isOnLeft(bubbleBarView.isLayoutRtl)
- val shift = bubbleBarView.outShift
+ val onLeft = targetLocation.isOnLeft(bubbleBarView.isLayoutRtl)
+ val shift = bubbleBarView.context.outShift
val finalTx = bubbleBarView.translationX + (if (onLeft) -shift else shift)
return this.createLocationOutAnimator(finalTx, targetViewAlphaAnim, bubbleBarView)
}
@@ -152,7 +156,7 @@ object BarsLocationAnimatorHelper {
navButtonsView: View,
navBarTargetTranslationX: Float,
): Animator {
- val outShift: Float = navButtonsView.outShift
+ val outShift: Float = navButtonsView.context.outShift
val isNavBarOnRight: Boolean = location.isOnLeft(navButtonsView.isLayoutRtl)
val finalOutTx =
navButtonsView.translationX + (if (isNavBarOnRight) outShift else -outShift)
@@ -162,7 +166,7 @@ object BarsLocationAnimatorHelper {
ObjectAnimator.ofFloat(navButtonsView, LauncherAnimUtils.VIEW_ALPHA, 0f),
navButtonsView,
)
- val inShift: Float = navButtonsView.inShiftX
+ val inShift: Float = navButtonsView.context.inShiftX
val inStartX = navBarTargetTranslationX + (if (isNavBarOnRight) -inShift else inShift)
val fadeIn: Animator =
createLocationInAnimator(
diff --git a/quickstep/src/com/android/launcher3/taskbar/BaseTaskbarContext.java b/quickstep/src/com/android/launcher3/taskbar/BaseTaskbarContext.java
index aa3feb7614..b82e6edd7c 100644
--- a/quickstep/src/com/android/launcher3/taskbar/BaseTaskbarContext.java
+++ b/quickstep/src/com/android/launcher3/taskbar/BaseTaskbarContext.java
@@ -23,7 +23,7 @@ import android.view.LayoutInflater;
import com.android.launcher3.popup.SystemShortcut;
import com.android.launcher3.util.BaseContext;
-import com.android.launcher3.util.DisplayController;
+import com.android.launcher3.util.NavigationMode;
import com.android.launcher3.util.Themes;
import com.android.quickstep.SystemUiProxy;
@@ -33,21 +33,49 @@ public abstract class BaseTaskbarContext extends BaseContext
implements SystemShortcut.BubbleActivityStarter {
protected final LayoutInflater mLayoutInflater;
- private final boolean mIsPrimaryDisplay;
public BaseTaskbarContext(Context windowContext, boolean isPrimaryDisplay) {
super(windowContext, Themes.getActivityThemeRes(windowContext));
mLayoutInflater = LayoutInflater.from(this).cloneInContext(this);
- mIsPrimaryDisplay = isPrimaryDisplay;
}
- public boolean isTransientTaskbar() {
- return DisplayController.isTransientTaskbar(this) && mIsPrimaryDisplay;
- }
+ /**
+ * Returns whether taskbar is transient or persistent. External displays will be persistent.
+ *
+ * @return {@code true} if transient, {@code false} if persistent.
+ */
+ public abstract boolean isTransientTaskbar();
- public boolean isPrimaryDisplay() {
- return mIsPrimaryDisplay;
- }
+ /**
+ * Returns whether the taskbar is pinned in gesture navigation mode.
+ */
+ public abstract boolean isPinnedTaskbar();
+
+ /**
+ * Returns the current navigation mode. External displays will be in THREE_BUTTONS mode.
+ */
+ public abstract NavigationMode getNavigationMode();
+
+ /**
+ * Returns whether the taskbar is in desktop mode.
+ */
+ public abstract boolean isInDesktopMode();
+
+ /**
+ * Returns whether the taskbar is forced to be pinned when home is visible.
+ */
+ public abstract boolean showLockedTaskbarOnHome();
+
+ /**
+ * Returns whether desktop taskbar (pinned taskbar that shows desktop tasks) is to be used on
+ * the display because the display is a freeform display.
+ */
+ public abstract boolean showDesktopTaskbarForFreeformDisplay();
+
+ /**
+ * Returns whether the taskbar is displayed on primary or external display.
+ */
+ public abstract boolean isPrimaryDisplay();
@Override
public final LayoutInflater getLayoutInflater() {
diff --git a/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java
index d6327bc3cd..5b1e8593a1 100644
--- a/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java
@@ -26,11 +26,15 @@ import androidx.annotation.Nullable;
import com.android.launcher3.popup.SystemShortcut;
import com.android.launcher3.statemanager.StateManager;
import com.android.launcher3.statemanager.StatefulContainer;
+import com.android.quickstep.FallbackActivityInterface;
+import com.android.quickstep.GestureState;
+import com.android.quickstep.RecentsAnimationCallbacks;
import com.android.quickstep.TopTaskTracker;
import com.android.quickstep.fallback.RecentsState;
import com.android.quickstep.views.RecentsView;
import com.android.quickstep.views.RecentsViewContainer;
+import java.io.PrintWriter;
import java.util.stream.Stream;
/**
@@ -92,11 +96,19 @@ public class FallbackTaskbarUIController
mRecentsContainer.getStateManager().removeStateListener(mStateListener);
}
+ @Nullable
+ @Override
+ public Animator getParallelAnimationToGestureEndTarget(GestureState.GestureEndTarget endTarget,
+ long duration, RecentsAnimationCallbacks callbacks) {
+ return createAnimToRecentsState(
+ FallbackActivityInterface.INSTANCE.stateFromGestureEndTarget(endTarget), duration);
+ }
+
/**
* Creates an animation to animate the taskbar for the given state (but does not start it).
* Currently this animation just force stashes the taskbar in Overview.
*/
- public Animator createAnimToRecentsState(RecentsState toState, long duration) {
+ private Animator createAnimToRecentsState(RecentsState toState, long duration) {
// Force stash taskbar (disallow unstashing) when:
// - in a 3P launcher or overview task.
// - not running in a test harness (unstash is needed for tests)
@@ -134,7 +146,8 @@ public class FallbackTaskbarUIController
private boolean isIn3pHomeOrRecents() {
TopTaskTracker.CachedTaskInfo topTask = TopTaskTracker.INSTANCE
- .get(mControllers.taskbarActivityContext).getCachedTopTask(true);
+ .get(mControllers.taskbarActivityContext).getCachedTopTask(true,
+ mRecentsContainer.asContext().getDisplayId());
return topTask.isHomeTask() || topTask.isRecentsTask();
}
@@ -142,4 +155,12 @@ public class FallbackTaskbarUIController
protected String getTaskbarUIControllerName() {
return "FallbackTaskbarUIController<" + mRecentsContainer.getClass().getSimpleName() + ">";
}
+
+ @Override
+ protected void dumpLogs(String prefix, PrintWriter pw) {
+ super.dumpLogs(prefix, pw);
+
+ pw.println(String.format("%s\tRecentsState=%s", prefix,
+ mRecentsContainer.getStateManager().getState()));
+ }
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java
index 6e210e337d..3d5e214391 100644
--- a/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/LauncherTaskbarUIController.java
@@ -48,11 +48,16 @@ import com.android.launcher3.uioverrides.QuickstepLauncher;
import com.android.launcher3.util.DisplayController;
import com.android.launcher3.util.MultiPropertyFactory;
import com.android.launcher3.util.OnboardingPrefs;
+import com.android.quickstep.GestureState;
import com.android.quickstep.HomeVisibilityState;
+import com.android.quickstep.LauncherActivityInterface;
import com.android.quickstep.RecentsAnimationCallbacks;
import com.android.quickstep.SystemUiProxy;
+import com.android.quickstep.fallback.window.RecentsDisplayModel;
+import com.android.quickstep.fallback.window.RecentsWindowFlags;
import com.android.quickstep.util.SplitTask;
import com.android.quickstep.views.RecentsView;
+import com.android.quickstep.views.RecentsViewContainer;
import com.android.systemui.shared.system.QuickStepContract.SystemUiStateFlags;
import com.android.wm.shell.shared.bubbles.BubbleBarLocation;
import com.android.wm.shell.shared.desktopmode.DesktopModeStatus;
@@ -100,6 +105,8 @@ public class LauncherTaskbarUIController extends TaskbarUIController {
// Initialized in init.
private final TaskbarLauncherStateController
mTaskbarLauncherStateController = new TaskbarLauncherStateController();
+ // When overview-in-a-window is enabled, that window is the container, else it is mLauncher.
+ private RecentsViewContainer mRecentsViewContainer;
public LauncherTaskbarUIController(QuickstepLauncher launcher) {
mLauncher = launcher;
@@ -112,8 +119,19 @@ public class LauncherTaskbarUIController extends TaskbarUIController {
mTaskbarLauncherStateController.init(mControllers, mLauncher,
mControllers.getSharedState().sysuiStateFlags);
-
+ final TaskbarActivityContext taskbarContext = mControllers.taskbarActivityContext;
+ if (RecentsWindowFlags.getEnableOverviewInWindow()) {
+ mRecentsViewContainer = RecentsDisplayModel.getINSTANCE()
+ .get(taskbarContext).getRecentsWindowManager(taskbarContext.getDisplayId());
+ }
+ if (mRecentsViewContainer == null) {
+ mRecentsViewContainer = mLauncher;
+ }
mLauncher.setTaskbarUIController(this);
+ if (mRecentsViewContainer != mLauncher) {
+ mRecentsViewContainer.setTaskbarUIController(this);
+ }
+
mHomeState.addListener(mVisibilityChangeListener);
onLauncherVisibilityChanged(
Flags.useActivityOverlay()
@@ -142,6 +160,9 @@ public class LauncherTaskbarUIController extends TaskbarUIController {
mTaskbarLauncherStateController.onDestroy();
mLauncher.setTaskbarUIController(null);
+ if (mRecentsViewContainer != mLauncher) {
+ mRecentsViewContainer.setTaskbarUIController(null);
+ }
mHomeState.removeListener(mVisibilityChangeListener);
}
@@ -203,13 +224,18 @@ public class LauncherTaskbarUIController extends TaskbarUIController {
*/
@Override
public void onLauncherVisibilityChanged(boolean isVisible) {
- if (DesktopModeStatus.enterDesktopByDefaultOnFreeformDisplay(mLauncher)) {
+ if (DesktopModeStatus.enterDesktopByDefaultOnFreeformDisplay(mLauncher)
+ && mControllers.taskbarActivityContext.isPrimaryDisplay()) {
DisplayController.INSTANCE.get(mLauncher).notifyConfigChange();
}
+
onLauncherVisibilityChanged(isVisible, false /* fromInit */);
}
private void onLauncherVisibilityChanged(boolean isVisible, boolean fromInitOrDestroy) {
+ if (mControllers == null) {
+ return;
+ }
onLauncherVisibilityChanged(
isVisible,
fromInitOrDestroy,
@@ -223,11 +249,12 @@ public class LauncherTaskbarUIController extends TaskbarUIController {
if (!Flags.predictiveBackToHomePolish()) {
shouldOverrideToFastAnimation |= mLauncher.getPredictiveBackToHomeInProgress();
}
- boolean isPinnedTaskbar = DisplayController.isPinnedTaskbar(mLauncher);
- if (isVisible || isPinnedTaskbar) {
- return getTaskbarToHomeDuration(shouldOverrideToFastAnimation, isPinnedTaskbar);
+
+ boolean isPinned = mControllers.taskbarActivityContext.isPinnedTaskbar();
+ if (isVisible || isPinned) {
+ return getTaskbarToHomeDuration(shouldOverrideToFastAnimation, isPinned);
} else {
- return mControllers.taskbarActivityContext.isTransientTaskbar()
+ return (mControllers.taskbarActivityContext.isTransientTaskbar())
? TRANSIENT_TASKBAR_TRANSITION_DURATION : TASKBAR_TO_APP_DURATION;
}
}
@@ -238,7 +265,7 @@ public class LauncherTaskbarUIController extends TaskbarUIController {
// Launcher is resumed during the swipe-to-overview gesture under shell-transitions, so
// avoid updating taskbar state in that situation (when it's non-interactive -- or
// "background") to avoid premature animations.
- LauncherState state = mLauncher.getStateManager().getState();
+ LauncherState state = mTaskbarLauncherStateController.getLauncherState();
boolean nonInteractiveState = state.hasFlag(FLAG_NON_INTERACTIVE)
&& !state.isTaskbarAlignedWithHotseat(mLauncher);
if (isVisible && (nonInteractiveState || mSkipLauncherVisibilityChange)) {
@@ -294,13 +321,16 @@ public class LauncherTaskbarUIController extends TaskbarUIController {
/**
* Create Taskbar animation when going from an app to Launcher as part of recents transition.
- * @param toState If known, the state we will end up in when reaching Launcher.
- * @param callbacks callbacks to track the recents animation lifecycle. The state change is
- * automatically reset once the recents animation finishes
+ * {@inheritDoc}
*/
- public Animator createAnimToLauncher(@NonNull LauncherState toState,
- @NonNull RecentsAnimationCallbacks callbacks, long duration) {
- return mTaskbarLauncherStateController.createAnimToLauncher(toState, callbacks, duration);
+ @Override
+ public Animator getParallelAnimationToGestureEndTarget(
+ GestureState.GestureEndTarget gestureEndTarget, long duration,
+ RecentsAnimationCallbacks callbacks) {
+ return mTaskbarLauncherStateController.createAnimToLauncher(
+ LauncherActivityInterface.INSTANCE.stateFromGestureEndTarget(gestureEndTarget),
+ callbacks,
+ duration);
}
/**
@@ -507,7 +537,7 @@ public class LauncherTaskbarUIController extends TaskbarUIController {
@Override
public RecentsView getRecentsView() {
- return mLauncher.getOverviewPanel();
+ return mRecentsViewContainer.getOverviewPanel();
}
@Override
@@ -536,6 +566,7 @@ public class LauncherTaskbarUIController extends TaskbarUIController {
"WIDGETS_PAGE_PROGRESS_INDEX",
"SYSUI_SURFACE_PROGRESS_INDEX",
"LAUNCHER_PAUSE_PROGRESS_INDEX");
+ pw.println(String.format("%s\tmRecentsWindowContainer=%s", prefix, mRecentsViewContainer));
mTaskbarLauncherStateController.dumpLogs(prefix + "\t", pw);
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java
index 7d2dc71961..cf3b95274a 100644
--- a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java
@@ -72,6 +72,7 @@ import android.graphics.drawable.Drawable;
import android.graphics.drawable.PaintDrawable;
import android.graphics.drawable.RotateDrawable;
import android.inputmethodservice.InputMethodService;
+import android.os.Bundle;
import android.os.Handler;
import android.os.SystemProperties;
import android.util.Property;
@@ -84,6 +85,7 @@ import android.view.View.OnAttachStateChangeListener;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.WindowManager;
+import android.view.accessibility.AccessibilityNodeInfo;
import android.view.inputmethod.Flags;
import android.widget.FrameLayout;
import android.widget.ImageView;
@@ -682,12 +684,20 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT
/**
* Sets the AccessibilityDelegate for the back button.
+ *
+ * When setting a back button accessibility delegate, make sure to not dispatch any duplicate
+ * click events. Click events get injected in the internal accessibility delegate in
+ * {@link #setupBackButtonAccessibility(View, AccessibilityDelegate)}.
*/
public void setBackButtonAccessibilityDelegate(AccessibilityDelegate accessibilityDelegate) {
if (mBackButton == null) {
return;
}
- mBackButton.setAccessibilityDelegate(accessibilityDelegate);
+ if (predictiveBackThreeButtonNav()) {
+ setupBackButtonAccessibility(mBackButton, accessibilityDelegate);
+ } else {
+ mBackButton.setAccessibilityDelegate(accessibilityDelegate);
+ }
}
public void setWallpaperVisible(boolean isVisible) {
@@ -879,6 +889,7 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT
navButtonController.getButtonContentDescription(buttonType)));
if (predictiveBackThreeButtonNav() && buttonType == BUTTON_BACK) {
// set up special touch listener for back button to support predictive back
+ setupBackButtonAccessibility(buttonView, null);
setBackButtonTouchListener(buttonView, navButtonController);
// Set this View clickable, so that NearestTouchFrame.java forwards closeby touches to
// this View
@@ -892,6 +903,28 @@ public class NavbarButtonsViewController implements TaskbarControllers.LoggableT
return buttonView;
}
+ private void setupBackButtonAccessibility(View backButton,
+ AccessibilityDelegate accessibilityDelegate) {
+ View.AccessibilityDelegate backButtonAccessibilityDelegate =
+ new View.AccessibilityDelegate() {
+ @Override
+ public boolean performAccessibilityAction(View host, int action, Bundle args) {
+ if (accessibilityDelegate != null) {
+ accessibilityDelegate.performAccessibilityAction(host, action, args);
+ }
+ if (action == AccessibilityNodeInfo.ACTION_CLICK) {
+ mControllers.navButtonController.sendBackKeyEvent(KeyEvent.ACTION_DOWN,
+ /*cancelled*/ false);
+ mControllers.navButtonController.sendBackKeyEvent(KeyEvent.ACTION_UP,
+ /*cancelled*/ false);
+ return true;
+ }
+ return super.performAccessibilityAction(host, action, args);
+ }
+ };
+ backButton.setAccessibilityDelegate(backButtonAccessibilityDelegate);
+ }
+
private void setBackButtonTouchListener(View buttonView,
TaskbarNavButtonController navButtonController) {
final RectF rect = new RectF();
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
index a6482691c9..fc93d4a0ab 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarActivityContext.java
@@ -65,6 +65,7 @@ import android.content.pm.LauncherApps;
import android.content.res.Resources;
import android.graphics.PixelFormat;
import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
import android.hardware.display.DisplayManager;
import android.os.IRemoteCallback;
import android.os.Process;
@@ -98,6 +99,7 @@ import com.android.launcher3.Flags;
import com.android.launcher3.LauncherPrefs;
import com.android.launcher3.LauncherSettings.Favorites;
import com.android.launcher3.R;
+import com.android.launcher3.Utilities;
import com.android.launcher3.allapps.ActivityAllAppsContainerView;
import com.android.launcher3.anim.AnimatorListeners;
import com.android.launcher3.anim.AnimatorPlaybackController;
@@ -107,6 +109,8 @@ import com.android.launcher3.desktop.DesktopAppLaunchTransition;
import com.android.launcher3.desktop.DesktopAppLaunchTransition.AppLaunchType;
import com.android.launcher3.folder.Folder;
import com.android.launcher3.folder.FolderIcon;
+import com.android.launcher3.icons.BitmapRenderer;
+import com.android.launcher3.icons.FastBitmapDrawable;
import com.android.launcher3.logger.LauncherAtom;
import com.android.launcher3.logging.StatsLogManager;
import com.android.launcher3.model.data.AppInfo;
@@ -141,6 +145,7 @@ import com.android.launcher3.taskbar.customization.TaskbarFeatureEvaluator;
import com.android.launcher3.taskbar.customization.TaskbarSpecsEvaluator;
import com.android.launcher3.taskbar.growth.NudgeController;
import com.android.launcher3.taskbar.navbutton.NearestTouchFrame;
+import com.android.launcher3.taskbar.overlay.TaskbarOverlayContext;
import com.android.launcher3.taskbar.overlay.TaskbarOverlayController;
import com.android.launcher3.testing.TestLogging;
import com.android.launcher3.testing.shared.TestProtocol;
@@ -161,6 +166,7 @@ import com.android.launcher3.util.SplitConfigurationOptions.SplitSelectSource;
import com.android.launcher3.util.TraceHelper;
import com.android.launcher3.util.VibratorWrapper;
import com.android.launcher3.views.ActivityContext;
+import com.android.launcher3.views.BaseDragLayer;
import com.android.quickstep.NavHandle;
import com.android.quickstep.RecentsModel;
import com.android.quickstep.SystemUiProxy;
@@ -171,6 +177,7 @@ import com.android.quickstep.util.SplitTask;
import com.android.quickstep.views.DesktopTaskView;
import com.android.quickstep.views.RecentsView;
import com.android.quickstep.views.TaskView;
+import com.android.systemui.animation.ViewRootSync;
import com.android.systemui.shared.recents.model.Task;
import com.android.systemui.shared.rotation.RotationButtonController;
import com.android.systemui.shared.statusbar.phone.BarTransitions;
@@ -199,7 +206,7 @@ public class TaskbarActivityContext extends BaseTaskbarContext {
private static final String WINDOW_TITLE = "Taskbar";
- private static final DesktopModeFlag ENABLE_TASKBAR_BEHIND_SHADE = new DesktopModeFlag(
+ protected static final DesktopModeFlag ENABLE_TASKBAR_BEHIND_SHADE = new DesktopModeFlag(
Flags::enableTaskbarBehindShade, false);
private final @Nullable Context mNavigationBarPanelContext;
@@ -252,6 +259,10 @@ public class TaskbarActivityContext extends BaseTaskbarContext {
private TaskbarSpecsEvaluator mTaskbarSpecsEvaluator;
+ // Snapshot is used to temporarily draw taskbar behind the shade.
+ private @Nullable View mTaskbarSnapshotView;
+ private @Nullable TaskbarOverlayContext mTaskbarSnapshotOverlay;
+
public TaskbarActivityContext(Context windowContext,
@Nullable Context navigationBarPanelContext, DeviceProfile launcherDp,
TaskbarNavButtonController buttonController,
@@ -406,9 +417,41 @@ public class TaskbarActivityContext extends BaseTaskbarContext {
dispatchDeviceProfileChanged();
}
- /** Returns whether current taskbar is transient. */
+ @Override
public boolean isTransientTaskbar() {
- return super.isTransientTaskbar() && !isPhoneMode();
+ return DisplayController.isTransientTaskbar(this) && mIsPrimaryDisplay && !isPhoneMode();
+ }
+
+ @Override
+ public boolean isPinnedTaskbar() {
+ return DisplayController.isPinnedTaskbar(this);
+ }
+
+ @Override
+ public NavigationMode getNavigationMode() {
+ return isPrimaryDisplay() ? DisplayController.getNavigationMode(this)
+ : NavigationMode.THREE_BUTTONS;
+ }
+
+ @Override
+ public boolean isInDesktopMode() {
+ return mControllers != null
+ && mControllers.taskbarDesktopModeController.isInDesktopMode(getDisplayId());
+ }
+
+ @Override
+ public boolean showLockedTaskbarOnHome() {
+ return DisplayController.showLockedTaskbarOnHome(this);
+ }
+
+ @Override
+ public boolean showDesktopTaskbarForFreeformDisplay() {
+ return DisplayController.showDesktopTaskbarForFreeformDisplay(this);
+ }
+
+ @Override
+ public boolean isPrimaryDisplay() {
+ return mIsPrimaryDisplay;
}
/**
@@ -444,9 +487,7 @@ public class TaskbarActivityContext extends BaseTaskbarContext {
.setIsTransientTaskbar(true)
.build();
}
- mNavMode = (DesktopExperienceFlags.ENABLE_TASKBAR_CONNECTED_DISPLAYS.isTrue()
- && !mIsPrimaryDisplay) ? NavigationMode.THREE_BUTTONS
- : DisplayController.getNavigationMode(this);
+ mNavMode = getNavigationMode();
}
/** Called when the visibility of the bubble bar changed. */
@@ -655,8 +696,7 @@ public class TaskbarActivityContext extends BaseTaskbarContext {
*/
public WindowManager.LayoutParams createDefaultWindowLayoutParams(int type, String title) {
int windowFlags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
- | WindowManager.LayoutParams.FLAG_SLIPPERY
- | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH;
+ | WindowManager.LayoutParams.FLAG_SLIPPERY;
boolean watchOutside = isTransientTaskbar() || isThreeButtonNav();
if (watchOutside && !isRunningInTestHarness()) {
windowFlags |= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
@@ -997,6 +1037,8 @@ public class TaskbarActivityContext extends BaseTaskbarContext {
mWindowManager.removeViewImmediate(mDragLayer);
mAddedWindow = false;
}
+ mTaskbarSnapshotView = null;
+ mTaskbarSnapshotOverlay = null;
}
public boolean isDestroyed() {
@@ -1068,6 +1110,80 @@ public class TaskbarActivityContext extends BaseTaskbarContext {
if (skipAnim) {
anim.end();
}
+
+ updateTaskbarSnapshot(anim, isExpanded);
+ }
+
+ private void updateTaskbarSnapshot(AnimatorSet anim, boolean isExpanded) {
+ if (!ENABLE_TASKBAR_BEHIND_SHADE.isTrue()) {
+ return;
+ }
+ if (mTaskbarSnapshotView == null) {
+ mTaskbarSnapshotView = new View(this);
+ }
+ if (isExpanded) {
+ if (!mTaskbarSnapshotView.isAttachedToWindow()
+ && mDragLayer.isAttachedToWindow()
+ && mDragLayer.isLaidOut()
+ && mTaskbarSnapshotView.getParent() == null) {
+ NearestTouchFrame navButtonsView = mDragLayer.findViewById(R.id.navbuttons_view);
+ int oldNavButtonsVisibility = navButtonsView.getVisibility();
+ navButtonsView.setVisibility(View.INVISIBLE);
+
+ Drawable drawable = new FastBitmapDrawable(BitmapRenderer.createHardwareBitmap(
+ mDragLayer.getWidth(),
+ mDragLayer.getHeight(),
+ mDragLayer::draw));
+
+ navButtonsView.setVisibility(oldNavButtonsVisibility);
+ mTaskbarSnapshotView.setBackground(drawable);
+ mTaskbarSnapshotView.setAlpha(0f);
+
+ mTaskbarSnapshotView.addOnAttachStateChangeListener(
+ new View.OnAttachStateChangeListener() {
+ @Override
+ public void onViewAttachedToWindow(@NonNull View v) {
+ mTaskbarSnapshotView.removeOnAttachStateChangeListener(this);
+ anim.end();
+ mTaskbarSnapshotView.setAlpha(1f);
+ if (!Utilities.isRunningInTestHarness()) {
+ ViewRootSync.synchronizeNextDraw(mDragLayer,
+ mTaskbarSnapshotView,
+ () -> {});
+ }
+ }
+
+ @Override
+ public void onViewDetachedFromWindow(@NonNull View v) {}
+ });
+ BaseDragLayer.LayoutParams layoutParams = new BaseDragLayer.LayoutParams(
+ mDragLayer.getWidth(), mDragLayer.getHeight());
+ layoutParams.gravity = mWindowLayoutParams.gravity;
+ layoutParams.ignoreInsets = true;
+ mTaskbarSnapshotOverlay = mControllers.taskbarOverlayController.requestWindow();
+ mTaskbarSnapshotOverlay.getDragLayer().addView(mTaskbarSnapshotView, layoutParams);
+ }
+ } else {
+ Runnable removeSnapshotView = () -> {
+ if (mTaskbarSnapshotOverlay != null) {
+ mTaskbarSnapshotOverlay.getDragLayer().removeView(mTaskbarSnapshotView);
+ mTaskbarSnapshotView = null;
+ mTaskbarSnapshotOverlay = null;
+ }
+ };
+ if (mTaskbarSnapshotView.isAttachedToWindow()) {
+ mTaskbarSnapshotView.setAlpha(0f);
+ anim.end();
+ if (Utilities.isRunningInTestHarness()) {
+ removeSnapshotView.run();
+ } else {
+ ViewRootSync.synchronizeNextDraw(mDragLayer, mTaskbarSnapshotView,
+ removeSnapshotView);
+ }
+ } else {
+ removeSnapshotView.run();
+ }
+ }
}
public void onRotationProposal(int rotation, boolean isValid) {
@@ -1339,11 +1455,6 @@ public class TaskbarActivityContext extends BaseTaskbarContext {
mControllers.uiController.startSplitSelection(splitSelectSource);
}
- boolean isInDesktopMode() {
- return mControllers != null
- && mControllers.taskbarDesktopModeController.isInDesktopMode(getDisplayId());
- }
-
protected void onTaskbarIconClicked(View view) {
TaskbarUIController taskbarUIController = mControllers.uiController;
RecentsView recents = taskbarUIController.getRecentsView();
@@ -1482,8 +1593,7 @@ public class TaskbarActivityContext extends BaseTaskbarContext {
} else if (tag instanceof AppInfo) {
// Tapping an item in AllApps
AppInfo info = (AppInfo) tag;
- if (recents != null
- && taskbarUIController.getRecentsView().isSplitSelectionActive()) {
+ if (recents != null && recents.isSplitSelectionActive()) {
// If we are selecting a second app for split, launch the split tasks
taskbarUIController.triggerSecondAppForSplit(info, info.intent, view);
} else {
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarDesktopModeController.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarDesktopModeController.kt
index ca8e4cad9f..e96e67dfbc 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarDesktopModeController.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarDesktopModeController.kt
@@ -20,7 +20,6 @@ import android.content.Context
import com.android.launcher3.statehandlers.DesktopVisibilityController
import com.android.launcher3.statehandlers.DesktopVisibilityController.TaskbarDesktopModeListener
import com.android.launcher3.taskbar.TaskbarBackgroundRenderer.Companion.MAX_ROUNDNESS
-import com.android.launcher3.util.DisplayController
/** Handles Taskbar in Desktop Windowing mode. */
class TaskbarDesktopModeController(
@@ -30,9 +29,6 @@ class TaskbarDesktopModeController(
private lateinit var taskbarControllers: TaskbarControllers
private lateinit var taskbarSharedState: TaskbarSharedState
- val isInDesktopMode: Boolean
- get() = desktopVisibilityController.isInDesktopMode
-
fun init(controllers: TaskbarControllers, sharedState: TaskbarSharedState) {
taskbarControllers = controllers
taskbarSharedState = sharedState
@@ -52,9 +48,10 @@ class TaskbarDesktopModeController(
}
fun shouldShowDesktopTasksInTaskbar(): Boolean {
+ val activityContext = taskbarControllers.taskbarActivityContext
return isInDesktopMode(context.displayId) ||
- DisplayController.showDesktopTaskbarForFreeformDisplay(context) ||
- (DisplayController.showLockedTaskbarOnHome(context) &&
+ activityContext.showDesktopTaskbarForFreeformDisplay() ||
+ (activityContext.showLockedTaskbarOnHome() &&
taskbarControllers.taskbarStashController.isOnHome)
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java
index 142f458b3b..4b977e0d23 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarDragController.java
@@ -510,6 +510,8 @@ public class TaskbarDragController extends DragController<BaseTaskbarContext> im
} else {
// This will take care of calling maybeOnDragEnd() after the animation
animateGlobalDragViewToOriginalPosition(btv, dragEvent);
+ //TODO(b/399678274): hide drop target in shell
+ notifyBubbleBarItemDragCanceled();
}
mActivity.getDragLayer().setOnDragListener(null);
@@ -536,10 +538,10 @@ public class TaskbarDragController extends DragController<BaseTaskbarContext> im
mControllers.taskbarAutohideSuspendController.updateFlag(
TaskbarAutohideSuspendController.FLAG_AUTOHIDE_SUSPEND_DRAGGING, false);
mActivity.onDragEnd();
+ // If an item is dropped on the bubble bar, the bubble bar handles the drop,
+ // so it should not collapse along with the taskbar.
+ boolean droppedOnBubbleBar = notifyBubbleBarItemDropped();
if (mReturnAnimator == null) {
- // If an item is dropped on the bubble bar, the bubble bar handles the drop,
- // so it should not collapse along with the taskbar.
- boolean droppedOnBubbleBar = notifyBubbleBarItemDropped();
// Upon successful drag, immediately stash taskbar.
// Note, this must be done last to ensure no AutohideSuspendFlags are active, as
// that will prevent us from stashing until the timeout.
@@ -563,12 +565,17 @@ public class TaskbarDragController extends DragController<BaseTaskbarContext> im
BubbleBarViewController bubbleBarViewController = bc.bubbleBarViewController;
boolean showingDropTarget = bubbleBarViewController.isShowingDropTarget();
if (showingDropTarget) {
- bubbleBarViewController.onItemDroppedInBubbleBarDragZone();
+ bubbleBarViewController.onItemDragCompleted();
}
return showingDropTarget;
}).orElse(false);
}
+ private void notifyBubbleBarItemDragCanceled() {
+ mControllers.bubbleControllers.ifPresent(bc ->
+ bc.bubbleBarViewController.onItemDraggedOutsideBubbleBarDropZone());
+ }
+
@Override
protected void endDrag() {
if (mDisallowGlobalDrag && !mIsDropHandledByDropTarget) {
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarEduTooltipController.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarEduTooltipController.kt
index 7a23006b4f..038e374a64 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarEduTooltipController.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarEduTooltipController.kt
@@ -44,7 +44,6 @@ import com.android.launcher3.Utilities
import com.android.launcher3.config.FeatureFlags.enableTaskbarPinning
import com.android.launcher3.taskbar.TaskbarAutohideSuspendController.FLAG_AUTOHIDE_SUSPEND_EDU_OPEN
import com.android.launcher3.taskbar.TaskbarControllers.LoggableTaskbarController
-import com.android.launcher3.util.DisplayController
import com.android.launcher3.util.OnboardingPrefs.TASKBAR_EDU_TOOLTIP_STEP
import com.android.launcher3.util.OnboardingPrefs.TASKBAR_SEARCH_EDU_SEEN
import com.android.launcher3.util.ResourceBasedOverride
@@ -319,7 +318,7 @@ open class TaskbarEduTooltipController(context: Context) :
fun maybeShowSearchEdu() {
if (
!enableTaskbarPinning() ||
- !DisplayController.isPinnedTaskbar(activityContext) ||
+ !activityContext.isPinnedTaskbar ||
!isTooltipEnabled ||
!shouldShowSearchEdu ||
userHasSeenSearchEdu ||
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarHoverToolTipController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarHoverToolTipController.java
index b7000dbbb0..76489e0fa1 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarHoverToolTipController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarHoverToolTipController.java
@@ -19,6 +19,7 @@ import static android.view.MotionEvent.ACTION_HOVER_ENTER;
import static android.view.MotionEvent.ACTION_HOVER_EXIT;
import static android.view.View.ALPHA;
+import static com.android.launcher3.AbstractFloatingView.TYPE_ACTION_POPUP;
import static com.android.launcher3.AbstractFloatingView.TYPE_FOLDER;
import static com.android.launcher3.taskbar.TaskbarAutohideSuspendController.FLAG_AUTOHIDE_SUSPEND_HOVERING_ICONS;
@@ -98,20 +99,18 @@ public class TaskbarHoverToolTipController implements View.OnHoverListener {
@Override
public boolean onHover(View v, MotionEvent event) {
- boolean isFolderOpen = AbstractFloatingView.hasOpenView(mActivity, TYPE_FOLDER);
// If hover leaves a taskbar icon animate the tooltip closed.
if (event.getAction() == ACTION_HOVER_EXIT) {
mHoverToolTipView.close(/* animate= */ false);
mActivity.setAutohideSuspendFlag(FLAG_AUTOHIDE_SUSPEND_HOVERING_ICONS, false);
- } else if (!isFolderOpen && event.getAction() == ACTION_HOVER_ENTER) {
- // Do not reveal if any floating views such as folders or edu pop-ups are open.
- revealHoverToolTip();
+ } else if (event.getAction() == ACTION_HOVER_ENTER) {
+ maybeRevealHoverToolTip();
mActivity.setAutohideSuspendFlag(FLAG_AUTOHIDE_SUSPEND_HOVERING_ICONS, true);
}
return false;
}
- private void revealHoverToolTip() {
+ private void maybeRevealHoverToolTip() {
if (mHoverView == null || mToolTipText == null) {
return;
}
@@ -122,6 +121,12 @@ public class TaskbarHoverToolTipController implements View.OnHoverListener {
if (mHoverView instanceof FolderIcon && !((FolderIcon) mHoverView).getIconVisible()) {
return;
}
+ // Do not reveal if floating views such as folders or app pop-ups are open,
+ // as these views will overlap and not look great.
+ if (AbstractFloatingView.hasOpenView(mActivity, TYPE_FOLDER | TYPE_ACTION_POPUP)) {
+ return;
+ }
+
Rect iconViewBounds = Utilities.getViewBounds(mHoverView);
mHoverToolTipView.showAtLocation(mToolTipText, iconViewBounds.centerX(),
mTaskbarView.getTop() - mYOffset, /* shouldAutoClose= */ false);
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt
index 3af2ab6d3c..f342fa52b3 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarInsetsController.kt
@@ -51,7 +51,6 @@ import com.android.launcher3.config.FeatureFlags.ENABLE_TASKBAR_NAVBAR_UNIFICATI
import com.android.launcher3.config.FeatureFlags.enableTaskbarNoRecreate
import com.android.launcher3.taskbar.TaskbarControllers.LoggableTaskbarController
import com.android.launcher3.testing.shared.ResourceUtils
-import com.android.launcher3.util.DisplayController
import com.android.launcher3.util.Executors
import java.io.PrintWriter
import kotlin.jvm.optionals.getOrNull
@@ -150,7 +149,7 @@ class TaskbarInsetsController(val context: TaskbarActivityContext) : LoggableTas
if (
taskbarStashController.isInApp ||
controllers.uiController.isInOverviewUi ||
- DisplayController.showLockedTaskbarOnHome(context)
+ context.showLockedTaskbarOnHome()
) {
// only add the taskbar touch region if not on home
val bottom = windowLayoutParams.height
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java
index b510e7ebb5..77c3e0a41c 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java
@@ -33,6 +33,7 @@ import static com.android.launcher3.taskbar.bubbles.BubbleBarView.FADE_IN_ANIM_A
import static com.android.launcher3.taskbar.bubbles.BubbleBarView.FADE_OUT_ANIM_POSITION_DURATION_MS;
import static com.android.launcher3.util.FlagDebugUtils.appendFlag;
import static com.android.launcher3.util.FlagDebugUtils.formatFlagChange;
+import static com.android.quickstep.fallback.RecentsStateUtilsKt.toLauncherState;
import static com.android.quickstep.util.SystemUiFlagUtils.isTaskbarHidden;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_AWAKE;
@@ -40,7 +41,6 @@ import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
-import android.content.Context;
import android.os.SystemClock;
import android.util.Log;
import android.view.animation.Interpolator;
@@ -61,10 +61,13 @@ import com.android.launcher3.anim.AnimatorListeners;
import com.android.launcher3.statemanager.StateManager;
import com.android.launcher3.taskbar.bubbles.stashing.BubbleStashController.BubbleLauncherState;
import com.android.launcher3.uioverrides.QuickstepLauncher;
-import com.android.launcher3.util.DisplayController;
import com.android.launcher3.util.MultiPropertyFactory.MultiProperty;
import com.android.quickstep.RecentsAnimationCallbacks;
import com.android.quickstep.RecentsAnimationController;
+import com.android.quickstep.fallback.RecentsState;
+import com.android.quickstep.fallback.window.RecentsDisplayModel;
+import com.android.quickstep.fallback.window.RecentsWindowFlags;
+import com.android.quickstep.fallback.window.RecentsWindowManager;
import com.android.quickstep.util.ScalingWorkspaceRevealAnim;
import com.android.quickstep.util.SystemUiFlagUtils;
import com.android.quickstep.views.RecentsView;
@@ -76,6 +79,7 @@ import com.android.wm.shell.shared.bubbles.BubbleBarLocation;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.StringJoiner;
+import java.util.function.Consumer;
/**
* Track LauncherState, RecentsAnimation, resumed state for task bar in one place here and animate
@@ -211,7 +215,7 @@ public class TaskbarLauncherStateController {
};
private final StateManager.StateListener<LauncherState> mStateListener =
- new StateManager.StateListener<LauncherState>() {
+ new StateManager.StateListener<>() {
@Override
public void onStateTransitionStart(LauncherState toState) {
@@ -225,11 +229,9 @@ public class TaskbarLauncherStateController {
updateStateForFlag(FLAG_LAUNCHER_IN_STATE_TRANSITION, true);
if (!mShouldDelayLauncherStateAnim) {
if (toState == LauncherState.NORMAL) {
+ TaskbarActivityContext activity = mControllers.taskbarActivityContext;
boolean isPinnedTaskbarAndNotInDesktopMode =
- DisplayController.isPinnedTaskbar(
- mControllers.taskbarActivityContext)
- && !DisplayController.isInDesktopMode(
- mControllers.taskbarActivityContext);
+ !activity.isInDesktopMode() && activity.isPinnedTaskbar();
applyState(QuickstepTransitionManager.getTaskbarToHomeDuration(
isPinnedTaskbarAndNotInDesktopMode));
} else {
@@ -247,6 +249,20 @@ public class TaskbarLauncherStateController {
}
};
+ private final StateManager.StateListener<RecentsState> mRecentsStateListener =
+ new StateManager.StateListener<>() {
+
+ @Override
+ public void onStateTransitionStart(RecentsState toState) {
+ mStateListener.onStateTransitionStart(toLauncherState(toState));
+ }
+
+ @Override
+ public void onStateTransitionComplete(RecentsState finalState) {
+ mStateListener.onStateTransitionComplete(toLauncherState(finalState));
+ }
+ };
+
/**
* Callback for when launcher state transition completes after user swipes to home.
* @param finalState The final state of the transition.
@@ -282,6 +298,8 @@ public class TaskbarLauncherStateController {
if (!mControllers.taskbarActivityContext.isPhoneMode()) {
mLauncher.getStateManager().addStateListener(mStateListener);
+ runForRecentsWindowManager(recentsWindowManager ->
+ recentsWindowManager.getStateManager().addStateListener(mRecentsStateListener));
}
mLauncherState = launcher.getStateManager().getState();
updateStateForSysuiFlags(sysuiStateFlags, /*applyState*/ false);
@@ -306,6 +324,8 @@ public class TaskbarLauncherStateController {
mLauncher.getHotseat().setIconsAlpha(1f, ALPHA_CHANNEL_TASKBAR_ALIGNMENT);
mLauncher.getStateManager().removeStateListener(mStateListener);
+ runForRecentsWindowManager(recentsWindowManager ->
+ recentsWindowManager.getStateManager().removeStateListener(mRecentsStateListener));
mCanSyncViews = !mControllers.taskbarActivityContext.isPhoneMode();
mLauncher.removeOnDeviceProfileChangeListener(mOnDeviceProfileChangeListener);
@@ -344,12 +364,15 @@ public class TaskbarLauncherStateController {
}
mTaskBarRecentsAnimationListener = new TaskBarRecentsAnimationListener(callbacks);
callbacks.addListener(mTaskBarRecentsAnimationListener);
- ((RecentsView) mLauncher.getOverviewPanel()).setTaskLaunchListener(() ->
- mTaskBarRecentsAnimationListener.endGestureStateOverride(true, false /*canceled*/));
+ RecentsView recentsView = mControllers.uiController.getRecentsView();
+ if (recentsView != null) {
+ recentsView.setTaskLaunchListener(() -> mTaskBarRecentsAnimationListener
+ .endGestureStateOverride(true, false /*canceled*/));
+ recentsView.setTaskLaunchCancelledRunnable(() -> {
+ updateStateForUserFinishedToApp(false /* finishedToApp */);
+ });
+ }
- ((RecentsView) mLauncher.getOverviewPanel()).setTaskLaunchCancelledRunnable(() -> {
- updateStateForUserFinishedToApp(false /* finishedToApp */);
- });
return animatorSet;
}
@@ -475,8 +498,8 @@ public class TaskbarLauncherStateController {
final boolean isIconAlignedWithHotseat = isIconAlignedWithHotseat();
final float toAlignment = isIconAlignedWithHotseat ? 1 : 0;
boolean handleOpenFloatingViews = false;
- boolean isPinnedTaskbar = DisplayController.isPinnedTaskbar(
- mControllers.taskbarActivityContext);
+ boolean isPinnedTaskbar =
+ mControllers.taskbarActivityContext.isPinnedTaskbar();
if (DEBUG) {
Log.d(TAG, "onStateChangeApplied - isInLauncher: " + isInLauncher
+ ", mLauncherState: " + mLauncherState
@@ -590,7 +613,8 @@ public class TaskbarLauncherStateController {
float backgroundAlpha = isInLauncher && isTaskbarAlignedWithHotseat() ? 0 : 1;
AnimatedFloat taskbarBgOffset =
mControllers.taskbarDragLayerController.getTaskbarBackgroundOffset();
- boolean showTaskbar = shouldShowTaskbar(mLauncher, isInLauncher, isInOverview);
+ boolean showTaskbar = shouldShowTaskbar(mControllers.taskbarActivityContext, isInLauncher,
+ isInOverview);
float taskbarBgOffsetEnd = showTaskbar ? 0f : 1f;
float taskbarBgOffsetStart = showTaskbar ? 1f : 0f;
@@ -727,13 +751,13 @@ public class TaskbarLauncherStateController {
return animatorSet;
}
- private static boolean shouldShowTaskbar(Context context, boolean isInLauncher,
- boolean isInOverview) {
- if (DisplayController.showDesktopTaskbarForFreeformDisplay(context)) {
+ private static boolean shouldShowTaskbar(TaskbarActivityContext activityContext,
+ boolean isInLauncher, boolean isInOverview) {
+ if (activityContext.showDesktopTaskbarForFreeformDisplay()) {
return true;
}
- if (DisplayController.showLockedTaskbarOnHome(context) && isInLauncher) {
+ if (activityContext.showLockedTaskbarOnHome() && isInLauncher) {
return true;
}
return !isInLauncher || isInOverview;
@@ -788,11 +812,11 @@ public class TaskbarLauncherStateController {
* This refers to the intended state - a transition to this state might be in progress.
*/
public boolean isTaskbarAlignedWithHotseat() {
- if (DisplayController.showDesktopTaskbarForFreeformDisplay(mLauncher)) {
+ if (mControllers.taskbarActivityContext.showDesktopTaskbarForFreeformDisplay()) {
return false;
}
- if (DisplayController.showLockedTaskbarOnHome(mLauncher) && isInLauncher()) {
+ if (mControllers.taskbarActivityContext.showLockedTaskbarOnHome() && isInLauncher()) {
return false;
}
@@ -826,6 +850,15 @@ public class TaskbarLauncherStateController {
return mLauncherState.isRecentsViewVisible;
}
+ /**
+ * Returns the current mLauncherState. Note that this could represent RecentsState as well, as
+ * we convert those to equivalent LauncherStates even if Launcher Activity is not actually in
+ * those states (for the case where the state is represented in a separate Window instead).
+ */
+ public LauncherState getLauncherState() {
+ return mLauncherState;
+ }
+
private void playStateTransitionAnim(AnimatorSet animatorSet, long duration,
boolean committed) {
boolean isInStashedState = mLauncherState.isTaskbarStashed(mLauncher);
@@ -1063,7 +1096,10 @@ public class TaskbarLauncherStateController {
boolean canceled) {
mCallbacks.removeListener(this);
mTaskBarRecentsAnimationListener = null;
- ((RecentsView) mLauncher.getOverviewPanel()).setTaskLaunchListener(null);
+ RecentsView recentsView = mControllers.uiController.getRecentsView();
+ if (recentsView != null) {
+ recentsView.setTaskLaunchListener(null);
+ }
if (mSkipNextRecentsAnimEnd && !canceled) {
mSkipNextRecentsAnimEnd = false;
@@ -1102,6 +1138,20 @@ public class TaskbarLauncherStateController {
controller.applyState();
}
+ /**
+ * Helper function to run a callback on the RecentsWindowManager (if it exists).
+ */
+ private void runForRecentsWindowManager(Consumer<RecentsWindowManager> callback) {
+ if (RecentsWindowFlags.getEnableOverviewInWindow()) {
+ final TaskbarActivityContext taskbarContext = mControllers.taskbarActivityContext;
+ RecentsWindowManager recentsWindowManager = RecentsDisplayModel.getINSTANCE()
+ .get(taskbarContext).getRecentsWindowManager(taskbarContext.getDisplayId());
+ if (recentsWindowManager != null) {
+ callback.accept(recentsWindowManager);
+ }
+ }
+ }
+
private static String getStateString(int flags) {
StringJoiner result = new StringJoiner("|");
appendFlag(result, flags, FLAG_VISIBLE, "flag_visible");
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
index b5e271d07f..f3cbdb5a2a 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
@@ -17,8 +17,8 @@ package com.android.launcher3.taskbar;
import static android.content.Context.RECEIVER_EXPORTED;
import static android.content.Context.RECEIVER_NOT_EXPORTED;
-import static android.content.pm.PackageManager.FEATURE_PC;
import static android.content.pm.PackageManager.FEATURE_FREEFORM_WINDOW_MANAGEMENT;
+import static android.content.pm.PackageManager.FEATURE_PC;
import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR;
import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR_PANEL;
@@ -82,6 +82,8 @@ import com.android.launcher3.util.SettingsCache;
import com.android.launcher3.util.SimpleBroadcastReceiver;
import com.android.quickstep.AllAppsActionManager;
import com.android.quickstep.RecentsActivity;
+import com.android.quickstep.SystemDecorationChangeObserver;
+import com.android.quickstep.SystemDecorationChangeObserver.DisplayDecorationListener;
import com.android.quickstep.SystemUiProxy;
import com.android.quickstep.fallback.window.RecentsDisplayModel;
import com.android.quickstep.fallback.window.RecentsWindowFlags;
@@ -107,7 +109,7 @@ import java.util.StringJoiner;
/**
* Class to manage taskbar lifecycle
*/
-public class TaskbarManager {
+public class TaskbarManager implements DisplayDecorationListener {
private static final String TAG = "TaskbarManager";
private static final boolean DEBUG = false;
private static final int TASKBAR_DESTROY_DURATION = 100;
@@ -138,6 +140,7 @@ public class TaskbarManager {
Settings.Secure.NAV_BAR_KIDS_MODE);
private final Context mBaseContext;
+ private final int mPrimaryDisplayId;
private final TaskbarNavButtonCallbacks mNavCallbacks;
// TODO: Remove this during the connected displays lifecycle refactor.
private final Context mPrimaryWindowContext;
@@ -227,7 +230,7 @@ public class TaskbarManager {
}
// Only Handles Special Exit Cases for Desktop Mode Taskbar Recreation.
if (taskbarActivityContext != null
- && !DisplayController.showLockedTaskbarOnHome(context)) {
+ && !taskbarActivityContext.showLockedTaskbarOnHome()) {
recreateTaskbars();
}
} else {
@@ -434,26 +437,28 @@ public class TaskbarManager {
TaskbarNavButtonCallbacks navCallbacks,
RecentsDisplayModel recentsDisplayModel) {
mBaseContext = context;
+ mPrimaryDisplayId = mBaseContext.getDisplayId();
mAllAppsActionManager = allAppsActionManager;
mNavCallbacks = navCallbacks;
mRecentsDisplayModel = recentsDisplayModel;
// Set up primary display.
- int primaryDisplayId = getDefaultDisplayId();
debugPrimaryTaskbar("TaskbarManager constructor");
- mPrimaryWindowContext = createWindowContext(primaryDisplayId);
+ mPrimaryWindowContext = createWindowContext(getDefaultDisplayId());
mPrimaryWindowManager = mPrimaryWindowContext.getSystemService(WindowManager.class);
DesktopVisibilityController.INSTANCE.get(
mPrimaryWindowContext).registerTaskbarDesktopModeListener(
mTaskbarDesktopModeListener);
- createTaskbarRootLayout(primaryDisplayId);
- createNavButtonController(primaryDisplayId);
- createAndRegisterComponentCallbacks(primaryDisplayId);
+ createTaskbarRootLayout(getDefaultDisplayId());
+ createNavButtonController(getDefaultDisplayId());
+ createAndRegisterComponentCallbacks(getDefaultDisplayId());
SettingsCache.INSTANCE.get(mPrimaryWindowContext)
.register(USER_SETUP_COMPLETE_URI, mOnSettingsChangeListener);
SettingsCache.INSTANCE.get(mPrimaryWindowContext)
.register(NAV_BAR_KIDS_MODE, mOnSettingsChangeListener);
+ SystemDecorationChangeObserver.getINSTANCE().get(mPrimaryWindowContext)
+ .registerDisplayDecorationListener(this);
mShutdownReceiver =
new SimpleBroadcastReceiver(
mPrimaryWindowContext, UI_HELPER_EXECUTOR, i -> destroyAllTaskbars());
@@ -697,7 +702,9 @@ public class TaskbarManager {
private TaskbarUIController createTaskbarUIControllerForRecentsViewContainer(
RecentsViewContainer container) {
debugPrimaryTaskbar("createTaskbarUIControllerForRecentsViewContainer");
- if (container instanceof QuickstepLauncher quickstepLauncher) {
+ if (mActivity instanceof QuickstepLauncher quickstepLauncher) {
+ // If 1P Launcher is default, always use LauncherTaskbarUIController, regardless of
+ // whether the recents container is NexusLauncherActivity or RecentsWindowManager.
return new LauncherTaskbarUIController(quickstepLauncher);
}
// If a 3P Launcher is default, always use FallbackTaskbarUIController regardless of
@@ -955,6 +962,7 @@ public class TaskbarManager {
* Signal from SysUI indicating that a non-mirroring display was just connected to the
* primary device or a previously mirroring display is switched to extended mode.
*/
+ @Override
public void onDisplayAddSystemDecorations(int displayId) {
debugTaskbarManager("onDisplayAddSystemDecorations: ", displayId);
Display display = getDisplay(displayId);
@@ -1018,6 +1026,7 @@ public class TaskbarManager {
* Signal from SysUI indicating that a previously connected non-mirroring display was just
* removed from the primary device.
*/
+ @Override
public void onDisplayRemoved(int displayId) {
debugTaskbarManager("onDisplayRemoved: ", displayId);
if (!DesktopExperienceFlags.ENABLE_TASKBAR_CONNECTED_DISPLAYS.isTrue() || isDefaultDisplay(
@@ -1057,6 +1066,7 @@ public class TaskbarManager {
/**
* Signal from SysUI indicating that system decorations should be removed from the display.
*/
+ @Override
public void onDisplayRemoveSystemDecorations(int displayId) {
// The display mirroring starts. The handling logic is the same as when removing a
// display.
@@ -1100,6 +1110,8 @@ public class TaskbarManager {
.unregister(USER_SETUP_COMPLETE_URI, mOnSettingsChangeListener);
SettingsCache.INSTANCE.get(mPrimaryWindowContext)
.unregister(NAV_BAR_KIDS_MODE, mOnSettingsChangeListener);
+ SystemDecorationChangeObserver.getINSTANCE().get(mPrimaryWindowContext)
+ .unregisterDisplayDecorationListener(this);
debugPrimaryTaskbar("destroy: unregistering component callbacks");
removeAndUnregisterComponentCallbacks(getDefaultDisplayId());
mShutdownReceiver.unregisterReceiverSafely();
@@ -1667,7 +1679,7 @@ public class TaskbarManager {
}
private int getDefaultDisplayId() {
- return mBaseContext.getDisplayId();
+ return mPrimaryDisplayId;
}
/**
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java
index 1a6cd6042e..7f240bd781 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarPopupController.java
@@ -83,7 +83,7 @@ public class TaskbarPopupController implements TaskbarControllers.LoggableTaskba
// Initialized in init.
private TaskbarControllers mControllers;
private boolean mAllowInitialSplitSelection;
- private AppInfo[] mAppInfosList;
+ private AppInfo[] mAppInfosList = AppInfo.EMPTY_ARRAY;
// Saves the ItemInfos in the hotseat without the predicted items.
private SparseArray<ItemInfo> mHotseatInfosList;
private ManageWindowsTaskbarShortcut<BaseTaskbarContext> mManageWindowsTaskbarShortcut;
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java
index ad59c2e9d7..e597148462 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarStashController.java
@@ -28,6 +28,7 @@ import static com.android.launcher3.QuickstepTransitionManager.PINNED_TASKBAR_TR
import static com.android.launcher3.config.FeatureFlags.ENABLE_TASKBAR_NAVBAR_UNIFICATION;
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TRANSIENT_TASKBAR_HIDE;
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TRANSIENT_TASKBAR_SHOW;
+import static com.android.launcher3.taskbar.TaskbarActivityContext.ENABLE_TASKBAR_BEHIND_SHADE;
import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR;
import static com.android.launcher3.util.FlagDebugUtils.appendFlag;
import static com.android.launcher3.util.FlagDebugUtils.formatFlagChange;
@@ -65,7 +66,6 @@ import com.android.launcher3.R;
import com.android.launcher3.anim.AnimatedFloat;
import com.android.launcher3.anim.AnimationSuccessListener;
import com.android.launcher3.anim.AnimatorListeners;
-import com.android.launcher3.util.DisplayController;
import com.android.launcher3.util.MultiPropertyFactory.MultiProperty;
import com.android.quickstep.SystemUiProxy;
import com.android.quickstep.util.SystemUiFlagUtils;
@@ -306,8 +306,8 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba
// TODO(b/390665752): Feature to "lock" pinned taskbar to home screen will be superseded by
// pinning, in other launcher states, at which point this variable can be removed.
mInAppStateAffectsDesktopTasksVisibilityInTaskbar =
- !DisplayController.showDesktopTaskbarForFreeformDisplay(mActivity)
- && DisplayController.showLockedTaskbarOnHome(mActivity);
+ !mActivity.showDesktopTaskbarForFreeformDisplay()
+ && mActivity.showLockedTaskbarOnHome();
mTaskbarBackgroundDuration = activity.getResources().getInteger(
R.integer.taskbar_background_duration);
@@ -412,7 +412,7 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba
* Returns how long the stash/unstash animation should play.
*/
public long getStashDuration() {
- if (DisplayController.isPinnedTaskbar(mActivity)) {
+ if (mActivity.isPinnedTaskbar()) {
return PINNED_TASKBAR_TRANSITION_DURATION;
}
return mActivity.isTransientTaskbar() ? TRANSIENT_TASKBAR_STASH_DURATION
@@ -1138,7 +1138,10 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba
long startDelay = 0;
updateStateForFlag(FLAG_STASHED_IN_APP_SYSUI, hasAnyFlag(systemUiStateFlags,
- SYSUI_STATE_NOTIFICATION_PANEL_VISIBLE | SYSUI_STATE_DIALOG_SHOWING));
+ SYSUI_STATE_DIALOG_SHOWING | (ENABLE_TASKBAR_BEHIND_SHADE.isTrue()
+ ? 0
+ : SYSUI_STATE_NOTIFICATION_PANEL_VISIBLE)
+ ));
boolean stashForBubbles = hasAnyFlag(FLAG_IN_OVERVIEW)
&& hasAnyFlag(systemUiStateFlags, SYSUI_STATE_BUBBLES_EXPANDED)
@@ -1182,7 +1185,7 @@ public class TaskbarStashController implements TaskbarControllers.LoggableTaskba
}
// Do not stash if pinned taskbar, hardware keyboard is attached and no IME is docked
- if (mActivity.isHardwareKeyboard() && DisplayController.isPinnedTaskbar(mActivity)
+ if (mActivity.isHardwareKeyboard() && mActivity.isPinnedTaskbar()
&& !mActivity.isImeDocked()) {
return false;
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java
index 061a5a127e..b567871b92 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarUIController.java
@@ -21,6 +21,7 @@ import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_HOTSEAT
import static com.android.launcher3.LauncherSettings.Favorites.CONTAINER_HOTSEAT_PREDICTION;
import static com.android.launcher3.taskbar.TaskbarStashController.FLAG_IN_APP;
+import android.animation.Animator;
import android.content.Intent;
import android.graphics.drawable.BitmapDrawable;
import android.view.MotionEvent;
@@ -38,6 +39,8 @@ import com.android.launcher3.model.data.ItemInfoWithIcon;
import com.android.launcher3.popup.SystemShortcut;
import com.android.launcher3.taskbar.bubbles.BubbleBarController;
import com.android.launcher3.util.SplitConfigurationOptions;
+import com.android.quickstep.GestureState;
+import com.android.quickstep.RecentsAnimationCallbacks;
import com.android.quickstep.util.SplitTask;
import com.android.quickstep.views.RecentsView;
import com.android.quickstep.views.TaskContainer;
@@ -455,4 +458,18 @@ public class TaskbarUIController implements BubbleBarController.BubbleBarLocatio
*/
public void onSwipeToUnstashTaskbar() {
}
+
+ /**
+ * Called at the end of a gesture (see {@link GestureState.GestureEndTarget}).
+ * @param endTarget Where the gesture animation is going to.
+ * @param callbacks callbacks to track the recents animation lifecycle. The state change is
+ * automatically reset once the recents animation finishes
+ * @return An optional Animator to play in parallel with the default gesture end animation.
+ */
+ public @Nullable Animator getParallelAnimationToGestureEndTarget(
+ GestureState.GestureEndTarget endTarget,
+ long duration,
+ RecentsAnimationCallbacks callbacks) {
+ return null;
+ }
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacks.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacks.java
index dcb9fbff42..d0886e0ca1 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacks.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacks.java
@@ -36,7 +36,6 @@ import androidx.annotation.Nullable;
import com.android.internal.jank.Cuj;
import com.android.launcher3.taskbar.bubbles.BubbleBarViewController;
-import com.android.launcher3.util.DisplayController;
import com.android.systemui.shared.system.InteractionJankMonitorWrapper;
import com.android.wm.shell.shared.bubbles.BubbleBarLocation;
@@ -67,8 +66,8 @@ public class TaskbarViewCallbacks {
InteractionJankMonitorWrapper.begin(v, Cuj.CUJ_LAUNCHER_OPEN_ALL_APPS,
/* tag= */ "TASKBAR_BUTTON");
mActivity.getStatsLogManager().logger().log(LAUNCHER_TASKBAR_ALLAPPS_BUTTON_TAP);
- if (DisplayController.showLockedTaskbarOnHome(mActivity)
- || DisplayController.showDesktopTaskbarForFreeformDisplay(mActivity)) {
+ if (mActivity.showLockedTaskbarOnHome()
+ || mActivity.showDesktopTaskbarForFreeformDisplay()) {
// If the taskbar can be shown on the home screen, use mAllAppsToggler to toggle all
// apps, which will toggle the launcher activity all apps when on home screen.
// TODO(b/395913143): Reconsider this if a gap in taskbar all apps functionality that
@@ -248,8 +247,7 @@ public class TaskbarViewCallbacks {
/** Returns true if the taskbar pinning popup view was shown for {@code event}. */
private boolean maybeShowPinningView(@NonNull MotionEvent event) {
- if (!DisplayController.isPinnedTaskbar(mActivity) || mTaskbarView.isEventOverAnyItem(
- event)) {
+ if (!mActivity.isPinnedTaskbar() || mTaskbarView.isEventOverAnyItem(event)) {
return false;
}
mControllers.taskbarPinningController.showPinningView(mTaskbarView, event.getRawX());
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacksFactory.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacksFactory.kt
index 17da5336f4..6e948894c2 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacksFactory.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewCallbacksFactory.kt
@@ -42,7 +42,8 @@ open class TaskbarViewCallbacksFactory : ResourceBasedOverride {
if (contextualSearchInvoked) {
val runningPackage =
TopTaskTracker.INSTANCE[activity].getCachedTopTask(
- /* filterOnlyVisibleRecents */ true
+ /* filterOnlyVisibleRecents */ true,
+ activity.display.displayId,
)
.getPackageName()
activity.statsLogManager
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java
index 6786aed445..f15ef8c52c 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarViewController.java
@@ -19,6 +19,7 @@ import static android.animation.LayoutTransition.APPEARING;
import static android.animation.LayoutTransition.CHANGE_APPEARING;
import static android.animation.LayoutTransition.CHANGE_DISAPPEARING;
import static android.animation.LayoutTransition.DISAPPEARING;
+import static android.view.Display.DEFAULT_DISPLAY;
import static android.window.DesktopModeFlags.ENABLE_TASKBAR_RECENTS_LAYOUT_TRANSITION;
import static com.android.app.animation.Interpolators.EMPHASIZED;
@@ -86,7 +87,6 @@ import com.android.launcher3.taskbar.bubbles.BubbleBarController;
import com.android.launcher3.taskbar.bubbles.BubbleControllers;
import com.android.launcher3.taskbar.customization.TaskbarAllAppsButtonContainer;
import com.android.launcher3.taskbar.customization.TaskbarDividerContainer;
-import com.android.launcher3.util.DisplayController;
import com.android.launcher3.util.ItemInfoMatcher;
import com.android.launcher3.util.LauncherBindableItemsContainer;
import com.android.launcher3.util.MultiPropertyFactory;
@@ -495,7 +495,8 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar
View[] iconViews = mTaskbarView.getIconViews();
float finalScale;
- if (mControllers.getSharedState().startTaskbarVariantIsTransient) {
+ TaskbarSharedState sharedState = mControllers.getSharedState();
+ if (sharedState != null || mControllers.getSharedState().startTaskbarVariantIsTransient) {
finalScale = mapRange(scale, 1f, ((float) mPersistentIconSize / mTransientIconSize));
} else {
finalScale = mapRange(scale, ((float) mTransientIconSize / mPersistentIconSize), 1f);
@@ -747,7 +748,8 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar
}
private boolean shouldUpdateIconContentDescription(BubbleTextView btv) {
- boolean isInDesktopMode = mControllers.taskbarDesktopModeController.isInDesktopMode();
+ boolean isInDesktopMode = mControllers.taskbarDesktopModeController.isInDesktopMode(
+ DEFAULT_DISPLAY);
boolean isAllAppsButton = btv instanceof TaskbarAllAppsButtonContainer;
boolean isDividerButton = btv instanceof TaskbarDividerContainer;
return isInDesktopMode && !isAllAppsButton && !isDividerButton;
@@ -930,7 +932,9 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar
private AnimatorPlaybackController createIconAlignmentController(DeviceProfile launcherDp) {
PendingAnimation setter = new PendingAnimation(100);
// icon alignment not needed for pinned taskbar.
- if (DisplayController.isPinnedTaskbar(mActivity)) return setter.createPlaybackController();
+ if (mActivity.isPinnedTaskbar()) {
+ return setter.createPlaybackController();
+ }
mOnControllerPreCreateCallback.run();
DeviceProfile taskbarDp = mActivity.getDeviceProfile();
Rect hotseatPadding = launcherDp.getHotseatLayoutPadding(mActivity);
@@ -948,7 +952,7 @@ public class TaskbarViewController implements TaskbarControllers.LoggableTaskbar
// or fade in while already in in-app state.
Interpolator interpolator = mIsHotseatIconOnTopWhenAligned ? LINEAR : FINAL_FRAME;
- int offsetY = launcherDp.getTaskbarOffsetY();
+ int offsetY = taskbarDp.getTaskbarOffsetY();
setter.setFloat(mTaskbarIconTranslationYForHome, VALUE, -offsetY, interpolator);
setter.setFloat(mTaskbarNavButtonTranslationY, VALUE, -offsetY, interpolator);
setter.setFloat(mTaskbarNavButtonTranslationYForInAppDisplay, VALUE, offsetY, interpolator);
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarView.java b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarView.java
index 1abef8a63f..6380c2371b 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarView.java
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarView.java
@@ -18,6 +18,7 @@ package com.android.launcher3.taskbar.bubbles;
import static com.android.launcher3.LauncherAnimUtils.VIEW_ALPHA;
import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.annotation.NonNull;
@@ -560,30 +561,52 @@ public class BubbleBarView extends FrameLayout {
// First animator hides the bar.
// After it completes, bubble positions in the bar and arrow position is updated.
// Second animator is started to show the bar.
- ObjectAnimator alphaOutAnim = ObjectAnimator.ofFloat(
- this, getLocationAnimAlphaProperty(), 0f);
- mBubbleBarLocationAnimator = BarsLocationAnimatorHelper.getBubbleBarLocationOutAnimator(
- this,
- bubbleBarLocation,
- alphaOutAnim);
+ mBubbleBarLocationAnimator = animateToBubbleBarLocationOut(bubbleBarLocation);
mBubbleBarLocationAnimator.addListener(AnimatorListeners.forEndCallback(() -> {
- updateBubblesLayoutProperties(bubbleBarLocation);
- mBubbleBarBackground.setAnchorLeft(bubbleBarLocation.isOnLeft(isLayoutRtl()));
- ObjectAnimator alphaInAnim = ObjectAnimator.ofFloat(BubbleBarView.this,
- getLocationAnimAlphaProperty(), 1f);
-
// Animate it in
- mBubbleBarLocationAnimator = BarsLocationAnimatorHelper.getBubbleBarLocationInAnimator(
- bubbleBarLocation,
- mBubbleBarLocation,
- getDistanceFromOtherSide(),
- alphaInAnim,
- BubbleBarView.this);
+ mBubbleBarLocationAnimator = animateToBubbleBarLocationIn(mBubbleBarLocation,
+ bubbleBarLocation);
mBubbleBarLocationAnimator.start();
}));
mBubbleBarLocationAnimator.start();
}
+ /** Creates animator for animating bubble bar in. */
+ public Animator animateToBubbleBarLocationIn(BubbleBarLocation fromLocation,
+ BubbleBarLocation toLocation) {
+ updateBubblesLayoutProperties(toLocation);
+ mBubbleBarBackground.setAnchorLeft(toLocation.isOnLeft(isLayoutRtl()));
+ ObjectAnimator alphaInAnim = ObjectAnimator.ofFloat(BubbleBarView.this,
+ getLocationAnimAlphaProperty(), 1f);
+ return BarsLocationAnimatorHelper.getBubbleBarLocationInAnimator(toLocation, fromLocation,
+ getDistanceFromOtherSide(), alphaInAnim, this);
+ }
+
+ /**
+ * Creates animator for animating bubble bar out.
+ *
+ * @param targetLocation the location bubble br should animate to.
+ */
+ public Animator animateToBubbleBarLocationOut(BubbleBarLocation targetLocation) {
+ ObjectAnimator alphaOutAnim = ObjectAnimator.ofFloat(
+ this, getLocationAnimAlphaProperty(), 0f);
+ Animator outAnimation = BarsLocationAnimatorHelper.getBubbleBarLocationOutAnimator(
+ this,
+ targetLocation,
+ alphaOutAnim);
+ outAnimation.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(@NonNull Animator animation, boolean isReverse) {
+ // need to restore the original bar view state in case icon is dropped to the bubble
+ // bar original location
+ updateBubblesLayoutProperties(targetLocation);
+ mBubbleBarBackground.setAnchorLeft(targetLocation.isOnLeft(isLayoutRtl()));
+ setTranslationX(0f);
+ }
+ });
+ return outAnimation;
+ }
+
/**
* Get property that can be used to animate the alpha value for the bar.
* When a bubble is being dragged, uses {@link #BUBBLE_DRAG_ALPHA}.
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java
index 9fb283cccf..ce4a14f551 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java
@@ -194,9 +194,11 @@ public class BubbleBarViewController {
private boolean mHiddenForStashed;
private boolean mShouldShowEducation;
public boolean mOverflowAdded;
- private boolean mIsLocationUpdatedForDropTarget = false;
private boolean mWasStashedBeforeEnteringBubbleDragZone = false;
+ /** This field is used solely to track the bubble bar location prior to the start of the drag */
+ private @Nullable BubbleBarLocation mBubbleBarDragLocation;
+
private BubbleBarViewAnimator mBubbleBarViewAnimator;
private final FrameLayout mBubbleBarContainer;
private BubbleBarFlyoutController mBubbleBarFlyoutController;
@@ -364,7 +366,7 @@ public class BubbleBarViewController {
@Override
public boolean isOnLeft() {
boolean shouldRevertLocation =
- mBarView.isShowingDropTarget() && mIsLocationUpdatedForDropTarget;
+ mBarView.isShowingDropTarget() && isLocationUpdatedForDropTarget();
boolean isOnLeft = mBarView.getBubbleBarLocation().isOnLeft(mBarView.isLayoutRtl());
return shouldRevertLocation != isOnLeft;
}
@@ -616,6 +618,17 @@ public class BubbleBarViewController {
mBarView.animateToBubbleBarLocation(bubbleBarLocation);
}
+ /** Return animator for animating bubble bar in. */
+ public Animator animateBubbleBarLocationIn(BubbleBarLocation fromLocation,
+ BubbleBarLocation toLocation) {
+ return mBarView.animateToBubbleBarLocationIn(fromLocation, toLocation);
+ }
+
+ /** Return animator for animating bubble bar out. */
+ public Animator animateBubbleBarLocationOut(BubbleBarLocation toLocation) {
+ return mBarView.animateToBubbleBarLocationOut(toLocation);
+ }
+
/** Returns whether the Bubble Bar is currently displaying a drop target. */
public boolean isShowingDropTarget() {
return mBarView.isShowingDropTarget();
@@ -628,25 +641,18 @@ public class BubbleBarViewController {
* updated.
*/
public void onDragItemOverBubbleBarDragZone(@NonNull BubbleBarLocation bubbleBarLocation) {
- Log.w("BBAnimation", "onDragItemOverBubbleBarDragZone()");
+ mBubbleBarDragLocation = bubbleBarLocation;
mBarView.showDropTarget(/* isDropTarget = */ true);
- boolean isRtl = mBarView.isLayoutRtl();
- mIsLocationUpdatedForDropTarget = getBubbleBarLocation().isOnLeft(isRtl)
- != bubbleBarLocation.isOnLeft(isRtl);
mWasStashedBeforeEnteringBubbleDragZone = hasBubbles()
&& mBubbleStashController.isStashed();
if (mWasStashedBeforeEnteringBubbleDragZone) {
- if (mIsLocationUpdatedForDropTarget) {
- // bubble bar is stashed an location updated
- //TODO(b/399678274) add animation
- mBubbleStashController.showBubbleBarImmediate();
- animateBubbleBarLocation(bubbleBarLocation);
- } else {
- // bubble bar is stashed and location the same - just un-stash
- mBubbleStashController.showBubbleBar(/* expandBubbles = */ false);
- }
+ // bubble bar is stashed - un-stash at drag location
+ mBubbleStashController.showBubbleBarAtLocation(
+ /* fromLocation = */ getBubbleBarLocation(),
+ /* toLocation = */ mBubbleBarDragLocation
+ );
} else if (hasBubbles()) {
- if (mIsLocationUpdatedForDropTarget) {
+ if (isLocationUpdatedForDropTarget()) {
// bubble bar has bubbles and location is changed - animate bar to the opposite side
animateBubbleBarLocation(bubbleBarLocation);
}
@@ -661,7 +667,12 @@ public class BubbleBarViewController {
* {@link #onDragItemOverBubbleBarDragZone}}.
*/
public boolean isLocationUpdatedForDropTarget() {
- return mIsLocationUpdatedForDropTarget;
+ if (mBubbleBarDragLocation == null) {
+ return false;
+ }
+ boolean isRtl = mBarView.isLayoutRtl();
+ return getBubbleBarLocation().isOnLeft(isRtl)
+ != mBubbleBarDragLocation.isOnLeft(isRtl);
}
/**
@@ -671,39 +682,34 @@ public class BubbleBarViewController {
* mode and reset the value returned from {@link #isLocationUpdatedForDropTarget()} to false.
*/
public void onItemDraggedOutsideBubbleBarDropZone() {
- Log.w("BBAnimation", "onItemDraggedOutsideBubbleBarDropZone()");
- mBarView.showDropTarget(/* isDropTarget = */ false);
- if (mWasStashedBeforeEnteringBubbleDragZone) {
- if (mIsLocationUpdatedForDropTarget) {
- // bubble bar was stashed and location updated
- //TODO(b/399678274) add animation
- animateBubbleBarLocation(getBubbleBarLocation());
- mBubbleStashController.stashBubbleBarImmediate();
- } else {
- // bubble bar was stashed and location the same - just stash it back
- mBubbleStashController.stashBubbleBar();
- }
+ if (!isShowingDropTarget()) {
+ return;
+ }
+ if (mWasStashedBeforeEnteringBubbleDragZone && mBubbleBarDragLocation != null) {
+ // bubble bar was stashed - stash at original location
+ mBubbleStashController.stashBubbleBarToLocation(
+ /* fromLocation = */ mBubbleBarDragLocation,
+ /* toLocation = */ getBubbleBarLocation()
+ );
} else if (hasBubbles()) {
- if (mIsLocationUpdatedForDropTarget) {
- // bubble bar has bubbles and location was changed - return to the original location
+ if (isLocationUpdatedForDropTarget()) {
+ // bubble bar has bubbles and location was changed - return to the original
+ // location
animateBubbleBarLocation(getBubbleBarLocation());
}
}
- mBubbleBarPinController.hideDropTarget();
- mIsLocationUpdatedForDropTarget = false;
- mWasStashedBeforeEnteringBubbleDragZone = false;
+ onItemDragCompleted();
}
/**
* Notifies the controller that the drag has completed over the Bubble Bar drop zone.
* The controller will hide the drop target if there are no bubbles and exit drop target mode.
*/
- public void onItemDroppedInBubbleBarDragZone() {
- Log.w("BBAnimation", "onItemDroppedInBubbleBarDragZone()");
+ public void onItemDragCompleted() {
mBarView.showDropTarget(/* isDropTarget = */ false);
mBubbleBarPinController.hideDropTarget();
- mIsLocationUpdatedForDropTarget = false;
mWasStashedBeforeEnteringBubbleDragZone = false;
+ mBubbleBarDragLocation = null;
}
/**
@@ -842,6 +848,7 @@ public class BubbleBarViewController {
boolean hiddenForStashedAndNotAnimating =
mHiddenForStashed && !mBubbleBarViewAnimator.isAnimating();
if (mHiddenForSysui || mHiddenForNoBubbles || hiddenForStashedAndNotAnimating) {
+ //TODO(b/404870188) this visibility change cause search view drag misbehavior
mBarView.setVisibility(INVISIBLE);
} else {
mBarView.setVisibility(VISIBLE);
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleStashedHandleViewController.java b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleStashedHandleViewController.java
index 3640c3b60e..ec540e0088 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleStashedHandleViewController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleStashedHandleViewController.java
@@ -272,6 +272,11 @@ public class BubbleStashedHandleViewController {
updateTranslationY();
}
+ /** Sets translation X for stash handle. */
+ public void setTranslationX(float translationX) {
+ mStashedHandleView.setTranslationX(translationX);
+ }
+
private void updateTranslationY() {
mStashedHandleView.setTranslationY(mTranslationForSwipeY + mTranslationForStashY);
}
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 fec1eaf55c..ec272ac873 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/stashing/BubbleStashController.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/stashing/BubbleStashController.kt
@@ -131,6 +131,12 @@ interface BubbleStashController {
*/
fun stashBubbleBar()
+ /**
+ * Animates the bubble bar to the handle at provided location. Does not update bubble bar
+ * location.
+ */
+ fun stashBubbleBarToLocation(fromLocation: BubbleBarLocation, toLocation: BubbleBarLocation) {}
+
/** Shows the bubble bar, and expands bubbles depending on [expandBubbles]. */
fun showBubbleBar(expandBubbles: Boolean) {
showBubbleBar(expandBubbles = expandBubbles, bubbleBarGesture = false)
@@ -144,6 +150,9 @@ interface BubbleStashController {
*/
fun showBubbleBar(expandBubbles: Boolean, bubbleBarGesture: Boolean)
+ /** Animates the bubble bar at the provided location. Does not update bubble bar location. */
+ fun showBubbleBarAtLocation(fromLocation: BubbleBarLocation, toLocation: BubbleBarLocation) {}
+
// TODO(b/354218264): Move to BubbleBarViewAnimator
/**
* The difference on the Y axis between the center of the handle and the center of the bubble
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 9c148e2191..82bb071bc3 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/stashing/TransientBubbleStashController.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/stashing/TransientBubbleStashController.kt
@@ -18,6 +18,7 @@ package com.android.launcher3.taskbar.bubbles.stashing
import android.animation.Animator
import android.animation.AnimatorSet
+import android.animation.ValueAnimator
import android.content.Context
import android.graphics.Rect
import android.view.MotionEvent
@@ -31,6 +32,12 @@ import com.android.app.animation.Interpolators.LINEAR
import com.android.launcher3.R
import com.android.launcher3.anim.AnimatedFloat
import com.android.launcher3.anim.SpringAnimationBuilder
+import com.android.launcher3.taskbar.BarsLocationAnimatorHelper.FADE_IN_ANIM_ALPHA_DURATION_MS
+import com.android.launcher3.taskbar.BarsLocationAnimatorHelper.FADE_OUT_ANIM_ALPHA_DELAY_MS
+import com.android.launcher3.taskbar.BarsLocationAnimatorHelper.FADE_OUT_ANIM_ALPHA_DURATION_MS
+import com.android.launcher3.taskbar.BarsLocationAnimatorHelper.FADE_OUT_ANIM_POSITION_DURATION_MS
+import com.android.launcher3.taskbar.BarsLocationAnimatorHelper.inShiftX
+import com.android.launcher3.taskbar.BarsLocationAnimatorHelper.outShift
import com.android.launcher3.taskbar.TaskbarInsetsController
import com.android.launcher3.taskbar.TaskbarStashController.TASKBAR_STASH_ALPHA_START_DELAY
import com.android.launcher3.taskbar.TaskbarStashController.TRANSIENT_TASKBAR_STASH_ALPHA_DURATION
@@ -44,6 +51,7 @@ import com.android.launcher3.taskbar.bubbles.stashing.BubbleStashController.Task
import com.android.launcher3.util.MultiPropertyFactory
import com.android.wm.shell.shared.animation.PhysicsAnimator
import com.android.wm.shell.shared.bubbles.BubbleBarLocation
+import com.android.wm.shell.shared.bubbles.ContextUtils.isRtl
import kotlin.math.max
class TransientBubbleStashController(
@@ -187,6 +195,11 @@ class TransientBubbleStashController(
}
override fun showBubbleBarImmediate(bubbleBarTranslationY: Float) {
+ showBubbleBarImmediateVisually(bubbleBarTranslationY)
+ onIsStashedChanged()
+ }
+
+ private fun showBubbleBarImmediateVisually(bubbleBarTranslationY: Float) {
bubbleStashedHandleViewController?.setTranslationYForSwipe(0f)
stashHandleViewAlpha?.value = 0f
this.bubbleBarTranslationYAnimator.updateValue(bubbleBarTranslationY)
@@ -197,10 +210,14 @@ class TransientBubbleStashController(
bubbleBarBackgroundScaleY.updateValue(1f)
isStashed = false
bubbleBarViewController.setHiddenForStashed(false)
- onIsStashedChanged()
}
override fun stashBubbleBarImmediate() {
+ stashBubbleBarImmediateVisually()
+ onIsStashedChanged()
+ }
+
+ private fun stashBubbleBarImmediateVisually() {
bubbleStashedHandleViewController?.setTranslationYForSwipe(0f)
stashHandleViewAlpha?.value = 1f
this.bubbleBarTranslationYAnimator.updateValue(getStashTranslation())
@@ -212,7 +229,6 @@ class TransientBubbleStashController(
bubbleBarBackgroundScaleY.updateValue(getStashScaleY())
isStashed = true
bubbleBarViewController.setHiddenForStashed(true)
- onIsStashedChanged()
}
override fun getTouchableHeight(): Int =
@@ -247,6 +263,29 @@ class TransientBubbleStashController(
updateStashedAndExpandedState(stash = true, expand = false)
}
+ override fun stashBubbleBarToLocation(
+ fromLocation: BubbleBarLocation,
+ toLocation: BubbleBarLocation,
+ ) {
+ if (fromLocation.isSameSideWith(toLocation)) {
+ updateStashedAndExpandedState(
+ stash = true,
+ expand = false,
+ updateTouchRegionOnEnd = false,
+ )
+ return
+ }
+ cancelAnimation()
+ animator =
+ AnimatorSet().apply {
+ playSequentially(
+ bubbleBarViewController.animateBubbleBarLocationOut(toLocation),
+ createHandleInAnimator(location = toLocation),
+ )
+ start()
+ }
+ }
+
override fun showBubbleBar(expandBubbles: Boolean, bubbleBarGesture: Boolean) {
updateStashedAndExpandedState(
stash = false,
@@ -255,6 +294,33 @@ class TransientBubbleStashController(
)
}
+ override fun showBubbleBarAtLocation(
+ fromLocation: BubbleBarLocation,
+ toLocation: BubbleBarLocation,
+ ) {
+ if (fromLocation.isSameSideWith(toLocation)) {
+ updateStashedAndExpandedState(
+ stash = false,
+ expand = false,
+ updateTouchRegionOnEnd = false,
+ )
+ return
+ }
+ cancelAnimation()
+ val bubbleBarInAnimation =
+ bubbleBarViewController.animateBubbleBarLocationIn(fromLocation, toLocation).apply {
+ doOnStart { showBubbleBarImmediateVisually(bubbleBarTranslationY) }
+ }
+ animator =
+ AnimatorSet().apply {
+ playSequentially(
+ createHandleOutAnimator(location = toLocation),
+ bubbleBarInAnimation,
+ )
+ start()
+ }
+ }
+
override fun getDiffBetweenHandleAndBarCenters(): Float {
// the difference between the centers of the handle and the bubble bar is the difference
// between their distance from the bottom of the screen.
@@ -392,7 +458,7 @@ class TransientBubbleStashController(
bubbleBarAlpha.value = 1f
}
animatorSet.doOnEnd {
- animator = null
+ cancelAnimation()
controllersAfterInitAction.runAfterInit {
if (isStashed) {
bubbleBarAlpha.value = 0f
@@ -486,6 +552,7 @@ class TransientBubbleStashController(
stash: Boolean,
expand: Boolean,
bubbleBarGesture: Boolean = false,
+ updateTouchRegionOnEnd: Boolean = true,
) {
if (bubbleBarViewController.isHiddenForNoBubbles) {
// If there are no bubbles the bar and handle are invisible, nothing to do here.
@@ -498,11 +565,13 @@ class TransientBubbleStashController(
// notify the view controller that the stash state is about to change so that it can
// cancel an ongoing animation if there is one.
bubbleBarViewController.onStashStateChanging()
- animator?.cancel()
+ cancelAnimation()
animator =
createStashAnimator(isStashed, BAR_STASH_DURATION).apply {
updateBarVisibility(isStashed)
- updateTouchRegionOnAnimationEnd()
+ if (updateTouchRegionOnEnd) {
+ updateTouchRegionOnAnimationEnd()
+ }
start()
}
}
@@ -512,6 +581,11 @@ class TransientBubbleStashController(
}
}
+ private fun cancelAnimation() {
+ animator?.cancel()
+ animator = null
+ }
+
override fun getHandleViewAlpha(): MultiPropertyFactory<View>.MultiProperty? =
// only return handle alpha if the bubble bar is stashed and has bubbles
if (isStashed && bubbleBarViewController.hasBubbles()) {
@@ -534,6 +608,49 @@ class TransientBubbleStashController(
return this
}
+ // TODO(b/399678274) add tests
+ private fun createHandleInAnimator(location: BubbleBarLocation): Animator? {
+ val stashHandleViewController = bubbleStashedHandleViewController ?: return null
+ val handleAlpha = stashHandleViewController.stashedHandleAlpha.get(0)
+ val shift = context.inShiftX
+ val startX = if (location.isOnLeft(context.isRtl)) shift else -shift
+ val handleTranslationX =
+ ValueAnimator.ofFloat(startX, 0f).apply {
+ addUpdateListener { v ->
+ stashHandleViewController.setTranslationX(v.animatedValue as Float)
+ }
+ duration = FADE_IN_ANIM_ALPHA_DURATION_MS
+ }
+ val handleAlphaAnimation =
+ handleAlpha.animateToValue(1f).apply { duration = FADE_IN_ANIM_ALPHA_DURATION_MS }
+ return AnimatorSet().apply {
+ playTogether(handleTranslationX, handleAlphaAnimation)
+ doOnStart { stashBubbleBarImmediateVisually() }
+ }
+ }
+
+ private fun createHandleOutAnimator(location: BubbleBarLocation): Animator? {
+ val stashHandleViewController = bubbleStashedHandleViewController ?: return null
+ val handleAlpha = stashHandleViewController.stashedHandleAlpha.get(0)
+ val shift = context.outShift
+ val endX = if (location.isOnLeft(context.isRtl)) -shift else shift
+ val handleTranslationX =
+ ValueAnimator.ofFloat(0f, endX).apply {
+ addUpdateListener { v ->
+ stashHandleViewController.setTranslationX(v.animatedValue as Float)
+ }
+ duration = FADE_OUT_ANIM_POSITION_DURATION_MS
+ // in case item dropped to the opposite side - need to clear translation
+ doOnEnd { stashHandleViewController.setTranslationX(0f) }
+ }
+ val handleAlphaAnimation =
+ handleAlpha.animateToValue(0f).apply {
+ duration = FADE_OUT_ANIM_ALPHA_DURATION_MS
+ startDelay = FADE_OUT_ANIM_ALPHA_DELAY_MS
+ }
+ return AnimatorSet().apply { playTogether(handleTranslationX, handleAlphaAnimation) }
+ }
+
private fun Animator.setBubbleBarPivotDuringAnim(pivotX: Float, pivotY: Float): Animator {
var initialPivotX = Float.NaN
var initialPivotY = Float.NaN
@@ -549,4 +666,9 @@ class TransientBubbleStashController(
}
return this
}
+
+ private fun BubbleBarLocation.isSameSideWith(anotherLocation: BubbleBarLocation): Boolean {
+ val isRtl = context.isRtl
+ return this.isOnLeft(isRtl) == anotherLocation.isOnLeft(isRtl)
+ }
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/growth/ActionPerformers.kt b/quickstep/src/com/android/launcher3/taskbar/growth/ActionPerformers.kt
new file mode 100644
index 0000000000..17c950993d
--- /dev/null
+++ b/quickstep/src/com/android/launcher3/taskbar/growth/ActionPerformers.kt
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.launcher3.taskbar.growth
+
+import android.content.Context
+import android.content.Intent
+import android.net.Uri
+
+object ActionPerformers {
+ fun interface DismissCallback {
+ fun invoke()
+ }
+
+ fun performActions(actions: List<Action>, context: Context, dismissCallback: DismissCallback) {
+ for (action in actions) {
+ performAction(action, context, dismissCallback)
+ }
+ }
+
+ private fun performAction(action: Action, context: Context, dismissCallback: DismissCallback) {
+ when (action) {
+ is Action.Dismiss -> {
+ // TODO: b/396239267 - Handle marking the campaign dismissed with dismissal
+ // retention.
+ dismissCallback.invoke()
+ }
+ is Action.OpenUrl -> openUrl(action.url, context)
+ // Handle other actions
+ }
+ }
+
+ fun openUrl(url: String, context: Context) {
+ val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ context.startActivity(intent)
+ }
+}
diff --git a/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayContext.java b/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayContext.java
index dd91d17c29..8574b89ecb 100644
--- a/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayContext.java
+++ b/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayContext.java
@@ -31,6 +31,7 @@ import com.android.launcher3.taskbar.TaskbarDragController;
import com.android.launcher3.taskbar.TaskbarUIController;
import com.android.launcher3.taskbar.allapps.TaskbarAllAppsContainerView;
import com.android.launcher3.taskbar.allapps.TaskbarSearchSessionController;
+import com.android.launcher3.util.NavigationMode;
import com.android.launcher3.util.SplitConfigurationOptions.SplitSelectSource;
/**
@@ -142,6 +143,41 @@ public class TaskbarOverlayContext extends BaseTaskbarContext {
}
@Override
+ public boolean isTransientTaskbar() {
+ return mTaskbarContext.isTransientTaskbar();
+ }
+
+ @Override
+ public boolean isPinnedTaskbar() {
+ return mTaskbarContext.isPinnedTaskbar();
+ }
+
+ @Override
+ public NavigationMode getNavigationMode() {
+ return mTaskbarContext.getNavigationMode();
+ }
+
+ @Override
+ public boolean isInDesktopMode() {
+ return mTaskbarContext.isInDesktopMode();
+ }
+
+ @Override
+ public boolean showLockedTaskbarOnHome() {
+ return mTaskbarContext.showLockedTaskbarOnHome();
+ }
+
+ @Override
+ public boolean showDesktopTaskbarForFreeformDisplay() {
+ return mTaskbarContext.showDesktopTaskbarForFreeformDisplay();
+ }
+
+ @Override
+ public boolean isPrimaryDisplay() {
+ return mTaskbarContext.isPrimaryDisplay();
+ }
+
+ @Override
public void onDragStart() {}
@Override
diff --git a/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayController.java b/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayController.java
index 675d55b9a4..de20f779a7 100644
--- a/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/overlay/TaskbarOverlayController.java
@@ -200,7 +200,7 @@ public final class TaskbarOverlayController {
private LayoutParams createLayoutParams() {
LayoutParams layoutParams = new LayoutParams(
TYPE_APPLICATION_OVERLAY,
- LayoutParams.FLAG_SPLIT_TOUCH,
+ /* flags = */ 0,
PixelFormat.TRANSLUCENT);
layoutParams.setTitle(WINDOW_TITLE);
layoutParams.gravity = Gravity.BOTTOM;
diff --git a/quickstep/src/com/android/launcher3/uioverrides/PredictedAppIcon.java b/quickstep/src/com/android/launcher3/uioverrides/PredictedAppIcon.java
index 15a27d15c0..e8de0d2152 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/PredictedAppIcon.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/PredictedAppIcon.java
@@ -402,16 +402,16 @@ public class PredictedAppIcon extends DoubleShadowBubbleTextView {
canvas.scale(
mRingScale * (1f - RING_EFFECT_RATIO),
mRingScale * (1f - RING_EFFECT_RATIO),
- canvas.getWidth() / 2f,
- canvas.getHeight() / 2f);
+ getWidth() / 2f,
+ getHeight() / 2f);
} else if (Float.compare(1, mRingScale) != 0) {
- canvas.scale(mRingScale, mRingScale, canvas.getWidth() / 2f, canvas.getHeight() / 2f);
+ canvas.scale(mRingScale, mRingScale, getWidth() / 2f, getHeight() / 2f);
}
// Draw ring shadow around canvas.
canvas.drawPath(mRingPath, mIconRingPaint);
mIconRingPaint.setColor(mPlateColor.currentColor);
if (Flags.enableLauncherIconShapes()) {
- mIconRingPaint.setStrokeWidth(canvas.getWidth() * RING_EFFECT_RATIO);
+ mIconRingPaint.setStrokeWidth(getWidth() * RING_EFFECT_RATIO);
// Using FILL_AND_STROKE as there is still some gap to fill,
// between inner curve of ring / outer curve of icon.
mIconRingPaint.setStyle(Paint.Style.FILL_AND_STROKE);
diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepAppWidgetHost.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepAppWidgetHost.java
deleted file mode 100644
index 45813ce52e..0000000000
--- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepAppWidgetHost.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/**
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.launcher3.uioverrides;
-
-import static com.android.launcher3.widget.LauncherWidgetHolder.APPWIDGET_HOST_ID;
-
-import android.appwidget.AppWidgetHost;
-import android.appwidget.AppWidgetProviderInfo;
-import android.content.Context;
-import android.os.Looper;
-
-import androidx.annotation.NonNull;
-
-import com.android.launcher3.LauncherAppState;
-import com.android.launcher3.util.Executors;
-import com.android.launcher3.widget.LauncherAppWidgetProviderInfo;
-import com.android.launcher3.widget.LauncherWidgetHolder;
-
-import java.util.function.IntConsumer;
-
-/**
- * {@link AppWidgetHost} that is used to receive the changes to the widgets without
- * storing any {@code Activity} info like that of the launcher.
- */
-final class QuickstepAppWidgetHost extends AppWidgetHost {
- private final @NonNull Context mContext;
- private final @NonNull IntConsumer mAppWidgetRemovedCallback;
- private final @NonNull LauncherWidgetHolder.ProviderChangedListener mProvidersChangedListener;
-
- QuickstepAppWidgetHost(@NonNull Context context, @NonNull IntConsumer appWidgetRemovedCallback,
- @NonNull LauncherWidgetHolder.ProviderChangedListener listener,
- @NonNull Looper looper) {
- super(context, APPWIDGET_HOST_ID, null, looper);
- mContext = context;
- mAppWidgetRemovedCallback = appWidgetRemovedCallback;
- mProvidersChangedListener = listener;
- }
-
- @Override
- protected void onProvidersChanged() {
- mProvidersChangedListener.notifyWidgetProvidersChanged();
- }
-
- @Override
- public void onAppWidgetRemoved(int appWidgetId) {
- // Route the call via model thread, in case it comes while a loader-bind is in progress
- Executors.MODEL_EXECUTOR.execute(
- () -> Executors.MAIN_EXECUTOR.execute(
- () -> mAppWidgetRemovedCallback.accept(appWidgetId)));
- }
-
- @Override
- protected void onProviderChanged(int appWidgetId, @NonNull AppWidgetProviderInfo appWidget) {
- LauncherAppWidgetProviderInfo info = LauncherAppWidgetProviderInfo.fromProviderInfo(
- mContext, appWidget);
- super.onProviderChanged(appWidgetId, info);
- // The super method updates the dimensions of the providerInfo. Update the
- // launcher spans accordingly.
- info.initSpans(mContext, LauncherAppState.getIDP(mContext));
- }
-}
diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepAppWidgetHostProvider.kt b/quickstep/src/com/android/launcher3/uioverrides/QuickstepAppWidgetHostProvider.kt
new file mode 100644
index 0000000000..1387cb7fce
--- /dev/null
+++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepAppWidgetHostProvider.kt
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.launcher3.uioverrides
+
+import android.app.ActivityThread
+import android.content.Context
+import android.content.ContextWrapper
+import com.android.launcher3.BuildConfig
+import com.android.launcher3.util.LooperExecutor
+import com.android.launcher3.widget.LauncherWidgetHolder
+import com.android.launcher3.widget.ListenableAppWidgetHost
+
+object QuickstepAppWidgetHostProvider {
+
+ /** Static widget host which is always listening and is lazily created */
+ @JvmStatic
+ val staticQuickstepHost: ListenableAppWidgetHost by lazy {
+ ListenableAppWidgetHost(
+ LooperContext(
+ ActivityThread.currentApplication(),
+ ListenableAppWidgetHost.widgetHolderExecutor,
+ ),
+ LauncherWidgetHolder.APPWIDGET_HOST_ID,
+ )
+ .apply { if (BuildConfig.WIDGETS_ENABLED) startListening() }
+ }
+
+ private class LooperContext(ctx: Context, val executor: LooperExecutor) : ContextWrapper(ctx) {
+
+ override fun getMainLooper() = executor.looper
+
+ override fun getMainExecutor() = executor
+ }
+}
diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepInteractionHandler.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepInteractionHandler.java
index 26a1322ea6..2f61eab845 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepInteractionHandler.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepInteractionHandler.java
@@ -34,8 +34,11 @@ import com.android.launcher3.model.data.ItemInfo;
import com.android.launcher3.util.ActivityOptionsWrapper;
import com.android.launcher3.widget.LauncherAppWidgetHostView;
+import java.util.function.Consumer;
+
/** Provides a Quickstep specific animation when launching an activity from an app widget. */
-class QuickstepInteractionHandler implements RemoteViews.InteractionHandler {
+class QuickstepInteractionHandler implements RemoteViews.InteractionHandler,
+ Consumer<LauncherAppWidgetHostView> {
private static final String TAG = "QuickstepInteractionHandler";
@@ -45,6 +48,11 @@ class QuickstepInteractionHandler implements RemoteViews.InteractionHandler {
mLauncher = launcher;
}
+ @Override
+ public void accept(LauncherAppWidgetHostView host) {
+ host.setInteractionHandler(this);
+ }
+
@SuppressWarnings("NewApi")
@Override
public boolean onInteraction(View view, PendingIntent pendingIntent,
diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
index 806b8ab1cc..605fd312d0 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
@@ -143,7 +143,6 @@ import com.android.launcher3.taskbar.TaskbarManager;
import com.android.launcher3.taskbar.TaskbarUIController;
import com.android.launcher3.testing.TestLogging;
import com.android.launcher3.testing.shared.TestProtocol;
-import com.android.launcher3.uioverrides.QuickstepWidgetHolder.QuickstepHolderFactory;
import com.android.launcher3.uioverrides.states.QuickstepAtomicAnimationFactory;
import com.android.launcher3.uioverrides.touchcontrollers.NavBarToHomeTouchController;
import com.android.launcher3.uioverrides.touchcontrollers.NoButtonNavbarToOverviewTouchController;
@@ -172,7 +171,6 @@ import com.android.launcher3.util.StableViewInfo;
import com.android.launcher3.util.StartActivityParams;
import com.android.launcher3.util.TouchController;
import com.android.launcher3.views.FloatingIconView;
-import com.android.launcher3.widget.LauncherWidgetHolder;
import com.android.quickstep.OverviewCommandHelper;
import com.android.quickstep.OverviewComponentObserver;
import com.android.quickstep.OverviewComponentObserver.OverviewChangeListener;
@@ -298,6 +296,7 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer,
@Override
protected void setupViews() {
+ getAppWidgetHolder().setOnViewCreationCallback(new QuickstepInteractionHandler(this));
super.setupViews();
mActionsView = findViewById(R.id.overview_actions_view);
@@ -726,15 +725,6 @@ public class QuickstepLauncher extends Launcher implements RecentsViewContainer,
}
@Override
- protected LauncherWidgetHolder createAppWidgetHolder() {
- final QuickstepHolderFactory factory =
- (QuickstepHolderFactory) LauncherWidgetHolder.HolderFactory.newFactory(this);
- return factory.newInstance(this,
- appWidgetId -> getWorkspace().removeWidget(appWidgetId),
- new QuickstepInteractionHandler(this));
- }
-
- @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepWidgetHolder.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepWidgetHolder.java
index 56fc4d1c0b..c7eedb0a1d 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepWidgetHolder.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepWidgetHolder.java
@@ -16,43 +16,41 @@
package com.android.launcher3.uioverrides;
import static com.android.launcher3.BuildConfig.WIDGETS_ENABLED;
+import static com.android.launcher3.uioverrides.QuickstepAppWidgetHostProvider.getStaticQuickstepHost;
import static com.android.launcher3.util.Executors.MAIN_EXECUTOR;
+import static com.android.launcher3.widget.ListenableAppWidgetHost.getWidgetHolderExecutor;
import android.appwidget.AppWidgetHost;
import android.appwidget.AppWidgetHostView;
import android.appwidget.AppWidgetProviderInfo;
import android.content.Context;
-import android.util.Log;
import android.util.SparseArray;
import android.widget.RemoteViews;
import androidx.annotation.AnyThread;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import androidx.annotation.UiThread;
-import com.android.launcher3.config.FeatureFlags;
import com.android.launcher3.util.IntSet;
import com.android.launcher3.util.SafeCloseable;
import com.android.launcher3.widget.LauncherAppWidgetHostView;
import com.android.launcher3.widget.LauncherAppWidgetProviderInfo;
import com.android.launcher3.widget.LauncherWidgetHolder;
-import java.util.ArrayList;
+import dagger.assisted.Assisted;
+import dagger.assisted.AssistedFactory;
+import dagger.assisted.AssistedInject;
+
import java.util.Collections;
-import java.util.List;
import java.util.Set;
import java.util.WeakHashMap;
import java.util.function.BiConsumer;
-import java.util.function.IntConsumer;
/**
* {@link LauncherWidgetHolder} that puts the app widget host in the background
*/
public final class QuickstepWidgetHolder extends LauncherWidgetHolder {
- private static final String TAG = "QuickstepWidgetHolder";
-
private static final UpdateKey<AppWidgetProviderInfo> KEY_PROVIDER_UPDATE =
AppWidgetHostView::onUpdateProviderInfo;
private static final UpdateKey<RemoteViews> KEY_VIEWS_UPDATE =
@@ -60,51 +58,17 @@ public final class QuickstepWidgetHolder extends LauncherWidgetHolder {
private static final UpdateKey<Integer> KEY_VIEW_DATA_CHANGED =
AppWidgetHostView::onViewDataChanged;
- private static final List<QuickstepWidgetHolder> sHolders = new ArrayList<>();
private static final SparseArray<QuickstepWidgetHolderListener> sListeners =
new SparseArray<>();
- private static AppWidgetHost sWidgetHost = null;
-
private final UpdateHandler mUpdateHandler = this::onWidgetUpdate;
- private final @Nullable RemoteViews.InteractionHandler mInteractionHandler;
-
- private final @NonNull IntConsumer mAppWidgetRemovedCallback;
// Map to all pending updated keyed with appWidgetId;
private final SparseArray<PendingUpdate> mPendingUpdateMap = new SparseArray<>();
- private QuickstepWidgetHolder(@NonNull Context context,
- @Nullable IntConsumer appWidgetRemovedCallback,
- @Nullable RemoteViews.InteractionHandler interactionHandler) {
- super(context, appWidgetRemovedCallback);
- mAppWidgetRemovedCallback = appWidgetRemovedCallback != null ? appWidgetRemovedCallback
- : i -> {};
- mInteractionHandler = interactionHandler;
- MAIN_EXECUTOR.execute(() -> sHolders.add(this));
- }
-
- @Override
- @NonNull
- protected AppWidgetHost createHost(@NonNull Context context,
- @Nullable IntConsumer appWidgetRemovedCallback) {
- if (sWidgetHost == null) {
- sWidgetHost = new QuickstepAppWidgetHost(context.getApplicationContext(),
- i -> MAIN_EXECUTOR.execute(() ->
- sHolders.forEach(h -> h.mAppWidgetRemovedCallback.accept(i))),
- () -> MAIN_EXECUTOR.execute(() ->
- sHolders.forEach(h ->
- // Listeners might remove themselves from the list during the
- // iteration. Creating a copy of the list to avoid exceptions
- // for concurrent modification.
- new ArrayList<>(h.mProviderChangedListeners).forEach(
- ProviderChangedListener::notifyWidgetProvidersChanged))),
- getWidgetHolderExecutor().getLooper());
- if (WIDGETS_ENABLED) {
- sWidgetHost.startListening();
- }
- }
- return sWidgetHost;
+ @AssistedInject
+ public QuickstepWidgetHolder(@Assisted("UI_CONTEXT") @NonNull Context context) {
+ super(context, getStaticQuickstepHost());
}
@Override
@@ -168,21 +132,6 @@ public final class QuickstepWidgetHolder extends LauncherWidgetHolder {
sListeners.remove(appWidgetId);
}
- /**
- * Called when the launcher is destroyed
- */
- @Override
- public void destroy() {
- try {
- MAIN_EXECUTOR.submit(() -> {
- clearViews();
- sHolders.remove(this);
- }).get();
- } catch (Exception e) {
- Log.e(TAG, "Failed to remove self from holder list", e);
- }
- }
-
@Override
protected boolean shouldListen(int flags) {
return (flags & (FLAG_STATE_IS_NORMAL | FLAG_ACTIVITY_STARTED))
@@ -199,7 +148,7 @@ public final class QuickstepWidgetHolder extends LauncherWidgetHolder {
}
getWidgetHolderExecutor().execute(() -> {
- sWidgetHost.setAppWidgetHidden();
+ mWidgetHost.setAppWidgetHidden();
setListeningFlag(false);
});
}
@@ -217,7 +166,7 @@ public final class QuickstepWidgetHolder extends LauncherWidgetHolder {
};
QuickstepWidgetHolderListener holderListener = getHolderListener(appWidgetId);
holderListener.addHolder(handler);
- return () -> holderListener.mListeningHolders.remove(handler);
+ return () -> holderListener.removeHolder(handler);
}
/**
@@ -239,7 +188,6 @@ public final class QuickstepWidgetHolder extends LauncherWidgetHolder {
protected LauncherAppWidgetHostView createViewInternal(
int appWidgetId, @NonNull LauncherAppWidgetProviderInfo appWidget) {
LauncherAppWidgetHostView widgetView = new LauncherAppWidgetHostView(mContext);
- widgetView.setInteractionHandler(mInteractionHandler);
widgetView.setAppWidget(appWidgetId, appWidget);
widgetView.updateAppWidget(getHolderListener(appWidgetId).addHolder(mUpdateHandler));
return widgetView;
@@ -249,7 +197,7 @@ public final class QuickstepWidgetHolder extends LauncherWidgetHolder {
QuickstepWidgetHolderListener listener = sListeners.get(appWidgetId);
if (listener == null) {
listener = new QuickstepWidgetHolderListener(appWidgetId);
- sWidgetHost.setListener(appWidgetId, listener);
+ getStaticQuickstepHost().setListener(appWidgetId, listener);
sListeners.put(appWidgetId, listener);
}
return listener;
@@ -262,7 +210,7 @@ public final class QuickstepWidgetHolder extends LauncherWidgetHolder {
public void clearViews() {
mViews.clear();
for (int i = sListeners.size() - 1; i >= 0; i--) {
- sListeners.valueAt(i).mListeningHolders.remove(mUpdateHandler);
+ sListeners.valueAt(i).removeHolder(mUpdateHandler);
}
}
@@ -289,13 +237,15 @@ public final class QuickstepWidgetHolder extends LauncherWidgetHolder {
mWidgetId = widgetId;
}
- @UiThread
- @Nullable
public RemoteViews addHolder(@NonNull UpdateHandler holder) {
- mListeningHolders.add(holder);
+ MAIN_EXECUTOR.execute(() -> mListeningHolders.add(holder));
return mRemoteViews;
}
+ public void removeHolder(@NonNull UpdateHandler holder) {
+ MAIN_EXECUTOR.execute(() -> mListeningHolders.remove(holder));
+ }
+
@Override
@AnyThread
public void onUpdateProviderInfo(@Nullable AppWidgetProviderInfo info) {
@@ -322,44 +272,13 @@ public final class QuickstepWidgetHolder extends LauncherWidgetHolder {
}
}
- /**
- * {@code HolderFactory} subclass that takes an interaction handler as one of the parameters
- * when creating a new instance.
- */
- public static class QuickstepHolderFactory extends HolderFactory {
- @SuppressWarnings("unused")
- public QuickstepHolderFactory(Context context) { }
+ /** A factory that generates new instances of {@code LauncherWidgetHolder} */
+ @AssistedFactory
+ public interface QuickstepWidgetHolderFactory extends WidgetHolderFactory {
@Override
- public LauncherWidgetHolder newInstance(@NonNull Context context,
- @Nullable IntConsumer appWidgetRemovedCallback) {
- return newInstance(context, appWidgetRemovedCallback, null);
- }
-
- /**
- * @param context The context of the caller
- * @param appWidgetRemovedCallback The callback that is called when widgets are removed
- * @param interactionHandler The interaction handler when the widgets are clicked
- * @return A new {@link LauncherWidgetHolder} instance
- */
- public LauncherWidgetHolder newInstance(@NonNull Context context,
- @Nullable IntConsumer appWidgetRemovedCallback,
- @Nullable RemoteViews.InteractionHandler interactionHandler) {
-
- if (!FeatureFlags.ENABLE_WIDGET_HOST_IN_BACKGROUND.get()) {
- return new LauncherWidgetHolder(context, appWidgetRemovedCallback) {
- @Override
- protected AppWidgetHost createHost(Context context,
- @Nullable IntConsumer appWidgetRemovedCallback) {
- AppWidgetHost host = super.createHost(context, appWidgetRemovedCallback);
- host.setInteractionHandler(interactionHandler);
- return host;
- }
- };
- }
- return new QuickstepWidgetHolder(context, appWidgetRemovedCallback, interactionHandler);
- }
+ QuickstepWidgetHolder newInstance(@Assisted("UI_CONTEXT") @NonNull Context context);
}
private interface UpdateKey<T> extends BiConsumer<AppWidgetHostView, T> { }
diff --git a/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.kt b/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.kt
index 23dc81d4e6..c9f791c6ee 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.kt
+++ b/quickstep/src/com/android/launcher3/uioverrides/RecentsViewStateController.kt
@@ -21,6 +21,7 @@ import com.android.app.animation.Interpolators.FINAL_FRAME
import com.android.app.animation.Interpolators.INSTANT
import com.android.app.animation.Interpolators.LINEAR
import com.android.launcher3.Flags.enableDesktopExplodedView
+import com.android.launcher3.Flags.enableGridOnlyOverview
import com.android.launcher3.Flags.enableLargeDesktopWindowingTile
import com.android.launcher3.LauncherState
import com.android.launcher3.anim.AnimatedFloat
@@ -143,7 +144,11 @@ class RecentsViewStateController(private val launcher: QuickstepLauncher) :
recentsView,
TASK_MODALNESS,
toState.overviewModalness,
- config.getInterpolator(ANIM_OVERVIEW_MODAL, LINEAR),
+ config.getInterpolator(
+ ANIM_OVERVIEW_MODAL,
+ if (enableGridOnlyOverview() && !toState.isRecentsViewVisible) FINAL_FRAME
+ else LINEAR,
+ ),
)
val fromState = launcher.stateManager.state
diff --git a/quickstep/src/com/android/launcher3/uioverrides/states/OverviewModalTaskState.java b/quickstep/src/com/android/launcher3/uioverrides/states/OverviewModalTaskState.java
index 0c0b4fd203..ae82f82c01 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/states/OverviewModalTaskState.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/states/OverviewModalTaskState.java
@@ -15,11 +15,11 @@
*/
package com.android.launcher3.uioverrides.states;
+import static com.android.launcher3.Flags.enableGridOnlyOverview;
import static com.android.launcher3.logging.StatsLogManager.LAUNCHER_STATE_OVERVIEW;
import android.graphics.Rect;
-import com.android.launcher3.Flags;
import com.android.launcher3.Launcher;
import com.android.launcher3.LauncherState;
import com.android.launcher3.views.ActivityContext;
@@ -50,6 +50,9 @@ public class OverviewModalTaskState extends OverviewState {
@Override
public float[] getOverviewScaleAndOffset(Launcher launcher) {
+ if (enableGridOnlyOverview()) {
+ return super.getOverviewScaleAndOffset(launcher);
+ }
return getOverviewScaleAndOffsetForModalState(launcher.getOverviewPanel());
}
@@ -65,7 +68,7 @@ public class OverviewModalTaskState extends OverviewState {
@Override
public boolean isTaskbarStashed(Launcher launcher) {
- if (Flags.enableGridOnlyOverview()) {
+ if (enableGridOnlyOverview()) {
return true;
}
return super.isTaskbarStashed(launcher);
diff --git a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewDismissTouchController.kt b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewDismissTouchController.kt
index 454a307300..eac5235dda 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewDismissTouchController.kt
+++ b/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/TaskViewDismissTouchController.kt
@@ -63,6 +63,7 @@ CONTAINER : RecentsViewContainer {
private var hasDismissThresholdHapticRun = false
private var initialDisplacement: Float = 0f
private var recentsScaleAnimation: SpringAnimation? = null
+ private var isBlockedDuringDismissal = false
private fun canInterceptTouch(ev: MotionEvent): Boolean =
when {
@@ -137,6 +138,7 @@ CONTAINER : RecentsViewContainer {
}
override fun onDragStart(start: Boolean, startDisplacement: Float) {
+ if (isBlockedDuringDismissal) return
val taskBeingDragged = taskBeingDragged ?: return
initialDisplacement =
@@ -149,6 +151,7 @@ CONTAINER : RecentsViewContainer {
}
override fun onDrag(displacement: Float): Boolean {
+ if (isBlockedDuringDismissal) return true
val taskBeingDragged = taskBeingDragged ?: return false
val currentDisplacement = displacement + initialDisplacement
val boundedDisplacement =
@@ -204,14 +207,11 @@ CONTAINER : RecentsViewContainer {
}
override fun onDragEnd(velocity: Float) {
+ if (isBlockedDuringDismissal) return
val taskBeingDragged = taskBeingDragged ?: return
val currentDisplacement =
taskBeingDragged.secondaryDismissTranslationProperty.get(taskBeingDragged)
- if (currentDisplacement == 0f) {
- clearState()
- return
- }
val isBeyondDismissThreshold =
abs(currentDisplacement) > abs(DISMISS_THRESHOLD_FRACTION * dismissLength)
val velocityIsGoingUp = recentsView.pagedOrientationHandler.isGoingUp(velocity, isRtl)
@@ -225,7 +225,6 @@ CONTAINER : RecentsViewContainer {
taskBeingDragged,
velocity,
isDismissing,
- detector,
dismissLength,
this::clearState,
)
@@ -234,6 +233,7 @@ CONTAINER : RecentsViewContainer {
if (isDismissing) (dismissLength * verticalFactor).toFloat() else 0f
)
}
+ isBlockedDuringDismissal = true
recentsScaleAnimation =
recentsView.animateRecentsScale(RECENTS_SCALE_DEFAULT).addEndListener { _, _, _, _ ->
recentsScaleAnimation = null
@@ -246,6 +246,7 @@ CONTAINER : RecentsViewContainer {
taskBeingDragged?.translationZ = 0f
taskBeingDragged = null
springAnimation = null
+ isBlockedDuringDismissal = false
}
private fun getRecentsScale(dismissFraction: Float): Float {
diff --git a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
index 168b856b25..47aa1de646 100644
--- a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
+++ b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
@@ -1614,7 +1614,7 @@ public abstract class AbsSwipeUpHandler<
TaskStackChangeListeners.getInstance().registerTaskStackListener(
mActivityRestartListener);
- mParallelRunningAnim = mContainerInterface.getParallelAnimationToLauncher(
+ mParallelRunningAnim = mContainerInterface.getParallelAnimationToGestureEndTarget(
mGestureState.getEndTarget(), duration,
mTaskAnimationManager.getCurrentCallbacks());
if (mParallelRunningAnim != null) {
diff --git a/quickstep/src/com/android/quickstep/BaseContainerInterface.java b/quickstep/src/com/android/quickstep/BaseContainerInterface.java
index c64067aa58..244dfc3971 100644
--- a/quickstep/src/com/android/quickstep/BaseContainerInterface.java
+++ b/quickstep/src/com/android/quickstep/BaseContainerInterface.java
@@ -182,7 +182,7 @@ public abstract class BaseContainerInterface<STATE_TYPE extends BaseState<STATE_
* Called when the gesture ends and the animation starts towards the given target. Used to add
* an optional additional animation with the same duration.
*/
- public @Nullable Animator getParallelAnimationToLauncher(
+ public @Nullable Animator getParallelAnimationToGestureEndTarget(
GestureState.GestureEndTarget endTarget, long duration,
RecentsAnimationCallbacks callbacks) {
if (endTarget == RECENTS) {
diff --git a/quickstep/src/com/android/quickstep/DisplayModel.kt b/quickstep/src/com/android/quickstep/DisplayModel.kt
index 3de6fd05ed..0b8af4045b 100644
--- a/quickstep/src/com/android/quickstep/DisplayModel.kt
+++ b/quickstep/src/com/android/quickstep/DisplayModel.kt
@@ -23,10 +23,13 @@ import android.util.SparseArray
import android.view.Display
import androidx.core.util.valueIterator
import com.android.quickstep.DisplayModel.DisplayResource
+import com.android.quickstep.SystemDecorationChangeObserver.Companion.INSTANCE
+import com.android.quickstep.SystemDecorationChangeObserver.DisplayDecorationListener
import java.io.PrintWriter
/** data model for managing resources with lifecycles that match that of the connected display */
-abstract class DisplayModel<RESOURCE_TYPE : DisplayResource>(val context: Context) {
+abstract class DisplayModel<RESOURCE_TYPE : DisplayResource>(val context: Context) :
+ DisplayDecorationListener {
companion object {
private const val TAG = "DisplayModel"
@@ -34,19 +37,20 @@ abstract class DisplayModel<RESOURCE_TYPE : DisplayResource>(val context: Contex
}
private val displayManager = context.getSystemService(Context.DISPLAY_SERVICE) as DisplayManager
+ private var systemDecorationChangeObserver: SystemDecorationChangeObserver? = null
protected val displayResourceArray = SparseArray<RESOURCE_TYPE>()
- fun onDisplayAddSystemDecorations(displayId: Int) {
+ override fun onDisplayAddSystemDecorations(displayId: Int) {
if (DEBUG) Log.d(TAG, "onDisplayAdded: displayId=$displayId")
storeDisplayResource(displayId)
}
- fun onDisplayRemoved(displayId: Int) {
+ override fun onDisplayRemoved(displayId: Int) {
if (DEBUG) Log.d(TAG, "onDisplayRemoved: displayId=$displayId")
deleteDisplayResource(displayId)
}
- fun onDisplayRemoveSystemDecorations(displayId: Int) {
+ override fun onDisplayRemoveSystemDecorations(displayId: Int) {
if (DEBUG) Log.d(TAG, "onDisplayRemoveSystemDecorations: displayId=$displayId")
deleteDisplayResource(displayId)
}
@@ -54,12 +58,16 @@ abstract class DisplayModel<RESOURCE_TYPE : DisplayResource>(val context: Contex
protected abstract fun createDisplayResource(display: Display): RESOURCE_TYPE
protected fun initializeDisplays() {
+ systemDecorationChangeObserver = INSTANCE[context]
+ systemDecorationChangeObserver?.registerDisplayDecorationListener(this)
displayManager.displays
.filter { getDisplayResource(it.displayId) == null }
.forEach { storeDisplayResource(it.displayId) }
}
fun destroy() {
+ systemDecorationChangeObserver?.unregisterDisplayDecorationListener(this)
+ systemDecorationChangeObserver = null
displayResourceArray.valueIterator().forEach { displayResource ->
displayResource.cleanup()
}
diff --git a/quickstep/src/com/android/quickstep/FallbackActivityInterface.java b/quickstep/src/com/android/quickstep/FallbackActivityInterface.java
index d8e0296a68..7654471555 100644
--- a/quickstep/src/com/android/quickstep/FallbackActivityInterface.java
+++ b/quickstep/src/com/android/quickstep/FallbackActivityInterface.java
@@ -203,16 +203,16 @@ public final class FallbackActivityInterface extends
}
@Override
- public @Nullable Animator getParallelAnimationToLauncher(GestureEndTarget endTarget,
+ public @Nullable Animator getParallelAnimationToGestureEndTarget(GestureEndTarget endTarget,
long duration, RecentsAnimationCallbacks callbacks) {
FallbackTaskbarUIController uiController = getTaskbarController();
- Animator superAnimator = super.getParallelAnimationToLauncher(
+ Animator superAnimator = super.getParallelAnimationToGestureEndTarget(
endTarget, duration, callbacks);
if (uiController == null) {
return superAnimator;
}
- RecentsState toState = stateFromGestureEndTarget(endTarget);
- Animator taskbarAnimator = uiController.createAnimToRecentsState(toState, duration);
+ Animator taskbarAnimator = uiController.getParallelAnimationToGestureEndTarget(
+ endTarget, duration, callbacks);
if (taskbarAnimator == null) {
return superAnimator;
}
diff --git a/quickstep/src/com/android/quickstep/FallbackWindowInterface.java b/quickstep/src/com/android/quickstep/FallbackWindowInterface.java
index 35630ef57f..503f047e4f 100644
--- a/quickstep/src/com/android/quickstep/FallbackWindowInterface.java
+++ b/quickstep/src/com/android/quickstep/FallbackWindowInterface.java
@@ -31,7 +31,7 @@ import androidx.annotation.Nullable;
import com.android.launcher3.DeviceProfile;
import com.android.launcher3.statemanager.StateManager;
-import com.android.launcher3.taskbar.FallbackTaskbarUIController;
+import com.android.launcher3.taskbar.TaskbarUIController;
import com.android.launcher3.util.DisplayController;
import com.android.quickstep.GestureState.GestureEndTarget;
import com.android.quickstep.fallback.RecentsState;
@@ -104,14 +104,9 @@ public final class FallbackWindowInterface extends BaseWindowInterface{
}
@Override
- public FallbackTaskbarUIController getTaskbarController() {
+ public TaskbarUIController getTaskbarController() {
RecentsWindowManager manager = getCreatedContainer();
- if (manager == null) {
- return null;
- }
- return null;
- // todo b/365775636: pass a taskbar implementation
- // return manager.getTaskbarUIController();
+ return manager == null ? null : manager.getTaskbarUIController();
}
@Override
@@ -213,16 +208,16 @@ public final class FallbackWindowInterface extends BaseWindowInterface{
}
@Override
- public @Nullable Animator getParallelAnimationToLauncher(GestureEndTarget endTarget,
+ public @Nullable Animator getParallelAnimationToGestureEndTarget(GestureEndTarget endTarget,
long duration, RecentsAnimationCallbacks callbacks) {
- FallbackTaskbarUIController uiController = getTaskbarController();
- Animator superAnimator = super.getParallelAnimationToLauncher(
+ TaskbarUIController uiController = getTaskbarController();
+ Animator superAnimator = super.getParallelAnimationToGestureEndTarget(
endTarget, duration, callbacks);
if (uiController == null) {
return superAnimator;
}
- RecentsState toState = stateFromGestureEndTarget(endTarget);
- Animator taskbarAnimator = uiController.createAnimToRecentsState(toState, duration);
+ Animator taskbarAnimator = uiController.getParallelAnimationToGestureEndTarget(
+ endTarget, duration, callbacks);
if (taskbarAnimator == null) {
return superAnimator;
}
diff --git a/quickstep/src/com/android/quickstep/HomeVisibilityState.kt b/quickstep/src/com/android/quickstep/HomeVisibilityState.kt
index 1345e0b344..020b9e2fab 100644
--- a/quickstep/src/com/android/quickstep/HomeVisibilityState.kt
+++ b/quickstep/src/com/android/quickstep/HomeVisibilityState.kt
@@ -18,6 +18,9 @@ package com.android.quickstep
import android.os.RemoteException
import android.util.Log
+import android.view.InsetsState
+import android.view.WindowInsets
+
import com.android.launcher3.Utilities
import com.android.launcher3.config.FeatureFlags
import com.android.launcher3.util.Executors
@@ -30,6 +33,8 @@ class HomeVisibilityState {
var isHomeVisible = true
private set
+ @Volatile var navbarInsetPosition = 0
+
private var listeners = mutableSetOf<VisibilityChangeListener>()
fun addListener(l: VisibilityChangeListener) = listeners.add(l)
@@ -50,6 +55,11 @@ class HomeVisibilityState {
},
)
}
+ override fun onDisplayInsetsChanged(insetsState: InsetsState) {
+ val bottomInset = insetsState.calculateInsets(insetsState.displayFrame,
+ WindowInsets.Type.navigationBars(), false).bottom
+ navbarInsetPosition = insetsState.displayFrame.bottom - bottomInset
+ }
}
)
} catch (e: RemoteException) {
diff --git a/quickstep/src/com/android/quickstep/InputConsumerUtils.kt b/quickstep/src/com/android/quickstep/InputConsumerUtils.kt
index c8ca5344c2..89b5b291c6 100644
--- a/quickstep/src/com/android/quickstep/InputConsumerUtils.kt
+++ b/quickstep/src/com/android/quickstep/InputConsumerUtils.kt
@@ -550,7 +550,7 @@ object InputConsumerUtils {
(com.android.launcher3.Flags.useActivityOverlay() &&
runningTask != null &&
runningTask.isHomeTask &&
- overviewComponentObserver.isHomeAndOverviewSame &&
+ overviewComponentObserver.isHomeAndOverviewSameActivity &&
!launcherResumedThroughShellTransition &&
!previousGestureState.isRecentsAnimationRunning)
diff --git a/quickstep/src/com/android/quickstep/LauncherActivityInterface.java b/quickstep/src/com/android/quickstep/LauncherActivityInterface.java
index ac0aa76ad5..fa8e4846b3 100644
--- a/quickstep/src/com/android/quickstep/LauncherActivityInterface.java
+++ b/quickstep/src/com/android/quickstep/LauncherActivityInterface.java
@@ -261,7 +261,8 @@ public final class LauncherActivityInterface extends
return launcher != null
&& launcher.getStateManager().getState() == OVERVIEW
&& launcher.isStarted()
- && TopTaskTracker.INSTANCE.get(launcher).getCachedTopTask(false).isHomeTask();
+ && TopTaskTracker.INSTANCE.get(launcher).getCachedTopTask(false,
+ launcher.getDisplayId()).isHomeTask();
}
private boolean isInMinusOne() {
@@ -270,7 +271,8 @@ public final class LauncherActivityInterface extends
return launcher != null
&& launcher.getStateManager().getState() == NORMAL
&& !launcher.isStarted()
- && TopTaskTracker.INSTANCE.get(launcher).getCachedTopTask(false).isHomeTask();
+ && TopTaskTracker.INSTANCE.get(launcher).getCachedTopTask(false,
+ launcher.getDisplayId()).isHomeTask();
}
@Override
@@ -298,16 +300,16 @@ public final class LauncherActivityInterface extends
}
@Override
- public @Nullable Animator getParallelAnimationToLauncher(GestureEndTarget endTarget,
+ public @Nullable Animator getParallelAnimationToGestureEndTarget(GestureEndTarget endTarget,
long duration, RecentsAnimationCallbacks callbacks) {
LauncherTaskbarUIController uiController = getTaskbarController();
- Animator superAnimator = super.getParallelAnimationToLauncher(
+ Animator superAnimator = super.getParallelAnimationToGestureEndTarget(
endTarget, duration, callbacks);
if (uiController == null || callbacks == null) {
return superAnimator;
}
- LauncherState toState = stateFromGestureEndTarget(endTarget);
- Animator taskbarAnimator = uiController.createAnimToLauncher(toState, callbacks, duration);
+ Animator taskbarAnimator = uiController.getParallelAnimationToGestureEndTarget(endTarget,
+ duration, callbacks);
if (superAnimator == null) {
return taskbarAnimator;
} else {
diff --git a/quickstep/src/com/android/quickstep/OverviewCommandHelper.kt b/quickstep/src/com/android/quickstep/OverviewCommandHelper.kt
index 6a9c3dd519..8b9a3daea8 100644
--- a/quickstep/src/com/android/quickstep/OverviewCommandHelper.kt
+++ b/quickstep/src/com/android/quickstep/OverviewCommandHelper.kt
@@ -450,10 +450,10 @@ constructor(
)
gestureState.isHandlingAtomicEvent = true
val interactionHandler =
- touchInteractionService.swipeUpHandlerFactory.newHandler(
- gestureState,
- command.createTime,
- )
+ touchInteractionService
+ // TODO(b/404757863): use command.displayId instead of focusedDisplayId.
+ .getSwipeUpHandlerFactory(focusedDisplayId)
+ .newHandler(gestureState, command.createTime)
interactionHandler.setGestureEndCallback {
onTransitionComplete(command, interactionHandler, onCallbackResult)
}
@@ -570,12 +570,7 @@ constructor(
private fun updateRecentsViewFocus(command: CommandInfo) {
val recentsView: RecentsView<*, *> = getVisibleRecentsView(command.displayId) ?: return
- if (
- command.type != KEYBOARD_INPUT &&
- command.type != HIDE &&
- command.type != SHOW &&
- command.type != TOGGLE
- ) {
+ if (command.type != KEYBOARD_INPUT && command.type != HIDE && command.type != SHOW) {
return
}
diff --git a/quickstep/src/com/android/quickstep/OverviewComponentObserver.java b/quickstep/src/com/android/quickstep/OverviewComponentObserver.java
index 7d3a1da76f..e7386dcb93 100644
--- a/quickstep/src/com/android/quickstep/OverviewComponentObserver.java
+++ b/quickstep/src/com/android/quickstep/OverviewComponentObserver.java
@@ -24,6 +24,7 @@ import static android.view.Display.DEFAULT_DISPLAY;
import static com.android.launcher3.Flags.enableOverviewOnConnectedDisplays;
import static com.android.launcher3.config.FeatureFlags.SEPARATE_RECENTS_ACTIVITY;
import static com.android.launcher3.util.Executors.MAIN_EXECUTOR;
+import static com.android.quickstep.fallback.window.RecentsWindowFlags.enableFallbackOverviewInWindow;
import static com.android.quickstep.fallback.window.RecentsWindowFlags.enableLauncherOverviewInWindow;
import static com.android.systemui.shared.system.PackageManagerWrapper.ACTION_PREFERRED_ACTIVITY_CHANGED;
@@ -50,7 +51,6 @@ import com.android.launcher3.util.DaggerSingletonObject;
import com.android.launcher3.util.DaggerSingletonTracker;
import com.android.launcher3.util.SimpleBroadcastReceiver;
import com.android.quickstep.fallback.window.RecentsDisplayModel;
-import com.android.quickstep.fallback.window.RecentsWindowFlags;
import com.android.quickstep.util.ActiveGestureProtoLogProxy;
import com.android.systemui.shared.system.PackageManagerWrapper;
@@ -181,7 +181,7 @@ public final class OverviewComponentObserver {
mDefaultDisplayContainerInterface.onAssistantVisibilityChanged(0.f);
}
- if (SEPARATE_RECENTS_ACTIVITY.get() || enableLauncherOverviewInWindow.isTrue()) {
+ if (SEPARATE_RECENTS_ACTIVITY.get()) {
mIsDefaultHome = false;
if (defaultHome == null) {
defaultHome = mMyHomeIntent.getComponent();
@@ -194,8 +194,13 @@ public final class OverviewComponentObserver {
+ ", mIsDefaultHome=" + mIsDefaultHome);
if (!mIsHomeDisabled && (defaultHome == null || mIsDefaultHome)) {
- // User default home is same as out home app. Use Overview integrated in Launcher.
- mDefaultDisplayContainerInterface = LauncherActivityInterface.INSTANCE;
+ // User default home is same as our home app. Use Overview integrated in Launcher.
+ if (enableLauncherOverviewInWindow.isTrue()) {
+ mDefaultDisplayContainerInterface =
+ mRecentsDisplayModel.getFallbackWindowInterface(DEFAULT_DISPLAY);
+ } else {
+ mDefaultDisplayContainerInterface = LauncherActivityInterface.INSTANCE;
+ }
mIsHomeAndOverviewSame = true;
mOverviewIntent = mMyHomeIntent;
mCurrentHomeIntent.setComponent(mMyHomeIntent.getComponent());
@@ -204,7 +209,7 @@ public final class OverviewComponentObserver {
unregisterOtherHomeAppUpdateReceiver();
} else {
// The default home app is a different launcher. Use the fallback Overview instead.
- if (RecentsWindowFlags.Companion.getEnableOverviewInWindow()) {
+ if (enableFallbackOverviewInWindow.isTrue()) {
mDefaultDisplayContainerInterface =
mRecentsDisplayModel.getFallbackWindowInterface(DEFAULT_DISPLAY);
} else {
@@ -290,12 +295,16 @@ public final class OverviewComponentObserver {
}
/**
- * Returns true if home and overview are same activity.
+ * Returns true if home and overview are same process.
*/
public boolean isHomeAndOverviewSame() {
return mIsHomeAndOverviewSame;
}
+ public boolean isHomeAndOverviewSameActivity() {
+ return isHomeAndOverviewSame() && !enableLauncherOverviewInWindow.isTrue();
+ }
+
/**
* Get the current control helper for managing interactions to the overview container for
* the given displayId.
diff --git a/quickstep/src/com/android/quickstep/RecentTasksList.java b/quickstep/src/com/android/quickstep/RecentTasksList.java
index dab78c5df3..a77241549c 100644
--- a/quickstep/src/com/android/quickstep/RecentTasksList.java
+++ b/quickstep/src/com/android/quickstep/RecentTasksList.java
@@ -504,7 +504,7 @@ public class RecentTasksList implements WindowManagerProxy.DesktopVisibilityList
for (TaskInfo taskInfo : recentTaskInfo.getTaskInfoList()) {
Task task = createTask(taskInfo, minimizedTaskIds);
List<Task> tasks = perDisplayTasks.computeIfAbsent(
- ExternalDisplaysKt.getDisplayId(task),
+ ExternalDisplaysKt.getSafeDisplayId(task),
k -> new ArrayList<>());
tasks.add(task);
}
diff --git a/quickstep/src/com/android/quickstep/RemoteTargetGluer.java b/quickstep/src/com/android/quickstep/RemoteTargetGluer.java
index f96bbcb097..943f543809 100644
--- a/quickstep/src/com/android/quickstep/RemoteTargetGluer.java
+++ b/quickstep/src/com/android/quickstep/RemoteTargetGluer.java
@@ -68,8 +68,10 @@ public class RemoteTargetGluer {
* running tasks
*/
public RemoteTargetGluer(Context context, BaseContainerInterface sizingStrategy) {
+ // TODO: b/403344864 Make sure init with correct number of RemoteTargetHandle with
+ // multi-desks feature enabled as well.
int visibleTasksCount = DesktopVisibilityController.INSTANCE.get(context)
- .getVisibleDesktopTasksCount();
+ .getVisibleDesktopTasksCountDeprecated();
if (visibleTasksCount > 0) {
// Allocate +1 to account for a new task added to the desktop mode
int numHandles = visibleTasksCount + 1;
diff --git a/quickstep/src/com/android/quickstep/SystemDecorationChangeObserver.kt b/quickstep/src/com/android/quickstep/SystemDecorationChangeObserver.kt
new file mode 100644
index 0000000000..45594786aa
--- /dev/null
+++ b/quickstep/src/com/android/quickstep/SystemDecorationChangeObserver.kt
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.quickstep
+
+import android.content.Context
+import android.util.Log
+import com.android.launcher3.dagger.ApplicationContext
+import com.android.launcher3.dagger.LauncherAppSingleton
+import com.android.launcher3.util.DaggerSingletonObject
+import com.android.launcher3.util.Executors.MAIN_EXECUTOR
+import com.android.quickstep.dagger.QuickstepBaseAppComponent
+import javax.inject.Inject
+
+@LauncherAppSingleton
+class SystemDecorationChangeObserver @Inject constructor(@ApplicationContext context: Context) {
+ companion object {
+ private const val TAG = "SystemDecorationChangeObserver"
+ private const val DEBUG = false
+
+ @JvmStatic
+ val INSTANCE: DaggerSingletonObject<SystemDecorationChangeObserver> =
+ DaggerSingletonObject<SystemDecorationChangeObserver>(
+ QuickstepBaseAppComponent::getSystemDecorationChangeObserver
+ )
+ }
+
+ interface DisplayDecorationListener {
+ fun onDisplayAddSystemDecorations(displayId: Int)
+
+ fun onDisplayRemoved(displayId: Int)
+
+ fun onDisplayRemoveSystemDecorations(displayId: Int)
+ }
+
+ fun notifyAddSystemDecorations(displayId: Int) {
+ if (DEBUG) Log.d(TAG, "SystemDecorationAdded: $displayId")
+ for (listener in mDisplayDecorationListeners) {
+ MAIN_EXECUTOR.execute { listener.onDisplayAddSystemDecorations(displayId) }
+ }
+ }
+
+ fun notifyOnDisplayRemoved(displayId: Int) {
+ if (DEBUG) Log.d(TAG, "displayRemoved: $displayId")
+ for (listener in mDisplayDecorationListeners) {
+ MAIN_EXECUTOR.execute { listener.onDisplayRemoved(displayId) }
+ }
+ }
+
+ fun notifyDisplayRemoveSystemDecorations(displayId: Int) {
+ if (DEBUG) Log.d(TAG, "SystemDecorationRemoved: $displayId")
+ for (listener in mDisplayDecorationListeners) {
+ MAIN_EXECUTOR.execute { listener.onDisplayRemoveSystemDecorations(displayId) }
+ }
+ }
+
+ private val mDisplayDecorationListeners = ArrayList<DisplayDecorationListener>()
+
+ fun registerDisplayDecorationListener(listener: DisplayDecorationListener) {
+ if (DEBUG) Log.d(TAG, "registerDisplayDecorationListener")
+ mDisplayDecorationListeners.add(listener)
+ }
+
+ fun unregisterDisplayDecorationListener(listener: DisplayDecorationListener) {
+ if (DEBUG) Log.d(TAG, "unregisterDisplayDecorationListener")
+ mDisplayDecorationListeners.remove(listener)
+ }
+}
diff --git a/quickstep/src/com/android/quickstep/TaskAnimationManager.java b/quickstep/src/com/android/quickstep/TaskAnimationManager.java
index 4f00381271..cf0a3d570f 100644
--- a/quickstep/src/com/android/quickstep/TaskAnimationManager.java
+++ b/quickstep/src/com/android/quickstep/TaskAnimationManager.java
@@ -59,6 +59,7 @@ import com.android.systemui.shared.system.TaskStackChangeListeners;
import java.io.PrintWriter;
import java.util.HashMap;
+import java.util.Locale;
public class TaskAnimationManager implements RecentsAnimationCallbacks.RecentsAnimationListener {
public static final boolean SHELL_TRANSITIONS_ROTATION =
@@ -132,6 +133,17 @@ public class TaskAnimationManager implements RecentsAnimationCallbacks.RecentsAn
public RecentsAnimationCallbacks startRecentsAnimation(@NonNull GestureState gestureState,
Intent intent, RecentsAnimationCallbacks.RecentsAnimationListener listener) {
ActiveGestureProtoLogProxy.logStartRecentsAnimation();
+ // Check displayId
+ if (mDisplayId != gestureState.getDisplayId()) {
+ String msg = String.format(Locale.ENGLISH,
+ "Constructor displayId %d does not equal gestureState display id %d",
+ mDisplayId, gestureState.getDisplayId());
+ if (FeatureFlags.IS_STUDIO_BUILD) {
+ throw new IllegalArgumentException(msg);
+ } else {
+ Log.e("TaskAnimationManager", msg, new Exception());
+ }
+ }
// Notify if recents animation is still running
if (mController != null) {
String msg = "New recents animation started before old animation completed";
@@ -239,11 +251,11 @@ public class TaskAnimationManager implements RecentsAnimationCallbacks.RecentsAn
RemoteAnimationTarget appearedTaskTarget = appearedTaskTargets[0];
BaseContainerInterface containerInterface =
mLastGestureState.getContainerInterface();
-
for (RemoteAnimationTarget compat : appearedTaskTargets) {
if (compat.windowConfiguration.getActivityType() == ACTIVITY_TYPE_HOME
&& containerInterface.getCreatedContainer() instanceof RecentsActivity
- && DisplayController.getNavigationMode(mCtx) != NO_BUTTON) {
+ && DisplayController.INSTANCE.get(mCtx).getInfoForDisplay(
+ mDisplayId).getNavigationMode() != NO_BUTTON) {
// The only time we get onTasksAppeared() in button navigation with a
// 3p launcher is if the user goes to overview first, and in this case we
// can immediately finish the transition
diff --git a/quickstep/src/com/android/quickstep/TaskOverlayFactory.java b/quickstep/src/com/android/quickstep/TaskOverlayFactory.java
index df66a5e30e..ae6bfbc517 100644
--- a/quickstep/src/com/android/quickstep/TaskOverlayFactory.java
+++ b/quickstep/src/com/android/quickstep/TaskOverlayFactory.java
@@ -202,10 +202,14 @@ public class TaskOverlayFactory implements ResourceBasedOverride {
*/
public void initOverlay(Task task, @Nullable Bitmap thumbnail, Matrix matrix,
boolean rotated) {
- getActionsView().updateDisabledFlags(DISABLED_NO_THUMBNAIL, thumbnail == null);
+ if (!enableRefactorTaskThumbnail()) {
+ getActionsView().updateDisabledFlags(DISABLED_NO_THUMBNAIL, thumbnail == null);
+ }
if (thumbnail != null) {
- getActionsView().updateDisabledFlags(DISABLED_ROTATED, rotated);
+ if (!enableRefactorTaskThumbnail()) {
+ getActionsView().updateDisabledFlags(DISABLED_ROTATED, rotated);
+ }
getActionsView().setCallbacks(new OverlayUICallbacksImpl(isRealSnapshot(), task));
}
}
diff --git a/quickstep/src/com/android/quickstep/TopTaskTracker.java b/quickstep/src/com/android/quickstep/TopTaskTracker.java
index 8116a8867d..7e773e3a58 100644
--- a/quickstep/src/com/android/quickstep/TopTaskTracker.java
+++ b/quickstep/src/com/android/quickstep/TopTaskTracker.java
@@ -22,8 +22,10 @@ import static android.content.Intent.ACTION_CHOOSER;
import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
import static android.view.Display.DEFAULT_DISPLAY;
+import static com.android.launcher3.Flags.enableOverviewOnConnectedDisplays;
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.quickstep.fallback.window.RecentsWindowFlags.enableOverviewOnConnectedDisplays;
import static com.android.wm.shell.Flags.enableShellTopTaskTracking;
import static com.android.wm.shell.Flags.enableFlexibleSplit;
import static com.android.wm.shell.shared.GroupedTaskInfo.TYPE_SPLIT;
@@ -47,6 +49,7 @@ import com.android.launcher3.util.SplitConfigurationOptions.StageType;
import com.android.launcher3.util.TraceHelper;
import com.android.quickstep.dagger.QuickstepBaseAppComponent;
import com.android.quickstep.util.DesksUtils;
+import com.android.quickstep.util.ExternalDisplaysKt;
import com.android.systemui.shared.recents.model.Task;
import com.android.systemui.shared.recents.model.Task.TaskKey;
import com.android.systemui.shared.system.ActivityManagerWrapper;
@@ -316,21 +319,26 @@ public class TopTaskTracker extends ISplitScreenListener.Stub implements TaskSta
*/
@NonNull
@UiThread
- public CachedTaskInfo getCachedTopTask(boolean filterOnlyVisibleRecents) {
+ public CachedTaskInfo getCachedTopTask(boolean filterOnlyVisibleRecents, int displayId) {
if (enableShellTopTaskTracking()) {
// TODO(346588978): Currently ignore filterOnlyVisibleRecents, but perhaps make this an
// explicit filter For things to ignore (ie. PIP/Bubbles/Assistant/etc/so that this is
// explicit)
- // TODO(346588978): This assumes default display as gesture nav is only supported there
- return new CachedTaskInfo(mVisibleTasks.get(DEFAULT_DISPLAY));
+ return new CachedTaskInfo(mVisibleTasks.get(displayId));
} else {
if (filterOnlyVisibleRecents) {
// Since we only know about the top most task, any filtering may not be applied on
// the cache. The second to top task may change while the top task is still the
// same.
- RunningTaskInfo[] tasks = TraceHelper.allowIpcs("getCachedTopTask.true", () ->
+ TaskInfo[] tasks = TraceHelper.allowIpcs("getCachedTopTask.true", () ->
ActivityManagerWrapper.getInstance().getRunningTasks(true));
- return new CachedTaskInfo(Arrays.asList(tasks));
+ if (enableOverviewOnConnectedDisplays()) {
+ return new CachedTaskInfo(Arrays.stream(tasks).filter(
+ info -> ExternalDisplaysKt.getSafeDisplayId(info)
+ == displayId).toList());
+ } else {
+ return new CachedTaskInfo(Arrays.asList(tasks));
+ }
}
if (mOrderedTaskList.isEmpty()) {
@@ -344,7 +352,12 @@ public class TopTaskTracker extends ISplitScreenListener.Stub implements TaskSta
// Strip the pinned task and recents task
tasks.removeIf(t -> t.taskId == mPinnedTaskId || isRecentsTask(t)
|| DesksUtils.isDesktopWallpaperTask(t));
- return new CachedTaskInfo(tasks);
+ if (enableOverviewOnConnectedDisplays()) {
+ return new CachedTaskInfo(tasks.stream().filter(
+ info -> ExternalDisplaysKt.getSafeDisplayId(info) == displayId).toList());
+ } else {
+ return new CachedTaskInfo(tasks);
+ }
}
}
diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java
index 7878e68a94..30936ad9d4 100644
--- a/quickstep/src/com/android/quickstep/TouchInteractionService.java
+++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java
@@ -95,7 +95,6 @@ import com.android.quickstep.OverviewCommandHelper.CommandType;
import com.android.quickstep.OverviewComponentObserver.OverviewChangeListener;
import com.android.quickstep.fallback.window.RecentsDisplayModel;
import com.android.quickstep.fallback.window.RecentsDisplayModel.RecentsDisplayResource;
-import com.android.quickstep.fallback.window.RecentsWindowFlags;
import com.android.quickstep.fallback.window.RecentsWindowSwipeHandler;
import com.android.quickstep.inputconsumers.BubbleBarInputConsumer;
import com.android.quickstep.inputconsumers.OneHandedModeInputConsumer;
@@ -315,32 +314,25 @@ public class TouchInteractionService extends Service {
@BinderThread
@Override
public void onDisplayAddSystemDecorations(int displayId) {
- executeForTaskbarManager(taskbarManager ->
- taskbarManager.onDisplayAddSystemDecorations(displayId));
-
- executeForRecentsDisplayModel(displayModel ->
- displayModel.onDisplayAddSystemDecorations(displayId));
+ executeForTouchInteractionService(tis ->
+ tis.mSystemDecorationChangeObserver.notifyAddSystemDecorations(displayId));
}
@BinderThread
@Override
public void onDisplayRemoved(int displayId) {
- executeForTaskbarManager(taskbarManager ->
- taskbarManager.onDisplayRemoved(displayId));
executeForTouchInteractionService(tis -> {
+ tis.mSystemDecorationChangeObserver.notifyOnDisplayRemoved(displayId);
tis.mDeviceState.clearSysUIStateFlagsForDisplay(displayId);
});
- executeForRecentsDisplayModel(displayModel ->
- displayModel.onDisplayRemoved(displayId));
}
@BinderThread
@Override
public void onDisplayRemoveSystemDecorations(int displayId) {
- executeForTaskbarManager(taskbarManager ->
- taskbarManager.onDisplayRemoveSystemDecorations(displayId));
- executeForRecentsDisplayModel(displayModel ->
- displayModel.onDisplayRemoveSystemDecorations(displayId));
+ executeForTouchInteractionService(tis -> {
+ tis.mSystemDecorationChangeObserver.notifyDisplayRemoveSystemDecorations(displayId);
+ });
}
@BinderThread
@@ -452,15 +444,6 @@ public class TouchInteractionService extends Service {
}));
}
- private void executeForRecentsDisplayModel(
- @NonNull Consumer<RecentsDisplayModel> recentsDisplayModelConsumer) {
- MAIN_EXECUTOR.execute(() -> executeForTouchInteractionService(tis -> {
- RecentsDisplayModel recentsDisplayModel = tis.mRecentsDisplayModel;
- if (recentsDisplayModel == null) return;
- recentsDisplayModelConsumer.accept(recentsDisplayModel);
- }));
- }
-
/**
* Returns the {@link TaskbarManager}.
* <p>
@@ -597,6 +580,8 @@ public class TouchInteractionService extends Service {
private RecentsDisplayModel mRecentsDisplayModel;
+ private SystemDecorationChangeObserver mSystemDecorationChangeObserver;
+
@Override
public void onCreate() {
super.onCreate();
@@ -608,6 +593,7 @@ public class TouchInteractionService extends Service {
mDeviceState = RecentsAnimationDeviceState.INSTANCE.get(this);
mRotationTouchHelper = RotationTouchHelper.INSTANCE.get(this);
mRecentsDisplayModel = RecentsDisplayModel.getINSTANCE().get(this);
+ mSystemDecorationChangeObserver = SystemDecorationChangeObserver.getINSTANCE().get(this);
mAllAppsActionManager = new AllAppsActionManager(
this, UI_HELPER_EXECUTOR, this::createAllAppsPendingIntent);
mTrackpadsConnected = new ActiveTrackpadList(this, () -> {
@@ -965,7 +951,7 @@ public class TouchInteractionService extends Service {
mGestureState,
taskAnimationManager,
inputMonitorCompat,
- getSwipeUpHandlerFactory(),
+ getSwipeUpHandlerFactory(displayId),
this::onConsumerInactive,
inputEventReceiver,
mTaskbarManager,
@@ -1062,7 +1048,8 @@ public class TouchInteractionService extends Service {
private boolean isHoverActionWithoutConsumer(MotionEvent event) {
// Only process these events when taskbar is present.
- TaskbarActivityContext tac = mTaskbarManager.getCurrentActivityContext();
+ int displayId = event.getDisplayId();
+ TaskbarActivityContext tac = mTaskbarManager.getTaskbarForDisplay(displayId);
boolean isTaskbarPresent = tac != null && tac.getDeviceProfile().isTaskbarPresent
&& !tac.isPhoneMode();
return event.isHoverEvent() && (mUncheckedConsumer.getType() & TYPE_CURSOR_HOVER) == 0
@@ -1089,7 +1076,7 @@ public class TouchInteractionService extends Service {
// previousTaskInfo can be null iff previousGestureState == GestureState.DEFAULT_STATE
taskInfo = previousTaskInfo != null
? previousTaskInfo
- : TopTaskTracker.INSTANCE.get(this).getCachedTopTask(false);
+ : TopTaskTracker.INSTANCE.get(this).getCachedTopTask(false, displayId);
gestureState.updateRunningTask(taskInfo);
gestureState.updateLastStartedTaskIds(previousGestureState.getLastStartedTaskIds());
gestureState.updatePreviouslyAppearedTaskIds(
@@ -1099,7 +1086,7 @@ public class TouchInteractionService extends Service {
mOverviewComponentObserver,
displayId,
ActiveGestureLog.INSTANCE.incrementLogId());
- taskInfo = TopTaskTracker.INSTANCE.get(this).getCachedTopTask(false);
+ taskInfo = TopTaskTracker.INSTANCE.get(this).getCachedTopTask(false, displayId);
gestureState.updateRunningTask(taskInfo);
}
gestureState.setTrackpadGestureType(trackpadGestureType);
@@ -1110,11 +1097,20 @@ public class TouchInteractionService extends Service {
return gestureState;
}
- public AbsSwipeUpHandler.Factory getSwipeUpHandlerFactory() {
- return mOverviewComponentObserver.isHomeAndOverviewSame()
- ? mLauncherSwipeHandlerFactory
- : (RecentsWindowFlags.Companion.getEnableOverviewInWindow()
- ? mRecentsWindowSwipeHandlerFactory : mFallbackSwipeHandlerFactory);
+ /**
+ * Returns a AbsSwipeUpHandler.Factory, used to instantiate AbsSwipeUpHandler later.
+ * @param displayId The displayId of the display this handler will be used on.
+ */
+ public AbsSwipeUpHandler.Factory getSwipeUpHandlerFactory(int displayId) {
+ BaseContainerInterface<?, ?> containerInterface =
+ mOverviewComponentObserver.getContainerInterface(displayId);
+ if (containerInterface instanceof FallbackWindowInterface) {
+ return mRecentsWindowSwipeHandlerFactory;
+ } else if (containerInterface instanceof LauncherActivityInterface) {
+ return mLauncherSwipeHandlerFactory;
+ } else {
+ return mFallbackSwipeHandlerFactory;
+ }
}
/**
diff --git a/quickstep/src/com/android/quickstep/dagger/QuickstepBaseAppComponent.java b/quickstep/src/com/android/quickstep/dagger/QuickstepBaseAppComponent.java
index d79a8eaca1..23b8a82b2a 100644
--- a/quickstep/src/com/android/quickstep/dagger/QuickstepBaseAppComponent.java
+++ b/quickstep/src/com/android/quickstep/dagger/QuickstepBaseAppComponent.java
@@ -25,6 +25,7 @@ import com.android.quickstep.RecentsAnimationDeviceState;
import com.android.quickstep.RecentsModel;
import com.android.quickstep.RotationTouchHelper;
import com.android.quickstep.SimpleOrientationTouchTransformer;
+import com.android.quickstep.SystemDecorationChangeObserver;
import com.android.quickstep.SystemUiProxy;
import com.android.quickstep.TopTaskTracker;
import com.android.quickstep.fallback.window.RecentsDisplayModel;
@@ -71,4 +72,5 @@ public interface QuickstepBaseAppComponent extends LauncherBaseAppComponent {
SimpleOrientationTouchTransformer getSimpleOrientationTouchTransformer();
+ SystemDecorationChangeObserver getSystemDecorationChangeObserver();
}
diff --git a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsStateController.java b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsStateController.java
index 554cea262f..7db1813a90 100644
--- a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsStateController.java
+++ b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsStateController.java
@@ -19,6 +19,7 @@ import static com.android.app.animation.Interpolators.FINAL_FRAME;
import static com.android.app.animation.Interpolators.INSTANT;
import static com.android.app.animation.Interpolators.LINEAR;
import static com.android.launcher3.Flags.enableDesktopExplodedView;
+import static com.android.launcher3.Flags.enableGridOnlyOverview;
import static com.android.launcher3.Flags.enableLargeDesktopWindowingTile;
import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_MODAL;
import static com.android.launcher3.states.StateAnimationConfig.ANIM_OVERVIEW_SCALE;
@@ -118,7 +119,9 @@ public class FallbackRecentsStateController implements StateHandler<RecentsState
config.getInterpolator(ANIM_OVERVIEW_TRANSLATE_Y, LINEAR));
setter.setFloat(mRecentsView, TASK_MODALNESS, state.getOverviewModalness(),
- config.getInterpolator(ANIM_OVERVIEW_MODAL, LINEAR));
+ config.getInterpolator(ANIM_OVERVIEW_MODAL,
+ enableGridOnlyOverview() && !state.isRecentsViewVisible() ? FINAL_FRAME
+ : LINEAR));
setter.setFloat(mRecentsView, FULLSCREEN_PROGRESS, state.isFullScreen() ? 1 : 0, LINEAR);
boolean showAsGrid =
state.displayOverviewTasksAsGrid(mRecentsViewContainer.getDeviceProfile());
diff --git a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java
index 29b662659f..695c77c991 100644
--- a/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java
+++ b/quickstep/src/com/android/quickstep/fallback/FallbackRecentsView.java
@@ -17,6 +17,7 @@ package com.android.quickstep.fallback;
import static android.app.ActivityTaskManager.INVALID_TASK_ID;
+import static com.android.launcher3.Flags.enableGridOnlyOverview;
import static com.android.quickstep.GestureState.GestureEndTarget.RECENTS;
import static com.android.quickstep.fallback.RecentsState.DEFAULT;
import static com.android.quickstep.fallback.RecentsState.MODAL_TASK;
@@ -252,7 +253,14 @@ public class FallbackRecentsView<CONTAINER_TYPE extends Context & RecentsViewCon
@Override
public void onStateTransitionStart(RecentsState toState) {
setOverviewStateEnabled(true);
- setOverviewGridEnabled(toState.displayOverviewTasksAsGrid(mContainer.getDeviceProfile()));
+ if (enableGridOnlyOverview()) {
+ if (toState.displayOverviewTasksAsGrid(mContainer.getDeviceProfile())) {
+ setOverviewGridEnabled(true);
+ }
+ } else {
+ setOverviewGridEnabled(
+ toState.displayOverviewTasksAsGrid(mContainer.getDeviceProfile()));
+ }
setOverviewFullscreenEnabled(toState.isFullScreen());
if (toState == MODAL_TASK) {
setOverviewSelectEnabled(true);
@@ -271,6 +279,11 @@ public class FallbackRecentsView<CONTAINER_TYPE extends Context & RecentsViewCon
@Override
public void onStateTransitionComplete(RecentsState finalState) {
DesktopVisibilityController.INSTANCE.get(mContainer).onLauncherStateChanged(finalState);
+ if (enableGridOnlyOverview()) {
+ if (!finalState.displayOverviewTasksAsGrid(mContainer.getDeviceProfile())) {
+ setOverviewGridEnabled(false);
+ }
+ }
if (!finalState.isRecentsViewVisible()) {
// Clean-up logic that occurs when recents is no longer in use/visible.
reset();
diff --git a/quickstep/src/com/android/quickstep/fallback/RecentsState.java b/quickstep/src/com/android/quickstep/fallback/RecentsState.java
index 2c1a4eb186..77aac4176d 100644
--- a/quickstep/src/com/android/quickstep/fallback/RecentsState.java
+++ b/quickstep/src/com/android/quickstep/fallback/RecentsState.java
@@ -17,6 +17,7 @@ package com.android.quickstep.fallback;
import static com.android.launcher3.Flags.enableDesktopExplodedView;
import static com.android.launcher3.Flags.enableDesktopWindowingCarouselDetach;
+import static com.android.launcher3.Flags.enableGridOnlyOverview;
import static com.android.launcher3.LauncherState.FLAG_CLOSE_POPUPS;
import static com.android.launcher3.uioverrides.states.BackgroundAppState.getOverviewScaleAndOffsetForBackgroundState;
import static com.android.launcher3.uioverrides.states.OverviewModalTaskState.getOverviewScaleAndOffsetForModalState;
@@ -49,23 +50,31 @@ public class RecentsState implements BaseState<RecentsState> {
private static final int FLAG_ADD_DESK_BUTTON = BaseState.getFlag(10);
private static final int FLAG_SHOW_EXPLODED_DESKTOP_VIEW = BaseState.getFlag(11);
+ public static final int DEFAULT_STATE_ORDINAL = 0;
+ public static final int MODAL_TASK_ORDINAL = 1;
+ public static final int BACKGROUND_APP_ORDINAL = 2;
+ public static final int HOME_STATE_ORDINAL = 3;
+ public static final int BG_LAUNCHER_ORDINAL = 4;
+ public static final int OVERVIEW_SPLIT_SELECT_ORDINAL = 5;
+
private static final RecentsState[] sAllStates = new RecentsState[6];
- public static final RecentsState DEFAULT = new RecentsState(0,
+ public static final RecentsState DEFAULT = new RecentsState(DEFAULT_STATE_ORDINAL,
FLAG_DISABLE_RESTORE | FLAG_CLEAR_ALL_BUTTON | FLAG_OVERVIEW_ACTIONS | FLAG_SHOW_AS_GRID
| FLAG_SCRIM | FLAG_LIVE_TILE | FLAG_RECENTS_VIEW_VISIBLE
| FLAG_ADD_DESK_BUTTON | FLAG_SHOW_EXPLODED_DESKTOP_VIEW);
- public static final RecentsState MODAL_TASK = new ModalState(1,
+ public static final RecentsState MODAL_TASK = new ModalState(MODAL_TASK_ORDINAL,
FLAG_DISABLE_RESTORE | FLAG_OVERVIEW_ACTIONS | FLAG_MODAL
| FLAG_SHOW_AS_GRID | FLAG_SCRIM | FLAG_LIVE_TILE | FLAG_RECENTS_VIEW_VISIBLE
| FLAG_SHOW_EXPLODED_DESKTOP_VIEW);
- public static final RecentsState BACKGROUND_APP = new BackgroundAppState(2,
+ public static final RecentsState BACKGROUND_APP = new BackgroundAppState(BACKGROUND_APP_ORDINAL,
FLAG_DISABLE_RESTORE | FLAG_NON_INTERACTIVE | FLAG_FULL_SCREEN
| FLAG_RECENTS_VIEW_VISIBLE | FLAG_TASK_THUMBNAIL_SPLASH
| FLAG_DETACH_DESKTOP_CAROUSEL);
- public static final RecentsState HOME = new RecentsState(3, 0);
- public static final RecentsState BG_LAUNCHER = new LauncherState(4, 0);
- public static final RecentsState OVERVIEW_SPLIT_SELECT = new RecentsState(5,
+ public static final RecentsState HOME = new RecentsState(HOME_STATE_ORDINAL, 0);
+ public static final RecentsState BG_LAUNCHER = new LauncherState(BG_LAUNCHER_ORDINAL, 0);
+ public static final RecentsState OVERVIEW_SPLIT_SELECT = new RecentsState(
+ OVERVIEW_SPLIT_SELECT_ORDINAL,
FLAG_SHOW_AS_GRID | FLAG_SCRIM | FLAG_RECENTS_VIEW_VISIBLE | FLAG_CLOSE_POPUPS
| FLAG_DISABLE_RESTORE | FLAG_SHOW_EXPLODED_DESKTOP_VIEW);
@@ -89,7 +98,15 @@ public class RecentsState implements BaseState<RecentsState> {
@Override
public String toString() {
- return "Ordinal-" + ordinal;
+ return switch (ordinal) {
+ case DEFAULT_STATE_ORDINAL -> "DEFAULT";
+ case MODAL_TASK_ORDINAL -> "MODAL_TASK";
+ case BACKGROUND_APP_ORDINAL -> "BACKGROUND_APP";
+ case HOME_STATE_ORDINAL -> "HOME";
+ case BG_LAUNCHER_ORDINAL -> "BG_LAUNCHER";
+ case OVERVIEW_SPLIT_SELECT_ORDINAL -> "SPLIT_SELECT";
+ default -> "Unknown Ordinal-" + ordinal;
+ };
}
@Override
@@ -197,6 +214,9 @@ public class RecentsState implements BaseState<RecentsState> {
@Override
public float[] getOverviewScaleAndOffset(RecentsViewContainer container) {
+ if (enableGridOnlyOverview()) {
+ return super.getOverviewScaleAndOffset(container);
+ }
return getOverviewScaleAndOffsetForModalState(container.getOverviewPanel());
}
}
diff --git a/quickstep/src/com/android/quickstep/fallback/RecentsStateUtils.kt b/quickstep/src/com/android/quickstep/fallback/RecentsStateUtils.kt
new file mode 100644
index 0000000000..fec8a809b9
--- /dev/null
+++ b/quickstep/src/com/android/quickstep/fallback/RecentsStateUtils.kt
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.quickstep.fallback
+
+import com.android.launcher3.LauncherState
+
+fun RecentsState.toLauncherState(): LauncherState {
+ return when (ordinal) {
+ RecentsState.DEFAULT_STATE_ORDINAL -> LauncherState.OVERVIEW
+ RecentsState.MODAL_TASK_ORDINAL -> LauncherState.OVERVIEW_MODAL_TASK
+ RecentsState.BACKGROUND_APP_ORDINAL -> LauncherState.BACKGROUND_APP
+ RecentsState.HOME_STATE_ORDINAL -> LauncherState.NORMAL
+ RecentsState.BG_LAUNCHER_ORDINAL -> LauncherState.NORMAL
+ RecentsState.OVERVIEW_SPLIT_SELECT_ORDINAL -> LauncherState.OVERVIEW_SPLIT_SELECT
+ else -> LauncherState.NORMAL
+ }
+}
+
+fun RecentsState.toLauncherStateOrdinal(): Int = toLauncherState().ordinal
diff --git a/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowManager.kt b/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowManager.kt
index 1a3a2e3dfe..bc08af2da6 100644
--- a/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowManager.kt
+++ b/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowManager.kt
@@ -44,9 +44,6 @@ import com.android.launcher3.statemanager.StateManager.AtomicAnimationFactory
import com.android.launcher3.statemanager.StatefulContainer
import com.android.launcher3.taskbar.TaskbarUIController
import com.android.launcher3.testing.TestLogging
-import com.android.launcher3.testing.shared.TestProtocol.NORMAL_STATE_ORDINAL
-import com.android.launcher3.testing.shared.TestProtocol.OVERVIEW_SPLIT_SELECT_ORDINAL
-import com.android.launcher3.testing.shared.TestProtocol.OVERVIEW_STATE_ORDINAL
import com.android.launcher3.testing.shared.TestProtocol.SEQUENCE_MAIN
import com.android.launcher3.util.ContextTracker
import com.android.launcher3.util.DisplayController
@@ -70,8 +67,7 @@ import com.android.quickstep.fallback.RecentsState.BACKGROUND_APP
import com.android.quickstep.fallback.RecentsState.BG_LAUNCHER
import com.android.quickstep.fallback.RecentsState.DEFAULT
import com.android.quickstep.fallback.RecentsState.HOME
-import com.android.quickstep.fallback.RecentsState.MODAL_TASK
-import com.android.quickstep.fallback.RecentsState.OVERVIEW_SPLIT_SELECT
+import com.android.quickstep.fallback.toLauncherStateOrdinal
import com.android.quickstep.util.RecentsAtomicAnimationFactory
import com.android.quickstep.util.RecentsWindowProtoLogProxy
import com.android.quickstep.util.SplitSelectStateController
@@ -355,40 +351,16 @@ class RecentsWindowManager(context: Context, wallpaperColorHints: Int) :
override fun onStateSetStart(state: RecentsState) {
super.onStateSetStart(state)
- RecentsWindowProtoLogProxy.logOnStateSetStart(getStateName(state))
+ RecentsWindowProtoLogProxy.logOnStateSetStart(state.toString())
}
override fun onStateSetEnd(state: RecentsState) {
super.onStateSetEnd(state)
- RecentsWindowProtoLogProxy.logOnStateSetEnd(getStateName(state))
+ RecentsWindowProtoLogProxy.logOnStateSetEnd(state.toString())
if (state == HOME || state == BG_LAUNCHER) {
cleanupRecentsWindow()
}
- when (state) {
- HOME,
- BG_LAUNCHER ->
- AccessibilityManagerCompat.sendStateEventToTest(baseContext, NORMAL_STATE_ORDINAL)
- DEFAULT ->
- AccessibilityManagerCompat.sendStateEventToTest(baseContext, OVERVIEW_STATE_ORDINAL)
- OVERVIEW_SPLIT_SELECT ->
- AccessibilityManagerCompat.sendStateEventToTest(
- baseContext,
- OVERVIEW_SPLIT_SELECT_ORDINAL,
- )
- }
- }
-
- private fun getStateName(state: RecentsState?): String {
- return when (state) {
- null -> "NULL"
- DEFAULT -> "DEFAULT"
- MODAL_TASK -> "MODAL_TASK"
- BACKGROUND_APP -> "BACKGROUND_APP"
- HOME -> "HOME"
- BG_LAUNCHER -> "BG_LAUNCHER"
- OVERVIEW_SPLIT_SELECT -> "OVERVIEW_SPLIT_SELECT"
- else -> "ordinal=" + state.ordinal
- }
+ AccessibilityManagerCompat.sendStateEventToTest(baseContext, state.toLauncherStateOrdinal())
}
override fun getSystemUiController(): SystemUiController? {
diff --git a/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowSwipeHandler.java b/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowSwipeHandler.java
index 1d85febad2..b365ddf3a4 100644
--- a/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowSwipeHandler.java
+++ b/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowSwipeHandler.java
@@ -222,6 +222,7 @@ public class RecentsWindowSwipeHandler extends AbsSwipeUpHandler<RecentsWindowMa
@Override
protected void finishRecentsControllerToHome(Runnable callback) {
final Runnable recentsCallback;
+ // TODO(b/404866791): check if this is actually necessary for this recents-in-window class
if (mAppCanEnterPip) {
// Make sure Launcher is resumed after auto-enter-pip transition to actually trigger
// the PiP task appearing.
@@ -238,7 +239,7 @@ public class RecentsWindowSwipeHandler extends AbsSwipeUpHandler<RecentsWindowMa
}
mRecentsView.cleanupRemoteTargets();
mRecentsAnimationController.finish(
- mAppCanEnterPip /* toRecents */, recentsCallback, true /* sendUserLeaveHint */);
+ true /* toRecents */, recentsCallback, true /* sendUserLeaveHint */);
}
@Override
diff --git a/quickstep/src/com/android/quickstep/inputconsumers/NavHandleLongPressHandler.java b/quickstep/src/com/android/quickstep/inputconsumers/NavHandleLongPressHandler.java
index 107babd61e..571a5468d1 100644
--- a/quickstep/src/com/android/quickstep/inputconsumers/NavHandleLongPressHandler.java
+++ b/quickstep/src/com/android/quickstep/inputconsumers/NavHandleLongPressHandler.java
@@ -88,7 +88,7 @@ public class NavHandleLongPressHandler implements ResourceBasedOverride {
*/
@Nullable
@VisibleForTesting
- final Runnable getLongPressRunnable(NavHandle navHandle) {
+ final Runnable getLongPressRunnable(NavHandle navHandle, int displayId) {
if (!isContextualSearchEntrypointEnabled(navHandle)) {
Log.i(TAG, "Contextual Search invocation failed: entry point disabled");
mVibratorWrapper.cancelVibrate();
@@ -116,7 +116,7 @@ public class NavHandleLongPressHandler implements ResourceBasedOverride {
Log.i(TAG, "Contextual Search invocation successful");
String runningPackage = TopTaskTracker.INSTANCE.get(mContext).getCachedTopTask(
- /* filterOnlyVisibleRecents */ true).getPackageName();
+ /* filterOnlyVisibleRecents */ true, displayId).getPackageName();
mStatsLogManager.logger().withPackageName(runningPackage)
.log(LAUNCHER_LAUNCH_ASSISTANT_SUCCESSFUL_NAV_HANDLE);
} else {
diff --git a/quickstep/src/com/android/quickstep/inputconsumers/NavHandleLongPressInputConsumer.java b/quickstep/src/com/android/quickstep/inputconsumers/NavHandleLongPressInputConsumer.java
index baabde884e..af7c975e0b 100644
--- a/quickstep/src/com/android/quickstep/inputconsumers/NavHandleLongPressInputConsumer.java
+++ b/quickstep/src/com/android/quickstep/inputconsumers/NavHandleLongPressInputConsumer.java
@@ -214,7 +214,7 @@ public class NavHandleLongPressInputConsumer extends DelegateInputConsumer {
&& !mDeepPressLogged) {
// Log deep press even if feature is disabled.
String runningPackage = mTopTaskTracker.getCachedTopTask(
- /* filterOnlyVisibleRecents */ true).getPackageName();
+ /* filterOnlyVisibleRecents */ true, getDisplayId()).getPackageName();
mStatsLogManager.logger().withPackageName(runningPackage).log(
mNavHandle.isNavHandleStashedTaskbar() ? LAUNCHER_DEEP_PRESS_STASHED_TASKBAR
: LAUNCHER_DEEP_PRESS_NAVBAR);
@@ -233,12 +233,13 @@ public class NavHandleLongPressInputConsumer extends DelegateInputConsumer {
Log.d(TAG, "triggerLongPress");
}
String runningPackage = mTopTaskTracker.getCachedTopTask(
- /* filterOnlyVisibleRecents */ true).getPackageName();
+ /* filterOnlyVisibleRecents */ true, getDisplayId()).getPackageName();
mStatsLogManager.logger().withPackageName(runningPackage).log(
mNavHandle.isNavHandleStashedTaskbar() ? LAUNCHER_LONG_PRESS_STASHED_TASKBAR
: LAUNCHER_LONG_PRESS_NAVBAR);
- Runnable longPressRunnable = mNavHandleLongPressHandler.getLongPressRunnable(mNavHandle);
+ Runnable longPressRunnable = mNavHandleLongPressHandler.getLongPressRunnable(mNavHandle,
+ getDisplayId());
if (longPressRunnable == null) {
return;
}
diff --git a/quickstep/src/com/android/quickstep/inputconsumers/OtherActivityInputConsumer.java b/quickstep/src/com/android/quickstep/inputconsumers/OtherActivityInputConsumer.java
index 2db75738f4..54cc391293 100644
--- a/quickstep/src/com/android/quickstep/inputconsumers/OtherActivityInputConsumer.java
+++ b/quickstep/src/com/android/quickstep/inputconsumers/OtherActivityInputConsumer.java
@@ -58,6 +58,7 @@ import com.android.quickstep.RecentsAnimationDeviceState;
import com.android.quickstep.RecentsAnimationTargets;
import com.android.quickstep.RotationTouchHelper;
import com.android.quickstep.TaskAnimationManager;
+import com.android.quickstep.util.ActiveGestureProtoLogProxy;
import com.android.quickstep.util.CachedEventDispatcher;
import com.android.quickstep.util.MotionPauseDetector;
import com.android.quickstep.util.NavBarPosition;
@@ -424,6 +425,8 @@ public class OtherActivityInputConsumer extends ContextWrapper implements InputC
mMotionPauseDetector.setIsTrackpadGesture(mGestureState.isTrackpadGesture());
mInteractionHandler.initWhenReady(
"OtherActivityInputConsumer.startTouchTrackingForWindowAnimation");
+ ActiveGestureProtoLogProxy.logGestureStartSwipeHandler(
+ mInteractionHandler.getClass().getSimpleName());
if (DEBUG) {
Log.d(TAG, "startTouchTrackingForWindowAnimation: isRecentsAnimationRunning="
diff --git a/quickstep/src/com/android/quickstep/recents/di/RecentsDependencies.kt b/quickstep/src/com/android/quickstep/recents/di/RecentsDependencies.kt
index 553a620fd8..00ef13bf0d 100644
--- a/quickstep/src/com/android/quickstep/recents/di/RecentsDependencies.kt
+++ b/quickstep/src/com/android/quickstep/recents/di/RecentsDependencies.kt
@@ -31,7 +31,7 @@ import com.android.quickstep.recents.domain.usecase.GetThumbnailPositionUseCase
import com.android.quickstep.recents.domain.usecase.IsThumbnailValidUseCase
import com.android.quickstep.recents.domain.usecase.OrganizeDesktopTasksUseCase
import com.android.quickstep.recents.viewmodel.RecentsViewData
-import com.android.systemui.shared.recents.utilities.PreviewPositionHelper
+import com.android.systemui.shared.recents.utilities.PreviewPositionHelper.PreviewPositionHelperFactory
import kotlinx.coroutines.CoroutineName
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.SupervisorJob
@@ -203,7 +203,7 @@ class RecentsDependencies private constructor(appContext: Context) {
GetThumbnailPositionUseCase(
deviceProfileRepository = inject(scopeId),
rotationStateRepository = inject(scopeId),
- previewPositionHelper = PreviewPositionHelper(),
+ previewPositionHelperFactory = PreviewPositionHelperFactory(),
)
OrganizeDesktopTasksUseCase::class.java -> OrganizeDesktopTasksUseCase()
else -> {
diff --git a/quickstep/src/com/android/quickstep/recents/domain/usecase/GetThumbnailPositionUseCase.kt b/quickstep/src/com/android/quickstep/recents/domain/usecase/GetThumbnailPositionUseCase.kt
index 8501382f18..e83d9f0549 100644
--- a/quickstep/src/com/android/quickstep/recents/domain/usecase/GetThumbnailPositionUseCase.kt
+++ b/quickstep/src/com/android/quickstep/recents/domain/usecase/GetThumbnailPositionUseCase.kt
@@ -27,7 +27,7 @@ import com.android.systemui.shared.recents.utilities.PreviewPositionHelper
class GetThumbnailPositionUseCase(
private val deviceProfileRepository: RecentsDeviceProfileRepository,
private val rotationStateRepository: RecentsRotationStateRepository,
- private val previewPositionHelper: PreviewPositionHelper,
+ private val previewPositionHelperFactory: PreviewPositionHelper.PreviewPositionHelperFactory,
) {
operator fun invoke(
thumbnailData: ThumbnailData?,
@@ -38,6 +38,7 @@ class GetThumbnailPositionUseCase(
val thumbnail =
thumbnailData?.thumbnail ?: return ThumbnailPosition(Matrix.IDENTITY_MATRIX, false)
+ val previewPositionHelper = previewPositionHelperFactory.create()
previewPositionHelper.updateThumbnailMatrix(
Rect(0, 0, thumbnail.width, thumbnail.height),
thumbnailData,
diff --git a/quickstep/src/com/android/quickstep/recents/ui/viewmodel/TaskTileUiState.kt b/quickstep/src/com/android/quickstep/recents/ui/viewmodel/TaskTileUiState.kt
index 8a6a8051f1..863d30b2e4 100644
--- a/quickstep/src/com/android/quickstep/recents/ui/viewmodel/TaskTileUiState.kt
+++ b/quickstep/src/com/android/quickstep/recents/ui/viewmodel/TaskTileUiState.kt
@@ -37,6 +37,7 @@ data class TaskTileUiState(
val hasHeader: Boolean,
val sysUiStatusNavFlags: Int,
val taskOverlayEnabled: Boolean,
+ val isCentralTask: Boolean,
)
sealed class TaskData {
diff --git a/quickstep/src/com/android/quickstep/recents/ui/viewmodel/TaskViewModel.kt b/quickstep/src/com/android/quickstep/recents/ui/viewmodel/TaskViewModel.kt
index 09e20711d0..fac0c0a0bb 100644
--- a/quickstep/src/com/android/quickstep/recents/ui/viewmodel/TaskViewModel.kt
+++ b/quickstep/src/com/android/quickstep/recents/ui/viewmodel/TaskViewModel.kt
@@ -29,7 +29,6 @@ import com.android.quickstep.recents.domain.usecase.IsThumbnailValidUseCase
import com.android.quickstep.recents.domain.usecase.ThumbnailPosition
import com.android.quickstep.recents.viewmodel.RecentsViewData
import com.android.quickstep.views.TaskViewType
-import com.android.quickstep.views.TaskViewType.SINGLE
import com.android.systemui.shared.recents.model.ThumbnailData
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.Flow
@@ -66,6 +65,12 @@ class TaskViewModel(
}
.distinctUntilChanged()
+ private val isCentralTask =
+ combine(taskIds, recentsViewData.centralTaskIds) { taskIds, centralTaskIds ->
+ taskIds == centralTaskIds
+ }
+ .distinctUntilChanged()
+
private val taskData =
taskIds.flatMapLatest { ids ->
// Combine Tasks requests
@@ -79,14 +84,12 @@ class TaskViewModel(
combine(recentsViewData.overlayEnabled, recentsViewData.settledFullyVisibleTaskIds) {
isOverlayEnabled,
settledFullyVisibleTaskIds ->
- taskViewType == SINGLE &&
- isOverlayEnabled &&
- settledFullyVisibleTaskIds.any { it in taskIds.value }
+ isOverlayEnabled && settledFullyVisibleTaskIds.any { it in taskIds.value }
}
.distinctUntilChanged()
val state: Flow<TaskTileUiState> =
- combine(taskData, isLiveTile, overlayEnabled, ::mapToTaskTile)
+ combine(taskData, isLiveTile, overlayEnabled, isCentralTask, ::mapToTaskTile)
.distinctUntilChanged()
.flowOn(dispatcherProvider.background)
@@ -114,6 +117,7 @@ class TaskViewModel(
tasks: List<TaskData>,
isLiveTile: Boolean,
overlayEnabled: Boolean,
+ isCentralTask: Boolean,
): TaskTileUiState {
val firstThumbnailData = (tasks.firstOrNull() as? TaskData.Data)?.thumbnailData
return TaskTileUiState(
@@ -122,6 +126,7 @@ class TaskViewModel(
hasHeader = taskViewType == TaskViewType.DESKTOP,
sysUiStatusNavFlags = getSysUiStatusNavFlagsUseCase(firstThumbnailData),
taskOverlayEnabled = overlayEnabled,
+ isCentralTask = isCentralTask,
)
}
diff --git a/quickstep/src/com/android/quickstep/recents/viewmodel/RecentsViewData.kt b/quickstep/src/com/android/quickstep/recents/viewmodel/RecentsViewData.kt
index 2465a4671b..803fb354ff 100644
--- a/quickstep/src/com/android/quickstep/recents/viewmodel/RecentsViewData.kt
+++ b/quickstep/src/com/android/quickstep/recents/viewmodel/RecentsViewData.kt
@@ -27,6 +27,9 @@ class RecentsViewData {
// The settled set of visible taskIds that is updated after RecentsView scroll settles.
val settledFullyVisibleTaskIds = MutableStateFlow(emptySet<Int>())
+ // The id for the task ids in the TaskView that controls the Actions View
+ val centralTaskIds = MutableStateFlow(emptySet<Int>())
+
// A list of taskIds that are associated with a RecentsAnimationController. */
val runningTaskIds = MutableStateFlow(emptySet<Int>())
diff --git a/quickstep/src/com/android/quickstep/recents/viewmodel/RecentsViewModel.kt b/quickstep/src/com/android/quickstep/recents/viewmodel/RecentsViewModel.kt
index 5ff8aaa840..4d168c7476 100644
--- a/quickstep/src/com/android/quickstep/recents/viewmodel/RecentsViewModel.kt
+++ b/quickstep/src/com/android/quickstep/recents/viewmodel/RecentsViewModel.kt
@@ -38,6 +38,10 @@ class RecentsViewModel(
recentsViewData.settledFullyVisibleTaskIds.value = taskIds
}
+ fun updateCentralTaskIds(taskIds: Set<Int>) {
+ recentsViewData.centralTaskIds.value = taskIds
+ }
+
fun setOverlayEnabled(isOverlayEnabled: Boolean) {
recentsViewData.overlayEnabled.value = isOverlayEnabled
}
diff --git a/quickstep/src/com/android/quickstep/util/AppPairsController.java b/quickstep/src/com/android/quickstep/util/AppPairsController.java
index 8385485253..24c01ae26d 100644
--- a/quickstep/src/com/android/quickstep/util/AppPairsController.java
+++ b/quickstep/src/com/android/quickstep/util/AppPairsController.java
@@ -32,7 +32,6 @@ import static com.android.wm.shell.shared.split.SplitScreenConstants.SNAP_TO_NON
import static com.android.wm.shell.shared.split.SplitScreenConstants.getIndex;
import static com.android.wm.shell.shared.split.SplitScreenConstants.isPersistentSnapPosition;
-import android.content.Context;
import android.content.Intent;
import android.content.pm.LauncherApps;
import android.util.Log;
@@ -93,10 +92,10 @@ public class AppPairsController {
private static final int BITMASK_SIZE = 16;
private static final int BITMASK_FOR_SNAP_POSITION = (1 << BITMASK_SIZE) - 1;
- private Context mContext;
+ private ActivityContext mContext;
private final SplitSelectStateController mSplitSelectStateController;
private final StatsLogManager mStatsLogManager;
- public AppPairsController(Context context,
+ public AppPairsController(ActivityContext context,
SplitSelectStateController splitSelectStateController,
StatsLogManager statsLogManager) {
mContext = context;
@@ -208,7 +207,7 @@ public class AppPairsController {
}
AppPairInfo newAppPair = new AppPairInfo(apps);
- IconCache iconCache = LauncherAppState.getInstance(mContext).getIconCache();
+ IconCache iconCache = LauncherAppState.getInstance(mContext.asContext()).getIconCache();
MODEL_EXECUTOR.execute(() -> {
newAppPair.getAppContents().forEach(member -> {
member.title = "";
@@ -216,8 +215,8 @@ public class AppPairsController {
iconCache.getTitleAndIcon(member, member.getMatchingLookupFlag());
});
MAIN_EXECUTOR.execute(() -> {
- LauncherAccessibilityDelegate delegate =
- QuickstepLauncher.getLauncher(mContext).getAccessibilityDelegate();
+ LauncherAccessibilityDelegate delegate = QuickstepLauncher.getLauncher(
+ mContext.asContext()).getAccessibilityDelegate();
if (delegate != null) {
delegate.addToWorkspace(newAppPair, true, (success) -> {
if (success) {
@@ -300,7 +299,7 @@ public class AppPairsController {
*/
@Nullable
private AppInfo resolveAppInfoByComponent(@NonNull ComponentKey key) {
- AllAppsStore appsStore = ActivityContext.lookupContext(mContext)
+ AllAppsStore appsStore = ActivityContext.lookupContext(mContext.asContext())
.getAppsView().getAppsStore();
// First look up the app info in order of:
@@ -326,7 +325,7 @@ public class AppPairsController {
if (appInfo == null) {
return null;
}
- return appInfo.makeWorkspaceItem(mContext);
+ return appInfo.makeWorkspaceItem(mContext.asContext());
}
/**
@@ -418,7 +417,7 @@ public class AppPairsController {
} else {
// Tapped an app pair while in a single app
final TopTaskTracker.CachedTaskInfo runningTask = topTaskTracker
- .getCachedTopTask(false /* filterOnlyVisibleRecents */);
+ .getCachedTopTask(false /* filterOnlyVisibleRecents */, context.getDisplayId());
mSplitSelectStateController.findLastActiveTasksAndRunCallback(
componentKeys,
@@ -548,6 +547,6 @@ public class AppPairsController {
*/
@VisibleForTesting
public TopTaskTracker getTopTaskTracker() {
- return TopTaskTracker.INSTANCE.get(mContext);
+ return TopTaskTracker.INSTANCE.get(mContext.asContext());
}
}
diff --git a/quickstep/src/com/android/quickstep/util/ContextualSearchInvoker.kt b/quickstep/src/com/android/quickstep/util/ContextualSearchInvoker.kt
index 3bc9adcba6..e574cc7cdd 100644
--- a/quickstep/src/com/android/quickstep/util/ContextualSearchInvoker.kt
+++ b/quickstep/src/com/android/quickstep/util/ContextualSearchInvoker.kt
@@ -87,7 +87,8 @@ internal constructor(
if (success) {
val runningPackage =
TopTaskTracker.INSTANCE[context].getCachedTopTask(
- /* filterOnlyVisibleRecents */ true
+ /* filterOnlyVisibleRecents */ true,
+ DEFAULT_DISPLAY,
)
.getPackageName()
statsLogManager
diff --git a/quickstep/src/com/android/quickstep/util/ContextualSearchStateManager.java b/quickstep/src/com/android/quickstep/util/ContextualSearchStateManager.java
index a8d3c6d5a3..136c496dce 100644
--- a/quickstep/src/com/android/quickstep/util/ContextualSearchStateManager.java
+++ b/quickstep/src/com/android/quickstep/util/ContextualSearchStateManager.java
@@ -18,6 +18,7 @@ package com.android.quickstep.util;
import static android.app.contextualsearch.ContextualSearchManager.ACTION_LAUNCH_CONTEXTUAL_SEARCH;
import static android.app.contextualsearch.ContextualSearchManager.ENTRYPOINT_SYSTEM_ACTION;
import static android.app.contextualsearch.ContextualSearchManager.FEATURE_CONTEXTUAL_SEARCH;
+import static android.view.Display.DEFAULT_DISPLAY;
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_LAUNCH_OMNI_SUCCESSFUL_SYSTEM_ACTION;
import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR;
@@ -244,7 +245,8 @@ public class ContextualSearchStateManager {
ENTRYPOINT_SYSTEM_ACTION);
if (contextualSearchInvoked) {
String runningPackage = mTopTaskTracker.getCachedTopTask(
- /* filterOnlyVisibleRecents */ true).getPackageName();
+ /* filterOnlyVisibleRecents */ true,
+ DEFAULT_DISPLAY).getPackageName();
StatsLogManager.newInstance(mContext).logger()
.withPackageName(runningPackage)
.log(LAUNCHER_LAUNCH_OMNI_SUCCESSFUL_SYSTEM_ACTION);
diff --git a/quickstep/src/com/android/quickstep/util/DesksUtils.kt b/quickstep/src/com/android/quickstep/util/DesksUtils.kt
index a10f7711fc..521ba27a8e 100644
--- a/quickstep/src/com/android/quickstep/util/DesksUtils.kt
+++ b/quickstep/src/com/android/quickstep/util/DesksUtils.kt
@@ -19,7 +19,6 @@ package com.android.quickstep.util
import android.app.TaskInfo
import android.content.ComponentName
import android.content.res.Resources
-import android.util.Log
import android.window.DesktopExperienceFlags
import com.android.systemui.shared.recents.model.Task
@@ -40,7 +39,9 @@ class DesksUtils {
@JvmStatic
fun isDesktopWallpaperTask(taskInfo: TaskInfo): Boolean {
- Log.d("b/403118101", "isDesktopWallpaperTask: $taskInfo")
+ // TODO: b/403118101 - In some launcher tests, there is a task with baseIntent set to
+ // null. Remove this check after finding out how that task is created.
+ if (taskInfo.baseIntent == null) return false
return taskInfo.baseIntent.component?.let(::isDesktopWallpaperComponent) == true
}
diff --git a/quickstep/src/com/android/quickstep/util/ExternalDisplays.kt b/quickstep/src/com/android/quickstep/util/ExternalDisplays.kt
index 455b3121ec..0aaca31f8b 100644
--- a/quickstep/src/com/android/quickstep/util/ExternalDisplays.kt
+++ b/quickstep/src/com/android/quickstep/util/ExternalDisplays.kt
@@ -16,6 +16,7 @@
package com.android.quickstep.util
+import android.app.TaskInfo
import android.view.Display.DEFAULT_DISPLAY
import android.view.Display.INVALID_DISPLAY
import com.android.systemui.shared.recents.model.Task
@@ -24,10 +25,9 @@ import com.android.systemui.shared.recents.model.Task
val Int.isExternalDisplay
get() = this != DEFAULT_DISPLAY
-/** Returns displayId of this [Task], default to [DEFAULT_DISPLAY] */
-val Task?.displayId
+val Int?.safeDisplayId
get() =
- this?.key?.displayId.let { displayId ->
+ this.let { displayId ->
when (displayId) {
null -> DEFAULT_DISPLAY
INVALID_DISPLAY -> DEFAULT_DISPLAY
@@ -35,6 +35,14 @@ val Task?.displayId
}
}
+/** Returns displayId of this [Task], default to [DEFAULT_DISPLAY] */
+val Task?.safeDisplayId
+ get() = this?.key?.displayId.safeDisplayId
+
/** Returns if this task belongs tto [DEFAULT_DISPLAY] */
val Task?.isExternalDisplay
- get() = displayId.isExternalDisplay
+ get() = safeDisplayId.isExternalDisplay
+
+/** Returns displayId of this [TaskInfo], default to [DEFAULT_DISPLAY] */
+val TaskInfo?.safeDisplayId
+ get() = this?.displayId.safeDisplayId
diff --git a/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java b/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java
index fd8b356708..08f2552157 100644
--- a/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java
+++ b/quickstep/src/com/android/quickstep/util/SplitSelectStateController.java
@@ -195,7 +195,7 @@ public class SplitSelectStateController {
mRecentTasksModel = recentsModel;
mActivityBackCallback = activityBackCallback;
mSplitAnimationController = new SplitAnimationController(this);
- mAppPairsController = new AppPairsController(mContainer.asContext(), this, statsLogManager);
+ mAppPairsController = new AppPairsController(mContainer, this, statsLogManager);
mSplitSelectDataHolder = new SplitSelectDataHolder(mContainer.asContext());
}
diff --git a/quickstep/src/com/android/quickstep/views/IconAppChipView.kt b/quickstep/src/com/android/quickstep/views/IconAppChipView.kt
index 7683a1500a..f4fd12792a 100644
--- a/quickstep/src/com/android/quickstep/views/IconAppChipView.kt
+++ b/quickstep/src/com/android/quickstep/views/IconAppChipView.kt
@@ -122,7 +122,7 @@ constructor(
field = max(value, minMaxWidth)
}
- var isExpanded: Boolean = false
+ var status: AppChipStatus = AppChipStatus.Collapsed
private set
override fun onFinishInflate() {
@@ -358,8 +358,8 @@ constructor(
ObjectAnimator.ofFloat(iconArrowView, TRANSLATION_X, arrowTranslationWithRtl),
ObjectAnimator.ofFloat(iconArrowView, SCALE_Y, -1f),
)
- animator!!.setDuration(MENU_BACKGROUND_REVEAL_DURATION.toLong())
- isExpanded = true
+ animator!!.duration = MENU_BACKGROUND_REVEAL_DURATION.toLong()
+ status = AppChipStatus.Expanded
} else {
// Clip expanded text with reveal animation so it doesn't go beyond the edge of the menu
val expandedTextClipAnim =
@@ -393,8 +393,8 @@ constructor(
ObjectAnimator.ofFloat(iconArrowView, TRANSLATION_X, 0f),
ObjectAnimator.ofFloat(iconArrowView, SCALE_Y, 1f),
)
- animator!!.setDuration(MENU_BACKGROUND_HIDE_DURATION.toLong())
- isExpanded = false
+ animator!!.duration = MENU_BACKGROUND_HIDE_DURATION.toLong()
+ status = AppChipStatus.Collapsed
}
if (!animated) animator!!.duration = 0
@@ -432,8 +432,18 @@ constructor(
}
}
+ fun reset() {
+ setText(null)
+ setDrawable(null)
+ }
+
override fun asView(): View = this
+ enum class AppChipStatus {
+ Expanded,
+ Collapsed,
+ }
+
private companion object {
private val SUM_AGGREGATOR = FloatBiFunction { a: Float, b: Float -> a + b }
diff --git a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java
index 74de2aca7b..c1282b945a 100644
--- a/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java
+++ b/quickstep/src/com/android/quickstep/views/LauncherRecentsView.java
@@ -18,6 +18,7 @@ package com.android.quickstep.views;
import static android.app.ActivityTaskManager.INVALID_TASK_ID;
import static android.window.DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY;
+import static com.android.launcher3.Flags.enableGridOnlyOverview;
import static com.android.launcher3.LauncherState.CLEAR_ALL_BUTTON;
import static com.android.launcher3.LauncherState.ADD_DESK_BUTTON;
import static com.android.launcher3.LauncherState.NORMAL;
@@ -151,7 +152,14 @@ public class LauncherRecentsView extends RecentsView<QuickstepLauncher, Launcher
public void onStateTransitionStart(LauncherState toState) {
setOverviewStateEnabled(toState.isRecentsViewVisible);
- setOverviewGridEnabled(toState.displayOverviewTasksAsGrid(mContainer.getDeviceProfile()));
+ if (enableGridOnlyOverview()) {
+ if (toState.displayOverviewTasksAsGrid(mContainer.getDeviceProfile())) {
+ setOverviewGridEnabled(true);
+ }
+ } else {
+ setOverviewGridEnabled(
+ toState.displayOverviewTasksAsGrid(mContainer.getDeviceProfile()));
+ }
setOverviewFullscreenEnabled(toState.getOverviewFullscreenProgress() == 1);
if (toState == OVERVIEW_MODAL_TASK) {
setOverviewSelectEnabled(true);
@@ -170,6 +178,11 @@ public class LauncherRecentsView extends RecentsView<QuickstepLauncher, Launcher
@Override
public void onStateTransitionComplete(LauncherState finalState) {
DesktopVisibilityController.INSTANCE.get(mContainer).onLauncherStateChanged(finalState);
+ if (enableGridOnlyOverview()) {
+ if (!finalState.displayOverviewTasksAsGrid(mContainer.getDeviceProfile())) {
+ setOverviewGridEnabled(false);
+ }
+ }
if (!finalState.isRecentsViewVisible) {
// Clean-up logic that occurs when recents is no longer in use/visible.
diff --git a/quickstep/src/com/android/quickstep/views/RecentsDismissUtils.kt b/quickstep/src/com/android/quickstep/views/RecentsDismissUtils.kt
index d39b52848c..6acaeae8db 100644
--- a/quickstep/src/com/android/quickstep/views/RecentsDismissUtils.kt
+++ b/quickstep/src/com/android/quickstep/views/RecentsDismissUtils.kt
@@ -24,7 +24,6 @@ import androidx.dynamicanimation.animation.SpringForce
import com.android.launcher3.Flags.enableGridOnlyOverview
import com.android.launcher3.R
import com.android.launcher3.Utilities.boundToRange
-import com.android.launcher3.touch.SingleAxisSwipeDetector
import com.android.launcher3.util.DynamicResource
import com.android.launcher3.util.MSDLPlayerWrapper
import com.android.quickstep.util.TaskGridNavHelper
@@ -33,6 +32,7 @@ import com.google.android.msdl.data.model.MSDLToken
import com.google.android.msdl.domain.InteractionProperties
import kotlin.math.abs
import kotlin.math.roundToInt
+import kotlin.math.sign
/**
* Helper class for [RecentsView]. This util class contains refactored and extracted functions from
@@ -51,7 +51,6 @@ class RecentsDismissUtils(private val recentsView: RecentsView<*, *>) {
draggedTaskView: TaskView?,
velocity: Float,
isDismissing: Boolean,
- detector: SingleAxisSwipeDetector,
dismissLength: Int,
onEndRunnable: () -> Unit,
): SpringAnimation? {
@@ -60,11 +59,14 @@ class RecentsDismissUtils(private val recentsView: RecentsView<*, *>) {
FloatPropertyCompat.createFloatPropertyCompat(
draggedTaskView.secondaryDismissTranslationProperty
)
+ val minVelocity =
+ recentsView.pagedOrientationHandler.getSecondaryDimension(draggedTaskView).toFloat()
+ val startVelocity = abs(velocity).coerceAtLeast(minVelocity) * velocity.sign
// Animate dragged task towards dismissal or rest state.
val draggedTaskViewSpringAnimation =
SpringAnimation(draggedTaskView, taskDismissFloatProperty)
.setSpring(createExpressiveDismissSpringForce())
- .setStartVelocity(if (detector.isFling(velocity)) velocity else 0f)
+ .setStartVelocity(startVelocity)
.addUpdateListener { animation, value, _ ->
if (isDismissing && abs(value) >= abs(dismissLength)) {
animation.cancel()
@@ -82,6 +84,7 @@ class RecentsDismissUtils(private val recentsView: RecentsView<*, *>) {
runTaskGridReflowSpringAnimation(
draggedTaskView,
getDismissedTaskGapForReflow(draggedTaskView),
+ onEndRunnable,
)
} else {
recentsView.dismissTaskView(
@@ -89,11 +92,12 @@ class RecentsDismissUtils(private val recentsView: RecentsView<*, *>) {
/* animateTaskView = */ false,
/* removeTask = */ true,
)
+ onEndRunnable()
}
} else {
recentsView.onDismissAnimationEnds()
+ onEndRunnable()
}
- onEndRunnable()
}
if (!isDismissing) {
addNeighborSettlingSpringAnimations(
@@ -101,6 +105,7 @@ class RecentsDismissUtils(private val recentsView: RecentsView<*, *>) {
draggedTaskViewSpringAnimation,
driverProgressThreshold = 0f,
isSpringDirectionVertical = true,
+ minVelocity = startVelocity,
)
}
return draggedTaskViewSpringAnimation
@@ -112,15 +117,11 @@ class RecentsDismissUtils(private val recentsView: RecentsView<*, *>) {
tasksToExclude: List<TaskView> = emptyList(),
driverProgressThreshold: Float,
isSpringDirectionVertical: Boolean,
+ minVelocity: Float,
) {
// Empty spring animation exists for conditional start, and to drive neighboring springs.
val neighborsToSettle =
SpringAnimation(FloatValueHolder()).setSpring(createExpressiveDismissSpringForce())
- addThresholdSpringAnimationTrigger(
- springAnimationDriver,
- progressThreshold = driverProgressThreshold,
- neighborsToSettle,
- )
// Add tasks before dragged index, fanning out from the dragged task.
// The order they are added matters, as each spring drives the next.
@@ -150,6 +151,19 @@ class RecentsDismissUtils(private val recentsView: RecentsView<*, *>) {
isSpringDirectionVertical,
)
}
+
+ val isCurrentDisplacementAboveOrigin =
+ recentsView.pagedOrientationHandler.isGoingUp(
+ draggedTaskView.secondaryDismissTranslationProperty.get(draggedTaskView),
+ recentsView.isRtl,
+ )
+ addThresholdSpringAnimationTrigger(
+ springAnimationDriver,
+ progressThreshold = driverProgressThreshold,
+ neighborsToSettle,
+ isCurrentDisplacementAboveOrigin,
+ minVelocity,
+ )
}
/** As spring passes threshold for the first time, run conditional spring with velocity. */
@@ -157,25 +171,35 @@ class RecentsDismissUtils(private val recentsView: RecentsView<*, *>) {
springAnimationDriver: SpringAnimation,
progressThreshold: Float,
conditionalSpring: SpringAnimation,
+ isCurrentDisplacementAboveOrigin: Boolean,
+ minVelocity: Float,
) {
- var lastPosition = 0f
- var startSettling = false
- springAnimationDriver.addUpdateListener { _, value, velocity ->
- // We do not compare to the threshold directly, as the update listener
- // does not necessarily hit every value. Do not check again once it has started
- // settling, as a spring can bounce past the end value multiple times.
- if (startSettling) return@addUpdateListener
- if (
- lastPosition < progressThreshold && value >= progressThreshold ||
- lastPosition > progressThreshold && value <= progressThreshold
- ) {
- startSettling = true
- }
- lastPosition = value
- if (startSettling) {
- conditionalSpring.setStartVelocity(velocity).animateToFinalPosition(0f)
- playDismissSettlingHaptic(velocity)
+ val runSettlingAtVelocity = { velocity: Float ->
+ conditionalSpring.setStartVelocity(velocity).animateToFinalPosition(0f)
+ playDismissSettlingHaptic(velocity)
+ }
+ if (isCurrentDisplacementAboveOrigin) {
+ var lastPosition = 0f
+ var startSettling = false
+ springAnimationDriver.addUpdateListener { _, value, velocity ->
+ // We do not compare to the threshold directly, as the update listener
+ // does not necessarily hit every value. Do not check again once it has started
+ // settling, as a spring can bounce past the end value multiple times.
+ if (startSettling) return@addUpdateListener
+ if (
+ lastPosition < progressThreshold && value >= progressThreshold ||
+ lastPosition > progressThreshold && value <= progressThreshold
+ ) {
+ startSettling = true
+ }
+ lastPosition = value
+ if (startSettling) {
+ runSettlingAtVelocity(velocity)
+ }
}
+ } else {
+ // Run settling animations immediately when displacement is already below settled state.
+ runSettlingAtVelocity(minVelocity)
}
}
@@ -295,7 +319,7 @@ class RecentsDismissUtils(private val recentsView: RecentsView<*, *>) {
val maxDismissSettlingVelocity =
recentsView.pagedOrientationHandler.getSecondaryDimension(recentsView)
MSDLPlayerWrapper.INSTANCE.get(recentsView.context)
- .playToken(
+ ?.playToken(
MSDLToken.CANCEL,
InteractionProperties.DynamicVibrationScale(
boundToRange(abs(velocity) / maxDismissSettlingVelocity, 0f, 1f),
@@ -339,6 +363,7 @@ class RecentsDismissUtils(private val recentsView: RecentsView<*, *>) {
private fun runTaskGridReflowSpringAnimation(
dismissedTaskView: TaskView,
dismissedTaskGap: Float,
+ onEndRunnable: () -> Unit,
) {
// Empty spring animation exists for conditional start, and to drive neighboring springs.
val springAnimationDriver =
@@ -426,13 +451,19 @@ class RecentsDismissUtils(private val recentsView: RecentsView<*, *>) {
tasksToExclude = tasksToReflow,
driverProgressThreshold = dismissedTaskGap,
isSpringDirectionVertical = false,
+ minVelocity = 0f,
)
+ } else {
+ springAnimationDriver.addEndListener { _, _, _, _ ->
+ // Play the same haptic as when neighbors spring into place.
+ MSDLPlayerWrapper.INSTANCE.get(recentsView.context)?.playToken(MSDLToken.CANCEL)
+ }
}
// Start animations and remove the dismissed task at the end, dismiss immediately if no
// neighboring tasks exist.
val runGridEndAnimationAndRelayout = {
- recentsView.expressiveDismissTaskView(dismissedTaskView)
+ recentsView.expressiveDismissTaskView(dismissedTaskView, onEndRunnable)
}
springAnimationDriver?.apply {
addEndListener { _, _, _, _ -> runGridEndAnimationAndRelayout() }
diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java
index 8c7fe26f3c..8f7dc808d1 100644
--- a/quickstep/src/com/android/quickstep/views/RecentsView.java
+++ b/quickstep/src/com/android/quickstep/views/RecentsView.java
@@ -169,7 +169,6 @@ import com.android.launcher3.statemanager.StatefulContainer;
import com.android.launcher3.testing.TestLogging;
import com.android.launcher3.testing.shared.TestProtocol;
import com.android.launcher3.touch.OverScroll;
-import com.android.launcher3.touch.SingleAxisSwipeDetector;
import com.android.launcher3.util.CancellableTask;
import com.android.launcher3.util.DynamicResource;
import com.android.launcher3.util.IntArray;
@@ -275,7 +274,7 @@ public abstract class RecentsView<
HighResLoadingState.HighResLoadingStateChangedCallback,
TaskVisualsChangeListener, DesktopVisibilityListener {
- private static final String TAG = "RecentsView";
+ protected static final String TAG = "RecentsView";
private static final boolean DEBUG = false;
public static final FloatProperty<RecentsView<?, ?>> CONTENT_ALPHA =
@@ -534,7 +533,6 @@ public abstract class RecentsView<
protected final Rect mLastComputedTaskSize = new Rect();
protected final Rect mLastComputedGridSize = new Rect();
protected final Rect mLastComputedGridTaskSize = new Rect();
- private TaskView mSelectedTask = null;
// How much a task that is directly offscreen will be pushed out due to RecentsView scale/pivot.
@Nullable
protected Float mLastComputedTaskStartPushOutDistance = null;
@@ -860,7 +858,7 @@ public abstract class RecentsView<
*/
private boolean mAnyTaskHasBeenDismissed;
- private final RecentsViewModel mRecentsViewModel;
+ protected final RecentsViewModel mRecentsViewModel;
private final RecentsViewModelHelper mHelper;
protected final RecentsViewUtils mUtils = new RecentsViewUtils(this);
protected final RecentsDismissUtils mDismissUtils = new RecentsDismissUtils(this);
@@ -1596,7 +1594,7 @@ public abstract class RecentsView<
/**
* Returns true if the given TaskView is in expected scroll position.
*/
- public boolean isTaskInExpectedScrollPosition(TaskView taskView) {
+ public boolean isTaskInExpectedScrollPosition(@NonNull TaskView taskView) {
return getScrollForPage(indexOfChild(taskView))
== getPagedOrientationHandler().getPrimaryScroll(this);
}
@@ -2418,21 +2416,28 @@ public abstract class RecentsView<
}
/**
- * Sets the last TaskView selected.
+ * Returns the currently selected TaskView in Select mode.
+ */
+ @Nullable
+ public TaskView getSelectedTaskView() {
+ return mUtils.getSelectedTaskView();
+ }
+
+ /**
+ * Sets the selected TaskView in Select mode.
*/
public void setSelectedTask(int lastSelectedTaskId) {
- mSelectedTask = getTaskViewByTaskId(lastSelectedTaskId);
+ mUtils.setSelectedTaskView(getTaskViewByTaskId(lastSelectedTaskId));
}
/**
* Returns the bounds of the task selected to enter modal state.
*/
public Rect getSelectedTaskBounds() {
- if (mSelectedTask == null) {
- return enableGridOnlyOverview() && mContainer.getDeviceProfile().isTablet
- ? mLastComputedGridTaskSize : mLastComputedTaskSize;
+ if (getSelectedTaskView() == null) {
+ return mLastComputedTaskSize;
}
- return getTaskBounds(mSelectedTask);
+ return getTaskBounds(getSelectedTaskView());
}
/**
@@ -2448,7 +2453,7 @@ public abstract class RecentsView<
return deviceProfile.overviewTaskThumbnailTopMarginPx / 2.0f;
}
- private Rect getTaskBounds(TaskView taskView) {
+ protected Rect getTaskBounds(TaskView taskView) {
int selectedPage = indexOfChild(taskView);
int primaryScroll = getPagedOrientationHandler().getPrimaryScroll(this);
int selectedPageScroll = getScrollForPage(selectedPage);
@@ -3361,8 +3366,8 @@ public abstract class RecentsView<
int snappedPage = isKeyboardTaskFocusPending() ? mKeyboardTaskFocusIndex : getNextPage();
TaskView snappedTaskView = getTaskViewAt(snappedPage);
TaskView homeTaskView = getHomeTaskView();
- TaskView expectedCurrentTaskView = mUtils.getExpectedCurrentTask(getFocusedTaskView(),
- getRunningTaskView());
+ TaskView expectedCurrentTaskView = mUtils.getExpectedCurrentTask(getRunningTaskView(),
+ getFocusedTaskView());
TaskView nextFocusedTaskView = null;
// Don't clear the top row, if the user has dismissed a task, to maintain the task order.
@@ -3937,8 +3942,10 @@ public abstract class RecentsView<
newClearAllShortTotalWidthTranslation = expectedFirstTaskStart - firstTaskStart;
}
}
- if (lastGridTaskView != null && (lastGridTaskView.isVisibleToUser() || (
- isExpressiveDismiss && lastGridTaskView == dismissedTaskView))) {
+ if (lastGridTaskView != null && (
+ (!isExpressiveDismiss && lastGridTaskView.isVisibleToUser()) || (isExpressiveDismiss
+ && (isTaskViewVisible(lastGridTaskView)
+ || lastGridTaskView == dismissedTaskView)))) {
// After dismissal, animate translation of the remaining tasks to fill any gap left
// between the end of the grid and the clear all button. Only animate if the clear
// all button is visible or would become visible after dismissal.
@@ -4734,11 +4741,12 @@ public abstract class RecentsView<
runDismissAnimation(pa);
}
- protected void expressiveDismissTaskView(TaskView taskView) {
+ protected void expressiveDismissTaskView(TaskView taskView, Function0<Unit> onEndRunnable) {
PendingAnimation pa = new PendingAnimation(DISMISS_TASK_DURATION);
createTaskDismissAnimation(pa, taskView, false /* animateTaskView */, true /* removeTask */,
DISMISS_TASK_DURATION, false /* dismissingForSplitSelection*/,
true /* isExpressiveDismiss */);
+ pa.addEndListener((success) -> onEndRunnable.invoke());
runDismissAnimation(pa);
}
@@ -5011,15 +5019,8 @@ public abstract class RecentsView<
}
private void updatePivots() {
- if (mOverviewSelectEnabled) {
- if (enableGridOnlyOverview()) {
- getModalTaskSize(mTempRect);
- Rect selectedTaskPosition = getSelectedTaskBounds();
- Utilities.getPivotsForScalingRectToRect(mTempRect, selectedTaskPosition,
- mTempPointF);
- } else {
- mTempPointF.set(mLastComputedTaskSize.centerX(), mLastComputedTaskSize.bottom);
- }
+ if (mOverviewSelectEnabled && !enableGridOnlyOverview()) {
+ mTempPointF.set(mLastComputedTaskSize.centerX(), mLastComputedTaskSize.bottom);
} else {
mTempRect.set(mLastComputedTaskSize);
getPagedViewOrientedState().getFullScreenScaleAndPivot(mTempRect,
@@ -5065,7 +5066,7 @@ public abstract class RecentsView<
&& (enableGridOnlyOverview() || enableLargeDesktopWindowingTile())
&& mTaskModalness > 0;
if (shouldCalculateOffsetForAllTasks) {
- modalMidpoint = indexOfChild(mSelectedTask);
+ modalMidpoint = indexOfChild(getSelectedTaskView());
}
float midpointOffsetSize = 0;
@@ -5273,7 +5274,7 @@ public abstract class RecentsView<
*/
private float getVerticalOffsetSize(TaskView taskView, float offsetProgress) {
if (offsetProgress == 0 || !(showAsGrid() && enableGridOnlyOverview())
- || mSelectedTask == null) {
+ || getSelectedTaskView() == null) {
// Don't bother calculating everything below if we won't offset vertically.
return 0;
}
@@ -5281,7 +5282,7 @@ public abstract class RecentsView<
// First, get the position of the task relative to the top row.
Rect taskPosition = getTaskBounds(taskView);
- boolean isSelectedTaskTopRow = mTopRowIdSet.contains(mSelectedTask.getTaskViewId());
+ boolean isSelectedTaskTopRow = mTopRowIdSet.contains(getSelectedTaskView().getTaskViewId());
boolean isChildTopRow = mTopRowIdSet.contains(taskView.getTaskViewId());
// Whether the task should be shifted to the top.
boolean isTopShift = !isSelectedTaskTopRow && isChildTopRow;
@@ -5335,8 +5336,8 @@ public abstract class RecentsView<
* Resets the visuals when exit modal state.
*/
public void resetModalVisuals() {
- if (mSelectedTask != null) {
- mSelectedTask.taskContainers.forEach(
+ if (getSelectedTaskView() != null) {
+ getSelectedTaskView().taskContainers.forEach(
taskContainer -> taskContainer.getOverlay().resetModalVisuals());
}
}
@@ -5993,6 +5994,9 @@ public abstract class RecentsView<
updateCurrentTaskActionsVisibility();
loadVisibleTaskData(TaskView.FLAG_UPDATE_ALL);
updateEnabledOverlays();
+ if (enableRefactorTaskThumbnail()) {
+ mUtils.updateCentralTask();
+ }
}
@Override
@@ -6717,8 +6721,14 @@ public abstract class RecentsView<
private void setTaskModalness(float modalness) {
mTaskModalness = modalness;
updatePageOffsets();
- if (mSelectedTask != null) {
- mSelectedTask.setModalness(modalness);
+ if (getSelectedTaskView() != null) {
+ if (enableGridOnlyOverview()) {
+ for (TaskView taskView : getTaskViews()) {
+ taskView.setModalness(modalness);
+ }
+ } else {
+ getSelectedTaskView().setModalness(modalness);
+ }
} else if (getCurrentPageTaskView() != null) {
getCurrentPageTaskView().setModalness(modalness);
}
@@ -7180,10 +7190,10 @@ public abstract class RecentsView<
* spring in response to the perceived impact of the settling task.
*/
public SpringAnimation createTaskDismissSettlingSpringAnimation(TaskView draggedTaskView,
- float velocity, boolean isDismissing, SingleAxisSwipeDetector detector,
- int dismissLength, Function0<Unit> onEndRunnable) {
+ float velocity, boolean isDismissing, int dismissLength,
+ Function0<Unit> onEndRunnable) {
return mDismissUtils.createTaskDismissSettlingSpringAnimation(draggedTaskView, velocity,
- isDismissing, detector, dismissLength, onEndRunnable);
+ isDismissing, dismissLength, onEndRunnable);
}
/**
diff --git a/quickstep/src/com/android/quickstep/views/RecentsViewUtils.kt b/quickstep/src/com/android/quickstep/views/RecentsViewUtils.kt
index 9c35913841..50941fefa8 100644
--- a/quickstep/src/com/android/quickstep/views/RecentsViewUtils.kt
+++ b/quickstep/src/com/android/quickstep/views/RecentsViewUtils.kt
@@ -16,6 +16,7 @@
package com.android.quickstep.views
+import android.graphics.PointF
import android.graphics.Rect
import android.util.FloatProperty
import android.view.KeyEvent
@@ -25,9 +26,11 @@ import android.view.View.LAYOUT_DIRECTION_RTL
import androidx.core.view.children
import com.android.launcher3.AbstractFloatingView.TYPE_TASK_MENU
import com.android.launcher3.AbstractFloatingView.getTopOpenViewWithType
+import com.android.launcher3.Flags.enableGridOnlyOverview
import com.android.launcher3.Flags.enableLargeDesktopWindowingTile
import com.android.launcher3.Flags.enableOverviewIconMenu
import com.android.launcher3.Flags.enableSeparateExternalDisplayTasks
+import com.android.launcher3.Utilities.getPivotsForScalingRectToRect
import com.android.launcher3.statehandlers.DesktopVisibilityController
import com.android.launcher3.statehandlers.DesktopVisibilityController.Companion.INACTIVE_DESK_ID
import com.android.launcher3.util.IntArray
@@ -38,6 +41,7 @@ import com.android.quickstep.util.isExternalDisplay
import com.android.quickstep.views.RecentsView.RUNNING_TASK_ATTACH_ALPHA
import com.android.systemui.shared.recents.model.ThumbnailData
import java.util.function.BiConsumer
+import kotlin.math.min
import kotlin.reflect.KMutableProperty1
/**
@@ -387,12 +391,74 @@ class RecentsViewUtils(private val recentsView: RecentsView<*, *>) {
}
}
+ fun updateCentralTask() {
+ val isTablet: Boolean = getDeviceProfile().isTablet
+ val actionsViewCanRelateToTaskView = !(isTablet && enableGridOnlyOverview())
+ val focusedTaskView = recentsView.focusedTaskView
+ val currentPageTaskView = recentsView.currentPageTaskView
+
+ fun isInExpectedScrollPosition(taskView: TaskView?) =
+ taskView?.let { recentsView.isTaskInExpectedScrollPosition(it) } ?: false
+
+ val centralTaskIds: Set<Int> =
+ when {
+ !actionsViewCanRelateToTaskView -> emptySet()
+ isTablet && isInExpectedScrollPosition(focusedTaskView) ->
+ focusedTaskView!!.taskIdSet
+ isInExpectedScrollPosition(currentPageTaskView) -> currentPageTaskView!!.taskIdSet
+ else -> emptySet()
+ }
+
+ recentsView.mRecentsViewModel.updateCentralTaskIds(centralTaskIds)
+ }
+
var deskExplodeProgress: Float = 0f
set(value) {
field = value
taskViews.filterIsInstance<DesktopTaskView>().forEach { it.explodeProgress = field }
}
+ var selectedTaskView: TaskView? = null
+ set(newValue) {
+ val oldValue = field
+ field = newValue
+ if (oldValue != newValue) {
+ onSelectedTaskViewUpdated(oldValue, newValue)
+ }
+ }
+
+ private fun onSelectedTaskViewUpdated(
+ oldSelectedTaskView: TaskView?,
+ newSelectedTaskView: TaskView?,
+ ) {
+ if (!enableGridOnlyOverview()) return
+ with(recentsView) {
+ oldSelectedTaskView?.modalScale = 1f
+ oldSelectedTaskView?.modalPivot = null
+
+ if (newSelectedTaskView == null) return
+
+ val modalTaskBounds = mTempRect
+ getModalTaskSize(modalTaskBounds)
+ val selectedTaskBounds = getTaskBounds(newSelectedTaskView)
+
+ // Map bounds to selectedTaskView's coordinate system.
+ modalTaskBounds.offset(-selectedTaskBounds.left, -selectedTaskBounds.top)
+ selectedTaskBounds.offset(-selectedTaskBounds.left, -selectedTaskBounds.top)
+
+ val modalScale =
+ min(
+ (modalTaskBounds.height().toFloat() / selectedTaskBounds.height()),
+ (modalTaskBounds.width().toFloat() / selectedTaskBounds.width()),
+ )
+ val modalPivot = PointF()
+ getPivotsForScalingRectToRect(modalTaskBounds, selectedTaskBounds, modalPivot)
+
+ newSelectedTaskView.modalScale = modalScale
+ newSelectedTaskView.modalPivot = modalPivot
+ }
+ }
+
companion object {
class RecentsViewFloatProperty(
private val utilsProperty: KMutableProperty1<RecentsViewUtils, Float>
diff --git a/quickstep/src/com/android/quickstep/views/TaskContainer.kt b/quickstep/src/com/android/quickstep/views/TaskContainer.kt
index afe7e928ad..31ed465349 100644
--- a/quickstep/src/com/android/quickstep/views/TaskContainer.kt
+++ b/quickstep/src/com/android/quickstep/views/TaskContainer.kt
@@ -22,6 +22,7 @@ import android.util.Log
import android.view.View
import android.view.View.OnClickListener
import com.android.app.tracing.traceSection
+import com.android.launcher3.Flags.enableOverviewIconMenu
import com.android.launcher3.Flags.enableRefactorTaskThumbnail
import com.android.launcher3.model.data.TaskViewItemInfo
import com.android.launcher3.util.SplitConfigurationOptions
@@ -122,6 +123,10 @@ class TaskContainer(
} else {
thumbnailViewDeprecated.setShowSplashForSplitSelection(false)
}
+
+ if (enableOverviewIconMenu()) {
+ (iconView as IconAppChipView).reset()
+ }
}
fun setOverlayEnabled(enabled: Boolean) {
diff --git a/quickstep/src/com/android/quickstep/views/TaskMenuView.kt b/quickstep/src/com/android/quickstep/views/TaskMenuView.kt
index 696f934701..f7cb7bef78 100644
--- a/quickstep/src/com/android/quickstep/views/TaskMenuView.kt
+++ b/quickstep/src/com/android/quickstep/views/TaskMenuView.kt
@@ -251,6 +251,7 @@ constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int = 0) :
rotation = orientationHandler.degreesRotated
if (enableOverviewIconMenu()) {
+ elevation = resources.getDimension(R.dimen.task_thumbnail_icon_menu_elevation)
translationX = thumbnailAlignedX
translationY = thumbnailAlignedY
} else {
@@ -428,9 +429,7 @@ constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int = 0) :
var additionalTranslationX = 0f
if (
- recentsViewContainer.deviceProfile.isLandscape &&
- taskContainer.stagePosition ==
- SplitConfigurationOptions.STAGE_POSITION_BOTTOM_OR_RIGHT
+ taskContainer.stagePosition == SplitConfigurationOptions.STAGE_POSITION_BOTTOM_OR_RIGHT
) {
// Animate menu and icon when split task would display off the side of the screen.
additionalTranslationX =
@@ -474,8 +473,8 @@ constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int = 0) :
val isLastMenuOptionFocused =
optionLayout.indexOfChild(optionLayout.focusedChild) == optionLayout.childCount - 1
if (
- (isLastMenuOptionFocused && event.keyCode == KeyEvent.KEYCODE_DPAD_DOWN)
- || (isFirstMenuOptionFocused && event.keyCode == KeyEvent.KEYCODE_DPAD_UP)
+ (isLastMenuOptionFocused && event.keyCode == KeyEvent.KEYCODE_DPAD_DOWN) ||
+ (isFirstMenuOptionFocused && event.keyCode == KeyEvent.KEYCODE_DPAD_UP)
) {
iconView.requestFocus()
return true
diff --git a/quickstep/src/com/android/quickstep/views/TaskView.kt b/quickstep/src/com/android/quickstep/views/TaskView.kt
index 3d1643cefe..a108afc34b 100644
--- a/quickstep/src/com/android/quickstep/views/TaskView.kt
+++ b/quickstep/src/com/android/quickstep/views/TaskView.kt
@@ -33,6 +33,7 @@ import android.util.Log
import android.view.Display
import android.view.MotionEvent
import android.view.View
+import android.view.View.OnClickListener
import android.view.ViewGroup
import android.view.ViewStub
import android.view.accessibility.AccessibilityNodeInfo
@@ -96,8 +97,11 @@ import com.android.quickstep.util.BorderAnimator.Companion.createSimpleBorderAni
import com.android.quickstep.util.RecentsOrientedState
import com.android.quickstep.util.TaskCornerRadius
import com.android.quickstep.util.TaskRemovedDuringLaunchListener
-import com.android.quickstep.util.displayId
import com.android.quickstep.util.isExternalDisplay
+import com.android.quickstep.util.safeDisplayId
+import com.android.quickstep.views.IconAppChipView.AppChipStatus
+import com.android.quickstep.views.OverviewActionsView.DISABLED_NO_THUMBNAIL
+import com.android.quickstep.views.OverviewActionsView.DISABLED_ROTATED
import com.android.quickstep.views.RecentsView.UNBOUND_TASK_VIEW_ID
import com.android.systemui.shared.recents.model.Task
import com.android.systemui.shared.recents.model.ThumbnailData
@@ -147,8 +151,11 @@ constructor(
val isRunningTask: Boolean
get() = this === recentsView?.runningTaskView
+ private val isSelectedTask: Boolean
+ get() = this === recentsView?.selectedTaskView
+
open val displayId: Int
- get() = taskContainers.firstOrNull()?.task.displayId
+ get() = taskContainers.firstOrNull()?.task.safeDisplayId
val isExternalDisplay: Boolean
get() = displayId.isExternalDisplay
@@ -337,6 +344,12 @@ constructor(
onModalnessUpdated(field)
}
+ var modalPivot: PointF? = null
+ set(value) {
+ field = value
+ updatePivots()
+ }
+
var splitSplashAlpha = 0f
set(value) {
field = value
@@ -361,6 +374,12 @@ constructor(
applyScale()
}
+ var modalScale = 1f
+ set(value) {
+ field = value
+ applyScale()
+ }
+
private var dismissTranslationX = 0f
set(value) {
field = value
@@ -446,9 +465,10 @@ constructor(
}
private val taskViewAlpha = MultiValueAlpha(this, Alpha.entries.size)
- protected var stableAlpha by MultiPropertyDelegate(taskViewAlpha, Alpha.STABLE)
- var attachAlpha by MultiPropertyDelegate(taskViewAlpha, Alpha.ATTACH)
- var splitAlpha by MultiPropertyDelegate(taskViewAlpha, Alpha.SPLIT)
+ protected var stableAlpha by MultiPropertyDelegate(taskViewAlpha, Alpha.Stable)
+ var attachAlpha by MultiPropertyDelegate(taskViewAlpha, Alpha.Attach)
+ var splitAlpha by MultiPropertyDelegate(taskViewAlpha, Alpha.Split)
+ private var modalAlpha by MultiPropertyDelegate(taskViewAlpha, Alpha.Modal)
protected var shouldShowScreenshot = false
get() = !isRunningTask || field
@@ -628,14 +648,7 @@ constructor(
override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
super.onLayout(changed, left, top, right, bottom)
- val thumbnailTopMargin = container.deviceProfile.overviewTaskThumbnailTopMarginPx
- if (container.deviceProfile.isTablet) {
- pivotX = (if (layoutDirection == LAYOUT_DIRECTION_RTL) 0 else right - left).toFloat()
- pivotY = thumbnailTopMargin.toFloat()
- } else {
- pivotX = (right - left) * 0.5f
- pivotY = thumbnailTopMargin + (height - thumbnailTopMargin) * 0.5f
- }
+ updatePivots()
systemGestureExclusionRects =
SYSTEM_GESTURE_EXCLUSION_RECT.onEach {
it.right = width
@@ -646,6 +659,24 @@ constructor(
}
}
+ private fun updatePivots() {
+ val modalPivot = modalPivot
+ if (modalPivot != null) {
+ pivotX = modalPivot.x
+ pivotY = modalPivot.y
+ } else {
+ val thumbnailTopMargin = container.deviceProfile.overviewTaskThumbnailTopMarginPx
+ if (container.deviceProfile.isTablet) {
+ pivotX =
+ (if (layoutDirection == LAYOUT_DIRECTION_RTL) 0 else right - left).toFloat()
+ pivotY = thumbnailTopMargin.toFloat()
+ } else {
+ pivotX = (right - left) * 0.5f
+ pivotY = thumbnailTopMargin + (height - thumbnailTopMargin) * 0.5f
+ }
+ }
+ }
+
override fun onRecycle() {
resetPersistentViewTransforms()
@@ -653,6 +684,9 @@ constructor(
attachAlpha = 1f
splitAlpha = 1f
splitSplashAlpha = 0f
+ modalAlpha = 1f
+ modalScale = 1f
+ modalPivot = null
taskThumbnailSplashAlpha = 0f
// Clear any references to the thumbnail (it will be re-read either from the cache or the
// system on next bind)
@@ -797,6 +831,20 @@ constructor(
height = container.thumbnailView.height,
)
container.setOverlayEnabled(state.taskOverlayEnabled, thumbnailPosition)
+ if (state.isCentralTask) {
+ this.container.actionsView.let {
+ it.updateDisabledFlags(
+ DISABLED_ROTATED,
+ thumbnailPosition?.isRotated ?: false,
+ )
+ it.updateDisabledFlags(
+ DISABLED_NO_THUMBNAIL,
+ state.tasks.any { taskData ->
+ (taskData as? TaskData.Data)?.thumbnailData?.thumbnail == null
+ },
+ )
+ }
+ }
if (enableOverviewIconMenu()) {
setIconState(container, containerState)
@@ -1286,7 +1334,7 @@ constructor(
targets.apps,
targets.wallpapers,
targets.nonApps,
- true /* launcherClosing */,
+ true, /* launcherClosing */
recentsView.stateManager,
recentsView,
recentsView.depthController,
@@ -1520,7 +1568,7 @@ constructor(
recentsView.setTaskBorderEnabled(false)
}
return if (enableOverviewIconMenu() && menuContainer.iconView is IconAppChipView) {
- if (menuContainer.iconView.isExpanded) {
+ if (menuContainer.iconView.status == AppChipStatus.Expanded) {
closeTaskMenu()
} else {
menuContainer.iconView.revealAnim(/* isRevealing= */ true)
@@ -1722,7 +1770,7 @@ constructor(
fun getSizeAdjustment(fullscreenEnabled: Boolean) = if (fullscreenEnabled) nonGridScale else 1f
private fun applyScale() {
- val scale = persistentScale * dismissScale
+ val scale = persistentScale * dismissScale * Utilities.mapRange(modalness, 1f, modalScale)
scaleX = scale
scaleY = scale
updateFullscreenParams()
@@ -1784,9 +1832,13 @@ constructor(
private fun onModalnessUpdated(modalness: Float) {
isClickable = modalness == 0f
taskContainers.forEach {
- it.iconView.setModalAlpha(1 - modalness)
+ it.iconView.setModalAlpha(1f - modalness)
it.digitalWellBeingToast?.bannerOffsetPercentage = modalness
}
+ if (enableGridOnlyOverview()) {
+ modalAlpha = if (isSelectedTask) 1f else (1f - modalness)
+ applyScale()
+ }
}
fun resetPersistentViewTransforms() {
@@ -1842,9 +1894,10 @@ constructor(
private const val TAG = "TaskView"
private enum class Alpha {
- STABLE,
- ATTACH,
- SPLIT,
+ Stable,
+ Attach,
+ Split,
+ Modal,
}
private enum class SettledProgress {
diff --git a/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureProtoLogProxy.java b/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureProtoLogProxy.java
index 773a039cf3..2532fcf8cf 100644
--- a/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureProtoLogProxy.java
+++ b/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureProtoLogProxy.java
@@ -544,7 +544,7 @@ public class ActiveGestureProtoLogProxy {
@NonNull Point displaySize, @NonNull RectF swipeRegion, @NonNull RectF ohmRegion,
int gesturalHeight, int largerGesturalHeight, @NonNull String reason) {
if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return;
- ProtoLog.d(ACTIVE_GESTURE_LOG,
+ ProtoLog.d(ACTIVE_GESTURE_LOG,
"OrientationTouchTransformer.createRegionForDisplay: "
+ "dispRot=%d, dispSize=%s, swipeRegion=%s, ohmRegion=%s, "
+ "gesturalHeight=%d, largerGesturalHeight=%d, reason=%s",
@@ -560,4 +560,14 @@ public class ActiveGestureProtoLogProxy {
ProtoLog.d(ACTIVE_GESTURE_LOG, "TaskAnimationManager not available for displayId=%d",
displayId);
}
+
+ public static void logGestureStartSwipeHandler(@NonNull String interactionHandler) {
+ ActiveGestureLog.INSTANCE.addLog(new ActiveGestureLog.CompoundString(
+ "OtherActivityInputConsumer.startTouchTrackingForWindowAnimation: "
+ + "interactionHandler=%s", interactionHandler));
+ if (!enableActiveGestureProtoLog() || !isProtoLogInitialized()) return;
+ ProtoLog.d(ACTIVE_GESTURE_LOG,
+ "OtherActivityInputConsumer.startTouchTrackingForWindowAnimation: "
+ + "interactionHandler=%s", interactionHandler);
+ }
}
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarHoverToolTipControllerTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarHoverToolTipControllerTest.kt
new file mode 100644
index 0000000000..d2b9fcf2c5
--- /dev/null
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarHoverToolTipControllerTest.kt
@@ -0,0 +1,154 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.launcher3.taskbar
+
+import android.view.MotionEvent
+import android.view.MotionEvent.ACTION_HOVER_ENTER
+import android.view.MotionEvent.ACTION_HOVER_EXIT
+import com.android.launcher3.AbstractFloatingView
+import com.android.launcher3.BubbleTextView
+import com.android.launcher3.R
+import com.android.launcher3.apppairs.AppPairIcon
+import com.android.launcher3.folder.FolderIcon
+import com.android.launcher3.model.data.WorkspaceItemInfo
+import com.android.launcher3.taskbar.TaskbarControllerTestUtil.runOnMainSync
+import com.android.launcher3.taskbar.TaskbarViewTestUtil.createHotseatAppPairsItem
+import com.android.launcher3.taskbar.TaskbarViewTestUtil.createHotseatFolderItem
+import com.android.launcher3.taskbar.TaskbarViewTestUtil.createHotseatWorkspaceItem
+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.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(["pixelFoldable2023", "pixelTablet2023"])
+class TaskbarHoverToolTipControllerTest {
+
+ @get:Rule(order = 0) val context = TaskbarWindowSandboxContext.create()
+ @get:Rule(order = 1) val taskbarUnitTestRule = TaskbarUnitTestRule(this, context)
+
+ @InjectController lateinit var autohideSuspendController: TaskbarAutohideSuspendController
+ @InjectController lateinit var popupController: TaskbarPopupController
+
+ private val taskbarContext: TaskbarActivityContext by taskbarUnitTestRule::activityContext
+
+ private lateinit var taskbarView: TaskbarView
+ private lateinit var iconView: BubbleTextView
+ private lateinit var appPairIcon: AppPairIcon
+ private lateinit var folderIcon: FolderIcon
+
+ private val isHoverToolTipOpen: Boolean
+ get() {
+ // TaskbarHoverToolTip uses ArrowTipView which is type TYPE_ON_BOARD_POPUP.
+ return AbstractFloatingView.hasOpenView(
+ taskbarContext,
+ AbstractFloatingView.TYPE_ON_BOARD_POPUP,
+ )
+ }
+
+ @Before
+ fun setup() {
+ runOnMainSync { taskbarView = taskbarContext.dragLayer.findViewById(R.id.taskbar_view) }
+
+ val hotseatItems =
+ arrayOf(
+ createHotseatWorkspaceItem(),
+ createHotseatAppPairsItem(),
+ createHotseatFolderItem(),
+ )
+ runOnMainSync {
+ taskbarView.updateItems(hotseatItems, emptyList())
+ iconView =
+ taskbarView.iconViews.filterIsInstance<BubbleTextView>().first {
+ it.tag is WorkspaceItemInfo
+ }
+ appPairIcon = taskbarView.iconViews.filterIsInstance<AppPairIcon>().first()
+ folderIcon = taskbarView.iconViews.filterIsInstance<FolderIcon>().first()
+ }
+ }
+
+ @Test
+ fun onHover_hoverEnterIcon_revealToolTip_hoverExitIcon_closeToolTip() {
+ runOnMainSync { iconView.dispatchGenericMotionEvent(HOVER_ENTER) }
+ assertThat(isHoverToolTipOpen).isTrue()
+ assertThat(autohideSuspendController.isTransientTaskbarStashingSuspended).isTrue()
+ runOnMainSync { iconView.dispatchGenericMotionEvent(HOVER_EXIT) }
+ assertThat(isHoverToolTipOpen).isFalse()
+ assertThat(autohideSuspendController.isTransientTaskbarStashingSuspended).isFalse()
+ }
+
+ @Test
+ fun onHover_hoverEnterFolderIcon_revealToolTip_hoverExitFolderIcon_closeToolTip() {
+ runOnMainSync { folderIcon.dispatchGenericMotionEvent(HOVER_ENTER) }
+ assertThat(isHoverToolTipOpen).isTrue()
+ assertThat(autohideSuspendController.isTransientTaskbarStashingSuspended).isTrue()
+ runOnMainSync { folderIcon.dispatchGenericMotionEvent(HOVER_EXIT) }
+ assertThat(isHoverToolTipOpen).isFalse()
+ assertThat(autohideSuspendController.isTransientTaskbarStashingSuspended).isFalse()
+ }
+
+ @Test
+ fun onHover_hoverEnterAppPair_revealToolTip_hoverExitAppPair_closeToolTip() {
+ runOnMainSync { appPairIcon.dispatchGenericMotionEvent(HOVER_ENTER) }
+ assertThat(isHoverToolTipOpen).isTrue()
+ assertThat(autohideSuspendController.isTransientTaskbarStashingSuspended).isTrue()
+ runOnMainSync { appPairIcon.dispatchGenericMotionEvent(HOVER_EXIT) }
+ assertThat(isHoverToolTipOpen).isFalse()
+ assertThat(autohideSuspendController.isTransientTaskbarStashingSuspended).isFalse()
+ }
+
+ @Test
+ fun onHover_hoverEnterIconAlignedWithHotseat_noToolTip() {
+ taskbarContext.setUIController(
+ object : TaskbarUIController() {
+ override fun isIconAlignedWithHotseat(): Boolean = true
+ }
+ )
+
+ runOnMainSync { iconView.dispatchGenericMotionEvent(HOVER_ENTER) }
+ assertThat(isHoverToolTipOpen).isFalse()
+ }
+
+ @Test
+ fun onHover_hoverEnterFolderOpen_noToolTip() {
+ runOnMainSync {
+ folderIcon.folder.animateOpen()
+ iconView.dispatchGenericMotionEvent(HOVER_ENTER)
+ }
+ assertThat(isHoverToolTipOpen).isFalse()
+ }
+
+ @Test
+ fun onHover_hoverEnterPopupOpen_noToolTip() {
+ runOnMainSync {
+ popupController.showForIcon(iconView)
+ iconView.dispatchGenericMotionEvent(HOVER_ENTER)
+ }
+ assertThat(isHoverToolTipOpen).isFalse()
+ }
+
+ companion object {
+ private val HOVER_EXIT = MotionEvent.obtain(0, 0, ACTION_HOVER_EXIT, 0f, 0f, 0)
+ private val HOVER_ENTER = MotionEvent.obtain(0, 0, ACTION_HOVER_ENTER, 0f, 0f, 0)
+ }
+}
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarRecentAppsControllerTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarRecentAppsControllerTest.kt
index 8758d7cd6d..334d8ab061 100644
--- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarRecentAppsControllerTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarRecentAppsControllerTest.kt
@@ -960,7 +960,7 @@ class TaskbarRecentAppsControllerTest : TaskbarBaseTestCase() {
private fun setInDesktopMode(inDesktopMode: Boolean) {
whenever(taskbarControllers.taskbarDesktopModeController.shouldShowDesktopTasksInTaskbar())
.thenReturn(inDesktopMode)
- whenever(taskbarControllers.taskbarDesktopModeController.isInDesktopMode)
+ whenever(taskbarControllers.taskbarDesktopModeController.isInDesktopMode(DEFAULT_DISPLAY))
.thenReturn(inDesktopMode)
}
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewTestUtil.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewTestUtil.kt
index e52aacf6d5..92abbbaa0a 100644
--- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewTestUtil.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewTestUtil.kt
@@ -18,8 +18,13 @@ package com.android.launcher3.taskbar
import android.content.ComponentName
import android.content.Intent
+import android.graphics.Bitmap
+import android.graphics.Bitmap.createBitmap
import android.os.Process
+import com.android.launcher3.icons.BitmapInfo
import com.android.launcher3.model.data.AppInfo
+import com.android.launcher3.model.data.AppPairInfo
+import com.android.launcher3.model.data.FolderInfo
import com.android.launcher3.model.data.ItemInfo
import com.android.launcher3.model.data.WorkspaceItemInfo
import com.android.launcher3.taskbar.TaskbarIconType.ALL_APPS
@@ -53,7 +58,27 @@ object TaskbarViewTestUtil {
return WorkspaceItemInfo(
AppInfo(TEST_COMPONENT, "Test App $id", Process.myUserHandle(), Intent())
)
- .apply { this.id = id }
+ .apply {
+ this.id = id
+ // Create a placeholder icon so that the test doesn't try to load a high-res icon.
+ this.bitmap = BitmapInfo.fromBitmap(createBitmap(1, 1, Bitmap.Config.ALPHA_8))
+ }
+ }
+
+ fun createHotseatAppPairsItem(): AppPairInfo {
+ return AppPairInfo().apply {
+ add(createHotseatWorkspaceItem(1))
+ add(createHotseatWorkspaceItem(2))
+ }
+ }
+
+ fun createHotseatFolderItem(): FolderInfo {
+ return FolderInfo().apply {
+ title = "Test Folder"
+ add(createHotseatWorkspaceItem(1))
+ add(createHotseatWorkspaceItem(2))
+ add(createHotseatWorkspaceItem(3))
+ }
}
/** Creates a list of fake recent tasks. */
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 2dacf69590..19c88240d9 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
@@ -28,6 +28,7 @@ import com.android.launcher3.taskbar.TaskbarActivityContext
import com.android.launcher3.taskbar.TaskbarControllers
import com.android.launcher3.taskbar.TaskbarManager
import com.android.launcher3.taskbar.TaskbarNavButtonController.TaskbarNavButtonCallbacks
+import com.android.launcher3.taskbar.TaskbarUIController
import com.android.launcher3.taskbar.bubbles.BubbleControllers
import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule.InjectController
import com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR
@@ -117,6 +118,8 @@ class TaskbarUnitTestRule(
super.recreateTaskbars()
if (currentActivityContext != null) {
injectControllers()
+ // TODO(b/346394875): we should test a non-default uiController.
+ activityContext.setUIController(TaskbarUIController.DEFAULT)
controllerInjectionCallback.invoke()
}
}
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/AbsSwipeUpHandlerTestCase.java b/quickstep/tests/multivalentTests/src/com/android/quickstep/AbsSwipeUpHandlerTestCase.java
index 78240000c3..2f5f160898 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/AbsSwipeUpHandlerTestCase.java
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/AbsSwipeUpHandlerTestCase.java
@@ -292,7 +292,7 @@ public abstract class AbsSwipeUpHandlerTestCase<
public void testHomeGesture_invalidatesHandlerAfterParallelAnim() {
ValueAnimator parallelAnim = new ValueAnimator();
parallelAnim.setRepeatCount(ValueAnimator.INFINITE);
- when(mActivityInterface.getParallelAnimationToLauncher(any(), anyLong(), any()))
+ when(mActivityInterface.getParallelAnimationToGestureEndTarget(any(), anyLong(), any()))
.thenReturn(parallelAnim);
SWIPE_HANDLER handler = createSwipeUpHandlerForGesture(GestureState.GestureEndTarget.HOME);
runOnMainSync(() -> {
@@ -306,7 +306,7 @@ public abstract class AbsSwipeUpHandlerTestCase<
@Test
public void testHomeGesture_invalidatesHandlerIfNoParallelAnim() {
- when(mActivityInterface.getParallelAnimationToLauncher(any(), anyLong(), any()))
+ when(mActivityInterface.getParallelAnimationToGestureEndTarget(any(), anyLong(), any()))
.thenReturn(null);
SWIPE_HANDLER handler = createSwipeUpHandlerForGesture(GestureState.GestureEndTarget.HOME);
runOnMainSync(() -> {
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/fallback/RecentsStateUtilsTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/fallback/RecentsStateUtilsTest.kt
new file mode 100644
index 0000000000..4e9dae8da0
--- /dev/null
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/fallback/RecentsStateUtilsTest.kt
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.quickstep.fallback
+
+import com.android.launcher3.testing.shared.TestProtocol.BACKGROUND_APP_STATE_ORDINAL
+import com.android.launcher3.testing.shared.TestProtocol.NORMAL_STATE_ORDINAL
+import com.android.launcher3.testing.shared.TestProtocol.OVERVIEW_MODAL_TASK_STATE_ORDINAL
+import com.android.launcher3.testing.shared.TestProtocol.OVERVIEW_SPLIT_SELECT_ORDINAL
+import com.android.launcher3.testing.shared.TestProtocol.OVERVIEW_STATE_ORDINAL
+import com.android.launcher3.util.LauncherMultivalentJUnit
+import com.android.launcher3.util.LauncherMultivalentJUnit.EmulatedDevices
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(LauncherMultivalentJUnit::class)
+@EmulatedDevices(["pixelTablet2023"])
+class RecentsStateUtilsTest {
+
+ @Test
+ fun testRecentsStateDefault_toLauncherStateOrdinal_isOverviewStateOrdinal() {
+ assertThat(RecentsState.DEFAULT.toLauncherStateOrdinal()).isEqualTo(OVERVIEW_STATE_ORDINAL)
+ }
+
+ @Test
+ fun testRecentsStateModal_toLauncherStateOrdinal_isModalTaskStateOrdinal() {
+ assertThat(RecentsState.MODAL_TASK.toLauncherStateOrdinal())
+ .isEqualTo(OVERVIEW_MODAL_TASK_STATE_ORDINAL)
+ }
+
+ @Test
+ fun testRecentsStateBackgroundApp_toLauncherStateOrdinal_isBackgroundAppStateOrdinal() {
+ assertThat(RecentsState.BACKGROUND_APP.toLauncherStateOrdinal())
+ .isEqualTo(BACKGROUND_APP_STATE_ORDINAL)
+ }
+
+ @Test
+ fun testRecentsStateHome_toLauncherStateOrdinal_isNormalStateOrdinal() {
+ assertThat(RecentsState.HOME.toLauncherStateOrdinal()).isEqualTo(NORMAL_STATE_ORDINAL)
+ }
+
+ @Test
+ fun testRecentsStateBgLauncher_toLauncherStateOrdinal_isNormalStateOrdinal() {
+ assertThat(RecentsState.BG_LAUNCHER.toLauncherStateOrdinal())
+ .isEqualTo(NORMAL_STATE_ORDINAL)
+ }
+
+ @Test
+ fun testRecentsStateOverviewSplitSelect_toLauncherStateOrdinal_isOverviewSplitSelectStateOrdinal() {
+ assertThat(RecentsState.OVERVIEW_SPLIT_SELECT.toLauncherStateOrdinal())
+ .isEqualTo(OVERVIEW_SPLIT_SELECT_ORDINAL)
+ }
+}
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/inputconsumers/NavHandleLongPressInputConsumerTest.java b/quickstep/tests/multivalentTests/src/com/android/quickstep/inputconsumers/NavHandleLongPressInputConsumerTest.java
index cfeade8ff3..ee9505cdbb 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/inputconsumers/NavHandleLongPressInputConsumerTest.java
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/inputconsumers/NavHandleLongPressInputConsumerTest.java
@@ -36,6 +36,7 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
@@ -105,11 +106,12 @@ public class NavHandleLongPressInputConsumerTest {
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
- when(mTopTaskTracker.getCachedTopTask(anyBoolean())).thenReturn(mTaskInfo);
+ when(mTopTaskTracker.getCachedTopTask(anyBoolean(), anyInt())).thenReturn(mTaskInfo);
when(mDeviceState.getSquaredTouchSlop()).thenReturn(SQUARED_TOUCH_SLOP);
when(mDelegate.allowInterceptByParent()).thenReturn(true);
mLongPressTriggered.set(false);
- when(mNavHandleLongPressHandler.getLongPressRunnable(any())).thenReturn(mLongPressRunnable);
+ when(mNavHandleLongPressHandler.getLongPressRunnable(any(), anyInt())).thenReturn(
+ mLongPressRunnable);
when(mStatsLogger.withPackageName(any())).thenReturn(mStatsLogger);
when(mStatsLatencyLogger.withInstanceId(any())).thenReturn(mStatsLatencyLogger);
when(mStatsLatencyLogger.withLatency(anyLong())).thenReturn(mStatsLatencyLogger);
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/domain/usecase/GetThumbnailPositionUseCaseTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/domain/usecase/GetThumbnailPositionUseCaseTest.kt
index a2532809cd..7646e69117 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/domain/usecase/GetThumbnailPositionUseCaseTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/domain/usecase/GetThumbnailPositionUseCaseTest.kt
@@ -25,11 +25,14 @@ import com.android.quickstep.recents.data.FakeRecentsDeviceProfileRepository
import com.android.quickstep.recents.data.FakeRecentsRotationStateRepository
import com.android.systemui.shared.recents.model.ThumbnailData
import com.android.systemui.shared.recents.utilities.PreviewPositionHelper
+import com.android.systemui.shared.recents.utilities.PreviewPositionHelper.PreviewPositionHelperFactory
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.test.runTest
+import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.kotlin.mock
+import org.mockito.kotlin.times
import org.mockito.kotlin.verify
import org.mockito.kotlin.whenever
@@ -38,15 +41,21 @@ import org.mockito.kotlin.whenever
class GetThumbnailPositionUseCaseTest {
private val deviceProfileRepository = FakeRecentsDeviceProfileRepository()
private val rotationStateRepository = FakeRecentsRotationStateRepository()
+ private val previewPositionHelperFactoryMock = mock<PreviewPositionHelperFactory>()
private val previewPositionHelper = mock<PreviewPositionHelper>()
private val systemUnderTest =
GetThumbnailPositionUseCase(
- deviceProfileRepository,
- rotationStateRepository,
- previewPositionHelper,
+ deviceProfileRepository = deviceProfileRepository,
+ rotationStateRepository = rotationStateRepository,
+ previewPositionHelperFactory = previewPositionHelperFactoryMock,
)
+ @Before
+ fun setUp() {
+ whenever(previewPositionHelperFactoryMock.create()).thenReturn(previewPositionHelper)
+ }
+
@Test
fun nullThumbnailData_returnsIdentityMatrix() = runTest {
val expectedResult = ThumbnailPosition(Matrix.IDENTITY_MATRIX, false)
@@ -96,6 +105,25 @@ class GetThumbnailPositionUseCaseTest {
)
}
+ @Test
+ fun multipleInvocations_usesPreviewPositionHelperFactoryEachTime() = runTest {
+ whenever(previewPositionHelper.matrix).thenReturn(MATRIX)
+
+ val sut =
+ GetThumbnailPositionUseCase(
+ deviceProfileRepository = deviceProfileRepository,
+ rotationStateRepository = rotationStateRepository,
+ previewPositionHelperFactory = previewPositionHelperFactoryMock,
+ )
+ verify(previewPositionHelperFactoryMock, times(0)).create()
+
+ sut.invoke(THUMBNAIL_DATA, CANVAS_WIDTH, CANVAS_HEIGHT, /* isRtl= */ true)
+ sut.invoke(THUMBNAIL_DATA, CANVAS_WIDTH, CANVAS_HEIGHT, /* isRtl= */ false)
+
+ // Each invocation of use case should use a fresh position helper acquired by the factory.
+ verify(previewPositionHelperFactoryMock, times(2)).create()
+ }
+
private companion object {
const val THUMBNAIL_WIDTH = 100
const val THUMBNAIL_HEIGHT = 200
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/ui/viewmodel/TaskViewModelTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/ui/viewmodel/TaskViewModelTest.kt
index 18b9fe9685..333c2856e6 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/ui/viewmodel/TaskViewModelTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/recents/ui/viewmodel/TaskViewModelTest.kt
@@ -85,6 +85,7 @@ class TaskViewModelTest {
hasHeader = false,
sysUiStatusNavFlags = FLAGS_APPEARANCE_LIGHT_THEME,
taskOverlayEnabled = false,
+ isCentralTask = false,
)
assertThat(sut.state.first()).isEqualTo(expectedResult)
}
@@ -132,6 +133,7 @@ class TaskViewModelTest {
hasHeader = false,
sysUiStatusNavFlags = FLAGS_APPEARANCE_LIGHT_THEME,
taskOverlayEnabled = false,
+ isCentralTask = false,
)
assertThat(sut.state.first()).isEqualTo(expectedResult)
}
@@ -155,6 +157,7 @@ class TaskViewModelTest {
hasHeader = false,
sysUiStatusNavFlags = FLAGS_APPEARANCE_LIGHT_THEME,
taskOverlayEnabled = false,
+ isCentralTask = false,
)
assertThat(sut.state.first()).isEqualTo(expectedResult)
}
@@ -178,6 +181,7 @@ class TaskViewModelTest {
hasHeader = false,
sysUiStatusNavFlags = FLAGS_APPEARANCE_LIGHT_THEME,
taskOverlayEnabled = false,
+ isCentralTask = false,
)
assertThat(sut.state.first()).isEqualTo(expectedResult)
}
@@ -200,6 +204,7 @@ class TaskViewModelTest {
hasHeader = false,
sysUiStatusNavFlags = FLAGS_APPEARANCE_LIGHT_THEME,
taskOverlayEnabled = false,
+ isCentralTask = false,
)
assertThat(sut.state.first()).isEqualTo(expectedResult)
}
@@ -218,6 +223,7 @@ class TaskViewModelTest {
hasHeader = false,
sysUiStatusNavFlags = FLAGS_APPEARANCE_LIGHT_THEME,
taskOverlayEnabled = false,
+ isCentralTask = false,
)
assertThat(sut.state.first()).isEqualTo(expectedResult)
}
@@ -233,6 +239,7 @@ class TaskViewModelTest {
hasHeader = false,
sysUiStatusNavFlags = FLAGS_APPEARANCE_DEFAULT,
taskOverlayEnabled = false,
+ isCentralTask = false,
)
assertThat(sut.state.first()).isEqualTo(expectedResult)
}
@@ -248,45 +255,41 @@ class TaskViewModelTest {
}
@Test
- fun taskOverlayDisabled_when_usingGroupedTask() =
+ fun taskOverlayDisabled_when_OverlayIsEnabledForInvisibleTask() =
testScope.runTest {
- sut = createTaskViewModel(TaskViewType.GROUPED)
sut.bind(TASK_MODEL_1.id)
recentsViewData.overlayEnabled.value = true
- recentsViewData.settledFullyVisibleTaskIds.value = setOf(1)
+ recentsViewData.settledFullyVisibleTaskIds.value = setOf(2)
assertThat(sut.state.first().taskOverlayEnabled).isFalse()
}
@Test
- fun taskOverlayDisabled_when_usingDesktopTask() =
+ fun taskOverlayDisabled_when_OverlayIsDisabledForVisibleTask() =
testScope.runTest {
- sut = createTaskViewModel(TaskViewType.DESKTOP)
sut.bind(TASK_MODEL_1.id)
- recentsViewData.overlayEnabled.value = true
+ recentsViewData.overlayEnabled.value = false
recentsViewData.settledFullyVisibleTaskIds.value = setOf(1)
assertThat(sut.state.first().taskOverlayEnabled).isFalse()
}
@Test
- fun taskOverlayDisabled_when_OverlayIsEnabledForInvisibleTask() =
+ fun isCentralTask_when_CentralTaskIdsMatchTaskIds() =
testScope.runTest {
- sut.bind(TASK_MODEL_1.id)
- recentsViewData.overlayEnabled.value = true
- recentsViewData.settledFullyVisibleTaskIds.value = setOf(2)
+ sut.bind(TASK_MODEL_1.id, TASK_MODEL_2.id)
+ recentsViewData.centralTaskIds.value = setOf(TASK_MODEL_1.id, TASK_MODEL_2.id)
- assertThat(sut.state.first().taskOverlayEnabled).isFalse()
+ assertThat(sut.state.first().isCentralTask).isTrue()
}
@Test
- fun taskOverlayDisabled_when_OverlayIsDisabledForVisibleTask() =
+ fun isNotCentralTask_when_CentralTaskIdsDoMatchTaskIds() =
testScope.runTest {
- sut.bind(TASK_MODEL_1.id)
- recentsViewData.overlayEnabled.value = false
- recentsViewData.settledFullyVisibleTaskIds.value = setOf(1)
+ sut.bind(TASK_MODEL_1.id, TASK_MODEL_2.id)
+ recentsViewData.centralTaskIds.value = setOf(TASK_MODEL_3.id)
- assertThat(sut.state.first().taskOverlayEnabled).isFalse()
+ assertThat(sut.state.first().isCentralTask).isFalse()
}
@Test
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/util/AppPairsControllerTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/util/AppPairsControllerTest.kt
index 76d36d3658..c325af4d3e 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/util/AppPairsControllerTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/util/AppPairsControllerTest.kt
@@ -17,8 +17,9 @@
package com.android.quickstep.util
import android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM
-import android.content.Context
import android.content.res.Resources
+import android.view.Display
+import android.view.Display.DEFAULT_DISPLAY
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.android.launcher3.apppairs.AppPairIcon
import com.android.launcher3.logging.StatsLogManager
@@ -26,6 +27,7 @@ import com.android.launcher3.model.data.ItemInfo
import com.android.launcher3.taskbar.TaskbarActivityContext
import com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_BOTTOM_OR_RIGHT
import com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_TOP_OR_LEFT
+import com.android.launcher3.views.ActivityContext
import com.android.quickstep.TopTaskTracker
import com.android.quickstep.TopTaskTracker.CachedTaskInfo
import com.android.systemui.shared.recents.model.Task
@@ -56,7 +58,7 @@ import org.mockito.kotlin.whenever
@RunWith(AndroidJUnit4::class)
class AppPairsControllerTest {
- @Mock lateinit var context: Context
+ @Mock lateinit var context: ActivityContext
@Mock lateinit var resources: Resources
@Mock lateinit var splitSelectStateController: SplitSelectStateController
@Mock lateinit var statsLogManager: StatsLogManager
@@ -83,6 +85,7 @@ class AppPairsControllerTest {
}
@Mock lateinit var mockAppPairIcon: AppPairIcon
+ @Mock lateinit var mockDisplay: Display
@Mock lateinit var mockTaskbarActivityContext: TaskbarActivityContext
@Mock lateinit var mockTopTaskTracker: TopTaskTracker
@Mock lateinit var mockCachedTaskInfo: CachedTaskInfo
@@ -105,8 +108,10 @@ class AppPairsControllerTest {
// Stub methods on appPairsController so that they return mocks
spyAppPairsController = spy(appPairsController)
whenever(mockAppPairIcon.context).thenReturn(mockTaskbarActivityContext)
+ whenever(mockAppPairIcon.display).thenReturn(mockDisplay)
+ whenever(mockDisplay.displayId).thenReturn(DEFAULT_DISPLAY)
doReturn(mockTopTaskTracker).whenever(spyAppPairsController).topTaskTracker
- whenever(mockTopTaskTracker.getCachedTopTask(any())).thenReturn(mockCachedTaskInfo)
+ whenever(mockTopTaskTracker.getCachedTopTask(any(), any())).thenReturn(mockCachedTaskInfo)
whenever(mockTask1.getKey()).thenReturn(mockTaskKey1)
whenever(mockTask2.getKey()).thenReturn(mockTaskKey2)
doNothing().whenever(spyAppPairsController).launchAppPair(any(), any())
diff --git a/quickstep/tests/src/com/android/launcher3/taskbar/TaskbarHoverToolTipControllerTest.java b/quickstep/tests/src/com/android/launcher3/taskbar/TaskbarHoverToolTipControllerTest.java
deleted file mode 100644
index 3f7c85c899..0000000000
--- a/quickstep/tests/src/com/android/launcher3/taskbar/TaskbarHoverToolTipControllerTest.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.launcher3.taskbar;
-
-import static androidx.test.core.app.ApplicationProvider.getApplicationContext;
-
-import static com.android.launcher3.taskbar.TaskbarAutohideSuspendController.FLAG_AUTOHIDE_SUSPEND_HOVERING_ICONS;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.testing.AndroidTestingRunner;
-import android.testing.TestableLooper;
-import android.view.Display;
-import android.view.MotionEvent;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.launcher3.BubbleTextView;
-import com.android.launcher3.apppairs.AppPairIcon;
-import com.android.launcher3.folder.Folder;
-import com.android.launcher3.folder.FolderIcon;
-import com.android.launcher3.model.data.FolderInfo;
-import com.android.launcher3.util.ActivityContextWrapper;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.mockito.stubbing.Answer;
-
-/**
- * Tests for TaskbarHoverToolTipController.
- */
-@SmallTest
-@RunWith(AndroidTestingRunner.class)
-@TestableLooper.RunWithLooper(setAsMainLooper = true)
-public class TaskbarHoverToolTipControllerTest extends TaskbarBaseTestCase {
-
- private TaskbarHoverToolTipController mTaskbarHoverToolTipController;
- private TestableLooper mTestableLooper;
-
- @Mock private TaskbarView mTaskbarView;
- @Mock private MotionEvent mMotionEvent;
- @Mock private BubbleTextView mHoverBubbleTextView;
- @Mock private FolderIcon mHoverFolderIcon;
- @Mock private AppPairIcon mAppPairIcon;
- @Mock private Display mDisplay;
- @Mock private TaskbarDragLayer mTaskbarDragLayer;
- private Folder mSpyFolderView;
-
- @Before
- public void setup() {
- MockitoAnnotations.initMocks(this);
-
- Context context = getApplicationContext();
-
- doAnswer((Answer<Object>) invocation -> context.getSystemService(
- (String) invocation.getArgument(0)))
- .when(taskbarActivityContext).getSystemService(anyString());
- when(taskbarActivityContext.getResources()).thenReturn(context.getResources());
- when(taskbarActivityContext.getApplicationInfo()).thenReturn(
- context.getApplicationInfo());
- when(taskbarActivityContext.getDragLayer()).thenReturn(mTaskbarDragLayer);
- when(taskbarActivityContext.getMainLooper()).thenReturn(context.getMainLooper());
- when(taskbarActivityContext.getDisplay()).thenReturn(mDisplay);
- when(taskbarActivityContext.isIconAlignedWithHotseat()).thenReturn(false);
-
- when(mTaskbarDragLayer.getChildCount()).thenReturn(1);
- mSpyFolderView = spy(new Folder(new ActivityContextWrapper(context), null));
- when(mTaskbarDragLayer.getChildAt(anyInt())).thenReturn(mSpyFolderView);
- doReturn(false).when(mSpyFolderView).isOpen();
-
- when(mHoverBubbleTextView.getText()).thenReturn("tooltip");
- doAnswer((Answer<Void>) invocation -> {
- Object[] args = invocation.getArguments();
- ((int[]) args[0])[0] = 0;
- ((int[]) args[0])[1] = 0;
- return null;
- }).when(mHoverBubbleTextView).getLocationOnScreen(any(int[].class));
- when(mHoverBubbleTextView.getWidth()).thenReturn(100);
- when(mHoverBubbleTextView.getHeight()).thenReturn(100);
-
- mHoverFolderIcon.mInfo = new FolderInfo();
- mHoverFolderIcon.mInfo.title = "tooltip";
- doAnswer((Answer<Void>) invocation -> {
- Object[] args = invocation.getArguments();
- ((int[]) args[0])[0] = 0;
- ((int[]) args[0])[1] = 0;
- return null;
- }).when(mHoverFolderIcon).getLocationOnScreen(any(int[].class));
- when(mHoverFolderIcon.getWidth()).thenReturn(100);
- when(mHoverFolderIcon.getHeight()).thenReturn(100);
-
- when(mTaskbarView.getTop()).thenReturn(200);
-
- mTaskbarHoverToolTipController = new TaskbarHoverToolTipController(
- taskbarActivityContext, mTaskbarView, mHoverBubbleTextView);
- mTestableLooper = TestableLooper.get(this);
- }
-
- @Test
- public void onHover_hoverEnterIcon_revealToolTip() {
- when(mMotionEvent.getAction()).thenReturn(MotionEvent.ACTION_HOVER_ENTER);
- when(mMotionEvent.getActionMasked()).thenReturn(MotionEvent.ACTION_HOVER_ENTER);
-
- boolean hoverConsumed =
- mTaskbarHoverToolTipController.onHover(mHoverBubbleTextView, mMotionEvent);
- waitForIdleSync();
-
- assertThat(hoverConsumed).isFalse();
- verify(taskbarActivityContext).setAutohideSuspendFlag(FLAG_AUTOHIDE_SUSPEND_HOVERING_ICONS,
- true);
- }
-
- @Test
- public void onHover_hoverExitIcon_closeToolTip() {
- when(mMotionEvent.getAction()).thenReturn(MotionEvent.ACTION_HOVER_EXIT);
- when(mMotionEvent.getActionMasked()).thenReturn(MotionEvent.ACTION_HOVER_EXIT);
-
- boolean hoverConsumed =
- mTaskbarHoverToolTipController.onHover(mHoverBubbleTextView, mMotionEvent);
- waitForIdleSync();
-
- assertThat(hoverConsumed).isFalse();
- verify(taskbarActivityContext).setAutohideSuspendFlag(FLAG_AUTOHIDE_SUSPEND_HOVERING_ICONS,
- false);
- }
-
- @Test
- public void onHover_hoverEnterFolderIcon_revealToolTip() {
- when(mMotionEvent.getAction()).thenReturn(MotionEvent.ACTION_HOVER_ENTER);
- when(mMotionEvent.getActionMasked()).thenReturn(MotionEvent.ACTION_HOVER_ENTER);
-
- boolean hoverConsumed =
- mTaskbarHoverToolTipController.onHover(mHoverFolderIcon, mMotionEvent);
- waitForIdleSync();
-
- assertThat(hoverConsumed).isFalse();
- verify(taskbarActivityContext).setAutohideSuspendFlag(FLAG_AUTOHIDE_SUSPEND_HOVERING_ICONS,
- true);
- }
-
- @Test
- public void onHover_hoverExitFolderIcon_closeToolTip() {
- when(mMotionEvent.getAction()).thenReturn(MotionEvent.ACTION_HOVER_EXIT);
- when(mMotionEvent.getActionMasked()).thenReturn(MotionEvent.ACTION_HOVER_EXIT);
-
- boolean hoverConsumed =
- mTaskbarHoverToolTipController.onHover(mHoverFolderIcon, mMotionEvent);
- waitForIdleSync();
-
- assertThat(hoverConsumed).isFalse();
- verify(taskbarActivityContext).setAutohideSuspendFlag(FLAG_AUTOHIDE_SUSPEND_HOVERING_ICONS,
- false);
- }
-
- @Test
- public void onHover_hoverExitFolderOpen_closeToolTip() {
- when(mMotionEvent.getAction()).thenReturn(MotionEvent.ACTION_HOVER_EXIT);
- when(mMotionEvent.getActionMasked()).thenReturn(MotionEvent.ACTION_HOVER_EXIT);
- doReturn(true).when(mSpyFolderView).isOpen();
-
- boolean hoverConsumed =
- mTaskbarHoverToolTipController.onHover(mHoverFolderIcon, mMotionEvent);
- waitForIdleSync();
-
- assertThat(hoverConsumed).isFalse();
- verify(taskbarActivityContext).setAutohideSuspendFlag(FLAG_AUTOHIDE_SUSPEND_HOVERING_ICONS,
- false);
- }
-
- @Test
- public void onHover_hoverEnterFolderOpen_noToolTip() {
- when(mMotionEvent.getAction()).thenReturn(MotionEvent.ACTION_HOVER_ENTER);
- when(mMotionEvent.getActionMasked()).thenReturn(MotionEvent.ACTION_HOVER_ENTER);
- doReturn(true).when(mSpyFolderView).isOpen();
-
- boolean hoverConsumed =
- mTaskbarHoverToolTipController.onHover(mHoverFolderIcon, mMotionEvent);
-
- assertThat(hoverConsumed).isFalse();
- }
-
- @Test
- public void onHover_hoverMove_noUpdate() {
- when(mMotionEvent.getAction()).thenReturn(MotionEvent.ACTION_HOVER_MOVE);
- when(mMotionEvent.getActionMasked()).thenReturn(MotionEvent.ACTION_HOVER_MOVE);
-
- boolean hoverConsumed =
- mTaskbarHoverToolTipController.onHover(mHoverFolderIcon, mMotionEvent);
-
- assertThat(hoverConsumed).isFalse();
- }
-
- @Test
- public void onHover_hoverEnterAppPair_revealToolTip() {
- when(mMotionEvent.getAction()).thenReturn(MotionEvent.ACTION_HOVER_ENTER);
- when(mMotionEvent.getActionMasked()).thenReturn(MotionEvent.ACTION_HOVER_ENTER);
-
- boolean hoverConsumed =
- mTaskbarHoverToolTipController.onHover(mAppPairIcon, mMotionEvent);
- waitForIdleSync();
-
- assertThat(hoverConsumed).isFalse();
- verify(taskbarActivityContext).setAutohideSuspendFlag(FLAG_AUTOHIDE_SUSPEND_HOVERING_ICONS,
- true);
- }
-
- @Test
- public void onHover_hoverExitAppPair_closeToolTip() {
- when(mMotionEvent.getAction()).thenReturn(MotionEvent.ACTION_HOVER_EXIT);
- when(mMotionEvent.getActionMasked()).thenReturn(MotionEvent.ACTION_HOVER_EXIT);
-
- boolean hoverConsumed =
- mTaskbarHoverToolTipController.onHover(mAppPairIcon, mMotionEvent);
- waitForIdleSync();
-
- assertThat(hoverConsumed).isFalse();
- verify(taskbarActivityContext).setAutohideSuspendFlag(FLAG_AUTOHIDE_SUSPEND_HOVERING_ICONS,
- false);
- }
-
- @Test
- public void onHover_hoverEnterIconAlignedWithHotseat_noReveal() {
- when(mMotionEvent.getAction()).thenReturn(MotionEvent.ACTION_HOVER_ENTER);
- when(mMotionEvent.getActionMasked()).thenReturn(MotionEvent.ACTION_HOVER_ENTER);
- when(taskbarActivityContext.isIconAlignedWithHotseat()).thenReturn(true);
-
- boolean hoverConsumed =
- mTaskbarHoverToolTipController.onHover(mHoverBubbleTextView, mMotionEvent);
- waitForIdleSync();
-
- assertThat(hoverConsumed).isFalse();
- verify(taskbarActivityContext).setAutohideSuspendFlag(FLAG_AUTOHIDE_SUSPEND_HOVERING_ICONS,
- true);
- }
-
- private void waitForIdleSync() {
- mTestableLooper.processAllMessages();
- }
-}
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimatorTest.kt b/quickstep/tests/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimatorTest.kt
index 61a697503e..61a697503e 100644
--- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimatorTest.kt
+++ b/quickstep/tests/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimatorTest.kt
diff --git a/quickstep/tests/src/com/android/quickstep/InputConsumerUtilsTest.java b/quickstep/tests/src/com/android/quickstep/InputConsumerUtilsTest.java
index 93b979cc32..1464ca8432 100644
--- a/quickstep/tests/src/com/android/quickstep/InputConsumerUtilsTest.java
+++ b/quickstep/tests/src/com/android/quickstep/InputConsumerUtilsTest.java
@@ -293,7 +293,7 @@ public class InputConsumerUtilsTest {
@Test
public void testNewBaseConsumer_launcherChildActivityResumed_returnsDefaultInputConsumer() {
when(mRunningTask.isHomeTask()).thenReturn(true);
- when(mOverviewComponentObserver.isHomeAndOverviewSame()).thenReturn(true);
+ when(mOverviewComponentObserver.isHomeAndOverviewSameActivity()).thenReturn(true);
assertEqualsDefaultInputConsumer(this::createBaseInputConsumer);
}
diff --git a/res/drawable/ic_split_horizontal.xml b/res/drawable/ic_split_horizontal.xml
index 2efd2b9bc2..26efedc4d9 100644
--- a/res/drawable/ic_split_horizontal.xml
+++ b/res/drawable/ic_split_horizontal.xml
@@ -1,9 +1,25 @@
+<!--
+ ~ Copyright (C) 2025 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24"
- android:viewportHeight="24">
- <path
- android:pathData="M4,6L9,6L9,18L4,18L4,6ZM2,6L2,18C2,19.1 2.9,20 4,20L9,20C10.1,20 11,19.1 11,18L11,6C11,4.9 10.1,4 9,4L4,4C2.9,4 2,4.9 2,6ZM15,6L20,6L20,18L15,18L15,6ZM13,6L13,18C13,19.1 13.9,20 15,20L20,20C21.1,20 22,19.1 22,18L22,6C22,4.9 21.1,4 20,4L15,4C13.9,4 13,4.9 13,6Z"
- android:fillColor="#000000"/>
+ android:width="20dp"
+ android:height="20dp"
+ android:tint="?attr/colorControlNormal"
+ android:viewportHeight="960"
+ android:viewportWidth="960">
+ <path
+ android:fillColor="@android:color/white"
+ android:pathData="M552,624L684,624Q699.3,624 709.65,613.66Q720,603.32 720,588.04L720,372.28Q720,357 709.65,346.5Q699.3,336 684,336L552,336Q536.7,336 526.35,346.34Q516,356.68 516,371.96L516,587.72Q516,603 526.35,613.5Q536.7,624 552,624ZM276,624L408,624Q423.3,624 433.65,613.66Q444,603.32 444,588.04L444,372.28Q444,357 433.65,346.5Q423.3,336 408,336L276,336Q260.7,336 250.35,346.34Q240,356.68 240,371.96L240,587.72Q240,603 250.35,613.5Q260.7,624 276,624ZM168,768Q138.3,768 117.15,746.84Q96,725.68 96,695.96L96,263.72Q96,234 117.15,213Q138.3,192 168,192L792,192Q821.7,192 842.85,213.16Q864,234.32 864,264.04L864,696.28Q864,726 842.85,747Q821.7,768 792,768L168,768ZM792,264L168,264Q168,264 168,264Q168,264 168,264L168,696Q168,696 168,696Q168,696 168,696L792,696Q792,696 792,696Q792,696 792,696L792,264Q792,264 792,264Q792,264 792,264ZM168,264Q168,264 168,264Q168,264 168,264L168,696Q168,696 168,696Q168,696 168,696L168,696Q168,696 168,696Q168,696 168,696L168,264Q168,264 168,264Q168,264 168,264Z" />
</vector>
diff --git a/res/drawable/ic_split_vertical.xml b/res/drawable/ic_split_vertical.xml
index 9bc97851ab..787953a52f 100644
--- a/res/drawable/ic_split_vertical.xml
+++ b/res/drawable/ic_split_vertical.xml
@@ -1,9 +1,25 @@
+<!--
+ ~ Copyright (C) 2025 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24"
- android:viewportHeight="24">
- <path
- android:pathData="M18,4V9H6V4H18ZM18,2H6C4.9,2 4,2.9 4,4V9C4,10.1 4.9,11 6,11H18C19.1,11 20,10.1 20,9V4C20,2.9 19.1,2 18,2ZM18,15V20H6V15H18ZM18,13H6C4.9,13 4,13.9 4,15V20C4,21.1 4.9,22 6,22H18C19.1,22 20,21.1 20,20V15C20,13.9 19.1,13 18,13Z"
- android:fillColor="#000000"/>
+ android:width="20dp"
+ android:height="20dp"
+ android:tint="?attr/colorControlNormal"
+ android:viewportHeight="960"
+ android:viewportWidth="960">
+ <path
+ android:fillColor="@android:color/white"
+ android:pathData="M371.96,720L587.72,720Q603,720 613.5,709.65Q624,699.3 624,684L624,552Q624,536.7 613.66,526.35Q603.32,516 588.04,516L372.28,516Q357,516 346.5,526.35Q336,536.7 336,552L336,684Q336,699.3 346.34,709.65Q356.68,720 371.96,720ZM371.96,444L587.72,444Q603,444 613.5,433.65Q624,423.3 624,408L624,276Q624,260.7 613.66,250.35Q603.32,240 588.04,240L372.28,240Q357,240 346.5,250.35Q336,260.7 336,276L336,408Q336,423.3 346.34,433.65Q356.68,444 371.96,444ZM768,792Q768,821.7 746.84,842.85Q725.68,864 695.96,864L263.72,864Q234,864 213,842.85Q192,821.7 192,792L192,168Q192,138.3 213.16,117.15Q234.32,96 264.04,96L696.28,96Q726,96 747,117.15Q768,138.3 768,168L768,792ZM696,792L696,168Q696,168 696,168Q696,168 696,168L264,168Q264,168 264,168Q264,168 264,168L264,792Q264,792 264,792Q264,792 264,792L696,792Q696,792 696,792Q696,792 696,792ZM696,168Q696,168 696,168Q696,168 696,168L264,168Q264,168 264,168Q264,168 264,168L264,168Q264,168 264,168Q264,168 264,168L696,168Q696,168 696,168Q696,168 696,168Z" />
</vector>
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 4133419051..962a018232 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Muurpapier en styl"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Wysig tuisskerm"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Tuis-instellings"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Apps"</string>
<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>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Verminder hoogte"</string>
<string name="widget_resized" msgid="9130327887929620">"Legstukgrootte is verander na breedte <xliff:g id="NUMBER_0">%1$s</xliff:g> hoogte <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Kortpadkieslys"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Verander grootte van legstukraam vir <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Maak toe"</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>
diff --git a/res/values-am/strings.xml b/res/values-am/strings.xml
index 4cb4e1ac1f..1fbff54b09 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"ልጣፍ እና ቅጥ"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"መነሻ ማያ ገጽን አርትዕ"</string>
<string name="settings_button_text" msgid="8873672322605444408">"የመነሻ ቅንብሮች"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"መተግበሪያዎች"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"በእርስዎ አስተዳዳሪ የተሰናከለ"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"የመነሻ ማያ ገፅ ማሽከርከርን ይፍቀዱ"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"ስልኩ ሲዞር"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"ቁመት ይቀንሱ"</string>
<string name="widget_resized" msgid="9130327887929620">"የመግብር መጠን ወደ ስፋት <xliff:g id="NUMBER_0">%1$s</xliff:g> ቁመት <xliff:g id="NUMBER_1">%2$s</xliff:g> ተለውጧል"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"የአቋራጭ ምናሌ"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"ለ<xliff:g id="STRING">%1$s</xliff:g> የሚሆን የምግብር መጠን መቀይር ክፍለ ገጸ ድር"</string>
+ <string name="action_close" msgid="1077760267194136901">"ዝጋ"</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>
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 3961d11e3c..bd49e081c1 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"الخلفية والأسلوب"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"تعديل الشاشة الرئيسية"</string>
<string name="settings_button_text" msgid="8873672322605444408">"إعدادات الشاشة الرئيسية"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"التطبيقات"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"أوقف المشرف هذه الميزة"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"السماح بتدوير الشاشة الرئيسية"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"عند تدوير الهاتف"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"تقليل الارتفاع"</string>
<string name="widget_resized" msgid="9130327887929620">"تم تغيير حجم التطبيق المصغَّر إلى العرض <xliff:g id="NUMBER_0">%1$s</xliff:g> والارتفاع <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"قائمة الاختصارات"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"تغيير حجم إطار تطبيق \"<xliff:g id="STRING">%1$s</xliff:g>\" المصغّر"</string>
+ <string name="action_close" msgid="1077760267194136901">"إغلاق"</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>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"النقل إلى المساحة الخاصة"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"تثبيت"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"تثبيت التطبيقات في المساحة الخاصّة"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"إضافة ملفات والمزيد إلى \"المساحة الخاصّة\""</string>
</resources>
diff --git a/res/values-as/strings.xml b/res/values-as/strings.xml
index b1b411374c..87301ff237 100644
--- a/res/values-as/strings.xml
+++ b/res/values-as/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"ৱালপেপাৰ আৰু শৈলী"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"গৃহ স্ক্ৰীন সম্পাদনা কৰক"</string>
<string name="settings_button_text" msgid="8873672322605444408">"গৃহ ছেটিং"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"এপ্‌"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"আপোনাৰ প্ৰশাসকে অক্ষম কৰি ৰাখিছে"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"গৃহ স্ক্ৰীন ঘূৰোৱাৰ অনুমতি দিয়ক"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"ফ\'নটো যেতিয়া ঘূৰোৱা হয়"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"উচ্চতা হ্ৰাস কৰক"</string>
<string name="widget_resized" msgid="9130327887929620">"ৱিজেটৰ আকাৰ সলনি কৰি প্ৰস্থ <xliff:g id="NUMBER_0">%1$s</xliff:g> আৰু উচ্চতা <xliff:g id="NUMBER_1">%2$s</xliff:g> কৰা হ’ল"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"শ্বৰ্টকাটৰ মেনু"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g>ৰ বাবে ৱিজেটৰ আকাৰ সলনি কৰা ফ্রে’ম"</string>
+ <string name="action_close" msgid="1077760267194136901">"বন্ধ কৰক"</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>
diff --git a/res/values-az/strings.xml b/res/values-az/strings.xml
index 061b62137b..b37830289d 100644
--- a/res/values-az/strings.xml
+++ b/res/values-az/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Divar kağızı və üslub"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Əsas ekranı redaktə edin"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Home ayarları"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Tətbiqlər"</string>
<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>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Hündürlüyü azaldın"</string>
<string name="widget_resized" msgid="9130327887929620">"Vidcetin eni <xliff:g id="NUMBER_0">%1$s</xliff:g> hündürlüyü <xliff:g id="NUMBER_1">%2$s</xliff:g> kimi ölçüləndirildi"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Qısayol menyusu"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g> üçün vidcet ölçüsünü dəyişdirmə çərçivəsi"</string>
+ <string name="action_close" msgid="1077760267194136901">"Bağlayın"</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>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Şəxsi məkana keçid"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Quraşdırın"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Tətbiqləri şəxsi sahədə quraşdırın"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Private Space-ə fayllar və s. əlavə edin"</string>
</resources>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index b53224a056..de03de52b6 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Pozadina i stil"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Izmeni početni ekran"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Podešavanja početnog ekrana"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Aplikacije"</string>
<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>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Smanji visinu"</string>
<string name="widget_resized" msgid="9130327887929620">"Veličina vidžeta je promenjena na širinu <xliff:g id="NUMBER_0">%1$s</xliff:g> i visinu <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Meni sa prečicama"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Promena veličine okvira vidžeta za: <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Zatvorite"</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>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Prenos privatnog prostora"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Instalirajte"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Instaliraj aplikacije u privatan prostor"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Dodajte fajlove i drugo u privatan prostor"</string>
</resources>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index b12eb23e09..a0ff53c731 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Шпалеры і стыль"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Змяніць Галоўны экран"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Налады галоўнага экрана"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Праграмы"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Адключаная адміністратарам"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Дазволіць паварот галоўнага экрана"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Пры павароце тэлефона"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Паменшыць вышыню"</string>
<string name="widget_resized" msgid="9130327887929620">"Памеры віджэта зменены на: шырыня <xliff:g id="NUMBER_0">%1$s</xliff:g>, вышыня <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Меню спалучэнняў клавіш"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Рамка змянення памеру для віджэта \"<xliff:g id="STRING">%1$s</xliff:g>\""</string>
+ <string name="action_close" msgid="1077760267194136901">"Закрыць"</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>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Пераход у прыватную вобласць"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Усталяваць"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Усталяваць праграмы ў прыватнай прасторы"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Дадавайце файлы і іншае змесціва ў прыватную прастору"</string>
</resources>
diff --git a/res/values-bg/strings.xml b/res/values-bg/strings.xml
index ee4dabc8e8..60624a2aba 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Тапет и стил"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Редактиране на началния екран"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Настройки за началния екран"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Приложения"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Деактивирано от администратора ви"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Разрешаване на завъртането на началния екран"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"При завъртане на телефона"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Намаляване на височината"</string>
<string name="widget_resized" msgid="9130327887929620">"Приспособлението е преоразмерено към ширина <xliff:g id="NUMBER_0">%1$s</xliff:g> и височина <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Меню за клавишните комбинации"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Рамка за преоразмеряване на приспособлението за <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Затваряне"</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>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Преминаване към частното пространство"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Инсталиране"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Инсталиране на приложения в частно пространство"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Добавяне на файлове и др. в частно пространство"</string>
</resources>
diff --git a/res/values-bn/strings.xml b/res/values-bn/strings.xml
index a889a94f57..f7c68d5c64 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"ওয়ালপেপার এবং স্টাইল"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"হোম স্ক্রিন এডিট করুন"</string>
<string name="settings_button_text" msgid="8873672322605444408">"হোম সেটিংস"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"অ্যাপ"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"আপনার প্রশাসক দ্বারা অক্ষম করা হয়েছে"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"হোম স্ক্রিন রোটেট করার অনুমতি দিন"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"যখন ফোনটি ঘোরানো হয়"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"উচ্চতা কমান"</string>
<string name="widget_resized" msgid="9130327887929620">"উইজেটের আকার প্রস্থ <xliff:g id="NUMBER_0">%1$s</xliff:g> উচ্চতা <xliff:g id="NUMBER_1">%2$s</xliff:g> তে পরিবর্তন করা হয়েছে"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"শর্টকাট মেনু"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g>-এর জন্য উইজেট ছোট বড় করার ফ্রেম"</string>
+ <string name="action_close" msgid="1077760267194136901">"বন্ধ করুন"</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>
diff --git a/res/values-bs/strings.xml b/res/values-bs/strings.xml
index 43088791ec..96d567ca49 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Pozadinska slika i stil"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Uredi Početni ekran"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Postavke početnog ekrana"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Aplikacije"</string>
<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>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Smanji visinu"</string>
<string name="widget_resized" msgid="9130327887929620">"Veličina vidžeta je promijenjena na širinu <xliff:g id="NUMBER_0">%1$s</xliff:g> visinu <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Meni prečica"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Promjena veličine okvira vidžeta za aplikaciju <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Zatvaranje"</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>
diff --git a/res/values-ca/strings.xml b/res/values-ca/strings.xml
index 434117b6e4..839c6813dd 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Estil i fons de pantalla"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Edita la pantalla d\'inici"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Configuració de la pantalla d\'inici"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Aplicacions"</string>
<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>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Redueix l\'alçada"</string>
<string name="widget_resized" msgid="9130327887929620">"S\'ha canviat la mida del widget a l\'amplada <xliff:g id="NUMBER_0">%1$s</xliff:g> i l\'alçada <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Menú de dreceres"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Marc de canvi de mida del widget per a <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Tanca"</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>
diff --git a/res/values-cs/strings.xml b/res/values-cs/strings.xml
index bc73d08e5a..e297418b11 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Tapety a styl"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Upravit plochu"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Nastavení plochy"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Aplikace"</string>
<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>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Snížit výšku"</string>
<string name="widget_resized" msgid="9130327887929620">"Velikost widgetu upravena: šířka <xliff:g id="NUMBER_0">%1$s</xliff:g>, výška <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Nabídka zkratek"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Rámec widgetu pro změnu velikosti pro <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Zavřít"</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>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 0a2f74f7db..9691fb0d98 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Baggrund og stil"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Rediger startskærm"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Indst. for startskærm"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Apps"</string>
<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>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Reducer højden"</string>
<string name="widget_resized" msgid="9130327887929620">"Størrelsen for widgetten er ændret til bredde <xliff:g id="NUMBER_0">%1$s</xliff:g> og højde <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Genvejsmenu"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Widget til at tilpasse størrelsen på rammen for <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Luk"</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>
diff --git a/res/values-de/strings.xml b/res/values-de/strings.xml
index 69e1d90294..fc390f6487 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Hintergrund &amp; Stil"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Startbildschirm bearbeiten"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Einstellungen"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Apps"</string>
<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>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Höhe verringern"</string>
<string name="widget_resized" msgid="9130327887929620">"Größe des Widgets zu Breite <xliff:g id="NUMBER_0">%1$s</xliff:g> und Höhe <xliff:g id="NUMBER_1">%2$s</xliff:g> geändert"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Menü für Tastenkombinationen"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Frame „Widget-Größe anpassen“ für <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Schließen"</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>
diff --git a/res/values-el/strings.xml b/res/values-el/strings.xml
index aaa575c256..eff7d24973 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Ταπετσαρία και στιλ"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Επεξεργασία αρχικής οθόνης"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Ρυθμ. Αρχικής οθόνης"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Εφαρμογές"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Απενεργοποιήθηκε από τον διαχειριστή σας"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Να επιτρέπεται η περιστροφή της αρχικής οθόνης"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Όταν το τηλέφωνο περιστρέφεται"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Μείωση του ύψους"</string>
<string name="widget_resized" msgid="9130327887929620">"Έγινε προσαρμογή του μεγέθους του γραφικού στοιχείου σε <xliff:g id="NUMBER_0">%1$s</xliff:g> πλάτος και <xliff:g id="NUMBER_1">%2$s</xliff:g> ύψος"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Μενού συντομεύσεων"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Πλαίσιο αλλαγής μεγέθους γραφικού στοιχείου για <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Κλείσιμο"</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>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Μετάβαση στον Ιδιωτικό χώρο"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Εγκατάσταση"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Εγκατάσταση εφαρμογών στον ιδιωτικό χώρο"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Προσθέστε αρχεία και άλλα στοιχεία στον Ιδιωτικό χώρο"</string>
</resources>
diff --git a/res/values-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index db602e780e..46a9a357c0 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Wallpaper and style"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Edit home screen"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Home settings"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Apps"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Disabled by your admin"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Allow home screen rotation"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"When phone is rotated"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Decrease height"</string>
<string name="widget_resized" msgid="9130327887929620">"Widget re-sized to width <xliff:g id="NUMBER_0">%1$s</xliff:g> height <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Shortcut menu"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Widget resize frame for <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Close"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Dismiss"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Close"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personal"</string>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index db602e780e..46a9a357c0 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Wallpaper and style"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Edit home screen"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Home settings"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Apps"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Disabled by your admin"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Allow home screen rotation"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"When phone is rotated"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Decrease height"</string>
<string name="widget_resized" msgid="9130327887929620">"Widget re-sized to width <xliff:g id="NUMBER_0">%1$s</xliff:g> height <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Shortcut menu"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Widget resize frame for <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Close"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Dismiss"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Close"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personal"</string>
diff --git a/res/values-en-rIN/strings.xml b/res/values-en-rIN/strings.xml
index db602e780e..46a9a357c0 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Wallpaper and style"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Edit home screen"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Home settings"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Apps"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Disabled by your admin"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Allow home screen rotation"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"When phone is rotated"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Decrease height"</string>
<string name="widget_resized" msgid="9130327887929620">"Widget re-sized to width <xliff:g id="NUMBER_0">%1$s</xliff:g> height <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Shortcut menu"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Widget resize frame for <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Close"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Dismiss"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Close"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personal"</string>
diff --git a/res/values-es-rUS/strings.xml b/res/values-es-rUS/strings.xml
index 6dd87e167a..d5476caed5 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -33,7 +33,7 @@
<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="save_app_pair" msgid="5647523853662686243">"Guardar grupo 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">"No se admite esta vinculación de apps en este dispositivo"</string>
<string name="app_pair_needs_unfold" msgid="4588897528143807002">"Abre el dispositivo para usar esta vinculación de apps"</string>
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Fondo de pantalla y estilo"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Editar pantalla principal"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Configuración de pantalla principal"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Apps"</string>
<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>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Reducir la altura"</string>
<string name="widget_resized" msgid="9130327887929620">"Se cambió la dimensión del widget a <xliff:g id="NUMBER_0">%1$s</xliff:g> de ancho y <xliff:g id="NUMBER_1">%2$s</xliff:g> de alto."</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Menú de accesos directos"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Marco de cambio de tamaño del widget para <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Cerrar"</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>
diff --git a/res/values-es/strings.xml b/res/values-es/strings.xml
index c604da7bbb..7e8ff04f5d 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Fondo de pantalla y estilo"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Editar pantalla de inicio"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Ajustes de la pantalla de inicio"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Aplicaciones"</string>
<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>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Reducir altura"</string>
<string name="widget_resized" msgid="9130327887929620">"Se ha modificado el tamaño del widget a <xliff:g id="NUMBER_0">%1$s</xliff:g> de ancho y <xliff:g id="NUMBER_1">%2$s</xliff:g> de alto"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Menú de combinaciones de teclas"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Marco de cambio de tamaño del widget de <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Cerrar"</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>
diff --git a/res/values-et/strings.xml b/res/values-et/strings.xml
index 3d270c9613..3a4b3e20f2 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Taustapilt ja stiil"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Muuda avaekraani"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Avakuva seaded"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Rakendused"</string>
<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>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Vähenda kõrgust"</string>
<string name="widget_resized" msgid="9130327887929620">"Vidina suurust muudeti. Laius: <xliff:g id="NUMBER_0">%1$s</xliff:g>. Kõrgus: <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Kiirmenüü"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Vidina <xliff:g id="STRING">%1$s</xliff:g> suuruse muutmise raam"</string>
+ <string name="action_close" msgid="1077760267194136901">"Sule"</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>
diff --git a/res/values-eu/strings.xml b/res/values-eu/strings.xml
index 07a75a1652..8a84353190 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Horma-papera eta estiloa"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Editatu orri nagusia"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Orri nagusiaren ezarpenak"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Aplikazioak"</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>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Txikitu altuera"</string>
<string name="widget_resized" msgid="9130327887929620">"Aldatu da widgetaren tamaina. Zabalera: <xliff:g id="NUMBER_0">%1$s</xliff:g>. Altuera: <xliff:g id="NUMBER_1">%2$s</xliff:g>."</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Lasterbideen menua"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g> aplikazioaren widgetaren tamaina aldatzeko markoa"</string>
+ <string name="action_close" msgid="1077760267194136901">"Itxi"</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>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 4afde8a007..6e6a1c08d1 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"کاغذدیواری و سبک"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"ویرایش «صفحه اصلی»"</string>
<string name="settings_button_text" msgid="8873672322605444408">"تنظیمات صفحه اصلی"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"برنامه‌ها"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"توسط سرپرست سیستم غیرفعال شده است"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"مجاز کردن چرخش صفحه اصلی"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"وقتی تلفن چرخانده می‌شود"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"کاهش ارتفاع"</string>
<string name="widget_resized" msgid="9130327887929620">"اندازه ابزاره به عرض <xliff:g id="NUMBER_0">%1$s</xliff:g> ارتفاع <xliff:g id="NUMBER_1">%2$s</xliff:g> تغییر کرد"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"منو میان‌بر"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"قاب تغییر اندازه ابزاره برای <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"بستن"</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>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"انتقال «فضای خصوصی»"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"نصب"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"نصب برنامه‌ها در «فضای خصوصی»"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"افزودن فایل‌ها و موارد دیگر به «فضای خصوصی»"</string>
</resources>
diff --git a/res/values-fi/strings.xml b/res/values-fi/strings.xml
index 8a0de4c603..ff27a1b3fe 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Taustakuva ja tyyli"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Muokkaa aloitusnäyttöä"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Aloitusnäyttö"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Sovellukset"</string>
<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>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Vähennä korkeutta"</string>
<string name="widget_resized" msgid="9130327887929620">"Widgetin kokoa muutettiin. Sen leveys on nyt <xliff:g id="NUMBER_0">%1$s</xliff:g> ja korkeus <xliff:g id="NUMBER_1">%2$s</xliff:g>."</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Pikanäppäinvalikko"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Widgetin koon muuttaminen (<xliff:g id="STRING">%1$s</xliff:g>)"</string>
+ <string name="action_close" msgid="1077760267194136901">"Sulje"</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>
diff --git a/res/values-fr-rCA/strings.xml b/res/values-fr-rCA/strings.xml
index 159d980b96..f9b851c057 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Fond d\'écran et style"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Modifier l\'écran d\'accueil"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Paramètres d\'accueil"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Applis"</string>
<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>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Diminuer la hauteur"</string>
<string name="widget_resized" msgid="9130327887929620">"Le widget a été redimensionné (largeur : <xliff:g id="NUMBER_0">%1$s</xliff:g>, hauteur : <xliff:g id="NUMBER_1">%2$s</xliff:g>)"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Menu des raccourcis"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Cadre de redimensionnement du widget pour <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Fermer"</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>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Transition vers l\'Espace privé"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Installer"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Installer des applis dans l\'Espace privé"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Ajouter des fichiers et plus à l\'espace privé"</string>
</resources>
diff --git a/res/values-fr/strings.xml b/res/values-fr/strings.xml
index 837425b7ad..0c62a9d217 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Fond d\'écran et style"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Modifier l\'écran d\'accueil"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Paramètres de l\'accueil"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Applis"</string>
<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>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Diminuer la hauteur"</string>
<string name="widget_resized" msgid="9130327887929620">"Le widget a bien été redimensionné (largeur : <xliff:g id="NUMBER_0">%1$s</xliff:g>, hauteur : <xliff:g id="NUMBER_1">%2$s</xliff:g>)."</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Menu de raccourci"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Cadre de redimensionnement du widget pour <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Fermer"</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>
diff --git a/res/values-gl/strings.xml b/res/values-gl/strings.xml
index 5c9b179314..21e16cc8aa 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Estilo e fondo de pantalla"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Editar pantalla de inicio"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Configuración da pantalla de inicio"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Aplicacións"</string>
<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>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Reducir altura"</string>
<string name="widget_resized" msgid="9130327887929620">"Cambiouse o tamaño do widget polo ancho <xliff:g id="NUMBER_0">%1$s</xliff:g> e a altura <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Menú do atallo"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Marco do cambio de tamaño do widget para <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Pechar"</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>
diff --git a/res/values-gu/strings.xml b/res/values-gu/strings.xml
index 5f9407b84e..a619bcb836 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"વૉલપેપર અને સ્ટાઇલ"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"હોમ સ્ક્રીનમાં ફેરફાર કરો"</string>
<string name="settings_button_text" msgid="8873672322605444408">"હોમ સેટિંગ"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"ઍપ"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"તમારા વ્યવસ્થાપક દ્વારા અક્ષમ કરેલ"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"હોમ સ્ક્રીનને ફેરવવાની મંજૂરી આપો"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"જ્યારે ફોન ફેરવવામાં આવે ત્યારે"</string>
@@ -186,18 +185,14 @@
<string name="action_decrease_height" msgid="282377193880900022">"ઊંચાઈ ઘટાડો"</string>
<string name="widget_resized" msgid="9130327887929620">"વિજેટનો આકાર બદલીને <xliff:g id="NUMBER_0">%1$s</xliff:g> પહોળાઈ <xliff:g id="NUMBER_1">%2$s</xliff:g> ઊંચાઈ કર્યો"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"શૉર્ટકટ મેનૂ"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g> માટે વિજેટનું કદ બદલવાની ફ્રેમ"</string>
+ <string name="action_close" msgid="1077760267194136901">"બંધ કરો"</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>
<string name="all_apps_work_tab" msgid="4884822796154055118">"ઑફિસની ઍપ"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"વ્યક્તિગત ઍપનું ટૅબ"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"ઑફિસ માટેની ઍપનું ટૅબ"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"ઑફિસની પ્રોફાઇલ"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"ઑફિસની ઍપને બૅજ આપેલા હોય છે અને તમારા IT ઍડમિન તેમને જોઈ શકે છે"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"સમજાઈ ગયું"</string>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index 5bd0c6f499..3aad85f2aa 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"वॉलपेपर और स्टाइल"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"होम स्क्रीन में बदलाव करें"</string>
<string name="settings_button_text" msgid="8873672322605444408">"होम स्क्रीन की सेटिंग"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"ऐप्लिकेशन"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"आपके एडमिन ने बंद किया हुआ है"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"होम स्क्रीन घुमाने की अनुमति दें"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"फ़ोन घुुमाए जाने पर"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"ऊंचाई घटाएं"</string>
<string name="widget_resized" msgid="9130327887929620">"विजेट का आकार बदलकर उसकी चौड़ाई <xliff:g id="NUMBER_0">%1$s</xliff:g> और ऊंचाई <xliff:g id="NUMBER_1">%2$s</xliff:g> कर दी गई"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"शॉर्टकट मेन्यू"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g> के लिए, विजेट का साइज़ बदलने वाला फ़्रेम"</string>
+ <string name="action_close" msgid="1077760267194136901">"बंद करें"</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>
diff --git a/res/values-hr/strings.xml b/res/values-hr/strings.xml
index 6ff744194c..bdb088bfc9 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Pozadina i stil"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Uredi početni zaslon"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Postavke početnog zaslona"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Aplikacije"</string>
<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>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Smanjenje visine"</string>
<string name="widget_resized" msgid="9130327887929620">"Širina widgeta promijenjena je na <xliff:g id="NUMBER_0">%1$s</xliff:g>, a visina na <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Izbornik prečaca"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Okvir za promjenu veličine widgeta za <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Zatvori"</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>
diff --git a/res/values-hu/strings.xml b/res/values-hu/strings.xml
index 5920dffb5c..8abfaac0c1 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Háttérkép és stílus"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Kezdőképernyő szerkesztése"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Kezdőképernyő beállításai"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Alkalmazások"</string>
<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>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Magasság csökkentése"</string>
<string name="widget_resized" msgid="9130327887929620">"Modul átméretezve <xliff:g id="NUMBER_0">%1$s</xliff:g> szélességre és <xliff:g id="NUMBER_1">%2$s</xliff:g> magasságra"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Gyorsparancsok menüje"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g> modul átméretezési kerete"</string>
+ <string name="action_close" msgid="1077760267194136901">"Bezárás"</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>
diff --git a/res/values-hy/strings.xml b/res/values-hy/strings.xml
index 38e0bf1f13..9c6fc183ec 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Պաստառ և ոճ"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Փոփոխել հիմնական էկրանը"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Գլխավոր էկրանի կարգավորումներ"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Հավելվածներ"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Անջատվել է ձեր ադմինիստրատորի կողմից"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Թույլ տալ հիմնական էկրանի պտտումը"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Հեռախոսը պտտելու դեպքում"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Նվազեցնել բարձրությունը"</string>
<string name="widget_resized" msgid="9130327887929620">"Վիջեթի լայնությունը փոխվել է <xliff:g id="NUMBER_0">%1$s</xliff:g>-ի, իսկ բարձրությունը՝ <xliff:g id="NUMBER_1">%2$s</xliff:g>-ի"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Դյուրանցման ընտրացանկ"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"«<xliff:g id="STRING">%1$s</xliff:g>» վիջեթի չափսի փոփոխման շրջանակ"</string>
+ <string name="action_close" msgid="1077760267194136901">"Փակել"</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>
diff --git a/res/values-in/strings.xml b/res/values-in/strings.xml
index a850e9c95d..986f36cecb 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Wallpaper &amp; gaya"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Edit Layar Utama"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Setelan layar utama"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Aplikasi"</string>
<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>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Kurangi tinggi"</string>
<string name="widget_resized" msgid="9130327887929620">"Widget diubah ukurannya menjadi lebar <xliff:g id="NUMBER_0">%1$s</xliff:g> tinggi <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Menu Pintasan"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Bingkai Ubah Ukuran Widget untuk <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Tutup"</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>
diff --git a/res/values-is/strings.xml b/res/values-is/strings.xml
index 0dbcda2cc0..1c240063e0 100644
--- a/res/values-is/strings.xml
+++ b/res/values-is/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Veggfóður og stíll"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Breyta heimaskjá"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Heimastillingar"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Forrit"</string>
<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>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Minnka hæð"</string>
<string name="widget_resized" msgid="9130327887929620">"Stærð græju breytt í <xliff:g id="NUMBER_0">%1$s</xliff:g> á breidd og <xliff:g id="NUMBER_1">%2$s</xliff:g> á hæð"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Flýtileiðavalmynd"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Rammi til að breyta stærð græjunnar „<xliff:g id="STRING">%1$s</xliff:g>“"</string>
+ <string name="action_close" msgid="1077760267194136901">"Loka"</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>
diff --git a/res/values-it/strings.xml b/res/values-it/strings.xml
index 29e28e1fe7..3b237908f8 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Sfondo e stile"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Modifica schermata Home"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Impostazioni schermata Home"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"App"</string>
<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>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Riduci altezza"</string>
<string name="widget_resized" msgid="9130327887929620">"Widget ridimensionato a larghezza <xliff:g id="NUMBER_0">%1$s</xliff:g>, altezza <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Menu scorciatoie"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Frame ridimensionamento widget per <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Chiudi"</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>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Transizione dello Spazio privato in corso…"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Installa"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Installa le app su spazi privati"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Aggiungi file e altro allo spazio privato"</string>
</resources>
diff --git a/res/values-ja/strings.xml b/res/values-ja/strings.xml
index 9cc6a83407..08a2889827 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"壁紙とスタイル"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"ホーム画面を編集"</string>
<string name="settings_button_text" msgid="8873672322605444408">"ホームの設定"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"アプリ"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"管理者により無効にされています"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"ホーム画面の回転を許可"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"スマートフォンの向きに合わせます"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"高さを低くする"</string>
<string name="widget_resized" msgid="9130327887929620">"ウィジェットのサイズを幅<xliff:g id="NUMBER_0">%1$s</xliff:g>、高さ<xliff:g id="NUMBER_1">%2$s</xliff:g>に変更しました"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"ショートカット メニュー"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g> のウィジェットのサイズ変更フレーム"</string>
+ <string name="action_close" msgid="1077760267194136901">"閉じる"</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>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"プライベート スペース移行中"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"インストール"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"プライベート スペースにアプリをインストールします"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"プライベート スペースにファイルなどを追加する"</string>
</resources>
diff --git a/res/values-ka/strings.xml b/res/values-ka/strings.xml
index 108176bdd2..38547f56f1 100644
--- a/res/values-ka/strings.xml
+++ b/res/values-ka/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"ფონი და სტილი"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"მთავარი ეკრანის რედაქტირება"</string>
<string name="settings_button_text" msgid="8873672322605444408">"მთავარი გვერდის პარამეტრები"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"აპები"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"გათიშულია თქვენი ადმინისტრატორის მიერ"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"მთავარი ეკრანის შეტრიალების დაშვება"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"ტელეფონის შეტრიალებისას"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"სიმაღლის შემცირება"</string>
<string name="widget_resized" msgid="9130327887929620">"ვიჯეტის ზომები შეიცვალა: სიგანე <xliff:g id="NUMBER_0">%1$s</xliff:g> სიმაღლე <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"მალსახმობის მენიუ"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"ვიჯეტის ზომის შეცვლის ფრეიმი <xliff:g id="STRING">%1$s</xliff:g>-ისთვის"</string>
+ <string name="action_close" msgid="1077760267194136901">"დახურვა"</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>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"პირად სივრცეზე გადასვლა"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"ინსტალაცია"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"კერძო სივრცეში აპების ინსტალაცია"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"კერძო სივრცეში დაამატეთ ფაილები და სხვა"</string>
</resources>
diff --git a/res/values-km/strings.xml b/res/values-km/strings.xml
index 1c12f04645..f096671010 100644
--- a/res/values-km/strings.xml
+++ b/res/values-km/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"ផ្ទាំងរូបភាព និងរចនាបថ"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"កែអេក្រង់ដើម"</string>
<string name="settings_button_text" msgid="8873672322605444408">"ការកំណត់​ទំព័រដើម"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"កម្មវិធី"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"បានបិទដំណើរការដោយអ្នកគ្រប់គ្រងរបស់អ្នក"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"អនុញ្ញាតការបងិ្វលអេក្រង់ដើម"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"នៅពេលដែលបង្វិលទូរសព្ទ"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"បន្ថយកម្ពស់"</string>
<string name="widget_resized" msgid="9130327887929620">"ធាតុក្រាហ្វិកដែលបានប្តូរទំហំទៅទទឹងប្រវែង <xliff:g id="NUMBER_0">%1$s</xliff:g> កម្ពស់ប្រវែង <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"ម៉ឺនុយផ្លូវ​កាត់"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"ហ្វ្រេមប្ដូរទំហំធាតុក្រាហ្វិកសម្រាប់ <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"បិទ"</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>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"ការផ្លាស់ប្ដូរ Private Space"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"ដំឡើង"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"ដំឡើងកម្មវិធីទៅលំហឯកជន"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"បញ្ចូលឯកសារ និងអ្វីៗជាច្រើនទៀតទៅលំហឯកជន"</string>
</resources>
diff --git a/res/values-kn/strings.xml b/res/values-kn/strings.xml
index e30b80b9d5..c27bbde11b 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"ವಾಲ್‌ಪೇಪರ್ ಮತ್ತು ಶೈಲಿ"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"ಹೋಮ್ ಸ್ಕ್ರೀನ್ ಅನ್ನು ಎಡಿಟ್ ಮಾಡಿ"</string>
<string name="settings_button_text" msgid="8873672322605444408">"ಹೋಮ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳು"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"ಆ್ಯಪ್‌ಗಳು"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ್ದಾರೆ"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"ಹೋಮ್ ಸ್ಕ್ರೀನ್ ತಿರುಗುವಿಕೆಯನ್ನು ಅನುಮತಿಸಿ"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"ಫೋನ್‌ ತಿರುಗಿಸಿದಾಗ"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"ಎತ್ತರವನ್ನು ಕಡಿಮೆ ಮಾಡಿ"</string>
<string name="widget_resized" msgid="9130327887929620">"ವಿಜೆಟ್ ಅನ್ನು <xliff:g id="NUMBER_0">%1$s</xliff:g> ಅಗಲ <xliff:g id="NUMBER_1">%2$s</xliff:g> ಎತ್ತರಕ್ಕೆ ಮರುಗಾತ್ರಗೊಳಿಸಲಾಗಿದೆ"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"ಶಾರ್ಟ್‌ಕಟ್ ಮೆನು"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g> ಗಾಗಿ ವಿಜೆಟ್ ಮರುಗಾತ್ರಗೊಳಿಸುವಿಕೆ ಫ್ರೇಮ್"</string>
+ <string name="action_close" msgid="1077760267194136901">"ಮುಚ್ಚಿರಿ"</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>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"ಖಾಸಗಿ ಸ್ಪೇಸ್ ಪರಿವರ್ತನೆಯಾಗುತ್ತಿದೆ"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"ಇನ್‌ಸ್ಟಾಲ್"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"ಆ್ಯಪ್‌ಗಳನ್ನು ಪ್ರೈವೇಟ್ ಸ್ಪೇಸ್‌ನಲ್ಲಿ ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಿ"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"ಪ್ರೈವೆಟ್ ಸ್ಪೇಸ್‌ಗೆ ಫೈಲ್‌ಗಳು ಮತ್ತು ಹೆಚ್ಚಿನದನ್ನು ಸೇರಿಸಿ"</string>
</resources>
diff --git a/res/values-ko/strings.xml b/res/values-ko/strings.xml
index 1d60d882ee..ec54bd62ca 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"배경화면 및 스타일"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"홈 화면 수정"</string>
<string name="settings_button_text" msgid="8873672322605444408">"홈 설정"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"앱"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"관리자가 사용 중지함"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"홈 화면 회전 허용"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"휴대전화 회전 시"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"높이 줄이기"</string>
<string name="widget_resized" msgid="9130327887929620">"폭 <xliff:g id="NUMBER_0">%1$s</xliff:g>, 높이 <xliff:g id="NUMBER_1">%2$s</xliff:g>로 위젯 크기 조정됨"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"바로가기 메뉴"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g>의 위젯 크기 조절 프레임"</string>
+ <string name="action_close" msgid="1077760267194136901">"닫기"</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>
diff --git a/res/values-ky/strings.xml b/res/values-ky/strings.xml
index 638e107dc4..079328ff60 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Тушкагаз жана стиль"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Башкы экранды түзөтүү"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Башкы бет параметрлери"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Колдонмолор"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Администраторуңуз өчүрүп койгон"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Башкы экранды бурууга уруксат берүү"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Телефон бурулганда"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Жапыздатуу"</string>
<string name="widget_resized" msgid="9130327887929620">"Виджеттин кеңдиги <xliff:g id="NUMBER_0">%1$s</xliff:g> бийиктиги <xliff:g id="NUMBER_1">%2$s</xliff:g> болду"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Ыкчам баскычтын менюсу"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g> үчүн виджеттин өлчөмүн өзгөртүү"</string>
+ <string name="action_close" msgid="1077760267194136901">"Жабуу"</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>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Жеке чөйрөгө өтүү"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Орнотуу"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Колдонмолорду Жеке мейкиндикке орнотуe"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Жеке мейкиндикке файлдарды жана башкаларды кошуу"</string>
</resources>
diff --git a/res/values-lo/strings.xml b/res/values-lo/strings.xml
index d459fd9437..e3a85d6d5f 100644
--- a/res/values-lo/strings.xml
+++ b/res/values-lo/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"ຮູບພື້ນຫຼັງ ແລະ ຮູບແບບ"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"ແກ້ໄຂໂຮມສະກຣີນ"</string>
<string name="settings_button_text" msgid="8873672322605444408">"ການຕັ້ງຄ່າໜ້າຫຼັກ"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"ແອັບ"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"ຖືກປິດການນຳໃຊ້ໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"ອະນຸຍາດໃຫ້ໝຸນໜ້າຈໍຢູ່ໂຮມສະກຣີນໄດ້"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"ເມື່ອໝຸນໂທລະສັບ"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"ຫຼຸດ​ລວງ​ສູງ​ລົງ"</string>
<string name="widget_resized" msgid="9130327887929620">"ປ່ຽນ​ຂະ​ໜາດ​ວິດ​ເຈັດ​ເປັນ​ລວງ​ກ້​ວາງ <xliff:g id="NUMBER_0">%1$s</xliff:g> ລວງ​ສູງ <xliff:g id="NUMBER_1">%2$s</xliff:g> ແລ້ວ"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"ເມນູທາງລັດ"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"ປັບຂະໜາດກອບວິດເຈັດສຳລັບ <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"ປິດ"</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>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"ການປ່ຽນແປງພື້ນທີ່ສ່ວນຕົວ"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"ຕິດຕັ້ງ"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"ຕິດຕັ້ງແອັບໄປໃສ່ພື້ນທີ່ສ່ວນບຸກຄົນ"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"ເພີ່ມໄຟລ໌ ແລະ ອື່ນໆໃສ່ພື້ນທີ່ສ່ວນບຸກຄົນ"</string>
</resources>
diff --git a/res/values-lt/strings.xml b/res/values-lt/strings.xml
index 2421ddd4dc..d1cbf9a33e 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Ekrano fonas ir stilius"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Redaguoti pagrindinį ekraną"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Pagrindinio ekrano nustatymai"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Programos"</string>
<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>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Sumažinti aukštį"</string>
<string name="widget_resized" msgid="9130327887929620">"Valdiklio dydis pakeistas: plotis – <xliff:g id="NUMBER_0">%1$s</xliff:g>, aukštis – <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Sparčiųjų klavišų meniu"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"„<xliff:g id="STRING">%1$s</xliff:g>“ valdiklio dydžio keitimo rėmelis"</string>
+ <string name="action_close" msgid="1077760267194136901">"Uždaryti"</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>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
index aebd1f181b..ed01b0ed7f 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Тапет и стил"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Изменете го почетниот екран"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Поставки за почетен екран"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Апликации"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Оневозможено од администраторот"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Дозволи ротирање на почетниот екран"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Кога телефонот се ротира"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Намали висина"</string>
<string name="widget_resized" msgid="9130327887929620">"Големината на виџетот е променета на ширина <xliff:g id="NUMBER_0">%1$s</xliff:g> висина <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Мени за кратенки"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Рамка за промена на големината на виџетот за <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Затвори"</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>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Префрлање на „Приватен простор“"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Инсталирајте"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Инсталирање апликации во „Приватен простор“"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Додавање датотеки и друго во „Приватен простор“"</string>
</resources>
diff --git a/res/values-ml/strings.xml b/res/values-ml/strings.xml
index 68d484bd24..0c5f3cdcb0 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"വാൾപേപ്പറും സ്‌റ്റൈലും"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"ഹോം സ്‌ക്രീൻ എഡിറ്റ് ചെയ്യുക"</string>
<string name="settings_button_text" msgid="8873672322605444408">"ഹോം ക്രമീകരണം"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"ആപ്പുകൾ"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"അഡ്മിൻ പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"ഹോം സ്ക്രീൻ റൊട്ടേഷൻ അനുവദിക്കുക"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"ഫോൺ തിരിച്ച നിലയിലായിരിക്കുമ്പോൾ"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"ഉയരം കുറയ്‌ക്കുക"</string>
<string name="widget_resized" msgid="9130327887929620">"വീതി <xliff:g id="NUMBER_0">%1$s</xliff:g> ഉയരം <xliff:g id="NUMBER_1">%2$s</xliff:g>-ലേക്ക് വിഡ്‌ജെറ്റിന്റെ വലുപ്പം മാറ്റി"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"കുറുക്കുവഴി മെനു"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g> എന്നതിനുള്ള വിജറ്റിന്റെ വലുപ്പം മാറ്റുന്നതിനുള്ള ഫ്രെയിം"</string>
+ <string name="action_close" msgid="1077760267194136901">"അടയ്‌ക്കുക"</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>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"പ്രൈവറ്റ് സ്‌പേസ് ട്രാൻസിഷനിംഗ്"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"ഇൻസ്റ്റാൾ ചെയ്യുക"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"സ്വകാര്യ സ്പേസിലേക്ക് ആപ്പുകൾ ഇൻസ്റ്റാൾ ചെയ്യുക"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"സ്വകാര്യ സ്‌പേസിലേക്ക് ഫയലുകളും മറ്റും ചേർക്കുക"</string>
</resources>
diff --git a/res/values-mn/strings.xml b/res/values-mn/strings.xml
index 1eeea10a6a..631e310e2e 100644
--- a/res/values-mn/strings.xml
+++ b/res/values-mn/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Дэлгэцийн зураг, загвар"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Үндсэн нүүрийг засах"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Нүүр хуудасны тохиргоо"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Апп"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Таны админ идэвхгүй болгосон"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Үндсэн нүүрийг эргүүлэхийг зөвшөөрөх"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Утсыг эргүүлсэн үед"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Намсгах"</string>
<string name="widget_resized" msgid="9130327887929620">"Виджэтийн өргөн <xliff:g id="NUMBER_0">%1$s</xliff:g>, өндөр <xliff:g id="NUMBER_1">%2$s</xliff:g> болсон"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Товчлолын цэс"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g>-н виджетийн хэмжээг өөрчлөх фрейм"</string>
+ <string name="action_close" msgid="1077760267194136901">"Хаах"</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>
diff --git a/res/values-mr/strings.xml b/res/values-mr/strings.xml
index 5c19b74ef9..78b1cdec3a 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"वॉलपेपर आणि शैली"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"होम स्क्रीन संपादित करा"</string>
<string name="settings_button_text" msgid="8873672322605444408">"होम सेटिंग्‍ज"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"ॲप्स"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"आपल्या प्रशासकाने अक्षम केले"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"होम स्क्रीन फिरवण्‍याची अनुमती द्या"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"फोन फिरवला जातो तेव्हा"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"उंची कमी करा"</string>
<string name="widget_resized" msgid="9130327887929620">"विजेटचा आकार रुंदी <xliff:g id="NUMBER_0">%1$s</xliff:g> उंची <xliff:g id="NUMBER_1">%2$s</xliff:g> मध्ये बदलला"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"शॉर्टकट मेनू"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g> साठी विजेटचा आकार बदलण्याची फ्रेम"</string>
+ <string name="action_close" msgid="1077760267194136901">"बंद करा"</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>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"खाजगी स्पेस वर स्विच करणे"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"इंस्टॉल करा"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"अ‍ॅप्स खाजगी स्पेस मध्ये इंस्टॉल करा"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"खाजगी स्पेस मध्ये फाइल आणि आणखी बऱ्याच गोष्टी जोडा"</string>
</resources>
diff --git a/res/values-ms/strings.xml b/res/values-ms/strings.xml
index 4982d02829..afcee624c0 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Hiasan latar &amp; gaya"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Edit Skrin Utama"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Tetapan skrin utama"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Apl"</string>
<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>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Kurangkan ketinggian"</string>
<string name="widget_resized" msgid="9130327887929620">"Saiz widget diubah menjadi <xliff:g id="NUMBER_0">%1$s</xliff:g> lebar <xliff:g id="NUMBER_1">%2$s</xliff:g> tinggi"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Menu Pintasan"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Bingkai Ubah Saiz Widget untuk <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Tutup"</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>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Peralihan Ruang Peribadi"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Pasang"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Pasang apl pada Ruang Peribadi"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Tambahkan fail dan banyak lagi pada Ruang Persendirian"</string>
</resources>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index 9ef175863e..c467055871 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"နောက်ခံနှင့် ပုံစံ"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"ပင်မစာမျက်နှာ တည်းဖြတ်ရန်"</string>
<string name="settings_button_text" msgid="8873672322605444408">"ပင်မဆက်တင်များ"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"အက်ပ်များ"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"သင့်စီမံခန့်ခွဲသူက ပိတ်လိုက်ပါသည်"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"ပင်မစာမျက်နှာလှည့်ခြင်းကို ခွင့်ပြုခြင်း"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"ဖုန်းကိုလှည့်ထားစဉ်"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"အမြင့်အား လျှော့ပါ"</string>
<string name="widget_resized" msgid="9130327887929620">"Widget အား အကျယ် <xliff:g id="NUMBER_0">%1$s</xliff:g> အမြင့် <xliff:g id="NUMBER_1">%2$s</xliff:g> အရွယ်အစားပြန်လည်ချိန်ညှိပြီး၏"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"ဖြတ်လမ်းလင့်ခ် မီနူး"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g> အတွက် ဝိဂျက်အရွယ်ပြင်ဖရိမ်"</string>
+ <string name="action_close" msgid="1077760267194136901">"ပိတ်ရန်"</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>
diff --git a/res/values-nb/strings.xml b/res/values-nb/strings.xml
index 4fb36425c2..f4e10fc51d 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Bakgrunn og stil"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Endre startsiden"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Startsideinnstillinger"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Apper"</string>
<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>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Reduser høyden"</string>
<string name="widget_resized" msgid="9130327887929620">"Størrelsen på modulen er endret til bredde <xliff:g id="NUMBER_0">%1$s</xliff:g> og høyde <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Hurtigtastmeny"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Modul – endre størrelse på rammen for <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Lukk"</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>
diff --git a/res/values-ne/strings.xml b/res/values-ne/strings.xml
index 38167de0f1..00cbba0d6f 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"वालपेपर तथा शैली"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"होम स्क्रिन बदल्नुहोस्"</string>
<string name="settings_button_text" msgid="8873672322605444408">"होम पेजका सेटिङहरू"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"एपहरू"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"तपाईँको प्रशासकद्वारा असक्षम गरिएको"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"होम स्क्रिन रोटेट हुन दिइयोस्"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"फोन घुमाउँदा"</string>
@@ -186,18 +185,14 @@
<string name="action_decrease_height" msgid="282377193880900022">"उँचाइ घटाउनुहोस्"</string>
<string name="widget_resized" msgid="9130327887929620">"विजेट चौडाइ <xliff:g id="NUMBER_0">%1$s</xliff:g> उचाइ <xliff:g id="NUMBER_1">%2$s</xliff:g> मा पुनः आकार मिलाइयो"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"सर्टकटसम्बन्धी मेनु"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g> एपको विजेटको आकार बदल्ने फ्रेम"</string>
+ <string name="action_close" msgid="1077760267194136901">"बन्द गर्नुहोस्"</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>
<string name="all_apps_work_tab" msgid="4884822796154055118">"कामसम्बन्धी"</string>
- <!-- no translation found for all_apps_personal_tab_content_description (6286808898381807242) -->
- <skip />
- <!-- no translation found for all_apps_work_tab_content_description (3835637212347968316) -->
- <skip />
+ <string name="all_apps_personal_tab_content_description" msgid="6286808898381807242">"\"व्यक्तिगत एपहरू\" ट्याब"</string>
+ <string name="all_apps_work_tab_content_description" msgid="3835637212347968316">"\"कामसम्बन्धी एपहरू\" ट्याब"</string>
<string name="work_profile_toggle_label" msgid="3081029915775481146">"कार्य प्रोफाइल"</string>
<string name="work_profile_edu_work_apps" msgid="7895468576497746520">"कामसम्बन्धी एपहरूमा ब्याज अङ्कित हुन्छ र तपाईंका IT एड्मिन ती एप हेर्न सक्छन्"</string>
<string name="work_profile_edu_accept" msgid="6069788082535149071">"बुझेँ"</string>
diff --git a/res/values-nl/strings.xml b/res/values-nl/strings.xml
index 2b99b690ab..5fa50c6715 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Achtergrond en stijl"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Startscherm bewerken"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Instellingen Start"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Apps"</string>
<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>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Hoogte verkleinen"</string>
<string name="widget_resized" msgid="9130327887929620">"Formaat van widget gewijzigd in breedte <xliff:g id="NUMBER_0">%1$s</xliff:g> en hoogte <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Snelmenu"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Frame voor widgetformaat aanpassen voor <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Sluiten"</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>
diff --git a/res/values-or/strings.xml b/res/values-or/strings.xml
index 2b924de1fc..d2b1906528 100644
--- a/res/values-or/strings.xml
+++ b/res/values-or/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"ୱାଲପେପର ଏବଂ ଷ୍ଟାଇଲ"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"ହୋମ ସ୍କ୍ରିନକୁ ଏଡିଟ କରନ୍ତୁ"</string>
<string name="settings_button_text" msgid="8873672322605444408">"ହୋମ ସେଟିଂସ"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"ଆପ୍ସ"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"ଆପଣଙ୍କ ଆଡମିନଙ୍କ ଦ୍ୱାରା ଅକ୍ଷମ କରାଯାଇଛି"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"ହୋମ ସ୍କ୍ରିନ ରୋଟେସନକୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"ଯେତେବେଳେ ଫୋନକୁ ରୋଟେଟ କରାଯାଇଥାଏ"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"ଉଚ୍ଚତା କମ୍‌ କରନ୍ତୁ"</string>
<string name="widget_resized" msgid="9130327887929620">"ୱିଜେଟକୁ <xliff:g id="NUMBER_0">%1$s</xliff:g> ଓସାର ଓ <xliff:g id="NUMBER_1">%2$s</xliff:g> ଉଚ୍ଚରେ ପୁନଃଆକାର ଦିଆଗଲା"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"ସର୍ଟକଟ ମେନୁ"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g> ପାଇଁ ୱିଜେଟ ରିସାଇଜ ଫ୍ରେମ"</string>
+ <string name="action_close" msgid="1077760267194136901">"ବନ୍ଦ କରନ୍ତୁ"</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>
diff --git a/res/values-pa/strings.xml b/res/values-pa/strings.xml
index 934266da71..04244698a9 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"ਵਾਲਪੇਪਰ ਅਤੇ ਸਟਾਈਲ"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"ਹੋਮ ਸਕ੍ਰੀਨ ਦਾ ਸੰਪਾਦਨ ਕਰੋ"</string>
<string name="settings_button_text" msgid="8873672322605444408">"ਹੋਮ ਸੈਟਿੰਗਾਂ"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"ਐਪਾਂ"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਦੁਆਰਾ ਅਯੋਗ ਬਣਾਈ ਗਈ"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"ਹੋਮ ਸਕ੍ਰੀਨ ਨੂੰ ਘੁਮਾਉਣ ਦੀ ਆਗਿਆ ਦਿਓ"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"ਜਦੋਂ ਫ਼ੋਨ ਘੁਮਾਇਆ ਜਾਂਦਾ ਹੈ"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"ਉਂਚਾਈ ਘਟਾਓ"</string>
<string name="widget_resized" msgid="9130327887929620">"ਵਿਜੈਟ ਨੂੰ ਚੌੜਾਈ <xliff:g id="NUMBER_0">%1$s</xliff:g> ਉਂਚਾਈ <xliff:g id="NUMBER_1">%2$s</xliff:g> ਨੂੰ ਮੁੜ ਆਕਾਰ ਦਿੱਤਾ"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"ਸ਼ਾਰਟਕੱਟ ਮੀਨੂ"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g> ਲਈ, ਵਿਜੇਟ ਦਾ ਆਕਾਰ ਬਦਲਣ ਵਾਲਾ ਫ੍ਰੇਮ"</string>
+ <string name="action_close" msgid="1077760267194136901">"ਬੰਦ ਕਰੋ"</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>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"ਪ੍ਰਾਈਵੇਟ ਸਪੇਸ ਨੂੰ ਤਬਦੀਲ ਕਰਨਾ"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"ਸਥਾਪਤ ਕਰੋ"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"ਪ੍ਰਾਈਵੇਟ ਸਪੇਸ ਵਿੱਚ ਐਪਾਂ ਸਥਾਪਤ ਕਰੋ"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"ਪ੍ਰਾਈਵੇਟ ਸਪੇਸ ਵਿੱਚ ਫ਼ਾਈਲਾਂ ਅਤੇ ਹੋਰ ਚੀਜ਼ਾਂ ਨੂੰ ਸ਼ਾਮਲ ਕਰੋ"</string>
</resources>
diff --git a/res/values-pl/strings.xml b/res/values-pl/strings.xml
index 36fa4e8905..327c5ea3af 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Tapeta i styl"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Edytuj ekran główny"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Ustawienia ekranu głównego"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Aplikacje"</string>
<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>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Zmniejsz wysokość"</string>
<string name="widget_resized" msgid="9130327887929620">"Szerokość i wysokość widżetu zmieniła się na <xliff:g id="NUMBER_0">%1$s</xliff:g> x <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Menu skrótów"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Ramka zmiany rozmiaru widżetu dla: <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Zamknij"</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>
diff --git a/res/values-pt-rPT/strings.xml b/res/values-pt-rPT/strings.xml
index 50252d5eee..54fcb9a6db 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Imagem fundo/estilo"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Editar ecrã principal"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Definições de início"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Apps"</string>
<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>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Diminuir altura"</string>
<string name="widget_resized" msgid="9130327887929620">"Widget redimensionado para a largura <xliff:g id="NUMBER_0">%1$s</xliff:g>, altura <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Menu de atalho"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Frame de redimensionamento do widget para <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Fechar"</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>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Transição do espaço privado"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Instalar"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Instale apps no espaço privado"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Adicione ficheiros e muito mais ao espaço privado"</string>
</resources>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 458f46e328..9a61bb4d94 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Imagine de fundal și stil"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Editează ecranul de pornire"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Setări ecran de pornire"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Aplicații"</string>
<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>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Redu înălțimea"</string>
<string name="widget_resized" msgid="9130327887929620">"Widgetul a fost redimensionat la lățimea <xliff:g id="NUMBER_0">%1$s</xliff:g> și înălțimea <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Meniu de comenzi rapide"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Cadru de redimensionare a widgetului pentru <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Închide"</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>
diff --git a/res/values-ru/strings.xml b/res/values-ru/strings.xml
index 52995969bb..5cae2fd3b1 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Обои и стиль"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Изменить главный экран"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Главный экран"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Приложения"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Функция отключена администратором"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Разрешить поворачивать главный экран"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"При повороте телефона"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Уменьшить высоту"</string>
<string name="widget_resized" msgid="9130327887929620">"Изменен размер виджета: до <xliff:g id="NUMBER_0">%1$s</xliff:g> в ширину и <xliff:g id="NUMBER_1">%2$s</xliff:g> в высоту"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Быстрое меню"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Рамка изменения размеров виджета \"<xliff:g id="STRING">%1$s</xliff:g>\""</string>
+ <string name="action_close" msgid="1077760267194136901">"Закрыть"</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>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Переход к личному пространству"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Установить"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Установить приложения в личном пространстве"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Добавляйте в частное пространство файлы и многое другое"</string>
</resources>
diff --git a/res/values-si/strings.xml b/res/values-si/strings.xml
index 766dafd336..ea02797bc0 100644
--- a/res/values-si/strings.xml
+++ b/res/values-si/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"වෝල්පේපරය සහ මෝස්තරය"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"මුල් තිරය සංස්කරණය කරන්න"</string>
<string name="settings_button_text" msgid="8873672322605444408">"නිවසේ සැකසීම්"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"යෙදුම්"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"ඔබගේ පරිපාලක විසින් අබල කරන ලදී"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"මුල් තිරය කරකැවීමට ඉඩ දෙන්න"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"දුරකථනය කරකවන විට"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"උස අඩු කරන්න"</string>
<string name="widget_resized" msgid="9130327887929620">"විජට් පළල <xliff:g id="NUMBER_0">%1$s</xliff:g> උස <xliff:g id="NUMBER_1">%2$s</xliff:g> වෙත ප්‍රමාණකරණය කරන ලදි"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"කෙටිමං මෙනුව"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g> සඳහා විජට් ප්‍රමාණය වෙනස් කිරීමේ රාමුව"</string>
+ <string name="action_close" msgid="1077760267194136901">"වසන්න"</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>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"පෞද්ගලික අවකාශ සංක්‍රමණය"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"ස්ථාපන කරන්න"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"පෞද්ගලික අවකාශයට යෙදුම් ස්ථාපනය කරන්න"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"රහසිගත අවකාශයට ගොනු සහ තවත් දේ එක් කරන්න"</string>
</resources>
diff --git a/res/values-sk/strings.xml b/res/values-sk/strings.xml
index 465ed09fd1..504ca56dff 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Tapeta a štýl"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Upraviť plochu"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Nastavenia plochy"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Aplikácie"</string>
<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>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Znížiť výšku"</string>
<string name="widget_resized" msgid="9130327887929620">"Veľkosť miniaplikácie bola zmenená na <xliff:g id="NUMBER_0">%1$s</xliff:g> x <xliff:g id="NUMBER_1">%2$s</xliff:g> (šírka x výška)"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Ponuka skratiek"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Rám na zmenu veľkosti miniaplikácie pre <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Zavrieť"</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>
diff --git a/res/values-sl/strings.xml b/res/values-sl/strings.xml
index a32a0a971c..4235d03254 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Zaslonsko ozadje in slog"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Urejanje začetnega zaslona"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Začetni zaslon"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Aplikacije"</string>
<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>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Zmanjšanje višine"</string>
<string name="widget_resized" msgid="9130327887929620">"Velikost pripomočka je bila spremenjena na <xliff:g id="NUMBER_0">%1$s</xliff:g> širine in <xliff:g id="NUMBER_1">%2$s</xliff:g> višine"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Meni z bližnjicami"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Okvir za spreminjanje velikosti pripomočka za aplikacijo <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Zapri"</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>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Preklapljanje zasebnega prostora"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Namestitev"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Nameščanje aplikacij v zasebni prostor"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Dodajte datoteke in drugo v zasebni prostor"</string>
</resources>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index d1b955c612..2906849bf4 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Imazhi i sfondit dhe stili"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Modifiko ekranin bazë"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Cilësimet e ekranit bazë"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Aplikacionet"</string>
<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>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Zvogëlo lartësinë"</string>
<string name="widget_resized" msgid="9130327887929620">"Madhësia e miniaplikacionit u ndryshua me gjerësinë <xliff:g id="NUMBER_0">%1$s</xliff:g> dhe lartësinë <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Menyja e shkurtoreve"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Kuadri i ndryshimit të përmasave të miniaplikacionit për <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Mbyll"</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>
diff --git a/res/values-sr/strings.xml b/res/values-sr/strings.xml
index ca04201c26..b661b99187 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Позадина и стил"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Измени почетни екран"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Подешавања почетног екрана"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Апликације"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Администратор је онемогућио"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Дозволи ротацију почетног екрана"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Када се телефон ротира"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Смањи висину"</string>
<string name="widget_resized" msgid="9130327887929620">"Величина виџета је промењена на ширину <xliff:g id="NUMBER_0">%1$s</xliff:g> и висину <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Мени са пречицама"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Промена величине оквира виџета за: <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Затворите"</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>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Пренос приватног простора"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Инсталирајте"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Инсталирај апликације у приватан простор"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Додајте фајлове и друго у приватан простор"</string>
</resources>
diff --git a/res/values-sv/strings.xml b/res/values-sv/strings.xml
index dd91e4bc56..898873a4f9 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Bakgrund och utseende"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Redigera startskärm"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Startinställningar"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Appar"</string>
<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>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Minska höjden"</string>
<string name="widget_resized" msgid="9130327887929620">"Widgetens storlek har ändrats till: bredd <xliff:g id="NUMBER_0">%1$s</xliff:g>, höjd <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Snabbmeny"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Widget för att ändra ramstorlek för <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Stäng"</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>
diff --git a/res/values-sw/strings.xml b/res/values-sw/strings.xml
index bd6e135015..c6ee27b9fc 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Mandhari na mtindo"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Badilisha Skrini ya Kwanza"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Mipangilio ya mwanzo"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Programu"</string>
<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>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Punguza urefu"</string>
<string name="widget_resized" msgid="9130327887929620">"Wijeti imepunguzwa hadi upana <xliff:g id="NUMBER_0">%1$s</xliff:g> urefu <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Menyu ya Njia za Mkato"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Fremu ya Kubadilisha Ukubwa wa Wijeti ya <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Funga"</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>
diff --git a/res/values-sw600dp/styles.xml b/res/values-sw600dp/styles.xml
index 63bd46b2c3..db49a3e518 100644
--- a/res/values-sw600dp/styles.xml
+++ b/res/values-sw600dp/styles.xml
@@ -14,8 +14,11 @@
~ limitations under the License.
-->
-<resources>
+<resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="CellStyleDefault">
<item name="iconDrawablePadding">7dp</item>
</style>
+ <style name="DropTargetButton" parent="DropTargetButtonBase">
+ <item name="android:fontFamily" android:featureFlag="com.android.launcher3.gsf_res">variable-title-large</item>
+ </style>
</resources> \ No newline at end of file
diff --git a/res/values-ta/strings.xml b/res/values-ta/strings.xml
index 743df88adc..73782da00d 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"வால்பேப்பர் &amp; ஸ்டைல்"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"முகப்புத் திரையில் மாற்று"</string>
<string name="settings_button_text" msgid="8873672322605444408">"முகப்பு அமைப்புகள்"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"ஆப்ஸ்"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"உங்கள் நிர்வாகி முடக்கியுள்ளார்"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"முகப்புத் திரை சுழற்சியை அனுமதித்தல்"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"மொபைலைச் சுழற்றும் போது"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"உயரத்தைக் குறை"</string>
<string name="widget_resized" msgid="9130327887929620">"அகலம் <xliff:g id="NUMBER_0">%1$s</xliff:g> மற்றும் உயரம் <xliff:g id="NUMBER_1">%2$s</xliff:g>க்கு விட்ஜெட் அளவு மாற்றப்பட்டது"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"ஷார்ட்கட் மெனு"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g>க்கான விட்ஜெட்டின் அளவை மாற்றும் சட்டம்"</string>
+ <string name="action_close" msgid="1077760267194136901">"மூடும்"</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>
diff --git a/res/values-te/strings.xml b/res/values-te/strings.xml
index 4df936cfe4..6f9ba1e7e0 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"వాల్‌పేపర్ &amp; స్టయిల్"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"మొదటి స్క్రీన్‌ను ఎడిట్ చేయండి"</string>
<string name="settings_button_text" msgid="8873672322605444408">"మొదటి స్క్రీన్ సెట్టింగ్‌లు"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"యాప్‌లు"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"మీ నిర్వాహకులు నిలిపివేసారు"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"మొదటి స్క్రీన్ రొటేషన్‌ను అనుమతించండి"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"ఫోన్‌‌ను తిప్పినప్పుడు"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"ఎత్తును తగ్గించు"</string>
<string name="widget_resized" msgid="9130327887929620">"విడ్జెట్ సైజ్‌ వెడల్పు <xliff:g id="NUMBER_0">%1$s</xliff:g>కి, ఎత్తు <xliff:g id="NUMBER_1">%2$s</xliff:g>కి మార్చబడింది"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"షార్ట్‌కట్ మెనూ"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g> విడ్జెట్ సైజ్‌ను మార్చే ఫ్రేమ్"</string>
+ <string name="action_close" msgid="1077760267194136901">"మూసివేయండి"</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>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"ప్రైవేట్ స్పేస్ కేటాయించడం జరుగుతుంది"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"ఇన్‌స్టాల్ చేయండి"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"ప్రైవేట్ స్పేస్‌కు యాప్‌లను ఇన్‌స్టాల్ చేయండి"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"ప్రైవేట్ స్పేస్‌కు ఫైళ్లను, మరిన్నింటిని జోడించండి"</string>
</resources>
diff --git a/res/values-th/strings.xml b/res/values-th/strings.xml
index 9107582d92..af96acd1f0 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"วอลเปเปอร์และสไตล์"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"แก้ไขหน้าจอหลัก"</string>
<string name="settings_button_text" msgid="8873672322605444408">"การตั้งค่าหน้าจอหลัก"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"แอป"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"ปิดใช้โดยผู้ดูแลระบบ"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"อนุญาตให้หมุนหน้าจอหลัก"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"เมื่อหมุนโทรศัพท์"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"ลดความสูง"</string>
<string name="widget_resized" msgid="9130327887929620">"ปรับขนาดของวิดเจ็ตเป็นกว้าง <xliff:g id="NUMBER_0">%1$s</xliff:g> สูง <xliff:g id="NUMBER_1">%2$s</xliff:g> แล้ว"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"เมนูแป้นพิมพ์ลัด"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"เฟรมปรับขนาดวิดเจ็ตสำหรับ <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"ปิด"</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>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"การเปลี่ยนไปใช้พื้นที่ส่วนตัว"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"ติดตั้ง"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"ติดตั้งแอปไปยังพื้นที่ส่วนตัว"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"เพิ่มไฟล์และอื่นๆ ไปยังพื้นที่ส่วนตัว"</string>
</resources>
diff --git a/res/values-tl/strings.xml b/res/values-tl/strings.xml
index 59661c0ecc..8125328935 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Wallpaper &amp; istilo"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"I-edit ang Home Screen"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Mga setting ng Home"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Mga App"</string>
<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>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Bawasan ang taas"</string>
<string name="widget_resized" msgid="9130327887929620">"Na-resize ang widget sa lapad <xliff:g id="NUMBER_0">%1$s</xliff:g> taas <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Menu ng Shortcut"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Frame sa Pag-resize ng Widget para sa <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Isara"</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>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Pag-transition ng Pribadong Space"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"I-install"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Mag-install ng mga app sa Pribadong Space"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Magdagdag ng mga file at higit pa sa Pribadong Space"</string>
</resources>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index c834f6c472..c5504fe67e 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Duvar kağıdı ve stil"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Ana ekranı düzenleyin"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Ana ekran ayarları"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Uygulamalar"</string>
<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>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Yüksekliği azalt"</string>
<string name="widget_resized" msgid="9130327887929620">"Widget, <xliff:g id="NUMBER_0">%1$s</xliff:g> genişlik ve <xliff:g id="NUMBER_1">%2$s</xliff:g> yükseklik değerine yeniden boyutlandırıldı"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Kısayol Menüsü"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g> Widget\'ını Yeniden Boyutlandırma Çerçevesi"</string>
+ <string name="action_close" msgid="1077760267194136901">"Kapat"</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>
diff --git a/res/values-ur/strings.xml b/res/values-ur/strings.xml
index efe5297bda..36000c0c90 100644
--- a/res/values-ur/strings.xml
+++ b/res/values-ur/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"وال پیپر اور طرز"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"ہوم اسکرین میں ترمیم کریں"</string>
<string name="settings_button_text" msgid="8873672322605444408">"ہوم ترتیبات"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"ایپس"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"آپ کے منتظم کی طرف سے غیر فعال کر دیا گیا"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"ہوم اسکرین گھمانے کی اجازت دیں"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"جب فون گھمایا جاتا ہے"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"اونچائی کم کریں"</string>
<string name="widget_resized" msgid="9130327887929620">"ویجیٹ کے سائز کو چوڑائی <xliff:g id="NUMBER_0">%1$s</xliff:g> اونچائی <xliff:g id="NUMBER_1">%2$s</xliff:g> میں تبدیل کر دیا گیا"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"شارٹ کٹ مینیو"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"‫<xliff:g id="STRING">%1$s</xliff:g> کے لیے ویجیٹ کا سائز تبدیل کرنے کا فریم"</string>
+ <string name="action_close" msgid="1077760267194136901">"بند کریں"</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>
diff --git a/res/values-uz/strings.xml b/res/values-uz/strings.xml
index 8d65f8c5c6..72201f51f9 100644
--- a/res/values-uz/strings.xml
+++ b/res/values-uz/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Fon rasmi va uslubi"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Bosh ekranni tahrirlash"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Bosh ekran sozlamalari"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Ilovalar"</string>
<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>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Bo‘yini kichraytirish"</string>
<string name="widget_resized" msgid="9130327887929620">"Vidjetning eni <xliff:g id="NUMBER_0">%1$s</xliff:g>, bo‘yi <xliff:g id="NUMBER_1">%2$s</xliff:g> qilib o‘zgartirildi"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Tezkor tugma menyusi"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g> vidjeti oʻlchamini oʻzgartirish freymi"</string>
+ <string name="action_close" msgid="1077760267194136901">"Yopish"</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>
@@ -220,6 +217,5 @@
<string name="ps_container_transition" msgid="8667331812048014412">"Maxfiy joyga almashtirish"</string>
<string name="ps_add_button_label" msgid="8127988716897128773">"Oʻrnatish"</string>
<string name="ps_add_button_content_description" msgid="3254274107740952556">"Ilovalarni Maxfiy makonga oʻrnatish"</string>
- <!-- no translation found for ps_app_content_description (1129133475892816226) -->
- <skip />
+ <string name="ps_app_content_description" msgid="1129133475892816226">"Maxfiy makonga fayllar va boshqalarni qoʻshish"</string>
</resources>
diff --git a/res/values-v31/styles.xml b/res/values-v31/styles.xml
index 932ce38e59..6ed7dd67bd 100644
--- a/res/values-v31/styles.xml
+++ b/res/values-v31/styles.xml
@@ -17,7 +17,7 @@
*/
-->
-<resources>
+<resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="HomeSettings.Theme" parent="@android:style/Theme.DeviceDefault.Settings">
<item name="android:listPreferredItemPaddingEnd">16dp</item>
@@ -29,6 +29,7 @@
<item name="android:windowActionBar">false</item>
<item name="android:windowNoTitle">true</item>
<item name="preferenceTheme">@style/HomeSettings.PreferenceTheme</item>
+ <item name="android:fontFamily" android:featureFlag="com.android.launcher3.gsf_res">google-sans-flex</item>
</style>
<style name="HomeSettings.PreferenceTheme" parent="@style/PreferenceThemeOverlay">
@@ -80,11 +81,13 @@
<style name="HomeSettings.CollapsedToolbarTitle"
parent="@android:style/TextAppearance.DeviceDefault.Widget.ActionBar.Title">
- <item name="android:fontFamily">google-sans</item>
+ <item name="android:fontFamily" android:featureFlag="!com.android.launcher3.gsf_res">google-sans</item>
+ <item name="android:fontFamily" android:featureFlag="com.android.launcher3.gsf_res">variable-title-large</item>
<item name="android:textSize">20sp</item>
</style>
<style name="HomeSettings.ExpandedToolbarTitle" parent="HomeSettings.CollapsedToolbarTitle">
+ <item name="android:fontFamily" android:featureFlag="com.android.launcher3.gsf_res">variable-display-small</item>
<item name="android:textSize">36sp</item>
</style>
</resources> \ No newline at end of file
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index 78cf3e3b13..a3ecb4e874 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Hình nền và phong cách"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Chỉnh sửa Màn hình chính"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Cài đặt màn hình chính"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Ứng dụng"</string>
<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>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Giảm chiều cao"</string>
<string name="widget_resized" msgid="9130327887929620">"Đã đổi kích thước tiện ích thành chiều rộng <xliff:g id="NUMBER_0">%1$s</xliff:g> chiều cao <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Trình đơn lối tắt"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Khung đổi kích thước tiện ích của <xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Đóng"</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>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 6e69045988..0b610dc968 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"壁纸与风格"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"修改主屏幕"</string>
<string name="settings_button_text" msgid="8873672322605444408">"主屏幕设置"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"应用"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"已被您的管理员停用"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"允许旋转主屏幕"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"手机旋转时"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"减小高度"</string>
<string name="widget_resized" msgid="9130327887929620">"微件尺寸已调整为:宽度 <xliff:g id="NUMBER_0">%1$s</xliff:g>,高度 <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"快捷键菜单"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"<xliff:g id="STRING">%1$s</xliff:g>的微件调整大小框架"</string>
+ <string name="action_close" msgid="1077760267194136901">"关闭"</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>
diff --git a/res/values-zh-rHK/strings.xml b/res/values-zh-rHK/strings.xml
index 2e0e929678..6262df5d99 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"桌布和樣式"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"編輯主畫面"</string>
<string name="settings_button_text" msgid="8873672322605444408">"主畫面設定"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"應用程式"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"已由你的管理員停用"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"允許旋轉主畫面"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"隨手機旋轉"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"減少高度"</string>
<string name="widget_resized" msgid="9130327887929620">"已調整小工具的大小至闊 <xliff:g id="NUMBER_0">%1$s</xliff:g> 高 <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"快速鍵選單"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"「<xliff:g id="STRING">%1$s</xliff:g>」嘅小工具調整大小框架"</string>
+ <string name="action_close" msgid="1077760267194136901">"閂"</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>
diff --git a/res/values-zh-rTW/strings.xml b/res/values-zh-rTW/strings.xml
index 2b4a8b3070..9bb1056a2b 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"桌布和樣式"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"編輯主畫面"</string>
<string name="settings_button_text" msgid="8873672322605444408">"主畫面設定"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"應用程式"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"已由你的管理員停用"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"允許旋轉主畫面"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"當手機旋轉時"</string>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"減少高度"</string>
<string name="widget_resized" msgid="9130327887929620">"已將小工具的寬度和高度分別調整為 <xliff:g id="NUMBER_0">%1$s</xliff:g> 和 <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"快速鍵選單"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"「<xliff:g id="STRING">%1$s</xliff:g>」的小工具調整大小框架"</string>
+ <string name="action_close" msgid="1077760267194136901">"關閉"</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>
diff --git a/res/values-zu/strings.xml b/res/values-zu/strings.xml
index dc40b80dfa..82fafc69a0 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -131,8 +131,7 @@
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Isithombe sangemuva nesitayela"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Hlela Isikrini Sasekhaya"</string>
<string name="settings_button_text" msgid="8873672322605444408">"Amasethingi asekhaya"</string>
- <!-- no translation found for all_apps_home_screen (8658178652647896497) -->
- <skip />
+ <string name="all_apps_home_screen" msgid="8658178652647896497">"Ama-app"</string>
<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>
@@ -186,10 +185,8 @@
<string name="action_decrease_height" msgid="282377193880900022">"Nciphisa ubude"</string>
<string name="widget_resized" msgid="9130327887929620">"Iwijethi inikezwe usayizi omusha ngobubanzi obungu-<xliff:g id="NUMBER_0">%1$s</xliff:g> ubude obungu-<xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
<string name="action_deep_shortcut" msgid="4766835855579976045">"Imenyu Yezinqamuleli"</string>
- <!-- no translation found for widget_frame_name (8782828448471444270) -->
- <skip />
- <!-- no translation found for action_close (1077760267194136901) -->
- <skip />
+ <string name="widget_frame_name" msgid="8782828448471444270">"Uhlaka Lokushintsha Usayizi Wewijethi we-<xliff:g id="STRING">%1$s</xliff:g>"</string>
+ <string name="action_close" msgid="1077760267194136901">"Vala"</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>
diff --git a/res/values/config.xml b/res/values/config.xml
index 3b48c9eddd..fc636a5055 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -68,7 +68,6 @@
<string name="app_launch_tracker_class" translatable="false"></string>
<string name="test_information_handler_class" translatable="false"></string>
<string name="secondary_display_predictions_class" translatable="false"></string>
- <string name="widget_holder_factory_class" translatable="false"></string>
<string name="taskbar_search_session_controller_class" translatable="false"></string>
<string name="taskbar_model_callbacks_factory_class" translatable="false"></string>
<string name="taskbar_view_callbacks_factory_class" translatable="false"></string>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index a15c130076..4d0379d462 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -315,7 +315,7 @@
<dimen name="page_indicator_gap_width">4dp</dimen>
<dimen name="page_indicator_size">10dp</dimen>
-
+ <dimen name="folder_title_min_width">100dp</dimen>
<dimen name="folder_cell_x_padding">9dp</dimen>
<dimen name="folder_cell_y_padding">6dp</dimen>
<!-- label text size = workspace text size multiplied by this scale -->
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 39206d3428..cf6c56097a 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -373,7 +373,9 @@
<item name="android:background">@drawable/drop_target_background</item>
</style>
- <style name="DropTargetButton" parent="DropTargetButtonBase" />
+ <style name="DropTargetButton" parent="DropTargetButtonBase">
+ <item name="android:fontFamily" android:featureFlag="com.android.launcher3.gsf_res">variable-title-medium</item>
+ </style>
<style name="TextHeadline" parent="@android:style/TextAppearance.DeviceDefault.DialogWindowTitle" />
diff --git a/src/com/android/launcher3/GridType.kt b/src/com/android/launcher3/GridType.kt
new file mode 100644
index 0000000000..d006b8f35f
--- /dev/null
+++ b/src/com/android/launcher3/GridType.kt
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.launcher3
+
+import androidx.annotation.IntDef
+
+/** The type of grid. */
+@IntDef(GridType.GRID_TYPE_ONE_GRID, GridType.GRID_TYPE_NON_ONE_GRID, GridType.GRID_TYPE_ANY)
+@Retention(AnnotationRetention.SOURCE)
+annotation class GridType {
+ companion object {
+ /** These are grids that use one grid spec. */
+ const val GRID_TYPE_ONE_GRID = 1
+ /** These are grids that don't use one grid spec. */
+ const val GRID_TYPE_NON_ONE_GRID = 2
+ /** Any grid type. */
+ const val GRID_TYPE_ANY = GRID_TYPE_NON_ONE_GRID or GRID_TYPE_ONE_GRID
+ }
+}
diff --git a/src/com/android/launcher3/InvariantDeviceProfile.java b/src/com/android/launcher3/InvariantDeviceProfile.java
index f189549463..15a4fc4072 100644
--- a/src/com/android/launcher3/InvariantDeviceProfile.java
+++ b/src/com/android/launcher3/InvariantDeviceProfile.java
@@ -16,6 +16,9 @@
package com.android.launcher3;
+import static com.android.launcher3.GridType.GRID_TYPE_ANY;
+import static com.android.launcher3.GridType.GRID_TYPE_NON_ONE_GRID;
+import static com.android.launcher3.GridType.GRID_TYPE_ONE_GRID;
import static com.android.launcher3.LauncherPrefs.DB_FILE;
import static com.android.launcher3.LauncherPrefs.ENABLE_TWOLINE_ALLAPPS_TOGGLE;
import static com.android.launcher3.LauncherPrefs.FIXED_LANDSCAPE_MODE;
@@ -241,6 +244,8 @@ public class InvariantDeviceProfile {
*/
public boolean isFixedLandscape = false;
+ @GridType
+ public int gridType;
public String dbFile;
public int defaultLayoutId;
public int demoModeLayoutId;
@@ -369,6 +374,7 @@ public class InvariantDeviceProfile {
numColumns = closestProfile.numColumns;
numSearchContainerColumns = closestProfile.numSearchContainerColumns;
dbFile = closestProfile.dbFile;
+ gridType = closestProfile.gridType;
defaultLayoutId = closestProfile.defaultLayoutId;
demoModeLayoutId = closestProfile.demoModeLayoutId;
@@ -936,10 +942,7 @@ public class InvariantDeviceProfile {
private static final int DEVICE_CATEGORY_PHONE = 1 << 0;
private static final int DEVICE_CATEGORY_TABLET = 1 << 1;
private static final int DEVICE_CATEGORY_MULTI_DISPLAY = 1 << 2;
- private static final int GRID_TYPE_ONE_GRID = 1 << 0;
- private static final int GRID_TYPE_NON_ONE_GRID = 1 << 1;
- private static final int GRID_TYPE_ALL = 1 << 2;
- private static final int DEVICE_CATEGORY_ALL =
+ private static final int DEVICE_CATEGORY_ANY =
DEVICE_CATEGORY_PHONE | DEVICE_CATEGORY_TABLET | DEVICE_CATEGORY_MULTI_DISPLAY;
private static final int INLINE_QSB_FOR_PORTRAIT = 1 << 0;
@@ -955,6 +958,7 @@ public class InvariantDeviceProfile {
public final int numColumns;
public final int numSearchContainerColumns;
public final int deviceCategory;
+ @GridType
public final int gridType;
private final int[] numFolderRows = new int[COUNT_SIZES];
@@ -1003,7 +1007,7 @@ public class InvariantDeviceProfile {
gridIconId = a.getResourceId(
R.styleable.GridDisplayOption_gridIconId, INVALID_RESOURCE_HANDLE);
deviceCategory = a.getInt(R.styleable.GridDisplayOption_deviceCategory,
- DEVICE_CATEGORY_ALL);
+ DEVICE_CATEGORY_ANY);
mGridSizeSpecsId = a.getResourceId(
R.styleable.GridDisplayOption_gridSizeSpecsId, INVALID_RESOURCE_HANDLE);
mIsDualGrid = a.getBoolean(R.styleable.GridDisplayOption_isDualGrid, false);
@@ -1141,7 +1145,7 @@ public class InvariantDeviceProfile {
}
mIsFixedLandscape = a.getBoolean(R.styleable.GridDisplayOption_isFixedLandscape, false);
- gridType = a.getInt(R.styleable.GridDisplayOption_gridType, GRID_TYPE_ALL);
+ gridType = a.getInt(R.styleable.GridDisplayOption_gridType, GRID_TYPE_ANY);
int inlineForRotation = a.getInt(R.styleable.GridDisplayOption_inlineQsb,
DONT_INLINE_QSB);
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index 5c9392d69d..d5b3ed5645 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -532,11 +532,14 @@ public class Launcher extends StatefulActivity<LauncherState>
mAllAppsController = new AllAppsTransitionController(this);
mStateManager = new StateManager<>(this, NORMAL);
+ mAppWidgetManager = new WidgetManagerHelper(this);
+ mAppWidgetHolder = LauncherWidgetHolder.newInstance(this);
+ mAppWidgetHolder.setAppWidgetRemovedCallback(
+ appWidgetId -> getWorkspace().removeWidget(appWidgetId));
+
setupViews();
updateDisallowBack();
- mAppWidgetManager = new WidgetManagerHelper(this);
- mAppWidgetHolder = createAppWidgetHolder();
mAppWidgetHolder.startListening();
mAppWidgetHolder.addProviderChangeListener(() -> refreshAndBindWidgetsForPackageUser(null));
mItemInflater = new ItemInflater<>(this, mAppWidgetHolder, getItemOnClickListener(),
@@ -1614,11 +1617,6 @@ public class Launcher extends StatefulActivity<LauncherState>
return instance;
}
- protected LauncherWidgetHolder createAppWidgetHolder() {
- return LauncherWidgetHolder.HolderFactory.newFactory(this).newInstance(
- this, appWidgetId -> getWorkspace().removeWidget(appWidgetId));
- }
-
@Override
protected void onNewIntent(Intent intent) {
if (Utilities.isRunningInTestHarness()) {
diff --git a/src/com/android/launcher3/LauncherPrefs.kt b/src/com/android/launcher3/LauncherPrefs.kt
index 7a04b0f950..30c4529613 100644
--- a/src/com/android/launcher3/LauncherPrefs.kt
+++ b/src/com/android/launcher3/LauncherPrefs.kt
@@ -20,6 +20,7 @@ import android.content.Context.MODE_PRIVATE
import android.content.SharedPreferences
import androidx.annotation.VisibleForTesting
import com.android.launcher3.BuildConfig.WIDGET_ON_FIRST_SCREEN
+import com.android.launcher3.GridType.Companion.GRID_TYPE_ANY
import com.android.launcher3.InvariantDeviceProfile.GRID_NAME_PREFS_KEY
import com.android.launcher3.InvariantDeviceProfile.NON_FIXED_LANDSCAPE_GRID_NAME_PREFS_KEY
import com.android.launcher3.LauncherFiles.DEVICE_PREFERENCES_KEY
@@ -266,6 +267,9 @@ constructor(@ApplicationContext private val encryptedContext: Context) {
@JvmField
val DB_FILE = backedUpItem(DeviceGridState.KEY_DB_FILE, "", EncryptionType.ENCRYPTED)
@JvmField
+ val GRID_TYPE =
+ backedUpItem(DeviceGridState.KEY_GRID_TYPE, GRID_TYPE_ANY, EncryptionType.ENCRYPTED)
+ @JvmField
val SHOULD_SHOW_SMARTSPACE =
backedUpItem(
SHOULD_SHOW_SMARTSPACE_KEY,
diff --git a/src/com/android/launcher3/allapps/AlphabeticalAppsList.java b/src/com/android/launcher3/allapps/AlphabeticalAppsList.java
index f223eaa600..bf02e03f99 100644
--- a/src/com/android/launcher3/allapps/AlphabeticalAppsList.java
+++ b/src/com/android/launcher3/allapps/AlphabeticalAppsList.java
@@ -435,6 +435,7 @@ public class AlphabeticalAppsList<T extends Context & ActivityContext> implement
}
if (currentItem.itemInfo != null && Objects.equals(
currentItem.itemInfo.getTargetPackage(), PRIVATE_SPACE_PACKAGE)) {
+ currentItem.itemInfo.bitmap = mPrivateProviderManager.preparePSBitmapInfo();
currentItem.itemInfo.bitmap.creationFlags |= FLAG_NO_BADGE;
currentItem.itemInfo.contentDescription =
mPrivateProviderManager.getPsAppContentDesc();
diff --git a/src/com/android/launcher3/allapps/PrivateProfileManager.java b/src/com/android/launcher3/allapps/PrivateProfileManager.java
index 1bc1b17d15..0e6a5b867b 100644
--- a/src/com/android/launcher3/allapps/PrivateProfileManager.java
+++ b/src/com/android/launcher3/allapps/PrivateProfileManager.java
@@ -190,15 +190,11 @@ public class PrivateProfileManager extends UserProfileManager {
/** Adds Private Space install app button to the layout. */
public void addPrivateSpaceInstallAppButton(List<BaseAllAppsAdapter.AdapterItem> adapterItems) {
Context context = mAllApps.getContext();
- // Prepare bitmapInfo
- Intent.ShortcutIconResource shortcut = Intent.ShortcutIconResource.fromContext(
- context, com.android.launcher3.R.drawable.private_space_install_app_icon);
- BitmapInfo bitmapInfo = LauncherIcons.obtain(context).createIconBitmap(shortcut);
PrivateSpaceInstallAppButtonInfo itemInfo = new PrivateSpaceInstallAppButtonInfo();
itemInfo.title = context.getResources().getString(R.string.ps_add_button_label);
itemInfo.intent = mAppInstallerIntent;
- itemInfo.bitmap = bitmapInfo;
+ itemInfo.bitmap = preparePSBitmapInfo();
itemInfo.contentDescription = context.getResources().getString(
com.android.launcher3.R.string.ps_add_button_content_description);
itemInfo.runtimeStatusFlags |= FLAG_NOT_PINNABLE;
@@ -218,6 +214,13 @@ public class PrivateProfileManager extends UserProfileManager {
.get(mAllApps.getContext()).getValue(PRIVATE_SPACE_HIDE_WHEN_LOCKED_URI, 0);
}
+ BitmapInfo preparePSBitmapInfo() {
+ Context context = mAllApps.getContext();
+ Intent.ShortcutIconResource shortcut = Intent.ShortcutIconResource.fromContext(
+ context, com.android.launcher3.R.drawable.private_space_install_app_icon);
+ return LauncherIcons.obtain(context).createIconBitmap(shortcut);
+ }
+
/**
* Resets the current state of Private Profile, w.r.t. to Launcher. The decorator should only
* be applied upon expand before animating. When collapsing, reset() will remove the decorator
diff --git a/src/com/android/launcher3/config/FeatureFlags.java b/src/com/android/launcher3/config/FeatureFlags.java
index 44dcc06791..d987841410 100644
--- a/src/com/android/launcher3/config/FeatureFlags.java
+++ b/src/com/android/launcher3/config/FeatureFlags.java
@@ -163,11 +163,6 @@ public final class FeatureFlags {
"ENABLE_WIDGET_TRANSITION_FOR_RESIZING", DISABLED,
"Enable widget transition animation when resizing the widgets");
- // TODO(Block 25): Clean up flags
- public static final BooleanFlag ENABLE_WIDGET_HOST_IN_BACKGROUND = getDebugFlag(270394384,
- "ENABLE_WIDGET_HOST_IN_BACKGROUND", ENABLED,
- "Enable background widget updates listening for widget holder");
-
// TODO(Block 27): Clean up flags
public static final BooleanFlag ENABLE_OVERLAY_CONNECTION_OPTIM = getDebugFlag(270392629,
"ENABLE_OVERLAY_CONNECTION_OPTIM", DISABLED,
diff --git a/src/com/android/launcher3/dagger/LauncherAppModule.java b/src/com/android/launcher3/dagger/LauncherAppModule.java
index c58a414304..0fd32190c4 100644
--- a/src/com/android/launcher3/dagger/LauncherAppModule.java
+++ b/src/com/android/launcher3/dagger/LauncherAppModule.java
@@ -23,6 +23,7 @@ import dagger.Module;
ApiWrapperModule.class,
PluginManagerWrapperModule.class,
StaticObjectModule.class,
+ WidgetModule.class,
AppModule.class
})
public class LauncherAppModule {
diff --git a/src/com/android/launcher3/dagger/LauncherBaseAppComponent.java b/src/com/android/launcher3/dagger/LauncherBaseAppComponent.java
index c49909772e..f86772e5f5 100644
--- a/src/com/android/launcher3/dagger/LauncherBaseAppComponent.java
+++ b/src/com/android/launcher3/dagger/LauncherBaseAppComponent.java
@@ -46,6 +46,7 @@ import com.android.launcher3.util.VibratorWrapper;
import com.android.launcher3.util.WallpaperColorHints;
import com.android.launcher3.util.window.RefreshRateTracker;
import com.android.launcher3.util.window.WindowManagerProxy;
+import com.android.launcher3.widget.LauncherWidgetHolder.WidgetHolderFactory;
import com.android.launcher3.widget.custom.CustomWidgetManager;
import dagger.BindsInstance;
@@ -89,6 +90,7 @@ public interface LauncherBaseAppComponent {
WidgetsFilterDataProvider getWidgetsFilterDataProvider();
LoaderCursorFactory getLoaderCursorFactory();
+ WidgetHolderFactory getWidgetHolderFactory();
/** Builder for LauncherBaseAppComponent. */
interface Builder {
diff --git a/src/com/android/launcher3/dragndrop/FolderAdaptiveIcon.java b/src/com/android/launcher3/dragndrop/FolderAdaptiveIcon.java
index 929e52e1fc..813ed3ec7c 100644
--- a/src/com/android/launcher3/dragndrop/FolderAdaptiveIcon.java
+++ b/src/com/android/launcher3/dragndrop/FolderAdaptiveIcon.java
@@ -38,7 +38,6 @@ import androidx.annotation.Nullable;
import androidx.annotation.UiThread;
import com.android.launcher3.folder.FolderIcon;
-import com.android.launcher3.folder.PreviewBackground;
import com.android.launcher3.icons.BitmapRenderer;
import com.android.launcher3.util.Preconditions;
import com.android.launcher3.views.ActivityContext;
@@ -143,7 +142,6 @@ public class FolderAdaptiveIcon extends AdaptiveIconDrawable {
icon.getPreviewBounds(sTmpRect);
final int previewSize = sTmpRect.width();
- PreviewBackground bg = icon.getFolderBackground();
final int margin = (size - previewSize) / 2;
final float previewShiftX = -sTmpRect.left + margin;
final float previewShiftY = -sTmpRect.top + margin;
@@ -162,11 +160,10 @@ public class FolderAdaptiveIcon extends AdaptiveIconDrawable {
foregroundCanvas.restore();
// Draw background
- Paint backgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
- backgroundPaint.setColor(bg.getBgColor());
- bg.drawShadow(backgroundCanvas);
- backgroundCanvas.drawPaint(backgroundPaint);
- bg.drawBackgroundStroke(backgroundCanvas);
+ backgroundCanvas.save();
+ backgroundCanvas.translate(previewShiftX, previewShiftY);
+ icon.getFolderBackground().drawBackground(backgroundCanvas);
+ backgroundCanvas.restore();
}
@Override
diff --git a/src/com/android/launcher3/folder/Folder.java b/src/com/android/launcher3/folder/Folder.java
index 967af053fb..996c5e7f55 100644
--- a/src/com/android/launcher3/folder/Folder.java
+++ b/src/com/android/launcher3/folder/Folder.java
@@ -18,6 +18,7 @@ package com.android.launcher3.folder;
import static android.text.TextUtils.isEmpty;
+import static com.android.launcher3.Flags.enableLauncherVisualRefresh;
import static com.android.launcher3.LauncherAnimUtils.SPRING_LOADED_EXIT_DELAY;
import static com.android.launcher3.LauncherState.EDIT_MODE;
import static com.android.launcher3.LauncherState.NORMAL;
@@ -299,6 +300,13 @@ public class Folder extends AbstractFloatingView implements ClipPathView, DragSo
mContent.setFolder(this);
mPageIndicator = findViewById(R.id.folder_page_indicator);
+ if (enableLauncherVisualRefresh()) {
+ MarginLayoutParams params = ((MarginLayoutParams) mPageIndicator.getLayoutParams());
+ int horizontalMargin = getContext().getResources()
+ .getDimensionPixelSize(R.dimen.folder_footer_horiz_padding);
+ params.setMarginStart(horizontalMargin);
+ params.setMarginEnd(horizontalMargin);
+ }
mFooter = findViewById(R.id.folder_footer);
mFooterHeight = dp.folderFooterHeightPx;
mFolderName = findViewById(R.id.folder_name);
@@ -312,7 +320,6 @@ public class Folder extends AbstractFloatingView implements ClipPathView, DragSo
| InputType.TYPE_TEXT_FLAG_CAP_WORDS);
mFolderName.forceDisableSuggestions(true);
-
mKeyboardInsetAnimationCallback = new KeyboardInsetAnimationCallback(this);
setWindowInsetsAnimationCallback(mKeyboardInsetAnimationCallback);
}
@@ -1270,6 +1277,23 @@ public class Folder extends AbstractFloatingView implements ClipPathView, DragSo
}
/**
+ * If the Folder Title has less than 100dp of available width, we hide it. The reason we do this
+ * calculation in onSizeChange is because this callback is called 1x when the folder is opened.
+ * <p>
+ * The PageIndicator and the Folder Title share the same horizontal linear layout, but both
+ * are dynamically sized. Therefore, we are setting visibility of the folder title AFTER the
+ * layout is measured.
+ */
+ @Override
+ protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+ super.onSizeChanged(w, h, oldw, oldh);
+ int minTitleWidth = getResources().getDimensionPixelSize(R.dimen.folder_title_min_width);
+ if (enableLauncherVisualRefresh() && mFolderName.getMeasuredWidth() < minTitleWidth) {
+ mFolderName.setVisibility(View.GONE);
+ }
+ }
+
+ /**
* Rearranges the children based on their rank.
*/
public void rearrangeChildren() {
diff --git a/src/com/android/launcher3/icons/IconCache.java b/src/com/android/launcher3/icons/IconCache.java
index 119a6b122b..1e80d03727 100644
--- a/src/com/android/launcher3/icons/IconCache.java
+++ b/src/com/android/launcher3/icons/IconCache.java
@@ -159,9 +159,15 @@ public class IconCache extends BaseIconCache {
*/
public synchronized void updateIconsForPkg(@NonNull final String packageName,
@NonNull final UserHandle user) {
+ List<LauncherActivityInfo> apps = mLauncherApps.getActivityList(packageName, user);
+ if (Flags.restoreArchivedAppIconsFromDb()
+ && apps.stream().anyMatch(app -> app.getApplicationInfo().isArchived)) {
+ // When archiving app icon, don't delete old icon so it can be re-used.
+ return;
+ }
removeIconsForPkg(packageName, user);
long userSerial = mUserManager.getSerialNumberForUser(user);
- for (LauncherActivityInfo app : mLauncherApps.getActivityList(packageName, user)) {
+ for (LauncherActivityInfo app : apps) {
addIconToDBAndMemCache(app, LauncherActivityCachingLogic.INSTANCE, userSerial);
}
}
diff --git a/src/com/android/launcher3/logging/StatsLogManager.java b/src/com/android/launcher3/logging/StatsLogManager.java
index 44d2e266f7..40b597f838 100644
--- a/src/com/android/launcher3/logging/StatsLogManager.java
+++ b/src/com/android/launcher3/logging/StatsLogManager.java
@@ -890,6 +890,12 @@ public class StatsLogManager implements ResourceBasedOverride {
@UiEvent(doc = "Row shift grid migration occurred")
LAUNCHER_ROW_SHIFT_GRID_MIGRATION(2201),
+ @UiEvent(doc = "Do standard migration when upgrading to one grid")
+ LAUNCHER_STANDARD_ONE_GRID_MIGRATION(2205),
+
+ @UiEvent(doc = "Do row shift migration when upgrading to one grid")
+ LAUNCHER_ROW_SHIFT_ONE_GRID_MIGRATION(2206),
+
// ADD MORE
;
diff --git a/src/com/android/launcher3/model/DeviceGridState.java b/src/com/android/launcher3/model/DeviceGridState.java
index 96ce4c83db..32ea4b5fd7 100644
--- a/src/com/android/launcher3/model/DeviceGridState.java
+++ b/src/com/android/launcher3/model/DeviceGridState.java
@@ -19,6 +19,7 @@ package com.android.launcher3.model;
import static com.android.launcher3.InvariantDeviceProfile.DeviceType;
import static com.android.launcher3.LauncherPrefs.DB_FILE;
import static com.android.launcher3.LauncherPrefs.DEVICE_TYPE;
+import static com.android.launcher3.LauncherPrefs.GRID_TYPE;
import static com.android.launcher3.LauncherPrefs.HOTSEAT_COUNT;
import static com.android.launcher3.LauncherPrefs.WORKSPACE_SIZE;
@@ -41,17 +42,21 @@ public class DeviceGridState implements Comparable<DeviceGridState> {
public static final String KEY_HOTSEAT_COUNT = "migration_src_hotseat_count";
public static final String KEY_DEVICE_TYPE = "migration_src_device_type";
public static final String KEY_DB_FILE = "migration_src_db_file";
+ public static final String KEY_GRID_TYPE = "migration_src_grid_type";
private final String mGridSizeString;
private final int mNumHotseat;
private final @DeviceType int mDeviceType;
private final String mDbFile;
+ private final int mGridType;
- public DeviceGridState(int columns, int row, int numHotseat, int deviceType, String dbFile) {
+ public DeviceGridState(int columns, int row, int numHotseat, int deviceType, String dbFile,
+ int gridType) {
mGridSizeString = String.format(Locale.ENGLISH, "%d,%d", columns, row);
mNumHotseat = numHotseat;
mDeviceType = deviceType;
mDbFile = dbFile;
+ mGridType = gridType;
}
public DeviceGridState(InvariantDeviceProfile idp) {
@@ -59,6 +64,7 @@ public class DeviceGridState implements Comparable<DeviceGridState> {
mNumHotseat = idp.numDatabaseHotseatIcons;
mDeviceType = idp.deviceType;
mDbFile = idp.dbFile;
+ mGridType = idp.gridType;
}
public DeviceGridState(Context context) {
@@ -70,6 +76,7 @@ public class DeviceGridState implements Comparable<DeviceGridState> {
mNumHotseat = lp.get(HOTSEAT_COUNT);
mDeviceType = lp.get(DEVICE_TYPE);
mDbFile = lp.get(DB_FILE);
+ mGridType = lp.get(GRID_TYPE);
}
/**
@@ -94,6 +101,13 @@ public class DeviceGridState implements Comparable<DeviceGridState> {
}
/**
+ * Returns the grid type.
+ */
+ public int getGridType() {
+ return mGridType;
+ }
+
+ /**
* Stores the device state to shared preferences
*/
public void writeToPrefs(Context context) {
@@ -101,7 +115,9 @@ public class DeviceGridState implements Comparable<DeviceGridState> {
WORKSPACE_SIZE.to(mGridSizeString),
HOTSEAT_COUNT.to(mNumHotseat),
DEVICE_TYPE.to(mDeviceType),
- DB_FILE.to(mDbFile));
+ DB_FILE.to(mDbFile),
+ GRID_TYPE.to(mGridType));
+
}
/**
diff --git a/src/com/android/launcher3/model/GridSizeMigrationDBController.java b/src/com/android/launcher3/model/GridSizeMigrationDBController.java
index 3e4394373a..12ba07de4e 100644
--- a/src/com/android/launcher3/model/GridSizeMigrationDBController.java
+++ b/src/com/android/launcher3/model/GridSizeMigrationDBController.java
@@ -17,11 +17,16 @@
package com.android.launcher3.model;
import static com.android.launcher3.Flags.enableSmartspaceRemovalToggle;
+import static com.android.launcher3.GridType.GRID_TYPE_NON_ONE_GRID;
+import static com.android.launcher3.GridType.GRID_TYPE_ONE_GRID;
+import static com.android.launcher3.InvariantDeviceProfile.TYPE_TABLET;
import static com.android.launcher3.LauncherSettings.Favorites.TABLE_NAME;
import static com.android.launcher3.LauncherSettings.Favorites.TMP_TABLE;
import static com.android.launcher3.Utilities.SHOULD_SHOW_FIRST_PAGE_WIDGET;
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_ROW_SHIFT_GRID_MIGRATION;
+import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_ROW_SHIFT_ONE_GRID_MIGRATION;
import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_STANDARD_GRID_MIGRATION;
+import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_STANDARD_ONE_GRID_MIGRATION;
import static com.android.launcher3.model.LoaderTask.SMARTSPACE_ON_HOME_SCREEN;
import static com.android.launcher3.provider.LauncherDbUtils.copyTable;
import static com.android.launcher3.provider.LauncherDbUtils.dropTable;
@@ -157,6 +162,9 @@ public class GridSizeMigrationDBController {
// Save current configuration, so that the migration does not run again.
destDeviceState.writeToPrefs(context);
t.commit();
+ if (isOneGridMigration(srcDeviceState, destDeviceState)) {
+ statsLogManager.logger().log(LAUNCHER_ROW_SHIFT_ONE_GRID_MIGRATION);
+ }
statsLogManager.logger().log(LAUNCHER_ROW_SHIFT_GRID_MIGRATION);
return true;
}
@@ -169,6 +177,9 @@ public class GridSizeMigrationDBController {
destDeviceState.getNumHotseat(), targetSize, srcDeviceState, destDeviceState);
dropTable(t.getDb(), TMP_TABLE);
t.commit();
+ if (isOneGridMigration(srcDeviceState, destDeviceState)) {
+ statsLogManager.logger().log(LAUNCHER_STANDARD_ONE_GRID_MIGRATION);
+ }
statsLogManager.logger().log(LAUNCHER_STANDARD_GRID_MIGRATION);
return true;
} catch (Exception e) {
@@ -291,6 +302,12 @@ public class GridSizeMigrationDBController {
return true;
}
+ protected static boolean isOneGridMigration(DeviceGridState srcDeviceState,
+ DeviceGridState destDeviceState) {
+ return srcDeviceState.getDeviceType() != TYPE_TABLET
+ && srcDeviceState.getGridType() == GRID_TYPE_NON_ONE_GRID
+ && destDeviceState.getGridType() == GRID_TYPE_ONE_GRID;
+ }
/**
* Calculate the differences between {@code src} (denoted by A) and {@code dest}
* (denoted by B).
diff --git a/src/com/android/launcher3/model/GridSizeMigrationLogic.kt b/src/com/android/launcher3/model/GridSizeMigrationLogic.kt
index 2957e3c608..d88f6ccfc6 100644
--- a/src/com/android/launcher3/model/GridSizeMigrationLogic.kt
+++ b/src/com/android/launcher3/model/GridSizeMigrationLogic.kt
@@ -32,8 +32,11 @@ import com.android.launcher3.config.FeatureFlags
import com.android.launcher3.logging.FileLog
import com.android.launcher3.logging.StatsLogManager
import com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_ROW_SHIFT_GRID_MIGRATION
+import com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_ROW_SHIFT_ONE_GRID_MIGRATION
import com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_STANDARD_GRID_MIGRATION
+import com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_STANDARD_ONE_GRID_MIGRATION
import com.android.launcher3.model.GridSizeMigrationDBController.DbReader
+import com.android.launcher3.model.GridSizeMigrationDBController.isOneGridMigration
import com.android.launcher3.provider.LauncherDbUtils.SQLiteTransaction
import com.android.launcher3.provider.LauncherDbUtils.copyTable
import com.android.launcher3.provider.LauncherDbUtils.dropTable
@@ -95,7 +98,12 @@ class GridSizeMigrationLogic {
// Save current configuration, so that the migration does not run again.
destDeviceState.writeToPrefs(context)
t.commit()
+
+ if (isOneGridMigration(srcDeviceState, destDeviceState)) {
+ statsLogManager.logger().log(LAUNCHER_ROW_SHIFT_ONE_GRID_MIGRATION)
+ }
statsLogManager.logger().log(LAUNCHER_ROW_SHIFT_GRID_MIGRATION)
+
return
}
@@ -125,6 +133,10 @@ class GridSizeMigrationLogic {
dropTable(t.db, TMP_TABLE)
t.commit()
+
+ if (isOneGridMigration(srcDeviceState, destDeviceState)) {
+ statsLogManager.logger().log(LAUNCHER_STANDARD_ONE_GRID_MIGRATION)
+ }
statsLogManager.logger().log(LAUNCHER_STANDARD_GRID_MIGRATION)
}
} catch (e: Exception) {
diff --git a/src/com/android/launcher3/model/LoaderCursor.java b/src/com/android/launcher3/model/LoaderCursor.java
index efe61572fe..8f116bbd6b 100644
--- a/src/com/android/launcher3/model/LoaderCursor.java
+++ b/src/com/android/launcher3/model/LoaderCursor.java
@@ -326,6 +326,7 @@ public class LoaderCursor extends CursorWrapper {
// the fallback icon
if (!loadIconFromDb(info)) {
+ FileLog.d(TAG, "loadIconFromDb failed, getting from cache - intent=" + intent);
mIconCache.getTitleAndIcon(info, DEFAULT_LOOKUP_FLAG);
}
diff --git a/src/com/android/launcher3/model/LoaderTask.java b/src/com/android/launcher3/model/LoaderTask.java
index 78e5d898cd..6dc20de490 100644
--- a/src/com/android/launcher3/model/LoaderTask.java
+++ b/src/com/android/launcher3/model/LoaderTask.java
@@ -762,7 +762,7 @@ public class LoaderTask implements Runnable {
}
IconRequestInfo<AppInfo> iconRequestInfo = getAppInfoIconRequestInfo(
- appInfo, app, mWorkspaceIconRequestInfos);
+ appInfo, app, mWorkspaceIconRequestInfos, mIsRestoreFromBackup);
allAppsItemRequestInfos.add(iconRequestInfo);
mBgAllAppsList.add(appInfo, app, false);
}
@@ -831,9 +831,10 @@ public class LoaderTask implements Runnable {
IconRequestInfo<AppInfo> getAppInfoIconRequestInfo(
AppInfo appInfo,
LauncherActivityInfo activityInfo,
- List<IconRequestInfo<WorkspaceItemInfo>> workspaceRequestInfos
+ List<IconRequestInfo<WorkspaceItemInfo>> workspaceRequestInfos,
+ boolean isRestoreFromBackup
) {
- if (Flags.restoreArchivedAppIconsFromDb()) {
+ if (Flags.restoreArchivedAppIconsFromDb() && isRestoreFromBackup) {
Optional<IconRequestInfo<WorkspaceItemInfo>> workspaceIconRequest =
workspaceRequestInfos.stream()
.filter(request -> appInfo.getTargetComponent().equals(
diff --git a/src/com/android/launcher3/model/WorkspaceItemProcessor.kt b/src/com/android/launcher3/model/WorkspaceItemProcessor.kt
index 7b8f21866a..bf71099f41 100644
--- a/src/com/android/launcher3/model/WorkspaceItemProcessor.kt
+++ b/src/com/android/launcher3/model/WorkspaceItemProcessor.kt
@@ -524,15 +524,14 @@ class WorkspaceItemProcessor(
WidgetInflater.TYPE_PENDING -> {
tempPackageKey.update(component.packageName, c.user)
val si = installingPkgs[tempPackageKey]
-
+ val isArchived =
+ ApplicationInfoWrapper(context, component.packageName, c.user).isArchived()
if (
!c.hasRestoreFlag(LauncherAppWidgetInfo.FLAG_RESTORE_STARTED) &&
!isSafeMode &&
(si == null) &&
(lapi == null) &&
- !(Flags.enableSupportForArchiving() &&
- ApplicationInfoWrapper(context, component.packageName, c.user)
- .isArchived())
+ !isArchived
) {
// Restore never started
c.markDeleted(
@@ -559,7 +558,13 @@ class WorkspaceItemProcessor(
appWidgetInfo.providerName,
appWidgetInfo.user,
)
- iconCache.getTitleAndIconForApp(appWidgetInfo.pendingItemInfo, DEFAULT_LOOKUP_FLAG)
+ val iconLookupFlag =
+ if (isArchived && Flags.restoreArchivedAppIconsFromDb()) {
+ DEFAULT_LOOKUP_FLAG.withSkipAddToMemCache()
+ } else {
+ DEFAULT_LOOKUP_FLAG
+ }
+ iconCache.getTitleAndIconForApp(appWidgetInfo.pendingItemInfo, iconLookupFlag)
}
WidgetInflater.TYPE_REAL ->
WidgetSizes.updateWidgetSizeRangesAsync(
diff --git a/src/com/android/launcher3/pageindicators/PageIndicatorDots.java b/src/com/android/launcher3/pageindicators/PageIndicatorDots.java
index 384f87623a..8f80515e36 100644
--- a/src/com/android/launcher3/pageindicators/PageIndicatorDots.java
+++ b/src/com/android/launcher3/pageindicators/PageIndicatorDots.java
@@ -600,6 +600,13 @@ public class PageIndicatorDots extends View implements Insettable, PageIndicator
}
if (Math.round(mCurrentPosition) == i) {
sLastActiveRect.set(sTempRect);
+ if (mCurrentPosition == 0) {
+ // The outline is calculated before onDraw is called. If the user has
+ // paginated, closed the folder, and opened the folder again, the
+ // first drawn outline will use stale bounds.
+ // Invalidation is cheap, and is only needed when scroll is 0.
+ invalidateOutline();
+ }
}
canvas.drawRoundRect(sTempRect, mDotRadius, mDotRadius, mPaginationPaint);
diff --git a/src/com/android/launcher3/popup/PopupContainerWithArrow.java b/src/com/android/launcher3/popup/PopupContainerWithArrow.java
index 39f68bfe70..9a226df8db 100644
--- a/src/com/android/launcher3/popup/PopupContainerWithArrow.java
+++ b/src/com/android/launcher3/popup/PopupContainerWithArrow.java
@@ -24,7 +24,9 @@ import static com.android.launcher3.Utilities.squaredTouchSlop;
import static com.android.launcher3.allapps.AlphabeticalAppsList.PRIVATE_SPACE_PACKAGE;
import static com.android.launcher3.model.data.ItemInfoWithIcon.FLAG_NOT_PINNABLE;
import static com.android.launcher3.popup.PopupPopulator.MAX_SHORTCUTS;
+import static com.android.launcher3.shortcuts.DeepShortcutTextView.GOOGLE_SANS_FLEX_LABEL_LARGE;
import static com.android.launcher3.util.Executors.MODEL_EXECUTOR;
+import static com.android.wm.shell.Flags.enableGsf;
import android.animation.AnimatorSet;
import android.animation.LayoutTransition;
@@ -32,6 +34,7 @@ import android.content.Context;
import android.graphics.Point;
import android.graphics.PointF;
import android.graphics.Rect;
+import android.graphics.Typeface;
import android.os.Handler;
import android.os.Looper;
import android.util.AttributeSet;
@@ -479,6 +482,10 @@ public class PopupContainerWithArrow<T extends Context & ActivityContext>
if (view instanceof DeepShortcutView) {
// System shortcut takes entire row with icon and text
final DeepShortcutView shortcutView = (DeepShortcutView) view;
+ if (enableGsf()) {
+ shortcutView.getBubbleText().setTypeface(
+ Typeface.create(GOOGLE_SANS_FLEX_LABEL_LARGE, Typeface.NORMAL));
+ }
info.setIconAndLabelFor(shortcutView.getIconView(), shortcutView.getBubbleText());
} else if (view instanceof ImageView) {
// System shortcut is just an icon
diff --git a/src/com/android/launcher3/shortcuts/DeepShortcutTextView.java b/src/com/android/launcher3/shortcuts/DeepShortcutTextView.java
index ded2ceee42..b1d095b52e 100644
--- a/src/com/android/launcher3/shortcuts/DeepShortcutTextView.java
+++ b/src/com/android/launcher3/shortcuts/DeepShortcutTextView.java
@@ -16,9 +16,12 @@
package com.android.launcher3.shortcuts;
+import static com.android.wm.shell.Flags.enableGsf;
+
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Rect;
+import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.text.TextUtils;
import android.util.AttributeSet;
@@ -31,6 +34,7 @@ import com.android.launcher3.Utilities;
* A {@link BubbleTextView} that has the shortcut icon on the left and drag handle on the right.
*/
public class DeepShortcutTextView extends BubbleTextView {
+ public static final String GOOGLE_SANS_FLEX_LABEL_LARGE = "variable-label-large";
private boolean mShowLoadingState;
private Drawable mLoadingStatePlaceholder;
@@ -47,6 +51,9 @@ public class DeepShortcutTextView extends BubbleTextView {
public DeepShortcutTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
showLoadingState(true);
+ if (enableGsf()) {
+ setTypeface(Typeface.create(GOOGLE_SANS_FLEX_LABEL_LARGE, Typeface.NORMAL));
+ }
}
@Override
diff --git a/src/com/android/launcher3/widget/LauncherAppWidgetHost.java b/src/com/android/launcher3/widget/LauncherAppWidgetHost.java
index 91b899c2ef..63d2954e70 100644
--- a/src/com/android/launcher3/widget/LauncherAppWidgetHost.java
+++ b/src/com/android/launcher3/widget/LauncherAppWidgetHost.java
@@ -16,8 +16,6 @@
package com.android.launcher3.widget;
-import static com.android.launcher3.widget.LauncherWidgetHolder.APPWIDGET_HOST_ID;
-
import android.appwidget.AppWidgetHost;
import android.appwidget.AppWidgetProviderInfo;
import android.content.Context;
@@ -26,49 +24,18 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
-import com.android.launcher3.LauncherAppState;
-import com.android.launcher3.util.Executors;
-import com.android.launcher3.widget.LauncherWidgetHolder.ProviderChangedListener;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.function.IntConsumer;
-
/**
* Specific {@link AppWidgetHost} that creates our {@link LauncherAppWidgetHostView}
* which correctly captures all long-press events. This ensures that users can
* always pick up and move widgets.
*/
-class LauncherAppWidgetHost extends AppWidgetHost {
- @NonNull
- private final List<ProviderChangedListener> mProviderChangeListeners;
-
- @NonNull
- private final Context mContext;
-
- @Nullable
- private final IntConsumer mAppWidgetRemovedCallback;
+class LauncherAppWidgetHost extends ListenableAppWidgetHost {
@Nullable
private ListenableHostView mViewToRecycle;
- public LauncherAppWidgetHost(@NonNull Context context,
- @Nullable IntConsumer appWidgetRemovedCallback,
- List<ProviderChangedListener> providerChangeListeners) {
- super(context, APPWIDGET_HOST_ID);
- mContext = context;
- mAppWidgetRemovedCallback = appWidgetRemovedCallback;
- mProviderChangeListeners = providerChangeListeners;
- }
-
- @Override
- protected void onProvidersChanged() {
- if (!mProviderChangeListeners.isEmpty()) {
- for (LauncherWidgetHolder.ProviderChangedListener callback :
- new ArrayList<>(mProviderChangeListeners)) {
- callback.notifyWidgetProvidersChanged();
- }
- }
+ LauncherAppWidgetHost(@NonNull Context context, int appWidgetId) {
+ super(context, appWidgetId);
}
/**
@@ -94,35 +61,6 @@ class LauncherAppWidgetHost extends AppWidgetHost {
}
/**
- * Called when the AppWidget provider for a AppWidget has been upgraded to a new apk.
- */
- @Override
- protected void onProviderChanged(int appWidgetId, @NonNull AppWidgetProviderInfo appWidget) {
- LauncherAppWidgetProviderInfo info = LauncherAppWidgetProviderInfo.fromProviderInfo(
- mContext, appWidget);
- super.onProviderChanged(appWidgetId, info);
- // The super method updates the dimensions of the providerInfo. Update the
- // launcher spans accordingly.
- info.initSpans(mContext, LauncherAppState.getIDP(mContext));
- }
-
- /**
- * Called on an appWidget is removed for a widgetId
- *
- * @param appWidgetId TODO: make this override when SDK is updated
- */
- @Override
- public void onAppWidgetRemoved(int appWidgetId) {
- if (mAppWidgetRemovedCallback == null) {
- return;
- }
- // Route the call via model thread, in case it comes while a loader-bind is in progress
- Executors.MODEL_EXECUTOR.execute(
- () -> Executors.MAIN_EXECUTOR.execute(
- () -> mAppWidgetRemovedCallback.accept(appWidgetId)));
- }
-
- /**
* The same as super.clearViews(), except with the scope exposed
*/
@Override
diff --git a/src/com/android/launcher3/widget/LauncherWidgetHolder.java b/src/com/android/launcher3/widget/LauncherWidgetHolder.java
index 78197e2dd0..642f35abcd 100644
--- a/src/com/android/launcher3/widget/LauncherWidgetHolder.java
+++ b/src/com/android/launcher3/widget/LauncherWidgetHolder.java
@@ -20,10 +20,9 @@ import static android.app.Activity.RESULT_CANCELED;
import static com.android.launcher3.BuildConfig.WIDGETS_ENABLED;
import static com.android.launcher3.Flags.enableWorkspaceInflation;
import static com.android.launcher3.util.Executors.MAIN_EXECUTOR;
-import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR;
import static com.android.launcher3.widget.LauncherAppWidgetProviderInfo.fromProviderInfo;
+import static com.android.launcher3.widget.ListenableAppWidgetHost.getWidgetHolderExecutor;
-import android.appwidget.AppWidgetHost;
import android.appwidget.AppWidgetHostView;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProviderInfo;
@@ -32,6 +31,7 @@ import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Looper;
+import android.util.Log;
import android.util.SparseArray;
import android.widget.Toast;
@@ -43,18 +43,23 @@ import androidx.annotation.WorkerThread;
import com.android.launcher3.BaseActivity;
import com.android.launcher3.R;
import com.android.launcher3.Utilities;
+import com.android.launcher3.dagger.LauncherComponentProvider;
import com.android.launcher3.model.data.ItemInfo;
import com.android.launcher3.testing.TestLogging;
import com.android.launcher3.testing.shared.TestProtocol;
-import com.android.launcher3.util.LooperExecutor;
-import com.android.launcher3.util.ResourceBasedOverride;
import com.android.launcher3.util.SafeCloseable;
import com.android.launcher3.views.ActivityContext;
+import com.android.launcher3.widget.ListenableAppWidgetHost.ProviderChangedListener;
import com.android.launcher3.widget.custom.CustomWidgetManager;
+import dagger.assisted.Assisted;
+import dagger.assisted.AssistedFactory;
+import dagger.assisted.AssistedInject;
+
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Consumer;
import java.util.function.IntConsumer;
/**
@@ -62,51 +67,57 @@ import java.util.function.IntConsumer;
* background.
*/
public class LauncherWidgetHolder {
+
+ private static final String TAG = "LauncherWidgetHolder";
+
public static final int APPWIDGET_HOST_ID = 1024;
protected static final int FLAG_LISTENING = 1;
protected static final int FLAG_STATE_IS_NORMAL = 1 << 1;
protected static final int FLAG_ACTIVITY_STARTED = 1 << 2;
protected static final int FLAG_ACTIVITY_RESUMED = 1 << 3;
+
private static final int FLAGS_SHOULD_LISTEN =
FLAG_STATE_IS_NORMAL | FLAG_ACTIVITY_STARTED | FLAG_ACTIVITY_RESUMED;
+ // TODO(b/191735836): Replace with ActivityOptions.KEY_SPLASH_SCREEN_STYLE when un-hidden
+ private static final String KEY_SPLASH_SCREEN_STYLE = "android.activity.splashScreenStyle";
+ // TODO(b/191735836): Replace with SplashScreen.SPLASH_SCREEN_STYLE_EMPTY when un-hidden
+ private static final int SPLASH_SCREEN_STYLE_EMPTY = 0;
+
@NonNull
protected final Context mContext;
@NonNull
- private final AppWidgetHost mWidgetHost;
+ protected final ListenableAppWidgetHost mWidgetHost;
@NonNull
protected final SparseArray<LauncherAppWidgetHostView> mViews = new SparseArray<>();
- protected final List<ProviderChangedListener> mProviderChangedListeners = new ArrayList<>();
+
+ /** package visibility */
+ final List<ProviderChangedListener> mProviderChangedListeners = new ArrayList<>();
protected AtomicInteger mFlags = new AtomicInteger(FLAG_STATE_IS_NORMAL);
- // TODO(b/191735836): Replace with ActivityOptions.KEY_SPLASH_SCREEN_STYLE when un-hidden
- private static final String KEY_SPLASH_SCREEN_STYLE = "android.activity.splashScreenStyle";
- // TODO(b/191735836): Replace with SplashScreen.SPLASH_SCREEN_STYLE_EMPTY when un-hidden
- private static final int SPLASH_SCREEN_STYLE_EMPTY = 0;
+ @Nullable
+ private Consumer<LauncherAppWidgetHostView> mOnViewCreationCallback;
- protected LauncherWidgetHolder(@NonNull Context context,
- @Nullable IntConsumer appWidgetRemovedCallback) {
- mContext = context;
- mWidgetHost = createHost(context, appWidgetRemovedCallback);
- }
+ /** package visibility */
+ @Nullable IntConsumer mAppWidgetRemovedCallback;
- protected AppWidgetHost createHost(
- Context context, @Nullable IntConsumer appWidgetRemovedCallback) {
- return new LauncherAppWidgetHost(
- context, appWidgetRemovedCallback, mProviderChangedListeners);
+ @AssistedInject
+ protected LauncherWidgetHolder(@Assisted("UI_CONTEXT") @NonNull Context context) {
+ this(context, new LauncherAppWidgetHost(context, APPWIDGET_HOST_ID));
}
- protected LooperExecutor getWidgetHolderExecutor() {
- return UI_HELPER_EXECUTOR;
+ protected LauncherWidgetHolder(
+ @NonNull Context context, @NonNull ListenableAppWidgetHost appWidgetHost) {
+ mContext = context;
+ mWidgetHost = appWidgetHost;
+ MAIN_EXECUTOR.execute(() -> mWidgetHost.getHolders().add(this));
}
- /**
- * Starts listening to the widget updates from the server side
- */
+ /** Starts listening to the widget updates from the server side */
public void startListening() {
if (!WIDGETS_ENABLED) {
return;
@@ -127,13 +138,11 @@ public class LauncherWidgetHolder {
// TODO: Investigate why widgetHost.startListening() always return non-empty updates
setListeningFlag(true);
- MAIN_EXECUTOR.execute(() -> updateDeferredView());
+ MAIN_EXECUTOR.execute(this::updateDeferredView);
});
}
- /**
- * Update any views which have been deferred because the host was not listening.
- */
+ /** Update any views which have been deferred because the host was not listening */
protected void updateDeferredView() {
// Update any views which have been deferred because the host was not listening.
// We go in reverse order and inflate any deferred or cached widget
@@ -180,7 +189,14 @@ public class LauncherWidgetHolder {
* Called when the launcher is destroyed
*/
public void destroy() {
- // No-op
+ try {
+ MAIN_EXECUTOR.submit(() -> {
+ clearViews();
+ mWidgetHost.getHolders().remove(this);
+ }).get();
+ } catch (Exception e) {
+ Log.e(TAG, "Failed to remove self from holder list", e);
+ }
}
/**
@@ -198,8 +214,7 @@ public class LauncherWidgetHolder {
* Add a listener that is triggered when the providers of the widgets are changed
* @param listener The listener that notifies when the providers changed
*/
- public void addProviderChangeListener(
- @NonNull LauncherWidgetHolder.ProviderChangedListener listener) {
+ public void addProviderChangeListener(@NonNull ProviderChangedListener listener) {
MAIN_EXECUTOR.execute(() -> mProviderChangedListeners.add(listener));
}
@@ -207,12 +222,23 @@ public class LauncherWidgetHolder {
* Remove the specified listener from the host
* @param listener The listener that is to be removed from the host
*/
- public void removeProviderChangeListener(
- LauncherWidgetHolder.ProviderChangedListener listener) {
+ public void removeProviderChangeListener(ProviderChangedListener listener) {
MAIN_EXECUTOR.execute(() -> mProviderChangedListeners.remove(listener));
}
/**
+ * Sets a callbacks for whenever a widget view is created
+ */
+ public void setOnViewCreationCallback(@Nullable Consumer<LauncherAppWidgetHostView> callback) {
+ mOnViewCreationCallback = callback;
+ }
+
+ /** Sets a callback for listening app widget removals */
+ public void setAppWidgetRemovedCallback(@Nullable IntConsumer callback) {
+ mAppWidgetRemovedCallback = callback;
+ }
+
+ /**
* Starts the configuration activity for the widget
* @param activity The activity in which to start the configuration page
* @param widgetId The ID of the widget
@@ -284,9 +310,7 @@ public class LauncherWidgetHolder {
activity.startActivityForResult(intent, requestCode);
}
- /**
- * Stop the host from listening to the widget updates
- */
+ /** Stop the host from listening to the widget updates */
public void stopListening() {
if (!WIDGETS_ENABLED) {
return;
@@ -298,8 +322,8 @@ public class LauncherWidgetHolder {
}
/**
- * Update {@link FLAG_LISTENING} on {@link mFlags} after making binder calls from
- * {@link sWidgetHost}.
+ * Update {@link #FLAG_LISTENING} on {@link #mFlags} after making binder calls from
+ * {@link #mWidgetHost}.
*/
@WorkerThread
protected void setListeningFlag(final boolean isListening) {
@@ -350,6 +374,7 @@ public class LauncherWidgetHolder {
}
LauncherAppWidgetHostView view = createViewInternal(appWidgetId, appWidget);
+ if (mOnViewCreationCallback != null) mOnViewCreationCallback.accept(view);
// Do not update mViews on a background thread call, as the holder is not thread safe.
if (!enableWorkspaceInflation() || Looper.myLooper() == Looper.getMainLooper()) {
mViews.put(appWidgetId, view);
@@ -368,8 +393,8 @@ public class LauncherWidgetHolder {
// Binder can also inflate placeholder widgets in case of backup-restore. Skip
// attaching such widgets
- boolean isRealWidget = ((view instanceof PendingAppWidgetHostView pw)
- ? pw.isDeferredWidget() : true)
+ boolean isRealWidget = (!(view instanceof PendingAppWidgetHostView pw)
+ || pw.isDeferredWidget())
&& view.getAppWidgetInfo() != null;
if (isRealWidget && mViews.get(view.getAppWidgetId()) != view) {
view = recycleExistingView(view);
@@ -446,28 +471,13 @@ public class LauncherWidgetHolder {
}
}
- /**
- * Listener for getting notifications on provider changes.
- */
- public interface ProviderChangedListener {
- /**
- * Notify the listener that the providers have changed
- */
- void notifyWidgetProvidersChanged();
- }
-
- /**
- * Clears all the views from the host
- */
+ /** Clears all the views from the host */
public void clearViews() {
- LauncherAppWidgetHost tempHost = (LauncherAppWidgetHost) mWidgetHost;
- tempHost.clearViews();
+ ((LauncherAppWidgetHost) mWidgetHost).clearViews();
mViews.clear();
}
- /**
- * Clears all the internal widget views
- */
+ /** Clears all the internal widget views */
public void clearWidgetViews() {
clearViews();
}
@@ -514,32 +524,19 @@ public class LauncherWidgetHolder {
* Returns the new LauncherWidgetHolder instance
*/
public static LauncherWidgetHolder newInstance(Context context) {
- return HolderFactory.newFactory(context).newInstance(context, null);
+ return LauncherComponentProvider.get(context).getWidgetHolderFactory().newInstance(context);
}
- /**
- * A factory class that generates new instances of {@code LauncherWidgetHolder}
- */
- public static class HolderFactory implements ResourceBasedOverride {
-
- /**
- * @param context The context of the caller
- * @param appWidgetRemovedCallback The callback that is called when widgets are removed
- * @return A new instance of {@code LauncherWidgetHolder}
- */
- public LauncherWidgetHolder newInstance(@NonNull Context context,
- @Nullable IntConsumer appWidgetRemovedCallback) {
- return new LauncherWidgetHolder(context, appWidgetRemovedCallback);
- }
+ /** A factory that generates new instances of {@code LauncherWidgetHolder} */
+ public interface WidgetHolderFactory {
- /**
- * @param context The context of the caller
- * @return A new instance of factory class for widget holders. If not specified, returning
- * {@code HolderFactory} by default.
- */
- public static HolderFactory newFactory(Context context) {
- return Overrides.getObject(
- HolderFactory.class, context, R.string.widget_holder_factory_class);
- }
+ LauncherWidgetHolder newInstance(@NonNull Context context);
+ }
+
+ /** A factory that generates new instances of {@code LauncherWidgetHolder} */
+ @AssistedFactory
+ public interface WidgetHolderFactoryImpl extends WidgetHolderFactory {
+
+ LauncherWidgetHolder newInstance(@Assisted("UI_CONTEXT") @NonNull Context context);
}
}
diff --git a/src/com/android/launcher3/widget/ListenableAppWidgetHost.kt b/src/com/android/launcher3/widget/ListenableAppWidgetHost.kt
new file mode 100644
index 0000000000..58bf0aa869
--- /dev/null
+++ b/src/com/android/launcher3/widget/ListenableAppWidgetHost.kt
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2025 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.launcher3.widget
+
+import android.appwidget.AppWidgetHost
+import android.appwidget.AppWidgetProviderInfo
+import android.content.Context
+import com.android.launcher3.InvariantDeviceProfile
+import com.android.launcher3.util.Executors
+import com.android.launcher3.util.Executors.MAIN_EXECUTOR
+import com.android.launcher3.util.Executors.MODEL_EXECUTOR
+import com.android.launcher3.util.LooperExecutor
+
+open class ListenableAppWidgetHost(private val ctx: Context, hostId: Int) :
+ AppWidgetHost(ctx, hostId) {
+
+ protected val holders = mutableListOf<LauncherWidgetHolder>()
+
+ override fun onProvidersChanged() {
+ MAIN_EXECUTOR.execute {
+ holders.forEach { holder ->
+ // Listeners might remove themselves from the list during the iteration.
+ // Creating a copy of the list to avoid exceptions for concurrent modification.
+ holder.mProviderChangedListeners.toList().forEach {
+ it.notifyWidgetProvidersChanged()
+ }
+ }
+ }
+ }
+
+ override fun onAppWidgetRemoved(appWidgetId: Int) {
+ // Route the call via model thread, in case it comes while a loader-bind is in progress
+ MODEL_EXECUTOR.execute {
+ MAIN_EXECUTOR.execute {
+ holders.forEach { it.mAppWidgetRemovedCallback?.accept(appWidgetId) }
+ }
+ }
+ }
+
+ override fun onProviderChanged(appWidgetId: Int, appWidget: AppWidgetProviderInfo) {
+ val info = LauncherAppWidgetProviderInfo.fromProviderInfo(ctx, appWidget)
+ super.onProviderChanged(appWidgetId, info)
+ // The super method updates the dimensions of the providerInfo. Update the
+ // launcher spans accordingly.
+ info.initSpans(ctx, InvariantDeviceProfile.INSTANCE.get(ctx))
+ }
+
+ /** Listener for getting notifications on provider changes. */
+ fun interface ProviderChangedListener {
+ /** Notify the listener that the providers have changed */
+ fun notifyWidgetProvidersChanged()
+ }
+
+ companion object {
+
+ @JvmStatic val widgetHolderExecutor: LooperExecutor = Executors.UI_HELPER_EXECUTOR
+ }
+}
diff --git a/src/com/android/launcher3/widget/PendingAppWidgetHostView.java b/src/com/android/launcher3/widget/PendingAppWidgetHostView.java
index cd8e4571e5..1c29f8907f 100644
--- a/src/com/android/launcher3/widget/PendingAppWidgetHostView.java
+++ b/src/com/android/launcher3/widget/PendingAppWidgetHostView.java
@@ -66,7 +66,7 @@ import com.android.launcher3.model.data.PackageItemInfo;
import com.android.launcher3.util.RunnableList;
import com.android.launcher3.util.SafeCloseable;
import com.android.launcher3.util.Themes;
-import com.android.launcher3.widget.LauncherWidgetHolder.ProviderChangedListener;
+import com.android.launcher3.widget.ListenableAppWidgetHost.ProviderChangedListener;
import java.util.List;
diff --git a/src_no_quickstep/com/android/launcher3/dagger/Modules.kt b/src_no_quickstep/com/android/launcher3/dagger/Modules.kt
index c3bf7c532b..7dbe9c3119 100644
--- a/src_no_quickstep/com/android/launcher3/dagger/Modules.kt
+++ b/src_no_quickstep/com/android/launcher3/dagger/Modules.kt
@@ -16,6 +16,9 @@
package com.android.launcher3.dagger
+import com.android.launcher3.widget.LauncherWidgetHolder.WidgetHolderFactory
+import com.android.launcher3.widget.LauncherWidgetHolder.WidgetHolderFactoryImpl
+import dagger.Binds
import dagger.Module
private object Modules {}
@@ -24,6 +27,12 @@ private object Modules {}
@Module abstract class ApiWrapperModule {}
+@Module
+abstract class WidgetModule {
+ @Binds
+ abstract fun bindWidgetHolderFactory(factor: WidgetHolderFactoryImpl): WidgetHolderFactory
+}
+
@Module abstract class PluginManagerWrapperModule {}
@Module object StaticObjectModule {}
diff --git a/tests/multivalentTests/src/com/android/launcher3/AbstractDeviceProfileTest.kt b/tests/multivalentTests/src/com/android/launcher3/AbstractDeviceProfileTest.kt
index a30261e523..dc49ba0ef4 100644
--- a/tests/multivalentTests/src/com/android/launcher3/AbstractDeviceProfileTest.kt
+++ b/tests/multivalentTests/src/com/android/launcher3/AbstractDeviceProfileTest.kt
@@ -39,7 +39,6 @@ import com.android.launcher3.util.NavigationMode
import com.android.launcher3.util.SandboxContext
import com.android.launcher3.util.WindowBounds
import com.android.launcher3.util.rule.TestStabilityRule
-import com.android.launcher3.util.rule.ZipFilesRule
import com.android.launcher3.util.rule.setFlags
import com.android.launcher3.util.window.CachedDisplayInfo
import com.android.launcher3.util.window.WindowManagerProxy
@@ -52,7 +51,6 @@ import java.io.PrintWriter
import java.io.StringWriter
import kotlin.math.max
import kotlin.math.min
-import org.junit.ClassRule
import org.junit.Rule
import org.mockito.kotlin.any
import org.mockito.kotlin.doReturn
@@ -82,13 +80,6 @@ abstract class AbstractDeviceProfileTest {
@Rule @JvmField val limitDevicesRule = LimitDevicesRule()
- companion object {
- @ClassRule
- @JvmField
- val resultZipRule =
- ZipFilesRule(InstrumentationRegistry.getInstrumentation().targetContext, "DumpTest")
- }
-
class DeviceSpec(
val naturalSize: Pair<Int, Int>,
var densityDpi: Int,
@@ -375,7 +366,6 @@ abstract class AbstractDeviceProfileTest {
private fun writeToDevice(context: Context, fileName: String, content: String) {
val file = File(context.getDir("dumpTests", Context.MODE_PRIVATE), fileName)
file.writeText(content)
- resultZipRule.write(file)
}
protected fun Float.dpToPx(): Float {
diff --git a/tests/multivalentTests/src/com/android/launcher3/model/gridmigration/ValidGridMigrationUnitTest.kt b/tests/multivalentTests/src/com/android/launcher3/model/gridmigration/ValidGridMigrationUnitTest.kt
index 1d1e7ebd1b..dd26ed234c 100644
--- a/tests/multivalentTests/src/com/android/launcher3/model/gridmigration/ValidGridMigrationUnitTest.kt
+++ b/tests/multivalentTests/src/com/android/launcher3/model/gridmigration/ValidGridMigrationUnitTest.kt
@@ -27,6 +27,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import androidx.test.platform.app.InstrumentationRegistry
import com.android.launcher3.Flags
+import com.android.launcher3.GridType.Companion.GRID_TYPE_ANY
import com.android.launcher3.InvariantDeviceProfile
import com.android.launcher3.LauncherSettings.Favorites
import com.android.launcher3.celllayout.testgenerator.ValidGridMigrationTestCaseGenerator
@@ -46,7 +47,14 @@ import org.junit.runner.RunWith
private data class Grid(val tableName: String, val size: Point, val items: List<WorkspaceItem>) {
fun toGridState(): DeviceGridState =
- DeviceGridState(size.x, size.y, size.x, InvariantDeviceProfile.TYPE_PHONE, tableName)
+ DeviceGridState(
+ size.x,
+ size.y,
+ size.x,
+ InvariantDeviceProfile.TYPE_PHONE,
+ tableName,
+ GRID_TYPE_ANY,
+ )
}
@SmallTest
diff --git a/tests/multivalentTests/src/com/android/launcher3/util/DaggerGraphs.kt b/tests/multivalentTests/src/com/android/launcher3/util/DaggerGraphs.kt
index b66a9d3330..a76ccf015e 100644
--- a/tests/multivalentTests/src/com/android/launcher3/util/DaggerGraphs.kt
+++ b/tests/multivalentTests/src/com/android/launcher3/util/DaggerGraphs.kt
@@ -21,6 +21,7 @@ import com.android.launcher3.LauncherPrefs
import com.android.launcher3.dagger.ApiWrapperModule
import com.android.launcher3.dagger.AppModule
import com.android.launcher3.dagger.StaticObjectModule
+import com.android.launcher3.dagger.WidgetModule
import com.android.launcher3.dagger.WindowManagerProxyModule
import dagger.Binds
import dagger.Module
@@ -39,15 +40,27 @@ abstract class FakePrefsModule {
ApiWrapperModule::class,
WindowManagerProxyModule::class,
StaticObjectModule::class,
+ WidgetModule::class,
AppModule::class,
]
)
class AllModulesForTest
/** All modules except the WMProxy */
-@Module(includes = [ApiWrapperModule::class, StaticObjectModule::class, AppModule::class])
+@Module(
+ includes =
+ [ApiWrapperModule::class, StaticObjectModule::class, AppModule::class, WidgetModule::class]
+)
class AllModulesMinusWMProxy
/** All modules except the ApiWrapper */
-@Module(includes = [WindowManagerProxyModule::class, StaticObjectModule::class, AppModule::class])
+@Module(
+ includes =
+ [
+ WindowManagerProxyModule::class,
+ StaticObjectModule::class,
+ AppModule::class,
+ WidgetModule::class,
+ ]
+)
class AllModulesMinusApiWrapper
diff --git a/tests/multivalentTests/src/com/android/launcher3/widget/LauncherAppWidgetHostTest.kt b/tests/multivalentTests/src/com/android/launcher3/widget/LauncherAppWidgetHostTest.kt
index 79b493a364..d5d1f4af93 100644
--- a/tests/multivalentTests/src/com/android/launcher3/widget/LauncherAppWidgetHostTest.kt
+++ b/tests/multivalentTests/src/com/android/launcher3/widget/LauncherAppWidgetHostTest.kt
@@ -21,32 +21,22 @@ import androidx.test.filters.SmallTest
import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation
import com.android.launcher3.util.ActivityContextWrapper
import com.android.launcher3.util.Executors
+import com.android.launcher3.util.TestUtil
import java.util.function.IntConsumer
import org.junit.Assert.assertNotSame
import org.junit.Assert.assertNull
import org.junit.Assert.assertSame
-import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
-import org.mockito.Mock
import org.mockito.Mockito.mock
import org.mockito.Mockito.verify
-import org.mockito.MockitoAnnotations
@SmallTest
@RunWith(AndroidJUnit4::class)
class LauncherAppWidgetHostTest {
- @Mock private lateinit var onAppWidgetRemovedCallback: IntConsumer
-
private val context = ActivityContextWrapper(getInstrumentation().targetContext)
- private lateinit var underTest: LauncherAppWidgetHost
-
- @Before
- fun setUp() {
- MockitoAnnotations.initMocks(this)
- underTest = LauncherAppWidgetHost(context, onAppWidgetRemovedCallback, emptyList())
- }
+ private var underTest = LauncherAppWidgetHost(context, HOST_ID)
@Test
fun `Host set view to recycle`() {
@@ -74,15 +64,20 @@ class LauncherAppWidgetHostTest {
@Test
fun `Runnable called when app widget removed`() {
+ val holder = LauncherWidgetHolder(context, underTest)
+ holder.setAppWidgetRemovedCallback(mock(IntConsumer::class.java))
+ TestUtil.runOnExecutorSync(Executors.MAIN_EXECUTOR) {}
+
underTest.onAppWidgetRemoved(WIDGET_ID)
Executors.MODEL_EXECUTOR.submit {}.get()
getInstrumentation().waitForIdleSync()
- verify(onAppWidgetRemovedCallback).accept(WIDGET_ID)
+ verify(holder.mAppWidgetRemovedCallback!!).accept(WIDGET_ID)
}
companion object {
+ const val HOST_ID = 2233
const val WIDGET_ID = 10001
}
}
diff --git a/tests/multivalentTests/src/com/android/launcher3/widget/LauncherWidgetHolderTest.kt b/tests/multivalentTests/src/com/android/launcher3/widget/LauncherWidgetHolderTest.kt
index 1a659e2b56..44f29d67e2 100644
--- a/tests/multivalentTests/src/com/android/launcher3/widget/LauncherWidgetHolderTest.kt
+++ b/tests/multivalentTests/src/com/android/launcher3/widget/LauncherWidgetHolderTest.kt
@@ -47,7 +47,7 @@ class LauncherWidgetHolderTest {
fun setUp() {
assertTrue(WIDGETS_ENABLED)
widgetHolder =
- LauncherWidgetHolder(ActivityContextWrapper(getInstrumentation().targetContext)) {}
+ LauncherWidgetHolder(ActivityContextWrapper(getInstrumentation().targetContext))
}
@After
@@ -62,7 +62,7 @@ class LauncherWidgetHolderTest {
widgetHolder.setListeningFlag(false)
assertFalse(widgetHolder.isListening)
widgetHolder.startListening()
- widgetHolder.widgetHolderExecutor.submit {}.get()
+ ListenableAppWidgetHost.widgetHolderExecutor.submit {}.get()
getInstrumentation().waitForIdleSync()
assertTrue(widgetHolder.isListening)
verify(testView, times(1)).reInflate()
@@ -73,10 +73,10 @@ class LauncherWidgetHolderTest {
fun holder_start_listening_after_activity_start() {
widgetHolder.setShouldListenFlag(FLAG_STATE_IS_NORMAL or FLAG_ACTIVITY_RESUMED, true)
widgetHolder.setActivityStarted(false)
- widgetHolder.widgetHolderExecutor.submit {}.get()
+ ListenableAppWidgetHost.widgetHolderExecutor.submit {}.get()
assertFalse(widgetHolder.shouldListen(widgetHolder.mFlags.get()))
widgetHolder.setActivityStarted(true)
- widgetHolder.widgetHolderExecutor.submit {}.get()
+ ListenableAppWidgetHost.widgetHolderExecutor.submit {}.get()
assertTrue(widgetHolder.shouldListen(widgetHolder.mFlags.get()))
}
@@ -84,10 +84,10 @@ class LauncherWidgetHolderTest {
fun holder_start_listening_after_activity_resume() {
widgetHolder.setShouldListenFlag(FLAG_STATE_IS_NORMAL or FLAG_ACTIVITY_STARTED, true)
widgetHolder.setActivityResumed(false)
- widgetHolder.widgetHolderExecutor.submit {}.get()
+ ListenableAppWidgetHost.widgetHolderExecutor.submit {}.get()
assertFalse(widgetHolder.shouldListen(widgetHolder.mFlags.get()))
widgetHolder.setActivityResumed(true)
- widgetHolder.widgetHolderExecutor.submit {}.get()
+ ListenableAppWidgetHost.widgetHolderExecutor.submit {}.get()
assertTrue(widgetHolder.shouldListen(widgetHolder.mFlags.get()))
}
@@ -95,10 +95,10 @@ class LauncherWidgetHolderTest {
fun holder_start_listening_after_state_normal() {
widgetHolder.setShouldListenFlag(FLAG_ACTIVITY_RESUMED or FLAG_ACTIVITY_STARTED, true)
widgetHolder.setStateIsNormal(false)
- widgetHolder.widgetHolderExecutor.submit {}.get()
+ ListenableAppWidgetHost.widgetHolderExecutor.submit {}.get()
assertFalse(widgetHolder.shouldListen(widgetHolder.mFlags.get()))
widgetHolder.setStateIsNormal(true)
- widgetHolder.widgetHolderExecutor.submit {}.get()
+ ListenableAppWidgetHost.widgetHolderExecutor.submit {}.get()
assertTrue(widgetHolder.shouldListen(widgetHolder.mFlags.get()))
}
@@ -117,7 +117,7 @@ class LauncherWidgetHolderTest {
@Test
fun holder_add_provider_change_listener() {
- val listener = LauncherWidgetHolder.ProviderChangedListener {}
+ val listener = ListenableAppWidgetHost.ProviderChangedListener {}
widgetHolder.addProviderChangeListener(listener)
getInstrumentation().waitForIdleSync()
assertEquals(1, widgetHolder.mProviderChangedListeners.size)
@@ -127,7 +127,7 @@ class LauncherWidgetHolderTest {
@Test
fun holder_remove_provider_change_listener() {
- val listener = LauncherWidgetHolder.ProviderChangedListener {}
+ val listener = ListenableAppWidgetHost.ProviderChangedListener {}
widgetHolder.addProviderChangeListener(listener)
widgetHolder.removeProviderChangeListener(listener)
getInstrumentation().waitForIdleSync()
@@ -139,7 +139,7 @@ class LauncherWidgetHolderTest {
widgetHolder.setListeningFlag(true)
assertTrue(widgetHolder.isListening)
widgetHolder.stopListening()
- widgetHolder.widgetHolderExecutor.submit {}.get()
+ ListenableAppWidgetHost.widgetHolderExecutor.submit {}.get()
assertFalse(widgetHolder.isListening)
}
diff --git a/tests/src/com/android/launcher3/model/GridMigrationTest.kt b/tests/src/com/android/launcher3/model/GridMigrationTest.kt
index 380c2089da..eed373f23a 100644
--- a/tests/src/com/android/launcher3/model/GridMigrationTest.kt
+++ b/tests/src/com/android/launcher3/model/GridMigrationTest.kt
@@ -22,6 +22,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import androidx.test.platform.app.InstrumentationRegistry
import com.android.launcher3.Flags
+import com.android.launcher3.GridType.Companion.GRID_TYPE_ANY
import com.android.launcher3.InvariantDeviceProfile.TYPE_PHONE
import com.android.launcher3.LauncherSettings.Favorites.TABLE_NAME
import com.android.launcher3.celllayout.board.CellLayoutBoard
@@ -192,15 +193,22 @@ class GridMigrationTest {
@Test
fun `5x5 to 3x3`() =
runTest(
- src = GridMigrationData(DB_FILE, DeviceGridState(5, 5, 5, TYPE_PHONE, DB_FILE)),
+ src =
+ GridMigrationData(
+ DB_FILE,
+ DeviceGridState(5, 5, 5, TYPE_PHONE, DB_FILE, GRID_TYPE_ANY),
+ ),
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(3, 3, 3, TYPE_PHONE, ""),
+ DeviceGridState(3, 3, 3, TYPE_PHONE, "", GRID_TYPE_ANY),
),
target =
- GridMigrationData("result5x5to3x3.db", DeviceGridState(3, 3, 3, TYPE_PHONE, "")),
+ GridMigrationData(
+ "result5x5to3x3.db",
+ DeviceGridState(3, 3, 3, TYPE_PHONE, "", GRID_TYPE_ANY),
+ ),
)
@JvmField
@@ -215,15 +223,22 @@ class GridMigrationTest {
@Test
fun `5x5 to 4x7`() =
runTest(
- src = GridMigrationData(DB_FILE, DeviceGridState(5, 5, 5, TYPE_PHONE, DB_FILE)),
+ src =
+ GridMigrationData(
+ DB_FILE,
+ DeviceGridState(5, 5, 5, TYPE_PHONE, DB_FILE, GRID_TYPE_ANY),
+ ),
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(4, 7, 4, TYPE_PHONE, ""),
+ DeviceGridState(4, 7, 4, TYPE_PHONE, "", GRID_TYPE_ANY),
),
target =
- GridMigrationData("result5x5to4x7.db", DeviceGridState(4, 7, 4, TYPE_PHONE, "")),
+ GridMigrationData(
+ "result5x5to4x7.db",
+ DeviceGridState(4, 7, 4, TYPE_PHONE, "", GRID_TYPE_ANY),
+ ),
)
@JvmField
@@ -238,16 +253,23 @@ class GridMigrationTest {
@Test
fun `5x5 to 5x8`() =
runTest(
- src = GridMigrationData(DB_FILE, DeviceGridState(5, 5, 5, TYPE_PHONE, DB_FILE)),
+ src =
+ GridMigrationData(
+ DB_FILE,
+ DeviceGridState(5, 5, 5, TYPE_PHONE, DB_FILE, GRID_TYPE_ANY),
+ ),
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, ""),
+ DeviceGridState(5, 8, 5, TYPE_PHONE, "", GRID_TYPE_ANY),
),
target =
- GridMigrationData("result5x5to5x8.db", DeviceGridState(5, 8, 5, TYPE_PHONE, "")),
+ GridMigrationData(
+ "result5x5to5x8.db",
+ DeviceGridState(5, 8, 5, TYPE_PHONE, "", GRID_TYPE_ANY),
+ ),
)
companion object {
diff --git a/tests/src/com/android/launcher3/model/LoaderTaskTest.kt b/tests/src/com/android/launcher3/model/LoaderTaskTest.kt
index 560d306244..f9c4a1704e 100644
--- a/tests/src/com/android/launcher3/model/LoaderTaskTest.kt
+++ b/tests/src/com/android/launcher3/model/LoaderTaskTest.kt
@@ -466,8 +466,7 @@ class LoaderTaskTest {
@Test
@EnableFlags(Flags.FLAG_RESTORE_ARCHIVED_APP_ICONS_FROM_DB)
- fun `When flag on then archived AllApps icons found on Workspace loaded from db`() {
- // Given
+ fun `When flag on and restore then archived AllApps icons on Workspace load from db`() {
// Given
val activityInfo: LauncherActivityInfo = mock()
val applicationInfo: ApplicationInfo = mock<ApplicationInfo>().apply { isArchived = true }
@@ -490,7 +489,12 @@ class LoaderTaskTest {
val loader =
testComponent.getLoaderTaskFactory().newLoaderTask(launcherBinder, userManagerState)
val actualIconRequest =
- loader.getAppInfoIconRequestInfo(expectedAppInfo, activityInfo, workspaceIconRequests)
+ loader.getAppInfoIconRequestInfo(
+ expectedAppInfo,
+ activityInfo,
+ workspaceIconRequests,
+ /* isRestoreFromBackup */ true,
+ )
// Then
assertThat(actualIconRequest.iconBlob).isEqualTo(expectedIconBlob)
assertThat(actualIconRequest.itemInfo).isEqualTo(expectedAppInfo)
@@ -498,7 +502,43 @@ class LoaderTaskTest {
@Test
@EnableFlags(Flags.FLAG_RESTORE_ARCHIVED_APP_ICONS_FROM_DB)
- fun `When flag on then unarchived AllApps icons not loaded from db`() {
+ fun `When flag on and not restore then archived AllApps icons do not load from db`() {
+ // Given
+ val activityInfo: LauncherActivityInfo = mock()
+ val applicationInfo: ApplicationInfo = mock<ApplicationInfo>().apply { isArchived = true }
+ whenever(activityInfo.applicationInfo).thenReturn(applicationInfo)
+ val expectedIconBlob = byteArrayOf(0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08)
+ val expectedComponent = ComponentName("package", "class")
+ val workspaceIconRequests =
+ listOf(
+ IconRequestInfo<WorkspaceItemInfo>(
+ WorkspaceItemInfo().apply {
+ intent = Intent().apply { component = expectedComponent }
+ },
+ activityInfo,
+ expectedIconBlob,
+ false, /* useLowResIcon */
+ )
+ )
+ val expectedAppInfo = AppInfo().apply { componentName = expectedComponent }
+ // When
+ val loader =
+ testComponent.getLoaderTaskFactory().newLoaderTask(launcherBinder, userManagerState)
+ val actualIconRequest =
+ loader.getAppInfoIconRequestInfo(
+ expectedAppInfo,
+ activityInfo,
+ workspaceIconRequests,
+ /* isRestoreFromBackup */ false,
+ )
+ // Then
+ assertThat(actualIconRequest.iconBlob).isNull()
+ assertThat(actualIconRequest.itemInfo).isEqualTo(expectedAppInfo)
+ }
+
+ @Test
+ @EnableFlags(Flags.FLAG_RESTORE_ARCHIVED_APP_ICONS_FROM_DB)
+ fun `When flag on and restore then unarchived AllApps icons not loaded from db`() {
// Given
val activityInfo: LauncherActivityInfo = mock()
val applicationInfo: ApplicationInfo = mock<ApplicationInfo>().apply { isArchived = false }
@@ -521,7 +561,12 @@ class LoaderTaskTest {
val loader =
testComponent.getLoaderTaskFactory().newLoaderTask(launcherBinder, userManagerState)
val actualIconRequest =
- loader.getAppInfoIconRequestInfo(expectedAppInfo, activityInfo, workspaceIconRequests)
+ loader.getAppInfoIconRequestInfo(
+ expectedAppInfo,
+ activityInfo,
+ workspaceIconRequests,
+ /* isRestoreFromBackup */ true,
+ )
// Then
assertThat(actualIconRequest.iconBlob).isNull()
assertThat(actualIconRequest.itemInfo).isEqualTo(expectedAppInfo)
@@ -529,7 +574,7 @@ class LoaderTaskTest {
@Test
@EnableFlags(Flags.FLAG_RESTORE_ARCHIVED_APP_ICONS_FROM_DB)
- fun `When flag on then archived AllApps icon not found on Workspace not loaded from db`() {
+ fun `When flag on and restore then all apps icon not on workspace is not loaded from db`() {
// Given
val activityInfo: LauncherActivityInfo = mock()
val applicationInfo: ApplicationInfo = mock<ApplicationInfo>().apply { isArchived = true }
@@ -553,7 +598,12 @@ class LoaderTaskTest {
val loader =
testComponent.getLoaderTaskFactory().newLoaderTask(launcherBinder, userManagerState)
val actualIconRequest =
- loader.getAppInfoIconRequestInfo(expectedAppInfo, activityInfo, workspaceIconRequests)
+ loader.getAppInfoIconRequestInfo(
+ expectedAppInfo,
+ activityInfo,
+ workspaceIconRequests,
+ /* isRestoreFromBackup */ true,
+ )
// Then
assertThat(actualIconRequest.iconBlob).isNull()
assertThat(actualIconRequest.itemInfo).isEqualTo(expectedAppInfo)
@@ -561,7 +611,7 @@ class LoaderTaskTest {
@Test
@DisableFlags(Flags.FLAG_RESTORE_ARCHIVED_APP_ICONS_FROM_DB)
- fun `When flag off then archived AllApps icons not loaded from db`() {
+ fun `When flag off and restore then archived AllApps icons not loaded from db`() {
// Given
val activityInfo: LauncherActivityInfo = mock()
val applicationInfo: ApplicationInfo = mock<ApplicationInfo>().apply { isArchived = true }
@@ -581,7 +631,12 @@ class LoaderTaskTest {
val loader =
testComponent.getLoaderTaskFactory().newLoaderTask(launcherBinder, userManagerState)
val actualIconRequest =
- loader.getAppInfoIconRequestInfo(expectedAppInfo, activityInfo, workspaceIconRequests)
+ loader.getAppInfoIconRequestInfo(
+ expectedAppInfo,
+ activityInfo,
+ workspaceIconRequests,
+ /* isRestoreFromBackup */ true,
+ )
// Then
assertThat(actualIconRequest.iconBlob).isNull()
assertThat(actualIconRequest.itemInfo).isEqualTo(expectedAppInfo)