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

Commit a6e902ec authored by Wale Ogunwale's avatar Wale Ogunwale
Browse files

Properly size tasks based on stack size.

There were a few places we weren’t doing this correctly

* When a new task is created the bounds should be the stack bounds
if the task is resizeable and not in freeform mode.
* When resizing a stack each task in the stack should be resized
base on if it is resizable vs. using the top running activity in
the stack to determine if all the tasks should be resized.

Change-Id: If3448c5629313e7e7fb91ffe8506014f16ad72db
parent 31cb4bb4
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -4564,6 +4564,8 @@ final class ActivityStack {
        addTask(task, toTop, false);
        if (mTaskPositioner != null) {
            mTaskPositioner.updateDefaultBounds(task, mTaskHistory, info.initialLayout);
        } else if (mBounds != null && task.mResizeable) {
            task.updateOverrideConfiguration(mBounds);
        }
        return task;
    }
+11 −14
Original line number Diff line number Diff line
@@ -2971,31 +2971,29 @@ public final class ActivityStackSupervisor implements DisplayListener {
        }

        ActivityRecord r = stack.topRunningActivityLocked(null);
        final boolean resizeTasks = r != null && r.task.mResizeable;

        mTmpBounds.clear();
        mTmpConfigs.clear();
        if (resizeTasks) {
        ArrayList<TaskRecord> tasks = stack.getAllTasks();
        for (int i = tasks.size() - 1; i >= 0; i--) {
            TaskRecord task = tasks.get(i);
            if (task.mResizeable) {
                if (stack.mStackId == FREEFORM_WORKSPACE_STACK_ID) {
                    // For freeform stack we don't adjust the size of the tasks to match that of
                    // the stack, but we do try to make sure the tasks are still contained with the
                    // bounds of the stack.
                    // For freeform stack we don't adjust the size of the tasks to match that
                    // of the stack, but we do try to make sure the tasks are still contained
                    // with the bounds of the stack.
                    tempRect2.set(task.mBounds);
                    fitWithinBounds(tempRect2, bounds);
                    task.updateOverrideConfiguration(tempRect2);
                } else {
                    task.updateOverrideConfiguration(bounds);
                }
            }

            mTmpConfigs.put(task.taskId, task.mOverrideConfig);
            mTmpBounds.put(task.taskId, task.mBounds);
        }
        }
        stack.mFullscreen = mWindowManager.resizeStack(stackId, bounds, resizeTasks, mTmpConfigs,
                mTmpBounds);
        stack.mFullscreen = mWindowManager.resizeStack(stackId, bounds, mTmpConfigs, mTmpBounds);
        if (stack.mStackId == DOCKED_STACK_ID) {
            // Dock stack funness...Yay!
            if (stack.mFullscreen) {
@@ -3008,7 +3006,6 @@ public final class ActivityStackSupervisor implements DisplayListener {
                    }
                }

                final ArrayList<TaskRecord> tasks = stack.getAllTasks();
                final int count = tasks.size();
                for (int i = 0; i < count; i++) {
                    moveTaskToStackLocked(tasks.get(i).taskId,
+1 −1
Original line number Diff line number Diff line
@@ -1235,7 +1235,7 @@ final class TaskRecord {
        if (stack == null
                || stack.mStackId == HOME_STACK_ID
                || stack.mStackId == FULLSCREEN_WORKSPACE_STACK_ID) {
            return null;
            return (mResizeable && stack != null) ? stack.mBounds : null;
        } else if (stack.mStackId == DOCKED_STACK_ID) {
            return stack.mBounds;
        }
+2 −10
Original line number Diff line number Diff line
@@ -118,30 +118,22 @@ public class TaskStack implements DimLayer.DimLayerUser {
    /**
     * Set the bounds of the stack and its containing tasks.
     * @param stackBounds New stack bounds. Passing in null sets the bounds to fullscreen.
     * @param resizeTasks If true, the tasks within the stack will also be resized.
     * @param configs Configuration for individual tasks, keyed by task id.
     * @param taskBounds Bounds for individual tasks, keyed by task id.
     * @return True if the stack bounds was changed.
     * */
    boolean setBounds(Rect stackBounds, boolean resizeTasks, SparseArray<Configuration> configs,
            SparseArray<Rect> taskBounds) {
    boolean setBounds(
            Rect stackBounds, SparseArray<Configuration> configs, SparseArray<Rect> taskBounds) {
        if (!setBounds(stackBounds)) {
            return false;
        }

        if (!resizeTasks) {
            return true;
        }

        // Update bounds of containing tasks.
        for (int taskNdx = mTasks.size() - 1; taskNdx >= 0; --taskNdx) {
            final Task task = mTasks.get(taskNdx);
            Configuration config = configs.get(task.mTaskId);
            if (config != null) {
                Rect bounds = taskBounds.get(task.mTaskId);
                if (bounds == null) {
                    bounds = stackBounds;
                }
                task.setBounds(bounds, config);
            } else {
                Slog.wtf(TAG, "No config for task: " + task + ", is there a mismatch with AM?");
+2 −3
Original line number Diff line number Diff line
@@ -4632,12 +4632,11 @@ public class WindowManagerService extends IWindowManager.Stub
     * Re-sizes a stack and its containing tasks.
     * @param stackId Id of stack to resize.
     * @param bounds New stack bounds. Passing in null sets the bounds to fullscreen.
     * @param resizeTasks If true, the tasks within the stack will also be resized.
     * @param configs Configurations for tasks in the resized stack, keyed by task id.
     * @param taskBounds Bounds for tasks in the resized stack, keyed by task id.
     * @return True if the stack is now fullscreen.
     * */
    public boolean resizeStack(int stackId, Rect bounds, boolean resizeTasks,
    public boolean resizeStack(int stackId, Rect bounds,
            SparseArray<Configuration> configs, SparseArray<Rect> taskBounds) {
        synchronized (mWindowMap) {
            final TaskStack stack = mStackIdToStack.get(stackId);
@@ -4645,7 +4644,7 @@ public class WindowManagerService extends IWindowManager.Stub
                throw new IllegalArgumentException("resizeStack: stackId " + stackId
                        + " not found.");
            }
            if (stack.setBounds(bounds, resizeTasks, configs, taskBounds)) {
            if (stack.setBounds(bounds, configs, taskBounds)) {
                stack.resizeWindows();
                stack.getDisplayContent().layoutNeeded = true;
                mWindowPlacerLocked.performSurfacePlacement();