diff options
| author | 2021-02-25 15:15:38 -0800 | |
|---|---|---|
| committer | 2021-02-26 10:46:52 -0800 | |
| commit | 28e66c2a770aaedef1ed1597d6939e7e0d64f2d1 (patch) | |
| tree | 77bdf5e78ec42ddc2b6fd009b3bcce13d307d467 | |
| parent | b33721641ed491ab9deff871fa31739ce8b93be6 (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
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); } } |