diff --git a/core/java/android/app/ActivityOptions.java b/core/java/android/app/ActivityOptions.java
index 73cc13c82bcb2..a1dce77c91919 100644
--- a/core/java/android/app/ActivityOptions.java
+++ b/core/java/android/app/ActivityOptions.java
@@ -320,6 +320,10 @@ public class ActivityOptions {
private static final String KEY_OVERRIDE_TASK_TRANSITION =
"android:activity.overrideTaskTransition";
+ /** See {@link #setRemoveWithTaskOrganizer(boolean)}. */
+ private static final String KEY_REMOVE_WITH_TASK_ORGANIZER =
+ "android.activity.removeWithTaskOrganizer";
+
/**
* @see #setLaunchCookie
* @hide
@@ -405,6 +409,7 @@ public class ActivityOptions {
private IRemoteTransition mRemoteTransition;
private boolean mOverrideTaskTransition;
private int mSplashScreenThemeResId;
+ private boolean mRemoveWithTaskOrganizer;
/**
* Create an ActivityOptions specifying a custom animation to run when
@@ -1155,6 +1160,7 @@ public class ActivityOptions {
KEY_REMOTE_TRANSITION));
mOverrideTaskTransition = opts.getBoolean(KEY_OVERRIDE_TASK_TRANSITION);
mSplashScreenThemeResId = opts.getInt(KEY_SPLASH_SCREEN_THEME);
+ mRemoveWithTaskOrganizer = opts.getBoolean(KEY_REMOVE_WITH_TASK_ORGANIZER);
}
/**
@@ -1623,6 +1629,22 @@ public class ActivityOptions {
return mOverrideTaskTransition;
}
+ /**
+ * Sets whether to remove the task when TaskOrganizer, which is managing it, is destroyed.
+ * @hide
+ */
+ public void setRemoveWithTaskOrganizer(boolean remove) {
+ mRemoveWithTaskOrganizer = remove;
+ }
+
+ /**
+ * @return whether to remove the task when TaskOrganizer, which is managing it, is destroyed.
+ * @hide
+ */
+ public boolean getRemoveWithTaskOranizer() {
+ return mRemoveWithTaskOrganizer;
+ }
+
/**
* Update the current values in this ActivityOptions from those supplied
* in otherOptions. Any values
@@ -1857,6 +1879,9 @@ public class ActivityOptions {
if (mSplashScreenThemeResId != 0) {
b.putInt(KEY_SPLASH_SCREEN_THEME, mSplashScreenThemeResId);
}
+ if (mRemoveWithTaskOrganizer) {
+ b.putBoolean(KEY_REMOVE_WITH_TASK_ORGANIZER, mRemoveWithTaskOrganizer);
+ }
return b;
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java
index 5992447bd6da7..46884fefd69cc 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java
@@ -157,6 +157,7 @@ public class TaskView extends SurfaceView implements SurfaceHolder.Callback,
});
options.setLaunchCookie(launchCookie);
options.setLaunchWindowingMode(WINDOWING_MODE_MULTI_WINDOW);
+ options.setRemoveWithTaskOrganizer(true);
}
/**
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index 7238fd6fa7475..ea9a3c83eb9b9 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -841,6 +841,9 @@ class Task extends WindowContainer {
// Tracking cookie for the creation of this task.
IBinder mLaunchCookie;
+ // The task will be removed when TaskOrganizer, which is managing the task, is destroyed.
+ boolean mRemoveWithTaskOrganizer;
+
private Task(ActivityTaskManagerService atmService, int _taskId, Intent _intent,
Intent _affinityIntent, String _affinity, String _rootAffinity,
ComponentName _realActivity, ComponentName _origActivity, boolean _rootWasReset,
@@ -852,7 +855,8 @@ class Task extends WindowContainer {
boolean supportsPictureInPicture, boolean _realActivitySuspended,
boolean userSetupComplete, int minWidth, int minHeight, ActivityInfo info,
IVoiceInteractionSession _voiceSession, IVoiceInteractor _voiceInteractor,
- boolean _createdByOrganizer, IBinder _launchCookie, boolean _deferTaskAppear) {
+ boolean _createdByOrganizer, IBinder _launchCookie, boolean _deferTaskAppear,
+ boolean _removeWithTaskOrganizer) {
super(atmService.mWindowManager);
mAtmService = atmService;
@@ -911,6 +915,7 @@ class Task extends WindowContainer {
mCreatedByOrganizer = _createdByOrganizer;
mLaunchCookie = _launchCookie;
mDeferTaskAppear = _deferTaskAppear;
+ mRemoveWithTaskOrganizer = _removeWithTaskOrganizer;
EventLogTags.writeWmTaskCreated(mTaskId, isRootTask() ? INVALID_TASK_ID : getRootTaskId());
}
@@ -7970,6 +7975,7 @@ class Task extends WindowContainer {
private IBinder mLaunchCookie;
private boolean mOnTop;
private boolean mHasBeenVisible;
+ private boolean mRemoveWithTaskOrganizer;
Builder(ActivityTaskManagerService atm) {
mAtmService = atm;
@@ -8265,6 +8271,9 @@ class Task extends WindowContainer {
mCallingPackage = mActivityInfo.packageName;
mResizeMode = mActivityInfo.resizeMode;
mSupportsPictureInPicture = mActivityInfo.supportsPictureInPicture();
+ if (mActivityOptions != null) {
+ mRemoveWithTaskOrganizer = mActivityOptions.getRemoveWithTaskOranizer();
+ }
final Task task = buildInner();
task.mHasBeenVisible = mHasBeenVisible;
@@ -8303,7 +8312,7 @@ class Task extends WindowContainer {
mCallingPackage, mCallingFeatureId, mResizeMode, mSupportsPictureInPicture,
mRealActivitySuspended, mUserSetupComplete, mMinWidth, mMinHeight,
mActivityInfo, mVoiceSession, mVoiceInteractor, mCreatedByOrganizer,
- mLaunchCookie, mDeferTaskAppear);
+ mLaunchCookie, mDeferTaskAppear, mRemoveWithTaskOrganizer);
}
}
}
diff --git a/services/core/java/com/android/server/wm/TaskOrganizerController.java b/services/core/java/com/android/server/wm/TaskOrganizerController.java
index 1531e56bf4909..fc6db61bdbcd1 100644
--- a/services/core/java/com/android/server/wm/TaskOrganizerController.java
+++ b/services/core/java/com/android/server/wm/TaskOrganizerController.java
@@ -285,18 +285,20 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
return false;
}
- private boolean removeTask(Task t) {
+ private boolean removeTask(Task t, boolean removeFromSystem) {
mOrganizedTasks.remove(t);
mInterceptBackPressedOnRootTasks.remove(t.mTaskId);
-
- if (t.mTaskAppearedSent) {
+ boolean taskAppearedSent = t.mTaskAppearedSent;
+ if (taskAppearedSent) {
if (t.getSurfaceControl() != null) {
t.migrateToNewSurfaceControl();
}
t.mTaskAppearedSent = false;
- return true;
}
- return false;
+ if (removeFromSystem) {
+ mService.removeTask(t.mTaskId);
+ }
+ return taskAppearedSent;
}
void dispose() {
@@ -311,7 +313,7 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
if (mOrganizedTasks.contains(t)) {
// updateTaskOrganizerState should remove the task from the list, but still
// check it again to avoid while-loop isn't terminate.
- if (removeTask(t)) {
+ if (removeTask(t, t.mRemoveWithTaskOrganizer)) {
TaskOrganizerController.this.onTaskVanishedInternal(
mOrganizer.mTaskOrganizer, t);
}
@@ -527,7 +529,7 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
void onTaskVanished(ITaskOrganizer organizer, Task task) {
final TaskOrganizerState state = mTaskOrganizerStates.get(organizer.asBinder());
- if (state != null && state.removeTask(task)) {
+ if (state != null && state.removeTask(task, false /* removeFromSystem */)) {
onTaskVanishedInternal(organizer, task);
}
}