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

Commit 04a0ea60 authored by Craig Mautner's avatar Craig Mautner
Browse files

Retain stacks even if they are empty.

Previously stacks would be removed when the last ActivityRecord was
removed. This causes problems for ActivityContainers which persist and
permit activities to be launched into an empty stack.

Change-Id: Ia79ac65d17c42eff3a7b1321980c21b29996001b
parent 4504de5d
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -486,7 +486,7 @@ final class ActivityRecord {
    void setTask(TaskRecord newTask, ThumbnailHolder newThumbHolder, boolean isRoot) {
        if (task != null && task.removeActivity(this)) {
            if (task != newTask) {
                mStackSupervisor.removeTask(task);
                task.stack.removeTask(task);
            } else {
                Slog.d(TAG, "!!! REMOVE THIS LOG !!! setTask: nearly removed stack=" +
                        (newTask == null ? null : newTask.stack));
+18 −4
Original line number Diff line number Diff line
@@ -2674,7 +2674,7 @@ final class ActivityStack {
        r.finishLaunchTickingLocked();
    }

    final void removeActivityFromHistoryLocked(ActivityRecord r) {
    private void removeActivityFromHistoryLocked(ActivityRecord r) {
        finishActivityResultsLocked(r, Activity.RESULT_CANCELED, null);
        r.makeFinishing();
        if (DEBUG_ADD_REMOVE) {
@@ -2689,7 +2689,7 @@ final class ActivityStack {
            if (mStackSupervisor.isFrontStack(this) && task == topTask() && task.mOnTopOfHome) {
                mStackSupervisor.moveHomeToTop();
            }
            mStackSupervisor.removeTask(task);
            removeTask(task);
        }
        r.takeFromHistory();
        removeTimeoutsForActivityLocked(r);
@@ -3596,14 +3596,28 @@ final class ActivityStack {
        return starting;
    }

    boolean removeTask(TaskRecord task) {
    void removeTask(TaskRecord task) {
        mWindowManager.removeTask(task.taskId);
        final ActivityRecord r = mResumedActivity;
        if (r != null && r.task == task) {
            mResumedActivity = null;
        }

        final int taskNdx = mTaskHistory.indexOf(task);
        final int topTaskNdx = mTaskHistory.size() - 1;
        if (task.mOnTopOfHome && taskNdx < topTaskNdx) {
            mTaskHistory.get(taskNdx + 1).mOnTopOfHome = true;
        }
        mTaskHistory.remove(task);
        return mTaskHistory.isEmpty();

        if (mTaskHistory.isEmpty()) {
            if (DEBUG_STACK) Slog.i(TAG, "removeTask: moving to back stack=" + this);
            if (isOnHomeDisplay()) {
                mStackSupervisor.moveHomeStack(!isHomeStack());
            }
            mStacks.remove(this);
            mStacks.add(0, this);
        }
    }

    TaskRecord createTaskRecord(int taskId, ActivityInfo info, Intent intent, boolean toTop) {
+1 −20
Original line number Diff line number Diff line
@@ -364,25 +364,6 @@ public final class ActivityStackSupervisor implements DisplayListener {
        return mCurTaskId;
    }

    void removeTask(TaskRecord task) {
        mWindowManager.removeTask(task.taskId);
        final ActivityStack stack = task.stack;
        final ActivityRecord r = stack.mResumedActivity;
        if (r != null && r.task == task) {
            stack.mResumedActivity = null;
        }
        if (stack.removeTask(task) && !stack.isHomeStack()) {
            if (DEBUG_STACK) Slog.i(TAG, "removeTask: removing stack " + stack);
            stack.mActivityContainer.detachLocked();
            final int stackId = stack.mStackId;
            final int nextStackId = mWindowManager.removeStack(stackId);
            // TODO: Perhaps we need to let the ActivityManager determine the next focus...
            if (stack.isOnHomeDisplay()) {
                mFocusedStack = getStack(nextStackId);
            }
        }
    }

    ActivityRecord resumedAppLocked() {
        ActivityStack stack = getFocusedStack();
        if (stack == null) {
@@ -2192,7 +2173,7 @@ public final class ActivityStackSupervisor implements DisplayListener {
            Slog.w(TAG, "moveTaskToStack: no stack for id=" + stackId);
            return;
        }
        removeTask(task);
        task.stack.removeTask(task);
        stack.addTask(task, toTop);
        mWindowManager.addTask(taskId, stackId, toTop);
        resumeTopActivitiesLocked();
+6 −2
Original line number Diff line number Diff line
@@ -191,14 +191,18 @@ public class TaskStack {
    }

    /**
     * Delete a Task from this stack. If it is the last Task in the stack, remove this stack from
     * its parent StackBox and merge the parent.
     * Delete a Task from this stack. If it is the last Task in the stack, move this stack to the
     * back.
     * @param task The Task to delete.
     */
    void removeTask(Task task) {
        if (DEBUG_TASK_MOVEMENT) Slog.d(TAG, "removeTask: task=" + task);
        mTasks.remove(task);
        mDisplayContent.removeTask(task);
        if (mTasks.isEmpty()) {
            mDisplayContent.moveStack(this, false);
        }
        mDisplayContent.layoutNeeded = true;
    }

    int remove() {
+0 −18
Original line number Diff line number Diff line
@@ -4845,23 +4845,6 @@ public class WindowManagerService extends IWindowManager.Stub
        }
    }

    public int removeStack(int stackId) {
        synchronized (mWindowMap) {
            final TaskStack stack = mStackIdToStack.get(stackId);
            if (stack != null) {
                mStackIdToStack.delete(stackId);
                int nextStackId = stack.remove();
                stack.getDisplayContent().layoutNeeded = true;
                requestTraversalLocked();
                if (nextStackId > HOME_STACK_ID) {
                    return nextStackId;
                }
            }
            if (DEBUG_STACK) Slog.i(TAG, "removeStack: could not find stackId=" + stackId);
        }
        return HOME_STACK_ID;
    }

    public void removeTask(int taskId) {
        synchronized (mWindowMap) {
            Task task = mTaskIdToTask.get(taskId);
@@ -4872,7 +4855,6 @@ public class WindowManagerService extends IWindowManager.Stub
            final TaskStack stack = task.mStack;
            EventLog.writeEvent(EventLogTags.WM_TASK_REMOVED, taskId, "removeTask");
            stack.removeTask(task);
            stack.getDisplayContent().layoutNeeded = true;
        }
    }