Loading services/core/java/com/android/server/wm/ActivityRecord.java +14 −12 Original line number Diff line number Diff line Loading @@ -6434,10 +6434,13 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A void stopIfPossible() { if (DEBUG_SWITCH) Slog.d(TAG_SWITCH, "Stopping: " + this); final Task rootTask = getRootTask(); if (finishing) { Slog.e(TAG, "Request to stop a finishing activity: " + this); destroyIfPossible("stopIfPossible-finishing"); return; } if (isNoHistory()) { if (!finishing) { if (!rootTask.shouldSleepActivities()) { if (!task.shouldSleepActivities()) { ProtoLog.d(WM_DEBUG_STATES, "no-history finish of %s", this); if (finishIfPossible("stop-no-history", false /* oomAdj */) != FINISH_RESULT_CANCELLED) { Loading @@ -6449,7 +6452,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A + "because we're just sleeping", this); } } } if (!attachedToProcess()) { return; Loading services/core/java/com/android/server/wm/ActivityTaskSupervisor.java +2 −1 Original line number Diff line number Diff line Loading @@ -55,6 +55,7 @@ import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_TASKS; import static com.android.server.wm.ActivityRecord.State.PAUSED; import static com.android.server.wm.ActivityRecord.State.PAUSING; import static com.android.server.wm.ActivityRecord.State.RESTARTING_PROCESS; import static com.android.server.wm.ActivityRecord.State.RESUMED; import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_ALL; import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_CLEANUP; import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_IDLE; Loading Loading @@ -1681,7 +1682,7 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks { ArrayList<ActivityRecord> activities = null; for (int i = mStoppingActivities.size() - 1; i >= 0; i--) { final ActivityRecord r = mStoppingActivities.get(i); if (r.getTask() == task) { if (!r.finishing && r.isState(RESUMED) && r.getTask() == task) { if (activities == null) { activities = new ArrayList<>(); } Loading services/tests/wmtests/src/com/android/server/wm/ActivityTaskSupervisorTests.java +27 −0 Original line number Diff line number Diff line Loading @@ -201,6 +201,33 @@ public class ActivityTaskSupervisorTests extends WindowTestsBase { verify(taskChangeNotifier, never()).notifyActivityDismissingDockedRootTask(); } /** Verifies that the activity can be destroying after removing task. */ @Test public void testRemoveTask() { final ActivityRecord activity1 = new ActivityBuilder(mAtm).setCreateTask(true).build(); activity1.setVisible(false); activity1.finishing = true; activity1.setState(ActivityRecord.State.STOPPING, "test"); activity1.addToStopping(false /* scheduleIdle */, false /* idleDelayed */, "test"); final ActivityRecord activity2 = new ActivityBuilder(mAtm).setCreateTask(true).build(); activity2.setState(ActivityRecord.State.RESUMED, "test"); // The state can happen from ActivityRecord#makeInvisible. activity2.addToStopping(false /* scheduleIdle */, false /* idleDelayed */, "test"); mSupervisor.removeTask(activity1.getTask(), true /* killProcess */, true /* removeFromRecents */, "testRemoveTask"); mSupervisor.removeTask(activity2.getTask(), true /* killProcess */, true /* removeFromRecents */, "testRemoveTask"); assertEquals(ActivityRecord.State.DESTROYING, activity2.getState()); assertEquals(ActivityRecord.State.STOPPING, activity1.getState()); assertTrue(mSupervisor.mStoppingActivities.contains(activity1)); // Assume that it is called by scheduleIdle from addToStopping. And because // mStoppingActivities remembers the finishing activity, it can continue to destroy. mSupervisor.processStoppingAndFinishingActivities(null /* launchedActivity */, false /* processPausingActivities */, "test"); assertEquals(ActivityRecord.State.DESTROYING, activity1.getState()); } /** Ensures that the calling package name passed to client complies with package visibility. */ @Test public void testFilteredReferred() { Loading Loading
services/core/java/com/android/server/wm/ActivityRecord.java +14 −12 Original line number Diff line number Diff line Loading @@ -6434,10 +6434,13 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A void stopIfPossible() { if (DEBUG_SWITCH) Slog.d(TAG_SWITCH, "Stopping: " + this); final Task rootTask = getRootTask(); if (finishing) { Slog.e(TAG, "Request to stop a finishing activity: " + this); destroyIfPossible("stopIfPossible-finishing"); return; } if (isNoHistory()) { if (!finishing) { if (!rootTask.shouldSleepActivities()) { if (!task.shouldSleepActivities()) { ProtoLog.d(WM_DEBUG_STATES, "no-history finish of %s", this); if (finishIfPossible("stop-no-history", false /* oomAdj */) != FINISH_RESULT_CANCELLED) { Loading @@ -6449,7 +6452,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A + "because we're just sleeping", this); } } } if (!attachedToProcess()) { return; Loading
services/core/java/com/android/server/wm/ActivityTaskSupervisor.java +2 −1 Original line number Diff line number Diff line Loading @@ -55,6 +55,7 @@ import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_TASKS; import static com.android.server.wm.ActivityRecord.State.PAUSED; import static com.android.server.wm.ActivityRecord.State.PAUSING; import static com.android.server.wm.ActivityRecord.State.RESTARTING_PROCESS; import static com.android.server.wm.ActivityRecord.State.RESUMED; import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_ALL; import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_CLEANUP; import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_IDLE; Loading Loading @@ -1681,7 +1682,7 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks { ArrayList<ActivityRecord> activities = null; for (int i = mStoppingActivities.size() - 1; i >= 0; i--) { final ActivityRecord r = mStoppingActivities.get(i); if (r.getTask() == task) { if (!r.finishing && r.isState(RESUMED) && r.getTask() == task) { if (activities == null) { activities = new ArrayList<>(); } Loading
services/tests/wmtests/src/com/android/server/wm/ActivityTaskSupervisorTests.java +27 −0 Original line number Diff line number Diff line Loading @@ -201,6 +201,33 @@ public class ActivityTaskSupervisorTests extends WindowTestsBase { verify(taskChangeNotifier, never()).notifyActivityDismissingDockedRootTask(); } /** Verifies that the activity can be destroying after removing task. */ @Test public void testRemoveTask() { final ActivityRecord activity1 = new ActivityBuilder(mAtm).setCreateTask(true).build(); activity1.setVisible(false); activity1.finishing = true; activity1.setState(ActivityRecord.State.STOPPING, "test"); activity1.addToStopping(false /* scheduleIdle */, false /* idleDelayed */, "test"); final ActivityRecord activity2 = new ActivityBuilder(mAtm).setCreateTask(true).build(); activity2.setState(ActivityRecord.State.RESUMED, "test"); // The state can happen from ActivityRecord#makeInvisible. activity2.addToStopping(false /* scheduleIdle */, false /* idleDelayed */, "test"); mSupervisor.removeTask(activity1.getTask(), true /* killProcess */, true /* removeFromRecents */, "testRemoveTask"); mSupervisor.removeTask(activity2.getTask(), true /* killProcess */, true /* removeFromRecents */, "testRemoveTask"); assertEquals(ActivityRecord.State.DESTROYING, activity2.getState()); assertEquals(ActivityRecord.State.STOPPING, activity1.getState()); assertTrue(mSupervisor.mStoppingActivities.contains(activity1)); // Assume that it is called by scheduleIdle from addToStopping. And because // mStoppingActivities remembers the finishing activity, it can continue to destroy. mSupervisor.processStoppingAndFinishingActivities(null /* launchedActivity */, false /* processPausingActivities */, "test"); assertEquals(ActivityRecord.State.DESTROYING, activity1.getState()); } /** Ensures that the calling package name passed to client complies with package visibility. */ @Test public void testFilteredReferred() { Loading