From 0a5e2d6b93af0638f9dccb3bad43266b8fc261ad Mon Sep 17 00:00:00 2001 From: Jiaquan He Date: Tue, 27 Dec 2016 11:05:44 -0800 Subject: [PATCH] Resue TaskView information. In this commit we calculate all the TaskView information we need during initialization, so that we don't need to calculate again unless any configuration is changed. Bug: 32101881 Change-Id: I433688d0a05c69064d0da5268b61340cecdbfe74 --- .../views/grid/TaskGridLayoutAlgorithm.java | 111 ++++++++++++++------- 1 file changed, 76 insertions(+), 35 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/grid/TaskGridLayoutAlgorithm.java b/packages/SystemUI/src/com/android/systemui/recents/views/grid/TaskGridLayoutAlgorithm.java index 65a8ee27c7a1..714b6fb0c859 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/grid/TaskGridLayoutAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/grid/TaskGridLayoutAlgorithm.java @@ -52,6 +52,69 @@ public class TaskGridLayoutAlgorithm { private float mAppAspectRatio; private Rect mSystemInsets = new Rect(); + /** + * When the amount of tasks is determined, the size and position of every task view can be + * decided. Each instance of TaskGridRectInfo store the task view information for a certain + * amount of tasks. + */ + class TaskGridRectInfo { + Rect size; + int[] xOffsets; + int[] yOffsets; + + public TaskGridRectInfo(int taskCount) { + size = new Rect(); + xOffsets = new int[taskCount]; + yOffsets = new int[taskCount]; + + int layoutTaskCount = Math.min(MAX_LAYOUT_TASK_COUNT, taskCount); + + int tasksPerLine = layoutTaskCount < 2 ? 1 : ( + layoutTaskCount < 5 ? 2 : ( + layoutTaskCount < 7 ? 3 : 4)); + int lines = layoutTaskCount < 3 ? 1 : 2; + + int taskWidth, taskHeight; + int maxTaskWidth = (mDisplayRect.width() - 2 * mPaddingLeftRight + - (tasksPerLine - 1) * mPaddingTaskView) / tasksPerLine; + int maxTaskHeight = (mDisplayRect.height() - 2 * mPaddingTopBottom + - (lines - 1) * mPaddingTaskView) / lines; + + if (maxTaskHeight >= maxTaskWidth / mAppAspectRatio + mTitleBarHeight) { + // Width bound. + taskWidth = maxTaskWidth; + taskHeight = (int) (maxTaskWidth / mAppAspectRatio + mTitleBarHeight); + } else { + // Height bound. + taskHeight = maxTaskHeight; + taskWidth = (int) ((taskHeight - mTitleBarHeight) * mAppAspectRatio); + } + size.set(0, 0, taskWidth, taskHeight); + + int emptySpaceX = mDisplayRect.width() - 2 * mPaddingLeftRight + - (tasksPerLine * taskWidth) - (tasksPerLine - 1) * mPaddingTaskView; + int emptySpaceY = mDisplayRect.height() - 2 * mPaddingTopBottom + - (lines * taskHeight) - (lines - 1) * mPaddingTaskView; + for (int taskIndex = 0; taskIndex < taskCount; taskIndex++) { + // We also need to invert the index in order to display the most recent tasks first. + int taskLayoutIndex = taskCount - taskIndex - 1; + + int xIndex = taskLayoutIndex % tasksPerLine; + int yIndex = taskLayoutIndex / tasksPerLine; + xOffsets[taskIndex] = + emptySpaceX / 2 + mPaddingLeftRight + (taskWidth + mPaddingTaskView) * xIndex; + yOffsets[taskIndex] = + emptySpaceY / 2 + mPaddingTopBottom + (taskHeight + mPaddingTaskView) * yIndex; + } + } + } + + /** + * We can find task view sizes and positions from mTaskGridRectInfoList[k - 1] when there + * are k tasks. + */ + TaskGridRectInfo[] mTaskGridRectInfoList; + public TaskGridLayoutAlgorithm(Context context) { reloadOnConfigurationChange(context); } @@ -75,46 +138,17 @@ public class TaskGridLayoutAlgorithm { public TaskViewTransform getTransform(int taskIndex, int taskCount, TaskViewTransform transformOut, TaskStackLayoutAlgorithm stackLayout) { - int layoutTaskCount = Math.min(MAX_LAYOUT_TASK_COUNT, taskCount); - - // We also need to invert the index in order to display the most recent tasks first. - int taskLayoutIndex = taskCount - taskIndex - 1; - - int tasksPerLine = layoutTaskCount < 2 ? 1 : ( - layoutTaskCount < 5 ? 2 : ( - layoutTaskCount < 7 ? 3 : 4)); - int lines = layoutTaskCount < 3 ? 1 : 2; - - int taskWidth, taskHeight; - int maxTaskWidth = (mDisplayRect.width() - 2 * mPaddingLeftRight - - (tasksPerLine - 1) * mPaddingTaskView) / tasksPerLine; - int maxTaskHeight = (mDisplayRect.height() - 2 * mPaddingTopBottom - - (lines - 1) * mPaddingTaskView) / lines; - - if (maxTaskHeight >= maxTaskWidth / mAppAspectRatio + mTitleBarHeight) { - // Width bound. - taskWidth = maxTaskWidth; - taskHeight = (int) (maxTaskWidth / mAppAspectRatio + mTitleBarHeight); - } else { - // Height bound. - taskHeight = maxTaskHeight; - taskWidth = (int) ((taskHeight - mTitleBarHeight) * mAppAspectRatio); - } - int emptySpaceX = mDisplayRect.width() - 2 * mPaddingLeftRight - - (tasksPerLine * taskWidth) - (tasksPerLine - 1) * mPaddingTaskView; - int emptySpaceY = mDisplayRect.height() - 2 * mPaddingTopBottom - - (lines * taskHeight) - (lines - 1) * mPaddingTaskView; - - mTaskGridRect.set(0, 0, taskWidth, taskHeight); + TaskGridRectInfo gridInfo = mTaskGridRectInfoList[taskCount - 1]; + mTaskGridRect.set(gridInfo.size); - int xIndex = taskLayoutIndex % tasksPerLine; - int yIndex = taskLayoutIndex / tasksPerLine; - int x = emptySpaceX / 2 + mPaddingLeftRight + (taskWidth + mPaddingTaskView) * xIndex; - int y = emptySpaceY / 2 + mPaddingTopBottom + (taskHeight + mPaddingTaskView) * yIndex; + int x = gridInfo.xOffsets[taskIndex]; + int y = gridInfo.yOffsets[taskIndex]; float z = stackLayout.mMaxTranslationZ; float dimAlpha = 0f; float viewOutlineAlpha = 0f; + // We also need to invert the index in order to display the most recent tasks first. + int taskLayoutIndex = taskCount - taskIndex - 1; boolean isTaskViewVisible = (taskLayoutIndex < MAX_LAYOUT_TASK_COUNT); // Fill out the transform @@ -134,6 +168,13 @@ public class TaskGridLayoutAlgorithm { public void initialize(Rect displayRect, Rect windowRect) { mDisplayRect = displayRect; mWindowRect = windowRect; + + // Pre-calculate the positions and offsets of task views so that we can reuse them directly + // in the future. + mTaskGridRectInfoList = new TaskGridRectInfo[MAX_LAYOUT_TASK_COUNT]; + for (int i = 0; i < MAX_LAYOUT_TASK_COUNT; i++) { + mTaskGridRectInfoList[i] = new TaskGridRectInfo(i + 1); + } } public void setSystemInsets(Rect systemInsets) { -- 2.11.0