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

Commit bd6bb3f5 authored by Jeff Chang's avatar Jeff Chang
Browse files

Return the correct root task when start activity from recents

When starting activity from recents, the system will find the
suitable task and move it to the front.  With corresponding task
display area, TDA#getOrCreateRootTask returns the candidate task
directly instead of the existing launch root task.
In RootWindowContainer#anyTaskForId, the candidate task is reparent
to the root task(same as itself) which resolve from the
TDA#getOrCreateRootTask and lead to the watchdog timeout. This CL
updates the logic to return the correct root task.

Bug: 197293995
Test: atest MultiWindowTests,WMShellUnitTests
Change-Id: Ib0b24363dc35d624c358080998c25874d9e7094c
parent 61246e7f
Loading
Loading
Loading
Loading
+9 −11
Original line number Diff line number Diff line
@@ -1095,29 +1095,27 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> {
                return rootTask;
            }
        } else if (candidateTask != null) {
            final Task rootTask = candidateTask;
            final int position = onTop ? POSITION_TOP : POSITION_BOTTOM;
            final Task launchRootTask = getLaunchRootTask(windowingMode, activityType, options,
                    sourceTask, launchFlags);

            if (launchRootTask != null) {
                if (rootTask.getParent() == null) {
                    launchRootTask.addChild(rootTask, position);
                } else if (rootTask.getParent() != launchRootTask) {
                    rootTask.reparent(launchRootTask, position);
                }
            } else if (rootTask.getDisplayArea() != this || !rootTask.isRootTask()) {
                if (rootTask.getParent() == null) {
                    addChild(rootTask, position);
                if (candidateTask.getParent() == null) {
                    launchRootTask.addChild(candidateTask, position);
                } else if (candidateTask.getParent() != launchRootTask) {
                    candidateTask.reparent(launchRootTask, position);
                }
            } else if (candidateTask.getDisplayArea() != this || !candidateTask.isRootTask()) {
                if (candidateTask.getParent() == null) {
                    addChild(candidateTask, position);
                } else {
                    rootTask.reparent(this, onTop);
                    candidateTask.reparent(this, onTop);
                }
            }
            // Update windowing mode if necessary, e.g. moving a pinned task to fullscreen.
            if (candidateTask.getWindowingMode() != windowingMode) {
                candidateTask.setWindowingMode(windowingMode);
            }
            return rootTask;
            return candidateTask.getRootTask();
        }
        return new Task.Builder(mAtmService)
                .setWindowingMode(windowingMode)
+4 −0
Original line number Diff line number Diff line
@@ -354,6 +354,10 @@ class WindowContainer<E extends WindowContainer> extends ConfigurationContainer<
            throw new IllegalArgumentException("reparent: can't reparent to null " + this);
        }

        if (newParent == this) {
            throw new IllegalArgumentException("Can not reparent to itself " + this);
        }

        final WindowContainer oldParent = mParent;
        if (mParent == newParent) {
            throw new IllegalArgumentException("WC=" + this + " already child of " + mParent);