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

Commit 34976aa3 authored by Chilun's avatar Chilun
Browse files

Add restored tasks with persisted activity to hierarchy

The Activity with persistAcrossReboots mode will be restored and added
into Task while rebooting. However, after the WM hierarchy is unified,
adding Activity to Task will trigger a series of events, such as
relayout and create surface control, which require Task in the
hierarchy. This causes the restore to fail.

The solution here is to add the restored task to the hierarchy as early
as the point of restoration.

Bug: 178782815
Test: atest TaskPersisterTest TaskRecordTests
Change-Id: I604d6c31f49cff959609373f85d177eadebb062b
parent 304d3a07
Loading
Loading
Loading
Loading
+8 −2
Original line number Diff line number Diff line
@@ -4912,10 +4912,16 @@ class Task extends WindowContainer<WindowContainer> {
        task.mLastNonFullscreenBounds = lastNonFullscreenBounds;
        task.setBounds(lastNonFullscreenBounds);
        task.mWindowLayoutAffinity = windowLayoutAffinity;
        if (activities.size() > 0) {
            // We need to add the task into hierarchy before adding child to it.
            final DisplayContent dc =
                    taskSupervisor.mRootWindowContainer.getDisplayContent(DEFAULT_DISPLAY);
            dc.getDefaultTaskDisplayArea().addChild(task, POSITION_BOTTOM);

            for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
                task.addChild(activities.get(activityNdx));
            }
        }

        if (DEBUG_RECENTS) Slog.d(TAG_RECENTS, "Restored task=" + task);
        return task;
+11 −2
Original line number Diff line number Diff line
@@ -328,10 +328,19 @@ public class TaskPersister implements PersisterQueue.Listener {
                                // mWriteQueue.add(new TaskWriteQueueItem(task));

                                final int taskId = task.mTaskId;
                                if (mService.mRootWindowContainer.anyTaskForId(taskId,
                                final boolean persistedTask = task.hasActivity();
                                if (persistedTask && mRecentTasks.getTask(taskId) != null) {
                                    // The persisted task is added into hierarchy and will also be
                                    // added to recent tasks later. So this task should not exist
                                    // in recent tasks before it is added.
                                    Slog.wtf(TAG, "Existing persisted task with taskId " + taskId
                                            + " found");
                                } else if (!persistedTask
                                        && mService.mRootWindowContainer.anyTaskForId(taskId,
                                        MATCH_ATTACHED_TASK_OR_RECENT_TASKS) != null) {
                                    // Should not happen.
                                    Slog.wtf(TAG, "Existing task with taskId " + taskId + "found");
                                    Slog.wtf(TAG, "Existing task with taskId " + taskId
                                            + " found");
                                } else if (userId != task.mUserId) {
                                    // Should not happen.
                                    Slog.wtf(TAG, "Task with userId " + task.mUserId + " found in "