Merge "Pin desktop tile to the right in overview" into tm-qpr-dev

This commit is contained in:
Ats Jenk 2023-02-06 20:01:24 +00:00 committed by Android (Google) Code Review
commit b759d55a50
4 changed files with 74 additions and 19 deletions

View File

@ -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"

View File

@ -77,7 +77,8 @@ public class DesktopTaskView extends TaskView {
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 @@ public class DesktopTaskView extends TaskView {
getContext().getTheme()));
// TODO(b/244348395): this should be wallpaper
setBackground(mBackground);
mSnapshotViews.add(mSnapshotView);
}
@Override
@ -132,12 +131,9 @@ public class DesktopTaskView extends TaskView {
}
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 @@ public class DesktopTaskView extends TaskView {
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
@ -316,6 +313,11 @@ public class DesktopTaskView extends TaskView {
callback.accept(true);
}
@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.

View File

@ -1550,8 +1550,14 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
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 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
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 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
// 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 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
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 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
((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 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
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 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
// 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 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
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 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
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 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
TaskView homeTaskView = getHomeTaskView();
TaskView nextFocusedTaskView = null;
int desktopTaskIndex = Integer.MAX_VALUE;
if (!isTaskDismissal) {
mTopRowIdSet.clear();
}
@ -2741,6 +2776,14 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
// 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 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
// 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 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
// 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 @@ public abstract class RecentsView<ACTIVITY_TYPE extends StatefulActivity<STATE_T
}
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;
}

View File

@ -1033,6 +1033,11 @@ public class TaskView extends FrameLayout implements Reusable {
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 @@ public class TaskView extends FrameLayout implements Reusable {
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;