Loading quickstep/res/layout/task_desktop.xml +2 −1 Original line number Diff line number Diff line Loading @@ -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" Loading quickstep/src/com/android/quickstep/views/DesktopTaskView.java +10 −8 Original line number Diff line number Diff line Loading @@ -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<>(); Loading Loading @@ -111,8 +112,6 @@ public class DesktopTaskView extends TaskView { getContext().getTheme())); // TODO(b/244348395): this should be wallpaper setBackground(mBackground); mSnapshotViews.add(mSnapshotView); } @Override Loading @@ -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. Loading Loading @@ -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 Loading Loading @@ -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. Loading quickstep/src/com/android/quickstep/views/RecentsView.java +56 −9 Original line number Diff line number Diff line Loading @@ -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(); } Loading Loading @@ -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; } Loading Loading @@ -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--) { Loading @@ -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 Loading Loading @@ -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); } Loading @@ -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 Loading @@ -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; Loading Loading @@ -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) { Loading Loading @@ -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()) { Loading Loading @@ -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(); } Loading @@ -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. Loading Loading @@ -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; Loading @@ -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; Loading Loading @@ -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; } Loading quickstep/src/com/android/quickstep/views/TaskView.java +6 −1 Original line number Diff line number Diff line Loading @@ -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. Loading Loading @@ -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; Loading Loading
quickstep/res/layout/task_desktop.xml +2 −1 Original line number Diff line number Diff line Loading @@ -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" Loading
quickstep/src/com/android/quickstep/views/DesktopTaskView.java +10 −8 Original line number Diff line number Diff line Loading @@ -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<>(); Loading Loading @@ -111,8 +112,6 @@ public class DesktopTaskView extends TaskView { getContext().getTheme())); // TODO(b/244348395): this should be wallpaper setBackground(mBackground); mSnapshotViews.add(mSnapshotView); } @Override Loading @@ -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. Loading Loading @@ -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 Loading Loading @@ -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. Loading
quickstep/src/com/android/quickstep/views/RecentsView.java +56 −9 Original line number Diff line number Diff line Loading @@ -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(); } Loading Loading @@ -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; } Loading Loading @@ -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--) { Loading @@ -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 Loading Loading @@ -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); } Loading @@ -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 Loading @@ -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; Loading Loading @@ -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) { Loading Loading @@ -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()) { Loading Loading @@ -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(); } Loading @@ -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. Loading Loading @@ -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; Loading @@ -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; Loading Loading @@ -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; } Loading
quickstep/src/com/android/quickstep/views/TaskView.java +6 −1 Original line number Diff line number Diff line Loading @@ -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. Loading Loading @@ -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; Loading