summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Yuncheol Heo <ycheo@google.com> 2021-02-25 15:15:38 -0800
committer Yuncheol Heo <ycheo@google.com> 2021-02-26 10:46:52 -0800
commit28e66c2a770aaedef1ed1597d6939e7e0d64f2d1 (patch)
tree77bdf5e78ec42ddc2b6fd009b3bcce13d307d467
parentb33721641ed491ab9deff871fa31739ce8b93be6 (diff)
Introduce a flag removeWithTaskOrganizer.
- The flag allows us to remove the tasks which are managed by TaskOrganizer when TO dies. Bug: 179676966 Test: Launch a Bubble, kill SysUi and check if the Bubble remains in ActivityStack. Change-Id: Ie0ccafd2b4b0393b777b69b7fb70c0ea74f95963
-rw-r--r--core/java/android/app/ActivityOptions.java25
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java1
-rw-r--r--services/core/java/com/android/server/wm/Task.java13
-rw-r--r--services/core/java/com/android/server/wm/TaskOrganizerController.java16
4 files changed, 46 insertions, 9 deletions
diff --git a/core/java/android/app/ActivityOptions.java b/core/java/android/app/ActivityOptions.java
index 73cc13c82bcb..a1dce77c9191 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);
}
/**
@@ -1624,6 +1630,22 @@ public class ActivityOptions {
}
/**
+ * 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 <var>otherOptions</var>. Any values
* defined in <var>otherOptions</var> replace those in the base options.
@@ -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 5992447bd6da..46884fefd69c 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 7238fd6fa747..ea9a3c83eb9b 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<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<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<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<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<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<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 1531e56bf490..fc6db61bdbcd 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);
}
}