Merge "2D Recents: Always use grid layout even in split view" into nyc-mr2-dev

This commit is contained in:
Manu Cornet
2017-01-17 21:58:05 +00:00
committed by Android (Google) Code Review
4 changed files with 37 additions and 66 deletions

View File

@@ -201,8 +201,6 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener
Resources res = mContext.getResources(); Resources res = mContext.getResources();
reloadResources(); reloadResources();
mDummyStackView.reloadOnConfigurationChange(); mDummyStackView.reloadOnConfigurationChange();
mDummyStackView.getStackAlgorithm().getGridState().setHasDockedTasks(
Recents.getSystemServices().hasDockedTask());
} }
/** /**

View File

@@ -214,38 +214,10 @@ public class TaskStackLayoutAlgorithm {
} }
/** /**
* The state telling the algorithm whether to use grid layout or not.
*/
public static class GridState {
private boolean mDraggingOverDockedState;
private boolean mHasDockedTask;
private GridState() {
mDraggingOverDockedState = false;
mHasDockedTask = false;
}
/**
* Check whether we should use the grid layout.
* We use the grid layout for Recents iff all the following is true:
* 1. Grid-mode is enabled.
* 2. The activity is not in split screen mode (there's no docked task).
* 3. The user is not dragging a task view over the dock state.
* @return True if we should use the grid layout. * @return True if we should use the grid layout.
*/ */
boolean useGridLayout() { boolean useGridLayout() {
return Recents.getConfiguration().isGridEnabled && return Recents.getConfiguration().isGridEnabled;
!mDraggingOverDockedState &&
!mHasDockedTask;
}
public void setDragging(boolean draggingOverDockedState) {
mDraggingOverDockedState = draggingOverDockedState;
}
public void setHasDockedTasks(boolean hasDockedTask) {
mHasDockedTask = hasDockedTask;
}
} }
// A report of the visibility state of the stack // A report of the visibility state of the stack
@@ -262,7 +234,6 @@ public class TaskStackLayoutAlgorithm {
Context mContext; Context mContext;
private StackState mState = StackState.SPLIT; private StackState mState = StackState.SPLIT;
private GridState mGridState = new GridState();
private TaskStackLayoutAlgorithmCallbacks mCb; private TaskStackLayoutAlgorithmCallbacks mCb;
// The task bounds (untransformed) for layout. This rect is anchored at mTaskRoot. // The task bounds (untransformed) for layout. This rect is anchored at mTaskRoot.
@@ -517,7 +488,7 @@ public class TaskStackLayoutAlgorithm {
} }
// Initialize the grid layout // Initialize the grid layout
mTaskGridLayoutAlgorithm.initialize(displayRect, windowRect); mTaskGridLayoutAlgorithm.initialize(windowRect);
} }
/** /**
@@ -770,7 +741,7 @@ public class TaskStackLayoutAlgorithm {
} }
public Rect getStackActionButtonRect() { public Rect getStackActionButtonRect() {
return mGridState.useGridLayout() return useGridLayout()
? mTaskGridLayoutAlgorithm.getStackActionButtonRect() : mStackActionButtonRect; ? mTaskGridLayoutAlgorithm.getStackActionButtonRect() : mStackActionButtonRect;
} }
@@ -795,13 +766,6 @@ public class TaskStackLayoutAlgorithm {
return mState; return mState;
} }
/**
* Returns the current grid layout state.
*/
public GridState getGridState() {
return mGridState;
}
/** /**
* Returns whether this stack layout has been initialized. * Returns whether this stack layout has been initialized.
*/ */
@@ -903,7 +867,7 @@ public class TaskStackLayoutAlgorithm {
if (mFreeformLayoutAlgorithm.isTransformAvailable(task, this)) { if (mFreeformLayoutAlgorithm.isTransformAvailable(task, this)) {
mFreeformLayoutAlgorithm.getTransform(task, transformOut, this); mFreeformLayoutAlgorithm.getTransform(task, transformOut, this);
return transformOut; return transformOut;
} else if (mGridState.useGridLayout()) { } else if (useGridLayout()) {
int taskIndex = mTaskIndexMap.get(task.key.id); int taskIndex = mTaskIndexMap.get(task.key.id);
int taskCount = mTaskIndexMap.size(); int taskCount = mTaskIndexMap.size();
mTaskGridLayoutAlgorithm.getTransform(taskIndex, taskCount, transformOut, this); mTaskGridLayoutAlgorithm.getTransform(taskIndex, taskCount, transformOut, this);
@@ -1324,7 +1288,7 @@ public class TaskStackLayoutAlgorithm {
* Returns the proper task rectangle according to the current grid state. * Returns the proper task rectangle according to the current grid state.
*/ */
public Rect getTaskRect() { public Rect getTaskRect() {
return mGridState.useGridLayout() ? mTaskGridLayoutAlgorithm.getTaskGridRect() : mTaskRect; return useGridLayout() ? mTaskGridLayoutAlgorithm.getTaskGridRect() : mTaskRect;
} }
public void dump(String prefix, PrintWriter writer) { public void dump(String prefix, PrintWriter writer) {

View File

@@ -1858,7 +1858,6 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
Interpolators.FAST_OUT_SLOW_IN); Interpolators.FAST_OUT_SLOW_IN);
boolean ignoreTaskOverrides = false; boolean ignoreTaskOverrides = false;
if (event.dropTarget instanceof TaskStack.DockState) { if (event.dropTarget instanceof TaskStack.DockState) {
mLayoutAlgorithm.getGridState().setDragging(true);
// Calculate the new task stack bounds that matches the window size that Recents will // Calculate the new task stack bounds that matches the window size that Recents will
// have after the drop // have after the drop
final TaskStack.DockState dockState = (TaskStack.DockState) event.dropTarget; final TaskStack.DockState dockState = (TaskStack.DockState) event.dropTarget;
@@ -1878,7 +1877,6 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
updateLayoutAlgorithm(true /* boundScroll */); updateLayoutAlgorithm(true /* boundScroll */);
ignoreTaskOverrides = true; ignoreTaskOverrides = true;
} else { } else {
mLayoutAlgorithm.getGridState().setDragging(false);
// Restore the pre-drag task stack bounds, but ensure that we don't layout the dragging // Restore the pre-drag task stack bounds, but ensure that we don't layout the dragging
// task view, so add it back to the ignore set after updating the layout // task view, so add it back to the ignore set after updating the layout
removeIgnoreTask(event.task); removeIgnoreTask(event.task);
@@ -1889,7 +1887,6 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
} }
public final void onBusEvent(final DragEndEvent event) { public final void onBusEvent(final DragEndEvent event) {
mLayoutAlgorithm.getGridState().setDragging(false);
// We don't handle drops on the dock regions // We don't handle drops on the dock regions
if (event.dropTarget instanceof TaskStack.DockState) { if (event.dropTarget instanceof TaskStack.DockState) {
// However, we do need to reset the overrides, since the last state of this task stack // However, we do need to reset the overrides, since the last state of this task stack
@@ -2081,8 +2078,6 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
mLayoutAlgorithm.reloadOnConfigurationChange(getContext()); mLayoutAlgorithm.reloadOnConfigurationChange(getContext());
boolean hasDockedTask = Recents.getSystemServices().hasDockedTask(); boolean hasDockedTask = Recents.getSystemServices().hasDockedTask();
mStableLayoutAlgorithm.getGridState().setHasDockedTasks(hasDockedTask);
mLayoutAlgorithm.getGridState().setHasDockedTasks(hasDockedTask);
} }
/** /**
@@ -2139,7 +2134,7 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
* Check whether we should use the grid layout. * Check whether we should use the grid layout.
*/ */
public boolean useGridLayout() { public boolean useGridLayout() {
return mLayoutAlgorithm.getGridState().useGridLayout(); return mLayoutAlgorithm.useGridLayout();
} }
/** /**

View File

@@ -39,7 +39,6 @@ public class TaskGridLayoutAlgorithm {
/** The padding between task views. */ /** The padding between task views. */
private int mPaddingTaskView; private int mPaddingTaskView;
private Rect mDisplayRect;
private Rect mWindowRect; private Rect mWindowRect;
private Point mScreenSize = new Point(); private Point mScreenSize = new Point();
@@ -62,7 +61,7 @@ public class TaskGridLayoutAlgorithm {
int[] xOffsets; int[] xOffsets;
int[] yOffsets; int[] yOffsets;
public TaskGridRectInfo(int taskCount) { TaskGridRectInfo(int taskCount) {
size = new Rect(); size = new Rect();
xOffsets = new int[taskCount]; xOffsets = new int[taskCount];
yOffsets = new int[taskCount]; yOffsets = new int[taskCount];
@@ -74,10 +73,26 @@ public class TaskGridLayoutAlgorithm {
layoutTaskCount < 7 ? 3 : 4)); layoutTaskCount < 7 ? 3 : 4));
int lines = layoutTaskCount < 3 ? 1 : 2; int lines = layoutTaskCount < 3 ? 1 : 2;
// A couple of special cases.
boolean landscapeWindow = mWindowRect.width() > mWindowRect.height();
boolean landscapeTaskView = mAppAspectRatio > 1;
// If we're in portrait but task views are landscape, show more lines of fewer tasks.
if (!landscapeWindow && landscapeTaskView) {
tasksPerLine = layoutTaskCount < 2 ? 1 : 2;
lines = layoutTaskCount < 3 ? 1 : (
layoutTaskCount < 5 ? 2 : (
layoutTaskCount < 7 ? 3 : 4));
}
// If we're in landscape but task views are portrait, show fewer lines of more tasks.
if (landscapeWindow && !landscapeTaskView) {
tasksPerLine = layoutTaskCount < 7 ? layoutTaskCount : 6;
lines = layoutTaskCount < 7 ? 1 : 2;
}
int taskWidth, taskHeight; int taskWidth, taskHeight;
int maxTaskWidth = (mDisplayRect.width() - 2 * mPaddingLeftRight int maxTaskWidth = (mWindowRect.width() - 2 * mPaddingLeftRight
- (tasksPerLine - 1) * mPaddingTaskView) / tasksPerLine; - (tasksPerLine - 1) * mPaddingTaskView) / tasksPerLine;
int maxTaskHeight = (mDisplayRect.height() - 2 * mPaddingTopBottom int maxTaskHeight = (mWindowRect.height() - 2 * mPaddingTopBottom
- (lines - 1) * mPaddingTaskView) / lines; - (lines - 1) * mPaddingTaskView) / lines;
if (maxTaskHeight >= maxTaskWidth / mAppAspectRatio + mTitleBarHeight) { if (maxTaskHeight >= maxTaskWidth / mAppAspectRatio + mTitleBarHeight) {
@@ -91,9 +106,9 @@ public class TaskGridLayoutAlgorithm {
} }
size.set(0, 0, taskWidth, taskHeight); size.set(0, 0, taskWidth, taskHeight);
int emptySpaceX = mDisplayRect.width() - 2 * mPaddingLeftRight int emptySpaceX = mWindowRect.width() - 2 * mPaddingLeftRight
- (tasksPerLine * taskWidth) - (tasksPerLine - 1) * mPaddingTaskView; - (tasksPerLine * taskWidth) - (tasksPerLine - 1) * mPaddingTaskView;
int emptySpaceY = mDisplayRect.height() - 2 * mPaddingTopBottom int emptySpaceY = mWindowRect.height() - 2 * mPaddingTopBottom
- (lines * taskHeight) - (lines - 1) * mPaddingTaskView; - (lines * taskHeight) - (lines - 1) * mPaddingTaskView;
for (int taskIndex = 0; taskIndex < taskCount; taskIndex++) { for (int taskIndex = 0; taskIndex < taskCount; taskIndex++) {
// We also need to invert the index in order to display the most recent tasks first. // We also need to invert the index in order to display the most recent tasks first.
@@ -101,9 +116,9 @@ public class TaskGridLayoutAlgorithm {
int xIndex = taskLayoutIndex % tasksPerLine; int xIndex = taskLayoutIndex % tasksPerLine;
int yIndex = taskLayoutIndex / tasksPerLine; int yIndex = taskLayoutIndex / tasksPerLine;
xOffsets[taskIndex] = xOffsets[taskIndex] = mWindowRect.left +
emptySpaceX / 2 + mPaddingLeftRight + (taskWidth + mPaddingTaskView) * xIndex; emptySpaceX / 2 + mPaddingLeftRight + (taskWidth + mPaddingTaskView) * xIndex;
yOffsets[taskIndex] = yOffsets[taskIndex] = mWindowRect.top +
emptySpaceY / 2 + mPaddingTopBottom + (taskHeight + mPaddingTaskView) * yIndex; emptySpaceY / 2 + mPaddingTopBottom + (taskHeight + mPaddingTaskView) * yIndex;
} }
} }
@@ -113,7 +128,7 @@ public class TaskGridLayoutAlgorithm {
* We can find task view sizes and positions from mTaskGridRectInfoList[k - 1] when there * We can find task view sizes and positions from mTaskGridRectInfoList[k - 1] when there
* are k tasks. * are k tasks.
*/ */
TaskGridRectInfo[] mTaskGridRectInfoList; private TaskGridRectInfo[] mTaskGridRectInfoList;
public TaskGridLayoutAlgorithm(Context context) { public TaskGridLayoutAlgorithm(Context context) {
reloadOnConfigurationChange(context); reloadOnConfigurationChange(context);
@@ -121,10 +136,7 @@ public class TaskGridLayoutAlgorithm {
public void reloadOnConfigurationChange(Context context) { public void reloadOnConfigurationChange(Context context) {
Resources res = context.getResources(); Resources res = context.getResources();
mPaddingLeftRight = res.getDimensionPixelSize(R.dimen.recents_grid_padding_left_right);
mPaddingTopBottom = res.getDimensionPixelSize(R.dimen.recents_grid_padding_top_bottom);
mPaddingTaskView = res.getDimensionPixelSize(R.dimen.recents_grid_padding_task_view); mPaddingTaskView = res.getDimensionPixelSize(R.dimen.recents_grid_padding_task_view);
mTaskGridRect = new Rect(); mTaskGridRect = new Rect();
mTitleBarHeight = res.getDimensionPixelSize(R.dimen.recents_grid_task_view_header_height); mTitleBarHeight = res.getDimensionPixelSize(R.dimen.recents_grid_task_view_header_height);
@@ -178,9 +190,11 @@ public class TaskGridLayoutAlgorithm {
return transformOut; return transformOut;
} }
public void initialize(Rect displayRect, Rect windowRect) { public void initialize(Rect windowRect) {
mDisplayRect = displayRect;
mWindowRect = windowRect; mWindowRect = windowRect;
// Define paddings in terms of percentage of the total area.
mPaddingLeftRight = (int) (0.025f * Math.min(mWindowRect.width(), mWindowRect.height()));
mPaddingTopBottom = (int) (0.1 * mWindowRect.height());
// Pre-calculate the positions and offsets of task views so that we can reuse them directly // Pre-calculate the positions and offsets of task views so that we can reuse them directly
// in the future. // in the future.
@@ -202,7 +216,7 @@ public class TaskGridLayoutAlgorithm {
} }
public Rect getStackActionButtonRect() { public Rect getStackActionButtonRect() {
Rect buttonRect = new Rect(mDisplayRect); Rect buttonRect = new Rect(mWindowRect);
buttonRect.right -= mPaddingLeftRight; buttonRect.right -= mPaddingLeftRight;
buttonRect.left += mPaddingLeftRight; buttonRect.left += mPaddingLeftRight;
buttonRect.bottom = buttonRect.top + mPaddingTopBottom; buttonRect.bottom = buttonRect.top + mPaddingTopBottom;