diff options
| author | 2021-09-06 16:35:04 +0800 | |
|---|---|---|
| committer | 2021-09-07 14:56:29 +0800 | |
| commit | 2918f63c31d788db613d587df6b2af1ca181937b (patch) | |
| tree | e09235ac294ad32f4fd96e9243f19f9825b13020 | |
| parent | 506fa0bebd0e9ee013eaa5b15868a2ea4a379493 (diff) | |
Defer TaskFragment removal until appeared
Exception was throw because a TaskFragment was finished before
onTaskFragmentAppeared was called.
Bug: 198361315
Test: launch Settings with WIP CLs listed in the bug
Change-Id: Id794b192cd0db21c00803166358712cdf5e2a209
2 files changed, 21 insertions, 7 deletions
diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/organizer/SplitController.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/organizer/SplitController.java index 05c6792a3fc7..12c273af7989 100644 --- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/organizer/SplitController.java +++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/organizer/SplitController.java @@ -117,6 +117,10 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen } container.setInfo(taskFragmentAppearedInfo.getTaskFragmentInfo()); + if (container.isFinished()) { + mPresenter.cleanupContainer(container, false /* shouldFinishDependent */); + updateCallbackIfNecessary(); + } } @Override diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/organizer/TaskFragmentContainer.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/organizer/TaskFragmentContainer.java index a9155cf152fe..8503b9f4e310 100644 --- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/organizer/TaskFragmentContainer.java +++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/organizer/TaskFragmentContainer.java @@ -138,7 +138,7 @@ class TaskFragmentContainer { return mInfo; } - void setInfo(@Nullable TaskFragmentInfo info) { + void setInfo(@NonNull TaskFragmentInfo info) { mInfo = info; if (mInfo == null || mPendingAppearedActivities.isEmpty()) { return; @@ -190,20 +190,30 @@ class TaskFragmentContainer { */ void finish(boolean shouldFinishDependent, @NonNull SplitPresenter presenter, @NonNull WindowContainerTransaction wct, @NonNull SplitController controller) { - if (mIsFinished) { - return; + if (!mIsFinished) { + mIsFinished = true; + finishActivities(shouldFinishDependent, presenter, wct, controller); } - mIsFinished = true; - // Finish own activities - for (Activity activity : collectActivities()) { - activity.finish(); + if (mInfo == null) { + // Defer removal the container and wait until TaskFragment appeared. + return; } // Cleanup the visuals presenter.deleteTaskFragment(wct, getTaskFragmentToken()); // Cleanup the records controller.removeContainer(this); + // Clean up task fragment information + mInfo = null; + } + + private void finishActivities(boolean shouldFinishDependent, @NonNull SplitPresenter presenter, + @NonNull WindowContainerTransaction wct, @NonNull SplitController controller) { + // Finish own activities + for (Activity activity : collectActivities()) { + activity.finish(); + } if (!shouldFinishDependent) { return; |