From 2918f63c31d788db613d587df6b2af1ca181937b Mon Sep 17 00:00:00 2001 From: Louis Chang Date: Mon, 6 Sep 2021 16:35:04 +0800 Subject: 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 --- .../extensions/organizer/SplitController.java | 4 ++++ .../organizer/TaskFragmentContainer.java | 24 +++++++++++++++------- 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; -- cgit v1.2.3-59-g8ed1b