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

Commit 056454d2 authored by Riddle Hsu's avatar Riddle Hsu Committed by Android (Google) Code Review
Browse files

Merge "Update visibility when visible activity crashed" into main

parents d19c25a1 8f42ef56
Loading
Loading
Loading
Loading
+14 −14
Original line number Diff line number Diff line
@@ -6448,19 +6448,8 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
                if (!restarting && hasVisibleActivities) {
                    deferWindowLayout();
                    try {
                        final Task topTask = mRootWindowContainer.getTopDisplayFocusedRootTask();
                        if (topTask != null
                                && topTask.topRunningActivity(true /* focusableOnly */) == null) {
                            topTask.adjustFocusToNextFocusableTask("handleAppDied");
                        }
                        if (!mRootWindowContainer.resumeFocusedTasksTopActivities()) {
                            // If there was nothing to resume, and we are not already restarting
                            // this process, but there is a visible activity that is hosted by the
                            // process...then make sure all visible activities are running, taking
                            // care of restarting this process.
                            mRootWindowContainer.ensureActivitiesVisible(null, 0,
                                    !PRESERVE_WINDOWS);
                        }
                        mRootWindowContainer.ensureVisibilityOnVisibleActivityDiedOrCrashed(
                                "handleAppDied");
                    } finally {
                        continueWindowLayout();
                    }
@@ -6901,7 +6890,18 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
        @Override
        public int finishTopCrashedActivities(WindowProcessController crashedApp, String reason) {
            synchronized (mGlobalLock) {
                return mRootWindowContainer.finishTopCrashedActivities(crashedApp, reason);
                deferWindowLayout();
                try {
                    final Task finishedTask = mRootWindowContainer.finishTopCrashedActivities(
                            crashedApp, reason);
                    if (finishedTask != null) {
                        mRootWindowContainer.ensureVisibilityOnVisibleActivityDiedOrCrashed(reason);
                        return finishedTask.mTaskId;
                    }
                    return INVALID_TASK_ID;
                } finally {
                    continueWindowLayout();
                }
            }
        }

+22 −5
Original line number Diff line number Diff line
@@ -2319,19 +2319,36 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
     *
     * @param app    The app that crashed.
     * @param reason Reason to perform this action.
     * @return The task id that was finished in this root task, or INVALID_TASK_ID if none was
     * finished.
     * @return The finished task which was on top or visible, otherwise {@code null} if the crashed
     *         app doesn't have activity in visible task.
     */
    int finishTopCrashedActivities(WindowProcessController app, String reason) {
    @Nullable
    Task finishTopCrashedActivities(WindowProcessController app, String reason) {
        Task focusedRootTask = getTopDisplayFocusedRootTask();
        final Task[] finishedTask = new Task[1];
        forAllRootTasks(rootTask -> {
            final boolean recordTopOrVisible = finishedTask[0] == null
                    && (focusedRootTask == rootTask || rootTask.isVisibleRequested());
            final Task t = rootTask.finishTopCrashedActivityLocked(app, reason);
            if (rootTask == focusedRootTask || finishedTask[0] == null) {
            if (recordTopOrVisible) {
                finishedTask[0] = t;
            }
        });
        return finishedTask[0] != null ? finishedTask[0].mTaskId : INVALID_TASK_ID;
        return finishedTask[0];
    }

    void ensureVisibilityOnVisibleActivityDiedOrCrashed(String reason) {
        final Task topTask = getTopDisplayFocusedRootTask();
        if (topTask != null && topTask.topRunningActivity(true /* focusableOnly */) == null) {
            // Move the next focusable task to front.
            topTask.adjustFocusToNextFocusableTask(reason);
        }
        if (!resumeFocusedTasksTopActivities()) {
            // It may be nothing to resume because there are pausing activities or all the top
            // activities are resumed. Then it still needs to make sure all visible activities are
            // running in case the tasks were reordered or there are non-top visible activities.
            ensureActivitiesVisible(null /* starting */, 0 /* configChanges */, !PRESERVE_WINDOWS);
        }
    }

    boolean resumeFocusedTasksTopActivities() {
+3 −1
Original line number Diff line number Diff line
@@ -549,10 +549,12 @@ public class RootWindowContainerTests extends WindowTestsBase {

        // Let's pretend that the app has crashed.
        firstActivity.app.setThread(null);
        mRootWindowContainer.finishTopCrashedActivities(firstActivity.app, "test");
        final Task finishedTask = mRootWindowContainer.finishTopCrashedActivities(
                firstActivity.app, "test");

        // Verify that the root task was removed.
        assertEquals(originalRootTaskCount, defaultTaskDisplayArea.getRootTaskCount());
        assertEquals(rootTask, finishedTask);
    }

    /**