Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a4b7d794 authored by Manu Cornet's avatar Manu Cornet Committed by Android (Google) Code Review
Browse files

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

parents ebf7abb1 c0432c63
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -201,8 +201,6 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener
        Resources res = mContext.getResources();
        reloadResources();
        mDummyStackView.reloadOnConfigurationChange();
        mDummyStackView.getStackAlgorithm().getGridState().setHasDockedTasks(
            Recents.getSystemServices().hasDockedTask());
    }

    /**
+7 −43
Original line number Diff line number Diff line
@@ -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.
     */
    boolean useGridLayout() {
            return Recents.getConfiguration().isGridEnabled &&
                !mDraggingOverDockedState &&
                !mHasDockedTask;
        }

        public void setDragging(boolean draggingOverDockedState) {
            mDraggingOverDockedState = draggingOverDockedState;
        }

        public void setHasDockedTasks(boolean hasDockedTask) {
            mHasDockedTask = hasDockedTask;
        }
        return Recents.getConfiguration().isGridEnabled;
    }

    // A report of the visibility state of the stack
@@ -262,7 +234,6 @@ public class TaskStackLayoutAlgorithm {

    Context mContext;
    private StackState mState = StackState.SPLIT;
    private GridState mGridState = new GridState();
    private TaskStackLayoutAlgorithmCallbacks mCb;

    // The task bounds (untransformed) for layout.  This rect is anchored at mTaskRoot.
@@ -517,7 +488,7 @@ public class TaskStackLayoutAlgorithm {
        }

        // Initialize the grid layout
        mTaskGridLayoutAlgorithm.initialize(displayRect, windowRect);
        mTaskGridLayoutAlgorithm.initialize(windowRect);
    }

    /**
@@ -770,7 +741,7 @@ public class TaskStackLayoutAlgorithm {
    }

    public Rect getStackActionButtonRect() {
        return mGridState.useGridLayout()
        return useGridLayout()
                ? mTaskGridLayoutAlgorithm.getStackActionButtonRect() : mStackActionButtonRect;
    }

@@ -795,13 +766,6 @@ public class TaskStackLayoutAlgorithm {
        return mState;
    }

    /**
     * Returns the current grid layout state.
     */
    public GridState getGridState() {
        return mGridState;
    }

    /**
     * Returns whether this stack layout has been initialized.
     */
