diff options
| author | 2023-08-15 05:56:56 +0000 | |
|---|---|---|
| committer | 2023-08-15 05:56:56 +0000 | |
| commit | 0926aa90332372b86d374d3487c036fc747969c6 (patch) | |
| tree | 2b3974e1a47a749cd0ca4b2f437d438af2a22510 | |
| parent | 0c9141054e716431e1dcac4f15308bbc19f36304 (diff) | |
| parent | 0297b7b4ab558b21639043ee8b0c7d6726a4c728 (diff) | |
Merge "[7/n] Pin ActivityStack" into udc-qpr-dev
| -rw-r--r-- | libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java | 41 | ||||
| -rw-r--r-- | libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskContainer.java | 17 |
2 files changed, 56 insertions, 2 deletions
diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java index d5f4d6c39552..bcbf72857544 100644 --- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java +++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java @@ -242,9 +242,20 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen return false; } + // Abort if no space to split. + final SplitAttributes calculatedSplitAttributes = mPresenter.computeSplitAttributes( + task.getTaskProperties(), splitPinRule, + splitPinRule.getDefaultSplitAttributes(), + getActivitiesMinDimensionsPair(primaryContainer.getTopNonFinishingActivity(), + topContainer.getTopNonFinishingActivity())); + if (!SplitPresenter.shouldShowSplit(calculatedSplitAttributes)) { + Log.w(TAG, "No space to split, abort pinning top ActivityStack."); + return false; + } + // Registers a Split final SplitPinContainer splitPinContainer = new SplitPinContainer(primaryContainer, - topContainer, splitPinRule, splitPinRule.getDefaultSplitAttributes()); + topContainer, splitPinRule, calculatedSplitAttributes); task.addSplitContainer(splitPinContainer); // Updates the Split @@ -263,7 +274,33 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen @Override public void unpinTopActivityStack(int taskId){ - // TODO + synchronized (mLock) { + final TaskContainer task = getTaskContainer(taskId); + if (task == null) { + Log.e(TAG, "Cannot find the task to unpin, id: " + taskId); + return; + } + + final SplitPinContainer splitPinContainer = task.getSplitPinContainer(); + if (splitPinContainer == null) { + Log.e(TAG, "No ActivityStack is pinned."); + return; + } + + // Remove the SplitPinContainer from the task. + final TaskFragmentContainer containerToUnpin = + splitPinContainer.getSecondaryContainer(); + task.removeSplitPinContainer(); + + // Resets the isolated navigation and updates the container. + final TransactionRecord transactionRecord = mTransactionManager.startNewTransaction(); + final WindowContainerTransaction wct = transactionRecord.getTransaction(); + mPresenter.setTaskFragmentIsolatedNavigation(wct, + containerToUnpin.getTaskFragmentToken(), false /* isolated */); + updateContainer(wct, containerToUnpin); + transactionRecord.apply(false /* shouldApplyIndependently */); + updateCallbackIfNecessary(); + } } @Override diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskContainer.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskContainer.java index d2d63bd11a7e..463c8ceaf992 100644 --- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskContainer.java +++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskContainer.java @@ -265,8 +265,25 @@ class TaskContainer { } void removeSplitPinContainer() { + if (mSplitPinContainer == null) { + return; + } + + final TaskFragmentContainer primaryContainer = mSplitPinContainer.getPrimaryContainer(); + final TaskFragmentContainer secondaryContainer = mSplitPinContainer.getSecondaryContainer(); mSplitContainers.remove(mSplitPinContainer); mSplitPinContainer = null; + + // Remove the other SplitContainers that contains the unpinned container (unless it + // is the current top-most split-pair), since the state are no longer valid. + final List<SplitContainer> splitsToRemove = new ArrayList<>(); + for (SplitContainer splitContainer : mSplitContainers) { + if (splitContainer.getSecondaryContainer().equals(secondaryContainer) + && !splitContainer.getPrimaryContainer().equals(primaryContainer)) { + splitsToRemove.add(splitContainer); + } + } + removeSplitContainers(splitsToRemove); } @Nullable |