Merge "Pin desktop tile to the right in overview" into tm-qpr-dev
diff --git a/quickstep/res/layout/task_desktop.xml b/quickstep/res/layout/task_desktop.xml
index 0c8543f..2a9674f 100644
--- a/quickstep/res/layout/task_desktop.xml
+++ b/quickstep/res/layout/task_desktop.xml
@@ -33,7 +33,8 @@
<com.android.quickstep.views.TaskThumbnailView
android:id="@+id/snapshot"
android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
+ android:layout_height="wrap_content"
+ android:visibility="gone" />
<com.android.quickstep.views.IconView
android:id="@+id/icon"
diff --git a/quickstep/src/com/android/quickstep/views/DesktopTaskView.java b/quickstep/src/com/android/quickstep/views/DesktopTaskView.java
index 13a68af..dc265e4 100644
--- a/quickstep/src/com/android/quickstep/views/DesktopTaskView.java
+++ b/quickstep/src/com/android/quickstep/views/DesktopTaskView.java
@@ -77,7 +77,8 @@
private static final boolean DEBUG = true;
- private List<Task> mTasks;
+ @NonNull
+ private List<Task> mTasks = new ArrayList<>();
private final ArrayList<TaskThumbnailView> mSnapshotViews = new ArrayList<>();
@@ -111,8 +112,6 @@
getContext().getTheme()));
// TODO(b/244348395): this should be wallpaper
setBackground(mBackground);
-
- mSnapshotViews.add(mSnapshotView);
}
@Override
@@ -132,12 +131,9 @@
}
Log.d(TAG, sb.toString());
}
- if (tasks.isEmpty()) {
- return;
- }
cancelPendingLoadTasks();
- mTasks = tasks;
+ mTasks = new ArrayList<>(tasks);
mSnapshotViewMap.clear();
// Ensure there are equal number of snapshot views and tasks.
@@ -210,7 +206,8 @@
if (task != null) {
return mSnapshotViewMap.get(task.key.id);
}
- return null;
+ // Return the place holder snapshot views. Callers expect this to be non-null
+ return mSnapshotView;
}
@Override
@@ -317,6 +314,11 @@
}
@Override
+ public boolean isDesktopTask() {
+ return true;
+ }
+
+ @Override
void refreshThumbnails(@Nullable HashMap<Integer, ThumbnailData> thumbnailDatas) {
// Sets new thumbnails based on the incoming data and refreshes the rest.
// Create a copy of the thumbnail map, so we can track thumbnails that need refreshing.
diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java
index 61d6179..2505d91 100644
--- a/quickstep/src/com/android/quickstep/views/RecentsView.java
+++ b/quickstep/src/com/android/quickstep/views/RecentsView.java
@@ -1550,8 +1550,14 @@
removeView(focusedTaskView);
mMovingTaskView = null;
focusedTaskView.resetPersistentViewTransforms();
- addView(focusedTaskView, 0);
- setCurrentPage(0);
+ int frontTaskIndex = 0;
+ if (DesktopTaskView.DESKTOP_IS_PROTO2_ENABLED && !focusedTaskView.isDesktopTask()) {
+ // If desktop mode is enabled, desktop task view is pinned at first position.
+ // Move focused task to position 1
+ frontTaskIndex = 1;
+ }
+ addView(focusedTaskView, frontTaskIndex);
+ setCurrentPage(frontTaskIndex);
updateGridProperties();
}
@@ -1588,7 +1594,7 @@
int currentTaskId = -1;
TaskView currentTaskView = getTaskViewAt(mCurrentPage);
- if (currentTaskView != null) {
+ if (currentTaskView != null && currentTaskView.getTask() != null) {
currentTaskId = currentTaskView.getTask().key.id;
}
@@ -1617,6 +1623,8 @@
// update the map of instance counts
mFilterState.updateInstanceCountMap(taskGroups);
+ DesktopTask desktopTask = null;
+
// Add views as children based on whether it's grouped or single task. Looping through
// taskGroups backwards populates the thumbnail grid from least recent to most recent.
for (int i = taskGroups.size() - 1; i >= 0; i--) {
@@ -1624,6 +1632,12 @@
boolean isRemovalNeeded = stagedTaskIdToBeRemovedFromGrid != INVALID_TASK_ID
&& groupTask.containsTask(stagedTaskIdToBeRemovedFromGrid);
+ if (groupTask instanceof DesktopTask) {
+ desktopTask = (DesktopTask) groupTask;
+ // Desktop task will be added separately in the end
+ continue;
+ }
+
TaskView taskView;
if (isRemovalNeeded && groupTask.hasMultipleTasks()) {
// If we need to remove half of a pair of tasks, force a TaskView with Type.SINGLE
@@ -1654,9 +1668,6 @@
((GroupedTaskView) taskView).bind(leftTopTask, rightBottomTask, mOrientationState,
groupTask.mSplitBounds);
- } else if (taskView instanceof DesktopTaskView) {
- ((DesktopTaskView) taskView).bind(((DesktopTask) groupTask).tasks,
- mOrientationState);
} else {
taskView.bind(groupTask.task1, mOrientationState);
}
@@ -1669,6 +1680,14 @@
if (!taskGroups.isEmpty()) {
addView(mClearAllButton);
+
+ if (DesktopTaskView.DESKTOP_IS_PROTO2_ENABLED) {
+ TaskView taskView = getTaskViewFromPool(TaskView.Type.DESKTOP);
+ // Always add a desktop task to the first position. Even if it is empty
+ addView(taskView, 0);
+ ArrayList<Task> tasks = desktopTask != null ? desktopTask.tasks : new ArrayList<>();
+ ((DesktopTaskView) taskView).bind(tasks, mOrientationState);
+ }
}
// Keep same previous focused task
@@ -1676,6 +1695,12 @@
// If the list changed, maybe the focused task doesn't exist anymore
if (newFocusedTaskView == null && getTaskViewCount() > 0) {
newFocusedTaskView = getTaskViewAt(0);
+ // Check if the first task is the desktop.
+ // If first task is desktop, try to find another task to set as the focused task
+ if (newFocusedTaskView != null && newFocusedTaskView.isDesktopTask()
+ && getTaskViewCount() > 1) {
+ newFocusedTaskView = getTaskViewAt(1);
+ }
}
mFocusedTaskViewId = newFocusedTaskView != null ?
newFocusedTaskView.getTaskViewId() : -1;
@@ -1709,7 +1734,12 @@
if (runningTaskId != -1) {
targetPage = indexOfChild(newRunningTaskView);
} else if (getTaskViewCount() > 0) {
- targetPage = indexOfChild(requireTaskViewAt(0));
+ TaskView taskView = requireTaskViewAt(0);
+ // If first task id desktop, try to find another task to set the target page
+ if (taskView.isDesktopTask() && getTaskViewCount() > 1) {
+ taskView = requireTaskViewAt(1);
+ }
+ targetPage = indexOfChild(taskView);
}
}
if (targetPage != -1 && mCurrentPage != targetPage) {
@@ -2141,6 +2171,9 @@
for (int i = 0; i < getTaskViewCount(); i++) {
TaskView taskView = requireTaskViewAt(i);
Task task = taskView.getTask();
+ if (task == null) {
+ continue;
+ }
int index = indexOfChild(taskView);
boolean visible;
if (showAsGrid()) {
@@ -2715,6 +2748,8 @@
TaskView homeTaskView = getHomeTaskView();
TaskView nextFocusedTaskView = null;
+ int desktopTaskIndex = Integer.MAX_VALUE;
+
if (!isTaskDismissal) {
mTopRowIdSet.clear();
}
@@ -2741,6 +2776,14 @@
// If focused task is snapped, the row width is just task width and spacing.
snappedTaskRowWidth = taskWidthAndSpacing;
}
+ } else if (taskView.isDesktopTask()) {
+ // Desktop task was not focused. Pin it to the right of focused
+ desktopTaskIndex = i;
+ gridTranslations[i] += mIsRtl ? taskWidthAndSpacing : -taskWidthAndSpacing;
+
+ // Center view vertically in case it's from different orientation.
+ taskView.setGridTranslationY((mLastComputedTaskSize.height() + taskTopMargin
+ - taskView.getLayoutParams().height) / 2f);
} else {
if (i > focusedTaskIndex) {
// For tasks after the focused task, shift by focused task's width and spacing.
@@ -2781,7 +2824,7 @@
// Move horizontally into empty space.
float widthOffset = 0;
for (int j = i - 1; !topSet.contains(j) && j >= 0; j--) {
- if (j == focusedTaskIndex) {
+ if (j == focusedTaskIndex || j == desktopTaskIndex) {
continue;
}
widthOffset += requireTaskViewAt(j).getLayoutParams().width + mPageSpacing;
@@ -2800,7 +2843,7 @@
// Move horizontally into empty space.
float widthOffset = 0;
for (int j = i - 1; !bottomSet.contains(j) && j >= 0; j--) {
- if (j == focusedTaskIndex) {
+ if (j == focusedTaskIndex || j == desktopTaskIndex) {
continue;
}
widthOffset += requireTaskViewAt(j).getLayoutParams().width + mPageSpacing;
@@ -5101,6 +5144,10 @@
}
private int getFirstViewIndex() {
+ if (DesktopTaskView.DESKTOP_IS_PROTO2_ENABLED) {
+ // Desktop task is at position 0, that is the first view
+ return 0;
+ }
TaskView focusedTaskView = mShowAsGridLastOnLayout ? getFocusedTaskView() : null;
return focusedTaskView != null ? indexOfChild(focusedTaskView) : 0;
}
diff --git a/quickstep/src/com/android/quickstep/views/TaskView.java b/quickstep/src/com/android/quickstep/views/TaskView.java
index e8c2050..19ffa27 100644
--- a/quickstep/src/com/android/quickstep/views/TaskView.java
+++ b/quickstep/src/com/android/quickstep/views/TaskView.java
@@ -1033,6 +1033,11 @@
return deviceProfile.isTablet && !isFocusedTask();
}
+ /** Whether this task view represents the desktop */
+ public boolean isDesktopTask() {
+ return false;
+ }
+
/**
* Called to animate a smooth transition when going directly from an app into Overview (and
* vice versa). Icons fade in, and DWB banners slide in with a "shift up" animation.
@@ -1543,7 +1548,7 @@
int boxWidth;
int boxHeight;
boolean isFocusedTask = isFocusedTask();
- if (isFocusedTask) {
+ if (isFocusedTask || isDesktopTask()) {
// Task will be focused and should use focused task size. Use focusTaskRatio
// that is associated with the original orientation of the focused task.
boxWidth = taskWidth;