@@ -903,7 +867,7 @@ public class TaskStackLayoutAlgorithm {
        if (mFreeformLayoutAlgorithm.isTransformAvailable(task, this)) {
            mFreeformLayoutAlgorithm.getTransform(task, transformOut, this);
            return transformOut;
        } else if (mGridState.useGridLayout()) {
        } else if (useGridLayout()) {
            int taskIndex = mTaskIndexMap.get(task.key.id);
            int taskCount = mTaskIndexMap.size();
            mTaskGridLayoutAlgorithm.getTransform(taskIndex, taskCount, transformOut, this);
@@ -1324,7 +1288,7 @@ public class TaskStackLayoutAlgorithm {
     * Returns the proper task rectangle according to the current grid state.
     */
    public Rect getTaskRect() {
        return mGridState.useGridLayout() ? mTaskGridLayoutAlgorithm.getTaskGridRect() : mTaskRect;
        return useGridLayout() ? mTaskGridLayoutAlgorithm.getTaskGridRect() : mTaskRect;
    }

    public void dump(String prefix, PrintWriter writer) {
+1 −6
Original line number Diff line number Diff line
@@ -1858,7 +1858,6 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
                Interpolators.FAST_OUT_SLOW_IN);
        boolean ignoreTaskOverrides = false;
        if (event.dropTarget instanceof TaskStack.DockState) {
            mLayoutAlgorithm.getGridState().setDragging(true);
            // Calculate the new task stack bounds that matches the window size that Recents will
            // have after the drop
            final TaskStack.DockState dockState = (TaskStack.DockState) event.dropTarget;
@@ -1878,7 +1877,6 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
            updateLayoutAlgorithm(true /* boundScroll */);
            ignoreTaskOverrides = true;
        } else {
            mLayoutAlgorithm.getGridState().setDragging(false);
            // 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
            removeIgnoreTask(event.task);
@@ -1889,7 +1887,6 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal
    }

    public final void onBusEvent(final DragEndEvent event) {
        mLayoutAlgorithm.getGridState().setDragging(false);
        // We don't handle drops on the dock regions
        if (event.dropTarget instanceof TaskStack.DockState) {
            // 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());

        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.
     */
    public boolean useGridLayout() {
        return mLayoutAlgorithm.getGridState().useGridLayout();
        return mLayoutAlgorithm.useGridLayout();
    }

    /**
+29 −15
Original line number Diff line number Diff line
@@ -39,7 +39,6 @@ public class TaskGridLayoutAlgorithm {
    /** The padding between task views. */
    private int mPaddingTaskView;

    private Rect mDisplayRect;
    private Rect mWindowRect;
    private Point mScreenSize = new Point();

@@ -62,7 +61,7 @@ public class TaskGridLayoutAlgorithm {
        int[] xOffsets;
        int[] yOffsets;

        public TaskGridRectInfo(int taskCount) {
        TaskGridRectInfo(int taskCount) {
            size = new Rect();
            xOffsets = new int[taskCount];
            yOffsets = new int[taskCount];
@@ -74,10 +73,26 @@ public class TaskGridLayoutAlgorithm {
                    layoutTaskCount < 7 ? 3 : 4));
            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 maxTaskWidth = (mDisplayRect.width() - 2 * mPaddingLeftRight
            int maxTaskWidth = (mWindowRect.width() - 2 * mPaddingLeftRight
                - (tasksPerLine - 1) * mPaddingTaskView) / tasksPerLine;
            int maxTaskHeight = (mDisplayRect.height() - 2 * mPaddingTopBottom
            int maxTaskHeight = (mWindowRect.height() - 2 * mPaddingTopBottom
                - (lines - 1) * mPaddingTaskView) / lines;

            if (maxTaskHeight >= maxTaskWidth / mAppAspectRatio + mTitleBarHeight) {
@@ -91,9 +106,9 @@ public class TaskGridLayoutAlgorithm {
            }
            size.set(0, 0, taskWidth, taskHeight);

            int emptySpaceX = mDisplayRect.width() - 2 * mPaddingLeftRight
            int emptySpaceX = mWindowRect.width() - 2 * mPaddingLeftRight
                - (tasksPerLine * taskWidth) - (tasksPerLine - 1) * mPaddingTaskView;
            int emptySpaceY = mDisplayRect.height() - 2 * mPaddingTopBottom
            int emptySpaceY = mWindowRect.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.
@@ -101,9 +116,9 @@ public class TaskGridLayoutAlgorithm {

                int xIndex = taskLayoutIndex % tasksPerLine;
                int yIndex = taskLayoutIndex / tasksPerLine;
                xOffsets[taskIndex] =
                xOffsets[taskIndex] = mWindowRect.left +
                    emptySpaceX / 2 + mPaddingLeftRight + (taskWidth + mPaddingTaskView) * xIndex;
                yOffsets[taskIndex] =
                yOffsets[taskIndex] = mWindowRect.top +
                    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
     * are k tasks.
     */
    TaskGridRectInfo[] mTaskGridRectInfoList;
    private TaskGridRectInfo[] mTaskGridRectInfoList;

    public TaskGridLayoutAlgorithm(Context context) {
        reloadOnConfigurationChange(context);
@@ -121,10 +136,7 @@ public class TaskGridLayoutAlgorithm {

    public void reloadOnConfigurationChange(Context context) {
        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);

        mTaskGridRect = new Rect();
        mTitleBarHeight = res.getDimensionPixelSize(R.dimen.recents_grid_task_view_header_height);

@@ -178,9 +190,11 @@ public class TaskGridLayoutAlgorithm {
        return transformOut;
    }

    public void initialize(Rect displayRect, Rect windowRect) {
        mDisplayRect = displayRect;
    public void initialize(Rect 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
        // in the future.
@@ -202,7 +216,7 @@ public class TaskGridLayoutAlgorithm {
    }

    public Rect getStackActionButtonRect() {
        Rect buttonRect = new Rect(mDisplayRect);
        Rect buttonRect = new Rect(mWindowRect);
        buttonRect.right -= mPaddingLeftRight;
        buttonRect.left += mPaddingLeftRight;
        buttonRect.bottom = buttonRect.top + mPaddingTopBottom;