Loading services/core/java/com/android/server/wm/ActivityStarter.java +4 −4 Original line number Diff line number Diff line Loading @@ -2196,8 +2196,9 @@ class ActivityStarter { // removed from calling performClearTaskLocked (For example, if it is being brought out // of history or if it is finished immediately), thus disassociating the task. Also note // that mReuseTask is reset as a result of {@link Task#performClearTaskLocked} // launching another activity. targetTask.performClearTaskLocked(); // launching another activity. Keep the task-overlay activity because the targetTask // will be reused to launch new activity. targetTask.performClearTaskForReuse(true /* excludingTaskOverlay*/); targetTask.setIntent(mStartActivity); mAddingToTask = true; } else if ((mLaunchFlags & FLAG_ACTIVITY_CLEAR_TOP) != 0 Loading @@ -2207,8 +2208,7 @@ class ActivityStarter { // In this situation we want to remove all activities from the task up to the one // being started. In most cases this means we are resetting the task to its initial // state. final ActivityRecord top = targetTask.performClearTaskForReuseLocked(mStartActivity, mLaunchFlags); final ActivityRecord top = targetTask.performClearTop(mStartActivity, mLaunchFlags); if (top != null) { if (top.isRootOfTask()) { Loading services/core/java/com/android/server/wm/ActivityTaskSupervisor.java +1 −1 Original line number Diff line number Diff line Loading @@ -1605,7 +1605,7 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks { task.mTransitionController.requestCloseTransitionIfNeeded(task); task.mInRemoveTask = true; try { task.performClearTask(reason); task.removeActivities(reason, false /* excludingTaskOverlay */); cleanUpRemovedTaskLocked(task, killProcess, removeFromRecents); mService.getLockTaskController().clearLockedTask(task); mService.getTaskChangeNotificationController().notifyTaskStackChanged(); Loading services/core/java/com/android/server/wm/LockTaskController.java +2 −2 Original line number Diff line number Diff line Loading @@ -542,7 +542,7 @@ public class LockTaskController { if (mLockTaskModeTasks.isEmpty()) { return; } task.performClearTaskLocked(); task.performClearTaskForReuse(false /* excludingTaskOverlay*/); mSupervisor.mRootWindowContainer.resumeFocusedTasksTopActivities(); } Loading Loading @@ -740,7 +740,7 @@ public class LockTaskController { ProtoLog.d(WM_DEBUG_LOCKTASK, "onLockTaskPackagesUpdated: removing %s" + " mLockTaskAuth()=%s", lockedTask, lockedTask.lockTaskAuthToString()); removeLockedTask(lockedTask); lockedTask.performClearTaskLocked(); lockedTask.performClearTaskForReuse(false /* excludingTaskOverlay*/); taskChanged = true; } Loading services/core/java/com/android/server/wm/Task.java +13 −11 Original line number Diff line number Diff line Loading @@ -1584,19 +1584,23 @@ class Task extends TaskFragment { } /** Completely remove all activities associated with an existing task. */ void performClearTask(String reason) { void removeActivities(String reason, boolean excludingTaskOverlay) { clearPinnedTaskIfNeed(); // Broken down into to cases to avoid object create due to capturing mStack. if (getRootTask() == null) { forAllActivities((r) -> { if (r.finishing) return; if (r.finishing || (excludingTaskOverlay && r.isTaskOverlay())) { return; } // Task was restored from persistent storage. r.takeFromHistory(); removeChild(r, reason); }); } else { forAllActivities((r) -> { if (r.finishing) return; if (r.finishing || (excludingTaskOverlay && r.isTaskOverlay())) { return; } // Prevent the transition from being executed too early if the top activity is // resumed but the mVisibleRequested of any other activity is true, the transition // should wait until next activity resumed. Loading @@ -1613,26 +1617,24 @@ class Task extends TaskFragment { /** * Completely remove all activities associated with an existing task. */ void performClearTaskLocked() { void performClearTaskForReuse(boolean excludingTaskOverlay) { mReuseTask = true; mTaskSupervisor.beginDeferResume(); try { performClearTask("clear-task-all"); removeActivities("clear-task-all", excludingTaskOverlay); } finally { mTaskSupervisor.endDeferResume(); mReuseTask = false; } } ActivityRecord performClearTaskForReuseLocked(ActivityRecord newR, int launchFlags) { mReuseTask = true; ActivityRecord performClearTop(ActivityRecord newR, int launchFlags) { mTaskSupervisor.beginDeferResume(); final ActivityRecord result; try { result = performClearTaskLocked(newR, launchFlags); result = clearTopActivities(newR, launchFlags); } finally { mTaskSupervisor.endDeferResume(); mReuseTask = false; } return result; } Loading @@ -1648,7 +1650,7 @@ class Task extends TaskFragment { * @return Returns the old activity that should be continued to be used, * or {@code null} if none was found. */ private ActivityRecord performClearTaskLocked(ActivityRecord newR, int launchFlags) { private ActivityRecord clearTopActivities(ActivityRecord newR, int launchFlags) { final ActivityRecord r = findActivityInHistory(newR.mActivityComponent); if (r == null) return null; Loading @@ -1675,7 +1677,7 @@ class Task extends TaskFragment { // Stop operation once we reach the boundary activity. if (r == boundaryActivity) return true; if (!r.finishing) { if (!r.finishing && !r.isTaskOverlay()) { final ActivityOptions opts = r.getOptions(); if (opts != null) { r.clearOptionsAnimation(); Loading services/tests/wmtests/src/com/android/server/wm/AppTransitionControllerTest.java +1 −1 Original line number Diff line number Diff line Loading @@ -120,7 +120,7 @@ public class AppTransitionControllerTest extends WindowTestsBase { behind.setState(ActivityRecord.State.STARTED, "test"); behind.mVisibleRequested = true; task.performClearTask("test"); task.removeActivities("test", false /* excludingTaskOverlay */); assertFalse(mDisplayContent.mAppTransition.isReady()); } Loading Loading
services/core/java/com/android/server/wm/ActivityStarter.java +4 −4 Original line number Diff line number Diff line Loading @@ -2196,8 +2196,9 @@ class ActivityStarter { // removed from calling performClearTaskLocked (For example, if it is being brought out // of history or if it is finished immediately), thus disassociating the task. Also note // that mReuseTask is reset as a result of {@link Task#performClearTaskLocked} // launching another activity. targetTask.performClearTaskLocked(); // launching another activity. Keep the task-overlay activity because the targetTask // will be reused to launch new activity. targetTask.performClearTaskForReuse(true /* excludingTaskOverlay*/); targetTask.setIntent(mStartActivity); mAddingToTask = true; } else if ((mLaunchFlags & FLAG_ACTIVITY_CLEAR_TOP) != 0 Loading @@ -2207,8 +2208,7 @@ class ActivityStarter { // In this situation we want to remove all activities from the task up to the one // being started. In most cases this means we are resetting the task to its initial // state. final ActivityRecord top = targetTask.performClearTaskForReuseLocked(mStartActivity, mLaunchFlags); final ActivityRecord top = targetTask.performClearTop(mStartActivity, mLaunchFlags); if (top != null) { if (top.isRootOfTask()) { Loading
services/core/java/com/android/server/wm/ActivityTaskSupervisor.java +1 −1 Original line number Diff line number Diff line Loading @@ -1605,7 +1605,7 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks { task.mTransitionController.requestCloseTransitionIfNeeded(task); task.mInRemoveTask = true; try { task.performClearTask(reason); task.removeActivities(reason, false /* excludingTaskOverlay */); cleanUpRemovedTaskLocked(task, killProcess, removeFromRecents); mService.getLockTaskController().clearLockedTask(task); mService.getTaskChangeNotificationController().notifyTaskStackChanged(); Loading
services/core/java/com/android/server/wm/LockTaskController.java +2 −2 Original line number Diff line number Diff line Loading @@ -542,7 +542,7 @@ public class LockTaskController { if (mLockTaskModeTasks.isEmpty()) { return; } task.performClearTaskLocked(); task.performClearTaskForReuse(false /* excludingTaskOverlay*/); mSupervisor.mRootWindowContainer.resumeFocusedTasksTopActivities(); } Loading Loading @@ -740,7 +740,7 @@ public class LockTaskController { ProtoLog.d(WM_DEBUG_LOCKTASK, "onLockTaskPackagesUpdated: removing %s" + " mLockTaskAuth()=%s", lockedTask, lockedTask.lockTaskAuthToString()); removeLockedTask(lockedTask); lockedTask.performClearTaskLocked(); lockedTask.performClearTaskForReuse(false /* excludingTaskOverlay*/); taskChanged = true; } Loading
services/core/java/com/android/server/wm/Task.java +13 −11 Original line number Diff line number Diff line Loading @@ -1584,19 +1584,23 @@ class Task extends TaskFragment { } /** Completely remove all activities associated with an existing task. */ void performClearTask(String reason) { void removeActivities(String reason, boolean excludingTaskOverlay) { clearPinnedTaskIfNeed(); // Broken down into to cases to avoid object create due to capturing mStack. if (getRootTask() == null) { forAllActivities((r) -> { if (r.finishing) return; if (r.finishing || (excludingTaskOverlay && r.isTaskOverlay())) { return; } // Task was restored from persistent storage. r.takeFromHistory(); removeChild(r, reason); }); } else { forAllActivities((r) -> { if (r.finishing) return; if (r.finishing || (excludingTaskOverlay && r.isTaskOverlay())) { return; } // Prevent the transition from being executed too early if the top activity is // resumed but the mVisibleRequested of any other activity is true, the transition // should wait until next activity resumed. Loading @@ -1613,26 +1617,24 @@ class Task extends TaskFragment { /** * Completely remove all activities associated with an existing task. */ void performClearTaskLocked() { void performClearTaskForReuse(boolean excludingTaskOverlay) { mReuseTask = true; mTaskSupervisor.beginDeferResume(); try { performClearTask("clear-task-all"); removeActivities("clear-task-all", excludingTaskOverlay); } finally { mTaskSupervisor.endDeferResume(); mReuseTask = false; } } ActivityRecord performClearTaskForReuseLocked(ActivityRecord newR, int launchFlags) { mReuseTask = true; ActivityRecord performClearTop(ActivityRecord newR, int launchFlags) { mTaskSupervisor.beginDeferResume(); final ActivityRecord result; try { result = performClearTaskLocked(newR, launchFlags); result = clearTopActivities(newR, launchFlags); } finally { mTaskSupervisor.endDeferResume(); mReuseTask = false; } return result; } Loading @@ -1648,7 +1650,7 @@ class Task extends TaskFragment { * @return Returns the old activity that should be continued to be used, * or {@code null} if none was found. */ private ActivityRecord performClearTaskLocked(ActivityRecord newR, int launchFlags) { private ActivityRecord clearTopActivities(ActivityRecord newR, int launchFlags) { final ActivityRecord r = findActivityInHistory(newR.mActivityComponent); if (r == null) return null; Loading @@ -1675,7 +1677,7 @@ class Task extends TaskFragment { // Stop operation once we reach the boundary activity. if (r == boundaryActivity) return true; if (!r.finishing) { if (!r.finishing && !r.isTaskOverlay()) { final ActivityOptions opts = r.getOptions(); if (opts != null) { r.clearOptionsAnimation(); Loading
services/tests/wmtests/src/com/android/server/wm/AppTransitionControllerTest.java +1 −1 Original line number Diff line number Diff line Loading @@ -120,7 +120,7 @@ public class AppTransitionControllerTest extends WindowTestsBase { behind.setState(ActivityRecord.State.STARTED, "test"); behind.mVisibleRequested = true; task.performClearTask("test"); task.removeActivities("test", false /* excludingTaskOverlay */); assertFalse(mDisplayContent.mAppTransition.isReady()); } Loading