Loading services/core/java/com/android/server/wm/ActivityTaskManagerService.java +14 −14 Original line number Diff line number Diff line Loading @@ -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(); } Loading Loading @@ -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(); } } } Loading services/core/java/com/android/server/wm/RootWindowContainer.java +22 −5 Original line number Diff line number Diff line Loading @@ -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() { Loading services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java +3 −1 Original line number Diff line number Diff line Loading @@ -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); } /** Loading Loading
services/core/java/com/android/server/wm/ActivityTaskManagerService.java +14 −14 Original line number Diff line number Diff line Loading @@ -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(); } Loading Loading @@ -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(); } } } Loading
services/core/java/com/android/server/wm/RootWindowContainer.java +22 −5 Original line number Diff line number Diff line Loading @@ -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() { Loading
services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java +3 −1 Original line number Diff line number Diff line Loading @@ -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); } /** Loading