Merge "Fix animation while hiding Desktop tasks during split" into main
diff --git a/protos/launcher_atom.proto b/protos/launcher_atom.proto
index 823c821..ce99348 100644
--- a/protos/launcher_atom.proto
+++ b/protos/launcher_atom.proto
@@ -33,6 +33,7 @@
FolderIcon folder_icon = 9;
Slice slice = 10;
SearchActionItem search_action_item = 11;
+ TaskView task_view = 15;
}
// When used for launch event, stores the global predictive rank
optional int32 rank = 5;
@@ -262,6 +263,21 @@
optional int32 index = 3;
}
+// TaskView in RecentsView.
+message TaskView {
+ // TaskViewType.
+ optional int32 type = 1;
+
+ // Index of TaskView in RecentsView.
+ optional int32 index = 2;
+
+ // ComponentName of the Task.
+ optional string component_name = 3;
+
+ // Number of tasks in the TaskView.
+ optional int32 cardinality = 4;
+}
+
// Represents folder in a closed state.
message FolderIcon {
// Number of items inside folder.
diff --git a/quickstep/res/layout/task_desktop.xml b/quickstep/res/layout/task_desktop.xml
index 0472007..5270284 100644
--- a/quickstep/res/layout/task_desktop.xml
+++ b/quickstep/res/layout/task_desktop.xml
@@ -24,10 +24,6 @@
android:focusable="true"
launcher:focusBorderColor="?attr/materialColorOutline"
launcher:hoverBorderColor="?attr/materialColorPrimary">
- <View
- android:id="@+id/background"
- android:layout_width="match_parent"
- android:layout_height="match_parent" />
<ViewStub
android:id="@+id/icon"
@@ -38,6 +34,13 @@
<com.android.quickstep.views.DesktopTaskContentView
android:id="@+id/desktop_content"
android:layout_width="match_parent"
- android:layout_height="match_parent" />
+ android:layout_height="match_parent">
+
+ <View
+ android:id="@+id/background"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
+
+ </com.android.quickstep.views.DesktopTaskContentView>
</com.android.quickstep.views.DesktopTaskView>
diff --git a/quickstep/res/values-tr/strings.xml b/quickstep/res/values-tr/strings.xml
index c50c1f8..6a0b78f 100644
--- a/quickstep/res/values-tr/strings.xml
+++ b/quickstep/res/values-tr/strings.xml
@@ -89,7 +89,7 @@
<string name="gesture_tutorial_try_again" msgid="65962545858556697">"Tekrar deneyin"</string>
<string name="gesture_tutorial_nice" msgid="2936275692616928280">"Güzel!"</string>
<string name="gesture_tutorial_step" msgid="1279786122817620968">"Eğitim <xliff:g id="CURRENT">%1$d</xliff:g>/<xliff:g id="TOTAL">%2$d</xliff:g>"</string>
- <string name="allset_title" msgid="5021126669778966707">"İşlem tamam!"</string>
+ <string name="allset_title" msgid="5021126669778966707">"Kurulum tamamlandı"</string>
<string name="allset_hint" msgid="459504134589971527">"Ana ekrana gitmek için yukarı kaydırın"</string>
<string name="allset_button_hint" msgid="2395219947744706291">"Ana ekranınıza gitmek için ana sayfa düğmesine dokunun"</string>
<string name="allset_description_generic" msgid="5385500062202019855">"<xliff:g id="DEVICE">%1$s</xliff:g> adlı cihazınızı kullanmaya hazırsınız"</string>
diff --git a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java
index e624be7..7d193aa 100644
--- a/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java
+++ b/quickstep/src/com/android/launcher3/QuickstepTransitionManager.java
@@ -19,6 +19,7 @@
import static android.app.WindowConfiguration.ACTIVITY_TYPE_HOME;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD;
import static android.app.WindowConfiguration.WINDOWING_MODE_MULTI_WINDOW;
+import static android.app.role.RoleManager.ROLE_HOME;
import static android.provider.Settings.Secure.LAUNCHER_TASKBAR_EDUCATION_SHOWING;
import static android.view.RemoteAnimationTarget.MODE_CLOSING;
import static android.view.RemoteAnimationTarget.MODE_OPENING;
@@ -74,6 +75,7 @@
import android.animation.ValueAnimator;
import android.app.ActivityOptions;
import android.app.WindowConfiguration;
+import android.app.role.RoleManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.res.Resources;
@@ -1194,7 +1196,9 @@
.registerRemoteTransition(mLauncherOpenTransition, homeCheck);
if (mBackAnimationController != null) {
mBackAnimationController.registerComponentCallbacks();
- mBackAnimationController.registerBackCallbacks(mHandler);
+ if (isHomeRoleHeld()) {
+ mBackAnimationController.registerBackCallbacks(mHandler);
+ }
}
}
@@ -1207,6 +1211,22 @@
.unregisterContentObserver(mAnimationRemovalObserver));
}
+ /**
+ * Called when the overview-target changes. Updates the back callback registration state.
+ */
+ public void onOverviewTargetChange() {
+ if (isHomeRoleHeld()) {
+ mBackAnimationController.registerBackCallbacks(mHandler);
+ } else {
+ mBackAnimationController.unregisterBackCallbacks();
+ }
+ }
+
+ private boolean isHomeRoleHeld() {
+ RoleManager roleManager = mLauncher.getSystemService(RoleManager.class);
+ return roleManager == null || roleManager.isRoleHeld(ROLE_HOME);
+ }
+
private void unregisterRemoteAnimations() {
if (SEPARATE_RECENTS_ACTIVITY.get()) {
return;
diff --git a/quickstep/src/com/android/launcher3/model/data/TaskViewItemInfo.kt b/quickstep/src/com/android/launcher3/model/data/TaskViewItemInfo.kt
new file mode 100644
index 0000000..ee28d7a
--- /dev/null
+++ b/quickstep/src/com/android/launcher3/model/data/TaskViewItemInfo.kt
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.launcher3.model.data
+
+import android.content.Context
+import android.content.Intent
+import androidx.annotation.VisibleForTesting
+import androidx.annotation.VisibleForTesting.Companion.PRIVATE
+import com.android.launcher3.Flags.privateSpaceRestrictAccessibilityDrag
+import com.android.launcher3.LauncherSettings
+import com.android.launcher3.logger.LauncherAtom
+import com.android.launcher3.pm.UserCache
+import com.android.quickstep.TaskUtils
+import com.android.quickstep.views.TaskContainer
+
+class TaskViewItemInfo(taskContainer: TaskContainer) : WorkspaceItemInfo() {
+ @VisibleForTesting(otherwise = PRIVATE) val taskViewAtom: LauncherAtom.TaskView
+
+ init {
+ itemType = LauncherSettings.Favorites.ITEM_TYPE_TASK
+ container = LauncherSettings.Favorites.CONTAINER_TASKSWITCHER
+ val componentKey = TaskUtils.getLaunchComponentKeyForTask(taskContainer.task.key)
+ user = componentKey.user
+ intent = Intent().setComponent(componentKey.componentName)
+ title = taskContainer.task.title
+ if (privateSpaceRestrictAccessibilityDrag()) {
+ if (
+ UserCache.getInstance(taskContainer.taskView.context)
+ .getUserInfo(componentKey.user)
+ .isPrivate
+ ) {
+ runtimeStatusFlags = runtimeStatusFlags or ItemInfoWithIcon.FLAG_NOT_PINNABLE
+ }
+ }
+
+ taskViewAtom =
+ createTaskViewAtom(
+ type = taskContainer.taskView.type.ordinal,
+ index =
+ taskContainer.taskView.recentsView?.indexOfChild(taskContainer.taskView) ?: -1,
+ componentName = componentKey.componentName.flattenToShortString(),
+ cardinality = taskContainer.taskView.taskContainers.size,
+ )
+ }
+
+ override fun buildProto(cInfo: CollectionInfo?, context: Context): LauncherAtom.ItemInfo =
+ super.buildProto(cInfo, context).toBuilder().setTaskView(taskViewAtom).build()
+
+ companion object {
+ @VisibleForTesting(otherwise = PRIVATE)
+ fun createTaskViewAtom(
+ type: Int,
+ index: Int,
+ componentName: String,
+ cardinality: Int,
+ ): LauncherAtom.TaskView =
+ LauncherAtom.TaskView.newBuilder()
+ .apply {
+ this.type = type
+ this.index = index
+ this.componentName = componentName
+ this.cardinality = cardinality
+ }
+ .build()
+ }
+}
diff --git a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchController.java b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchController.java
index 3b7ad3e..de42669 100644
--- a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchController.java
@@ -299,10 +299,6 @@
return;
}
mQuickSwitchViewController.closeQuickSwitchView(animate);
- if (mOnClosed != null) {
- mOnClosed.run();
- mOnClosed = null;
- }
}
/**
@@ -394,6 +390,13 @@
});
}
+ void onCloseStarted() {
+ if (mOnClosed != null) {
+ mOnClosed.run();
+ mOnClosed = null;
+ }
+ }
+
void onCloseComplete() {
if (Flags.taskbarOverflow() && mOverlayContext != null) {
mOverlayContext.getDragLayer()
diff --git a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchViewController.java b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchViewController.java
index 985cc26..e623b21 100644
--- a/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchViewController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/KeyboardQuickSwitchViewController.java
@@ -198,6 +198,7 @@
// Let currently-running animation finish.
return;
}
+ mControllerCallbacks.onCloseStarted();
if (!animate) {
InteractionJankMonitorWrapper.begin(
mKeyboardQuickSwitchView, Cuj.CUJ_LAUNCHER_KEYBOARD_QUICK_SWITCH_CLOSE);
diff --git a/quickstep/src/com/android/launcher3/taskbar/ManageWindowsTaskbarShortcut.kt b/quickstep/src/com/android/launcher3/taskbar/ManageWindowsTaskbarShortcut.kt
index c0c2a02..aaa4044 100644
--- a/quickstep/src/com/android/launcher3/taskbar/ManageWindowsTaskbarShortcut.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/ManageWindowsTaskbarShortcut.kt
@@ -34,7 +34,7 @@
import com.android.quickstep.SystemUiProxy
import com.android.quickstep.util.GroupTask
import com.android.systemui.shared.recents.model.ThumbnailData
-import com.android.wm.shell.shared.desktopmode.ManageWindowsViewContainer
+import com.android.wm.shell.shared.multiinstance.ManageWindowsViewContainer
import java.util.Collections
import java.util.function.Predicate
@@ -46,7 +46,7 @@
class ManageWindowsTaskbarShortcut<T>(
private val target: T,
private val itemInfo: ItemInfo?,
- private val originalView: View?,
+ private val originalView: View,
private val controllers: TaskbarControllers,
) :
SystemShortcut<T>(
@@ -123,13 +123,29 @@
taskbarShortcutAllWindowsView =
TaskbarShortcutManageWindowsView(
- originalView!!,
+ originalView,
controllers.taskbarOverlayController.requestWindow(),
taskList,
onIconClickListener,
onOutsideClickListener,
controllers,
)
+
+ // If the view is removed from elsewhere, reset the state to allow the taskbar to auto-stash
+ taskbarShortcutAllWindowsView.menuView.rootView.addOnAttachStateChangeListener(
+ object : View.OnAttachStateChangeListener {
+ override fun onViewAttachedToWindow(v: View) {
+ return
+ }
+
+ override fun onViewDetachedFromWindow(v: View) {
+ controllers.taskbarAutohideSuspendController.updateFlag(
+ FLAG_AUTOHIDE_SUSPEND_MULTI_INSTANCE_MENU_OPEN,
+ false,
+ )
+ }
+ }
+ )
}
/**
@@ -160,7 +176,7 @@
/** Adds the carousel menu to the taskbar overlay drag layer */
override fun addToContainer(menuView: ManageWindowsView) {
- taskbarOverlayContext.dragLayer.post { positionCarouselMenu() }
+ positionCarouselMenu()
controllers.taskbarAutohideSuspendController.updateFlag(
FLAG_AUTOHIDE_SUSPEND_MULTI_INSTANCE_MENU_OPEN,
@@ -184,28 +200,28 @@
* align with the calling app while ensuring it doesn't go beyond the screen edge.
*/
private fun positionCarouselMenu() {
+ val deviceProfile = taskbarActivityContext.deviceProfile
val margin =
context.resources.getDimension(
R.dimen.taskbar_multi_instance_menu_min_padding_from_screen_edge
)
// Calculate the Y position to place the carousel above the taskbar
- val availableHeight = taskbarOverlayContext.dragLayer.height
menuView.rootView.y =
- availableHeight -
+ deviceProfile.availableHeightPx -
menuView.menuHeight -
controllers.taskbarStashController.touchableHeight -
margin
// Calculate the X position to align with the calling app,
// but avoid clashing with the screen edge
- val availableWidth = taskbarOverlayContext.dragLayer.width
- if (Utilities.isRtl(context.resources)) {
- menuView.rootView.translationX = -(availableWidth - menuView.menuWidth) / 2f
- } else {
- val maxX = availableWidth - menuView.menuWidth - margin
- menuView.rootView.translationX = minOf(originalView.x, maxX)
- }
+ menuView.rootView.translationX =
+ if (Utilities.isRtl(context.resources)) {
+ -(deviceProfile.availableWidthPx - menuView.menuWidth) / 2f
+ } else {
+ val maxX = deviceProfile.availableWidthPx - menuView.menuWidth - margin
+ minOf(originalView.x, maxX)
+ }
}
/** Closes the carousel menu and removes it from the taskbar overlay drag layer */
@@ -214,7 +230,6 @@
FLAG_AUTOHIDE_SUSPEND_MULTI_INSTANCE_MENU_OPEN,
false,
)
- controllers.taskbarStashController.updateAndAnimateTransientTaskbar(true)
taskbarOverlayContext.dragLayer?.removeView(menuView.rootView)
taskbarOverlayContext.dragLayer.removeTouchController(this)
}
@@ -227,8 +242,8 @@
override fun onControllerInterceptTouchEvent(ev: MotionEvent?): Boolean {
ev?.let {
if (
- ev.action == MotionEvent.ACTION_DOWN &&
- !taskbarOverlayContext.dragLayer.isEventOverView(menuView.rootView, ev)
+ it.action == MotionEvent.ACTION_DOWN &&
+ !taskbarOverlayContext.dragLayer.isEventOverView(menuView.rootView, it)
) {
removeFromContainer()
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java
index f9e7cf0..f346e19 100644
--- a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java
@@ -66,6 +66,7 @@
import android.graphics.Color;
import android.graphics.Point;
import android.graphics.Rect;
+import android.graphics.RectF;
import android.graphics.Region;
import android.graphics.Region.Op;
import android.graphics.drawable.Drawable;
@@ -75,6 +76,7 @@
import android.os.Handler;
import android.util.Property;
import android.view.Gravity;
+import android.view.HapticFeedbackConstants;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
@@ -862,15 +864,21 @@
private void setBackButtonTouchListener(View buttonView,
TaskbarNavButtonController navButtonController) {
+ final RectF rect = new RectF();
buttonView.setOnTouchListener((v, event) -> {
- if (event.getAction() == MotionEvent.ACTION_MOVE) return false;
+ if (event.getAction() == MotionEvent.ACTION_DOWN) {
+ rect.set(0, 0, v.getWidth(), v.getHeight());
+ }
+ boolean isCancelled = event.getAction() == MotionEvent.ACTION_CANCEL
+ || !rect.contains(event.getX(), event.getY());
+ if (event.getAction() == MotionEvent.ACTION_MOVE && !isCancelled) return false;
int motionEventAction = event.getAction();
int keyEventAction = motionEventAction == MotionEvent.ACTION_DOWN
? KeyEvent.ACTION_DOWN : ACTION_UP;
- boolean isCancelled = event.getAction() == MotionEvent.ACTION_CANCEL;
navButtonController.sendBackKeyEvent(keyEventAction, isCancelled);
- if (motionEventAction == MotionEvent.ACTION_UP) {
+ if (motionEventAction == MotionEvent.ACTION_UP && !isCancelled) {
buttonView.performClick();
+ buttonView.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);
}
return false;
});
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java
index dce377d..2db7961 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarLauncherStateController.java
@@ -40,6 +40,7 @@
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
+import android.content.Context;
import android.os.SystemClock;
import android.util.Log;
import android.view.animation.Interpolator;
@@ -475,7 +476,7 @@
}
mControllers.bubbleControllers.ifPresent(controllers -> {
// Show the bubble bar when on launcher home (hotseat icons visible) or in overview
- boolean onOverview = mLauncherState == LauncherState.OVERVIEW;
+ boolean onOverview = isInLauncher && mLauncherState == LauncherState.OVERVIEW;
boolean hotseatIconsVisible = isInLauncher && mLauncherState.areElementsVisible(
mLauncher, HOTSEAT_ICONS);
BubbleLauncherState state = onOverview
@@ -581,7 +582,7 @@
float backgroundAlpha = isInLauncher && isTaskbarAlignedWithHotseat() ? 0 : 1;
AnimatedFloat taskbarBgOffset =
mControllers.taskbarDragLayerController.getTaskbarBackgroundOffset();
- boolean showTaskbar = !isInLauncher || isInOverview;
+ boolean showTaskbar = shouldShowTaskbar(mLauncher, isInLauncher, isInOverview);
float taskbarBgOffsetEnd = showTaskbar ? 0f : 1f;
float taskbarBgOffsetStart = showTaskbar ? 1f : 0f;
@@ -714,6 +715,14 @@
return animatorSet;
}
+ private static boolean shouldShowTaskbar(Context context, boolean isInLauncher,
+ boolean isInOverview) {
+ if (DisplayController.showLockedTaskbarOnHome(context) && isInLauncher) {
+ return true;
+ }
+ return !isInLauncher || isInOverview;
+ }
+
private void setupPinnedTaskbarAnimation(AnimatorSet animatorSet, boolean showTaskbar,
AnimatedFloat taskbarBgOffset, float taskbarBgOffsetStart, float taskbarBgOffsetEnd,
long duration, Animator taskbarBackgroundAlpha) {
@@ -1009,12 +1018,7 @@
@Override
public void onRecentsAnimationFinished(RecentsAnimationController controller) {
- endGestureStateOverride(!controller.getFinishTargetIsLauncher(),
- controller.getLauncherIsVisibleAtFinish(), false /*canceled*/);
- }
-
- private void endGestureStateOverride(boolean finishedToApp, boolean canceled) {
- endGestureStateOverride(finishedToApp, finishedToApp, canceled);
+ endGestureStateOverride(!controller.getFinishTargetIsLauncher(), false /*canceled*/);
}
/**
@@ -1024,13 +1028,11 @@
*
* @param finishedToApp {@code true} if the recents animation finished to showing an app and
* not workspace or overview
- * @param launcherIsVisible {code true} if launcher is visible at finish
* @param canceled {@code true} if the recents animation was canceled instead of
* finishing
* to completion
*/
- private void endGestureStateOverride(boolean finishedToApp, boolean launcherIsVisible,
- boolean canceled) {
+ private void endGestureStateOverride(boolean finishedToApp, boolean canceled) {
mCallbacks.removeListener(this);
mTaskBarRecentsAnimationListener = null;
((RecentsView) mLauncher.getOverviewPanel()).setTaskLaunchListener(null);
@@ -1039,27 +1041,18 @@
mSkipNextRecentsAnimEnd = false;
return;
}
- updateStateForUserFinishedToApp(finishedToApp, launcherIsVisible);
+ updateStateForUserFinishedToApp(finishedToApp);
}
}
/**
- * @see #updateStateForUserFinishedToApp(boolean, boolean)
- */
- private void updateStateForUserFinishedToApp(boolean finishedToApp) {
- updateStateForUserFinishedToApp(finishedToApp, !finishedToApp);
- }
-
- /**
* Updates the visible state immediately to ensure a seamless handoff.
*
* @param finishedToApp True iff user is in an app.
- * @param launcherIsVisible True iff launcher is still visible (ie. transparent app)
*/
- private void updateStateForUserFinishedToApp(boolean finishedToApp,
- boolean launcherIsVisible) {
+ private void updateStateForUserFinishedToApp(boolean finishedToApp) {
// Update the visible state immediately to ensure a seamless handoff
- boolean launcherVisible = !finishedToApp || launcherIsVisible;
+ boolean launcherVisible = !finishedToApp;
updateStateForFlag(FLAG_TRANSITION_TO_VISIBLE, false);
updateStateForFlag(FLAG_VISIBLE, launcherVisible);
applyState();
@@ -1068,7 +1061,7 @@
if (DEBUG) {
Log.d(TAG, "endGestureStateOverride - FLAG_IN_APP: " + finishedToApp);
}
- controller.updateStateForFlag(FLAG_IN_APP, finishedToApp && !launcherIsVisible);
+ controller.updateStateForFlag(FLAG_IN_APP, finishedToApp);
controller.applyState();
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
index 7ab9ef3..4498fea 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
@@ -46,6 +46,7 @@
import android.os.Trace;
import android.provider.Settings;
import android.util.Log;
+import android.util.SparseArray;
import android.view.Display;
import android.view.MotionEvent;
import android.view.WindowManager;
@@ -115,13 +116,12 @@
private final Context mContext;
private final @Nullable Context mNavigationBarPanelContext;
private WindowManager mWindowManager;
- private FrameLayout mTaskbarRootLayout;
private boolean mAddedWindow;
- private final TaskbarNavButtonController mNavButtonController;
- private final ComponentCallbacks mComponentCallbacks;
+ private final TaskbarNavButtonController mDefaultNavButtonController;
+ private final ComponentCallbacks mDefaultComponentCallbacks;
private final SimpleBroadcastReceiver mShutdownReceiver =
- new SimpleBroadcastReceiver(UI_HELPER_EXECUTOR, i -> destroyExistingTaskbar());
+ new SimpleBroadcastReceiver(UI_HELPER_EXECUTOR, i -> destroyAllTaskbars());
// The source for this provider is set when Launcher is available
// We use 'non-destroyable' version here so the original provider won't be destroyed
@@ -129,8 +129,10 @@
// It's destruction/creation will be managed by the activity.
private final ScopedUnfoldTransitionProgressProvider mUnfoldProgressProvider =
new NonDestroyableScopedUnfoldTransitionProgressProvider();
-
- private TaskbarActivityContext mTaskbarActivityContext;
+ /** DisplayId - {@link TaskbarActivityContext} map for Connected Display. */
+ private final SparseArray<TaskbarActivityContext> mTaskbars = new SparseArray<>();
+ /** DisplayId - {@link FrameLayout} map for Connected Display. */
+ private final SparseArray<FrameLayout> mRootLayouts = new SparseArray<>();
private StatefulActivity mActivity;
private RecentsViewContainer mRecentsViewContainer;
@@ -167,7 +169,9 @@
private final Runnable mActivityOnDestroyCallback = new Runnable() {
@Override
public void run() {
+ int displayId = getDefaultDisplayId();
if (mActivity != null) {
+ displayId = mActivity.getDisplayId();
mActivity.removeOnDeviceProfileChangeListener(
mDebugActivityDeviceProfileChanged);
Log.d(TASKBAR_NOT_DESTROYED_TAG,
@@ -180,8 +184,9 @@
}
mActivity = null;
debugWhyTaskbarNotDestroyed("clearActivity");
- if (mTaskbarActivityContext != null) {
- mTaskbarActivityContext.setUIController(TaskbarUIController.DEFAULT);
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(displayId);
+ if (taskbar != null) {
+ taskbar.setUIController(TaskbarUIController.DEFAULT);
}
mUnfoldProgressProvider.setSourceProvider(null);
}
@@ -236,27 +241,28 @@
mDesktopVisibilityController = desktopVisibilityController;
if (enableTaskbarNoRecreate()) {
mWindowManager = mContext.getSystemService(WindowManager.class);
- mTaskbarRootLayout = new FrameLayout(mContext) {
+ FrameLayout taskbarRootLayout = new FrameLayout(mContext) {
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
// The motion events can be outside the view bounds of task bar, and hence
// manually dispatching them to the drag layer here.
- if (mTaskbarActivityContext != null
- && mTaskbarActivityContext.getDragLayer().isAttachedToWindow()) {
- return mTaskbarActivityContext.getDragLayer().dispatchTouchEvent(ev);
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(getDefaultDisplayId());
+ if (taskbar != null && taskbar.getDragLayer().isAttachedToWindow()) {
+ return taskbar.getDragLayer().dispatchTouchEvent(ev);
}
return super.dispatchTouchEvent(ev);
}
};
+ addTaskbarRootLayoutToMap(getDefaultDisplayId(), taskbarRootLayout);
}
- mNavButtonController = new TaskbarNavButtonController(
+ mDefaultNavButtonController = new TaskbarNavButtonController(
context,
navCallbacks,
SystemUiProxy.INSTANCE.get(mContext),
ContextualEduStatsManager.INSTANCE.get(mContext),
new Handler(),
ContextualSearchInvoker.newInstance(mContext));
- mComponentCallbacks = new ComponentCallbacks() {
+ mDefaultComponentCallbacks = new ComponentCallbacks() {
private Configuration mOldConfig = mContext.getResources().getConfiguration();
@Override
@@ -265,6 +271,7 @@
"onConfigurationChanged: " + newConfig);
debugWhyTaskbarNotDestroyed(
"TaskbarManager#mComponentCallbacks.onConfigurationChanged: " + newConfig);
+ // TODO: adapt this logic to be specific to different displays.
DeviceProfile dp = mUserUnlocked
? LauncherAppState.getIDP(mContext).getDeviceProfile(mContext)
: null;
@@ -281,12 +288,12 @@
debugWhyTaskbarNotDestroyed("ComponentCallbacks#onConfigurationChanged() "
+ "configDiff=" + Configuration.configurationDiffToString(configDiff));
- if (configDiff != 0 || mTaskbarActivityContext == null) {
+ if (configDiff != 0 || getCurrentActivityContext() == null) {
recreateTaskbar();
} else {
// Config change might be handled without re-creating the taskbar
if (dp != null && !isTaskbarEnabled(dp)) {
- destroyExistingTaskbar();
+ destroyDefaultTaskbar();
} else {
if (dp != null && isTaskbarEnabled(dp)) {
if (ENABLE_TASKBAR_NAVBAR_UNIFICATION) {
@@ -295,10 +302,10 @@
// block above?
recreateTaskbar();
} else {
- mTaskbarActivityContext.updateDeviceProfile(dp);
+ getCurrentActivityContext().updateDeviceProfile(dp);
}
}
- mTaskbarActivityContext.onConfigurationChanged(configDiff);
+ getCurrentActivityContext().onConfigurationChanged(configDiff);
}
}
mOldConfig = new Configuration(newConfig);
@@ -315,7 +322,7 @@
SettingsCache.INSTANCE.get(mContext)
.register(NAV_BAR_KIDS_MODE, mOnSettingsChangeListener);
Log.d(TASKBAR_NOT_DESTROYED_TAG, "registering component callbacks from constructor.");
- mContext.registerComponentCallbacks(mComponentCallbacks);
+ mContext.registerComponentCallbacks(mDefaultComponentCallbacks);
mShutdownReceiver.register(mContext, Intent.ACTION_SHUTDOWN);
UI_HELPER_EXECUTOR.execute(() -> {
mSharedState.taskbarSystemActionPendingIntent = PendingIntent.getBroadcast(
@@ -331,18 +338,31 @@
recreateTaskbar();
}
- private void destroyExistingTaskbar() {
- debugWhyTaskbarNotDestroyed("destroyExistingTaskbar: " + mTaskbarActivityContext);
- if (mTaskbarActivityContext != null) {
- mTaskbarActivityContext.onDestroy();
- if (!ENABLE_TASKBAR_NAVBAR_UNIFICATION || enableTaskbarNoRecreate()) {
- mTaskbarActivityContext = null;
- }
+ private void destroyAllTaskbars() {
+ for (int i = 0; i < mTaskbars.size(); i++) {
+ int displayId = mTaskbars.keyAt(i);
+ destroyTaskbarForDisplay(displayId);
+ removeTaskbarRootViewFromWindow(displayId);
+ }
+ }
+
+ private void destroyDefaultTaskbar() {
+ destroyTaskbarForDisplay(getDefaultDisplayId());
+ }
+
+ private void destroyTaskbarForDisplay(int displayId) {
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(displayId);
+ debugWhyTaskbarNotDestroyed(
+ "destroyTaskbarForDisplay: " + taskbar + " displayId=" + displayId);
+ if (taskbar != null) {
+ taskbar.onDestroy();
+ // remove all defaults that we store
+ removeTaskbarFromMap(displayId);
}
DeviceProfile dp = mUserUnlocked ?
LauncherAppState.getIDP(mContext).getDeviceProfile(mContext) : null;
if (dp == null || !isTaskbarEnabled(dp)) {
- removeTaskbarRootViewFromWindow();
+ removeTaskbarRootViewFromWindow(displayId);
}
}
@@ -350,8 +370,10 @@
* Show Taskbar upon receiving broadcast
*/
private void showTaskbarFromBroadcast(Intent intent) {
- if (ACTION_SHOW_TASKBAR.equals(intent.getAction()) && mTaskbarActivityContext != null) {
- mTaskbarActivityContext.showTaskbarFromBroadcast();
+ // TODO: make this code displayId specific
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(getDefaultDisplayId());
+ if (ACTION_SHOW_TASKBAR.equals(intent.getAction()) && taskbar != null) {
+ taskbar.showTaskbarFromBroadcast();
}
}
@@ -359,12 +381,13 @@
* Toggles All Apps for Taskbar or Launcher depending on the current state.
*/
public void toggleAllApps() {
- if (mTaskbarActivityContext == null || mTaskbarActivityContext.canToggleHomeAllApps()) {
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(getDefaultDisplayId());
+ if (taskbar == null || taskbar.canToggleHomeAllApps()) {
// Home All Apps should be toggled from this class, because the controllers are not
// initialized when Taskbar is disabled (i.e. TaskbarActivityContext is null).
if (mActivity instanceof Launcher l) l.toggleAllAppsSearch();
} else {
- mTaskbarActivityContext.toggleAllAppsSearch();
+ taskbar.toggleAllAppsSearch();
}
}
@@ -375,8 +398,8 @@
* progress.
*/
public AnimatorPlaybackController createLauncherStartFromSuwAnim(int duration) {
- return mTaskbarActivityContext == null
- ? null : mTaskbarActivityContext.createLauncherStartFromSuwAnim(duration);
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(getDefaultDisplayId());
+ return taskbar == null ? null : taskbar.createLauncherStartFromSuwAnim(duration);
}
/**
@@ -386,7 +409,7 @@
mUserUnlocked = true;
DisplayController.INSTANCE.get(mContext).addChangeListener(mRecreationListener);
recreateTaskbar();
- addTaskbarRootViewToWindow();
+ addTaskbarRootViewToWindow(getDefaultDisplayId());
}
/**
@@ -429,8 +452,9 @@
mActivityOnDestroyCallback.run();
}
mRecentsViewContainer = recentsViewContainer;
- if (mTaskbarActivityContext != null) {
- mTaskbarActivityContext.setUIController(
+ TaskbarActivityContext taskbar = getCurrentActivityContext();
+ if (taskbar != null) {
+ taskbar.setUIController(
createTaskbarUIControllerForRecentsViewContainer(mRecentsViewContainer));
}
}
@@ -472,11 +496,21 @@
/**
* This method is called multiple times (ex. initial init, then when user unlocks) in which case
- * we fully want to destroy an existing taskbar and create a new one.
+ * we fully want to destroy the existing default display's taskbar and create a new one.
* In other case (folding/unfolding) we don't need to remove and add window.
*/
@VisibleForTesting
public synchronized void recreateTaskbar() {
+ // TODO: make this recreate all taskbars in map.
+ recreateTaskbarForDisplay(getDefaultDisplayId());
+ }
+
+ /**
+ * This method is called multiple times (ex. initial init, then when user unlocks) in which case
+ * we fully want to destroy an existing taskbar for a specified display and create a new one.
+ * In other case (folding/unfolding) we don't need to remove and add window.
+ */
+ private void recreateTaskbarForDisplay(int displayId) {
Trace.beginSection("recreateTaskbar");
try {
DeviceProfile dp = mUserUnlocked ?
@@ -486,7 +520,7 @@
final boolean isLargeScreenTaskbar = dp != null && dp.isTaskbarPresent;
mAllAppsActionManager.setTaskbarPresent(isLargeScreenTaskbar);
- destroyExistingTaskbar();
+ destroyTaskbarForDisplay(displayId);
boolean isTaskbarEnabled = dp != null && isTaskbarEnabled(dp);
debugWhyTaskbarNotDestroyed("recreateTaskbar: isTaskbarEnabled=" + isTaskbarEnabled
@@ -501,29 +535,32 @@
}
}
- if (enableTaskbarNoRecreate() || mTaskbarActivityContext == null) {
- mTaskbarActivityContext = new TaskbarActivityContext(mContext,
- mNavigationBarPanelContext, dp, mNavButtonController,
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(displayId);
+ if (enableTaskbarNoRecreate() || taskbar == null) {
+ taskbar = new TaskbarActivityContext(mContext,
+ mNavigationBarPanelContext, dp, mDefaultNavButtonController,
mUnfoldProgressProvider, mDesktopVisibilityController);
} else {
- mTaskbarActivityContext.updateDeviceProfile(dp);
+ taskbar.updateDeviceProfile(dp);
}
mSharedState.startTaskbarVariantIsTransient =
- DisplayController.isTransientTaskbar(mTaskbarActivityContext);
+ DisplayController.isTransientTaskbar(taskbar);
mSharedState.allAppsVisible = mSharedState.allAppsVisible && isLargeScreenTaskbar;
- mTaskbarActivityContext.init(mSharedState);
+ taskbar.init(mSharedState);
if (mRecentsViewContainer != null) {
- mTaskbarActivityContext.setUIController(
+ taskbar.setUIController(
createTaskbarUIControllerForRecentsViewContainer(mRecentsViewContainer));
}
if (enableTaskbarNoRecreate()) {
- addTaskbarRootViewToWindow();
- mTaskbarRootLayout.removeAllViews();
- mTaskbarRootLayout.addView(mTaskbarActivityContext.getDragLayer());
- mTaskbarActivityContext.notifyUpdateLayoutParams();
+ addTaskbarRootViewToWindow(displayId);
+ FrameLayout taskbarRootLayout = getTaskbarRootLayoutForDisplay(displayId);
+ taskbarRootLayout.removeAllViews();
+ taskbarRootLayout.addView(taskbar.getDragLayer());
+ taskbar.notifyUpdateLayoutParams();
}
+ addTaskbarToMap(displayId, taskbar);
} finally {
Trace.endSection();
}
@@ -535,14 +572,15 @@
mSharedState.sysuiStateFlags, QuickStepContract::getSystemUiStateString));
}
mSharedState.sysuiStateFlags = systemUiStateFlags;
- if (mTaskbarActivityContext != null) {
- mTaskbarActivityContext.updateSysuiStateFlags(systemUiStateFlags, false /* fromInit */);
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(getDefaultDisplayId());
+ if (taskbar != null) {
+ taskbar.updateSysuiStateFlags(systemUiStateFlags, false /* fromInit */);
}
}
public void onLongPressHomeEnabled(boolean assistantLongPressEnabled) {
- if (mNavButtonController != null) {
- mNavButtonController.setAssistantLongPressEnabled(assistantLongPressEnabled);
+ if (mDefaultNavButtonController != null) {
+ mDefaultNavButtonController.setAssistantLongPressEnabled(assistantLongPressEnabled);
}
}
@@ -551,46 +589,53 @@
*/
public void setSetupUIVisible(boolean isVisible) {
mSharedState.setupUIVisible = isVisible;
- if (mTaskbarActivityContext != null) {
- mTaskbarActivityContext.setSetupUIVisible(isVisible);
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(getDefaultDisplayId());
+ if (taskbar != null) {
+ taskbar.setSetupUIVisible(isVisible);
}
}
public void setWallpaperVisible(boolean isVisible) {
mSharedState.wallpaperVisible = isVisible;
- if (mTaskbarActivityContext != null) {
- mTaskbarActivityContext.setWallpaperVisible(isVisible);
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(getDefaultDisplayId());
+ if (taskbar != null) {
+ taskbar.setWallpaperVisible(isVisible);
}
}
public void checkNavBarModes(int displayId) {
- if (mTaskbarActivityContext != null) {
- mTaskbarActivityContext.checkNavBarModes();
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(displayId);
+ if (taskbar != null) {
+ taskbar.checkNavBarModes();
}
}
public void finishBarAnimations(int displayId) {
- if (mTaskbarActivityContext != null) {
- mTaskbarActivityContext.finishBarAnimations();
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(displayId);
+ if (taskbar != null) {
+ taskbar.finishBarAnimations();
}
}
public void touchAutoDim(int displayId, boolean reset) {
- if (mTaskbarActivityContext != null) {
- mTaskbarActivityContext.touchAutoDim(reset);
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(displayId);
+ if (taskbar != null) {
+ taskbar.touchAutoDim(reset);
}
}
public void transitionTo(int displayId, @BarTransitions.TransitionMode int barMode,
boolean animate) {
- if (mTaskbarActivityContext != null) {
- mTaskbarActivityContext.transitionTo(barMode, animate);
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(displayId);
+ if (taskbar != null) {
+ taskbar.transitionTo(barMode, animate);
}
}
public void appTransitionPending(boolean pending) {
- if (mTaskbarActivityContext != null) {
- mTaskbarActivityContext.appTransitionPending(pending);
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(getDefaultDisplayId());
+ if (taskbar != null) {
+ taskbar.appTransitionPending(pending);
}
}
@@ -599,8 +644,9 @@
}
public void onRotationProposal(int rotation, boolean isValid) {
- if (mTaskbarActivityContext != null) {
- mTaskbarActivityContext.onRotationProposal(rotation, isValid);
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(getDefaultDisplayId());
+ if (taskbar != null) {
+ taskbar.onRotationProposal(rotation, isValid);
}
}
@@ -608,38 +654,43 @@
mSharedState.disableNavBarDisplayId = displayId;
mSharedState.disableNavBarState1 = state1;
mSharedState.disableNavBarState2 = state2;
- if (mTaskbarActivityContext != null) {
- mTaskbarActivityContext.disableNavBarElements(displayId, state1, state2, animate);
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(displayId);
+ if (taskbar != null) {
+ taskbar.disableNavBarElements(displayId, state1, state2, animate);
}
}
public void onSystemBarAttributesChanged(int displayId, int behavior) {
mSharedState.systemBarAttrsDisplayId = displayId;
mSharedState.systemBarAttrsBehavior = behavior;
- if (mTaskbarActivityContext != null) {
- mTaskbarActivityContext.onSystemBarAttributesChanged(displayId, behavior);
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(displayId);
+ if (taskbar != null) {
+ taskbar.onSystemBarAttributesChanged(displayId, behavior);
}
}
public void onTransitionModeUpdated(int barMode, boolean checkBarModes) {
mSharedState.barMode = barMode;
- if (mTaskbarActivityContext != null) {
- mTaskbarActivityContext.onTransitionModeUpdated(barMode, checkBarModes);
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(getDefaultDisplayId());
+ if (taskbar != null) {
+ taskbar.onTransitionModeUpdated(barMode, checkBarModes);
}
}
public void onNavButtonsDarkIntensityChanged(float darkIntensity) {
mSharedState.navButtonsDarkIntensity = darkIntensity;
- if (mTaskbarActivityContext != null) {
- mTaskbarActivityContext.onNavButtonsDarkIntensityChanged(darkIntensity);
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(getDefaultDisplayId());
+ if (taskbar != null) {
+ taskbar.onNavButtonsDarkIntensityChanged(darkIntensity);
}
}
public void onNavigationBarLumaSamplingEnabled(int displayId, boolean enable) {
mSharedState.mLumaSamplingDisplayId = displayId;
mSharedState.mIsLumaSamplingEnabled = enable;
- if (mTaskbarActivityContext != null) {
- mTaskbarActivityContext.onNavigationBarLumaSamplingEnabled(displayId, enable);
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(displayId);
+ if (taskbar != null) {
+ taskbar.onNavigationBarLumaSamplingEnabled(displayId, enable);
}
}
@@ -666,8 +717,7 @@
debugWhyTaskbarNotDestroyed("TaskbarManager#destroy()");
removeActivityCallbacksAndListeners();
mTaskbarBroadcastReceiver.unregisterReceiverSafely(mContext);
- destroyExistingTaskbar();
- removeTaskbarRootViewFromWindow();
+ destroyAllTaskbars();
if (mUserUnlocked) {
DisplayController.INSTANCE.get(mContext).removeChangeListener(mRecreationListener);
}
@@ -676,38 +726,112 @@
SettingsCache.INSTANCE.get(mContext)
.unregister(NAV_BAR_KIDS_MODE, mOnSettingsChangeListener);
Log.d(TASKBAR_NOT_DESTROYED_TAG, "unregistering component callbacks from destroy().");
- mContext.unregisterComponentCallbacks(mComponentCallbacks);
+ mContext.unregisterComponentCallbacks(mDefaultComponentCallbacks);
mShutdownReceiver.unregisterReceiverSafely(mContext);
}
public @Nullable TaskbarActivityContext getCurrentActivityContext() {
- return mTaskbarActivityContext;
+ return getTaskbarForDisplay(mContext.getDisplayId());
}
public void dumpLogs(String prefix, PrintWriter pw) {
pw.println(prefix + "TaskbarManager:");
- if (mTaskbarActivityContext == null) {
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(getDefaultDisplayId());
+ if (taskbar == null) {
pw.println(prefix + "\tTaskbarActivityContext: null");
} else {
- mTaskbarActivityContext.dumpLogs(prefix + "\t", pw);
+ taskbar.dumpLogs(prefix + "\t", pw);
}
}
- private void addTaskbarRootViewToWindow() {
- if (enableTaskbarNoRecreate() && !mAddedWindow && mTaskbarActivityContext != null) {
- mWindowManager.addView(mTaskbarRootLayout,
- mTaskbarActivityContext.getWindowLayoutParams());
+ private void addTaskbarRootViewToWindow(int displayId) {
+ TaskbarActivityContext taskbar = getTaskbarForDisplay(displayId);
+ if (enableTaskbarNoRecreate() && !mAddedWindow && taskbar != null) {
+ mWindowManager.addView(getTaskbarRootLayoutForDisplay(displayId),
+ taskbar.getWindowLayoutParams());
mAddedWindow = true;
}
}
- private void removeTaskbarRootViewFromWindow() {
- if (enableTaskbarNoRecreate() && mAddedWindow) {
- mWindowManager.removeViewImmediate(mTaskbarRootLayout);
+ private void removeTaskbarRootViewFromWindow(int displayId) {
+ FrameLayout rootLayout = getTaskbarRootLayoutForDisplay(displayId);
+ if (enableTaskbarNoRecreate() && mAddedWindow && rootLayout != null) {
+ mWindowManager.removeViewImmediate(rootLayout);
mAddedWindow = false;
+ removeTaskbarRootLayoutFromMap(displayId);
}
}
+ /**
+ * Returns the {@link TaskbarActivityContext} associated with the given display ID.
+ *
+ * @param displayId The ID of the display to retrieve the taskbar for.
+ * @return The {@link TaskbarActivityContext} for the specified display, or
+ * {@code null} if no taskbar is associated with that display.
+ */
+ private TaskbarActivityContext getTaskbarForDisplay(int displayId) {
+ return mTaskbars.get(displayId);
+ }
+
+ /**
+ * Adds the {@link TaskbarActivityContext} associated with the given display ID to taskbar
+ * map if there is not already a taskbar mapped to that displayId.
+ *
+ * @param displayId The ID of the display to retrieve the taskbar for.
+ * @param newTaskbar The new {@link TaskbarActivityContext} to add to the map.
+ */
+ private void addTaskbarToMap(int displayId, TaskbarActivityContext newTaskbar) {
+ if (!mTaskbars.contains(displayId)) {
+ mTaskbars.put(displayId, newTaskbar);
+ }
+ }
+
+ /**
+ * Removes the taskbar associated with the given display ID from the taskbar map.
+ *
+ * @param displayId The ID of the display for which to remove the taskbar.
+ */
+ private void removeTaskbarFromMap(int displayId) {
+ mTaskbars.delete(displayId);
+ }
+
+ /**
+ * Retrieves the root layout of the taskbar for the specified display.
+ *
+ * @param displayId The ID of the display for which to retrieve the taskbar root layout.
+ * @return The taskbar root layout {@link FrameLayout} for a given display or {@code null}.
+ */
+ private FrameLayout getTaskbarRootLayoutForDisplay(int displayId) {
+ return mRootLayouts.get(displayId);
+ }
+
+ /**
+ * Adds the taskbar root layout {@link FrameLayout} to taskbar map, mapped to display ID.
+ *
+ * @param displayId The ID of the display to associate with the taskbar root layout.
+ * @param rootLayout The taskbar root layout {@link FrameLayout} to add to the map.
+ */
+ private void addTaskbarRootLayoutToMap(int displayId, FrameLayout rootLayout) {
+ if (!mRootLayouts.contains(displayId)) {
+ mRootLayouts.put(displayId, rootLayout);
+ }
+ }
+
+ /**
+ * Removes taskbar root layout {@link FrameLayout} for given display ID from the taskbar map.
+ *
+ * @param displayId The ID of the display for which to remove the taskbar root layout.
+ */
+ private void removeTaskbarRootLayoutFromMap(int displayId) {
+ if (mRootLayouts.contains(displayId)) {
+ mRootLayouts.delete(displayId);
+ }
+ }
+
+ private int getDefaultDisplayId() {
+ return mContext.getDisplayId();
+ }
+
/** Temp logs for b/254119092. */
public void debugWhyTaskbarNotDestroyed(String debugReason) {
StringJoiner log = new StringJoiner("\n");
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarModelCallbacks.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarModelCallbacks.java
index c20617d..f905c5f 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarModelCallbacks.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarModelCallbacks.java
@@ -208,7 +208,7 @@
private void commitHotseatItemUpdates(
ItemInfo[] hotseatItemInfos, List<GroupTask> recentTasks) {
- mContainer.updateHotseatItems(hotseatItemInfos, recentTasks);
+ mContainer.updateItems(hotseatItemInfos, recentTasks);
mControllers.taskbarViewController.updateIconViewsRunningStates();
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java
index 3c5d71e..ad1a44d 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarView.java
@@ -20,11 +20,14 @@
import static com.android.launcher3.BubbleTextView.DISPLAY_TASKBAR;
import static com.android.launcher3.Flags.enableCursorHoverStates;
import static com.android.launcher3.Flags.enableRecentsInTaskbar;
+import static com.android.launcher3.Flags.taskbarRecentsLayoutTransition;
import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_APP_PAIR;
import static com.android.launcher3.LauncherSettings.Favorites.ITEM_TYPE_FOLDER;
import static com.android.launcher3.config.FeatureFlags.enableTaskbarPinning;
import static com.android.launcher3.icons.IconNormalizer.ICON_VISIBLE_AREA_FACTOR;
+import static java.util.function.Predicate.not;
+
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Canvas;
@@ -70,7 +73,9 @@
import com.android.wm.shell.shared.bubbles.BubbleBarLocation;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
+import java.util.Objects;
import java.util.function.Predicate;
/**
@@ -108,6 +113,8 @@
// Only non-null when device supports having a Taskbar Overflow button.
@Nullable private TaskbarOverflowView mTaskbarOverflowView;
+ private int mNextViewIndex;
+
/**
* Whether the divider is between Hotseat icons and Recents,
* instead of between All Apps button and Hotseat.
@@ -125,6 +132,8 @@
private final int mAllAppsButtonTranslationOffset;
+ private final int mNumStaticViews;
+
public TaskbarView(@NonNull Context context) {
this(context, null);
}
@@ -189,6 +198,9 @@
// TODO: Disable touch events on QSB otherwise it can crash.
mQsb = LayoutInflater.from(context).inflate(R.layout.search_container_hotseat, this, false);
+
+ mNumStaticViews = taskbarRecentsLayoutTransition() && !mActivityContext.isPhoneMode()
+ ? addStaticViews() : 0;
}
/**
@@ -249,6 +261,24 @@
&& (mIdealNumIcons > oldMaxNumIcons || mIdealNumIcons > mMaxNumIcons);
}
+ /**
+ * Pre-adds views that are always children of this view for LayoutTransition support.
+ * <p>
+ * Normally these views are removed and re-added when updating hotseat and recents. This
+ * approach does not behave well with LayoutTransition, so we instead need to add them
+ * initially and avoid removing them during updates.
+ */
+ private int addStaticViews() {
+ int numStaticViews = 1;
+ addView(mAllAppsButtonContainer);
+ if (mActivityContext.getDeviceProfile().isQsbInline) {
+ addView(mQsb, mIsRtl ? 1 : 0);
+ mQsb.setVisibility(View.INVISIBLE);
+ numStaticViews++;
+ }
+ return numStaticViews;
+ }
+
@Override
public void setVisibility(int visibility) {
boolean changed = getVisibility() != visibility;
@@ -359,15 +389,33 @@
if (!(view.getTag() instanceof CollectionInfo)) {
mActivityContext.getViewCache().recycleView(view.getSourceLayoutResId(), view);
}
+ if (view instanceof FolderIcon fi) {
+ // We should clear FolderInfo's Folder and FolderIcon to avoid memory leak.
+ fi.removeListeners();
+ }
view.setTag(null);
}
- /**
- * Inflates/binds the Hotseat views to show in the Taskbar given their ItemInfos.
- */
- protected void updateHotseatItems(ItemInfo[] hotseatItemInfos, List<GroupTask> recentTasks) {
- int nextViewIndex = 0;
- int numViewsAnimated = 0;
+ /** Inflates/binds the hotseat items and recent tasks to the view. */
+ protected void updateItems(ItemInfo[] hotseatItemInfos, List<GroupTask> recentTasks) {
+ // Filter out unsupported items.
+ hotseatItemInfos = Arrays.stream(hotseatItemInfos)
+ .filter(Objects::nonNull)
+ .toArray(ItemInfo[]::new);
+ // TODO(b/343289567 and b/316004172): support app pairs and desktop mode.
+ recentTasks = recentTasks.stream().filter(not(GroupTask::supportsMultipleTasks)).toList();
+
+ if (taskbarRecentsLayoutTransition()) {
+ updateItemsWithLayoutTransition(hotseatItemInfos, recentTasks);
+ } else {
+ updateItemsWithoutLayoutTransition(hotseatItemInfos, recentTasks);
+ }
+ }
+
+ private void updateItemsWithoutLayoutTransition(
+ ItemInfo[] hotseatItemInfos, List<GroupTask> recentTasks) {
+
+ mNextViewIndex = 0;
mAddedDividerForRecents = false;
removeView(mAllAppsButtonContainer);
@@ -380,12 +428,105 @@
}
removeView(mQsb);
- // Add Hotseat icons.
- for (ItemInfo hotseatItemInfo : hotseatItemInfos) {
- if (hotseatItemInfo == null) {
- continue;
- }
+ updateHotseatItems(hotseatItemInfos);
+ if (mTaskbarDividerContainer != null && !recentTasks.isEmpty()) {
+ addView(mTaskbarDividerContainer, mNextViewIndex++);
+ mAddedDividerForRecents = true;
+ }
+
+ updateRecents(recentTasks);
+
+ addView(mAllAppsButtonContainer, mIsRtl ? hotseatItemInfos.length : 0);
+
+ // If there are no recent tasks, add divider after All Apps (unless it's the only view).
+ if (!mAddedDividerForRecents
+ && mTaskbarDividerContainer != null
+ && getChildCount() > 1) {
+ addView(mTaskbarDividerContainer, mIsRtl ? (getChildCount() - 1) : 1);
+ }
+
+ if (mActivityContext.getDeviceProfile().isQsbInline) {
+ addView(mQsb, mIsRtl ? getChildCount() : 0);
+ // Always set QSB to invisible after re-adding.
+ mQsb.setVisibility(View.INVISIBLE);
+ }
+ }
+
+ private void updateItemsWithLayoutTransition(
+ ItemInfo[] hotseatItemInfos, List<GroupTask> recentTasks) {
+
+ // Skip static views and potential All Apps divider, if they are on the left.
+ mNextViewIndex = mIsRtl ? 0 : mNumStaticViews;
+ if (getChildAt(mNextViewIndex) == mTaskbarDividerContainer) {
+ mNextViewIndex++;
+ }
+
+ // Update left section.
+ if (mIsRtl) {
+ updateRecents(recentTasks.reversed());
+ } else {
+ updateHotseatItems(hotseatItemInfos);
+ }
+
+ // Now at theoretical position for recent apps divider.
+ updateRecentsDivider(!recentTasks.isEmpty());
+ if (getChildAt(mNextViewIndex) == mTaskbarDividerContainer) {
+ mNextViewIndex++;
+ }
+
+ // Update right section.
+ if (mIsRtl) {
+ updateHotseatItems(hotseatItemInfos);
+ } else {
+ updateRecents(recentTasks);
+ }
+
+ // Recents divider takes priority.
+ if (!mAddedDividerForRecents) {
+ updateAllAppsDivider();
+ }
+ }
+
+ private void updateRecentsDivider(boolean hasRecents) {
+ if (hasRecents && !mAddedDividerForRecents) {
+ mAddedDividerForRecents = true;
+
+ // Remove possible All Apps divider.
+ if (getChildAt(mNumStaticViews) == mTaskbarDividerContainer) {
+ mNextViewIndex--; // All Apps divider on the left. Need to account for removing it.
+ }
+ removeView(mTaskbarDividerContainer);
+
+ addView(mTaskbarDividerContainer, mNextViewIndex);
+ } else if (!hasRecents && mAddedDividerForRecents) {
+ mAddedDividerForRecents = false;
+ removeViewAt(mNextViewIndex);
+ }
+ }
+
+ private void updateAllAppsDivider() {
+ // Index where All Apps divider would be if it is already in Taskbar.
+ final int expectedAllAppsDividerIndex =
+ mIsRtl ? getChildCount() - mNumStaticViews - 1 : mNumStaticViews;
+ if (getChildAt(expectedAllAppsDividerIndex) == mTaskbarDividerContainer
+ && getChildCount() == mNumStaticViews + 1) {
+ // Only static views with divider so remove divider.
+ removeView(mTaskbarDividerContainer);
+ } else if (getChildAt(expectedAllAppsDividerIndex) != mTaskbarDividerContainer
+ && getChildCount() >= mNumStaticViews + 1) {
+ // Static views with at least one app icon so add divider. For RTL, add it after the
+ // icon that is at the expected index.
+ addView(
+ mTaskbarDividerContainer,
+ mIsRtl ? expectedAllAppsDividerIndex + 1 : expectedAllAppsDividerIndex);
+ }
+ }
+
+ private void updateHotseatItems(ItemInfo[] hotseatItemInfos) {
+ int numViewsAnimated = 0;
+
+ for (ItemInfo hotseatItemInfo : hotseatItemInfos) {
// Replace any Hotseat views with the appropriate type if it's not already that type.
final int expectedLayoutResId;
boolean isCollection = false;
@@ -401,8 +542,8 @@
}
View hotseatView = null;
- while (nextViewIndex < getChildCount()) {
- hotseatView = getChildAt(nextViewIndex);
+ while (isNextViewInSection(ItemInfo.class)) {
+ hotseatView = getChildAt(mNextViewIndex);
// see if the view can be reused
if ((hotseatView.getSourceLayoutResId() != expectedLayoutResId)
@@ -443,7 +584,7 @@
}
LayoutParams lp = new LayoutParams(mIconTouchSize, mIconTouchSize);
hotseatView.setPadding(mItemPadding, mItemPadding, mItemPadding, mItemPadding);
- addView(hotseatView, nextViewIndex, lp);
+ addView(hotseatView, mNextViewIndex, lp);
}
// Apply the Hotseat ItemInfos, or hide the view if there is none for a given index.
@@ -459,14 +600,15 @@
if (enableCursorHoverStates()) {
setHoverListenerForIcon(hotseatView);
}
- nextViewIndex++;
+ mNextViewIndex++;
}
- if (mTaskbarDividerContainer != null && !recentTasks.isEmpty()) {
- addView(mTaskbarDividerContainer, nextViewIndex++);
- mAddedDividerForRecents = true;
+ while (isNextViewInSection(ItemInfo.class)) {
+ removeAndRecycle(getChildAt(mNextViewIndex));
}
+ }
+ private void updateRecents(List<GroupTask> recentTasks) {
// At this point, the all apps button has not been added as a child view, but needs to be
// accounted for when comparing current icon count to max number of icons.
int nonTaskIconsToBeAdded = 1;
@@ -474,19 +616,11 @@
boolean supportsOverflow = Flags.taskbarOverflow();
int overflowSize = 0;
if (supportsOverflow) {
- int numberOfSupportedRecents = 0;
- for (GroupTask task : recentTasks) {
- // TODO(b/343289567 and b/316004172): support app pairs and desktop mode.
- if (!task.supportsMultipleTasks()) {
- ++numberOfSupportedRecents;
- }
- }
-
- mIdealNumIcons = nextViewIndex + numberOfSupportedRecents + nonTaskIconsToBeAdded;
+ mIdealNumIcons = mNextViewIndex + recentTasks.size() + nonTaskIconsToBeAdded;
overflowSize = mIdealNumIcons - mMaxNumIcons;
if (overflowSize > 0 && mTaskbarOverflowView != null) {
- addView(mTaskbarOverflowView, nextViewIndex++);
+ addView(mTaskbarOverflowView, mNextViewIndex++);
} else if (mTaskbarOverflowView != null) {
mTaskbarOverflowView.clearItems();
}
@@ -495,9 +629,10 @@
List<Task> overflownTasks = null;
// An extra item needs to be added to overflow button to account for the space taken up by
// the overflow button.
- final int itemsToAddToOverflow = overflowSize > 0 ? overflowSize + 1 : 0;
+ final int itemsToAddToOverflow =
+ (overflowSize > 0) ? Math.min(overflowSize + 1, recentTasks.size()) : 0;
if (overflowSize > 0) {
- overflownTasks = new ArrayList<Task>(itemsToAddToOverflow);
+ overflownTasks = new ArrayList<>(itemsToAddToOverflow);
}
// Add Recent/Running icons.
@@ -505,10 +640,6 @@
if (mTaskbarOverflowView != null && overflownTasks != null
&& overflownTasks.size() < itemsToAddToOverflow) {
// TODO(b/343289567 and b/316004172): support app pairs and desktop mode.
- if (task.supportsMultipleTasks()) {
- continue;
- }
-
overflownTasks.add(task.task1);
if (overflownTasks.size() == itemsToAddToOverflow) {
mTaskbarOverflowView.setItems(overflownTasks);
@@ -533,8 +664,8 @@
}
View recentIcon = null;
- while (nextViewIndex < getChildCount()) {
- recentIcon = getChildAt(nextViewIndex);
+ while (isNextViewInSection(GroupTask.class)) {
+ recentIcon = getChildAt(mNextViewIndex);
// see if the view can be reused
if ((recentIcon.getSourceLayoutResId() != expectedLayoutResId)
@@ -548,15 +679,11 @@
}
if (recentIcon == null) {
- if (isCollection) {
- // TODO(b/343289567 and b/316004172): support app pairs and desktop mode.
- continue;
- }
-
+ // TODO(b/343289567 and b/316004172): support app pairs and desktop mode.
recentIcon = inflate(expectedLayoutResId);
LayoutParams lp = new LayoutParams(mIconTouchSize, mIconTouchSize);
recentIcon.setPadding(mItemPadding, mItemPadding, mItemPadding, mItemPadding);
- addView(recentIcon, nextViewIndex, lp);
+ addView(recentIcon, mNextViewIndex, lp);
}
if (recentIcon instanceof BubbleTextView btv) {
@@ -566,29 +693,17 @@
if (enableCursorHoverStates()) {
setHoverListenerForIcon(recentIcon);
}
- nextViewIndex++;
+ mNextViewIndex++;
}
- // Remove remaining views
- while (nextViewIndex < getChildCount()) {
- removeAndRecycle(getChildAt(nextViewIndex));
+ while (isNextViewInSection(GroupTask.class)) {
+ removeAndRecycle(getChildAt(mNextViewIndex));
}
+ }
- addView(mAllAppsButtonContainer, mIsRtl ? hotseatItemInfos.length : 0);
-
- // If there are no recent tasks, add divider after All Apps (unless it's the only view).
- if (!mAddedDividerForRecents
- && mTaskbarDividerContainer != null
- && getChildCount() > 1) {
- addView(mTaskbarDividerContainer, mIsRtl ? (getChildCount() - 1) : 1);
- }
-
-
- if (mActivityContext.getDeviceProfile().isQsbInline) {
- addView(mQsb, mIsRtl ? getChildCount() : 0);
- // Always set QSB to invisible after re-adding.
- mQsb.setVisibility(View.INVISIBLE);
- }
+ private boolean isNextViewInSection(Class<?> tagClass) {
+ return mNextViewIndex < getChildCount()
+ && tagClass.isInstance(getChildAt(mNextViewIndex).getTag());
}
/** Binds the GroupTask to the BubbleTextView to be ready to present to the user. */
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarController.java b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarController.java
index e0814d3..987937e 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarController.java
@@ -115,7 +115,6 @@
private BubbleBarItem mSelectedBubble;
private TaskbarSharedState mSharedState;
- private ImeVisibilityChecker mImeVisibilityChecker;
private BubbleBarViewController mBubbleBarViewController;
private BubbleStashController mBubbleStashController;
private Optional<BubbleStashedHandleViewController> mBubbleStashedHandleViewController;
@@ -126,6 +125,8 @@
// Cache last sent top coordinate to avoid sending duplicate updates to shell
private int mLastSentBubbleBarTop;
+ private boolean mIsImeVisible = false;
+
/**
* Similar to {@link BubbleBarUpdate} but rather than {@link BubbleInfo}s it uses
* {@link BubbleBarBubble}s so that it can be used to update the views.
@@ -192,10 +193,8 @@
/** Initializes controllers. */
public void init(BubbleControllers bubbleControllers,
BubbleBarLocationListener bubbleBarLocationListener,
- ImeVisibilityChecker imeVisibilityChecker,
TaskbarSharedState sharedState) {
mSharedState = sharedState;
- mImeVisibilityChecker = imeVisibilityChecker;
mBubbleBarViewController = bubbleControllers.bubbleBarViewController;
mBubbleStashController = bubbleControllers.bubbleStashController;
mBubbleStashedHandleViewController = bubbleControllers.bubbleStashedHandleViewController;
@@ -234,6 +233,10 @@
boolean sysuiLocked = (flags & MASK_SYSUI_LOCKED) != 0;
mBubbleStashController.setSysuiLocked(sysuiLocked);
+ mIsImeVisible = (flags & SYSUI_STATE_IME_SHOWING) != 0;
+ if (mIsImeVisible) {
+ mBubbleBarViewController.onImeVisible();
+ }
}
//
@@ -309,8 +312,7 @@
// enabling gesture nav. also suppress animation if the bubble bar is hidden for sysui e.g.
// the shade is open, or we're locked.
final boolean suppressAnimation =
- update.initialState || mBubbleBarViewController.isHiddenForSysui()
- || mImeVisibilityChecker.isImeVisible();
+ update.initialState || mBubbleBarViewController.isHiddenForSysui() || mIsImeVisible;
if (update.initialState && mSharedState.hasSavedBubbles()) {
// clear restored state
@@ -572,12 +574,6 @@
mBubbleBarViewController.addBubble(bubble, isExpanding, suppressAnimation);
}
- /** Interface for checking whether the IME is visible. */
- public interface ImeVisibilityChecker {
- /** Whether the IME is visible. */
- boolean isImeVisible();
- }
-
/** Listener of {@link BubbleBarLocation} updates. */
public interface BubbleBarLocationListener {
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarView.java b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarView.java
index c5c2d69..833be61 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarView.java
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarView.java
@@ -456,7 +456,7 @@
return;
}
mDragging = dragging;
- setElevation(dragging ? mDragElevation : mBubbleElevation);
+ mController.setIsDragging(dragging);
if (!mDragging) {
// Relayout after dragging to ensure that the dragged bubble is positioned correctly
requestLayout();
@@ -1575,5 +1575,8 @@
/** Requests the controller to update bubble bar location to the given value */
void updateBubbleBarLocation(BubbleBarLocation location,
@BubbleBarLocation.UpdateSource int source);
+
+ /** Notifies the controller that bubble bar is being dragged */
+ void setIsDragging(boolean dragging);
}
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java
index d13e0c4..fd08078 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java
@@ -85,6 +85,7 @@
private final BubbleBarView mBarView;
private int mIconSize;
private int mBubbleBarPadding;
+ private final int mDragElevation;
// Initialized in init.
private BubbleStashController mBubbleStashController;
@@ -152,6 +153,8 @@
mBubbleBarAlpha = new MultiValueAlpha(mBarView, 1 /* num alpha channels */);
mIconSize = activity.getResources().getDimensionPixelSize(
R.dimen.bubblebar_icon_size);
+ mDragElevation = activity.getResources().getDimensionPixelSize(
+ R.dimen.bubblebar_drag_elevation);
mTaskbarTranslationDelta = getBubbleBarTranslationDeltaForTaskbar(activity);
}
@@ -221,6 +224,11 @@
@BubbleBarLocation.UpdateSource int source) {
mBubbleBarController.updateBubbleBarLocation(location, source);
}
+
+ @Override
+ public void setIsDragging(boolean dragging) {
+ mBubbleBarContainer.setElevation(dragging ? mDragElevation : 0);
+ }
});
mBubbleViewController = new BubbleView.Controller() {
@@ -383,6 +391,13 @@
}
}
+ /** Notifies that the IME became visible. */
+ public void onImeVisible() {
+ if (isAnimatingNewBubble()) {
+ mBubbleBarViewAnimator.interruptForIme();
+ }
+ }
+
//
// The below animators are exposed to BubbleStashController so it can manage the stashing
// animation.
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleControllers.java b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleControllers.java
index d993685..cb592e6 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleControllers.java
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleControllers.java
@@ -89,7 +89,6 @@
);
bubbleBarController.init(this,
bubbleBarLocationListeners,
- taskbarControllers.navbarButtonsViewController::isImeVisible,
taskbarSharedState);
bubbleStashedHandleViewController.ifPresent(
controller -> controller.init(/* bubbleControllers = */ this));
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimator.kt b/quickstep/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimator.kt
index 5184a9f..447dad1 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimator.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimator.kt
@@ -473,8 +473,8 @@
ObjectAnimator.ofFloat(bubbleBarView, View.TRANSLATION_Y, ty - bubbleBarBounceDistanceInPx)
.withDuration(BUBBLE_BAR_BOUNCE_ANIMATION_DURATION_MS)
.withEndAction {
- if (animatingBubble?.expand == true) expandBubbleBar()
springBackAnimation.start()
+ if (animatingBubble?.expand == true) expandBubbleBar()
}
.start()
}
@@ -532,6 +532,21 @@
)
}
+ /** Interrupts the animation due to the IME becoming visible. */
+ fun interruptForIme() {
+ cancelFlyout()
+ val hideAnimation = animatingBubble?.hideAnimation ?: return
+ scheduler.cancel(hideAnimation)
+ animatingBubble = null
+ bubbleStashController.getStashedHandlePhysicsAnimator().cancelIfRunning()
+ bubbleBarView.relativePivotY = 1f
+ // stash the bubble bar since the IME is now visible
+ bubbleStashController.onNewBubbleAnimationInterrupted(
+ /* isStashed= */ true,
+ bubbleBarView.translationY,
+ )
+ }
+
fun expandedWhileAnimating() {
val animatingBubble = animatingBubble ?: return
this.animatingBubble = animatingBubble.copy(expand = true)
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/stashing/TransientBubbleStashController.kt b/quickstep/src/com/android/launcher3/taskbar/bubbles/stashing/TransientBubbleStashController.kt
index e62c0d4..22d504f 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/stashing/TransientBubbleStashController.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/stashing/TransientBubbleStashController.kt
@@ -90,7 +90,10 @@
val hasBubbles = bubbleBarViewController.hasBubbles()
bubbleBarViewController.onBubbleBarConfigurationChanged(hasBubbles)
if (!hasBubbles) {
- // if there are no bubbles, there's nothing to show, so just return.
+ // if there are no bubbles, there's no need to update the bubble bar, just keep the
+ // isStashed state up to date so that we can process state changes when bubbles are
+ // created.
+ isStashed = launcherState == BubbleLauncherState.IN_APP
return
}
if (field == BubbleLauncherState.HOME) {
@@ -486,10 +489,9 @@
val isStashed = stash && !isBubblesShowingOnHome && !isBubblesShowingOnOverview
if (this.isStashed != isStashed) {
this.isStashed = isStashed
+
// notify the view controller that the stash state is about to change so that it can
// cancel an ongoing animation if there is one.
- // note that this has to be called before updating mIsStashed with the new value,
- // otherwise interrupting an ongoing animation may update it again with the wrong state
bubbleBarViewController.onStashStateChanging()
animator?.cancel()
animator =
diff --git a/quickstep/src/com/android/launcher3/taskbar/customization/TaskbarAllAppsButtonContainer.kt b/quickstep/src/com/android/launcher3/taskbar/customization/TaskbarAllAppsButtonContainer.kt
index 7e3b362..4932654 100644
--- a/quickstep/src/com/android/launcher3/taskbar/customization/TaskbarAllAppsButtonContainer.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/customization/TaskbarAllAppsButtonContainer.kt
@@ -32,6 +32,7 @@
import com.android.launcher3.config.FeatureFlags.enableTaskbarPinning
import com.android.launcher3.taskbar.TaskbarActivityContext
import com.android.launcher3.taskbar.TaskbarViewCallbacks
+import com.android.launcher3.util.DisplayController
import com.android.launcher3.util.Executors.MAIN_EXECUTOR
import com.android.launcher3.views.ActivityContext
import com.android.launcher3.views.IconButtonView
@@ -68,7 +69,9 @@
)
backgroundTintList = ColorStateList.valueOf(TRANSPARENT)
setIconDrawable(drawable)
- setPadding(dpToPx(activityContext.taskbarSpecsEvaluator.taskbarIconPadding.toFloat()))
+ if (!DisplayController.isTransientTaskbar(context)) {
+ setPadding(dpToPx(activityContext.taskbarSpecsEvaluator.taskbarIconPadding.toFloat()))
+ }
setForegroundTint(activityContext.getColor(R.color.all_apps_button_color))
}
diff --git a/quickstep/src/com/android/launcher3/taskbar/customization/TaskbarDividerContainer.kt b/quickstep/src/com/android/launcher3/taskbar/customization/TaskbarDividerContainer.kt
index 344f163..d5f72d5 100644
--- a/quickstep/src/com/android/launcher3/taskbar/customization/TaskbarDividerContainer.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/customization/TaskbarDividerContainer.kt
@@ -26,6 +26,7 @@
import com.android.launcher3.Utilities.dpToPx
import com.android.launcher3.taskbar.TaskbarActivityContext
import com.android.launcher3.taskbar.TaskbarViewCallbacks
+import com.android.launcher3.util.DisplayController
import com.android.launcher3.views.ActivityContext
import com.android.launcher3.views.IconButtonView
@@ -51,7 +52,9 @@
backgroundTintList = ColorStateList.valueOf(TRANSPARENT)
val drawable = resources.getDrawable(R.drawable.taskbar_divider_button)
setIconDrawable(drawable)
- setPadding(dpToPx(activityContext.taskbarSpecsEvaluator.taskbarIconPadding.toFloat()))
+ if (!DisplayController.isTransientTaskbar(context)) {
+ setPadding(dpToPx(activityContext.taskbarSpecsEvaluator.taskbarIconPadding.toFloat()))
+ }
}
@SuppressLint("ClickableViewAccessibility")
diff --git a/quickstep/src/com/android/launcher3/uioverrides/PredictedAppIcon.java b/quickstep/src/com/android/launcher3/uioverrides/PredictedAppIcon.java
index 4590efe..535ae1c 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/PredictedAppIcon.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/PredictedAppIcon.java
@@ -418,7 +418,9 @@
mIconRingPaint.setColor(RING_SHADOW_COLOR);
mIconRingPaint.setMaskFilter(mShadowFilter);
int count = canvas.save();
- canvas.scale(mRingScale, mRingScale, canvas.getWidth() / 2f, canvas.getHeight() / 2f);
+ if (Float.compare(1, mRingScale) != 0) {
+ canvas.scale(mRingScale, mRingScale, canvas.getWidth() / 2f, canvas.getHeight() / 2f);
+ }
canvas.drawPath(mRingPath, mIconRingPaint);
mIconRingPaint.setColor(mPlateColor);
mIconRingPaint.setMaskFilter(null);
diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
index 1baba74..cc51adc 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
@@ -264,6 +264,8 @@
private boolean mIsOverlayVisible;
+ private final Runnable mOverviewTargetChangeRunnable = this::onOverviewTargetChanged;
+
public static QuickstepLauncher getLauncher(Context context) {
return fromContext(context);
}
@@ -550,6 +552,10 @@
mUnfoldTransitionProgressProvider.destroy();
}
+ TISBinder binder = mTISBindHelper.getBinder();
+ if (binder != null) {
+ binder.unregisterOverviewTargetChangeListener(mOverviewTargetChangeRunnable);
+ }
mTISBindHelper.onDestroy();
if (mLauncherUnfoldAnimationController != null) {
@@ -1025,12 +1031,20 @@
}
}
+ private void onOverviewTargetChanged() {
+ QuickstepTransitionManager transitionManager = getAppTransitionManager();
+ if (transitionManager != null) {
+ transitionManager.onOverviewTargetChange();
+ }
+ }
+
private void onTISConnected(TISBinder binder) {
TaskbarManager taskbarManager = mTISBindHelper.getTaskbarManager();
if (taskbarManager != null) {
taskbarManager.setActivity(this);
}
mTISBindHelper.setPredictiveBackToHomeInProgress(mIsPredictiveBackToHomeInProgress);
+ binder.registerOverviewTargetChangeListener(mOverviewTargetChangeRunnable);
}
@Override
diff --git a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
index 21c4d8c..a006198 100644
--- a/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
+++ b/quickstep/src/com/android/quickstep/AbsSwipeUpHandler.java
@@ -157,6 +157,7 @@
import com.android.systemui.shared.system.SysUiStatsLog;
import com.android.systemui.shared.system.TaskStackChangeListener;
import com.android.systemui.shared.system.TaskStackChangeListeners;
+import com.android.wm.shell.Flags;
import com.android.wm.shell.shared.TransactionPool;
import com.android.wm.shell.shared.desktopmode.DesktopModeStatus;
import com.android.wm.shell.shared.startingsurface.SplashScreenExitAnimationUtils;
@@ -783,7 +784,7 @@
&& recentsAttachedToAppWindow) {
// Only move running task if RecentsView has never been attached before, to avoid
// TaskView jumping to new position as we move the tasks.
- mRecentsView.moveRunningTaskToFront();
+ mRecentsView.moveRunningTaskToExpectedPosition();
}
mAnimationFactory.setRecentsAttachedToAppWindow(
recentsAttachedToAppWindow, animate, updateRunningTaskAlpha);
@@ -1452,8 +1453,21 @@
onPageTransitionEnd.run();
}
}
+ long finalDuration = duration;
+ runOnRecentsAnimationAndLauncherBound(() -> animateGestureEnd(
+ startShift, endShift, finalDuration, interpolator, endTarget, velocityPxPerMs));
+ }
- animateToProgress(startShift, endShift, duration, interpolator, endTarget, velocityPxPerMs);
+ @UiThread
+ protected void animateGestureEnd(
+ float startShift,
+ float endShift,
+ long duration,
+ @NonNull Interpolator interpolator,
+ @NonNull GestureEndTarget endTarget,
+ @NonNull PointF velocityPxPerMs) {
+ animateToProgressInternal(
+ startShift, endShift, duration, interpolator, endTarget, velocityPxPerMs);
}
private void doLogGesture(GestureEndTarget endTarget, @Nullable TaskView targetTask) {
@@ -1496,14 +1510,6 @@
logger.log(event);
}
- /** Animates to the given progress, where 0 is the current app and 1 is overview. */
- @UiThread
- private void animateToProgress(float start, float end, long duration, Interpolator interpolator,
- GestureEndTarget target, PointF velocityPxPerMs) {
- runOnRecentsAnimationAndLauncherBound(() -> animateToProgressInternal(start, end, duration,
- interpolator, target, velocityPxPerMs));
- }
-
protected abstract HomeAnimationFactory createHomeAnimationFactory(
List<IBinder> launchCookies,
long duration,
@@ -2205,8 +2211,9 @@
mSwipePipToHomeAnimator.getFinishTransaction(),
mSwipePipToHomeAnimator.getContentOverlay());
mIsSwipingPipToHome = false;
- } else if (mIsSwipeForSplit) {
+ } else if (mIsSwipeForSplit && !Flags.enablePip2()) {
// Transaction to hide the task to avoid flicker for entering PiP from split-screen.
+ // Note: PiP2 handles entering differently, so skip if enable_pip2=true
PictureInPictureSurfaceTransaction tx =
new PictureInPictureSurfaceTransaction.Builder()
.setAlpha(0f)
diff --git a/quickstep/src/com/android/quickstep/DesktopFullscreenDrawParams.kt b/quickstep/src/com/android/quickstep/DesktopFullscreenDrawParams.kt
new file mode 100644
index 0000000..bafb0b2
--- /dev/null
+++ b/quickstep/src/com/android/quickstep/DesktopFullscreenDrawParams.kt
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.quickstep
+
+import android.content.Context
+import com.android.systemui.shared.system.QuickStepContract
+
+// DesktopTaskView thumbnail's corner radius is independent of fullscreenProgress.
+open class DesktopFullscreenDrawParams
+@JvmOverloads
+constructor(context: Context, cornerRadiusProvider: (Context) -> Float = ::computeCornerRadius) :
+ FullscreenDrawParams(context, cornerRadiusProvider, cornerRadiusProvider) {
+ companion object {
+ // computeCornerRadius is used as cornerRadiusProvider, so
+ // QuickStepContract::getWindowCornerRadius can be mocked properly.
+ private fun computeCornerRadius(context: Context): Float =
+ QuickStepContract.getWindowCornerRadius(context)
+ }
+}
diff --git a/quickstep/src/com/android/quickstep/FallbackSwipeHandler.java b/quickstep/src/com/android/quickstep/FallbackSwipeHandler.java
index 7abcfb8..9b56fd4 100644
--- a/quickstep/src/com/android/quickstep/FallbackSwipeHandler.java
+++ b/quickstep/src/com/android/quickstep/FallbackSwipeHandler.java
@@ -64,8 +64,6 @@
import com.android.launcher3.util.DisplayController;
import com.android.quickstep.fallback.FallbackRecentsView;
import com.android.quickstep.fallback.RecentsState;
-import com.android.quickstep.fallback.window.RecentsWindowManager;
-import com.android.quickstep.util.ActiveGestureLog;
import com.android.quickstep.util.RectFSpringAnim;
import com.android.quickstep.util.SurfaceTransaction.SurfaceProperties;
import com.android.quickstep.util.TransformParams;
@@ -172,16 +170,14 @@
}
@Override
- protected boolean handleTaskAppeared(@NonNull RemoteAnimationTarget[] appearedTaskTarget,
- @NonNull ActiveGestureLog.CompoundString failureReason) {
- if (mActiveAnimationFactory != null
- && mActiveAnimationFactory.handleHomeTaskAppeared(appearedTaskTarget)) {
+ public void onTasksAppeared(@NonNull RemoteAnimationTarget[] appearedTaskTargets) {
+ if (mActiveAnimationFactory != null && mActiveAnimationFactory.handleHomeTaskAppeared(
+ appearedTaskTargets)) {
mActiveAnimationFactory = null;
- failureReason.append("(FallbackSwipeHandler) should be handled as home task appeared");
- return false;
+ return;
}
- return super.handleTaskAppeared(appearedTaskTarget, failureReason);
+ super.onTasksAppeared(appearedTaskTargets);
}
@Override
diff --git a/quickstep/src/com/android/quickstep/FullscreenDrawParams.kt b/quickstep/src/com/android/quickstep/FullscreenDrawParams.kt
new file mode 100644
index 0000000..a5ba52a
--- /dev/null
+++ b/quickstep/src/com/android/quickstep/FullscreenDrawParams.kt
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.quickstep
+
+import android.content.Context
+import com.android.launcher3.R
+import com.android.launcher3.Utilities
+import com.android.launcher3.util.DisplayController
+import com.android.launcher3.util.SafeCloseable
+import com.android.launcher3.views.ActivityContext
+import com.android.quickstep.util.TaskCornerRadius
+import com.android.systemui.shared.system.QuickStepContract
+
+/**
+ * Class for computing corner radius by interpolating between overview and fullscreen corner radius
+ * with fullscreenProgress set in [setProgress].
+ */
+open class FullscreenDrawParams
+@JvmOverloads
+constructor(
+ context: Context,
+ private val taskCornerRadiusProvider: (Context) -> Float = ::computeTaskCornerRadius,
+ private val windowCornerRadiusProvider: (Context) -> Float = ::computeWindowCornerRadius,
+) : SafeCloseable {
+ private var taskCornerRadius = 0f
+ private var windowCornerRadius = 0f
+ var currentCornerRadius = 0f
+
+ init {
+ updateCornerRadius(context)
+ }
+
+ /** Recomputes the start and end corner radius for the given Context. */
+ fun updateCornerRadius(context: Context) {
+ taskCornerRadius = taskCornerRadiusProvider(context)
+ windowCornerRadius = windowCornerRadiusProvider(context)
+ }
+
+ /** Sets the progress in range [0, 1] */
+ fun setProgress(fullscreenProgress: Float, parentScale: Float, taskViewScale: Float) {
+ currentCornerRadius =
+ Utilities.mapRange(fullscreenProgress, taskCornerRadius, windowCornerRadius) /
+ parentScale /
+ taskViewScale
+ }
+
+ override fun close() {}
+
+ companion object {
+ private fun computeTaskCornerRadius(context: Context): Float = TaskCornerRadius.get(context)
+
+ private fun computeWindowCornerRadius(context: Context): Float {
+ val activityContext: ActivityContext? = ActivityContext.lookupContextNoThrow(context)
+ return if (
+ activityContext?.deviceProfile?.isTaskbarPresent == true &&
+ DisplayController.isTransientTaskbar(context)
+ ) {
+ context.resources
+ .getDimensionPixelSize(R.dimen.persistent_taskbar_corner_radius)
+ .toFloat()
+ } else {
+ // The corner radius is fixed to match when Taskbar is persistent mode
+ QuickStepContract.getWindowCornerRadius(context)
+ }
+ }
+ }
+}
diff --git a/quickstep/src/com/android/quickstep/LauncherBackAnimationController.java b/quickstep/src/com/android/quickstep/LauncherBackAnimationController.java
index f3ed491..4bd9ffb 100644
--- a/quickstep/src/com/android/quickstep/LauncherBackAnimationController.java
+++ b/quickstep/src/com/android/quickstep/LauncherBackAnimationController.java
@@ -390,10 +390,11 @@
// Move the window along the Y axis.
float top = (screenHeight - height) * 0.5f + deltaY;
// Move the window along the X axis.
- float left = event.getSwipeEdge() == BackEvent.EDGE_RIGHT
- ? progress * mWindowScaleMarginX
- : screenWidth - progress * mWindowScaleMarginX - width;
-
+ float left = switch (event.getSwipeEdge()) {
+ case BackEvent.EDGE_RIGHT -> progress * mWindowScaleMarginX;
+ case BackEvent.EDGE_LEFT -> screenWidth - progress * mWindowScaleMarginX - width;
+ default -> (screenWidth - width) / 2;
+ };
mCurrentRect.set(left, top, left + width, top + height);
float cornerRadius = Utilities.mapRange(
progress, mWindowScaleStartCornerRadius, mWindowScaleEndCornerRadius);
diff --git a/quickstep/src/com/android/quickstep/OrientationTouchTransformer.java b/quickstep/src/com/android/quickstep/OrientationTouchTransformer.java
index a03c0f8..ef103c4 100644
--- a/quickstep/src/com/android/quickstep/OrientationTouchTransformer.java
+++ b/quickstep/src/com/android/quickstep/OrientationTouchTransformer.java
@@ -37,6 +37,7 @@
import com.android.launcher3.util.DisplayController.Info;
import com.android.launcher3.util.NavigationMode;
import com.android.launcher3.util.window.CachedDisplayInfo;
+import com.android.quickstep.util.ActiveGestureProtoLogProxy;
import com.android.systemui.shared.Flags;
import java.io.PrintWriter;
@@ -111,13 +112,13 @@
mNavBarGesturalHeight);
}
- private void refreshTouchRegion(Info info, Resources newRes) {
+ private void refreshTouchRegion(Info info, Resources newRes, String reason) {
// Swipe touch regions are independent of nav mode, so we have to clear them explicitly
// here to avoid, for ex, a nav region for 2-button rotation 0 being used for 3-button mode
// It tries to cache and reuse swipe regions whenever possible based only on rotation
mResources = newRes;
mSwipeTouchRegions.clear();
- resetSwipeRegions(info);
+ resetSwipeRegions(info, reason);
}
void setNavigationMode(NavigationMode newMode, Info info, Resources newRes) {
@@ -128,7 +129,7 @@
return;
}
this.mMode = newMode;
- refreshTouchRegion(info, newRes);
+ refreshTouchRegion(info, newRes, "setNavigationMode");
}
void setGesturalHeight(int newGesturalHeight, Info info, Resources newRes) {
@@ -136,7 +137,7 @@
return;
}
mNavBarGesturalHeight = newGesturalHeight;
- refreshTouchRegion(info, newRes);
+ refreshTouchRegion(info, newRes, "setGesturalHeight");
}
/**
@@ -147,14 +148,14 @@
*
* @see #enableMultipleRegions(boolean, Info)
*/
- void createOrAddTouchRegion(Info info) {
+ void createOrAddTouchRegion(Info info, String reason) {
mCachedDisplayInfo = new CachedDisplayInfo(info.currentSize, info.rotation);
if (mQuickStepStartingRotation > QUICKSTEP_ROTATION_UNINITIALIZED
&& mCachedDisplayInfo.rotation == mQuickStepStartingRotation) {
// User already was swiping and the current screen is same rotation as the starting one
// Remove active nav bars in other rotations except for the one we started out in
- resetSwipeRegions(info);
+ resetSwipeRegions(info, reason);
return;
}
OrientationRectF region = mSwipeTouchRegions.get(mCachedDisplayInfo);
@@ -163,9 +164,9 @@
}
if (mEnableMultipleRegions) {
- mSwipeTouchRegions.put(mCachedDisplayInfo, createRegionForDisplay(info));
+ mSwipeTouchRegions.put(mCachedDisplayInfo, createRegionForDisplay(info, reason));
} else {
- resetSwipeRegions(info);
+ resetSwipeRegions(info, reason);
}
}
@@ -184,7 +185,7 @@
mActiveTouchRotation = 0;
mQuickStepStartingRotation = QUICKSTEP_ROTATION_UNINITIALIZED;
}
- resetSwipeRegions(info);
+ resetSwipeRegions(info, "enableMultipleRegions");
}
/**
@@ -198,7 +199,7 @@
*/
void setSingleActiveRegion(Info displayInfo) {
mActiveTouchRotation = displayInfo.rotation;
- resetSwipeRegions(displayInfo);
+ resetSwipeRegions(displayInfo, "setSingleActiveRegion");
}
/**
@@ -207,19 +208,21 @@
* To be called whenever we want to stop tracking more than one swipe region.
* Ok to call multiple times.
*/
- private void resetSwipeRegions(Info region) {
+ private void resetSwipeRegions(Info region, String reason) {
if (enableLog()) {
- Log.d(TAG, "clearing all regions except rotation: " + mCachedDisplayInfo.rotation);
+ Log.d(TAG, "clearing all regions except rotation: " + mCachedDisplayInfo.rotation
+ + " reason=" + reason);
}
mCachedDisplayInfo = new CachedDisplayInfo(region.currentSize, region.rotation);
OrientationRectF regionToKeep = mSwipeTouchRegions.get(mCachedDisplayInfo);
if (regionToKeep == null) {
- regionToKeep = createRegionForDisplay(region);
+ regionToKeep = createRegionForDisplay(region, reason);
}
mSwipeTouchRegions.clear();
mSwipeTouchRegions.put(mCachedDisplayInfo, regionToKeep);
updateAssistantRegions(regionToKeep);
+ updateOneHandedRegions(regionToKeep);
}
private void resetSwipeRegions() {
@@ -228,15 +231,17 @@
if (regionToKeep != null) {
mSwipeTouchRegions.put(mCachedDisplayInfo, regionToKeep);
updateAssistantRegions(regionToKeep);
+ updateOneHandedRegions(regionToKeep);
}
}
- private OrientationRectF createRegionForDisplay(Info display) {
+ private OrientationRectF createRegionForDisplay(Info display, String reason) {
if (enableLog()) {
Log.d(TAG, "creating rotation region for: " + mCachedDisplayInfo.rotation
+ " with mode: " + mMode + " displayRotation: " + display.rotation +
" displaySize: " + display.currentSize +
- " navBarHeight: " + mNavBarGesturalHeight);
+ " navBarHeight: " + mNavBarGesturalHeight +
+ " reason: " + reason);
}
Point size = display.currentSize;
@@ -264,9 +269,10 @@
orientationRectF.top = orientationRectF.bottom - touchHeight;
}
}
- // One handed gestural only active on portrait mode
- mOneHandedModeRegion.set(0, orientationRectF.bottom - mNavBarLargerGesturalHeight,
- size.x, size.y);
+ updateOneHandedRegions(orientationRectF);
+ ActiveGestureProtoLogProxy.logCreateTouchRegionForDisplay(rotation, size, orientationRectF,
+ mOneHandedModeRegion, mNavBarGesturalHeight, mNavBarLargerGesturalHeight,
+ reason);
return orientationRectF;
}
@@ -286,6 +292,12 @@
mAssistantRightRegion.left = orientationRectF.right - assistantWidth;
}
+ private void updateOneHandedRegions(OrientationRectF orientationRectF) {
+ // One handed gestural only active on portrait mode
+ mOneHandedModeRegion.set(0, orientationRectF.bottom - mNavBarLargerGesturalHeight,
+ orientationRectF.right, orientationRectF.bottom);
+ }
+
boolean touchInAssistantRegion(MotionEvent ev) {
return mAssistantLeftRegion.contains(ev.getX(), ev.getY())
|| mAssistantRightRegion.contains(ev.getX(), ev.getY());
@@ -411,9 +423,11 @@
OrientationRectF rectF = mSwipeTouchRegions.get(key);
regions.append(rectF).append(" ");
}
- pw.println(regions.toString());
+ pw.println(regions);
pw.println(" mNavBarGesturalHeight=" + mNavBarGesturalHeight);
pw.println(" mNavBarLargerGesturalHeight=" + mNavBarLargerGesturalHeight);
+ pw.println(" mAssistantLeftRegion=" + mAssistantLeftRegion);
+ pw.println(" mAssistantRightRegion=" + mAssistantRightRegion);
pw.println(" mOneHandedModeRegion=" + mOneHandedModeRegion);
}
}
diff --git a/quickstep/src/com/android/quickstep/RecentsAnimationController.java b/quickstep/src/com/android/quickstep/RecentsAnimationController.java
index 145773d..055aadb 100644
--- a/quickstep/src/com/android/quickstep/RecentsAnimationController.java
+++ b/quickstep/src/com/android/quickstep/RecentsAnimationController.java
@@ -56,8 +56,6 @@
private boolean mFinishRequested = false;
// Only valid when mFinishRequested == true.
private boolean mFinishTargetIsLauncher;
- // Only valid when mFinishRequested == true
- private boolean mLauncherIsVisibleAtFinish;
private RunnableList mPendingFinishCallbacks = new RunnableList();
public RecentsAnimationController(RecentsAnimationControllerCompat controller,
@@ -132,27 +130,13 @@
}
@UiThread
- public void finish(boolean toRecents, boolean launcherIsVisibleAtFinish,
- Runnable onFinishComplete, boolean sendUserLeaveHint) {
- Preconditions.assertUIThread();
- finishController(toRecents, launcherIsVisibleAtFinish, onFinishComplete, sendUserLeaveHint,
- false);
- }
-
- @UiThread
public void finishController(boolean toRecents, Runnable callback, boolean sendUserLeaveHint) {
- finishController(toRecents, false, callback, sendUserLeaveHint, false /* forceFinish */);
+ finishController(toRecents, callback, sendUserLeaveHint, false /* forceFinish */);
}
@UiThread
public void finishController(boolean toRecents, Runnable callback, boolean sendUserLeaveHint,
boolean forceFinish) {
- finishController(toRecents, toRecents, callback, sendUserLeaveHint, forceFinish);
- }
-
- @UiThread
- public void finishController(boolean toRecents, boolean launcherIsVisibleAtFinish,
- Runnable callback, boolean sendUserLeaveHint, boolean forceFinish) {
mPendingFinishCallbacks.add(callback);
if (!forceFinish && mFinishRequested) {
// If finish has already been requested, then add the callback to the pending list.
@@ -164,7 +148,6 @@
// Finish not yet requested
mFinishRequested = true;
mFinishTargetIsLauncher = toRecents;
- mLauncherIsVisibleAtFinish = launcherIsVisibleAtFinish;
mOnFinishedListener.accept(this);
Runnable finishCb = () -> {
mController.finish(toRecents, sendUserLeaveHint, new IResultReceiver.Stub() {
@@ -241,14 +224,6 @@
return mFinishTargetIsLauncher;
}
- /**
- * RecentsAnimationListeners can check this in onRecentsAnimationFinished() to determine whether
- * the animation was finished to launcher vs an app.
- */
- public boolean getLauncherIsVisibleAtFinish() {
- return mLauncherIsVisibleAtFinish;
- }
-
public void dump(String prefix, PrintWriter pw) {
pw.println(prefix + "RecentsAnimationController:");
diff --git a/quickstep/src/com/android/quickstep/RemoteTargetGluer.java b/quickstep/src/com/android/quickstep/RemoteTargetGluer.java
index 06b2972..91d0776 100644
--- a/quickstep/src/com/android/quickstep/RemoteTargetGluer.java
+++ b/quickstep/src/com/android/quickstep/RemoteTargetGluer.java
@@ -93,8 +93,7 @@
BaseContainerInterface sizingStrategy, int numHandles, boolean forDesktop) {
RemoteTargetHandle[] handles = new RemoteTargetHandle[numHandles];
for (int i = 0; i < numHandles; i++) {
- TaskViewSimulator tvs = new TaskViewSimulator(context, sizingStrategy);
- tvs.setIsDesktopTask(forDesktop , i);
+ TaskViewSimulator tvs = new TaskViewSimulator(context, sizingStrategy, forDesktop , i);
TransformParams transformParams = new TransformParams();
handles[i] = new RemoteTargetHandle(tvs, transformParams);
}
diff --git a/quickstep/src/com/android/quickstep/RotationTouchHelper.java b/quickstep/src/com/android/quickstep/RotationTouchHelper.java
index 79abc0f..909cc35 100644
--- a/quickstep/src/com/android/quickstep/RotationTouchHelper.java
+++ b/quickstep/src/com/android/quickstep/RotationTouchHelper.java
@@ -236,7 +236,8 @@
return;
}
- mOrientationTouchTransformer.createOrAddTouchRegion(mDisplayController.getInfo());
+ mOrientationTouchTransformer.createOrAddTouchRegion(mDisplayController.getInfo(),
+ "RTH.updateGestureTouchRegions");
}
/**
@@ -273,7 +274,8 @@
if (hasGestures(mMode)) {
updateGestureTouchRegions();
- mOrientationTouchTransformer.createOrAddTouchRegion(info);
+ mOrientationTouchTransformer.createOrAddTouchRegion(info,
+ "RTH.onDisplayInfoChanged");
mCurrentAppRotation = mDisplayRotation;
/* Update nav bars on the following:
diff --git a/quickstep/src/com/android/quickstep/TaskOverlayFactory.java b/quickstep/src/com/android/quickstep/TaskOverlayFactory.java
index 0dbdcb7..ff9c9f6 100644
--- a/quickstep/src/com/android/quickstep/TaskOverlayFactory.java
+++ b/quickstep/src/com/android/quickstep/TaskOverlayFactory.java
@@ -348,11 +348,14 @@
}
/** Called when the snapshot has updated its full screen drawing parameters. */
- public void setFullscreenParams(TaskView.FullscreenDrawParams fullscreenParams) {}
+ public void setFullscreenParams(FullscreenDrawParams fullscreenParams) {}
/** Sets visibility for the overlay associated elements. */
public void setVisibility(int visibility) {}
+ /** See {@link View#addChildrenForAccessibility(ArrayList)} */
+ public void addChildForAccessibility(ArrayList<View> outChildren) {}
+
private class ScreenshotSystemShortcut extends SystemShortcut {
private final RecentsViewContainer mContainer;
diff --git a/quickstep/src/com/android/quickstep/TopTaskTracker.java b/quickstep/src/com/android/quickstep/TopTaskTracker.java
index 7065f37..210065a 100644
--- a/quickstep/src/com/android/quickstep/TopTaskTracker.java
+++ b/quickstep/src/com/android/quickstep/TopTaskTracker.java
@@ -134,6 +134,22 @@
mOrderedTaskList.removeIf(rto -> rto.taskId == taskInfo.taskId);
mOrderedTaskList.addFirst(taskInfo);
+ // Workaround for b/372067617, if the home task is being brought to front, then it will
+ // occlude all other tasks, so mark them as not-visible
+ if (taskInfo.getActivityType() == ACTIVITY_TYPE_HOME) {
+ // We've moved the task to the front of the list above, so only iterate the tasks after
+ for (int i = 1; i < mOrderedTaskList.size(); i++) {
+ final TaskInfo info = mOrderedTaskList.get(i);
+ if (info.displayId != taskInfo.displayId) {
+ // Only fall through to reset visibility for tasks on the same display as the
+ // home task being brought forward
+ continue;
+ }
+ info.isVisible = false;
+ info.isVisibleRequested = false;
+ }
+ }
+
// Keep the home display's top running task in the first while adding a non-home
// display's task to the list, to avoid showing non-home display's task upon going to
// Recents animation.
diff --git a/quickstep/src/com/android/quickstep/TouchInteractionService.java b/quickstep/src/com/android/quickstep/TouchInteractionService.java
index d38eaf3..8edb16f 100644
--- a/quickstep/src/com/android/quickstep/TouchInteractionService.java
+++ b/quickstep/src/com/android/quickstep/TouchInteractionService.java
@@ -137,6 +137,7 @@
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.lang.ref.WeakReference;
+import java.util.HashSet;
import java.util.Set;
import java.util.function.Consumer;
import java.util.function.Function;
@@ -163,7 +164,7 @@
private final WeakReference<TouchInteractionService> mTis;
- @Nullable private Runnable mOnOverviewTargetChangeListener = null;
+ private final Set<Runnable> mOnOverviewTargetChangeListeners = new HashSet<>();
private TISBinder(TouchInteractionService tis) {
mTis = new WeakReference<>(tis);
@@ -512,15 +513,19 @@
tis -> tis.mDeviceState.setGestureBlockingTaskId(taskId));
}
- /** Sets a listener to be run on Overview Target updates. */
- public void setOverviewTargetChangeListener(@Nullable Runnable listener) {
- mOnOverviewTargetChangeListener = listener;
+ /** Registers a listener to be run on Overview Target updates. */
+ public void registerOverviewTargetChangeListener(@NonNull Runnable listener) {
+ mOnOverviewTargetChangeListeners.add(listener);
+ }
+
+ /** Unregisters an OverviewTargetChange listener. */
+ public void unregisterOverviewTargetChangeListener(@NonNull Runnable listener) {
+ mOnOverviewTargetChangeListeners.remove(listener);
}
protected void onOverviewTargetChange() {
- if (mOnOverviewTargetChangeListener != null) {
- mOnOverviewTargetChangeListener.run();
- mOnOverviewTargetChangeListener = null;
+ for (Runnable listener : mOnOverviewTargetChangeListeners) {
+ listener.run();
}
}
diff --git a/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowManager.kt b/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowManager.kt
index 843ef6c..e158975 100644
--- a/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowManager.kt
+++ b/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowManager.kt
@@ -163,9 +163,19 @@
}
override fun startHome() {
+ startHome(/* finishRecentsAnimation= */ true)
+ }
+
+ fun startHome(finishRecentsAnimation: Boolean) {
val recentsView: RecentsView<*, *> = getOverviewPanel()
+
+ if (!finishRecentsAnimation) {
+ recentsView.switchToScreenshot(/* onFinishRunnable= */ null)
+ startHomeInternal()
+ return
+ }
recentsView.switchToScreenshot {
- recentsView.finishRecentsAnimation(true) { startHomeInternal() }
+ recentsView.finishRecentsAnimation(/* toRecents= */ true) { startHomeInternal() }
}
}
diff --git a/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowSwipeHandler.java b/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowSwipeHandler.java
index c1d3f6e..be71385 100644
--- a/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowSwipeHandler.java
+++ b/quickstep/src/com/android/quickstep/fallback/window/RecentsWindowSwipeHandler.java
@@ -31,6 +31,7 @@
import android.content.Context;
import android.content.Intent;
import android.graphics.Matrix;
+import android.graphics.PointF;
import android.graphics.Rect;
import android.graphics.RectF;
import android.os.Bundle;
@@ -47,9 +48,11 @@
import android.view.Surface;
import android.view.SurfaceControl;
import android.view.SurfaceControl.Transaction;
+import android.view.animation.Interpolator;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.UiThread;
import com.android.launcher3.DeviceProfile;
import com.android.launcher3.Utilities;
@@ -144,6 +147,29 @@
}
}
+ @UiThread
+ @Override
+ protected void animateGestureEnd(
+ float startShift,
+ float endShift,
+ long duration,
+ @NonNull Interpolator interpolator,
+ @NonNull GestureState.GestureEndTarget endTarget,
+ @NonNull PointF velocityPxPerMs) {
+ boolean fromHomeToHome = mRunningOverHome
+ && endTarget == GestureState.GestureEndTarget.HOME;
+ if (fromHomeToHome) {
+ mRecentsWindowManager.startHome(/* finishRecentsAnimation= */ false);
+ }
+ super.animateGestureEnd(
+ startShift,
+ endShift,
+ fromHomeToHome ? 0 : duration,
+ interpolator,
+ endTarget,
+ velocityPxPerMs);
+ }
+
private void updateHomeActivityTransformDuringSwipeUp(SurfaceProperties builder,
RemoteAnimationTarget app, TransformParams params) {
if (mActiveAnimationFactory != null) {
diff --git a/quickstep/src/com/android/quickstep/interaction/AllSetActivity.java b/quickstep/src/com/android/quickstep/interaction/AllSetActivity.java
index f7f3157..3eba9c0 100644
--- a/quickstep/src/com/android/quickstep/interaction/AllSetActivity.java
+++ b/quickstep/src/com/android/quickstep/interaction/AllSetActivity.java
@@ -121,6 +121,8 @@
private TextView mHintView;
+ private final Runnable mOverviewTargetChangeRunnable = this::onOverviewTargetChanged;
+
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -285,7 +287,7 @@
private void onTISConnected(TISBinder binder) {
setSetupUIVisible(isResumed());
binder.setSwipeUpProxy(isResumed() ? this::createSwipeUpProxy : null);
- binder.setOverviewTargetChangeListener(binder::preloadOverviewForSUWAllSet);
+ binder.registerOverviewTargetChangeListener(mOverviewTargetChangeRunnable);
binder.preloadOverviewForSUWAllSet();
TaskbarManager taskbarManager = binder.getTaskbarManager();
if (taskbarManager != null) {
@@ -293,6 +295,14 @@
}
}
+ private void onOverviewTargetChanged() {
+ TISBinder binder = mTISBindHelper.getBinder();
+ if (binder != null) {
+ binder.preloadOverviewForSUWAllSet();
+ binder.unregisterOverviewTargetChangeListener(mOverviewTargetChangeRunnable);
+ }
+ }
+
@Override
protected void onPause() {
super.onPause();
@@ -309,7 +319,7 @@
if (binder != null) {
setSetupUIVisible(false);
binder.setSwipeUpProxy(null);
- binder.setOverviewTargetChangeListener(null);
+ binder.unregisterOverviewTargetChangeListener(mOverviewTargetChangeRunnable);
}
}
diff --git a/quickstep/src/com/android/quickstep/logging/StatsLogCompatManager.java b/quickstep/src/com/android/quickstep/logging/StatsLogCompatManager.java
index 2daaaf9..9bfe71f 100644
--- a/quickstep/src/com/android/quickstep/logging/StatsLogCompatManager.java
+++ b/quickstep/src/com/android/quickstep/logging/StatsLogCompatManager.java
@@ -733,48 +733,40 @@
.getQueryLength() : -1;
}
default:
- return info.getFolderIcon().getCardinality();
+ return switch (info.getItemCase()) {
+ case FOLDER_ICON -> info.getFolderIcon().getCardinality();
+ case TASK_VIEW -> info.getTaskView().getCardinality();
+ default -> 0;
+ };
}
}
private static String getPackageName(LauncherAtom.ItemInfo info) {
- switch (info.getItemCase()) {
- case APPLICATION:
- return info.getApplication().getPackageName();
- case SHORTCUT:
- return info.getShortcut().getShortcutName();
- case WIDGET:
- return info.getWidget().getPackageName();
- case TASK:
- return info.getTask().getPackageName();
- case SEARCH_ACTION_ITEM:
- return info.getSearchActionItem().getPackageName();
- default:
- return null;
- }
+ return switch (info.getItemCase()) {
+ case APPLICATION -> info.getApplication().getPackageName();
+ case SHORTCUT -> info.getShortcut().getShortcutName();
+ case WIDGET -> info.getWidget().getPackageName();
+ case TASK -> info.getTask().getPackageName();
+ case SEARCH_ACTION_ITEM -> info.getSearchActionItem().getPackageName();
+ default -> null;
+ };
}
private static String getComponentName(LauncherAtom.ItemInfo info) {
- switch (info.getItemCase()) {
- case APPLICATION:
- return info.getApplication().getComponentName();
- case SHORTCUT:
- return info.getShortcut().getShortcutName();
- case WIDGET:
- return info.getWidget().getComponentName();
- case TASK:
- return info.getTask().getComponentName();
- case SEARCH_ACTION_ITEM:
- return info.getSearchActionItem().getTitle();
- case SLICE:
- return info.getSlice().getUri();
- default:
- return null;
- }
+ return switch (info.getItemCase()) {
+ case APPLICATION -> info.getApplication().getComponentName();
+ case SHORTCUT -> info.getShortcut().getShortcutName();
+ case WIDGET -> info.getWidget().getComponentName();
+ case TASK -> info.getTask().getComponentName();
+ case TASK_VIEW -> info.getTaskView().getComponentName();
+ case SEARCH_ACTION_ITEM -> info.getSearchActionItem().getTitle();
+ case SLICE -> info.getSlice().getUri();
+ default -> null;
+ };
}
private static int getGridX(LauncherAtom.ItemInfo info, boolean parent) {
- LauncherAtom.ContainerInfo containerInfo = info.getContainerInfo();
+ ContainerInfo containerInfo = info.getContainerInfo();
if (containerInfo.getContainerCase() == FOLDER) {
if (parent) {
return containerInfo.getFolder().getWorkspace().getGridX();
@@ -802,37 +794,38 @@
}
private static int getPageId(LauncherAtom.ItemInfo info) {
- if (info.hasTask()) {
- return info.getTask().getIndex();
- }
- switch (info.getContainerInfo().getContainerCase()) {
- case FOLDER:
- return info.getContainerInfo().getFolder().getPageIndex();
- case HOTSEAT:
- return info.getContainerInfo().getHotseat().getIndex();
- case PREDICTED_HOTSEAT_CONTAINER:
- return info.getContainerInfo().getPredictedHotseatContainer().getIndex();
- case TASK_BAR_CONTAINER:
- return info.getContainerInfo().getTaskBarContainer().getIndex();
- default:
- return info.getContainerInfo().getWorkspace().getPageIndex();
- }
+ return switch (info.getItemCase()) {
+ case TASK -> info.getTask().getIndex();
+ case TASK_VIEW -> info.getTaskView().getIndex();
+ default -> getPageIdFromContainerInfo(info.getContainerInfo());
+ };
+ }
+
+ private static int getPageIdFromContainerInfo(LauncherAtom.ContainerInfo containerInfo) {
+ return switch (containerInfo.getContainerCase()) {
+ case FOLDER -> containerInfo.getFolder().getPageIndex();
+ case HOTSEAT -> containerInfo.getHotseat().getIndex();
+ case PREDICTED_HOTSEAT_CONTAINER ->
+ containerInfo.getPredictedHotseatContainer().getIndex();
+ case TASK_BAR_CONTAINER -> containerInfo.getTaskBarContainer().getIndex();
+ default -> containerInfo.getWorkspace().getPageIndex();
+ };
}
private static int getParentPageId(LauncherAtom.ItemInfo info) {
- switch (info.getContainerInfo().getContainerCase()) {
- case FOLDER:
+ return switch (info.getContainerInfo().getContainerCase()) {
+ case FOLDER -> {
if (info.getContainerInfo().getFolder().getParentContainerCase()
== ParentContainerCase.HOTSEAT) {
- return info.getContainerInfo().getFolder().getHotseat().getIndex();
+ yield info.getContainerInfo().getFolder().getHotseat().getIndex();
}
- return info.getContainerInfo().getFolder().getWorkspace().getPageIndex();
- case SEARCH_RESULT_CONTAINER:
- return info.getContainerInfo().getSearchResultContainer().getWorkspace()
- .getPageIndex();
- default:
- return info.getContainerInfo().getWorkspace().getPageIndex();
- }
+ yield info.getContainerInfo().getFolder().getWorkspace().getPageIndex();
+ }
+ case SEARCH_RESULT_CONTAINER ->
+ info.getContainerInfo().getSearchResultContainer().getWorkspace()
+ .getPageIndex();
+ default -> info.getContainerInfo().getWorkspace().getPageIndex();
+ };
}
private static int getHierarchy(LauncherAtom.ItemInfo info) {
@@ -857,25 +850,21 @@
}
private static String getStateString(int state) {
- switch (state) {
- case LAUNCHER_UICHANGED__DST_STATE__BACKGROUND:
- return "BACKGROUND";
- case LAUNCHER_UICHANGED__DST_STATE__HOME:
- return "HOME";
- case LAUNCHER_UICHANGED__DST_STATE__OVERVIEW:
- return "OVERVIEW";
- case LAUNCHER_UICHANGED__DST_STATE__ALLAPPS:
- return "ALLAPPS";
- default:
- return "INVALID";
- }
+ return switch (state) {
+ case LAUNCHER_UICHANGED__DST_STATE__BACKGROUND -> "BACKGROUND";
+ case LAUNCHER_UICHANGED__DST_STATE__HOME -> "HOME";
+ case LAUNCHER_UICHANGED__DST_STATE__OVERVIEW -> "OVERVIEW";
+ case LAUNCHER_UICHANGED__DST_STATE__ALLAPPS -> "ALLAPPS";
+ default -> "INVALID";
+ };
}
private static int getFeatures(LauncherAtom.ItemInfo info) {
- if (info.getItemCase().equals(LauncherAtom.ItemInfo.ItemCase.WIDGET)) {
- return info.getWidget().getWidgetFeatures();
- }
- return 0;
+ return switch (info.getItemCase()) {
+ case WIDGET -> info.getWidget().getWidgetFeatures();
+ case TASK_VIEW -> info.getTaskView().getType();
+ default -> 0;
+ };
}
private static int getSearchAttributes(LauncherAtom.ItemInfo info) {
diff --git a/quickstep/src/com/android/quickstep/recents/di/RecentsDependencies.kt b/quickstep/src/com/android/quickstep/recents/di/RecentsDependencies.kt
index dd11d48..b78e214 100644
--- a/quickstep/src/com/android/quickstep/recents/di/RecentsDependencies.kt
+++ b/quickstep/src/com/android/quickstep/recents/di/RecentsDependencies.kt
@@ -36,9 +36,6 @@
import com.android.quickstep.task.viewmodel.TaskOverlayViewModel
import com.android.quickstep.task.viewmodel.TaskThumbnailViewModel
import com.android.quickstep.task.viewmodel.TaskThumbnailViewModelImpl
-import com.android.quickstep.task.viewmodel.TaskViewData
-import com.android.quickstep.task.viewmodel.TaskViewModel
-import com.android.quickstep.views.TaskViewType
import com.android.systemui.shared.recents.model.Task
import kotlinx.coroutines.CoroutineName
import kotlinx.coroutines.CoroutineScope
@@ -186,17 +183,11 @@
}
}
RecentsViewData::class.java -> RecentsViewData()
- TaskViewModel::class.java -> TaskViewModel(taskViewData = inject(scopeId, extras))
- TaskViewData::class.java -> {
- val taskViewType = extras["TaskViewType"] as TaskViewType
- TaskViewData(taskViewType)
- }
TaskContainerData::class.java -> TaskContainerData()
TaskThumbnailViewData::class.java -> TaskThumbnailViewData()
TaskThumbnailViewModel::class.java ->
TaskThumbnailViewModelImpl(
recentsViewData = inject(),
- taskViewData = inject(scopeId, extras),
taskContainerData = inject(scopeId),
dispatcherProvider = inject(),
getThumbnailPositionUseCase = inject(),
diff --git a/quickstep/src/com/android/quickstep/recents/viewmodel/RecentsViewData.kt b/quickstep/src/com/android/quickstep/recents/viewmodel/RecentsViewData.kt
index 87446b0..6ccf372 100644
--- a/quickstep/src/com/android/quickstep/recents/viewmodel/RecentsViewData.kt
+++ b/quickstep/src/com/android/quickstep/recents/viewmodel/RecentsViewData.kt
@@ -22,9 +22,6 @@
class RecentsViewData {
val fullscreenProgress = MutableStateFlow(1f)
- // This is typically a View concern but it is used to invalidate rendering in other Views
- val scale = MutableStateFlow(1f)
-
// Whether the current RecentsView state supports task overlays.
// TODO(b/331753115): Derive from RecentsView state flow once migrated to MVVM.
val overlayEnabled = MutableStateFlow(false)
diff --git a/quickstep/src/com/android/quickstep/recents/viewmodel/RecentsViewModel.kt b/quickstep/src/com/android/quickstep/recents/viewmodel/RecentsViewModel.kt
index c511005..cfebb81 100644
--- a/quickstep/src/com/android/quickstep/recents/viewmodel/RecentsViewModel.kt
+++ b/quickstep/src/com/android/quickstep/recents/viewmodel/RecentsViewModel.kt
@@ -34,10 +34,6 @@
recentsTasksRepository.setVisibleTasks(visibleTaskIdList.toSet())
}
- fun updateScale(scale: Float) {
- recentsViewData.scale.value = scale
- }
-
fun updateFullscreenProgress(fullscreenProgress: Float) {
recentsViewData.fullscreenProgress.value = fullscreenProgress
}
diff --git a/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailView.kt b/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailView.kt
index a8c8659..0c783d3 100644
--- a/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailView.kt
+++ b/quickstep/src/com/android/quickstep/task/thumbnail/TaskThumbnailView.kt
@@ -17,7 +17,6 @@
package com.android.quickstep.task.thumbnail
import android.content.Context
-import android.content.res.Configuration
import android.graphics.Color
import android.graphics.Outline
import android.graphics.Rect
@@ -29,7 +28,6 @@
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.view.isInvisible
import com.android.launcher3.R
-import com.android.launcher3.Utilities
import com.android.launcher3.util.ViewPool
import com.android.quickstep.recents.di.RecentsDependencies
import com.android.quickstep.recents.di.get
@@ -39,9 +37,7 @@
import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.SnapshotSplash
import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.Uninitialized
import com.android.quickstep.task.viewmodel.TaskThumbnailViewModel
-import com.android.quickstep.util.TaskCornerRadius
import com.android.quickstep.views.FixedSizeImageView
-import com.android.systemui.shared.system.QuickStepContract
import kotlinx.coroutines.CoroutineName
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
@@ -63,18 +59,15 @@
private val splashIcon: FixedSizeImageView by lazy { findViewById(R.id.splash_icon) }
private var uiState: TaskThumbnailUiState = Uninitialized
- private var inheritedScale: Float = 1f
- private val _measuredBounds = Rect()
- private val measuredBounds: Rect
- get() {
- _measuredBounds.set(0, 0, measuredWidth, measuredHeight)
- return _measuredBounds
+ private val bounds = Rect()
+
+ var cornerRadius: Float = 0f
+ set(value) {
+ field = value
+ invalidateOutline()
}
- private var overviewCornerRadius: Float = TaskCornerRadius.get(context)
- private var fullscreenCornerRadius: Float = QuickStepContract.getWindowCornerRadius(context)
-
constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
@@ -114,19 +107,12 @@
splashIcon.alpha = splashAlpha
}
.launchIn(viewAttachedScope)
- viewModel.cornerRadiusProgress.onEach { invalidateOutline() }.launchIn(viewAttachedScope)
- viewModel.inheritedScale
- .onEach { viewModelInheritedScale ->
- inheritedScale = viewModelInheritedScale
- invalidateOutline()
- }
- .launchIn(viewAttachedScope)
clipToOutline = true
outlineProvider =
object : ViewOutlineProvider() {
override fun getOutline(view: View, outline: Outline) {
- outline.setRoundRect(measuredBounds, getCurrentCornerRadius())
+ outline.setRoundRect(bounds, cornerRadius)
}
}
}
@@ -157,6 +143,8 @@
if (uiState is SnapshotSplash) {
setImageMatrix()
}
+ bounds.set(0, 0, w, h)
+ invalidateOutline()
}
override fun setScaleX(scaleX: Float) {
@@ -171,14 +159,6 @@
splashIcon.scaleY = 1 / scaleY
}
- override fun onConfigurationChanged(newConfig: Configuration?) {
- super.onConfigurationChanged(newConfig)
-
- overviewCornerRadius = TaskCornerRadius.get(context)
- fullscreenCornerRadius = QuickStepContract.getWindowCornerRadius(context)
- invalidateOutline()
- }
-
private fun resetViews() {
liveTileView.isInvisible = true
thumbnailView.isInvisible = true
@@ -214,13 +194,6 @@
thumbnailView.imageMatrix = viewModel.getThumbnailPositionState(width, height, isLayoutRtl)
}
- private fun getCurrentCornerRadius() =
- Utilities.mapRange(
- viewModel.cornerRadiusProgress.value,
- overviewCornerRadius,
- fullscreenCornerRadius,
- ) / inheritedScale
-
private companion object {
const val TAG = "TaskThumbnailView"
}
diff --git a/quickstep/src/com/android/quickstep/task/viewmodel/TaskThumbnailViewModel.kt b/quickstep/src/com/android/quickstep/task/viewmodel/TaskThumbnailViewModel.kt
index f55462a..a048a1d 100644
--- a/quickstep/src/com/android/quickstep/task/viewmodel/TaskThumbnailViewModel.kt
+++ b/quickstep/src/com/android/quickstep/task/viewmodel/TaskThumbnailViewModel.kt
@@ -19,19 +19,9 @@
import android.graphics.Matrix
import com.android.quickstep.task.thumbnail.TaskThumbnailUiState
import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.StateFlow
/** ViewModel for representing TaskThumbnails */
interface TaskThumbnailViewModel {
- /**
- * Progress for changes in corner radius. progress: 0 = overview corner radius; 1 = fullscreen
- * corner radius.
- */
- val cornerRadiusProgress: StateFlow<Float>
-
- /** The accumulated View.scale value for parent Views up to and including RecentsView */
- val inheritedScale: Flow<Float>
-
/** Provides the level of dimming that the View should have */
val dimProgress: Flow<Float>
diff --git a/quickstep/src/com/android/quickstep/task/viewmodel/TaskThumbnailViewModelImpl.kt b/quickstep/src/com/android/quickstep/task/viewmodel/TaskThumbnailViewModelImpl.kt
index 8b15a82..b6cb984 100644
--- a/quickstep/src/com/android/quickstep/task/viewmodel/TaskThumbnailViewModelImpl.kt
+++ b/quickstep/src/com/android/quickstep/task/viewmodel/TaskThumbnailViewModelImpl.kt
@@ -38,7 +38,6 @@
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
-import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.flatMapLatest
@@ -50,7 +49,6 @@
@OptIn(ExperimentalCoroutinesApi::class)
class TaskThumbnailViewModelImpl(
recentsViewData: RecentsViewData,
- taskViewData: TaskViewData,
taskContainerData: TaskContainerData,
dispatcherProvider: DispatcherProvider,
private val tasksRepository: RecentTasksRepository,
@@ -61,15 +59,6 @@
private val splashProgress = MutableStateFlow(flowOf(0f))
private var taskId: Int = INVALID_TASK_ID
- override val cornerRadiusProgress =
- if (taskViewData.isOutlineFormedByThumbnailView) recentsViewData.fullscreenProgress
- else MutableStateFlow(1f).asStateFlow()
-
- override val inheritedScale =
- combine(recentsViewData.scale, taskViewData.scale) { recentsScale, taskScale ->
- recentsScale * taskScale
- }
-
override val dimProgress: Flow<Float> =
combine(taskContainerData.taskMenuOpenProgress, recentsViewData.tintAmount) {
taskMenuOpenProgress,
diff --git a/quickstep/src/com/android/quickstep/task/viewmodel/TaskViewData.kt b/quickstep/src/com/android/quickstep/task/viewmodel/TaskViewData.kt
deleted file mode 100644
index 7a9ecf2..0000000
--- a/quickstep/src/com/android/quickstep/task/viewmodel/TaskViewData.kt
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.quickstep.task.viewmodel
-
-import com.android.quickstep.views.TaskViewType
-import kotlinx.coroutines.flow.MutableStateFlow
-
-class TaskViewData(taskViewType: TaskViewType) {
- // This is typically a View concern but it is used to invalidate rendering in other Views
- val scale = MutableStateFlow(1f)
-
- // TODO(b/331753115): This property should not be in TaskViewData once TaskView is MVVM.
- /** Whether outline of TaskView is formed by outline thumbnail view(s). */
- val isOutlineFormedByThumbnailView: Boolean = taskViewType != TaskViewType.DESKTOP
-}
diff --git a/quickstep/src/com/android/quickstep/task/viewmodel/TaskViewModel.kt b/quickstep/src/com/android/quickstep/task/viewmodel/TaskViewModel.kt
deleted file mode 100644
index ec75d59..0000000
--- a/quickstep/src/com/android/quickstep/task/viewmodel/TaskViewModel.kt
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (C) 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.quickstep.task.viewmodel
-
-import androidx.lifecycle.ViewModel
-
-class TaskViewModel(private val taskViewData: TaskViewData) : ViewModel() {
- fun updateScale(scale: Float) {
- taskViewData.scale.value = scale
- }
-}
diff --git a/quickstep/src/com/android/quickstep/util/ContextualSearchStateManager.java b/quickstep/src/com/android/quickstep/util/ContextualSearchStateManager.java
index 083f192..334ff06 100644
--- a/quickstep/src/com/android/quickstep/util/ContextualSearchStateManager.java
+++ b/quickstep/src/com/android/quickstep/util/ContextualSearchStateManager.java
@@ -24,7 +24,6 @@
import static com.android.launcher3.util.MainThreadInitializedObject.forOverride;
import static com.android.quickstep.util.SystemActionConstants.SYSTEM_ACTION_ID_SEARCH_SCREEN;
-import android.annotation.Nullable;
import android.app.PendingIntent;
import android.app.RemoteAction;
import android.content.Context;
@@ -78,7 +77,6 @@
this::onContextualSearchSettingChanged;
protected final EventLogArray mEventLogArray = new EventLogArray(TAG, MAX_DEBUG_EVENT_SIZE);
- @Nullable private SettingsCache mSettingsCache;
// Cached value whether the ContextualSearch intent filter matched any enabled components.
private boolean mIsContextualSearchIntentAvailable;
private boolean mIsContextualSearchSettingEnabled;
@@ -108,11 +106,10 @@
context, mContextualSearchPackage, Intent.ACTION_PACKAGE_ADDED,
Intent.ACTION_PACKAGE_CHANGED, Intent.ACTION_PACKAGE_REMOVED);
- mSettingsCache = SettingsCache.INSTANCE.get(context);
- mSettingsCache.register(SEARCH_ALL_ENTRYPOINTS_ENABLED_URI,
+ SettingsCache.INSTANCE.get(context).register(SEARCH_ALL_ENTRYPOINTS_ENABLED_URI,
mContextualSearchSettingChangedListener);
onContextualSearchSettingChanged(
- mSettingsCache.getValue(SEARCH_ALL_ENTRYPOINTS_ENABLED_URI));
+ SettingsCache.INSTANCE.get(context).getValue(SEARCH_ALL_ENTRYPOINTS_ENABLED_URI));
SystemUiProxy.INSTANCE.get(mContext).addOnStateChangeListener(mSysUiStateChangeListener);
}
@@ -266,11 +263,8 @@
public void close() {
mContextualSearchPackageReceiver.unregisterReceiverSafely(mContext);
unregisterSearchScreenSystemAction();
-
- if (mSettingsCache != null) {
- mSettingsCache.unregister(SEARCH_ALL_ENTRYPOINTS_ENABLED_URI,
- mContextualSearchSettingChangedListener);
- }
+ SettingsCache.INSTANCE.get(mContext).unregister(SEARCH_ALL_ENTRYPOINTS_ENABLED_URI,
+ mContextualSearchSettingChangedListener);
SystemUiProxy.INSTANCE.get(mContext).removeOnStateChangeListener(mSysUiStateChangeListener);
}
diff --git a/quickstep/src/com/android/quickstep/util/TaskViewSimulator.java b/quickstep/src/com/android/quickstep/util/TaskViewSimulator.java
index a4b8fec..706cfe4 100644
--- a/quickstep/src/com/android/quickstep/util/TaskViewSimulator.java
+++ b/quickstep/src/com/android/quickstep/util/TaskViewSimulator.java
@@ -50,9 +50,10 @@
import com.android.launcher3.util.TraceHelper;
import com.android.quickstep.BaseActivityInterface;
import com.android.quickstep.BaseContainerInterface;
+import com.android.quickstep.DesktopFullscreenDrawParams;
+import com.android.quickstep.FullscreenDrawParams;
import com.android.quickstep.TaskAnimationManager;
import com.android.quickstep.util.SurfaceTransaction.SurfaceProperties;
-import com.android.quickstep.views.TaskView.FullscreenDrawParams;
import com.android.systemui.shared.recents.model.ThumbnailData;
import com.android.systemui.shared.recents.utilities.PreviewPositionHelper;
@@ -116,20 +117,25 @@
private SplitBounds mSplitBounds;
private Boolean mDrawsBelowRecents = null;
private boolean mIsGridTask;
- private boolean mIsDesktopTask;
+ private final boolean mIsDesktopTask;
private boolean mScaleToCarouselTaskSize = false;
private int mTaskRectTranslationX;
private int mTaskRectTranslationY;
private int mDesktopTaskIndex = 0;
- public TaskViewSimulator(Context context, BaseContainerInterface sizeStrategy) {
+ public TaskViewSimulator(Context context, BaseContainerInterface sizeStrategy,
+ boolean isDesktop, int desktopTaskIndex) {
mContext = context;
mSizeStrategy = sizeStrategy;
+ mIsDesktopTask = isDesktop;
+ mDesktopTaskIndex = desktopTaskIndex;
mOrientationState = TraceHelper.allowIpcs("TaskViewSimulator.init",
() -> new RecentsOrientedState(context, sizeStrategy, i -> { }));
mOrientationState.setGestureActive(true);
- mCurrentFullscreenParams = new FullscreenDrawParams(context);
+ mCurrentFullscreenParams = mIsDesktopTask
+ ? new DesktopFullscreenDrawParams(context)
+ : new FullscreenDrawParams(context);
mOrientationStateId = mOrientationState.getStateId();
Resources resources = context.getResources();
mIsRecentsRtl = mOrientationState.getOrientationHandler().getRecentsRtlSetting(resources);
@@ -289,14 +295,6 @@
}
/**
- * Sets whether this task is part of desktop tasks in overview.
- */
- public void setIsDesktopTask(boolean desktop, int index) {
- mIsDesktopTask = desktop;
- mDesktopTaskIndex = index;
- }
-
- /**
* Apply translations on TaskRect's starting location.
*/
public void setTaskRectTranslation(int taskRectTranslationX, int taskRectTranslationY) {
@@ -558,7 +556,7 @@
* TaskView
*/
public float getCurrentCornerRadius() {
- float visibleRadius = mCurrentFullscreenParams.getCurrentDrawnCornerRadius();
+ float visibleRadius = mCurrentFullscreenParams.getCurrentCornerRadius();
mTempPoint[0] = visibleRadius;
mTempPoint[1] = 0;
mInversePositionMatrix.mapVectors(mTempPoint);
diff --git a/quickstep/src/com/android/quickstep/views/DesktopTaskContentView.kt b/quickstep/src/com/android/quickstep/views/DesktopTaskContentView.kt
index 481acac..ef044f4 100644
--- a/quickstep/src/com/android/quickstep/views/DesktopTaskContentView.kt
+++ b/quickstep/src/com/android/quickstep/views/DesktopTaskContentView.kt
@@ -23,14 +23,15 @@
import android.view.View
import android.view.ViewOutlineProvider
import android.widget.FrameLayout
-import com.android.quickstep.views.TaskView.FullscreenDrawParams
class DesktopTaskContentView
@JvmOverloads
constructor(context: Context, attrs: AttributeSet? = null) : FrameLayout(context, attrs) {
- private val currentFullscreenParams = FullscreenDrawParams(context)
- private val taskCornerRadius: Float
- get() = currentFullscreenParams.cornerRadius
+ var cornerRadius: Float = 0f
+ set(value) {
+ field = value
+ invalidateOutline()
+ }
private val bounds = Rect()
@@ -39,7 +40,7 @@
outlineProvider =
object : ViewOutlineProvider() {
override fun getOutline(view: View, outline: Outline) {
- outline.setRoundRect(bounds, taskCornerRadius)
+ outline.setRoundRect(bounds, cornerRadius)
}
}
}
diff --git a/quickstep/src/com/android/quickstep/views/DesktopTaskView.kt b/quickstep/src/com/android/quickstep/views/DesktopTaskView.kt
index 5e842aa..576a56e 100644
--- a/quickstep/src/com/android/quickstep/views/DesktopTaskView.kt
+++ b/quickstep/src/com/android/quickstep/views/DesktopTaskView.kt
@@ -20,13 +20,10 @@
import android.graphics.Point
import android.graphics.PointF
import android.graphics.Rect
-import android.graphics.drawable.ShapeDrawable
-import android.graphics.drawable.shapes.RoundRectShape
import android.util.AttributeSet
import android.util.Log
import android.view.Gravity
import android.view.View
-import android.widget.FrameLayout
import androidx.core.content.res.ResourcesCompat
import androidx.core.view.updateLayoutParams
import com.android.launcher3.Flags.enableRefactorTaskThumbnail
@@ -39,6 +36,8 @@
import com.android.launcher3.util.ViewPool
import com.android.launcher3.util.rects.set
import com.android.quickstep.BaseContainerInterface
+import com.android.quickstep.DesktopFullscreenDrawParams
+import com.android.quickstep.FullscreenDrawParams
import com.android.quickstep.TaskOverlayFactory
import com.android.quickstep.ViewUtils
import com.android.quickstep.task.thumbnail.TaskThumbnailView
@@ -47,14 +46,13 @@
/** TaskView that contains all tasks that are part of the desktop. */
class DesktopTaskView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) :
- TaskView(context, attrs, type = TaskViewType.DESKTOP) {
-
- private val snapshotDrawParams =
- object : FullscreenDrawParams(context) {
- // DesktopTaskView thumbnail's corner radius is independent of fullscreenProgress.
- override fun computeTaskCornerRadius(context: Context) =
- computeWindowCornerRadius(context)
- }
+ TaskView(
+ context,
+ attrs,
+ type = TaskViewType.DESKTOP,
+ thumbnailFullscreenParams = DesktopFullscreenDrawParams(context),
+ ) {
+ private val contentViewFullscreenParams = FullscreenDrawParams(context)
private val taskThumbnailViewDeprecatedPool =
if (!enableRefactorTaskThumbnail()) {
@@ -80,28 +78,12 @@
private val tempPointF = PointF()
private val tempRect = Rect()
- private lateinit var backgroundView: View
private lateinit var iconView: TaskViewIcon
- private lateinit var contentView: FrameLayout
+ private lateinit var contentView: DesktopTaskContentView
+ private lateinit var backgroundView: View
override fun onFinishInflate() {
super.onFinishInflate()
- backgroundView =
- findViewById<View>(R.id.background).apply {
- updateLayoutParams<LayoutParams> {
- topMargin = container.deviceProfile.overviewTaskThumbnailTopMarginPx
- }
- background =
- ShapeDrawable(RoundRectShape(FloatArray(8) { taskCornerRadius }, null, null))
- .apply {
- setTint(
- resources.getColor(
- android.R.color.system_neutral2_300,
- context.theme,
- )
- )
- }
- }
iconView =
getOrInflateIconView(R.id.icon).apply {
setIcon(
@@ -115,10 +97,15 @@
setText(resources.getText(R.string.recent_task_desktop))
}
contentView =
- findViewById<FrameLayout>(R.id.desktop_content).apply {
+ findViewById<DesktopTaskContentView>(R.id.desktop_content).apply {
updateLayoutParams<LayoutParams> {
topMargin = container.deviceProfile.overviewTaskThumbnailTopMarginPx
}
+ cornerRadius = contentViewFullscreenParams.currentCornerRadius
+ backgroundView = findViewById(R.id.background)
+ backgroundView.setBackgroundColor(
+ resources.getColor(android.R.color.system_neutral2_300, context.theme)
+ )
}
}
@@ -135,6 +122,7 @@
Log.d(TAG, sb.toString())
}
cancelPendingLoadTasks()
+ val backgroundViewIndex = contentView.indexOfChild(backgroundView)
taskContainers =
tasks.map { task ->
val snapshotView =
@@ -143,7 +131,7 @@
} else {
taskThumbnailViewDeprecatedPool!!.view
}
- contentView.addView(snapshotView, 0)
+ contentView.addView(snapshotView, backgroundViewIndex + 1)
TaskContainer(
this,
@@ -157,8 +145,7 @@
taskOverlayFactory,
)
}
- taskContainers.forEach { it.bind() }
- setOrientationState(orientedState)
+ onBind(orientedState)
}
override fun onRecycle() {
@@ -242,8 +229,12 @@
}
}
- override fun needsUpdate(dataChange: Int, flag: Int) =
- if (flag == FLAG_UPDATE_CORNER_RADIUS) false else super.needsUpdate(dataChange, flag)
+ override fun onTaskListVisibilityChanged(visible: Boolean, changes: Int) {
+ super.onTaskListVisibilityChanged(visible, changes)
+ if (needsUpdate(changes, FLAG_UPDATE_CORNER_RADIUS)) {
+ contentViewFullscreenParams.updateCornerRadius(context)
+ }
+ }
override fun onIconLoaded(taskContainer: TaskContainer) {
// Update contentDescription of snapshotView only, individual task icon is unused.
@@ -258,9 +249,9 @@
override fun getThumbnailBounds(bounds: Rect, relativeToDragLayer: Boolean) {
if (relativeToDragLayer) {
- container.dragLayer.getDescendantRectRelativeToSelf(backgroundView, bounds)
+ container.dragLayer.getDescendantRectRelativeToSelf(contentView, bounds)
} else {
- bounds.set(backgroundView)
+ bounds.set(contentView)
}
}
@@ -306,13 +297,12 @@
backgroundView.alpha = 1 - fullscreenProgress
}
- override fun updateCurrentFullscreenParams() {
- super.updateCurrentFullscreenParams()
- updateFullscreenParams(snapshotDrawParams)
+ override fun updateFullscreenParams() {
+ super.updateFullscreenParams()
+ updateFullscreenParams(contentViewFullscreenParams)
+ contentView.cornerRadius = contentViewFullscreenParams.currentCornerRadius
}
- override fun getThumbnailFullscreenParams() = snapshotDrawParams
-
override fun addChildrenForAccessibility(outChildren: ArrayList<View>) {
super.addChildrenForAccessibility(outChildren)
ViewUtils.addAccessibleChildToList(backgroundView, outChildren)
diff --git a/quickstep/src/com/android/quickstep/views/GroupedTaskView.kt b/quickstep/src/com/android/quickstep/views/GroupedTaskView.kt
index 92c1e93..0d9583d 100644
--- a/quickstep/src/com/android/quickstep/views/GroupedTaskView.kt
+++ b/quickstep/src/com/android/quickstep/views/GroupedTaskView.kt
@@ -104,7 +104,7 @@
R.id.show_windows,
R.id.digital_wellbeing_toast,
STAGE_POSITION_TOP_OR_LEFT,
- taskOverlayFactory
+ taskOverlayFactory,
),
createTaskContainer(
secondaryTask,
@@ -113,14 +113,12 @@
R.id.show_windows_right,
R.id.bottomRight_digital_wellbeing_toast,
STAGE_POSITION_BOTTOM_OR_RIGHT,
- taskOverlayFactory
- )
+ taskOverlayFactory,
+ ),
)
- taskContainers.forEach { it.bind() }
-
this.splitBoundsConfig = splitBoundsConfig
taskContainers.forEach { it.digitalWellBeingToast?.splitBounds = splitBoundsConfig }
- setOrientationState(orientedState)
+ onBind(orientedState)
}
override fun setOrientationState(orientationState: RecentsOrientedState) {
@@ -131,7 +129,7 @@
container.deviceProfile,
it,
layoutParams.width,
- layoutParams.height
+ layoutParams.height,
)
val iconViewMarginStart =
resources.getDimensionPixelSize(
@@ -168,7 +166,7 @@
container.deviceProfile,
splitBoundsConfig,
layoutParams.width,
- layoutParams.height
+ layoutParams.height,
)
pagedOrientationHandler.setSplitIconParams(
taskContainers[0].iconView.asView(),
@@ -181,7 +179,7 @@
isRtl,
container.deviceProfile,
splitBoundsConfig,
- inSplitSelection
+ inSplitSelection,
)
} else {
pagedOrientationHandler.setSplitIconParams(
@@ -195,7 +193,7 @@
isRtl,
container.deviceProfile,
splitBoundsConfig,
- inSplitSelection
+ inSplitSelection,
)
}
}
@@ -216,7 +214,7 @@
InteractionJankMonitorWrapper.begin(
this,
Cuj.CUJ_SPLIT_SCREEN_ENTER,
- "Enter form GroupedTaskView"
+ "Enter form GroupedTaskView",
)
launchTaskInternal(isQuickSwitch = false, launchingExistingTaskView = true) {
endCallback.executeAllAndDestroy()
@@ -230,7 +228,7 @@
override fun launchWithoutAnimation(
isQuickSwitch: Boolean,
- callback: (launched: Boolean) -> Unit
+ callback: (launched: Boolean) -> Unit,
) {
launchTaskInternal(isQuickSwitch, launchingExistingTaskView = false, callback)
}
@@ -244,7 +242,7 @@
private fun launchTaskInternal(
isQuickSwitch: Boolean,
launchingExistingTaskView: Boolean,
- callback: (launched: Boolean) -> Unit
+ callback: (launched: Boolean) -> Unit,
) {
recentsView?.let {
it.splitSelectController.launchExistingSplitPair(
@@ -254,11 +252,11 @@
STAGE_POSITION_TOP_OR_LEFT,
callback,
isQuickSwitch,
- snapPosition
+ snapPosition,
)
Log.d(
TAG,
- "launchTaskInternal - launchExistingSplitPair: ${taskIds.contentToString()}, launchingExistingTaskView: $launchingExistingTaskView"
+ "launchTaskInternal - launchExistingSplitPair: ${taskIds.contentToString()}, launchingExistingTaskView: $launchingExistingTaskView",
)
}
}
diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java
index fbefd04..ec169a8 100644
--- a/quickstep/src/com/android/quickstep/views/RecentsView.java
+++ b/quickstep/src/com/android/quickstep/views/RecentsView.java
@@ -417,9 +417,6 @@
public void setValue(RecentsView view, float scale) {
view.setScaleX(scale);
view.setScaleY(scale);
- if (enableRefactorTaskThumbnail()) {
- view.mRecentsViewModel.updateScale(scale);
- }
view.mLastComputedTaskStartPushOutDistance = null;
view.mLastComputedTaskEndPushOutDistance = null;
view.runActionOnRemoteHandles(new Consumer<RemoteTargetHandle>() {
@@ -692,8 +689,6 @@
protected int mRunningTaskViewId = -1;
private int mTaskViewIdCount;
protected boolean mRunningTaskTileHidden;
- @Nullable
- private Task[] mTmpRunningTasks;
protected int mFocusedTaskViewId = INVALID_TASK_ID;
private boolean mTaskIconScaledDown = false;
@@ -1566,9 +1561,6 @@
updateTaskStackListenerState();
mOrientationState.setRotationWatcherEnabled(enabled);
if (!enabled) {
- // Reset the running task when leaving overview since it can still have a reference to
- // its thumbnail
- mTmpRunningTasks = null;
mSplitBoundsConfig = null;
mTaskOverlayFactory.clearAllActiveState();
}
@@ -1776,26 +1768,17 @@
}
/**
- * Moves the running task to the front of the carousel in tablets, to minimize animation
- * required to move the running task in grid.
+ * Moves the running task to the expected position in the carousel. In tablets, this minimize
+ * animation required to move the running task into focused task position.
*/
- public void moveRunningTaskToFront() {
- if (!mContainer.getDeviceProfile().isTablet) {
- return;
- }
-
+ public void moveRunningTaskToExpectedPosition() {
TaskView runningTaskView = getRunningTaskView();
- if (runningTaskView == null) {
+ if (runningTaskView == null || mCurrentPage != indexOfChild(runningTaskView)) {
return;
}
- if (indexOfChild(runningTaskView) != mCurrentPage) {
- return;
- }
-
- int frontIndex = enableLargeDesktopWindowingTile() ? getDesktopTaskViewCount() : 0;
-
- if (mCurrentPage <= frontIndex) {
+ int runningTaskExpectedIndex = getRunningTaskExpectedIndex(runningTaskView);
+ if (mCurrentPage == runningTaskExpectedIndex) {
return;
}
@@ -1808,12 +1791,31 @@
mMovingTaskView = null;
runningTaskView.resetPersistentViewTransforms();
- addView(runningTaskView, frontIndex);
- setCurrentPage(frontIndex);
+ addView(runningTaskView, runningTaskExpectedIndex);
+ setCurrentPage(runningTaskExpectedIndex);
updateTaskSize();
}
+ private int getRunningTaskExpectedIndex(TaskView runningTaskView) {
+ if (mContainer.getDeviceProfile().isTablet) {
+ if (runningTaskView instanceof DesktopTaskView) {
+ return 0; // Desktop running task is always in front.
+ } else if (enableLargeDesktopWindowingTile()) {
+ return getDesktopTaskViewCount(); // Other running task is behind desktop tasks.
+ } else {
+ return 0;
+ }
+ } else {
+ int currentIndex = indexOfChild(runningTaskView);
+ if (currentIndex != -1) {
+ return currentIndex; // Keep the position if running task already in layout.
+ } else {
+ return 0; // New running task are added to the front to begin with.
+ }
+ }
+ }
+
@Override
protected void onScrollerAnimationAborted() {
ActiveGestureProtoLogProxy.logOnScrollerAnimationAborted();
@@ -2496,13 +2498,6 @@
List<Task> tasksToUpdate = containers.stream()
.map(TaskContainer::getTask)
.collect(Collectors.toCollection(ArrayList::new));
- if (mTmpRunningTasks != null) {
- for (Task t : mTmpRunningTasks) {
- // Skip loading if this is the task that we are animating into
- // TODO(b/280812109) change this equality check to use A.equals(B)
- tasksToUpdate.removeIf(task -> task == t);
- }
- }
if (enableRefactorTaskThumbnail()) {
visibleTaskIds.addAll(
tasksToUpdate.stream().map((task) -> task.key.id).toList());
@@ -2510,6 +2505,7 @@
if (tasksToUpdate.isEmpty()) {
continue;
}
+ int visibilityChanges = 0;
for (Task task : tasksToUpdate) {
if (!mHasVisibleTaskData.get(task.key.id)) {
// Ignore thumbnail update if it's current running task during the gesture
@@ -2518,21 +2514,28 @@
if (taskView == getRunningTaskView() && isGestureActive()) {
changes &= ~TaskView.FLAG_UPDATE_THUMBNAIL;
}
- taskView.onTaskListVisibilityChanged(true /* visible */, changes);
+ visibilityChanges |= changes;
}
mHasVisibleTaskData.put(task.key.id, true);
}
+ if (visibilityChanges != 0) {
+ taskView.onTaskListVisibilityChanged(true /* visible */, visibilityChanges);
+ }
} else {
+ int visibilityChanges = 0;
for (TaskContainer container : containers) {
if (container == null) {
continue;
}
if (mHasVisibleTaskData.get(container.getTask().key.id)) {
- taskView.onTaskListVisibilityChanged(false /* visible */, dataChanges);
+ visibilityChanges = dataChanges;
}
mHasVisibleTaskData.delete(container.getTask().key.id);
}
+ if (visibilityChanges != 0) {
+ taskView.onTaskListVisibilityChanged(false /* visible */, visibilityChanges);
+ }
}
}
if (enableRefactorTaskThumbnail()) {
@@ -2965,25 +2968,20 @@
final TaskView taskView;
if (needDesktopTask) {
taskView = getTaskViewFromPool(TaskViewType.DESKTOP);
- mTmpRunningTasks = Arrays.copyOf(runningTasks, runningTasks.length);
- ((DesktopTaskView) taskView).bind(Arrays.asList(mTmpRunningTasks),
+ ((DesktopTaskView) taskView).bind(Arrays.asList(runningTasks),
mOrientationState, mTaskOverlayFactory);
} else if (needGroupTaskView) {
taskView = getTaskViewFromPool(TaskViewType.GROUPED);
- mTmpRunningTasks = new Task[]{runningTasks[0], runningTasks[1]};
// When we create a placeholder task view mSplitBoundsConfig will be null, but with
// the actual app running we won't need to show the thumbnail until all the tasks
// load later anyways
- ((GroupedTaskView) taskView).bind(mTmpRunningTasks[0], mTmpRunningTasks[1],
+ ((GroupedTaskView) taskView).bind(runningTasks[0], runningTasks[1],
mOrientationState, mTaskOverlayFactory, mSplitBoundsConfig);
} else {
taskView = getTaskViewFromPool(TaskViewType.SINGLE);
- // The temporary running task is only used for the duration between the start of the
- // gesture and the task list is loaded and applied
- mTmpRunningTasks = new Task[]{runningTasks[0]};
- taskView.bind(mTmpRunningTasks[0], mOrientationState, mTaskOverlayFactory);
+ taskView.bind(runningTasks[0], mOrientationState, mTaskOverlayFactory);
}
- addView(taskView, 0);
+ addView(taskView, getRunningTaskExpectedIndex(taskView));
runningTaskViewId = taskView.getTaskViewId();
if (wasEmpty) {
addView(mClearAllButton);
@@ -4719,6 +4717,7 @@
return;
}
setContentDescription(isEmpty ? mEmptyMessage : "");
+ setFocusable(isEmpty);
mShowEmptyMessage = isEmpty;
updateEmptyStateUi(hasSizeChanged);
invalidate();
@@ -5053,7 +5052,7 @@
private void updateTaskViewsSnapshotRadius() {
for (TaskView taskView : getTaskViews()) {
- taskView.updateSnapshotRadius();
+ taskView.updateFullscreenParams();
}
}
@@ -5210,7 +5209,7 @@
if (!enableRefactorTaskThumbnail()) {
taskContainer.getThumbnailViewDeprecated().refreshSplashView();
}
- mSplitHiddenTaskView.updateSnapshotRadius();
+ mSplitHiddenTaskView.updateFullscreenParams();
});
} else if (isInitiatingSplitFromTaskView) {
if (Flags.enableHoverOfChildElementsInTaskview()) {
@@ -5744,43 +5743,6 @@
updateCurrentTaskActionsVisibility();
loadVisibleTaskData(TaskView.FLAG_UPDATE_ALL);
updateEnabledOverlays();
-
- if (enableRefactorTaskThumbnail()) {
- int screenStart = 0;
- int screenEnd = 0;
- int centerPageIndex = 0;
- if (showAsGrid()) {
- screenStart = getPagedOrientationHandler().getPrimaryScroll(this);
- int pageOrientedSize = getPagedOrientationHandler().getMeasuredSize(this);
- screenEnd = screenStart + pageOrientedSize;
- } else {
- centerPageIndex = getPageNearestToCenterOfScreen();
- }
-
- Set<Integer> fullyVisibleTaskIds = new HashSet<>();
-
- // Update the task data for the in/visible children
- for (int i = 0; i < getTaskViewCount(); i++) {
- TaskView taskView = requireTaskViewAt(i);
- List<TaskContainer> containers = taskView.getTaskContainers();
- if (containers.isEmpty()) {
- continue;
- }
- boolean isFullyVisible;
- if (showAsGrid()) {
- isFullyVisible = isTaskViewFullyWithinBounds(taskView, screenStart,
- screenEnd);
- } else {
- isFullyVisible = i == centerPageIndex;
- }
- if (isFullyVisible) {
- List<Integer> taskIds = containers.stream().map(
- taskContainer -> taskContainer.getTask().key.id).toList();
- fullyVisibleTaskIds.addAll(taskIds);
- }
- }
- mRecentsViewModel.updateTasksFullyVisible(fullyVisibleTaskIds);
- }
}
@Override
@@ -5922,22 +5884,15 @@
* Finish recents animation.
*/
public void finishRecentsAnimation(boolean toRecents, @Nullable Runnable onFinishComplete) {
- finishRecentsAnimation(toRecents, false, true /* shouldPip */, onFinishComplete);
+ finishRecentsAnimation(toRecents, true /* shouldPip */, onFinishComplete);
}
/**
- * Finish recents animation.
- */
- public void finishRecentsAnimation(boolean toRecents, boolean shouldPip,
- @Nullable Runnable onFinishComplete) {
- finishRecentsAnimation(toRecents, shouldPip, false, onFinishComplete);
- }
- /**
* NOTE: Whatever value gets passed through to the toRecents param may need to also be set on
* {@link #mRecentsAnimationController#setWillFinishToHome}.
*/
public void finishRecentsAnimation(boolean toRecents, boolean shouldPip,
- boolean allAppTargetsAreTranslucent, @Nullable Runnable onFinishComplete) {
+ @Nullable Runnable onFinishComplete) {
Log.d(TAG, "finishRecentsAnimation - mRecentsAnimationController: "
+ mRecentsAnimationController);
// TODO(b/197232424#comment#10) Move this back into onRecentsAnimationComplete(). Maybe?
@@ -5969,7 +5924,7 @@
tx, null /* overlay */);
}
}
- mRecentsAnimationController.finish(toRecents, allAppTargetsAreTranslucent, () -> {
+ mRecentsAnimationController.finish(toRecents, () -> {
if (onFinishComplete != null) {
onFinishComplete.run();
}
@@ -6346,17 +6301,27 @@
}
private void updateEnabledOverlays() {
- TaskView focusedTaskView = getFocusedTaskView();
- for (TaskView taskView : getTaskViews()) {
- if (taskView == focusedTaskView) {
- continue;
+ if (enableRefactorTaskThumbnail()) {
+ Set<Integer> fullyVisibleTaskIds = new HashSet<>();
+ for (TaskView taskView : getTaskViews()) {
+ if (isTaskViewFullyVisible(taskView)) {
+ fullyVisibleTaskIds.addAll(taskView.getTaskIdSet());
+ }
}
- taskView.setOverlayEnabled(mOverlayEnabled && isTaskViewFullyVisible(taskView));
- }
- // Focus task overlay should be enabled and refreshed at last
- if (focusedTaskView != null) {
- focusedTaskView.setOverlayEnabled(
- mOverlayEnabled && isTaskViewFullyVisible(focusedTaskView));
+ mRecentsViewModel.updateTasksFullyVisible(fullyVisibleTaskIds);
+ } else {
+ TaskView focusedTaskView = getFocusedTaskView();
+ for (TaskView taskView : getTaskViews()) {
+ if (taskView == focusedTaskView) {
+ continue;
+ }
+ taskView.setOverlayEnabled(mOverlayEnabled && isTaskViewFullyVisible(taskView));
+ }
+ // Focus task overlay should be enabled and refreshed at last
+ if (focusedTaskView != null) {
+ focusedTaskView.setOverlayEnabled(
+ mOverlayEnabled && isTaskViewFullyVisible(focusedTaskView));
+ }
}
}
diff --git a/quickstep/src/com/android/quickstep/views/TaskContainer.kt b/quickstep/src/com/android/quickstep/views/TaskContainer.kt
index c940fb4..5de8d1c 100644
--- a/quickstep/src/com/android/quickstep/views/TaskContainer.kt
+++ b/quickstep/src/com/android/quickstep/views/TaskContainer.kt
@@ -16,19 +16,13 @@
package com.android.quickstep.views
-import android.content.Intent
import android.graphics.Bitmap
import android.view.View
import com.android.launcher3.Flags.enableRefactorTaskThumbnail
-import com.android.launcher3.Flags.privateSpaceRestrictAccessibilityDrag
-import com.android.launcher3.LauncherSettings
-import com.android.launcher3.model.data.ItemInfoWithIcon
-import com.android.launcher3.model.data.WorkspaceItemInfo
-import com.android.launcher3.pm.UserCache
+import com.android.launcher3.model.data.TaskViewItemInfo
import com.android.launcher3.util.SplitConfigurationOptions
import com.android.launcher3.util.TransformingTouchDelegate
import com.android.quickstep.TaskOverlayFactory
-import com.android.quickstep.TaskUtils
import com.android.quickstep.ViewUtils.addAccessibleChildToList
import com.android.quickstep.recents.di.RecentsDependencies
import com.android.quickstep.recents.di.get
@@ -123,27 +117,8 @@
else thumbnailViewDeprecated.sysUiStatusNavFlags
/** Builds proto for logging */
- val itemInfo: WorkspaceItemInfo
- get() =
- WorkspaceItemInfo().apply {
- itemType = LauncherSettings.Favorites.ITEM_TYPE_TASK
- container = LauncherSettings.Favorites.CONTAINER_TASKSWITCHER
- val componentKey = TaskUtils.getLaunchComponentKeyForTask(task.key)
- user = componentKey.user
- intent = Intent().setComponent(componentKey.componentName)
- title = task.title
- taskView.recentsView?.let { screenId = it.indexOfChild(taskView) }
- if (privateSpaceRestrictAccessibilityDrag()) {
- if (
- UserCache.getInstance(taskView.context)
- .getUserInfo(componentKey.user)
- .isPrivate
- ) {
- runtimeStatusFlags =
- runtimeStatusFlags or ItemInfoWithIcon.FLAG_NOT_PINNABLE
- }
- }
- }
+ val itemInfo: TaskViewItemInfo
+ get() = TaskViewItemInfo(this)
fun bind() {
digitalWellBeingToast?.bind(task, taskView, snapshotView, stagePosition)
@@ -181,5 +156,6 @@
addAccessibleChildToList(snapshotView, outChildren)
showWindowsView?.let { addAccessibleChildToList(it, outChildren) }
digitalWellBeingToast?.let { addAccessibleChildToList(it, outChildren) }
+ overlay.addChildForAccessibility(outChildren)
}
}
diff --git a/quickstep/src/com/android/quickstep/views/TaskThumbnailViewDeprecated.java b/quickstep/src/com/android/quickstep/views/TaskThumbnailViewDeprecated.java
index 5dbc2ef..9f2bb9a 100644
--- a/quickstep/src/com/android/quickstep/views/TaskThumbnailViewDeprecated.java
+++ b/quickstep/src/com/android/quickstep/views/TaskThumbnailViewDeprecated.java
@@ -50,9 +50,9 @@
import com.android.launcher3.util.SystemUiController;
import com.android.launcher3.util.SystemUiController.SystemUiControllerFlags;
import com.android.launcher3.util.ViewPool;
+import com.android.quickstep.FullscreenDrawParams;
import com.android.quickstep.TaskOverlayFactory.TaskOverlay;
import com.android.quickstep.orientation.RecentsPagedOrientationHandler;
-import com.android.quickstep.views.TaskView.FullscreenDrawParams;
import com.android.systemui.shared.recents.model.Task;
import com.android.systemui.shared.recents.model.ThumbnailData;
import com.android.systemui.shared.recents.utilities.PreviewPositionHelper;
@@ -107,7 +107,7 @@
// Contains the portion of the thumbnail that is clipped when fullscreen progress = 0.
private final Rect mPreviewRect = new Rect();
private final PreviewPositionHelper mPreviewPositionHelper = new PreviewPositionHelper();
- private TaskView.FullscreenDrawParams mFullscreenParams;
+ private FullscreenDrawParams mFullscreenParams;
private ImageView mSplashView;
private Drawable mSplashViewDrawable;
private TaskView mTaskView;
@@ -279,7 +279,7 @@
canvas.save();
// Draw the insets if we're being drawn fullscreen (we do this for quick switch).
drawOnCanvas(canvas, 0, 0, getMeasuredWidth(), getMeasuredHeight(),
- mFullscreenParams.getCurrentDrawnCornerRadius());
+ mFullscreenParams.getCurrentCornerRadius());
canvas.restore();
}
@@ -287,7 +287,7 @@
return mPreviewPositionHelper;
}
- public void setFullscreenParams(TaskView.FullscreenDrawParams fullscreenParams) {
+ public void setFullscreenParams(FullscreenDrawParams fullscreenParams) {
mFullscreenParams = fullscreenParams;
invalidate();
}
@@ -473,7 +473,7 @@
mBitmapShader.setLocalMatrix(mPreviewPositionHelper.getMatrix());
mPaint.setShader(mBitmapShader);
}
- mTaskView.updateCurrentFullscreenParams();
+ mTaskView.updateFullscreenParams();
invalidate();
}
diff --git a/quickstep/src/com/android/quickstep/views/TaskView.kt b/quickstep/src/com/android/quickstep/views/TaskView.kt
index b1cb407..3586dfb 100644
--- a/quickstep/src/com/android/quickstep/views/TaskView.kt
+++ b/quickstep/src/com/android/quickstep/views/TaskView.kt
@@ -59,13 +59,11 @@
import com.android.launcher3.testing.TestLogging
import com.android.launcher3.testing.shared.TestProtocol
import com.android.launcher3.util.CancellableTask
-import com.android.launcher3.util.DisplayController
import com.android.launcher3.util.Executors
import com.android.launcher3.util.MultiPropertyFactory
import com.android.launcher3.util.MultiPropertyFactory.MULTI_PROPERTY_VALUE
import com.android.launcher3.util.MultiValueAlpha
import com.android.launcher3.util.RunnableList
-import com.android.launcher3.util.SafeCloseable
import com.android.launcher3.util.SplitConfigurationOptions
import com.android.launcher3.util.SplitConfigurationOptions.STAGE_POSITION_UNDEFINED
import com.android.launcher3.util.SplitConfigurationOptions.SplitPositionOption
@@ -74,16 +72,13 @@
import com.android.launcher3.util.TransformingTouchDelegate
import com.android.launcher3.util.ViewPool
import com.android.launcher3.util.rects.set
-import com.android.launcher3.views.ActivityContext
+import com.android.quickstep.FullscreenDrawParams
import com.android.quickstep.RecentsModel
import com.android.quickstep.RemoteAnimationTargets
import com.android.quickstep.TaskOverlayFactory
import com.android.quickstep.TaskViewUtils
import com.android.quickstep.orientation.RecentsPagedOrientationHandler
-import com.android.quickstep.recents.di.RecentsDependencies
-import com.android.quickstep.recents.di.get
import com.android.quickstep.task.thumbnail.TaskThumbnailView
-import com.android.quickstep.task.viewmodel.TaskViewModel
import com.android.quickstep.util.ActiveGestureErrorDetector
import com.android.quickstep.util.ActiveGestureLog
import com.android.quickstep.util.BorderAnimator
@@ -95,7 +90,6 @@
import com.android.systemui.shared.recents.model.Task
import com.android.systemui.shared.recents.model.ThumbnailData
import com.android.systemui.shared.system.ActivityManagerWrapper
-import com.android.systemui.shared.system.QuickStepContract
/** A task in the Recents view. */
open class TaskView
@@ -107,7 +101,8 @@
defStyleRes: Int = 0,
focusBorderAnimator: BorderAnimator? = null,
hoverBorderAnimator: BorderAnimator? = null,
- private val type: TaskViewType = TaskViewType.SINGLE,
+ val type: TaskViewType = TaskViewType.SINGLE,
+ protected val thumbnailFullscreenParams: FullscreenDrawParams = FullscreenDrawParams(context),
) : FrameLayout(context, attrs), ViewPool.Reusable {
/**
* Used in conjunction with [onTaskListVisibilityChanged], providing more granularity on which
@@ -117,8 +112,6 @@
@IntDef(FLAG_UPDATE_ALL, FLAG_UPDATE_ICON, FLAG_UPDATE_THUMBNAIL, FLAG_UPDATE_CORNER_RADIUS)
annotation class TaskDataChanges
- private lateinit var taskViewModel: TaskViewModel
-
val taskIds: IntArray
/** Returns a copy of integer array containing taskIds of all tasks in the TaskView. */
get() = taskContainers.map { it.task.key.id }.toIntArray()
@@ -142,9 +135,6 @@
this == recentsView?.focusedTaskView ||
(enableLargeDesktopWindowingTile() && type == TaskViewType.DESKTOP)
- val taskCornerRadius: Float
- get() = currentFullscreenParams.cornerRadius
-
val recentsView: RecentsView<*, *>?
get() = parent as? RecentsView<*, *>
@@ -157,15 +147,9 @@
get() = taskContainers[0].task
@get:Deprecated("Use [taskContainers] instead.")
- val firstSnapshotView: View
- /** Returns the first snapshotView of the TaskView. */
- get() = taskContainers[0].snapshotView
-
- @get:Deprecated("Use [taskContainers] instead.")
val firstItemInfo: ItemInfo
get() = taskContainers[0].itemInfo
- private val currentFullscreenParams = FullscreenDrawParams(context)
protected val container: RecentsViewContainer =
RecentsViewContainer.containerFromContext(context)
protected val lastTouchDownPosition = PointF()
@@ -489,17 +473,13 @@
init {
setOnClickListener { _ -> onClick() }
- if (enableRefactorTaskThumbnail()) {
- taskViewModel = RecentsDependencies.get(this, "TaskViewType" to type)
- }
-
val cursorHoverStatesEnabled = enableCursorHoverStates()
setWillNotDraw(!cursorHoverStatesEnabled)
context.obtainStyledAttributes(attrs, R.styleable.TaskView, defStyleAttr, defStyleRes).use {
this.focusBorderAnimator =
focusBorderAnimator
?: createSimpleBorderAnimator(
- currentFullscreenParams.cornerRadius.toInt(),
+ TaskCornerRadius.get(context).toInt(),
context.resources.getDimensionPixelSize(
R.dimen.keyboard_quick_switch_border_width
),
@@ -514,7 +494,7 @@
hoverBorderAnimator
?: if (cursorHoverStatesEnabled)
createSimpleBorderAnimator(
- currentFullscreenParams.cornerRadius.toInt(),
+ TaskCornerRadius.get(context).toInt(),
context.resources.getDimensionPixelSize(
R.dimen.task_hover_border_width
),
@@ -716,7 +696,16 @@
taskOverlayFactory,
)
)
- taskContainers.forEach { it.bind() }
+ onBind(orientedState)
+ }
+
+ open fun onBind(orientedState: RecentsOrientedState) {
+ taskContainers.forEach {
+ it.bind()
+ if (enableRefactorTaskThumbnail()) {
+ it.thumbnailView.cornerRadius = thumbnailFullscreenParams.currentCornerRadius
+ }
+ }
setOrientationState(orientedState)
}
@@ -935,7 +924,7 @@
}
}
if (needsUpdate(changes, FLAG_UPDATE_CORNER_RADIUS)) {
- currentFullscreenParams.updateCornerRadius(context)
+ thumbnailFullscreenParams.updateCornerRadius(context)
}
}
@@ -1514,10 +1503,7 @@
val scale = persistentScale * dismissScale
scaleX = scale
scaleY = scale
- if (enableRefactorTaskThumbnail()) {
- taskViewModel.updateScale(scale)
- }
- updateSnapshotRadius()
+ updateFullscreenParams()
}
protected open fun applyThumbnailSplashAlpha() {
@@ -1560,30 +1546,25 @@
}
focusTransitionFullscreen.value =
FOCUS_TRANSITION_FAST_OUT_INTERPOLATOR.getInterpolation(1 - fullscreenProgress)
- updateSnapshotRadius()
+ updateFullscreenParams()
}
- protected open fun updateSnapshotRadius() {
- updateCurrentFullscreenParams()
+ protected open fun updateFullscreenParams() {
+ updateFullscreenParams(thumbnailFullscreenParams)
taskContainers.forEach {
- if (!enableRefactorTaskThumbnail()) {
- it.thumbnailViewDeprecated.setFullscreenParams(getThumbnailFullscreenParams())
+ if (enableRefactorTaskThumbnail()) {
+ it.thumbnailView.cornerRadius = thumbnailFullscreenParams.currentCornerRadius
+ } else {
+ it.thumbnailViewDeprecated.setFullscreenParams(thumbnailFullscreenParams)
}
- it.overlay.setFullscreenParams(getThumbnailFullscreenParams())
+ it.overlay.setFullscreenParams(thumbnailFullscreenParams)
}
}
- protected open fun updateCurrentFullscreenParams() {
- updateFullscreenParams(currentFullscreenParams)
- }
-
protected fun updateFullscreenParams(fullscreenParams: FullscreenDrawParams) {
recentsView?.let { fullscreenParams.setProgress(fullscreenProgress, it.scaleX, scaleX) }
}
- protected open fun getThumbnailFullscreenParams(): FullscreenDrawParams =
- currentFullscreenParams
-
private fun onModalnessUpdated(modalness: Float) {
taskContainers.forEach {
it.iconView.setModalAlpha(1 - modalness)
@@ -1630,56 +1611,6 @@
private fun getNonGridTrans(endTranslation: Float) =
endTranslation - getGridTrans(endTranslation)
- /** We update and subsequently draw these in [fullscreenProgress]. */
- open class FullscreenDrawParams(context: Context) : SafeCloseable {
- var cornerRadius = 0f
- private var windowCornerRadius = 0f
- var currentDrawnCornerRadius = 0f
-
- init {
- updateCornerRadius(context)
- }
-
- /** Recomputes the start and end corner radius for the given Context. */
- fun updateCornerRadius(context: Context) {
- cornerRadius = computeTaskCornerRadius(context)
- windowCornerRadius = computeWindowCornerRadius(context)
- }
-
- @VisibleForTesting(otherwise = VisibleForTesting.PROTECTED)
- open fun computeTaskCornerRadius(context: Context): Float {
- return TaskCornerRadius.get(context)
- }
-
- @VisibleForTesting(otherwise = VisibleForTesting.PROTECTED)
- open fun computeWindowCornerRadius(context: Context): Float {
- val activityContext: ActivityContext? = ActivityContext.lookupContextNoThrow(context)
-
- // The corner radius is fixed to match when Taskbar is persistent mode
- return if (
- activityContext != null &&
- activityContext.deviceProfile?.isTaskbarPresent == true &&
- DisplayController.isTransientTaskbar(context)
- ) {
- context.resources
- .getDimensionPixelSize(R.dimen.persistent_taskbar_corner_radius)
- .toFloat()
- } else {
- QuickStepContract.getWindowCornerRadius(context)
- }
- }
-
- /** Sets the progress in range [0, 1] */
- fun setProgress(fullscreenProgress: Float, parentScale: Float, taskViewScale: Float) {
- currentDrawnCornerRadius =
- Utilities.mapRange(fullscreenProgress, cornerRadius, windowCornerRadius) /
- parentScale /
- taskViewScale
- }
-
- override fun close() {}
- }
-
private fun MotionEvent.isWithinThumbnailBounds(): Boolean {
return thumbnailBounds.contains(x.toInt(), y.toInt())
}
diff --git a/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureProtoLogProxy.java b/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureProtoLogProxy.java
index 0091036..f25f6f4 100644
--- a/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureProtoLogProxy.java
+++ b/quickstep/src_protolog/com/android/quickstep/util/ActiveGestureProtoLogProxy.java
@@ -38,6 +38,8 @@
import static com.android.quickstep.util.ActiveGestureErrorDetector.GestureEvent.START_RECENTS_ANIMATION;
import static com.android.quickstep.util.QuickstepProtoLogGroup.ACTIVE_GESTURE_LOG;
+import android.graphics.Point;
+import android.graphics.RectF;
import android.view.MotionEvent;
import androidx.annotation.NonNull;
@@ -505,4 +507,16 @@
taskId,
packageName);
}
+
+ public static void logCreateTouchRegionForDisplay(int displayRotation,
+ @NonNull Point displaySize, @NonNull RectF swipeRegion, @NonNull RectF ohmRegion,
+ int gesturalHeight, int largerGesturalHeight, @NonNull String reason) {
+ if (!enableActiveGestureProtoLog()) return;
+ ProtoLog.d(ACTIVE_GESTURE_LOG,
+ "OrientationTouchTransformer.createRegionForDisplay: "
+ + "dispRot=%d, dispSize=%s, swipeRegion=%s, ohmRegion=%s, "
+ + "gesturalHeight=%d, largerGesturalHeight=%d, reason=%s",
+ displayRotation, displaySize.flattenToString(), swipeRegion.toShortString(),
+ ohmRegion.toShortString(), gesturalHeight, largerGesturalHeight, reason);
+ }
}
diff --git a/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/FakeTaskThumbnailViewModel.kt b/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/FakeTaskThumbnailViewModel.kt
index ff5d8bd..47d2bfc 100644
--- a/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/FakeTaskThumbnailViewModel.kt
+++ b/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/FakeTaskThumbnailViewModel.kt
@@ -22,8 +22,6 @@
import kotlinx.coroutines.flow.MutableStateFlow
class FakeTaskThumbnailViewModel : TaskThumbnailViewModel {
- override val cornerRadiusProgress = MutableStateFlow(0f)
- override val inheritedScale = MutableStateFlow(1f)
override val dimProgress = MutableStateFlow(0f)
override val splashAlpha = MutableStateFlow(0f)
override val uiState = MutableStateFlow<TaskThumbnailUiState>(Uninitialized)
diff --git a/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/TaskThumbnailViewScreenshotTest.kt b/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/TaskThumbnailViewScreenshotTest.kt
index 75769e9..49fe614 100644
--- a/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/TaskThumbnailViewScreenshotTest.kt
+++ b/quickstep/tests/multivalentScreenshotTests/src/com/android/quickstep/task/thumbnail/TaskThumbnailViewScreenshotTest.kt
@@ -66,11 +66,13 @@
val di = RecentsDependencies.initialize(context)
val taskThumbnailView =
LayoutInflater.from(context).inflate(R.layout.task_thumbnail, null, false)
+ as TaskThumbnailView
+ taskThumbnailView.cornerRadius = CORNER_RADIUS
val ttvDiScopeId = di.getScope(taskThumbnailView).scopeId
di.provide(TaskThumbnailViewData::class.java, ttvDiScopeId) { TaskThumbnailViewData() }
di.provide(TaskThumbnailViewModel::class.java, ttvDiScopeId) { taskThumbnailViewModel }
- return taskThumbnailView as TaskThumbnailView
+ return taskThumbnailView
}
companion object {
@@ -82,5 +84,7 @@
isDarkTheme = false,
isLandscape = false,
)
+
+ const val CORNER_RADIUS = 56f
}
}
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/model/data/TaskViewItemInfoTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/model/data/TaskViewItemInfoTest.kt
new file mode 100644
index 0000000..0103e7e
--- /dev/null
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/model/data/TaskViewItemInfoTest.kt
@@ -0,0 +1,154 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.launcher3.model.data
+
+import android.content.ComponentName
+import android.content.Context
+import android.content.Intent
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.platform.app.InstrumentationRegistry
+import com.android.launcher3.Flags.enableRefactorTaskThumbnail
+import com.android.launcher3.model.data.TaskViewItemInfo.Companion.createTaskViewAtom
+import com.android.launcher3.util.SplitConfigurationOptions
+import com.android.launcher3.util.TransformingTouchDelegate
+import com.android.quickstep.TaskOverlayFactory
+import com.android.quickstep.TaskOverlayFactory.TaskOverlay
+import com.android.quickstep.recents.di.RecentsDependencies
+import com.android.quickstep.task.thumbnail.TaskThumbnailView
+import com.android.quickstep.views.RecentsView
+import com.android.quickstep.views.TaskContainer
+import com.android.quickstep.views.TaskThumbnailViewDeprecated
+import com.android.quickstep.views.TaskView
+import com.android.quickstep.views.TaskViewIcon
+import com.android.quickstep.views.TaskViewType
+import com.android.systemui.shared.recents.model.Task
+import com.android.systemui.shared.recents.model.Task.TaskKey
+import com.google.common.truth.Truth.assertThat
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.kotlin.any
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.whenever
+
+/** Test for [TaskViewItemInfo] */
+@RunWith(AndroidJUnit4::class)
+class TaskViewItemInfoTest {
+ private val context = mock<Context>()
+ private val taskView = mock<TaskView>()
+ private val recentsView = mock<RecentsView<*, *>>()
+ private val overlayFactory = mock<TaskOverlayFactory>()
+
+ @Before
+ fun setUp() {
+ whenever(overlayFactory.createOverlay(any())).thenReturn(mock<TaskOverlay<*>>())
+ whenever(taskView.context).thenReturn(context)
+ whenever(taskView.recentsView).thenReturn(recentsView)
+ whenever(recentsView.indexOfChild(taskView)).thenReturn(TASK_VIEW_INDEX)
+ RecentsDependencies.initialize(InstrumentationRegistry.getInstrumentation().targetContext)
+ }
+
+ @Test
+ fun singleTask() {
+ val taskContainers = listOf(createTaskContainer(createTask(1)))
+ whenever(taskView.type).thenReturn(TaskViewType.SINGLE)
+ whenever(taskView.taskContainers).thenReturn(taskContainers)
+
+ val taskViewItemInfo = TaskViewItemInfo(taskContainers[0])
+ val taskViewAtom = taskViewItemInfo.taskViewAtom
+
+ assertThat(taskViewAtom)
+ .isEqualTo(
+ createTaskViewAtom(
+ type = 0,
+ index = TASK_VIEW_INDEX,
+ componentName = "${PACKAGE}/${CLASS}",
+ cardinality = 1,
+ )
+ )
+ }
+
+ @Test
+ fun splitTask() {
+ val taskContainers =
+ listOf(createTaskContainer(createTask(1)), createTaskContainer(createTask(2)))
+ whenever(taskView.type).thenReturn(TaskViewType.GROUPED)
+ whenever(taskView.taskContainers).thenReturn(taskContainers)
+
+ val taskViewItemInfo = TaskViewItemInfo(taskContainers[0])
+ val taskViewAtom = taskViewItemInfo.taskViewAtom
+
+ assertThat(taskViewAtom)
+ .isEqualTo(
+ createTaskViewAtom(
+ type = 1,
+ index = TASK_VIEW_INDEX,
+ componentName = "${PACKAGE}/${CLASS}",
+ cardinality = 2,
+ )
+ )
+ }
+
+ @Test
+ fun desktopTask() {
+ val taskContainers =
+ listOf(
+ createTaskContainer(createTask(1)),
+ createTaskContainer(createTask(2)),
+ createTaskContainer(createTask(3)),
+ )
+ whenever(taskView.type).thenReturn(TaskViewType.DESKTOP)
+ whenever(taskView.taskContainers).thenReturn(taskContainers)
+
+ val taskViewItemInfo = TaskViewItemInfo(taskContainers[0])
+ val taskViewAtom = taskViewItemInfo.taskViewAtom
+
+ assertThat(taskViewAtom)
+ .isEqualTo(
+ createTaskViewAtom(
+ type = 2,
+ index = TASK_VIEW_INDEX,
+ componentName = "${PACKAGE}/${CLASS}",
+ cardinality = 3,
+ )
+ )
+ }
+
+ private fun createTask(id: Int) =
+ Task(TaskKey(id, 0, Intent(), ComponentName(PACKAGE, CLASS), 0, 2000))
+
+ private fun createTaskContainer(task: Task): TaskContainer {
+ return TaskContainer(
+ taskView,
+ task,
+ if (enableRefactorTaskThumbnail()) mock<TaskThumbnailView>()
+ else mock<TaskThumbnailViewDeprecated>(),
+ mock<TaskViewIcon>(),
+ mock<TransformingTouchDelegate>(),
+ SplitConfigurationOptions.STAGE_POSITION_UNDEFINED,
+ digitalWellBeingToast = null,
+ showWindowsView = null,
+ overlayFactory,
+ )
+ }
+
+ companion object {
+ const val PACKAGE = "package"
+ const val CLASS = "class"
+ const val TASK_VIEW_INDEX = 4
+ }
+}
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarNavButtonControllerTest.java b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarNavButtonControllerTest.java
index 6ebae49..c682990 100644
--- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarNavButtonControllerTest.java
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarNavButtonControllerTest.java
@@ -353,7 +353,7 @@
mNavButtonController.sendBackKeyEvent(KeyEvent.ACTION_UP, false);
verify(mockSystemUiProxy, times(2)).onBackEvent(keyEventCaptor.capture());
verifyKeyEvent(keyEventCaptor.getAllValues().getFirst(), KeyEvent.ACTION_DOWN, false);
- verifyKeyEvent(keyEventCaptor.getAllValues().getFirst(), KeyEvent.ACTION_UP, false);
+ verifyKeyEvent(keyEventCaptor.getAllValues().getLast(), KeyEvent.ACTION_UP, false);
}
@Test
@@ -364,7 +364,7 @@
mNavButtonController.sendBackKeyEvent(KeyEvent.ACTION_UP, true);
verify(mockSystemUiProxy, times(2)).onBackEvent(keyEventCaptor.capture());
verifyKeyEvent(keyEventCaptor.getAllValues().getFirst(), KeyEvent.ACTION_DOWN, false);
- verifyKeyEvent(keyEventCaptor.getAllValues().getFirst(), KeyEvent.ACTION_UP, true);
+ verifyKeyEvent(keyEventCaptor.getAllValues().getLast(), KeyEvent.ACTION_UP, true);
}
@Test
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewTest.kt
new file mode 100644
index 0000000..0bb404b
--- /dev/null
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewTest.kt
@@ -0,0 +1,157 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.launcher3.taskbar
+
+import android.platform.test.flag.junit.FlagsParameterization
+import android.platform.test.flag.junit.FlagsParameterization.allCombinationsOf
+import android.platform.test.flag.junit.SetFlagsRule
+import com.android.launcher3.Flags.FLAG_TASKBAR_RECENTS_LAYOUT_TRANSITION
+import com.android.launcher3.R
+import com.android.launcher3.taskbar.TaskbarControllerTestUtil.runOnMainSync
+import com.android.launcher3.taskbar.TaskbarIconType.ALL_APPS
+import com.android.launcher3.taskbar.TaskbarIconType.DIVIDER
+import com.android.launcher3.taskbar.TaskbarIconType.HOTSEAT
+import com.android.launcher3.taskbar.TaskbarIconType.RECENT
+import com.android.launcher3.taskbar.TaskbarViewTestUtil.assertThat
+import com.android.launcher3.taskbar.TaskbarViewTestUtil.createHotseatItems
+import com.android.launcher3.taskbar.TaskbarViewTestUtil.createRecents
+import com.android.launcher3.taskbar.rules.TaskbarDeviceEmulationRule
+import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule
+import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule.ForceRtl
+import com.android.launcher3.taskbar.rules.TaskbarWindowSandboxContext
+import com.android.launcher3.util.LauncherMultivalentJUnit.Companion.isRunningInRobolectric
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import platform.test.runner.parameterized.ParameterizedAndroidJunit4
+import platform.test.runner.parameterized.Parameters
+
+@RunWith(ParameterizedAndroidJunit4::class)
+class TaskbarViewTest(deviceName: String, flags: FlagsParameterization) {
+
+ companion object {
+ @JvmStatic
+ @Parameters(name = "{0},{1}")
+ fun getParams(): List<Array<Any>> {
+ val devices =
+ if (isRunningInRobolectric) {
+ listOf("pixelFoldable2023", "pixelTablet2023")
+ } else {
+ listOf("onDevice") // Unused.
+ }
+ val flags = allCombinationsOf(FLAG_TASKBAR_RECENTS_LAYOUT_TRANSITION)
+ return devices.flatMap { d -> flags.map { f -> arrayOf(d, f) } } // Cartesian product.
+ }
+ }
+
+ @get:Rule(order = 0) val setFlagsRule = SetFlagsRule(flags)
+ @get:Rule(order = 1) val context = TaskbarWindowSandboxContext.create()
+ @get:Rule(order = 2) val deviceEmulationRule = TaskbarDeviceEmulationRule(context, deviceName)
+ @get:Rule(order = 3) val taskbarUnitTestRule = TaskbarUnitTestRule(this, context)
+
+ private lateinit var taskbarView: TaskbarView
+
+ @Before
+ fun obtainView() {
+ taskbarView = taskbarUnitTestRule.activityContext.dragLayer.findViewById(R.id.taskbar_view)
+ }
+
+ @Test
+ fun testUpdateItems_noItems_hasOnlyAllApps() {
+ runOnMainSync { taskbarView.updateItems(emptyArray(), emptyList()) }
+ assertThat(taskbarView).hasIconTypes(ALL_APPS)
+ }
+
+ @Test
+ fun testUpdateItems_hotseatItems_hasDividerBetweenAllAppsAndHotseat() {
+ runOnMainSync { taskbarView.updateItems(createHotseatItems(2), emptyList()) }
+ assertThat(taskbarView).hasIconTypes(ALL_APPS, DIVIDER, HOTSEAT, HOTSEAT)
+ }
+
+ @Test
+ @ForceRtl
+ fun testUpdateItems_rtlWithHotseatItems_hasDividerBetweenHotseatAndAllApps() {
+ runOnMainSync { taskbarView.updateItems(createHotseatItems(2), emptyList()) }
+ assertThat(taskbarView).hasIconTypes(HOTSEAT, HOTSEAT, DIVIDER, ALL_APPS)
+ }
+
+ @Test
+ fun testUpdateItems_withNullHotseatItem_filtersNullItem() {
+ runOnMainSync {
+ taskbarView.updateItems(arrayOf(*createHotseatItems(2), null), emptyList())
+ }
+ assertThat(taskbarView).hasIconTypes(ALL_APPS, DIVIDER, HOTSEAT, HOTSEAT)
+ }
+
+ @Test
+ @ForceRtl
+ fun testUpdateItems_rtlWithNullHotseatItem_filtersNullItem() {
+ runOnMainSync {
+ taskbarView.updateItems(arrayOf(*createHotseatItems(2), null), emptyList())
+ }
+ assertThat(taskbarView).hasIconTypes(HOTSEAT, HOTSEAT, DIVIDER, ALL_APPS)
+ }
+
+ @Test
+ fun testUpdateItems_recentsItems_hasDividerBetweenAllAppsAndRecents() {
+ runOnMainSync { taskbarView.updateItems(emptyArray(), createRecents(4)) }
+ assertThat(taskbarView).hasIconTypes(ALL_APPS, DIVIDER, *RECENT * 4)
+ }
+
+ @Test
+ fun testUpdateItems_hotseatItemsAndRecents_hasDividerBetweenHotseatAndRecents() {
+ runOnMainSync { taskbarView.updateItems(createHotseatItems(3), createRecents(2)) }
+ assertThat(taskbarView).hasIconTypes(ALL_APPS, *HOTSEAT * 3, DIVIDER, *RECENT * 2)
+ }
+
+ @Test
+ fun testUpdateItems_addHotseatItem_updatesHotseat() {
+ runOnMainSync {
+ taskbarView.updateItems(createHotseatItems(1), createRecents(1))
+ taskbarView.updateItems(createHotseatItems(2), createRecents(1))
+ }
+ assertThat(taskbarView).hasIconTypes(ALL_APPS, *HOTSEAT * 2, DIVIDER, RECENT)
+ }
+
+ @Test
+ fun testUpdateItems_removeHotseatItem_updatesHotseat() {
+ runOnMainSync {
+ taskbarView.updateItems(createHotseatItems(2), createRecents(1))
+ taskbarView.updateItems(createHotseatItems(1), createRecents(1))
+ }
+ assertThat(taskbarView).hasIconTypes(ALL_APPS, HOTSEAT, DIVIDER, RECENT)
+ }
+
+ @Test
+ fun testUpdateItems_addRecentsItem_updatesRecents() {
+ runOnMainSync {
+ taskbarView.updateItems(createHotseatItems(1), createRecents(1))
+ taskbarView.updateItems(createHotseatItems(1), createRecents(2))
+ }
+ assertThat(taskbarView).hasIconTypes(ALL_APPS, HOTSEAT, DIVIDER, *RECENT * 2)
+ }
+
+ @Test
+ fun testUpdateItems_removeRecentsItem_updatesRecents() {
+ runOnMainSync {
+ taskbarView.updateItems(createHotseatItems(1), createRecents(2))
+ taskbarView.updateItems(createHotseatItems(1), createRecents(1))
+ }
+ assertThat(taskbarView).hasIconTypes(ALL_APPS, HOTSEAT, DIVIDER, RECENT)
+ }
+}
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewTestUtil.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewTestUtil.kt
new file mode 100644
index 0000000..a6bdbb0
--- /dev/null
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewTestUtil.kt
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.launcher3.taskbar
+
+import android.content.ComponentName
+import android.content.Intent
+import android.os.Process
+import com.android.launcher3.model.data.AppInfo
+import com.android.launcher3.model.data.ItemInfo
+import com.android.launcher3.model.data.WorkspaceItemInfo
+import com.android.launcher3.taskbar.TaskbarIconType.ALL_APPS
+import com.android.launcher3.taskbar.TaskbarIconType.DIVIDER
+import com.android.launcher3.taskbar.TaskbarIconType.HOTSEAT
+import com.android.launcher3.taskbar.TaskbarIconType.OVERFLOW
+import com.android.launcher3.taskbar.TaskbarIconType.RECENT
+import com.android.quickstep.util.GroupTask
+import com.android.systemui.shared.recents.model.Task
+import com.android.systemui.shared.recents.model.Task.TaskKey
+import com.google.common.truth.FailureMetadata
+import com.google.common.truth.Subject
+import com.google.common.truth.Truth.assertAbout
+import com.google.common.truth.Truth.assertThat
+
+/** Common utilities for testing [TaskbarView]. */
+object TaskbarViewTestUtil {
+
+ /** Begins an assertion about a [TaskbarView]. */
+ fun assertThat(view: TaskbarView): TaskbarViewSubject {
+ return assertAbout(::TaskbarViewSubject).that(view)
+ }
+
+ /** Creates an array of fake hotseat items. */
+ fun createHotseatItems(size: Int): Array<ItemInfo> {
+ return Array(size) {
+ WorkspaceItemInfo(
+ AppInfo(TEST_COMPONENT, "Test App $it", Process.myUserHandle(), Intent())
+ )
+ .apply { id = it }
+ }
+ }
+
+ /** Creates a list of fake recent tasks. */
+ fun createRecents(size: Int): List<GroupTask> {
+ return List(size) {
+ GroupTask(
+ Task().apply {
+ key =
+ TaskKey(
+ it,
+ 5,
+ TEST_INTENT,
+ TEST_COMPONENT,
+ Process.myUserHandle().identifier,
+ System.currentTimeMillis(),
+ )
+ }
+ )
+ }
+ }
+}
+
+/** A `Truth` [Subject] with extensions for verifying [TaskbarView]. */
+class TaskbarViewSubject(failureMetadata: FailureMetadata, private val view: TaskbarView) :
+ Subject(failureMetadata, view) {
+
+ /** Verifies that the types of icons match [expectedTypes] in order. */
+ fun hasIconTypes(vararg expectedTypes: TaskbarIconType) {
+ val actualTypes =
+ view.iconViews.map {
+ when (it) {
+ view.allAppsButtonContainer -> ALL_APPS
+ view.taskbarDividerViewContainer -> DIVIDER
+ view.taskbarOverflowView -> OVERFLOW
+ else ->
+ when (it.tag) {
+ is ItemInfo -> HOTSEAT
+ is GroupTask -> RECENT
+ else -> throw IllegalStateException("Unknown type for $it")
+ }
+ }
+ }
+ assertThat(actualTypes).containsExactly(*expectedTypes).inOrder()
+ }
+
+ /** Verifies that recents from [startIndex] have IDs that match [expectedIds] in order. */
+ fun hasRecentsOrder(startIndex: Int, expectedIds: List<Int>) {
+ val actualIds =
+ view.iconViews.slice(startIndex..<expectedIds.size).map {
+ assertThat(it.tag).isInstanceOf(GroupTask::class.java)
+ (it.tag as? GroupTask)?.task1?.key?.id
+ }
+ assertThat(actualIds).containsExactlyElementsIn(expectedIds).inOrder()
+ }
+}
+
+/** Types of icons in the [TaskbarView]. */
+enum class TaskbarIconType {
+ ALL_APPS,
+ DIVIDER,
+ HOTSEAT,
+ RECENT,
+ OVERFLOW;
+
+ operator fun times(size: Int) = Array(size) { this }
+}
+
+private const val TEST_PACKAGE = "com.android.launcher3.taskbar"
+private val TEST_COMPONENT = ComponentName(TEST_PACKAGE, "Activity")
+private val TEST_INTENT = Intent().apply { `package` = TEST_PACKAGE }
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewWithLayoutTransitionTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewWithLayoutTransitionTest.kt
new file mode 100644
index 0000000..78d8e5d
--- /dev/null
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/TaskbarViewWithLayoutTransitionTest.kt
@@ -0,0 +1,134 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.launcher3.taskbar
+
+import android.platform.test.annotations.EnableFlags
+import android.platform.test.flag.junit.SetFlagsRule
+import com.android.launcher3.Flags.FLAG_TASKBAR_RECENTS_LAYOUT_TRANSITION
+import com.android.launcher3.R
+import com.android.launcher3.taskbar.TaskbarControllerTestUtil.runOnMainSync
+import com.android.launcher3.taskbar.TaskbarIconType.ALL_APPS
+import com.android.launcher3.taskbar.TaskbarIconType.DIVIDER
+import com.android.launcher3.taskbar.TaskbarIconType.HOTSEAT
+import com.android.launcher3.taskbar.TaskbarIconType.RECENT
+import com.android.launcher3.taskbar.TaskbarViewTestUtil.assertThat
+import com.android.launcher3.taskbar.TaskbarViewTestUtil.createHotseatItems
+import com.android.launcher3.taskbar.TaskbarViewTestUtil.createRecents
+import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule
+import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule.ForceRtl
+import com.android.launcher3.taskbar.rules.TaskbarWindowSandboxContext
+import com.android.launcher3.util.LauncherMultivalentJUnit
+import com.android.launcher3.util.LauncherMultivalentJUnit.EmulatedDevices
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(LauncherMultivalentJUnit::class)
+@EmulatedDevices(["pixelFoldable2023", "pixelTablet2023"])
+@EnableFlags(FLAG_TASKBAR_RECENTS_LAYOUT_TRANSITION)
+class TaskbarViewWithLayoutTransitionTest {
+
+ @get:Rule(order = 0) val setFlagsRule = SetFlagsRule()
+ @get:Rule(order = 1) val context = TaskbarWindowSandboxContext.create()
+ @get:Rule(order = 2) val taskbarUnitTestRule = TaskbarUnitTestRule(this, context)
+
+ private lateinit var taskbarView: TaskbarView
+
+ @Before
+ fun obtainView() {
+ taskbarView = taskbarUnitTestRule.activityContext.dragLayer.findViewById(R.id.taskbar_view)
+ }
+
+ @Test
+ @ForceRtl
+ fun testUpdateItems_rtl_hotseatItems_hasDividerBetweenHotseatAndAllApps() {
+ runOnMainSync { taskbarView.updateItems(createHotseatItems(2), emptyList()) }
+ assertThat(taskbarView).hasIconTypes(*HOTSEAT * 2, DIVIDER, ALL_APPS)
+ }
+
+ @Test
+ @ForceRtl
+ fun testUpdateItems_rtl_recentsItems_hasDividerBetweenRecentsAndAllApps() {
+ runOnMainSync { taskbarView.updateItems(emptyArray(), createRecents(4)) }
+ assertThat(taskbarView).hasIconTypes(*RECENT * 4, DIVIDER, ALL_APPS)
+ }
+
+ @Test
+ @ForceRtl
+ fun testUpdateItems_rtl_recentsItems_recentsAreReversed() {
+ runOnMainSync { taskbarView.updateItems(emptyArray(), createRecents(4)) }
+ assertThat(taskbarView).hasRecentsOrder(startIndex = 0, expectedIds = listOf(3, 2, 1, 0))
+ }
+
+ @Test
+ @ForceRtl
+ fun testUpdateItems_rtl_hotseatItemsAndRecents_hasDividerBetweenRecentsAndHotseat() {
+ runOnMainSync { taskbarView.updateItems(createHotseatItems(3), createRecents(2)) }
+ assertThat(taskbarView).hasIconTypes(*RECENT * 2, DIVIDER, *HOTSEAT * 3, ALL_APPS)
+ }
+
+ @Test
+ @ForceRtl
+ fun testUpdateItems_rtl_addHotseatItemWithoutRecents_updatesHotseat() {
+ runOnMainSync {
+ taskbarView.updateItems(createHotseatItems(1), emptyList())
+ taskbarView.updateItems(createHotseatItems(2), emptyList())
+ }
+ assertThat(taskbarView).hasIconTypes(*HOTSEAT * 2, DIVIDER, ALL_APPS)
+ }
+
+ @Test
+ @ForceRtl
+ fun testUpdateItems_rtl_addHotseatItemWithRecents_updatesHotseat() {
+ runOnMainSync {
+ taskbarView.updateItems(createHotseatItems(1), createRecents(1))
+ taskbarView.updateItems(createHotseatItems(2), createRecents(1))
+ }
+ assertThat(taskbarView).hasIconTypes(RECENT, DIVIDER, *HOTSEAT * 2, ALL_APPS)
+ }
+
+ @Test
+ @ForceRtl
+ fun testUpdateItems_rtl_removeHotseatItem_updatesHotseat() {
+ runOnMainSync {
+ taskbarView.updateItems(createHotseatItems(2), createRecents(1))
+ taskbarView.updateItems(createHotseatItems(1), createRecents(1))
+ }
+ assertThat(taskbarView).hasIconTypes(RECENT, DIVIDER, HOTSEAT, ALL_APPS)
+ }
+
+ @Test
+ @ForceRtl
+ fun testUpdateItems_rtl_addRecentsItem_updatesRecents() {
+ runOnMainSync {
+ taskbarView.updateItems(createHotseatItems(1), createRecents(1))
+ taskbarView.updateItems(createHotseatItems(1), createRecents(2))
+ }
+ assertThat(taskbarView).hasIconTypes(*RECENT * 2, DIVIDER, HOTSEAT, ALL_APPS)
+ }
+
+ @Test
+ @ForceRtl
+ fun testUpdateItems_rtl_removeRecentsItem_updatesRecents() {
+ runOnMainSync {
+ taskbarView.updateItems(createHotseatItems(1), createRecents(2))
+ taskbarView.updateItems(createHotseatItems(1), createRecents(1))
+ }
+ assertThat(taskbarView).hasIconTypes(RECENT, DIVIDER, HOTSEAT, ALL_APPS)
+ }
+}
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimatorTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimatorTest.kt
index 582ea54..8beceb0 100644
--- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimatorTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/bubbles/animation/BubbleBarViewAnimatorTest.kt
@@ -48,12 +48,15 @@
import com.android.wm.shell.shared.animation.PhysicsAnimatorTestUtils
import com.android.wm.shell.shared.bubbles.BubbleInfo
import com.google.common.truth.Truth.assertThat
+import java.util.concurrent.Semaphore
+import java.util.concurrent.TimeUnit
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.kotlin.any
import org.mockito.kotlin.atLeastOnce
+import org.mockito.kotlin.eq
import org.mockito.kotlin.mock
import org.mockito.kotlin.verify
import org.mockito.kotlin.whenever
@@ -764,10 +767,12 @@
whenever(bubbleStashController.bubbleBarTranslationY)
.thenReturn(BAR_TRANSLATION_Y_FOR_HOTSEAT)
- val barAnimator = PhysicsAnimator.getInstance(bubbleBarView)
-
+ val semaphore = Semaphore(0)
var notifiedExpanded = false
- val onExpanded = Runnable { notifiedExpanded = true }
+ val onExpanded = Runnable {
+ notifiedExpanded = true
+ semaphore.release()
+ }
val animator =
BubbleBarViewAnimator(
bubbleBarView,
@@ -792,7 +797,12 @@
// the lift animation is complete; the spring back animation should start now
InstrumentationRegistry.getInstrumentation().runOnMainSync {}
- barAnimator.assertIsRunning()
+
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync()
+
+ assertThat(semaphore.tryAcquire(5, TimeUnit.SECONDS)).isTrue()
+ // we should be expanded now
+ assertThat(bubbleBarView.isExpanded).isTrue()
PhysicsAnimatorTestUtils.blockUntilAnimationsEnd(DynamicAnimation.TRANSLATION_Y)
// verify there is no hide animation
@@ -800,7 +810,6 @@
assertThat(animator.isAnimating).isFalse()
assertThat(bubbleBarView.translationY).isEqualTo(BAR_TRANSLATION_Y_FOR_HOTSEAT)
- assertThat(bubbleBarView.isExpanded).isTrue()
verify(bubbleStashController).showBubbleBarImmediate()
assertThat(notifiedExpanded).isTrue()
}
@@ -812,10 +821,12 @@
whenever(bubbleStashController.bubbleBarTranslationY)
.thenReturn(BAR_TRANSLATION_Y_FOR_HOTSEAT)
- val barAnimator = PhysicsAnimator.getInstance(bubbleBarView)
-
+ val semaphore = Semaphore(0)
var notifiedExpanded = false
- val onExpanded = Runnable { notifiedExpanded = true }
+ val onExpanded = Runnable {
+ notifiedExpanded = true
+ semaphore.release()
+ }
val animator =
BubbleBarViewAnimator(
bubbleBarView,
@@ -838,6 +849,10 @@
animatorTestRule.advanceTimeBy(100)
}
+ // verify there is a pending hide animation
+ assertThat(animatorScheduler.delayedBlock).isNotNull()
+ assertThat(animator.isAnimating).isTrue()
+
// send the expand signal in the middle of the lift animation
InstrumentationRegistry.getInstrumentation().runOnMainSync {
animator.expandedWhileAnimating()
@@ -848,14 +863,11 @@
animatorTestRule.advanceTimeBy(150)
}
- // verify there is a pending hide animation
- assertThat(animatorScheduler.delayedBlock).isNotNull()
- assertThat(animator.isAnimating).isTrue()
-
// the lift animation is complete; the spring back animation should start now. wait for it
// to complete
InstrumentationRegistry.getInstrumentation().runOnMainSync {}
- barAnimator.assertIsRunning()
+
+ assertThat(semaphore.tryAcquire(5, TimeUnit.SECONDS)).isTrue()
PhysicsAnimatorTestUtils.blockUntilAnimationsEnd(DynamicAnimation.TRANSLATION_Y)
// verify that the hide animation was canceled
@@ -1266,6 +1278,50 @@
verify(bubbleStashController).stashBubbleBarImmediate()
}
+ @Test
+ fun interruptForIme() {
+ setUpBubbleBar()
+ setUpBubbleStashController()
+
+ val handle = View(context)
+ val handleAnimator = PhysicsAnimator.getInstance(handle)
+ whenever(bubbleStashController.getStashedHandlePhysicsAnimator()).thenReturn(handleAnimator)
+
+ val animator =
+ BubbleBarViewAnimator(
+ bubbleBarView,
+ bubbleStashController,
+ flyoutController,
+ onExpandedNoOp,
+ animatorScheduler,
+ )
+
+ InstrumentationRegistry.getInstrumentation().runOnMainSync {
+ animator.animateBubbleInForStashed(bubble, isExpanding = false)
+ }
+
+ // wait for the animation to start
+ InstrumentationRegistry.getInstrumentation().runOnMainSync {}
+ PhysicsAnimatorTestUtils.blockUntilFirstAnimationFrameWhereTrue(handleAnimator) { true }
+
+ handleAnimator.assertIsRunning()
+ assertThat(animator.isAnimating).isTrue()
+ // verify the hide bubble animation is pending
+ assertThat(animatorScheduler.delayedBlock).isNotNull()
+
+ InstrumentationRegistry.getInstrumentation().runOnMainSync { animator.interruptForIme() }
+
+ // verify that the hide animation was canceled
+ assertThat(animatorScheduler.delayedBlock).isNull()
+ assertThat(animator.isAnimating).isFalse()
+ verify(bubbleStashController).onNewBubbleAnimationInterrupted(eq(true), any())
+
+ // PhysicsAnimatorTestUtils posts the cancellation to the main thread so we need to wait
+ // again
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync()
+ handleAnimator.assertIsNotRunning()
+ }
+
private fun setUpBubbleBar() {
bubbleBarView = BubbleBarView(context)
InstrumentationRegistry.getInstrumentation().runOnMainSync {
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/DesktopFullscreenDrawParamsTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/DesktopFullscreenDrawParamsTest.kt
new file mode 100644
index 0000000..e62455f
--- /dev/null
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/DesktopFullscreenDrawParamsTest.kt
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.quickstep
+
+import android.content.Context
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.kotlin.mock
+
+/** Test for [DesktopFullscreenDrawParams] class. */
+@SmallTest
+@RunWith(AndroidJUnit4::class)
+class DesktopFullscreenDrawParamsTest() {
+ private val params =
+ DesktopFullscreenDrawParams(mock<Context>(), cornerRadiusProvider = { CORNER_RADIUS })
+
+ @Test
+ fun setMiddleProgress_invariantCornerRadiusForDesktop() {
+ params.setProgress(fullscreenProgress = 0f, parentScale = 1f, taskViewScale = 1f)
+ assertThat(params.currentCornerRadius).isEqualTo(CORNER_RADIUS)
+
+ params.setProgress(fullscreenProgress = 0.67f, parentScale = 1f, taskViewScale = 1f)
+ assertThat(params.currentCornerRadius).isEqualTo(CORNER_RADIUS)
+
+ params.setProgress(fullscreenProgress = 1f, parentScale = 1f, taskViewScale = 1f)
+ assertThat(params.currentCornerRadius).isEqualTo(CORNER_RADIUS)
+ }
+
+ companion object {
+ const val CORNER_RADIUS = 32f
+ }
+}
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/FullscreenDrawParamsTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/FullscreenDrawParamsTest.kt
index 5d62a4c..99b81e0 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/FullscreenDrawParamsTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/FullscreenDrawParamsTest.kt
@@ -20,21 +20,17 @@
import androidx.test.filters.SmallTest
import com.android.launcher3.FakeInvariantDeviceProfileTest
import com.android.quickstep.util.TaskCornerRadius
-import com.android.quickstep.views.TaskView.FullscreenDrawParams
import com.android.systemui.shared.system.QuickStepContract
import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
-import org.mockito.Mockito.doReturn
-import org.mockito.Mockito.mock
-import org.mockito.Mockito.spy
+import org.mockito.kotlin.mock
-/** Test for FullscreenDrawParams class. */
+/** Test for [FullscreenDrawParams] class. */
@SmallTest
@RunWith(AndroidJUnit4::class)
class FullscreenDrawParamsTest : FakeInvariantDeviceProfileTest() {
-
private lateinit var params: FullscreenDrawParams
@Before
@@ -46,115 +42,108 @@
fun setStartProgress_correctCornerRadiusForTablet() {
initializeVarsForTablet()
- params.setProgress(
- /* fullscreenProgress= */ 0f,
- /* parentScale= */ 1.0f,
- /* taskViewScale= */ 1.0f
- )
+ params.setProgress(fullscreenProgress = 0f, parentScale = 1.0f, taskViewScale = 1.0f)
val expectedRadius = TaskCornerRadius.get(context)
- assertThat(params.currentDrawnCornerRadius).isEqualTo(expectedRadius)
+ assertThat(params.currentCornerRadius).isEqualTo(expectedRadius)
}
@Test
fun setFullProgress_correctCornerRadiusForTablet() {
initializeVarsForTablet()
- params.setProgress(
- /* fullscreenProgress= */ 1.0f,
- /* parentScale= */ 1.0f,
- /* taskViewScale= */ 1.0f
- )
+ params.setProgress(fullscreenProgress = 1.0f, parentScale = 1f, taskViewScale = 1f)
val expectedRadius = QuickStepContract.getWindowCornerRadius(context)
- assertThat(params.currentDrawnCornerRadius).isEqualTo(expectedRadius)
+ assertThat(params.currentCornerRadius).isEqualTo(expectedRadius)
}
@Test
fun setStartProgress_correctCornerRadiusForPhone() {
initializeVarsForPhone()
- params.setProgress(
- /* fullscreenProgress= */ 0f,
- /* parentScale= */ 1.0f,
- /* taskViewScale= */ 1.0f
- )
+ params.setProgress(fullscreenProgress = 0f, parentScale = 1f, taskViewScale = 1f)
val expectedRadius = TaskCornerRadius.get(context)
- assertThat(params.currentDrawnCornerRadius).isEqualTo(expectedRadius)
+ assertThat(params.currentCornerRadius).isEqualTo(expectedRadius)
}
@Test
fun setFullProgress_correctCornerRadiusForPhone() {
initializeVarsForPhone()
- params.setProgress(
- /* fullscreenProgress= */ 1.0f,
- /* parentScale= */ 1.0f,
- /* taskViewScale= */ 1.0f
- )
+ params.setProgress(fullscreenProgress = 1.0f, parentScale = 1f, taskViewScale = 1f)
val expectedRadius = QuickStepContract.getWindowCornerRadius(context)
- assertThat(params.currentDrawnCornerRadius).isEqualTo(expectedRadius)
+ assertThat(params.currentCornerRadius).isEqualTo(expectedRadius)
}
@Test
fun setStartProgress_correctCornerRadiusForMultiDisplay() {
- val display1Context = context
- val display2Context = mock(Context::class.java)
- val spyParams = spy(params)
+ val display1Context = mock<Context>()
+ val display2Context = mock<Context>()
+ val display1TaskRadius = TASK_CORNER_RADIUS + 1
+ val display2TaskRadius = TASK_CORNER_RADIUS + 2
- val display1TaskRadius = TaskCornerRadius.get(display1Context)
- val display1WindowRadius = QuickStepContract.getWindowCornerRadius(display1Context)
- val display2TaskRadius = display1TaskRadius * 2 + 1 // Arbitrarily different.
- val display2WindowRadius = display1WindowRadius * 2 + 1 // Arbitrarily different.
- doReturn(display2TaskRadius).`when`(spyParams).computeTaskCornerRadius(display2Context)
- doReturn(display2WindowRadius).`when`(spyParams).computeWindowCornerRadius(display2Context)
+ val params =
+ FullscreenDrawParams(
+ context,
+ taskCornerRadiusProvider = { context ->
+ when (context) {
+ display1Context -> display1TaskRadius
+ display2Context -> display2TaskRadius
+ else -> TASK_CORNER_RADIUS
+ }
+ },
+ windowCornerRadiusProvider = { 0f },
+ )
- spyParams.updateCornerRadius(display1Context)
- spyParams.setProgress(
- /* fullscreenProgress= */ 0f,
- /* parentScale= */ 1.0f,
- /* taskViewScale= */ 1.0f
- )
- assertThat(spyParams.currentDrawnCornerRadius).isEqualTo(display1TaskRadius)
+ params.setProgress(fullscreenProgress = 0f, parentScale = 1f, taskViewScale = 1f)
+ assertThat(params.currentCornerRadius).isEqualTo(TASK_CORNER_RADIUS)
- spyParams.updateCornerRadius(display2Context)
- spyParams.setProgress(
- /* fullscreenProgress= */ 0f,
- /* parentScale= */ 1.0f,
- /* taskViewScale= */ 1.0f
- )
- assertThat(spyParams.currentDrawnCornerRadius).isEqualTo(display2TaskRadius)
+ params.updateCornerRadius(display1Context)
+ params.setProgress(fullscreenProgress = 0f, parentScale = 1f, taskViewScale = 1f)
+ assertThat(params.currentCornerRadius).isEqualTo(display1TaskRadius)
+
+ params.updateCornerRadius(display2Context)
+ params.setProgress(fullscreenProgress = 0f, parentScale = 1f, taskViewScale = 1f)
+ assertThat(params.currentCornerRadius).isEqualTo(display2TaskRadius)
}
@Test
fun setFullProgress_correctCornerRadiusForMultiDisplay() {
- val display1Context = context
- val display2Context = mock(Context::class.java)
- val spyParams = spy(params)
+ val display1Context = mock<Context>()
+ val display2Context = mock<Context>()
+ val display1WindowRadius = WINDOW_CORNER_RADIUS + 1
+ val display2WindowRadius = WINDOW_CORNER_RADIUS + 2
- val display1TaskRadius = TaskCornerRadius.get(display1Context)
- val display1WindowRadius = QuickStepContract.getWindowCornerRadius(display1Context)
- val display2TaskRadius = display1TaskRadius * 2 + 1 // Arbitrarily different.
- val display2WindowRadius = display1WindowRadius * 2 + 1 // Arbitrarily different.
- doReturn(display2TaskRadius).`when`(spyParams).computeTaskCornerRadius(display2Context)
- doReturn(display2WindowRadius).`when`(spyParams).computeWindowCornerRadius(display2Context)
+ val params =
+ FullscreenDrawParams(
+ context,
+ taskCornerRadiusProvider = { 0f },
+ windowCornerRadiusProvider = { context ->
+ when (context) {
+ display1Context -> display1WindowRadius
+ display2Context -> display2WindowRadius
+ else -> WINDOW_CORNER_RADIUS
+ }
+ },
+ )
- spyParams.updateCornerRadius(display1Context)
- spyParams.setProgress(
- /* fullscreenProgress= */ 1.0f,
- /* parentScale= */ 1.0f,
- /* taskViewScale= */ 1.0f
- )
- assertThat(spyParams.currentDrawnCornerRadius).isEqualTo(display1WindowRadius)
+ params.setProgress(fullscreenProgress = 1f, parentScale = 1f, taskViewScale = 1f)
+ assertThat(params.currentCornerRadius).isEqualTo(WINDOW_CORNER_RADIUS)
- spyParams.updateCornerRadius(display2Context)
- spyParams.setProgress(
- /* fullscreenProgress= */ 1.0f,
- /* parentScale= */ 1.0f,
- /* taskViewScale= */ 1.0f,
- )
- assertThat(spyParams.currentDrawnCornerRadius).isEqualTo(display2WindowRadius)
+ params.updateCornerRadius(display1Context)
+ params.setProgress(fullscreenProgress = 1f, parentScale = 1f, taskViewScale = 1f)
+ assertThat(params.currentCornerRadius).isEqualTo(display1WindowRadius)
+
+ params.updateCornerRadius(display2Context)
+ params.setProgress(fullscreenProgress = 1f, parentScale = 1f, taskViewScale = 1f)
+ assertThat(params.currentCornerRadius).isEqualTo(display2WindowRadius)
+ }
+
+ companion object {
+ const val TASK_CORNER_RADIUS = 56f
+ const val WINDOW_CORNER_RADIUS = 32f
}
}
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/task/thumbnail/TaskThumbnailViewModelImplTest.kt b/quickstep/tests/multivalentTests/src/com/android/quickstep/task/thumbnail/TaskThumbnailViewModelImplTest.kt
index e3a6adf..a777bd4 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/task/thumbnail/TaskThumbnailViewModelImplTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/task/thumbnail/TaskThumbnailViewModelImplTest.kt
@@ -37,8 +37,6 @@
import com.android.quickstep.task.thumbnail.TaskThumbnailUiState.Uninitialized
import com.android.quickstep.task.viewmodel.TaskContainerData
import com.android.quickstep.task.viewmodel.TaskThumbnailViewModelImpl
-import com.android.quickstep.task.viewmodel.TaskViewData
-import com.android.quickstep.views.TaskViewType
import com.android.systemui.shared.recents.model.Task
import com.android.systemui.shared.recents.model.ThumbnailData
import com.google.common.truth.Truth.assertThat
@@ -57,9 +55,7 @@
private val dispatcher = StandardTestDispatcher()
private val testScope = TestScope(dispatcher)
- private var taskViewType = TaskViewType.SINGLE
private val recentsViewData = RecentsViewData()
- private val taskViewData by lazy { TaskViewData(taskViewType) }
private val taskContainerData = TaskContainerData()
private val dispatcherProvider = TestDispatcherProvider(dispatcher)
private val tasksRepository = FakeTasksRepository()
@@ -69,7 +65,6 @@
private val systemUnderTest by lazy {
TaskThumbnailViewModelImpl(
recentsViewData,
- taskViewData,
taskContainerData,
dispatcherProvider,
tasksRepository,
@@ -124,40 +119,6 @@
}
@Test
- fun setRecentsFullscreenProgress_thenCornerRadiusProgressIsPassedThrough() =
- testScope.runTest {
- recentsViewData.fullscreenProgress.value = 0.5f
-
- assertThat(systemUnderTest.cornerRadiusProgress.first()).isEqualTo(0.5f)
-
- recentsViewData.fullscreenProgress.value = 0.6f
-
- assertThat(systemUnderTest.cornerRadiusProgress.first()).isEqualTo(0.6f)
- }
-
- @Test
- fun setRecentsFullscreenProgress_thenCornerRadiusProgressIsConstantForDesktop() =
- testScope.runTest {
- taskViewType = TaskViewType.DESKTOP
- recentsViewData.fullscreenProgress.value = 0.5f
-
- assertThat(systemUnderTest.cornerRadiusProgress.first()).isEqualTo(1f)
-
- recentsViewData.fullscreenProgress.value = 0.6f
-
- assertThat(systemUnderTest.cornerRadiusProgress.first()).isEqualTo(1f)
- }
-
- @Test
- fun setAncestorScales_thenScaleIsCalculated() =
- testScope.runTest {
- recentsViewData.scale.value = 0.5f
- taskViewData.scale.value = 0.6f
-
- assertThat(systemUnderTest.inheritedScale.first()).isEqualTo(0.3f)
- }
-
- @Test
fun bindRunningTaskThenStoppedTaskWithoutThumbnail_thenStateChangesToBackgroundOnly() =
testScope.runTest {
val runningTaskId = 1
diff --git a/quickstep/tests/multivalentTests/src/com/android/quickstep/util/TaskViewSimulatorTest.java b/quickstep/tests/multivalentTests/src/com/android/quickstep/util/TaskViewSimulatorTest.java
index 72cfd92..fa81680 100644
--- a/quickstep/tests/multivalentTests/src/com/android/quickstep/util/TaskViewSimulatorTest.java
+++ b/quickstep/tests/multivalentTests/src/com/android/quickstep/util/TaskViewSimulatorTest.java
@@ -202,7 +202,7 @@
mDeviceProfile.updateInsets(mLauncherInsets);
TaskViewSimulator tvs = new TaskViewSimulator(helper.sandboxContext,
- FallbackActivityInterface.INSTANCE);
+ FallbackActivityInterface.INSTANCE, false, 0);
tvs.setDp(mDeviceProfile);
int launcherRotation = info.rotation;
diff --git a/quickstep/tests/src/com/android/quickstep/DesktopSystemShortcutTest.kt b/quickstep/tests/src/com/android/quickstep/DesktopSystemShortcutTest.kt
index 231c113..94e7c2e 100644
--- a/quickstep/tests/src/com/android/quickstep/DesktopSystemShortcutTest.kt
+++ b/quickstep/tests/src/com/android/quickstep/DesktopSystemShortcutTest.kt
@@ -18,8 +18,6 @@
import android.content.ComponentName
import android.content.Intent
-import android.platform.test.flag.junit.SetFlagsRule
-import com.android.dx.mockito.inline.extended.ExtendedMockito
import com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession
import com.android.dx.mockito.inline.extended.StaticMockitoSession
import com.android.launcher3.AbstractFloatingView
@@ -27,7 +25,7 @@
import com.android.launcher3.Flags.enableRefactorTaskThumbnail
import com.android.launcher3.logging.StatsLogManager
import com.android.launcher3.logging.StatsLogManager.LauncherEvent
-import com.android.launcher3.model.data.WorkspaceItemInfo
+import com.android.launcher3.model.data.TaskViewItemInfo
import com.android.launcher3.uioverrides.QuickstepLauncher
import com.android.launcher3.util.SplitConfigurationOptions
import com.android.launcher3.util.TransformingTouchDelegate
@@ -40,14 +38,13 @@
import com.android.quickstep.views.TaskViewIcon
import com.android.systemui.shared.recents.model.Task
import com.android.systemui.shared.recents.model.Task.TaskKey
-import com.android.window.flags.Flags
import com.android.wm.shell.shared.desktopmode.DesktopModeStatus
import com.android.wm.shell.shared.desktopmode.DesktopModeTransitionSource
import com.google.common.truth.Truth.assertThat
import org.junit.After
import org.junit.Before
-import org.junit.Rule
import org.junit.Test
+import org.mockito.Mockito.`when`
import org.mockito.kotlin.any
import org.mockito.kotlin.doReturn
import org.mockito.kotlin.eq
@@ -57,24 +54,18 @@
import org.mockito.kotlin.whenever
import org.mockito.quality.Strictness
-/** Test for DesktopSystemShortcut */
+/** Test for [DesktopSystemShortcut] */
class DesktopSystemShortcutTest {
- @get:Rule val setFlagsRule = SetFlagsRule(SetFlagsRule.DefaultInitValueType.DEVICE_DEFAULT)
-
private val launcher: QuickstepLauncher = mock()
private val statsLogManager: StatsLogManager = mock()
private val statsLogger: StatsLogManager.StatsLogger = mock()
private val recentsView: LauncherRecentsView = mock()
private val taskView: TaskView = mock()
- private val workspaceItemInfo: WorkspaceItemInfo = mock()
private val abstractFloatingViewHelper: AbstractFloatingViewHelper = mock()
- private val iconView: TaskViewIcon = mock()
- private val transformingTouchDelegate: TransformingTouchDelegate = mock()
+ private val overlayFactory: TaskOverlayFactory = mock()
private val factory: TaskShortcutFactory =
DesktopSystemShortcut.createFactory(abstractFloatingViewHelper)
- private val overlayFactory: TaskOverlayFactory = mock()
- private val overlay: TaskOverlay<*> = mock()
private lateinit var mockitoSession: StaticMockitoSession
@@ -83,11 +74,10 @@
mockitoSession =
mockitoSession()
.strictness(Strictness.LENIENT)
- .spyStatic(DesktopModeStatus::class.java)
+ .mockStatic(DesktopModeStatus::class.java)
.startMocking()
- ExtendedMockito.doReturn(true).`when` { DesktopModeStatus.enforceDeviceRestrictions() }
- ExtendedMockito.doReturn(true).`when` { DesktopModeStatus.isDesktopModeSupported(any()) }
- whenever(overlayFactory.createOverlay(any())).thenReturn(overlay)
+ whenever(DesktopModeStatus.canEnterDesktopMode(any())).thenReturn(true)
+ whenever(overlayFactory.createOverlay(any())).thenReturn(mock<TaskOverlay<*>>())
}
@After
@@ -97,22 +87,7 @@
@Test
fun createDesktopTaskShortcutFactory_desktopModeDisabled() {
- setFlagsRule.disableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE)
-
- val task =
- Task(TaskKey(1, 0, Intent(), ComponentName("", ""), 0, 2000)).apply {
- isDockable = true
- }
- val taskContainer = createTaskContainer(task)
-
- val shortcuts = factory.getShortcuts(launcher, taskContainer)
- assertThat(shortcuts).isNull()
- }
-
- @Test
- fun createDesktopTaskShortcutFactory_desktopModeEnabled_DeviceNotSupported() {
- setFlagsRule.enableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE)
- ExtendedMockito.doReturn(false).`when` { DesktopModeStatus.isDesktopModeSupported(any()) }
+ `when`(DesktopModeStatus.canEnterDesktopMode(any())).thenReturn(false)
val taskContainer = createTaskContainer(createTask())
@@ -121,22 +96,7 @@
}
@Test
- fun createDesktopTaskShortcutFactory_desktopModeEnabled_DeviceNotSupported_OverrideEnabled() {
- setFlagsRule.enableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE)
- ExtendedMockito.doReturn(false).`when` { DesktopModeStatus.isDesktopModeSupported(any()) }
- ExtendedMockito.doReturn(false).`when` { DesktopModeStatus.enforceDeviceRestrictions() }
-
- val taskContainer = spy(createTaskContainer(createTask()))
- doReturn(workspaceItemInfo).whenever(taskContainer).itemInfo
-
- val shortcuts = factory.getShortcuts(launcher, taskContainer)
- assertThat(shortcuts).isNotNull()
- }
-
- @Test
fun createDesktopTaskShortcutFactory_undockable() {
- setFlagsRule.enableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE)
-
val unDockableTask = createTask().apply { isDockable = false }
val taskContainer = createTaskContainer(unDockableTask)
@@ -146,8 +106,6 @@
@Test
fun desktopSystemShortcutClicked() {
- setFlagsRule.enableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE)
-
val task = createTask()
val taskContainer = spy(createTaskContainer(task))
@@ -159,13 +117,14 @@
val successCallback = it.getArgument<Runnable>(2)
successCallback.run()
}
- doReturn(workspaceItemInfo).whenever(taskContainer).itemInfo
+ val taskViewItemInfo = mock<TaskViewItemInfo>()
+ doReturn(taskViewItemInfo).whenever(taskContainer).itemInfo
val shortcuts = factory.getShortcuts(launcher, taskContainer)
- assertThat(shortcuts).hasSize(1)
- assertThat(shortcuts!!.first()).isInstanceOf(DesktopSystemShortcut::class.java)
+ assertThat(shortcuts).isNotNull()
+ assertThat(shortcuts!!.single()).isInstanceOf(DesktopSystemShortcut::class.java)
- val desktopShortcut = shortcuts.first() as DesktopSystemShortcut
+ val desktopShortcut = shortcuts.single() as DesktopSystemShortcut
desktopShortcut.onClick(taskView)
@@ -178,30 +137,24 @@
eq(DesktopModeTransitionSource.APP_FROM_OVERVIEW),
any(),
)
- verify(statsLogger).withItemInfo(workspaceItemInfo)
+ verify(statsLogger).withItemInfo(taskViewItemInfo)
verify(statsLogger).log(LauncherEvent.LAUNCHER_SYSTEM_SHORTCUT_DESKTOP_TAP)
}
- private fun createTask(): Task {
- return Task(TaskKey(1, 0, Intent(), ComponentName("", ""), 0, 2000)).apply {
- isDockable = true
- }
- }
+ private fun createTask() =
+ Task(TaskKey(1, 0, Intent(), ComponentName("", ""), 0, 2000)).apply { isDockable = true }
- private fun createTaskContainer(task: Task): TaskContainer {
- val snapshotView =
- if (enableRefactorTaskThumbnail()) mock<TaskThumbnailView>()
- else mock<TaskThumbnailViewDeprecated>()
- return TaskContainer(
+ private fun createTaskContainer(task: Task) =
+ TaskContainer(
taskView,
task,
- snapshotView,
- iconView,
- transformingTouchDelegate,
+ if (enableRefactorTaskThumbnail()) mock<TaskThumbnailView>()
+ else mock<TaskThumbnailViewDeprecated>(),
+ mock<TaskViewIcon>(),
+ mock<TransformingTouchDelegate>(),
SplitConfigurationOptions.STAGE_POSITION_UNDEFINED,
digitalWellBeingToast = null,
showWindowsView = null,
overlayFactory,
)
- }
}
diff --git a/quickstep/tests/src/com/android/quickstep/ExternalDisplaySystemShortcutTest.kt b/quickstep/tests/src/com/android/quickstep/ExternalDisplaySystemShortcutTest.kt
index 8968b9c..9c2c13c 100644
--- a/quickstep/tests/src/com/android/quickstep/ExternalDisplaySystemShortcutTest.kt
+++ b/quickstep/tests/src/com/android/quickstep/ExternalDisplaySystemShortcutTest.kt
@@ -18,10 +18,8 @@
import android.content.ComponentName
import android.content.Intent
-import android.platform.test.annotations.DisableFlags
import android.platform.test.annotations.EnableFlags
import android.platform.test.flag.junit.SetFlagsRule
-import com.android.dx.mockito.inline.extended.ExtendedMockito
import com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession
import com.android.dx.mockito.inline.extended.StaticMockitoSession
import com.android.launcher3.AbstractFloatingView
@@ -29,7 +27,7 @@
import com.android.launcher3.Flags.enableRefactorTaskThumbnail
import com.android.launcher3.logging.StatsLogManager
import com.android.launcher3.logging.StatsLogManager.LauncherEvent
-import com.android.launcher3.model.data.WorkspaceItemInfo
+import com.android.launcher3.model.data.TaskViewItemInfo
import com.android.launcher3.uioverrides.QuickstepLauncher
import com.android.launcher3.util.SplitConfigurationOptions
import com.android.launcher3.util.TransformingTouchDelegate
@@ -49,6 +47,7 @@
import org.junit.Before
import org.junit.Rule
import org.junit.Test
+import org.mockito.Mockito.`when`
import org.mockito.kotlin.any
import org.mockito.kotlin.doReturn
import org.mockito.kotlin.eq
@@ -58,7 +57,7 @@
import org.mockito.kotlin.whenever
import org.mockito.quality.Strictness
-/** Test for ExternalDisplaySystemShortcut */
+/** Test for [ExternalDisplaySystemShortcut] */
class ExternalDisplaySystemShortcutTest {
@get:Rule val setFlagsRule = SetFlagsRule(SetFlagsRule.DefaultInitValueType.DEVICE_DEFAULT)
@@ -68,14 +67,10 @@
private val statsLogger: StatsLogManager.StatsLogger = mock()
private val recentsView: LauncherRecentsView = mock()
private val taskView: TaskView = mock()
- private val workspaceItemInfo: WorkspaceItemInfo = mock()
private val abstractFloatingViewHelper: AbstractFloatingViewHelper = mock()
- private val iconView: TaskViewIcon = mock()
- private val transformingTouchDelegate: TransformingTouchDelegate = mock()
+ private val overlayFactory: TaskOverlayFactory = mock()
private val factory: TaskShortcutFactory =
ExternalDisplaySystemShortcut.createFactory(abstractFloatingViewHelper)
- private val overlayFactory: TaskOverlayFactory = mock()
- private val overlay: TaskOverlay<*> = mock()
private lateinit var mockitoSession: StaticMockitoSession
@@ -84,11 +79,10 @@
mockitoSession =
mockitoSession()
.strictness(Strictness.LENIENT)
- .spyStatic(DesktopModeStatus::class.java)
+ .mockStatic(DesktopModeStatus::class.java)
.startMocking()
- ExtendedMockito.doReturn(true).`when` { DesktopModeStatus.enforceDeviceRestrictions() }
- ExtendedMockito.doReturn(true).`when` { DesktopModeStatus.isDesktopModeSupported(any()) }
- whenever(overlayFactory.createOverlay(any())).thenReturn(overlay)
+ whenever(DesktopModeStatus.canEnterDesktopMode(any())).thenReturn(true)
+ whenever(overlayFactory.createOverlay(any())).thenReturn(mock<TaskOverlay<*>>())
}
@After
@@ -97,23 +91,9 @@
}
@Test
- @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE)
@EnableFlags(Flags.FLAG_MOVE_TO_EXTERNAL_DISPLAY_SHORTCUT)
fun createExternalDisplayTaskShortcut_desktopModeDisabled() {
- val task = createTask()
- val taskContainer = createTaskContainer(task)
-
- val shortcuts = factory.getShortcuts(launcher, taskContainer)
- assertThat(shortcuts).isNull()
- }
-
- @Test
- @EnableFlags(
- Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE,
- Flags.FLAG_MOVE_TO_EXTERNAL_DISPLAY_SHORTCUT,
- )
- fun createExternalDisplayTaskShortcut_desktopModeEnabled_deviceNotSupported() {
- ExtendedMockito.doReturn(false).`when` { DesktopModeStatus.isDesktopModeSupported(any()) }
+ `when`(DesktopModeStatus.canEnterDesktopMode(any())).thenReturn(false)
val taskContainer = createTaskContainer(createTask())
@@ -122,26 +102,7 @@
}
@Test
- @EnableFlags(
- Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE,
- Flags.FLAG_MOVE_TO_EXTERNAL_DISPLAY_SHORTCUT,
- )
- fun createExternalDisplayTaskShortcut_desktopModeEnabled_deviceNotSupported_overrideEnabled() {
- ExtendedMockito.doReturn(false).`when` { DesktopModeStatus.isDesktopModeSupported(any()) }
- ExtendedMockito.doReturn(false).`when` { DesktopModeStatus.enforceDeviceRestrictions() }
-
- val taskContainer = spy(createTaskContainer(createTask()))
- doReturn(workspaceItemInfo).whenever(taskContainer).itemInfo
-
- val shortcuts = factory.getShortcuts(launcher, taskContainer)
- assertThat(shortcuts).isNotNull()
- }
-
- @Test
- @EnableFlags(
- Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE,
- Flags.FLAG_MOVE_TO_EXTERNAL_DISPLAY_SHORTCUT,
- )
+ @EnableFlags(Flags.FLAG_MOVE_TO_EXTERNAL_DISPLAY_SHORTCUT)
fun externalDisplaySystemShortcutClicked() {
val task = createTask()
val taskContainer = spy(createTaskContainer(task))
@@ -154,7 +115,8 @@
val successCallback = it.getArgument<Runnable>(1)
successCallback.run()
}
- doReturn(workspaceItemInfo).whenever(taskContainer).itemInfo
+ val taskViewItemInfo = mock<TaskViewItemInfo>()
+ doReturn(taskViewItemInfo).whenever(taskContainer).itemInfo
val shortcuts = factory.getShortcuts(launcher, taskContainer)
assertThat(shortcuts).hasSize(1)
@@ -168,26 +130,23 @@
AbstractFloatingView.TYPE_ALL and AbstractFloatingView.TYPE_REBIND_SAFE.inv()
verify(abstractFloatingViewHelper).closeOpenViews(launcher, true, allTypesExceptRebindSafe)
verify(recentsView).moveTaskToExternalDisplay(eq(taskContainer), any())
- verify(statsLogger).withItemInfo(workspaceItemInfo)
+ verify(statsLogger).withItemInfo(taskViewItemInfo)
verify(statsLogger).log(LauncherEvent.LAUNCHER_SYSTEM_SHORTCUT_EXTERNAL_DISPLAY_TAP)
}
- private fun createTask(): Task = Task(TaskKey(1, 0, Intent(), ComponentName("", ""), 0, 2000))
+ private fun createTask() = Task(TaskKey(1, 0, Intent(), ComponentName("", ""), 0, 2000))
- private fun createTaskContainer(task: Task): TaskContainer {
- val snapshotView =
- if (enableRefactorTaskThumbnail()) mock<TaskThumbnailView>()
- else mock<TaskThumbnailViewDeprecated>()
- return TaskContainer(
+ private fun createTaskContainer(task: Task) =
+ TaskContainer(
taskView,
task,
- snapshotView,
- iconView,
- transformingTouchDelegate,
+ if (enableRefactorTaskThumbnail()) mock<TaskThumbnailView>()
+ else mock<TaskThumbnailViewDeprecated>(),
+ mock<TaskViewIcon>(),
+ mock<TransformingTouchDelegate>(),
SplitConfigurationOptions.STAGE_POSITION_UNDEFINED,
digitalWellBeingToast = null,
showWindowsView = null,
overlayFactory,
)
- }
}
diff --git a/quickstep/tests/src/com/android/quickstep/OrientationTouchTransformerTest.java b/quickstep/tests/src/com/android/quickstep/OrientationTouchTransformerTest.java
index f5d082d..ff0ad53 100644
--- a/quickstep/tests/src/com/android/quickstep/OrientationTouchTransformerTest.java
+++ b/quickstep/tests/src/com/android/quickstep/OrientationTouchTransformerTest.java
@@ -90,7 +90,7 @@
float landscapeRegionY =
generateTouchRegionHeight(NORMAL_SCREEN_SIZE, Surface.ROTATION_90) + 1;
- mTouchTransformer.createOrAddTouchRegion(mInfo);
+ mTouchTransformer.createOrAddTouchRegion(mInfo, "test");
tapAndAssertTrue(100, portraitRegionY,
event -> mTouchTransformer.touchInValidSwipeRegions(event.getX(), event.getY()));
tapAndAssertFalse(100, landscapeRegionY,
@@ -102,7 +102,8 @@
// Override region
mTouchTransformer
- .createOrAddTouchRegion(createDisplayInfo(NORMAL_SCREEN_SIZE, Surface.ROTATION_90));
+ .createOrAddTouchRegion(createDisplayInfo(NORMAL_SCREEN_SIZE, Surface.ROTATION_90),
+ "test");
tapAndAssertFalse(100, portraitRegionY,
event -> mTouchTransformer.touchInValidSwipeRegions(event.getX(), event.getY()));
tapAndAssertTrue(100, landscapeRegionY,
@@ -113,7 +114,7 @@
event -> mTouchTransformer.touchInAssistantRegion(event));
// Override region again
- mTouchTransformer.createOrAddTouchRegion(mInfo);
+ mTouchTransformer.createOrAddTouchRegion(mInfo, "test");
tapAndAssertTrue(100, portraitRegionY,
event -> mTouchTransformer.touchInValidSwipeRegions(event.getX(), event.getY()));
tapAndAssertFalse(100, landscapeRegionY,
@@ -132,7 +133,8 @@
generateTouchRegionHeight(NORMAL_SCREEN_SIZE, Surface.ROTATION_90) + 1;
mTouchTransformer
- .createOrAddTouchRegion(createDisplayInfo(NORMAL_SCREEN_SIZE, Surface.ROTATION_90));
+ .createOrAddTouchRegion(createDisplayInfo(NORMAL_SCREEN_SIZE, Surface.ROTATION_90),
+ "test");
tapAndAssertFalse(100, portraitRegionY,
event -> mTouchTransformer.touchInValidSwipeRegions(event.getX(), event.getY()));
tapAndAssertTrue(100, landscapeRegionY,
@@ -144,7 +146,7 @@
// We have to add 0 rotation second so that gets set as the current rotation, otherwise
// matrix transform will fail (tests only work in Portrait at the moment)
mTouchTransformer.enableMultipleRegions(true, mInfo);
- mTouchTransformer.createOrAddTouchRegion(mInfo);
+ mTouchTransformer.createOrAddTouchRegion(mInfo, "test");
tapAndAssertTrue(100, portraitRegionY,
event -> mTouchTransformer.touchInValidSwipeRegions(event.getX(), event.getY()));
@@ -165,8 +167,9 @@
mTouchTransformer.enableMultipleRegions(true, mInfo);
mTouchTransformer
- .createOrAddTouchRegion(createDisplayInfo(NORMAL_SCREEN_SIZE, Surface.ROTATION_90));
- mTouchTransformer.createOrAddTouchRegion(mInfo);
+ .createOrAddTouchRegion(createDisplayInfo(NORMAL_SCREEN_SIZE, Surface.ROTATION_90),
+ "test");
+ mTouchTransformer.createOrAddTouchRegion(mInfo, "test");
tapAndAssertTrue(0, portraitRegionY,
event -> mTouchTransformer.touchInAssistantRegion(event));
tapAndAssertFalse(0, landscapeRegionY,
@@ -181,9 +184,10 @@
generateTouchRegionHeight(NORMAL_SCREEN_SIZE, Surface.ROTATION_90) + 1;
mTouchTransformer.enableMultipleRegions(true, mInfo);
- mTouchTransformer.createOrAddTouchRegion(mInfo);
+ mTouchTransformer.createOrAddTouchRegion(mInfo, "test");
mTouchTransformer
- .createOrAddTouchRegion(createDisplayInfo(NORMAL_SCREEN_SIZE, Surface.ROTATION_90));
+ .createOrAddTouchRegion(createDisplayInfo(NORMAL_SCREEN_SIZE, Surface.ROTATION_90),
+ "test");
mTouchTransformer.enableMultipleRegions(false, mInfo);
tapAndAssertTrue(0, portraitRegionY,
event -> mTouchTransformer.touchInAssistantRegion(event));
@@ -213,14 +217,14 @@
@Test
public void applyTransform_taskNotFrozen_notInRegion() {
- mTouchTransformer.createOrAddTouchRegion(mInfo);
+ mTouchTransformer.createOrAddTouchRegion(mInfo, "test");
tapAndAssertFalse(100, 100,
event -> mTouchTransformer.touchInValidSwipeRegions(event.getX(), event.getY()));
}
@Test
public void applyTransform_taskFrozen_noRotate_outOfRegion() {
- mTouchTransformer.createOrAddTouchRegion(mInfo);
+ mTouchTransformer.createOrAddTouchRegion(mInfo, "test");
mTouchTransformer.enableMultipleRegions(true, mInfo);
tapAndAssertFalse(100, 100,
event -> mTouchTransformer.touchInValidSwipeRegions(event.getX(), event.getY()));
@@ -228,7 +232,7 @@
@Test
public void applyTransform_taskFrozen_noRotate_inRegion() {
- mTouchTransformer.createOrAddTouchRegion(mInfo);
+ mTouchTransformer.createOrAddTouchRegion(mInfo, "test");
mTouchTransformer.enableMultipleRegions(true, mInfo);
float y = generateTouchRegionHeight(NORMAL_SCREEN_SIZE, Surface.ROTATION_0) + 1;
tapAndAssertTrue(100, y,
@@ -237,7 +241,7 @@
@Test
public void applyTransform_taskNotFrozen_noRotate_inDefaultRegion() {
- mTouchTransformer.createOrAddTouchRegion(mInfo);
+ mTouchTransformer.createOrAddTouchRegion(mInfo, "test");
float y = generateTouchRegionHeight(NORMAL_SCREEN_SIZE, Surface.ROTATION_0) + 1;
tapAndAssertTrue(100, y,
event -> mTouchTransformer.touchInValidSwipeRegions(event.getX(), event.getY()));
@@ -246,7 +250,8 @@
@Test
public void applyTransform_taskNotFrozen_90Rotate_inRegion() {
mTouchTransformer
- .createOrAddTouchRegion(createDisplayInfo(NORMAL_SCREEN_SIZE, Surface.ROTATION_90));
+ .createOrAddTouchRegion(createDisplayInfo(NORMAL_SCREEN_SIZE, Surface.ROTATION_90),
+ "test");
float y = generateTouchRegionHeight(NORMAL_SCREEN_SIZE, Surface.ROTATION_90) + 1;
tapAndAssertTrue(100, y,
event -> mTouchTransformer.touchInValidSwipeRegions(event.getX(), event.getY()));
@@ -254,10 +259,11 @@
@Test
public void applyTransform_taskNotFrozen_90Rotate_withTwoRegions() {
- mTouchTransformer.createOrAddTouchRegion(mInfo);
+ mTouchTransformer.createOrAddTouchRegion(mInfo, "test");
mTouchTransformer.enableMultipleRegions(true, mInfo);
mTouchTransformer
- .createOrAddTouchRegion(createDisplayInfo(NORMAL_SCREEN_SIZE, Surface.ROTATION_90));
+ .createOrAddTouchRegion(createDisplayInfo(NORMAL_SCREEN_SIZE, Surface.ROTATION_90),
+ "test");
// Landscape point
float y1 = generateTouchRegionHeight(NORMAL_SCREEN_SIZE, Surface.ROTATION_90) + 1;
MotionEvent inRegion1_down = generateMotionEvent(MotionEvent.ACTION_DOWN, 10, y1);
@@ -278,10 +284,11 @@
@Test
public void applyTransform_90Rotate_inRotatedRegion() {
// Create regions for both 0 Rotation and 90 Rotation
- mTouchTransformer.createOrAddTouchRegion(mInfo);
+ mTouchTransformer.createOrAddTouchRegion(mInfo, "test");
mTouchTransformer.enableMultipleRegions(true, mInfo);
mTouchTransformer
- .createOrAddTouchRegion(createDisplayInfo(NORMAL_SCREEN_SIZE, Surface.ROTATION_90));
+ .createOrAddTouchRegion(createDisplayInfo(NORMAL_SCREEN_SIZE, Surface.ROTATION_90),
+ "test");
// Portrait point in landscape orientation axis
float x1 = generateTouchRegionHeight(NORMAL_SCREEN_SIZE, Surface.ROTATION_0);
// bottom of screen, from landscape perspective right side of screen
diff --git a/res/values-af/strings.xml b/res/values-af/strings.xml
index 0886f50..93759f9 100644
--- a/res/values-af/strings.xml
+++ b/res/values-af/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Programinligting vir %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Gebruikinstellings vir %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Nuwe venster"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Bestuur vensters"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Stoor apppaar"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Hierdie apppaar word nie op hierdie toestel gesteun nie"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Verminder breedte"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Verminder hoogte"</string>
<string name="widget_resized" msgid="9130327887929620">"Legstukgrootte is verander na breedte <xliff:g id="NUMBER_0">%1$s</xliff:g> hoogte <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Kortpaaie"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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 576fefc..5c130bc 100644
--- a/res/values-am/strings.xml
+++ b/res/values-am/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"የመተግበሪያ መረጃ ለ%1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"የ%1$s የአጠቃቀም ቅንብሮች"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"አዲስ መስኮት"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"መስኮቶችን ያስተዳድሩ"</string>
<string name="save_app_pair" msgid="5647523853662686243">"የመተግበሪያ ጥምረትን ያስቀምጡ"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"ይህ የመተግበሪያ ጥምረት በዚህ መሣሪያ ላይ አይደገፍም"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"ስፋት ይቀንሱ"</string>
<string name="action_decrease_height" msgid="282377193880900022">"ቁመት ይቀንሱ"</string>
<string name="widget_resized" msgid="9130327887929620">"የመግብር መጠን ወደ ስፋት <xliff:g id="NUMBER_0">%1$s</xliff:g> ቁመት <xliff:g id="NUMBER_1">%2$s</xliff:g> ተለውጧል"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"አቋራጮች"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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 b902aca..cc7ece1 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"معلومات تطبيق %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"إعدادات استخدام \"%1$s\""</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"نافذة جديدة"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"إدارة النوافذ"</string>
<string name="save_app_pair" msgid="5647523853662686243">"حفظ استخدام التطبيقين معًا"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"لا يمكن استخدام هذين التطبيقَين في الوقت نفسه على هذا الجهاز"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"تقليل العرض"</string>
<string name="action_decrease_height" msgid="282377193880900022">"تقليل الارتفاع"</string>
<string name="widget_resized" msgid="9130327887929620">"تم تغيير حجم الأداة إلى العرض <xliff:g id="NUMBER_0">%1$s</xliff:g> والارتفاع <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"الاختصارات"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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-as/strings.xml b/res/values-as/strings.xml
index 128c846..168d408 100644
--- a/res/values-as/strings.xml
+++ b/res/values-as/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$sৰ বাবে এপৰ তথ্য"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$sৰ বাবে ব্যৱহাৰৰ ছেটিং"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"নতুন ৱিণ্ড’"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Windows পৰিচালনা কৰক"</string>
<string name="save_app_pair" msgid="5647523853662686243">"এপৰ পেয়াৰ ছেভ কৰক"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"এই ডিভাইচটোত এই এপ্ পেয়াৰ কৰাৰ সুবিধাটো সমৰ্থিত নহয়"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"প্ৰস্থ হ্ৰাস কৰক"</string>
<string name="action_decrease_height" msgid="282377193880900022">"উচ্চতা হ্ৰাস কৰক"</string>
<string name="widget_resized" msgid="9130327887929620">"ৱিজেটৰ আকাৰ সলনি কৰি প্ৰস্থ <xliff:g id="NUMBER_0">%1$s</xliff:g> আৰু উচ্চতা <xliff:g id="NUMBER_1">%2$s</xliff:g> কৰা হ’ল"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"শ্বৰ্টকাটসমূহ"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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 96447b4..9f2a435 100644
--- a/res/values-az/strings.xml
+++ b/res/values-az/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s ilə bağlı tətbiq məlumatı"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$s üzrə istifadə ayarları"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Yeni Pəncərə"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Pəncərələri idarə edin"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Tətbiq cütünü saxlayın"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Bu tətbiq cütü bu cihazda dəstəklənmir"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Eni azaldın"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Hündürlüyü azaldın"</string>
<string name="widget_resized" msgid="9130327887929620">"Vidcetin eni <xliff:g id="NUMBER_0">%1$s</xliff:g> hündürlüyü <xliff:g id="NUMBER_1">%2$s</xliff:g> kimi ölçüləndirildi"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Qısa yollar"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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>
diff --git a/res/values-b+sr+Latn/strings.xml b/res/values-b+sr+Latn/strings.xml
index 5408aaf..1cea1fc 100644
--- a/res/values-b+sr+Latn/strings.xml
+++ b/res/values-b+sr+Latn/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Informacije o aplikaciji za: %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Podešavanja potrošnje za %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Novi prozor"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Upravljajte prozorima"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Sačuvaj par aplikacija"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Ovaj par aplikacija nije podržan na ovom uređaju"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Smanji širinu"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Smanji visinu"</string>
<string name="widget_resized" msgid="9130327887929620">"Veličina vidžeta je promenjena na širinu <xliff:g id="NUMBER_0">%1$s</xliff:g> i visinu <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Prečice"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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>
diff --git a/res/values-be/strings.xml b/res/values-be/strings.xml
index cf5e7f8..74f988d 100644
--- a/res/values-be/strings.xml
+++ b/res/values-be/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Інфармацыя пра праграму для: %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$s: налады выкарыстання"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Новае акно"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Кіраваць вокнамі"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Захаваць спалучэнне праграм"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Дадзенае спалучэнне праграм не падтрымліваецца на гэтай прыладзе"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Паменшыць шырыню"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Паменшыць вышыню"</string>
<string name="widget_resized" msgid="9130327887929620">"Памеры віджэта зменены на: шырыня <xliff:g id="NUMBER_0">%1$s</xliff:g>, вышыня <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Ярлыкі"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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-bg/strings.xml b/res/values-bg/strings.xml
index fd4c983..7799a3b 100644
--- a/res/values-bg/strings.xml
+++ b/res/values-bg/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Информация за приложението за %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Настройки за използването на %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Нов прозорец"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Управление на прозорците"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Запазване на двойката приложения"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Тази двойка приложения не се поддържа на устройството"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Намаляване на ширината"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Намаляване на височината"</string>
<string name="widget_resized" msgid="9130327887929620">"Приспособлението е преоразмерено към ширина <xliff:g id="NUMBER_0">%1$s</xliff:g> и височина <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Преки пътища"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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-bn/strings.xml b/res/values-bn/strings.xml
index 56461a3..88f92c3 100644
--- a/res/values-bn/strings.xml
+++ b/res/values-bn/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s-এর জন্য অ্যাপ সম্পর্কিত তথ্য"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$s-এর জন্য ব্যবহারের সেটিংস"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"নতুন উইন্ডো"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"উইন্ডো ম্যানেজ করুন"</string>
<string name="save_app_pair" msgid="5647523853662686243">"অ্যাপ পেয়ার সেভ করুন"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"এই ডিভাইসে এই অ্যাপ পেয়ারটি কাজ করে না"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"প্রস্থ কমান"</string>
<string name="action_decrease_height" msgid="282377193880900022">"উচ্চতা কমান"</string>
<string name="widget_resized" msgid="9130327887929620">"উইজেটের আকার প্রস্থ <xliff:g id="NUMBER_0">%1$s</xliff:g> উচ্চতা <xliff:g id="NUMBER_1">%2$s</xliff:g> তে পরিবর্তন করা হয়েছে"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"শর্টকাট"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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 803c6c0..64ff0b6 100644
--- a/res/values-bs/strings.xml
+++ b/res/values-bs/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Informacije o aplikaciji %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Postavke korištenja za: %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Novi prozor"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Upravljajte prozorima"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Sačuvaj par aplikacija"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Par aplikacija nije podržan na uređaju"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Smanji širinu"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Smanji visinu"</string>
<string name="widget_resized" msgid="9130327887929620">"Veličina vidžeta je promijenjena na širinu <xliff:g id="NUMBER_0">%1$s</xliff:g> visinu <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Prečice"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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 0414bb2..185788b 100644
--- a/res/values-ca/strings.xml
+++ b/res/values-ca/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Informació de l\'aplicació %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Configuració d\'ús de %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Finestra nova"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Gestiona les finestres"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Desa la parella d\'aplicacions"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Aquesta parella d\'aplicacions no s\'admet en aquest dispositiu"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Redueix l\'amplada"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Redueix l\'alçada"</string>
<string name="widget_resized" msgid="9130327887929620">"S\'ha canviat la mida del widget a l\'amplada <xliff:g id="NUMBER_0">%1$s</xliff:g> i l\'alçada <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Dreceres"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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 aa50a42..3caba23 100644
--- a/res/values-cs/strings.xml
+++ b/res/values-cs/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Informace o aplikaci %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Nastavení využití pro aplikaci %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Nové okno"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Spravovat okna"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Uložit dvojici aplikací"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Tento pár aplikací není na tomto zařízení podporován"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Snížit šířku"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Snížit výšku"</string>
<string name="widget_resized" msgid="9130327887929620">"Velikost widgetu upravena: šířka <xliff:g id="NUMBER_0">%1$s</xliff:g>, výška <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Zkratky"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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 0410763..07595e8 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Appinfo for %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Indstillinger for brug af %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Nyt vindue"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Administrer vinduer"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Gem appsammenknytning"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Denne appsammenknytning understøttes ikke på enheden"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Reducer bredden"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Reducer højden"</string>
<string name="widget_resized" msgid="9130327887929620">"Størrelsen for widgetten er ændret til bredde <xliff:g id="NUMBER_0">%1$s</xliff:g> og højde <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Genveje"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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 cb63ff0..a9a1aa0 100644
--- a/res/values-de/strings.xml
+++ b/res/values-de/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"App-Info für %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Nutzungseinstellungen für %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Neues Fenster"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Fenster verwalten"</string>
<string name="save_app_pair" msgid="5647523853662686243">"App-Paar speichern"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Dieses App-Paar wird auf diesem Gerät nicht unterstützt"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Breite verringern"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Höhe verringern"</string>
<string name="widget_resized" msgid="9130327887929620">"Größe des Widgets zu Breite <xliff:g id="NUMBER_0">%1$s</xliff:g> und Höhe <xliff:g id="NUMBER_1">%2$s</xliff:g> geändert"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Verknüpfungen"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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 79d9f19..17ddee3 100644
--- a/res/values-el/strings.xml
+++ b/res/values-el/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Πληροφορίες εφαρμογής για %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Ρυθμίσεις χρήσης για %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Νέο παράθυρο"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Διαχείριση παραθύρων"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Αποθήκευση ζεύγους εφαρμογών"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Αυτό το ζεύγος εφαρμογών δεν υποστηρίζεται σε αυτή τη συσκευή"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"μείωση του πλάτους"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Μείωση του ύψους"</string>
<string name="widget_resized" msgid="9130327887929620">"Έγινε προσαρμογή του μεγέθους του γραφικού στοιχείου σε <xliff:g id="NUMBER_0">%1$s</xliff:g> πλάτος και <xliff:g id="NUMBER_1">%2$s</xliff:g> ύψος"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Συντομεύσεις"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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-en-rAU/strings.xml b/res/values-en-rAU/strings.xml
index a58ace8..faffd89 100644
--- a/res/values-en-rAU/strings.xml
+++ b/res/values-en-rAU/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"App info for %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Usage settings for %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"New window"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Manage windows"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Save app pair"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"This app pair isn\'t supported on this device"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Decrease width"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Decrease height"</string>
<string name="widget_resized" msgid="9130327887929620">"Widget re-sized to width <xliff:g id="NUMBER_0">%1$s</xliff:g> height <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Short cuts"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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-rCA/strings.xml b/res/values-en-rCA/strings.xml
index e2d072b..1dc6d16 100644
--- a/res/values-en-rCA/strings.xml
+++ b/res/values-en-rCA/strings.xml
@@ -178,7 +178,7 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Decrease width"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Decrease height"</string>
<string name="widget_resized" msgid="9130327887929620">"Widget resized to width <xliff:g id="NUMBER_0">%1$s</xliff:g> height <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Shortcuts"</string>
+ <string name="action_deep_shortcut" msgid="4766835855579976045">"Shortcut Menu"</string>
<string name="action_dismiss_notification" msgid="5909461085055959187">"Dismiss"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Close"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personal"</string>
diff --git a/res/values-en-rGB/strings.xml b/res/values-en-rGB/strings.xml
index a58ace8..faffd89 100644
--- a/res/values-en-rGB/strings.xml
+++ b/res/values-en-rGB/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"App info for %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Usage settings for %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"New window"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Manage windows"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Save app pair"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"This app pair isn\'t supported on this device"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Decrease width"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Decrease height"</string>
<string name="widget_resized" msgid="9130327887929620">"Widget re-sized to width <xliff:g id="NUMBER_0">%1$s</xliff:g> height <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Short cuts"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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 a58ace8..faffd89 100644
--- a/res/values-en-rIN/strings.xml
+++ b/res/values-en-rIN/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"App info for %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Usage settings for %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"New window"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Manage windows"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Save app pair"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"This app pair isn\'t supported on this device"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Decrease width"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Decrease height"</string>
<string name="widget_resized" msgid="9130327887929620">"Widget re-sized to width <xliff:g id="NUMBER_0">%1$s</xliff:g> height <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Short cuts"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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 b0b06b0..d08eb53 100644
--- a/res/values-es-rUS/strings.xml
+++ b/res/values-es-rUS/strings.xml
@@ -179,7 +179,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Reducir el ancho"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Reducir la altura"</string>
<string name="widget_resized" msgid="9130327887929620">"Se cambió la dimensión del widget a <xliff:g id="NUMBER_0">%1$s</xliff:g> de ancho y <xliff:g id="NUMBER_1">%2$s</xliff:g> de alto."</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Accesos directos"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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 0062b2f..1a71a0e 100644
--- a/res/values-es/strings.xml
+++ b/res/values-es/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Información de la aplicación %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Ajustes de uso para %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Ventana nueva"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Gestionar ventanas"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Guardar apps emparejadas"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"El dispositivo no admite esta aplicación emparejada"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Reducir ancho"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Reducir altura"</string>
<string name="widget_resized" msgid="9130327887929620">"Se ha modificado el tamaño del widget a <xliff:g id="NUMBER_0">%1$s</xliff:g> de ancho y <xliff:g id="NUMBER_1">%2$s</xliff:g> de alto"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Accesos directos"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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 5eccca9..70d2f8b 100644
--- a/res/values-et/strings.xml
+++ b/res/values-et/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Rakenduse teave: %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Kasutuse seaded: %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Uus aken"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Akende haldamine"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Salvesta rakendusepaar"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"See rakendusepaar ei ole selles seadmes toetatud"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Vähenda laiust"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Vähenda kõrgust"</string>
<string name="widget_resized" msgid="9130327887929620">"Vidina suurust muudeti. Laius: <xliff:g id="NUMBER_0">%1$s</xliff:g>. Kõrgus: <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Otseteed"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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 8d0499c..ec63b18 100644
--- a/res/values-eu/strings.xml
+++ b/res/values-eu/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s aplikazioari buruzko informazioa"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$s aplikazioaren erabilera-ezarpenak"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Leiho berria"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Kudeatu leihoak"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Gorde aplikazio parea"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Aplikazio pare hori ez da gailu honekin bateragarria"</string>
@@ -125,7 +124,7 @@
<string name="app_pair_name_format" msgid="8134106404716224054">"Aplikazio parea: <xliff:g id="APP1">%1$s</xliff:g> eta <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="styles_wallpaper_button_text" msgid="8216961355289236794">"Horma-papera eta estiloa"</string>
<string name="edit_home_screen" msgid="8947858375782098427">"Editatu orri nagusia"</string>
- <string name="settings_button_text" msgid="8873672322605444408">"Orri nagusiko ezarpenak"</string>
+ <string name="settings_button_text" msgid="8873672322605444408">"Orri nagusiaren ezarpenak"</string>
<string name="msg_disabled_by_admin" msgid="6898038085516271325">"Administratzaileak desgaitu du"</string>
<string name="allow_rotation_title" msgid="7222049633713050106">"Eman orri nagusia biratzeko baimena"</string>
<string name="allow_rotation_desc" msgid="8662546029078692509">"Telefonoa biratzean"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Txikitu zabalera"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Txikitu altuera"</string>
<string name="widget_resized" msgid="9130327887929620">"Aldatu da widgetaren tamaina. Zabalera: <xliff:g id="NUMBER_0">%1$s</xliff:g>. Altuera: <xliff:g id="NUMBER_1">%2$s</xliff:g>."</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Lasterbideak"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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 18a2038..5930f22 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"اطلاعات برنامه %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"تنظیمات مصرف برای %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"پنجره جدید"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"مدیریت کردن پنجرهها"</string>
<string name="save_app_pair" msgid="5647523853662686243">"ذخیره جفت برنامه"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"از این جفت برنامه در این دستگاه پشتیبانی نمیشود"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"کاهش عرض"</string>
<string name="action_decrease_height" msgid="282377193880900022">"کاهش ارتفاع"</string>
<string name="widget_resized" msgid="9130327887929620">"اندازه ابزاره به عرض <xliff:g id="NUMBER_0">%1$s</xliff:g> ارتفاع <xliff:g id="NUMBER_1">%2$s</xliff:g> تغییر کرد"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"میانبرها"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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-fi/strings.xml b/res/values-fi/strings.xml
index f04fa62..0e2eb3f 100644
--- a/res/values-fi/strings.xml
+++ b/res/values-fi/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Sovellustiedot: %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Käyttöasetus tälle: %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Uusi ikkuna"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Hallinnoi ikkunoita"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Tallenna sovelluspari"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Sovellusparia ei tueta tällä laitteella"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Vähennä leveyttä"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Vähennä korkeutta"</string>
<string name="widget_resized" msgid="9130327887929620">"Widgetin kokoa muutettiin. Sen leveys on nyt <xliff:g id="NUMBER_0">%1$s</xliff:g> ja korkeus <xliff:g id="NUMBER_1">%2$s</xliff:g>."</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Pikakuvakkeet"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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 6f26dae..93bdcb5 100644
--- a/res/values-fr-rCA/strings.xml
+++ b/res/values-fr-rCA/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Renseignements sur l\'appli pour %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Paramètres d\'utilisation pour %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Nouvelle fenêtre"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Gérer les fenêtres"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Enr. paire d\'applis"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Cette paire d\'applis n\'est pas prise en charge sur cet appareil"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Diminuer la largeur"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Diminuer la hauteur"</string>
<string name="widget_resized" msgid="9130327887929620">"Le widget a été redimensionné (largeur : <xliff:g id="NUMBER_0">%1$s</xliff:g>, hauteur : <xliff:g id="NUMBER_1">%2$s</xliff:g>)"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Raccourcis"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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-fr/strings.xml b/res/values-fr/strings.xml
index bd1f23c..5db4437 100644
--- a/res/values-fr/strings.xml
+++ b/res/values-fr/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Infos sur l\'appli pour %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Paramètres d\'utilisation pour %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Nouvelle fenêtre"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Gérer les fenêtres"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Enregistrer une paire d\'applis"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Cette paire d\'applications n\'est pas prise en charge sur cet appareil"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Diminuer la largeur"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Diminuer la hauteur"</string>
<string name="widget_resized" msgid="9130327887929620">"Le widget a bien été redimensionné (largeur : <xliff:g id="NUMBER_0">%1$s</xliff:g>, hauteur : <xliff:g id="NUMBER_1">%2$s</xliff:g>)."</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Raccourcis"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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 9eae629..72fdd1b 100644
--- a/res/values-gl/strings.xml
+++ b/res/values-gl/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Información da aplicación para %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Configuración de uso para %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Ventá nova"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Xestionar ventás"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Gardar parella de apps"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"O dispositivo non admite este emparellamento de aplicacións"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Reducir ancho"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Reducir altura"</string>
<string name="widget_resized" msgid="9130327887929620">"Cambiouse o tamaño do widget polo ancho <xliff:g id="NUMBER_0">%1$s</xliff:g> e a altura <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Atallos"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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 84f4ce6..58cbac8 100644
--- a/res/values-gu/strings.xml
+++ b/res/values-gu/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s માટે ઍપ માહિતી"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$sના વપરાશ સંબંધિત સેટિંગ"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"નવી વિન્ડો"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"વિન્ડો મેનેજ કરો"</string>
<string name="save_app_pair" msgid="5647523853662686243">"ઍપની જોડી સાચવો"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"આ ડિવાઇસ પર, આ ઍપની જોડીને સપોર્ટ આપવામાં આવતો નથી"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"પહોળાઈ ઘટાડો"</string>
<string name="action_decrease_height" msgid="282377193880900022">"ઊંચાઈ ઘટાડો"</string>
<string name="widget_resized" msgid="9130327887929620">"વિજેટનો આકાર બદલીને <xliff:g id="NUMBER_0">%1$s</xliff:g> પહોળાઈ <xliff:g id="NUMBER_1">%2$s</xliff:g> ઊંચાઈ કર્યો"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"શૉર્ટકટ્સ"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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-hi/strings.xml b/res/values-hi/strings.xml
index 110e3af..e56e620 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s के लिए ऐप्लिकेशन की जानकारी"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$s के लिए खर्च की सेटिंग"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"नई विंडो"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"विंडो मैनेज करें"</string>
<string name="save_app_pair" msgid="5647523853662686243">"ऐप पेयर सेव करें"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"साथ में इस्तेमाल किए जा सकने वाले ये ऐप्लिकेशन, इस डिवाइस पर काम नहीं कर सकते"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"चौड़ाई घटाएं"</string>
<string name="action_decrease_height" msgid="282377193880900022">"ऊंचाई घटाएं"</string>
<string name="widget_resized" msgid="9130327887929620">"विजेट का आकार बदलकर उसकी चौड़ाई <xliff:g id="NUMBER_0">%1$s</xliff:g> और ऊंचाई <xliff:g id="NUMBER_1">%2$s</xliff:g> कर दी गई"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"शॉर्टकट"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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 06a8d06..8f0008f 100644
--- a/res/values-hr/strings.xml
+++ b/res/values-hr/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Informacije o aplikaciji %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Postavke upotrebe za %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Novi prozor"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Upravljanje prozorima"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Spremi par aplikacija"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Taj par aplikacija nije podržan na ovom uređaju"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Smanjenje širine"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Smanjenje visine"</string>
<string name="widget_resized" msgid="9130327887929620">"Širina widgeta promijenjena je na <xliff:g id="NUMBER_0">%1$s</xliff:g>, a visina na <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Prečaci"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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 6228678..91761d0 100644
--- a/res/values-hu/strings.xml
+++ b/res/values-hu/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Alkalmazásinformáció a következőhöz: %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"A(z) %1$s használati beállításai"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Új ablak"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Ablakok kezelése"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Alkalmazáspár mentése"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Ezt az alkalmazáspárt nem támogatja az eszköz"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Szélesség csökkentése"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Magasság csökkentése"</string>
<string name="widget_resized" msgid="9130327887929620">"Modul átméretezve <xliff:g id="NUMBER_0">%1$s</xliff:g> szélességre és <xliff:g id="NUMBER_1">%2$s</xliff:g> magasságra"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Gyorsparancsok"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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 010d259..91f9bca 100644
--- a/res/values-hy/strings.xml
+++ b/res/values-hy/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Տեղեկություններ %1$s հավելվածի մասին"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Օգտագործման կարգավորումներ (%1$s)"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Նոր պատուհան"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Կառավարել պատուհանները"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Պահել հավելվ. զույգը"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Հավելվածների զույգը չի աջակցվում այս սարքում"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Նվազեցնել լայնությունը"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Նվազեցնել բարձրությունը"</string>
<string name="widget_resized" msgid="9130327887929620">"Վիջեթի լայնությունը փոխվել է <xliff:g id="NUMBER_0">%1$s</xliff:g>-ի, իսկ բարձրությունը՝ <xliff:g id="NUMBER_1">%2$s</xliff:g>-ի"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Դյուրանցումներ"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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 027a111..69a52f7 100644
--- a/res/values-in/strings.xml
+++ b/res/values-in/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Info aplikasi untuk %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Setelan penggunaan untuk %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Jendela Baru"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Kelola Jendela"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Simpan pasangan aplikasi"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Pasangan aplikasi ini tidak didukung di perangkat ini"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Kurangi lebar"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Kurangi tinggi"</string>
<string name="widget_resized" msgid="9130327887929620">"Widget diubah ukurannya menjadi lebar <xliff:g id="NUMBER_0">%1$s</xliff:g> tinggi <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Pintasan"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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 c2f8f5a..604e760 100644
--- a/res/values-is/strings.xml
+++ b/res/values-is/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Upplýsingar um forrit fyrir %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Notkunarstillingar fyrir %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Nýr gluggi"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Stjórna gluggum"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Vista forritapar"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Þetta forritapar er ekki stutt í þessu tæki"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Minnka breidd"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Minnka hæð"</string>
<string name="widget_resized" msgid="9130327887929620">"Stærð græju breytt í <xliff:g id="NUMBER_0">%1$s</xliff:g> á breidd og <xliff:g id="NUMBER_1">%2$s</xliff:g> á hæð"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Flýtileiðir"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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 34d2f57..66c4ddd 100644
--- a/res/values-it/strings.xml
+++ b/res/values-it/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Informazioni sull\'app %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Impostazioni di utilizzo per %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Nuova finestra"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Gestisci finestre"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Salva coppia di app"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Questa coppia di app non è supportata su questo dispositivo"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Riduci larghezza"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Riduci altezza"</string>
<string name="widget_resized" msgid="9130327887929620">"Widget ridimensionato a larghezza <xliff:g id="NUMBER_0">%1$s</xliff:g>, altezza <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Scorciatoie"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 4eb3e96..e5fb2a8 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"פרטים על האפליקציה %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"הגדרות שימוש ב-%1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"חלון חדש"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"ניהול החלונות"</string>
<string name="save_app_pair" msgid="5647523853662686243">"שמירת צמד אפליקציות"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"צמד האפליקציות הזה לא נתמך במכשיר הזה"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"הקטנת רוחב"</string>
<string name="action_decrease_height" msgid="282377193880900022">"הקטנת גובה"</string>
<string name="widget_resized" msgid="9130327887929620">"גודל הווידג\'ט שונה - רוחב <xliff:g id="NUMBER_0">%1$s</xliff:g> גובה <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"קיצורי דרך"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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-ja/strings.xml b/res/values-ja/strings.xml
index e11a22c..1a9fff1 100644
--- a/res/values-ja/strings.xml
+++ b/res/values-ja/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s のアプリ情報"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$s の使用設定"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"新しいウィンドウ"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"ウィンドウを管理"</string>
<string name="save_app_pair" msgid="5647523853662686243">"アプリのペア設定を保存"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"このデバイスは、このアプリのペア設定に対応していません"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"幅を狭くする"</string>
<string name="action_decrease_height" msgid="282377193880900022">"高さを低くする"</string>
<string name="widget_resized" msgid="9130327887929620">"ウィジェットのサイズを幅<xliff:g id="NUMBER_0">%1$s</xliff:g>、高さ<xliff:g id="NUMBER_1">%2$s</xliff:g>に変更しました"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"ショートカット"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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-ka/strings.xml b/res/values-ka/strings.xml
index c702c62..2c8d484 100644
--- a/res/values-ka/strings.xml
+++ b/res/values-ka/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s-ის აპის ინფო"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"გამოყენების პარამეტრები %1$s-ისთვის"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"ახალი ფანჯარა"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"ფანჯრების მართვა"</string>
<string name="save_app_pair" msgid="5647523853662686243">"აპთა წყვილის შენახვა"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"ამ მოწყობილობაზე აღნიშნული აპთა წყვილი არ არის მხარდაჭერილი"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"სიგანის შემცირება"</string>
<string name="action_decrease_height" msgid="282377193880900022">"სიმაღლის შემცირება"</string>
<string name="widget_resized" msgid="9130327887929620">"ვიჯეტის ზომები შეიცვალა: სიგანე <xliff:g id="NUMBER_0">%1$s</xliff:g> სიმაღლე <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"მალსახმობები"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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-kk/strings.xml b/res/values-kk/strings.xml
index 605a602..f3035c5 100644
--- a/res/values-kk/strings.xml
+++ b/res/values-kk/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s қолданбасы туралы ақпарат"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$s пайдалану параметрлері"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Жаңа терезе"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Терезелерді басқару"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Қолданбаларды жұптау әрекетін сақтау"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Бұл құрылғы қолданбаларды жұптау функциясын қолдамайды."</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Енін азайту"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Биіктігін азайту"</string>
<string name="widget_resized" msgid="9130327887929620">"Виджет өлшемінің ені <xliff:g id="NUMBER_0">%1$s</xliff:g>, биіктігі <xliff:g id="NUMBER_1">%2$s</xliff:g> болып өзгертілді"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Жылдам пәрмендер"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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-km/strings.xml b/res/values-km/strings.xml
index f6d0f37..7566781 100644
--- a/res/values-km/strings.xml
+++ b/res/values-km/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"ព័ត៌មានកម្មវិធីសម្រាប់ %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"ការកំណត់ការប្រើប្រាស់សម្រាប់ %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"វិនដូថ្មី"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"គ្រប់គ្រងវិនដូ"</string>
<string name="save_app_pair" msgid="5647523853662686243">"រក្សាទុកគូកម្មវិធី"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"មិនអាចប្រើគូកម្មវិធីនេះនៅលើឧបករណ៍នេះបានទេ"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"បន្ថយទទឹង"</string>
<string name="action_decrease_height" msgid="282377193880900022">"បន្ថយកម្ពស់"</string>
<string name="widget_resized" msgid="9130327887929620">"ធាតុក្រាហ្វិកដែលបានប្តូរទំហំទៅទទឹងប្រវែង <xliff:g id="NUMBER_0">%1$s</xliff:g> កម្ពស់ប្រវែង <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"ផ្លូវកាត់"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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-kn/strings.xml b/res/values-kn/strings.xml
index bc9f293..d4682c4 100644
--- a/res/values-kn/strings.xml
+++ b/res/values-kn/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s ಗಾಗಿ ಆ್ಯಪ್ ಮಾಹಿತಿ"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$s ಗೆ ಸಂಬಂಧಿಸಿದ ಬಳಕೆಯ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"ಹೊಸ ವಿಂಡೋ"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"ವಿಂಡೋಗಳನ್ನು ನಿರ್ವಹಿಸಿ"</string>
<string name="save_app_pair" msgid="5647523853662686243">"ಆ್ಯಪ್ ಪೇರ್ ಸೇವ್ ಮಾಡಿ"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"ಈ ಆ್ಯಪ್ ಜೋಡಿಯು ಈ ಸಾಧನದಲ್ಲಿ ಬೆಂಬಲಿತವಾಗಿಲ್ಲ"</string>
@@ -113,8 +112,8 @@
<string name="disabled_app_label" msgid="6673129024321402780">"<xliff:g id="APP_NAME">%1$s</xliff:g> ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string>
<string name="dotted_app_label" msgid="1865617679843363410">"{count,plural, =1{{app_name} ಆ್ಯಪ್ # ಅಧಿಸೂಚನೆಯನ್ನು ಹೊಂದಿದೆ}one{{app_name} ಆ್ಯಪ್ # ಅಧಿಸೂಚನೆಗಳನ್ನು ಹೊಂದಿದೆ}other{{app_name} ಆ್ಯಪ್ # ಅಧಿಸೂಚನೆಗಳನ್ನು ಹೊಂದಿದೆ}}"</string>
<string name="default_scroll_format" msgid="7475544710230993317">"%2$d ರಲ್ಲಿ %1$d ಪುಟ"</string>
- <string name="workspace_scroll_format" msgid="8458889198184077399">"%2$d ರಲ್ಲಿ %1$d ಮುಖಪುಟದ ಪರದೆ"</string>
- <string name="workspace_new_page" msgid="257366611030256142">"ಹೊಸ ಮುಖಪುಟ ಪರದೆ"</string>
+ <string name="workspace_scroll_format" msgid="8458889198184077399">"%2$d ರಲ್ಲಿ %1$d ಮುಖಪುಟದ ಸ್ಕ್ರೀನ್"</string>
+ <string name="workspace_new_page" msgid="257366611030256142">"ಹೊಸ ಮುಖಪುಟ ಸ್ಕ್ರೀನ್"</string>
<string name="folder_opened" msgid="94695026776264709">"ಫೋಲ್ಡರ್ ತೆರೆಯಲಾಗಿದೆ, <xliff:g id="WIDTH">%1$d</xliff:g> ಬೈ <xliff:g id="HEIGHT">%2$d</xliff:g>"</string>
<string name="folder_tap_to_close" msgid="4625795376335528256">"ಫೋಲ್ಡರ್ ಮುಚ್ಚಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
<string name="folder_tap_to_rename" msgid="4017685068016979677">"ಮರುಹೆಸರನ್ನು ಉಳಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"ಅಗಲವನ್ನು ಕಡಿಮೆ ಮಾಡಿ"</string>
<string name="action_decrease_height" msgid="282377193880900022">"ಎತ್ತರವನ್ನು ಕಡಿಮೆ ಮಾಡಿ"</string>
<string name="widget_resized" msgid="9130327887929620">"ವಿಜೆಟ್ ಅನ್ನು <xliff:g id="NUMBER_0">%1$s</xliff:g> ಅಗಲ <xliff:g id="NUMBER_1">%2$s</xliff:g> ಎತ್ತರಕ್ಕೆ ಮರುಗಾತ್ರಗೊಳಿಸಲಾಗಿದೆ"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"ಶಾರ್ಟ್ಕಟ್ಗಳು"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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-ko/strings.xml b/res/values-ko/strings.xml
index 7748a32..13aaaa2 100644
--- a/res/values-ko/strings.xml
+++ b/res/values-ko/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s 앱 정보"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$s의 사용량 설정"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"새 창"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"창 관리"</string>
<string name="save_app_pair" msgid="5647523853662686243">"앱 페어링 저장"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"이 앱 페어링은 이 기기에서 지원되지 않습니다"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"폭 줄이기"</string>
<string name="action_decrease_height" msgid="282377193880900022">"높이 줄이기"</string>
<string name="widget_resized" msgid="9130327887929620">"폭 <xliff:g id="NUMBER_0">%1$s</xliff:g>, 높이 <xliff:g id="NUMBER_1">%2$s</xliff:g>로 위젯 크기 조정됨"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"바로가기"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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 d3cf7e4..d41ffe8 100644
--- a/res/values-ky/strings.xml
+++ b/res/values-ky/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s колдонмосу жөнүндө маалымат"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$s колдонмосун пайдалануу параметрлери"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Жаңы терезе"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Терезелерди тескөө"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Колдонмолорду сактап коюу"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Бул эки колдонмону бул түзмөктө бир маалда пайдаланууга болбойт"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Ичкертүү"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Жапыздатуу"</string>
<string name="widget_resized" msgid="9130327887929620">"Виджеттин кеңдиги <xliff:g id="NUMBER_0">%1$s</xliff:g> бийиктиги <xliff:g id="NUMBER_1">%2$s</xliff:g> болду"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Кыска жолдор"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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-lo/strings.xml b/res/values-lo/strings.xml
index 10611c1..ace3225 100644
--- a/res/values-lo/strings.xml
+++ b/res/values-lo/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"ຂໍ້ມູນແອັບສຳລັບ %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"ການຕັ້ງຄ່າການນຳໃຊ້ສຳລັບ %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"ໜ້າຈໍໃໝ່"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"ຈັດການໜ້າຈໍ"</string>
<string name="save_app_pair" msgid="5647523853662686243">"ບັນທຶກຈັບຄູ່ແອັບ"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"ການຈັບຄູ່ແອັບນີ້ບໍ່ຮອງຮັບຢູ່ອຸປະກອນນີ້"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"ຫຼຸດລວງກ້ວາງລົງ"</string>
<string name="action_decrease_height" msgid="282377193880900022">"ຫຼຸດລວງສູງລົງ"</string>
<string name="widget_resized" msgid="9130327887929620">"ປ່ຽນຂະໜາດວິດເຈັດເປັນລວງກ້ວາງ <xliff:g id="NUMBER_0">%1$s</xliff:g> ລວງສູງ <xliff:g id="NUMBER_1">%2$s</xliff:g> ແລ້ວ"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"ທາງລັດ"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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-lt/strings.xml b/res/values-lt/strings.xml
index c6c379a..b298d8e 100644
--- a/res/values-lt/strings.xml
+++ b/res/values-lt/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Programos „%1$s“ informacija"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"„%1$s“ naudojimo nustatymai"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Naujas langas"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Tvarkyti langus"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Išsaugoti programų porą"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Ši programų pora šiame įrenginyje nepalaikoma"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Sumažinti plotį"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Sumažinti aukštį"</string>
<string name="widget_resized" msgid="9130327887929620">"Valdiklio dydis pakeistas: plotis – <xliff:g id="NUMBER_0">%1$s</xliff:g>, aukštis – <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Spartieji klavišai"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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-lv/strings.xml b/res/values-lv/strings.xml
index 0dc7445..e3e4c57 100644
--- a/res/values-lv/strings.xml
+++ b/res/values-lv/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s: informācija par lietotni"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Lietojuma iestatījumi: %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Jauns logs"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Pārvaldīt logus"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Saglabāt lietotņu pāri"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Šis lietotņu pāris netiek atbalstīts šajā ierīcē"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Samazināt platumu"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Samazināt augstumu"</string>
<string name="widget_resized" msgid="9130327887929620">"Logrīka lielums mainīts — platums: <xliff:g id="NUMBER_0">%1$s</xliff:g>, augstums: <xliff:g id="NUMBER_1">%2$s</xliff:g>."</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Saīsnes"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<string name="action_dismiss_notification" msgid="5909461085055959187">"Nerādīt"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Aizvērt"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Personīgās lietotnes"</string>
diff --git a/res/values-mk/strings.xml b/res/values-mk/strings.xml
index c5518bc..b16a135 100644
--- a/res/values-mk/strings.xml
+++ b/res/values-mk/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Податоци за апликација за %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Поставки за користење за %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Нов прозорец"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Управувајте со прозорците"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Зачувај го парот апликации"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Паров апликации не е поддржан на уредов"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Намали ширина"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Намали висина"</string>
<string name="widget_resized" msgid="9130327887929620">"Големината на виџетот е променета на ширина <xliff:g id="NUMBER_0">%1$s</xliff:g> висина <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Кратенки"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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-ml/strings.xml b/res/values-ml/strings.xml
index 756c065..2fd018e 100644
--- a/res/values-ml/strings.xml
+++ b/res/values-ml/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s എന്നതിന്റെ ആപ്പ് വിവരങ്ങൾ"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$s എന്നതിനുള്ള ഉപയോഗ ക്രമീകരണം"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"പുതിയ വിന്ഡോ"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"വിൻഡോകൾ മാനേജ് ചെയ്യുക"</string>
<string name="save_app_pair" msgid="5647523853662686243">"ആപ്പ് ജോടി സംരക്ഷിക്കുക"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"ഈ ഉപകരണത്തിൽ ഈ ആപ്പ് ജോടിക്ക് പിന്തുണയില്ല"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"വീതി കുറയ്ക്കുക"</string>
<string name="action_decrease_height" msgid="282377193880900022">"ഉയരം കുറയ്ക്കുക"</string>
<string name="widget_resized" msgid="9130327887929620">"വീതി <xliff:g id="NUMBER_0">%1$s</xliff:g> ഉയരം <xliff:g id="NUMBER_1">%2$s</xliff:g>-ലേക്ക് വിഡ്ജെറ്റിന്റെ വലുപ്പം മാറ്റി"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"കുറുക്കുവഴികൾ"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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-mn/strings.xml b/res/values-mn/strings.xml
index aad461b..6a051d5 100644
--- a/res/values-mn/strings.xml
+++ b/res/values-mn/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s-н аппын мэдээлэл"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$s-н ашиглалтын тохиргоо"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Шинэ цонх"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Windows-г удирдах"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Апп хослуулалтыг хадгалах"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Энэ апп хослуулалтыг уг төхөөрөмж дээр дэмждэггүй"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Нарийсгах"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Намсгах"</string>
<string name="widget_resized" msgid="9130327887929620">"Виджэтийн өргөн <xliff:g id="NUMBER_0">%1$s</xliff:g>, өндөр <xliff:g id="NUMBER_1">%2$s</xliff:g> болсон"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Товчлол"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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 a089669..dba75d9 100644
--- a/res/values-mr/strings.xml
+++ b/res/values-mr/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s साठी ॲपशी संबंधित माहिती"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$s साठी वापरासंबंधित सेटिंग्ज"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"नवीन विंडो"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"विंडो व्यवस्थापित करा"</string>
<string name="save_app_pair" msgid="5647523853662686243">"ॲपची जोडी सेव्ह करा"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"या ॲपची जोडीला या डिव्हाइसवर सपोर्ट नाही"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"रुंदी कमी करा"</string>
<string name="action_decrease_height" msgid="282377193880900022">"उंची कमी करा"</string>
<string name="widget_resized" msgid="9130327887929620">"विजेटचा आकार रुंदी <xliff:g id="NUMBER_0">%1$s</xliff:g> उंची <xliff:g id="NUMBER_1">%2$s</xliff:g> मध्ये बदलला"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"शॉर्टकट"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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-ms/strings.xml b/res/values-ms/strings.xml
index 79a8c43..019fb49 100644
--- a/res/values-ms/strings.xml
+++ b/res/values-ms/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Maklumat apl untuk %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Tetapan penggunaan sebanyak %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Tetingkap Baharu"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Urus Tetingkap"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Simpan gandingan apl"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Gandingan apl ini tidak disokong pada peranti ini"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Kurangkan kelebaran"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Kurangkan ketinggian"</string>
<string name="widget_resized" msgid="9130327887929620">"Saiz widget diubah menjadi <xliff:g id="NUMBER_0">%1$s</xliff:g> lebar <xliff:g id="NUMBER_1">%2$s</xliff:g> tinggi"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Pintasan"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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>
diff --git a/res/values-my/strings.xml b/res/values-my/strings.xml
index 340d7a8..4b907b4 100644
--- a/res/values-my/strings.xml
+++ b/res/values-my/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s အတွက် အက်ပ်အချက်အလက်"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$s အတွက် အသုံးပြုမှုဆက်တင်များ"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"ဝင်းဒိုးအသစ်"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"ဝင်းဒိုးများ စီမံရန်"</string>
<string name="save_app_pair" msgid="5647523853662686243">"အက်ပ်တွဲချိတ်ခြင်း သိမ်းရန်"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"ဤအက်ပ်တွဲချိတ်ခြင်းကို ဤစက်တွင် ပံ့ပိုးမထားပါ"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"အကျယ်အား လျှော့ပါ"</string>
<string name="action_decrease_height" msgid="282377193880900022">"အမြင့်အား လျှော့ပါ"</string>
<string name="widget_resized" msgid="9130327887929620">"Widget အား အကျယ် <xliff:g id="NUMBER_0">%1$s</xliff:g> အမြင့် <xliff:g id="NUMBER_1">%2$s</xliff:g> အရွယ်အစားပြန်လည်ချိန်ညှိပြီး၏"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"ဖြတ်လမ်းများ"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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 004e100..0a94172 100644
--- a/res/values-nb/strings.xml
+++ b/res/values-nb/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Appinformasjon for %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Bruksinnstillinger for %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Nytt vindu"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Administrer vinduene"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Lagre app-paret"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Denne apptilkoblingen støttes ikke på denne enheten"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Reduser bredden"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Reduser høyden"</string>
<string name="widget_resized" msgid="9130327887929620">"Størrelsen på modulen er endret til bredde <xliff:g id="NUMBER_0">%1$s</xliff:g> og høyde <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Snarveier"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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 0940743..bf3d798 100644
--- a/res/values-ne/strings.xml
+++ b/res/values-ne/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s का हकमा एपसम्बन्धी जानकारी"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$s को प्रयोगसम्बन्धी सेटिङ"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"नयाँ विन्डो"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"विन्डोहरू व्यवस्थापन गर्नुहोस्"</string>
<string name="save_app_pair" msgid="5647523853662686243">"एपको पेयर सेभ गर्नुहोस्"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"यस डिभाइसमा यो एप पेयर प्रयोग गर्न मिल्दैन"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"चौडाइ घटाउनुहोस्"</string>
<string name="action_decrease_height" msgid="282377193880900022">"उँचाइ घटाउनुहोस्"</string>
<string name="widget_resized" msgid="9130327887929620">"विजेट चौडाइ <xliff:g id="NUMBER_0">%1$s</xliff:g> उचाइ <xliff:g id="NUMBER_1">%2$s</xliff:g> मा पुनः आकार मिलाइयो"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"सर्टकटहरू"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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-nl/strings.xml b/res/values-nl/strings.xml
index f6d3e0f..b275b7c 100644
--- a/res/values-nl/strings.xml
+++ b/res/values-nl/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"App-info voor %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Gebruiksinstellingen voor %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Nieuw venster"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Vensters beheren"</string>
<string name="save_app_pair" msgid="5647523853662686243">"App-paar opslaan"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Dit app-paar wordt niet ondersteund op dit apparaat"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Breedte verkleinen"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Hoogte verkleinen"</string>
<string name="widget_resized" msgid="9130327887929620">"Formaat van widget gewijzigd in breedte <xliff:g id="NUMBER_0">%1$s</xliff:g> en hoogte <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Snelkoppelingen"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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 7b48ad0..ab9bd61 100644
--- a/res/values-or/strings.xml
+++ b/res/values-or/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s ପାଇଁ ଆପ ସୂଚନା"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$s ପାଇଁ ବ୍ୟବହାର ସେଟିଂସ"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"ନୂଆ ୱିଣ୍ଡୋ"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"ୱିଣ୍ଡୋଗୁଡ଼ିକୁ ପରିଚାଳନା କରନ୍ତୁ"</string>
<string name="save_app_pair" msgid="5647523853662686243">"ଆପ ପେୟାର ସେଭ କରନ୍ତୁ"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"ଏହି ଆପ ପେୟାର ଏ ଡିଭାଇସରେ ସମର୍ଥିତ ନୁହେଁ"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"ଚଉଡ଼ା କମ୍ କରନ୍ତୁ"</string>
<string name="action_decrease_height" msgid="282377193880900022">"ଉଚ୍ଚତା କମ୍ କରନ୍ତୁ"</string>
<string name="widget_resized" msgid="9130327887929620">"ୱିଜେଟକୁ <xliff:g id="NUMBER_0">%1$s</xliff:g> ଓସାର ଓ <xliff:g id="NUMBER_1">%2$s</xliff:g> ଉଚ୍ଚରେ ପୁନଃଆକାର ଦିଆଗଲା"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"ଶର୍ଟକଟ୍"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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 6ea5848..440c504 100644
--- a/res/values-pa/strings.xml
+++ b/res/values-pa/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s ਲਈ ਐਪ ਜਾਣਕਾਰੀ"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$s ਲਈ ਵਰਤੋਂ ਸੈਟਿੰਗਾਂ"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"ਨਵੀਂ ਵਿੰਡੋ"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"ਵਿੰਡੋਆਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ"</string>
<string name="save_app_pair" msgid="5647523853662686243">"ਐਪ ਜੋੜਾਬੱਧ ਰੱਖਿਅਤ ਕਰੋ"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"ਇਸ ਐਪ ਜੋੜਾਬੱਧ ਦਾ ਇਸ ਡੀਵਾਈਸ \'ਤੇ ਸਮਰਥਨ ਨਹੀਂ ਕੀਤਾ ਜਾਂਦਾ"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"ਚੌੜਾਈ ਘਟਾਓ"</string>
<string name="action_decrease_height" msgid="282377193880900022">"ਉਂਚਾਈ ਘਟਾਓ"</string>
<string name="widget_resized" msgid="9130327887929620">"ਵਿਜੈਟ ਨੂੰ ਚੌੜਾਈ <xliff:g id="NUMBER_0">%1$s</xliff:g> ਉਂਚਾਈ <xliff:g id="NUMBER_1">%2$s</xliff:g> ਨੂੰ ਮੁੜ ਆਕਾਰ ਦਿੱਤਾ"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"ਸ਼ਾਰਟਕੱਟ"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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-pl/strings.xml b/res/values-pl/strings.xml
index bde1d2f..ca00d6c 100644
--- a/res/values-pl/strings.xml
+++ b/res/values-pl/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Informacje o aplikacji: %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$s – ustawienia użycia"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Nowe okno"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Zarządzaj oknami"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Zapisz parę aplikacji"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Ta para aplikacji nie jest obsługiwana na tym urządzeniu"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Zmniejsz szerokość"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Zmniejsz wysokość"</string>
<string name="widget_resized" msgid="9130327887929620">"Szerokość i wysokość widżetu zmieniła się na <xliff:g id="NUMBER_0">%1$s</xliff:g> x <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Skróty"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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 1fadfdd..a6b2929 100644
--- a/res/values-pt-rPT/strings.xml
+++ b/res/values-pt-rPT/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Informações da app para %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Definições de utilização para %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Nova janela"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Gerir janelas"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Guardar par de apps"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Este par de apps não é suportado neste dispositivo"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Diminuir largura"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Diminuir altura"</string>
<string name="widget_resized" msgid="9130327887929620">"Widget redimensionado para a largura <xliff:g id="NUMBER_0">%1$s</xliff:g>, altura <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Atalhos"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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>
diff --git a/res/values-pt/strings.xml b/res/values-pt/strings.xml
index e2cf070..606e1d7 100644
--- a/res/values-pt/strings.xml
+++ b/res/values-pt/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Informações do app %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Configurações de uso de %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Nova janela"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Gerenciar janelas"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Salvar par de apps"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Este Par de apps não está disponível no dispositivo"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Diminuir largura"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Diminuir altura"</string>
<string name="widget_resized" msgid="9130327887929620">"Widget redimensionado para a largura <xliff:g id="NUMBER_0">%1$s</xliff:g>, altura <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Atalhos"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<string name="action_dismiss_notification" msgid="5909461085055959187">"Dispensar"</string>
<string name="accessibility_close" msgid="2277148124685870734">"Fechar"</string>
<string name="all_apps_personal_tab" msgid="4190252696685155002">"Pessoais"</string>
diff --git a/res/values-ro/strings.xml b/res/values-ro/strings.xml
index 71d16cb..092c89e 100644
--- a/res/values-ro/strings.xml
+++ b/res/values-ro/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Informații despre aplicație pentru %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Setări de utilizare pentru %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Fereastră nouă"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Gestionează ferestrele"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Salvează perechea de aplicații"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Perechea de aplicații nu este acceptată pe acest dispozitiv"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Redu lățimea"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Redu înălțimea"</string>
<string name="widget_resized" msgid="9130327887929620">"Widgetul a fost redimensionat la lățimea <xliff:g id="NUMBER_0">%1$s</xliff:g> și înălțimea <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Comenzi rapide"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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 10af874..0c8ec40 100644
--- a/res/values-ru/strings.xml
+++ b/res/values-ru/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Сведения о приложении \"%1$s\""</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Настройки использования приложения \"%1$s\""</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Новое окно"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Управление окнами"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Сохранить приложения"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Одновременно использовать эти два приложения на устройстве нельзя."</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Уменьшить ширину"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Уменьшить высоту"</string>
<string name="widget_resized" msgid="9130327887929620">"Изменен размер виджета: до <xliff:g id="NUMBER_0">%1$s</xliff:g> в ширину и <xliff:g id="NUMBER_1">%2$s</xliff:g> в высоту"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Ярлыки"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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-si/strings.xml b/res/values-si/strings.xml
index 44fc1da..6e2fc2a 100644
--- a/res/values-si/strings.xml
+++ b/res/values-si/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s සඳහා යෙදුම් තතු"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$s සඳහා භාවිත සැකසීම්"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"නව කවුළුව"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"කවුළු කළමනාකරණය කරන්න"</string>
<string name="save_app_pair" msgid="5647523853662686243">"යෙදුම් යුගල සුරකින්න"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"මෙම යෙදුම් යුගලය මෙම උපාංගයෙහි සහාය නොදක්වයි"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"පළල අඩු කරන්න"</string>
<string name="action_decrease_height" msgid="282377193880900022">"උස අඩු කරන්න"</string>
<string name="widget_resized" msgid="9130327887929620">"විජට් පළල <xliff:g id="NUMBER_0">%1$s</xliff:g> උස <xliff:g id="NUMBER_1">%2$s</xliff:g> වෙත ප්රමාණකරණය කරන ලදි"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"කෙටිමං"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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-sk/strings.xml b/res/values-sk/strings.xml
index 8eb4e38..b8de977 100644
--- a/res/values-sk/strings.xml
+++ b/res/values-sk/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Informácie o aplikácii pre %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Nastavenia používania pre %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Nové okno"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Spravovať okná"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Uložiť pár aplikácií"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Tento pár aplikácií nie je v tomto zariadení podporovaný"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Znížiť šírku"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Znížiť výšku"</string>
<string name="widget_resized" msgid="9130327887929620">"Veľkosť miniaplikácie bola zmenená na <xliff:g id="NUMBER_0">%1$s</xliff:g> x <xliff:g id="NUMBER_1">%2$s</xliff:g> (šírka x výška)"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Skratky"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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 9c2221b..70e8e2e 100644
--- a/res/values-sl/strings.xml
+++ b/res/values-sl/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Podatki o aplikaciji za: %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Nastavitve uporabe za »%1$s«"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Novo okno"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Upravljanje oken"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Shrani par aplikacij"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Ta par aplikacij ni podprt v tej napravi"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Zmanjšanje širine"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Zmanjšanje višine"</string>
<string name="widget_resized" msgid="9130327887929620">"Velikost pripomočka je bila spremenjena na <xliff:g id="NUMBER_0">%1$s</xliff:g> širine in <xliff:g id="NUMBER_1">%2$s</xliff:g> višine"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Bližnjice"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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>
diff --git a/res/values-sq/strings.xml b/res/values-sq/strings.xml
index ced2c8c..3fb73e6 100644
--- a/res/values-sq/strings.xml
+++ b/res/values-sq/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Informacioni i aplikacionit për %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Cilësimet e përdorimit për \"%1$s\""</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Dritare e re"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Menaxho dritaret"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Ruaj çiftin e aplikacioneve"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Ky çift aplikacionesh nuk mbështetet në këtë pajisje"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Zvogëlo gjerësinë"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Zvogëlo lartësinë"</string>
<string name="widget_resized" msgid="9130327887929620">"Madhësia e miniaplikacionit u ndryshua me gjerësinë <xliff:g id="NUMBER_0">%1$s</xliff:g> dhe lartësinë <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Shkurtoret"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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 b4cc0e5..1997f54 100644
--- a/res/values-sr/strings.xml
+++ b/res/values-sr/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Информације о апликацији за: %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Подешавања потрошње за %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Нови прозор"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Управљајте прозорима"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Сачувај пар апликација"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Овај пар апликација није подржан на овом уређају"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Смањи ширину"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Смањи висину"</string>
<string name="widget_resized" msgid="9130327887929620">"Величина виџета је промењена на ширину <xliff:g id="NUMBER_0">%1$s</xliff:g> и висину <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Пречице"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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-sv/strings.xml b/res/values-sv/strings.xml
index 52b8108..2d34ee9 100644
--- a/res/values-sv/strings.xml
+++ b/res/values-sv/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Appinformation för %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Användningsinställningar för %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Nytt fönster"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Hantera fönster"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Spara app-par"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"De här apparna som ska användas tillsammans stöds inte på den här enheten"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Minska bredden"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Minska höjden"</string>
<string name="widget_resized" msgid="9130327887929620">"Widgetens storlek har ändrats till: bredd <xliff:g id="NUMBER_0">%1$s</xliff:g>, höjd <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Genvägar"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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 5acef91..e258b0e 100644
--- a/res/values-sw/strings.xml
+++ b/res/values-sw/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Maelezo ya programu ya %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Mipangilio ya matumizi ya %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Dirisha Jipya"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Dhibiti Windows"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Hifadhi jozi ya programu"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Jozi hii ya programu haitumiki kwenye kifaa hiki"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Punguza upana"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Punguza urefu"</string>
<string name="widget_resized" msgid="9130327887929620">"Wijeti imepunguzwa hadi upana <xliff:g id="NUMBER_0">%1$s</xliff:g> urefu <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Njia za mkato"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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-ta/strings.xml b/res/values-ta/strings.xml
index ea84963..643bad3 100644
--- a/res/values-ta/strings.xml
+++ b/res/values-ta/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$sக்கான ஆப்ஸ் தகவல்கள்"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$sக்கான உபயோக அமைப்புகள்"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"புதிய சாளரம்"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"சாளரங்களை நிர்வகியுங்கள்"</string>
<string name="save_app_pair" msgid="5647523853662686243">"ஆப்ஸ் ஜோடியைச் சேமி"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"இந்தச் சாதனத்தில் இந்த ஆப்ஸ் ஜோடி ஆதரிக்கப்படவில்லை"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"அகலத்தைக் குறை"</string>
<string name="action_decrease_height" msgid="282377193880900022">"உயரத்தைக் குறை"</string>
<string name="widget_resized" msgid="9130327887929620">"அகலம் <xliff:g id="NUMBER_0">%1$s</xliff:g> மற்றும் உயரம் <xliff:g id="NUMBER_1">%2$s</xliff:g>க்கு விட்ஜெட் அளவு மாற்றப்பட்டது"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"ஷார்ட்கட்கள்"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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 f445d77..ddd988d 100644
--- a/res/values-te/strings.xml
+++ b/res/values-te/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s కోసం యాప్ సమాచారం"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$sకు సంబంధించిన వినియోగ సెట్టింగ్లు"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"కొత్త విండో"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"విండోలను మేనేజ్ చేయండి"</string>
<string name="save_app_pair" msgid="5647523853662686243">"యాప్ పెయిర్ను సేవ్ చేయండి"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"ఈ పరికరంలో ఈ యాప్ పెయిర్ సపోర్ట్ చేయదు"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"వెడల్పును తగ్గించు"</string>
<string name="action_decrease_height" msgid="282377193880900022">"ఎత్తును తగ్గించు"</string>
<string name="widget_resized" msgid="9130327887929620">"విడ్జెట్ సైజ్ వెడల్పు <xliff:g id="NUMBER_0">%1$s</xliff:g>కి, ఎత్తు <xliff:g id="NUMBER_1">%2$s</xliff:g>కి మార్చబడింది"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"షార్ట్కట్స్"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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-th/strings.xml b/res/values-th/strings.xml
index 6acf390..13cd092 100644
--- a/res/values-th/strings.xml
+++ b/res/values-th/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"ข้อมูลแอปสำหรับ %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"การตั้งค่าการใช้งานสำหรับ %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"หน้าต่างใหม่"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"จัดการหน้าต่าง"</string>
<string name="save_app_pair" msgid="5647523853662686243">"บันทึกคู่แอป"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"ไม่รองรับคู่แอปนี้ในอุปกรณ์เครื่องนี้"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"ลดความกว้าง"</string>
<string name="action_decrease_height" msgid="282377193880900022">"ลดความสูง"</string>
<string name="widget_resized" msgid="9130327887929620">"ปรับขนาดของวิดเจ็ตเป็นกว้าง <xliff:g id="NUMBER_0">%1$s</xliff:g> สูง <xliff:g id="NUMBER_1">%2$s</xliff:g> แล้ว"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"ทางลัด"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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-tl/strings.xml b/res/values-tl/strings.xml
index 0cef73a..58030f0 100644
--- a/res/values-tl/strings.xml
+++ b/res/values-tl/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Impormasyon ng app para sa %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Mga setting ng paggamit para sa %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Bagong Window"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Pamahalaan ang Mga Window"</string>
<string name="save_app_pair" msgid="5647523853662686243">"I-save ang app pair"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Hindi sinusuportahan sa device na ito ang pares ng app na ito"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Bawasan ang lapad"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Bawasan ang taas"</string>
<string name="widget_resized" msgid="9130327887929620">"Na-resize ang widget sa lapad <xliff:g id="NUMBER_0">%1$s</xliff:g> taas <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Mga Shortcut"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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>
diff --git a/res/values-tr/strings.xml b/res/values-tr/strings.xml
index 8dbcc49..2def2ac 100644
--- a/res/values-tr/strings.xml
+++ b/res/values-tr/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s uygulama bilgileri"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$s ile ilgili kullanım ayarları"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Yeni Pencere"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Pencereleri yönet"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Uygulama çiftini kaydedin"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Bu uygulama çifti bu cihazda desteklenmiyor"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Genişliği azalt"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Yüksekliği azalt"</string>
<string name="widget_resized" msgid="9130327887929620">"Widget, <xliff:g id="NUMBER_0">%1$s</xliff:g> genişlik ve <xliff:g id="NUMBER_1">%2$s</xliff:g> yükseklik değerine yeniden boyutlandırıldı"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Kısayollar"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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-uk/strings.xml b/res/values-uk/strings.xml
index 069277d..0f0752c 100644
--- a/res/values-uk/strings.xml
+++ b/res/values-uk/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Інформація про додаток для %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Параметри використання (%1$s)"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Нове вікно"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Керувати вікнами"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Зберегти пару додатків"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Ці два додатки не можна одночасно використовувати на цьому пристрої"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Зменшити ширину"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Зменшити висоту"</string>
<string name="widget_resized" msgid="9130327887929620">"Розміри віджета змінено на <xliff:g id="NUMBER_0">%1$s</xliff:g> завширшки та <xliff:g id="NUMBER_1">%2$s</xliff:g> заввишки"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Ярлики"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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-ur/strings.xml b/res/values-ur/strings.xml
index 3cbfd1b..260ae25 100644
--- a/res/values-ur/strings.xml
+++ b/res/values-ur/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s کے لیے ایپ کی معلومات"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$s کیلئے استعمال کی ترتیبات"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"نئی ونڈو"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Windows کا نظم کریں"</string>
<string name="save_app_pair" msgid="5647523853662686243">"ایپس کے جوڑے کو محفوظ کریں"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"ایپس کا یہ جوڑا اس آلے پر تعاون یافتہ نہیں ہے"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"چوڑائی کم کریں"</string>
<string name="action_decrease_height" msgid="282377193880900022">"اونچائی کم کریں"</string>
<string name="widget_resized" msgid="9130327887929620">"ویجیٹ کے سائز کو چوڑائی <xliff:g id="NUMBER_0">%1$s</xliff:g> اونچائی <xliff:g id="NUMBER_1">%2$s</xliff:g> میں تبدیل کر دیا گیا"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"شارٹ کٹس"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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 2b77321..ecd72f6 100644
--- a/res/values-uz/strings.xml
+++ b/res/values-uz/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s ilovasi axboroti"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$s uchun sarf sozlamalari"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Yangi oyna"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Oynalarni boshqarish"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Ilova juftini saqlash"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Bu ilova jufti ushbu qurilmada ishlamaydi"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Enini kichraytirish"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Bo‘yini kichraytirish"</string>
<string name="widget_resized" msgid="9130327887929620">"Vidjetning eni <xliff:g id="NUMBER_0">%1$s</xliff:g>, bo‘yi <xliff:g id="NUMBER_1">%2$s</xliff:g> qilib o‘zgartirildi"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Tezkor tugmalar"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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>
diff --git a/res/values-vi/strings.xml b/res/values-vi/strings.xml
index ae49356..03e048e0 100644
--- a/res/values-vi/strings.xml
+++ b/res/values-vi/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Thông tin ứng dụng cho %1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Chế độ cài đặt mức sử dụng %1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Cửa sổ mới"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Quản lý cửa sổ"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Lưu cặp ứng dụng"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Cặp ứng dụng này không hoạt động được trên thiết bị này"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Giảm chiều rộng"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Giảm chiều cao"</string>
<string name="widget_resized" msgid="9130327887929620">"Đã đổi kích thước tiện ích thành chiều rộng <xliff:g id="NUMBER_0">%1$s</xliff:g> chiều cao <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Lối tắt"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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 69d92f8..356e6e5 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s 的应用信息"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"%1$s的使用设置"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"新窗口"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"管理窗口"</string>
<string name="save_app_pair" msgid="5647523853662686243">"保存应用组合"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"在该设备上无法使用此应用对"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"减小宽度"</string>
<string name="action_decrease_height" msgid="282377193880900022">"减小高度"</string>
<string name="widget_resized" msgid="9130327887929620">"微件尺寸已调整为:宽度 <xliff:g id="NUMBER_0">%1$s</xliff:g>,高度 <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"快捷方式"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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 3589167..b9e31dc 100644
--- a/res/values-zh-rHK/strings.xml
+++ b/res/values-zh-rHK/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"%1$s 的應用程式資料"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"「%1$s」的用量設定"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"新視窗"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"管理視窗"</string>
<string name="save_app_pair" msgid="5647523853662686243">"儲存應用程式配對"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"此裝置不支援此應用程式配對"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"減少闊度"</string>
<string name="action_decrease_height" msgid="282377193880900022">"減少高度"</string>
<string name="widget_resized" msgid="9130327887929620">"已調整小工具的大小至闊 <xliff:g id="NUMBER_0">%1$s</xliff:g> 高 <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"捷徑"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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 3f16360..2db315b 100644
--- a/res/values-zh-rTW/strings.xml
+++ b/res/values-zh-rTW/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"「%1$s」的應用程式資訊"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"「%1$s」的用量設定"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"新視窗"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"管理視窗"</string>
<string name="save_app_pair" msgid="5647523853662686243">"儲存應用程式配對"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"這部裝置不支援這組應用程式配對"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"減少寬度"</string>
<string name="action_decrease_height" msgid="282377193880900022">"減少高度"</string>
<string name="widget_resized" msgid="9130327887929620">"已將小工具的寬度和高度分別調整為 <xliff:g id="NUMBER_0">%1$s</xliff:g> 和 <xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"捷徑"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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 63fd982..10f425d 100644
--- a/res/values-zu/strings.xml
+++ b/res/values-zu/strings.xml
@@ -32,8 +32,7 @@
<string name="split_app_info_accessibility" msgid="5475288491241414932">"Ulwazi lwe-App ye-%1$s"</string>
<string name="split_app_usage_settings" msgid="7214375263347964093">"Amasethingi okusetshenziswa ka-%1$s"</string>
<string name="new_window_option_taskbar" msgid="6448780542727767211">"Iwindi Elisha"</string>
- <!-- no translation found for manage_windows_option_taskbar (2294109489960654212) -->
- <skip />
+ <string name="manage_windows_option_taskbar" msgid="2294109489960654212">"Phatha Amawindi"</string>
<string name="save_app_pair" msgid="5647523853662686243">"Londoloza i-app ebhangqiwe"</string>
<string name="app_pair_default_title" msgid="4045241727446873529">"<xliff:g id="APP1">%1$s</xliff:g> | <xliff:g id="APP2">%2$s</xliff:g>"</string>
<string name="app_pair_unlaunchable_at_screen_size" msgid="3446551575502685376">"Lokhu kubhanqwa kwe-app akusekelwa kule divayisi"</string>
@@ -179,7 +178,8 @@
<string name="action_decrease_width" msgid="1374549771083094654">"Nciphisa ububanzi"</string>
<string name="action_decrease_height" msgid="282377193880900022">"Nciphisa ubude"</string>
<string name="widget_resized" msgid="9130327887929620">"Iwijethi inikezwe usayizi omusha ngobubanzi obungu-<xliff:g id="NUMBER_0">%1$s</xliff:g> ubude obungu-<xliff:g id="NUMBER_1">%2$s</xliff:g>"</string>
- <string name="action_deep_shortcut" msgid="2864038805849372848">"Izinqamuleli"</string>
+ <!-- no translation found for action_deep_shortcut (4766835855579976045) -->
+ <skip />
<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/dimens.xml b/res/values/dimens.xml
index 0d4e79b..326ee06 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -568,4 +568,8 @@
<!-- WindowManagerProxy -->
<dimen name="max_width_and_height_of_small_display_cutout">136px</dimen>
+
+ <!-- App Title Pill -->
+ <dimen name="app_title_pill_horizontal_padding">4dp</dimen>
+ <dimen name="app_title_pill_round_rect_padding">2dp</dimen>
</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index c280307..f7069a6 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -458,7 +458,7 @@
<string name="widget_resized">Widget resized to width <xliff:g id="number" example="2">%1$s</xliff:g> height <xliff:g id="number" example="1">%2$s</xliff:g></string>
<!-- Accessibility action to show quick actions menu for an icon. [CHAR_LIMIT=30] -->
- <string name="action_deep_shortcut">Shortcuts</string>
+ <string name="action_deep_shortcut">Shortcut Menu</string>
<!-- Accessibility action to dismiss a notification in the shortcuts menu for an icon. [CHAR_LIMIT=30] -->
<string name="action_dismiss_notification">Dismiss</string>
diff --git a/src/com/android/launcher3/BubbleTextView.java b/src/com/android/launcher3/BubbleTextView.java
index 817cc40..eaa720e 100644
--- a/src/com/android/launcher3/BubbleTextView.java
+++ b/src/com/android/launcher3/BubbleTextView.java
@@ -127,8 +127,6 @@
private static final int[] STATE_PRESSED = new int[]{android.R.attr.state_pressed};
- private static final int APP_PILL_TITLE_PADDING = 8;
-
private float mScaleForReorderBounce = 1f;
private IntArray mBreakPointsIntArray;
@@ -734,12 +732,18 @@
getDrawingRect(tmpRect);
CharSequence text = getText();
+ int mAppTitleHorizontalPadding = getResources().getDimensionPixelSize(
+ R.dimen.app_title_pill_horizontal_padding);
+ int mRoundRectPadding = getResources().getDimensionPixelSize(
+ R.dimen.app_title_pill_round_rect_padding);
+
float titleLength = (getPaint().measureText(text, 0, text.length())
- + APP_PILL_TITLE_PADDING * 2);
+ + (mAppTitleHorizontalPadding + mRoundRectPadding) * 2);
titleLength = Math.min(titleLength, tmpRect.width());
appTitleBounds = new RectF((tmpRect.width() - titleLength) / 2.f - getCompoundPaddingLeft(),
0, (tmpRect.width() + titleLength) / 2.f + getCompoundPaddingRight(),
(int) Math.ceil(fm.bottom - fm.top));
+ appTitleBounds.inset(mRoundRectPadding * 2, 0);
if (mIcon != null) {
@@ -859,8 +863,13 @@
getPaddingBottom());
}
if (shouldDrawAppContrastTile()) {
- setPadding(getPaddingLeft() + APP_PILL_TITLE_PADDING, getPaddingTop(),
- getPaddingRight() + APP_PILL_TITLE_PADDING,
+ int mAppTitleHorizontalPadding = getResources().getDimensionPixelSize(
+ R.dimen.app_title_pill_horizontal_padding);
+ int mRoundRectPadding = getResources().getDimensionPixelSize(
+ R.dimen.app_title_pill_round_rect_padding);
+
+ setPadding(mAppTitleHorizontalPadding + mRoundRectPadding, getPaddingTop(),
+ mAppTitleHorizontalPadding + mRoundRectPadding,
getPaddingBottom());
}
// Only apply two line for all_apps and device search only if necessary.
@@ -971,7 +980,7 @@
public boolean shouldDrawAppContrastTile() {
return mDisplay == DISPLAY_WORKSPACE && shouldTextBeVisible()
&& PillColorProvider.getInstance(getContext()).isMatchaEnabled()
- && enableContrastTiles();
+ && enableContrastTiles() && TextUtils.isEmpty(getText());
}
public void setTextVisibility(boolean visible) {
diff --git a/src/com/android/launcher3/ButtonDropTarget.java b/src/com/android/launcher3/ButtonDropTarget.java
index 867bf98..18619f5 100644
--- a/src/com/android/launcher3/ButtonDropTarget.java
+++ b/src/com/android/launcher3/ButtonDropTarget.java
@@ -65,7 +65,7 @@
protected final ActivityContext mActivityContext;
protected final DropTargetHandler mDropTargetHandler;
protected DropTargetBar mDropTargetBar;
- private final MSDLPlayerWrapper mMSDLPlayerWrapper;
+ private MSDLPlayerWrapper mMSDLPlayerWrapper;
/** Whether this drop target is active for the current drag */
protected boolean mActive;
@@ -438,6 +438,11 @@
return textHeight + getPaddingTop() + getPaddingBottom() >= availableHeight;
}
+ @VisibleForTesting
+ public void setMSDLPlayerWrapper(MSDLPlayerWrapper wrapper) {
+ mMSDLPlayerWrapper = wrapper;
+ }
+
/**
* Reduce the size of the text until it fits the measured width or reaches a minimum.
*
diff --git a/src/com/android/launcher3/DeleteDropTarget.java b/src/com/android/launcher3/DeleteDropTarget.java
index 58789fd..425f277 100644
--- a/src/com/android/launcher3/DeleteDropTarget.java
+++ b/src/com/android/launcher3/DeleteDropTarget.java
@@ -130,7 +130,6 @@
public void completeDrop(DragObject d) {
ItemInfo item = d.dragInfo;
if (canRemove(item)) {
- onAccessibilityDrop(null, item);
mDropTargetHandler.onDeleteComplete(item);
}
}
diff --git a/src/com/android/launcher3/DropTargetHandler.kt b/src/com/android/launcher3/DropTargetHandler.kt
index f1029b1..4d3fe52 100644
--- a/src/com/android/launcher3/DropTargetHandler.kt
+++ b/src/com/android/launcher3/DropTargetHandler.kt
@@ -65,6 +65,7 @@
}
fun onDeleteComplete(item: ItemInfo) {
+ removeItemAndStripEmptyScreens(null /* view */, item)
var pageItem: ItemInfo = item
if (item.container <= 0) {
val v = mLauncher.workspace.getHomescreenIconByItemId(item.container)
@@ -90,11 +91,7 @@
}
fun onAccessibilityDelete(view: View?, item: ItemInfo, announcement: CharSequence) {
- // Remove the item from launcher and the db, we can ignore the containerInfo in this call
- // because we already remove the drag view from the folder (if the drag originated from
- // a folder) in Folder.beginDrag()
- mLauncher.removeItem(view, item, true /* deleteFromDb */, "removed by accessibility drop")
- mLauncher.workspace.stripEmptyScreens()
+ removeItemAndStripEmptyScreens(view, item)
mLauncher.dragLayer.announceForAccessibility(announcement)
}
@@ -105,4 +102,12 @@
fun onClick(buttonDropTarget: ButtonDropTarget) {
mLauncher.accessibilityDelegate.handleAccessibleDrop(buttonDropTarget, null, null)
}
+
+ private fun removeItemAndStripEmptyScreens(view: View?, item: ItemInfo) {
+ // Remove the item from launcher and the db, we can ignore the containerInfo in this call
+ // because we already remove the drag view from the folder (if the drag originated from
+ // a folder) in Folder.beginDrag()
+ mLauncher.removeItem(view, item, true /* deleteFromDb */, "removed by accessibility drop")
+ mLauncher.workspace.stripEmptyScreens()
+ }
}
diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java
index 74dd971..8981024 100644
--- a/src/com/android/launcher3/Launcher.java
+++ b/src/com/android/launcher3/Launcher.java
@@ -233,6 +233,7 @@
import com.android.launcher3.util.ItemInflater;
import com.android.launcher3.util.KeyboardShortcutsDelegate;
import com.android.launcher3.util.LockedUserState;
+import com.android.launcher3.util.MSDLPlayerWrapper;
import com.android.launcher3.util.PackageUserKey;
import com.android.launcher3.util.PendingRequestArgs;
import com.android.launcher3.util.PluginManagerWrapper;
@@ -784,7 +785,7 @@
}
// When the flag oneGridSpecs is on we want to disable ALLOW_ROTATION which is replaced
// by FIXED_LANDSCAPE_MODE, ALLOW_ROTATION will only be used on Tablets afterwards.
- if (!getDeviceProfile().isTablet) {
+ if (getDeviceProfile().isPhone || getDeviceProfile().isTwoPanels) {
LauncherPrefs.get(this).put(LauncherPrefs.ALLOW_ROTATION, false);
}
getRotationHelper().setFixedLandscape(
@@ -2745,6 +2746,7 @@
mModel.dumpState(prefix, fd, writer, args);
mOverlayManager.dump(prefix, writer);
ACTIVITY_TRACKER.dump(prefix, writer);
+ MSDLPlayerWrapper.INSTANCE.get(getApplicationContext()).dump(prefix, writer);
}
/**
diff --git a/src/com/android/launcher3/allapps/search/AllAppsSearchBarController.java b/src/com/android/launcher3/allapps/search/AllAppsSearchBarController.java
index 7e3e392..fe11ee2 100644
--- a/src/com/android/launcher3/allapps/search/AllAppsSearchBarController.java
+++ b/src/com/android/launcher3/allapps/search/AllAppsSearchBarController.java
@@ -150,6 +150,7 @@
mCallback.clearSearchResult();
mInput.reset();
mInput.clearFocus();
+ mInput.hideKeyboard();
mQuery = null;
}
diff --git a/src/com/android/launcher3/logging/StatsLogManager.java b/src/com/android/launcher3/logging/StatsLogManager.java
index 2550ebb..dbab52a 100644
--- a/src/com/android/launcher3/logging/StatsLogManager.java
+++ b/src/com/android/launcher3/logging/StatsLogManager.java
@@ -843,6 +843,13 @@
@UiEvent(doc = "User long press nav handle and a long press runnable was created.")
LAUNCHER_OMNI_GET_LONG_PRESS_RUNNABLE(1545),
+
+ // One Grid Flags
+ @UiEvent(doc = "User sets the device in Fixed Landscape")
+ FIXED_LANDSCAPE_TOGGLE_ENABLE(2014),
+
+ @UiEvent(doc = "User sets the device in Fixed Landscape")
+ FIXED_LANDSCAPE_TOGGLE_DISABLED(2020),
// ADD MORE
;
diff --git a/src/com/android/launcher3/model/GridSizeMigrationLogic.kt b/src/com/android/launcher3/model/GridSizeMigrationLogic.kt
index 3f52d8a..75fd31e 100644
--- a/src/com/android/launcher3/model/GridSizeMigrationLogic.kt
+++ b/src/com/android/launcher3/model/GridSizeMigrationLogic.kt
@@ -58,12 +58,17 @@
}
val isFirstLoad = get(context).get(LauncherPrefs.IS_FIRST_LOAD_AFTER_RESTORE)
- Log.d(TAG, "Begin grid migration. First load: $isFirstLoad")
+ Log.d(
+ TAG,
+ "Begin grid migration. First load: $isFirstLoad\n srcDeviceState: " +
+ "$srcDeviceState\ndestDeviceState: $destDeviceState\nisDestNewDb: $isDestNewDb",
+ )
// This is a special case where if the grid is the same amount of columns but a larger
// amount of rows we simply copy over the source grid to the destination grid, rather
// than undergoing the general grid migration.
if (shouldMigrateToStrictlyTallerGrid(isDestNewDb, srcDeviceState, destDeviceState)) {
+ Log.d(TAG, "Migrating to strictly taller grid")
copyTable(source, TABLE_NAME, target.writableDatabase, TABLE_NAME, context)
if (oneGridSpecs()) {
val destReader = DbReader(target.writableDatabase, TABLE_NAME, context)
diff --git a/src/com/android/launcher3/popup/PopupPopulator.java b/src/com/android/launcher3/popup/PopupPopulator.java
index 755c3eb..b748011 100644
--- a/src/com/android/launcher3/popup/PopupPopulator.java
+++ b/src/com/android/launcher3/popup/PopupPopulator.java
@@ -116,7 +116,7 @@
final UserHandle user = originalInfo.user;
return () -> {
ApplicationInfoWrapper infoWrapper =
- new ApplicationInfoWrapper(context, activity.getPackageName(), user);
+ new ApplicationInfoWrapper(context, originalInfo.getTargetPackage(), user);
List<ShortcutInfo> shortcuts = new ShortcutRequest(context, user)
.withContainer(activity)
.query(ShortcutRequest.PUBLISHED);
diff --git a/src/com/android/launcher3/util/ContextTracker.java b/src/com/android/launcher3/util/ContextTracker.java
index c729b4b..3201bd1 100644
--- a/src/com/android/launcher3/util/ContextTracker.java
+++ b/src/com/android/launcher3/util/ContextTracker.java
@@ -35,7 +35,7 @@
private static final String TAG = "ContextTracker";
private WeakReference<CONTEXT> mCurrentContext = new WeakReference<>(null);
- private CopyOnWriteArrayList<SchedulerCallback<CONTEXT>> mCallbacks =
+ private final CopyOnWriteArrayList<SchedulerCallback<CONTEXT>> mCallbacks =
new CopyOnWriteArrayList<>();
@Nullable
@@ -81,7 +81,7 @@
public boolean handleCreate(CONTEXT context) {
mCurrentContext = new WeakReference<>(context);
- return handleCreate(context, /* alreadyOnHome= */ false);
+ return handleCreate(context, isHomeStarted(context));
}
public boolean handleNewIntent(CONTEXT context) {
diff --git a/src/com/android/launcher3/util/MSDLPlayerWrapper.java b/src/com/android/launcher3/util/MSDLPlayerWrapper.java
index aab7009..8a1d923 100644
--- a/src/com/android/launcher3/util/MSDLPlayerWrapper.java
+++ b/src/com/android/launcher3/util/MSDLPlayerWrapper.java
@@ -30,6 +30,7 @@
import com.google.android.msdl.domain.MSDLPlayer;
import com.google.android.msdl.logging.MSDLEvent;
+import java.io.PrintWriter;
import java.util.List;
import javax.inject.Inject;
@@ -65,4 +66,14 @@
public List<MSDLEvent> getHistory() {
return mMSDLPlayer.getHistory();
}
+
+ /** Print the latest history of MSDL tokens played */
+ public void dump(String prefix, PrintWriter writer) {
+ writer.println(prefix + mMSDLPlayer.toString());
+ writer.println(prefix + "MSDLPlayerWrapper history of latest events:");
+ List<MSDLEvent> events = getHistory();
+ for (MSDLEvent event: events) {
+ writer.println(prefix + "\t" + event);
+ }
+ }
}
diff --git a/tests/AndroidManifest-common.xml b/tests/AndroidManifest-common.xml
index 1ddd453..68e493d 100644
--- a/tests/AndroidManifest-common.xml
+++ b/tests/AndroidManifest-common.xml
@@ -183,6 +183,7 @@
</activity>
<activity-alias android:name="Activity2"
android:label="TestActivity2"
+ android:icon="@drawable/test_icon"
android:exported="true"
android:targetActivity="com.android.launcher3.testcomponent.BaseTestingActivity">
<intent-filter>
@@ -192,6 +193,7 @@
</activity-alias>
<activity-alias android:name="Activity3"
android:label="TestActivity3"
+ android:icon="@drawable/test_icon"
android:exported="true"
android:targetActivity="com.android.launcher3.testcomponent.BaseTestingActivity">
<intent-filter>
@@ -201,6 +203,7 @@
</activity-alias>
<activity-alias android:name="Activity4"
android:label="TestActivity4"
+ android:icon="@drawable/test_icon"
android:exported="true"
android:targetActivity="com.android.launcher3.testcomponent.BaseTestingActivity">
<intent-filter>
@@ -210,6 +213,7 @@
</activity-alias>
<activity-alias android:name="Activity5"
android:label="TestActivity5"
+ android:icon="@drawable/test_icon"
android:exported="true"
android:targetActivity="com.android.launcher3.testcomponent.BaseTestingActivity">
<intent-filter>
@@ -219,6 +223,7 @@
</activity-alias>
<activity-alias android:name="Activity6"
android:label="TestActivity6"
+ android:icon="@drawable/test_icon"
android:exported="true"
android:targetActivity="com.android.launcher3.testcomponent.BaseTestingActivity">
<intent-filter>
@@ -228,6 +233,7 @@
</activity-alias>
<activity-alias android:name="Activity7"
android:label="TestActivity7"
+ android:icon="@drawable/test_icon"
android:exported="true"
android:targetActivity="com.android.launcher3.testcomponent.BaseTestingActivity">
<intent-filter>
@@ -237,6 +243,7 @@
</activity-alias>
<activity-alias android:name="Activity8"
android:label="TestActivity8"
+ android:icon="@drawable/test_icon"
android:exported="true"
android:targetActivity="com.android.launcher3.testcomponent.BaseTestingActivity">
<intent-filter>
@@ -246,6 +253,7 @@
</activity-alias>
<activity-alias android:name="Activity9" android:exported="true"
android:label="TestActivity9"
+ android:icon="@drawable/test_icon"
android:targetActivity="com.android.launcher3.testcomponent.OtherBaseTestingActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@@ -254,6 +262,7 @@
</activity-alias>
<activity-alias android:name="Activity10" android:exported="true"
android:label="TestActivity10"
+ android:icon="@drawable/test_icon"
android:targetActivity="com.android.launcher3.testcomponent.OtherBaseTestingActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@@ -262,6 +271,7 @@
</activity-alias>
<activity-alias android:name="Activity11" android:exported="true"
android:label="TestActivity11"
+ android:icon="@drawable/test_icon"
android:targetActivity="com.android.launcher3.testcomponent.OtherBaseTestingActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@@ -270,6 +280,7 @@
</activity-alias>
<activity-alias android:name="Activity12" android:exported="true"
android:label="TestActivity12"
+ android:icon="@drawable/test_icon"
android:targetActivity="com.android.launcher3.testcomponent.OtherBaseTestingActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@@ -278,6 +289,7 @@
</activity-alias>
<activity-alias android:name="Activity13" android:exported="true"
android:label="TestActivity13"
+ android:icon="@drawable/test_icon"
android:targetActivity="com.android.launcher3.testcomponent.OtherBaseTestingActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@@ -286,6 +298,7 @@
</activity-alias>
<activity-alias android:name="Activity14" android:exported="true"
android:label="TestActivity14"
+ android:icon="@drawable/test_icon"
android:targetActivity="com.android.launcher3.testcomponent.OtherBaseTestingActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
@@ -363,7 +376,7 @@
</activity>
<activity android:name="com.android.launcher3.testcomponent.ImeTestActivity"
android:label="ImeTestActivity"
- android:icon="@drawable/test_theme_icon"
+ android:icon="@drawable/test_icon"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
diff --git a/tests/assets/databases/GridMigrationTest/result5x5to3x3.db b/tests/assets/databases/GridMigrationTest/result5x5to3x3.db
index 686056d..6050251 100644
--- a/tests/assets/databases/GridMigrationTest/result5x5to3x3.db
+++ b/tests/assets/databases/GridMigrationTest/result5x5to3x3.db
Binary files differ
diff --git a/tests/assets/databases/GridMigrationTest/result5x5to4x7.db b/tests/assets/databases/GridMigrationTest/result5x5to4x7.db
index cd105c5..e6cd6f0 100644
--- a/tests/assets/databases/GridMigrationTest/result5x5to4x7.db
+++ b/tests/assets/databases/GridMigrationTest/result5x5to4x7.db
Binary files differ
diff --git a/tests/assets/databases/GridMigrationTest/result5x5to5x8.db b/tests/assets/databases/GridMigrationTest/result5x5to5x8.db
index 4b46969..311a112 100644
--- a/tests/assets/databases/GridMigrationTest/result5x5to5x8.db
+++ b/tests/assets/databases/GridMigrationTest/result5x5to5x8.db
Binary files differ
diff --git a/tests/assets/databases/GridMigrationTest/flagged_result5x5to5x8.db b/tests/assets/databases/GridMigrationTest/result5x5to5x8WithShift.db
similarity index 92%
rename from tests/assets/databases/GridMigrationTest/flagged_result5x5to5x8.db
rename to tests/assets/databases/GridMigrationTest/result5x5to5x8WithShift.db
index 8bea3ce..d750774 100644
--- a/tests/assets/databases/GridMigrationTest/flagged_result5x5to5x8.db
+++ b/tests/assets/databases/GridMigrationTest/result5x5to5x8WithShift.db
Binary files differ
diff --git a/tests/assets/databases/GridMigrationTest/test_launcher_2.db b/tests/assets/databases/GridMigrationTest/test_launcher_2.db
new file mode 100644
index 0000000..b538e26
--- /dev/null
+++ b/tests/assets/databases/GridMigrationTest/test_launcher_2.db
Binary files differ
diff --git a/tests/multivalentTests/src/com/android/launcher3/DeleteDropTargetTest.kt b/tests/multivalentTests/src/com/android/launcher3/DeleteDropTargetTest.kt
index 42374a5..fa368e5 100644
--- a/tests/multivalentTests/src/com/android/launcher3/DeleteDropTargetTest.kt
+++ b/tests/multivalentTests/src/com/android/launcher3/DeleteDropTargetTest.kt
@@ -16,7 +16,12 @@
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
+import org.mockito.Mock
+import org.mockito.kotlin.eq
import org.mockito.kotlin.mock
+import org.mockito.kotlin.times
+import org.mockito.kotlin.verify
+import org.mockito.kotlin.verifyNoMoreInteractions
@SmallTest
@RunWith(AndroidJUnit4::class)
@@ -24,6 +29,8 @@
@get:Rule val mSetFlagsRule = SetFlagsRule()
+ @Mock private val msdlPlayerWrapper = mock<MSDLPlayerWrapper>()
+
private var mContext: Context = ActivityContextWrapper(getApplicationContext())
// Use a non-abstract class implementation
@@ -50,13 +57,12 @@
@Test
@EnableFlags(Flags.FLAG_MSDL_FEEDBACK)
fun onDragEnter_performsMSDLSwipeThresholdFeedback() {
+ buttonDropTarget.setMSDLPlayerWrapper(msdlPlayerWrapper)
val target = DropTarget.DragObject(mContext)
target.dragView = mock<DragView<*>>()
buttonDropTarget.onDragEnter(target)
- val wrapper = MSDLPlayerWrapper.INSTANCE.get(mContext)
- val history = wrapper.history
- assertThat(history.size).isEqualTo(1)
- assertThat(history[0].tokenName).isEqualTo(MSDLToken.SWIPE_THRESHOLD_INDICATOR.name)
+ verify(msdlPlayerWrapper, times(1)).playToken(eq(MSDLToken.SWIPE_THRESHOLD_INDICATOR))
+ verifyNoMoreInteractions(msdlPlayerWrapper)
}
}
diff --git a/tests/multivalentTests/src/com/android/launcher3/model/FolderIconLoadTest.kt b/tests/multivalentTests/src/com/android/launcher3/model/FolderIconLoadTest.kt
index 7cd5da4..e8f778f 100644
--- a/tests/multivalentTests/src/com/android/launcher3/model/FolderIconLoadTest.kt
+++ b/tests/multivalentTests/src/com/android/launcher3/model/FolderIconLoadTest.kt
@@ -18,6 +18,7 @@
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.launcher3.LauncherAppState
+import com.android.launcher3.icons.BitmapInfo
import com.android.launcher3.icons.waitForUpdateHandlerToFinish
import com.android.launcher3.model.data.WorkspaceItemInfo
import com.android.launcher3.util.Executors
@@ -160,6 +161,9 @@
assertWithMessage("Index $index was not highRes")
.that(items[index].bitmap.isNullOrLowRes)
.isFalse()
+ assertWithMessage("Index $index was the default icon")
+ .that(isDefaultIcon(items[index].bitmap))
+ .isFalse()
}
}
@@ -168,9 +172,17 @@
assertWithMessage("Index $index was not lowRes")
.that(items[index].bitmap.isNullOrLowRes)
.isTrue()
+ assertWithMessage("Index $index was the default icon")
+ .that(isDefaultIcon(items[index].bitmap))
+ .isFalse()
}
}
+ private fun isDefaultIcon(bitmap: BitmapInfo) =
+ LauncherAppState.getInstance(modelHelper.sandboxContext)
+ .iconCache
+ .isDefaultIcon(bitmap, modelHelper.sandboxContext.user)
+
/** Recreate DeviceProfiles after changing InvariantDeviceProfile */
private fun recreateSupportedDeviceProfiles() {
LauncherAppState.getIDP(modelHelper.sandboxContext).supportedProfiles =
diff --git a/tests/res/drawable/test_icon.xml b/tests/res/drawable/test_icon.xml
new file mode 100644
index 0000000..72ebfeb
--- /dev/null
+++ b/tests/res/drawable/test_icon.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Copyright (C) 2024 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+ <background android:drawable="@android:color/white"/>
+ <foreground>
+ <color android:color="#FFFF0000" />
+ </foreground>
+ <monochrome>
+ <vector android:width="48dp" android:height="48dp" android:viewportWidth="48.0" android:viewportHeight="48.0">
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M0,24L48,24 48,48, 0,48 Z"/>
+ </vector>
+ </monochrome>
+</adaptive-icon>
diff --git a/tests/src/com/android/launcher3/model/GridMigrationTest.kt b/tests/src/com/android/launcher3/model/GridMigrationTest.kt
index 379e98d..b8ffe74 100644
--- a/tests/src/com/android/launcher3/model/GridMigrationTest.kt
+++ b/tests/src/com/android/launcher3/model/GridMigrationTest.kt
@@ -17,6 +17,7 @@
package com.android.launcher3.model
import android.platform.test.flag.junit.SetFlagsRule
+import android.util.Log
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import androidx.test.platform.app.InstrumentationRegistry
@@ -34,7 +35,14 @@
private val phoneContext = InstrumentationRegistry.getInstrumentation().targetContext
-data class EntryData(val x: Int, val y: Int, val spanX: Int, val spanY: Int, val rank: Int)
+data class EntryData(
+ val x: Int,
+ val y: Int,
+ val screenId: Int,
+ val spanX: Int,
+ val spanY: Int,
+ val rank: Int,
+)
/**
* Holds the data needed to run a test in GridMigrationTest, usually we would have a src
@@ -72,24 +80,16 @@
@RunWith(AndroidJUnit4::class)
class GridMigrationTest {
private val DB_FILE = "test_launcher.db"
+ // This DB is used for testing the heuristic where we add an extra row at the bottom.
+ private val DB_FILE_NO_SHIFT = "test_launcher_2.db"
@JvmField
@Rule
val setFlagsRule = SetFlagsRule(SetFlagsRule.DefaultInitValueType.DEVICE_DEFAULT)
- // Copying the src db for all tests.
- @JvmField
- @Rule
- val fileCopier =
- TestToPhoneFileCopier(
- src = "databases/GridMigrationTest/$DB_FILE",
- dest = "databases/$DB_FILE",
- removeOnFinish = true,
- )
-
@Before
fun setup() {
- setFlagsRule.setFlags(false, Flags.FLAG_ENABLE_GRID_MIGRATION_FIX)
+ setFlagsRule.setFlags(true, Flags.FLAG_ONE_GRID_SPECS)
}
private fun migrate(src: GridMigrationData, dst: GridMigrationData) {
@@ -101,7 +101,7 @@
dst.gridState,
dst.dbHelper,
src.dbHelper.readableDatabase,
- false,
+ true,
)
} else {
GridSizeMigrationDBController.migrateGridIfNeeded(
@@ -110,7 +110,7 @@
dst.gridState,
dst.dbHelper,
src.dbHelper.readableDatabase,
- false,
+ true,
)
}
}
@@ -131,12 +131,18 @@
}
}
- private fun compare(dst: GridMigrationData, target: GridMigrationData) {
- val sort = compareBy<DbEntry>({ it.cellX }, { it.cellY })
- val mapF = { it: DbEntry -> EntryData(it.cellX, it.cellY, it.spanX, it.spanY, it.rank) }
+ private fun compare(dst: GridMigrationData, target: GridMigrationData, src: GridMigrationData) {
+ val sort = compareBy<DbEntry>({ it.screenId }, { it.cellX }, { it.cellY })
+ val mapF = { it: DbEntry ->
+ EntryData(it.cellX, it.cellY, it.screenId, it.spanX, it.spanY, it.rank)
+ }
val entriesDst = dst.readEntries().sortedWith(sort).map(mapF)
val entriesTarget = target.readEntries().sortedWith(sort).map(mapF)
-
+ val entriesSrc = src.readEntries().sortedWith(sort).map(mapF)
+ Log.i(
+ TAG,
+ "entriesSrc: $entriesSrc\n entriesDst: $entriesDst\n entriesTarget: $entriesTarget",
+ )
assert(entriesDst == entriesTarget) {
"The elements on the dst database is not the same as in the target"
}
@@ -155,9 +161,19 @@
"Source db and destination db do not contain the same number of elements"
}
validateDb(dst)
- compare(dst, target)
+ compare(dst, target, src)
}
+ // Copying the src db for all tests.
+ @JvmField
+ @Rule
+ val fileCopier =
+ TestToPhoneFileCopier(
+ src = "databases/GridMigrationTest/$DB_FILE",
+ dest = "databases/$DB_FILE",
+ removeOnFinish = true,
+ )
+
@JvmField
@Rule
val result5x5to3x3 =
@@ -173,8 +189,8 @@
src = GridMigrationData(DB_FILE, DeviceGridState(5, 5, 5, TYPE_PHONE, DB_FILE)),
dst =
GridMigrationData(
- null, // in memory db, to download a new db change null for the filename of the
- // db name to store it. Do not use existing names.
+ null, // in memory db, to download a new db change null for
+ // the filename of the db name to store it. Do not use existing names.
DeviceGridState(3, 3, 3, TYPE_PHONE, ""),
),
target =
@@ -196,8 +212,8 @@
src = GridMigrationData(DB_FILE, DeviceGridState(5, 5, 5, TYPE_PHONE, DB_FILE)),
dst =
GridMigrationData(
- null, // in memory db, to download a new db change null for the filename of the
- // db name to store it. Do not use existing names.
+ null, // in memory db, to download a new db change null for
+ // the filename of the db name to store it. Do not use existing names.
DeviceGridState(4, 7, 4, TYPE_PHONE, ""),
),
target =
@@ -206,6 +222,42 @@
@JvmField
@Rule
+ val result5x5to5x8WithShift =
+ TestToPhoneFileCopier(
+ src = "databases/GridMigrationTest/result5x5to5x8WithShift.db",
+ dest = "databases/result5x5to5x8WithShift.db",
+ removeOnFinish = true,
+ )
+
+ @Test
+ fun `5x5 to 5x8 with cells shifting down`() =
+ runTest(
+ src = GridMigrationData(DB_FILE, DeviceGridState(5, 5, 5, TYPE_PHONE, DB_FILE)),
+ dst =
+ GridMigrationData(
+ null, // in memory db, to download a new db change null
+ // for
+ // the filename of the db name to store it. Do not use existing names.
+ DeviceGridState(5, 8, 5, TYPE_PHONE, ""),
+ ),
+ target =
+ GridMigrationData(
+ "result5x5to5x8WithShift.db",
+ DeviceGridState(5, 8, 5, TYPE_PHONE, ""),
+ ),
+ )
+
+ @JvmField
+ @Rule
+ val fileCopierNoShift =
+ TestToPhoneFileCopier(
+ src = "databases/GridMigrationTest/$DB_FILE_NO_SHIFT",
+ dest = "databases/$DB_FILE_NO_SHIFT",
+ removeOnFinish = true,
+ )
+
+ @JvmField
+ @Rule
val result5x5to5x8 =
TestToPhoneFileCopier(
src = "databases/GridMigrationTest/result5x5to5x8.db",
@@ -214,44 +266,24 @@
)
@Test
- fun `5x5 to 5x8`() =
+ fun `5x5 to 5x8 without cell shift`() =
runTest(
- src = GridMigrationData(DB_FILE, DeviceGridState(5, 5, 5, TYPE_PHONE, DB_FILE)),
+ src =
+ GridMigrationData(
+ DB_FILE_NO_SHIFT,
+ DeviceGridState(5, 5, 5, TYPE_PHONE, DB_FILE_NO_SHIFT),
+ ),
dst =
GridMigrationData(
- null, // in memory db, to download a new db change null for the filename of the
- // db name to store it. Do not use existing names.
+ null, // in memory db, to download a new db change null for
+ // the filename of the db name to store it. Do not use existing names.
DeviceGridState(5, 8, 5, TYPE_PHONE, ""),
),
target =
GridMigrationData("result5x5to5x8.db", DeviceGridState(5, 8, 5, TYPE_PHONE, "")),
)
- @JvmField
- @Rule
- val flaggedResult5x5to5x8 =
- TestToPhoneFileCopier(
- src = "databases/GridMigrationTest/flagged_result5x5to5x8.db",
- dest = "databases/flagged_result5x5to5x8.db",
- removeOnFinish = true,
- )
-
- @Test
- fun `flagged 5x5 to 5x8`() {
- setFlagsRule.setFlags(true, Flags.FLAG_ENABLE_GRID_MIGRATION_FIX)
- runTest(
- src = GridMigrationData(DB_FILE, DeviceGridState(5, 5, 5, TYPE_PHONE, DB_FILE)),
- dst =
- GridMigrationData(
- null, // in memory db, to download a new db change null for the filename of the
- // db name to store it. Do not use existing names.
- DeviceGridState(5, 8, 5, TYPE_PHONE, ""),
- ),
- target =
- GridMigrationData(
- "flagged_result5x5to5x8.db",
- DeviceGridState(5, 8, 5, TYPE_PHONE, ""),
- ),
- )
+ companion object {
+ private const val TAG = "GridMigrationTest"
}
}