From eca505edab4158625439ddf811e8262c3750a57c Mon Sep 17 00:00:00 2001 From: Charles Chen Date: Wed, 1 Feb 2023 17:38:06 +0800 Subject: [PATCH] Implement the runtime APIs Implement the following APIs: - finishActivityStacks Finish a set of ActivityStacks. It is useful to expand the primary container. - invalidateTopVisibleSplitAttributes: Update the container actively and trigger the SplitAttrbutes calculatator function. It is useful to update SplitAttributes regardless of device and window state change. - updateSplitAttributes Update the SplitAttributes of a specific split and also overrides its default SplitAttributes. It is useful if an app doesn't set its SplitAttributes calculator function, but want to customize SplitAttributes of a split pair without updating the rule. Bug: 263565444 Test: presubmit Change-Id: Icc502f5e106d380ed1e5656445fbd20a1a391c8e --- .../extensions/embedding/SplitContainer.java | 68 +++++- .../extensions/embedding/SplitController.java | 212 ++++++++++++++---- .../extensions/embedding/SplitPresenter.java | 27 +-- .../extensions/embedding/TaskContainer.java | 13 +- .../embedding/TaskFragmentContainer.java | 26 ++- .../embedding/SplitControllerTest.java | 13 +- .../embedding/SplitPresenterTest.java | 47 ++-- .../Jetpack/window-extensions-release.aar | Bin 35718 -> 35795 bytes 8 files changed, 286 insertions(+), 120 deletions(-) diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitContainer.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitContainer.java index 825c67071a2dd..18497ad249eeb 100644 --- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitContainer.java +++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitContainer.java @@ -21,9 +21,11 @@ import android.os.Binder; import android.os.IBinder; import android.util.Pair; import android.util.Size; +import android.window.TaskFragmentParentInfo; import android.window.WindowContainerTransaction; import androidx.annotation.NonNull; +import androidx.window.extensions.core.util.function.Function; /** * Client-side descriptor of a split that holds two containers. @@ -35,8 +37,12 @@ class SplitContainer { private final TaskFragmentContainer mSecondaryContainer; @NonNull private final SplitRule mSplitRule; + /** @see SplitContainer#getCurrentSplitAttributes() */ @NonNull - private SplitAttributes mSplitAttributes; + private SplitAttributes mCurrentSplitAttributes; + /** @see SplitContainer#getDefaultSplitAttributes() */ + @NonNull + private SplitAttributes mDefaultSplitAttributes; @NonNull private final IBinder mToken; @@ -48,7 +54,8 @@ class SplitContainer { mPrimaryContainer = primaryContainer; mSecondaryContainer = secondaryContainer; mSplitRule = splitRule; - mSplitAttributes = splitAttributes; + mDefaultSplitAttributes = splitRule.getDefaultSplitAttributes(); + mCurrentSplitAttributes = splitAttributes; mToken = new Binder("SplitContainer"); if (shouldFinishPrimaryWithSecondary(splitRule)) { @@ -82,9 +89,37 @@ class SplitContainer { return mSplitRule; } + /** + * Returns the current {@link SplitAttributes} this {@code SplitContainer} is showing. + *

+ * If the {@code SplitAttributes} calculator function is not set by + * {@link SplitController#setSplitAttributesCalculator(Function)}, the current + * {@code SplitAttributes} is either to expand the containers if the size constraints of + * {@link #getSplitRule()} are not satisfied, + * or the {@link #getDefaultSplitAttributes()}, otherwise. + *

+ * If the {@code SplitAttributes} calculator function is set, the current + * {@code SplitAttributes} will be customized by the function, which can be any + * {@code SplitAttributes}. + *

+ * + * @see SplitAttributes.SplitType.ExpandContainersSplitType + */ @NonNull - SplitAttributes getSplitAttributes() { - return mSplitAttributes; + SplitAttributes getCurrentSplitAttributes() { + return mCurrentSplitAttributes; + } + + /** + * Returns the default {@link SplitAttributes} when the parent task container bounds satisfy + * {@link #getSplitRule()} constraints. + *

+ * The value is usually from {@link SplitRule#getDefaultSplitAttributes} unless it is overridden + * by {@link SplitController#updateSplitAttributes(IBinder, SplitAttributes)}. + */ + @NonNull + SplitAttributes getDefaultSplitAttributes() { + return mDefaultSplitAttributes; } @NonNull @@ -95,11 +130,19 @@ class SplitContainer { /** * Updates the {@link SplitAttributes} to this container. * It is usually used when there's a folding state change or - * {@link SplitController#onTaskFragmentParentInfoChanged(WindowContainerTransaction, int, - * Configuration)}. + * {@link SplitController#onTaskFragmentParentInfoChanged(WindowContainerTransaction, + * int, TaskFragmentParentInfo)}. */ - void setSplitAttributes(@NonNull SplitAttributes splitAttributes) { - mSplitAttributes = splitAttributes; + void updateCurrentSplitAttributes(@NonNull SplitAttributes splitAttributes) { + mCurrentSplitAttributes = splitAttributes; + } + + /** + * Overrides the default {@link SplitAttributes} to this container, which may be different + * from {@link SplitRule#getDefaultSplitAttributes}. + */ + void updateDefaultSplitAttributes(@NonNull SplitAttributes splitAttributes) { + mDefaultSplitAttributes = splitAttributes; } @NonNull @@ -121,7 +164,7 @@ class SplitContainer { @NonNull SplitInfo toSplitInfo() { return new SplitInfo(mPrimaryContainer.toActivityStack(), - mSecondaryContainer.toActivityStack(), mSplitAttributes, mToken); + mSecondaryContainer.toActivityStack(), mCurrentSplitAttributes, mToken); } static boolean shouldFinishPrimaryWithSecondary(@NonNull SplitRule splitRule) { @@ -180,9 +223,10 @@ class SplitContainer { public String toString() { return "SplitContainer{" + " primaryContainer=" + mPrimaryContainer - + " secondaryContainer=" + mSecondaryContainer - + " splitRule=" + mSplitRule - + " splitAttributes" + mSplitAttributes + + ", secondaryContainer=" + mSecondaryContainer + + ", splitRule=" + mSplitRule + + ", currentSplitAttributes" + mCurrentSplitAttributes + + ", defaultSplitAttributes" + mDefaultSplitAttributes + "}"; } } 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 ff582015c4be5..4ed53a859037f 100644 --- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java +++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java @@ -87,6 +87,7 @@ import androidx.window.extensions.layout.WindowLayoutComponentImpl; import com.android.internal.annotations.VisibleForTesting; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.Set; @@ -279,6 +280,98 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen } } + @Override + public void finishActivityStacks(@NonNull Set activityStackTokens) { + if (activityStackTokens.isEmpty()) { + return; + } + synchronized (mLock) { + // Translate ActivityStack to TaskFragmentContainer. + final List pendingFinishingContainers = + activityStackTokens.stream() + .map(token -> { + synchronized (mLock) { + return getContainer(token); + } + }).filter(Objects::nonNull) + .toList(); + + if (pendingFinishingContainers.isEmpty()) { + return; + } + // Start transaction with close transit type. + final TransactionRecord transactionRecord = mTransactionManager.startNewTransaction(); + transactionRecord.setOriginType(TASK_FRAGMENT_TRANSIT_CLOSE); + final WindowContainerTransaction wct = transactionRecord.getTransaction(); + + forAllTaskContainers(taskContainer -> { + synchronized (mLock) { + final List containers = taskContainer.mContainers; + // Clean up the TaskFragmentContainers by the z-order from the lowest. + for (int i = 0; i < containers.size() - 1; i++) { + final TaskFragmentContainer container = containers.get(i); + if (pendingFinishingContainers.contains(container)) { + // Don't update records here to prevent double invocation. + container.finish(false /* shouldFinishDependant */, mPresenter, + wct, this, false /* shouldRemoveRecord */); + } + } + // Remove container records. + removeContainers(taskContainer, pendingFinishingContainers); + // Update the change to the client side. + updateContainersInTaskIfVisible(wct, taskContainer.getTaskId()); + } + }); + + // Apply the transaction. + transactionRecord.apply(false /* shouldApplyIndependently */); + } + } + + @Override + public void invalidateTopVisibleSplitAttributes() { + synchronized (mLock) { + WindowContainerTransaction wct = mTransactionManager.startNewTransaction() + .getTransaction(); + forAllTaskContainers(taskContainer -> { + synchronized (mLock) { + updateContainersInTaskIfVisible(wct, taskContainer.getTaskId()); + } + }); + mTransactionManager.getCurrentTransactionRecord() + .apply(false /* shouldApplyIndependently */); + } + } + + @GuardedBy("mLock") + private void forAllTaskContainers(@NonNull Consumer callback) { + for (int i = mTaskContainers.size() - 1; i >= 0; --i) { + callback.accept(mTaskContainers.valueAt(i)); + } + } + + @Override + public void updateSplitAttributes(@NonNull IBinder splitInfoToken, + @NonNull SplitAttributes splitAttributes) { + synchronized (mLock) { + final SplitContainer splitContainer = getSplitContainer(splitInfoToken); + if (splitContainer == null) { + Log.w(TAG, "Cannot find SplitContainer for token:" + splitInfoToken); + return; + } + WindowContainerTransaction wct = mTransactionManager.startNewTransaction() + .getTransaction(); + if (updateSplitContainerIfNeeded(splitContainer, wct, splitAttributes)) { + splitContainer.updateDefaultSplitAttributes(splitAttributes); + mTransactionManager.getCurrentTransactionRecord() + .apply(false /* shouldApplyIndependently */); + } else { + // Abort if the SplitContainer wasn't updated. + mTransactionManager.getCurrentTransactionRecord().abort(); + } + } + } + /** * Called when the transaction is ready so that the organizer can update the TaskFragments based * on the changes in transaction. @@ -648,35 +741,6 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen } } - /** Returns whether the given {@link TaskContainer} may show in split. */ - // Suppress GuardedBy warning because lint asks to mark this method as - // @GuardedBy(mPresenter.mController.mLock), which is mLock itself - @SuppressWarnings("GuardedBy") - @GuardedBy("mLock") - private boolean mayShowSplit(@NonNull TaskContainer taskContainer) { - // No split inside PIP. - if (taskContainer.isInPictureInPicture()) { - return false; - } - // Always assume the TaskContainer if SplitAttributesCalculator is set - if (mSplitAttributesCalculator != null) { - return true; - } - // Check if the parent container bounds can support any split rule. - for (EmbeddingRule rule : mSplitRules) { - if (!(rule instanceof SplitRule)) { - continue; - } - final SplitRule splitRule = (SplitRule) rule; - final SplitAttributes splitAttributes = mPresenter.computeSplitAttributes( - taskContainer.getTaskProperties(), splitRule, null /* minDimensionsPair */); - if (shouldShowSplit(splitAttributes)) { - return true; - } - } - return false; - } - @VisibleForTesting @GuardedBy("mLock") void onActivityCreated(@NonNull WindowContainerTransaction wct, @@ -1360,20 +1424,33 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen * Removes the container from bookkeeping records. */ void removeContainer(@NonNull TaskFragmentContainer container) { + removeContainers(container.getTaskContainer(), Collections.singletonList(container)); + } + + /** + * Removes containers from bookkeeping records. + */ + void removeContainers(@NonNull TaskContainer taskContainer, + @NonNull List containers) { // Remove all split containers that included this one - final TaskContainer taskContainer = container.getTaskContainer(); - taskContainer.mContainers.remove(container); + taskContainer.mContainers.removeAll(containers); // Marked as a pending removal which will be removed after it is actually removed on the // server side (#onTaskFragmentVanished). // In this way, we can keep track of the Task bounds until we no longer have any // TaskFragment there. - taskContainer.mFinishedContainer.add(container.getTaskFragmentToken()); + taskContainer.mFinishedContainer.addAll(containers.stream().map( + TaskFragmentContainer::getTaskFragmentToken).toList()); // Cleanup any split references. final List containersToRemove = new ArrayList<>(); for (SplitContainer splitContainer : taskContainer.mSplitContainers) { - if (container.equals(splitContainer.getSecondaryContainer()) - || container.equals(splitContainer.getPrimaryContainer())) { + if (containersToRemove.contains(splitContainer)) { + // Don't need to check because it has been in the remove list. + continue; + } + if (containers.stream().anyMatch(container -> + splitContainer.getPrimaryContainer().equals(container) + || splitContainer.getSecondaryContainer().equals(container))) { containersToRemove.add(splitContainer); } } @@ -1381,7 +1458,7 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen // Cleanup any dependent references. for (TaskFragmentContainer containerToUpdate : taskContainer.mContainers) { - containerToUpdate.removeContainerToFinishOnExit(container); + containerToUpdate.removeContainersToFinishOnExit(containers); } } @@ -1461,26 +1538,53 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen if (splitContainer == null) { return; } + + updateSplitContainerIfNeeded(splitContainer, wct, null /* splitAttributes */); + } + + /** + * Updates {@link SplitContainer} with the given {@link SplitAttributes} if the + * {@link SplitContainer} is the top most and not finished. If passed {@link SplitAttributes} + * are {@code null}, the {@link SplitAttributes} will be calculated with + * {@link SplitPresenter#computeSplitAttributes(TaskContainer.TaskProperties, SplitRule, Pair)}. + * + * @param splitContainer The {@link SplitContainer} to update + * @param splitAttributes Update with this {@code splitAttributes} if it is not {@code null}. + * Otherwise, use the value calculated by + * {@link SplitPresenter#computeSplitAttributes( + * TaskContainer.TaskProperties, SplitRule, Pair)} + * + * @return {@code true} if the update succeed. Otherwise, returns {@code false}. + */ + @GuardedBy("mLock") + private boolean updateSplitContainerIfNeeded(@NonNull SplitContainer splitContainer, + @NonNull WindowContainerTransaction wct, @Nullable SplitAttributes splitAttributes) { if (!isTopMostSplit(splitContainer)) { // Skip position update - it isn't the topmost split. - return; + return false; } if (splitContainer.getPrimaryContainer().isFinished() || splitContainer.getSecondaryContainer().isFinished()) { // Skip position update - one or both containers are finished. - return; + return false; } - final TaskContainer taskContainer = splitContainer.getTaskContainer(); - final SplitRule splitRule = splitContainer.getSplitRule(); - final Pair minDimensionsPair = splitContainer.getMinDimensionsPair(); - final SplitAttributes splitAttributes = mPresenter.computeSplitAttributes( - taskContainer.getTaskProperties(), splitRule, minDimensionsPair); - splitContainer.setSplitAttributes(splitAttributes); + if (splitAttributes == null) { + final TaskContainer.TaskProperties taskProperties = splitContainer.getTaskContainer() + .getTaskProperties(); + final SplitRule splitRule = splitContainer.getSplitRule(); + final SplitAttributes defaultSplitAttributes = splitContainer + .getDefaultSplitAttributes(); + final Pair minDimensionsPair = splitContainer.getMinDimensionsPair(); + splitAttributes = mPresenter.computeSplitAttributes(taskProperties, splitRule, + defaultSplitAttributes, minDimensionsPair); + } + splitContainer.updateCurrentSplitAttributes(splitAttributes); if (dismissPlaceholderIfNecessary(wct, splitContainer)) { // Placeholder was finished, the positions will be updated when its container is emptied - return; + return true; } - mPresenter.updateSplitContainer(splitContainer, container, wct); + mPresenter.updateSplitContainer(splitContainer, wct); + return true; } /** Whether the given split is the topmost split in the Task. */ @@ -1576,7 +1680,7 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen final Pair minDimensionsPair = getActivityIntentMinDimensionsPair(activity, placeholderRule.getPlaceholderIntent()); final SplitAttributes splitAttributes = mPresenter.computeSplitAttributes(taskProperties, - placeholderRule, minDimensionsPair); + placeholderRule, placeholderRule.getDefaultSplitAttributes(), minDimensionsPair); if (!SplitPresenter.shouldShowSplit(splitAttributes)) { return false; } @@ -1655,7 +1759,7 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen // The placeholder should remain after it was first shown. return false; } - final SplitAttributes splitAttributes = splitContainer.getSplitAttributes(); + final SplitAttributes splitAttributes = splitContainer.getCurrentSplitAttributes(); if (SplitPresenter.shouldShowSplit(splitAttributes)) { return false; } @@ -1797,6 +1901,20 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen return null; } + @Nullable + @GuardedBy("mLock") + SplitContainer getSplitContainer(@NonNull IBinder token) { + for (int i = mTaskContainers.size() - 1; i >= 0; i--) { + final List containers = mTaskContainers.valueAt(i).mSplitContainers; + for (SplitContainer container : containers) { + if (container.getToken().equals(token)) { + return container; + } + } + } + return null; + } + @Nullable @GuardedBy("mLock") TaskContainer getTaskContainer(int taskId) { diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitPresenter.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitPresenter.java index 2b93682d791ff..5d51760268654 100644 --- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitPresenter.java +++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitPresenter.java @@ -179,7 +179,7 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer { final Pair minDimensionsPair = getActivityIntentMinDimensionsPair( primaryActivity, secondaryIntent); final SplitAttributes splitAttributes = computeSplitAttributes(taskProperties, rule, - minDimensionsPair); + rule.getDefaultSplitAttributes(), minDimensionsPair); final Rect primaryRelBounds = getRelBoundsForPosition(POSITION_START, taskProperties, splitAttributes); final TaskFragmentContainer primaryContainer = prepareContainerForActivity(wct, @@ -225,7 +225,7 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer { final Pair minDimensionsPair = getActivitiesMinDimensionsPair(primaryActivity, secondaryActivity); final SplitAttributes splitAttributes = computeSplitAttributes(taskProperties, rule, - minDimensionsPair); + rule.getDefaultSplitAttributes(), minDimensionsPair); final Rect primaryRelBounds = getRelBoundsForPosition(POSITION_START, taskProperties, splitAttributes); final TaskFragmentContainer primaryContainer = prepareContainerForActivity(wct, @@ -334,11 +334,9 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer { /** * Updates the positions of containers in an existing split. * @param splitContainer The split container to be updated. - * @param updatedContainer The task fragment that was updated and caused this split update. * @param wct WindowContainerTransaction that this update should be performed with. */ void updateSplitContainer(@NonNull SplitContainer splitContainer, - @NonNull TaskFragmentContainer updatedContainer, @NonNull WindowContainerTransaction wct) { // Getting the parent configuration using the updated container - it will have the recent // value. @@ -348,8 +346,9 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer { if (activity == null) { return; } - final TaskProperties taskProperties = getTaskProperties(updatedContainer); - final SplitAttributes splitAttributes = splitContainer.getSplitAttributes(); + final TaskContainer taskContainer = splitContainer.getTaskContainer(); + final TaskProperties taskProperties = taskContainer.getTaskProperties(); + final SplitAttributes splitAttributes = splitContainer.getCurrentSplitAttributes(); final Rect primaryRelBounds = getRelBoundsForPosition(POSITION_START, taskProperties, splitAttributes); final Rect secondaryRelBounds = getRelBoundsForPosition(POSITION_END, taskProperties, @@ -370,7 +369,6 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer { // When placeholder is shown in split, we should keep the focus on the primary. wct.requestFocusOnTaskFragment(primaryContainer.getTaskFragmentToken()); } - final TaskContainer taskContainer = updatedContainer.getTaskContainer(); final int windowingMode = taskContainer.getWindowingModeForSplitTaskFragment( primaryRelBounds); updateTaskFragmentWindowingModeIfRegistered(wct, primaryContainer, windowingMode); @@ -515,9 +513,9 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer { // Expand the splitContainer if minimum dimensions are not satisfied. final TaskContainer taskContainer = splitContainer.getTaskContainer(); final SplitAttributes splitAttributes = sanitizeSplitAttributes( - taskContainer.getTaskProperties(), splitContainer.getSplitAttributes(), + taskContainer.getTaskProperties(), splitContainer.getCurrentSplitAttributes(), minDimensionsPair); - splitContainer.setSplitAttributes(splitAttributes); + splitContainer.updateCurrentSplitAttributes(splitAttributes); if (!shouldShowSplit(splitAttributes)) { // If the client side hasn't received TaskFragmentInfo yet, we can't change TaskFragment // bounds. Return failure to create a new SplitContainer which fills task bounds. @@ -540,7 +538,7 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer { } static boolean shouldShowSplit(@NonNull SplitContainer splitContainer) { - return shouldShowSplit(splitContainer.getSplitAttributes()); + return shouldShowSplit(splitContainer.getCurrentSplitAttributes()); } static boolean shouldShowSplit(@NonNull SplitAttributes splitAttributes) { @@ -549,12 +547,12 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer { @NonNull SplitAttributes computeSplitAttributes(@NonNull TaskProperties taskProperties, - @NonNull SplitRule rule, @Nullable Pair minDimensionsPair) { + @NonNull SplitRule rule, @NonNull SplitAttributes defaultSplitAttributes, + @Nullable Pair minDimensionsPair) { final Configuration taskConfiguration = taskProperties.getConfiguration(); final WindowMetrics taskWindowMetrics = getTaskWindowMetrics(taskConfiguration); final Function calculator = mController.getSplitAttributesCalculator(); - final SplitAttributes defaultSplitAttributes = rule.getDefaultSplitAttributes(); final boolean areDefaultConstraintsSatisfied = rule.checkParentMetrics(taskWindowMetrics); if (calculator == null) { if (!areDefaultConstraintsSatisfied) { @@ -956,11 +954,6 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer { return bounds.width() > bounds.height(); } - @NonNull - static TaskProperties getTaskProperties(@NonNull TaskFragmentContainer container) { - return container.getTaskContainer().getTaskProperties(); - } - @NonNull TaskProperties getTaskProperties(@NonNull Activity activity) { final TaskContainer taskContainer = mController.getTaskContainer( 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 f41295b77a0de..4b15bb187035e 100644 --- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskContainer.java +++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskContainer.java @@ -107,12 +107,6 @@ class TaskContainer { return mIsVisible; } - @NonNull - Configuration getConfiguration() { - // Make a copy in case the config is updated unexpectedly. - return new Configuration(mConfiguration); - } - @NonNull TaskProperties getTaskProperties() { return new TaskProperties(mDisplayId, mConfiguration); @@ -157,7 +151,7 @@ class TaskContainer { @WindowingMode private int getWindowingMode() { - return getConfiguration().windowConfiguration.getWindowingMode(); + return mConfiguration.windowConfiguration.getWindowingMode(); } /** Whether there is any {@link TaskFragmentContainer} below this Task. */ @@ -220,10 +214,7 @@ class TaskContainer { } } - /** - * A wrapper class which contains the display ID and {@link Configuration} of a - * {@link TaskContainer} - */ + /** A wrapper class which contains the information of {@link TaskContainer} */ static final class TaskProperties { private final int mDisplayId; @NonNull diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskFragmentContainer.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskFragmentContainer.java index 38ac719ebbe2e..ccb274a22c7e4 100644 --- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskFragmentContainer.java +++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskFragmentContainer.java @@ -37,6 +37,7 @@ import androidx.annotation.Nullable; import com.android.internal.annotations.VisibleForTesting; import java.util.ArrayList; +import java.util.Collections; import java.util.Iterator; import java.util.List; @@ -436,10 +437,17 @@ class TaskFragmentContainer { * Removes a container that should be finished when this container is finished. */ void removeContainerToFinishOnExit(@NonNull TaskFragmentContainer containerToRemove) { + removeContainersToFinishOnExit(Collections.singletonList(containerToRemove)); + } + + /** + * Removes container list that should be finished when this container is finished. + */ + void removeContainersToFinishOnExit(@NonNull List containersToRemove) { if (mIsFinished) { return; } - mContainersToFinishOnExit.remove(containerToRemove); + mContainersToFinishOnExit.removeAll(containersToRemove); } /** @@ -478,6 +486,16 @@ class TaskFragmentContainer { @GuardedBy("mController.mLock") void finish(boolean shouldFinishDependent, @NonNull SplitPresenter presenter, @NonNull WindowContainerTransaction wct, @NonNull SplitController controller) { + finish(shouldFinishDependent, presenter, wct, controller, true /* shouldRemoveRecord */); + } + + /** + * Removes all activities that belong to this process and finishes other containers/activities + * configured to finish together. + */ + void finish(boolean shouldFinishDependent, @NonNull SplitPresenter presenter, + @NonNull WindowContainerTransaction wct, @NonNull SplitController controller, + boolean shouldRemoveRecord) { if (!mIsFinished) { mIsFinished = true; if (mAppearEmptyTimeout != null) { @@ -494,8 +512,10 @@ class TaskFragmentContainer { // Cleanup the visuals presenter.deleteTaskFragment(wct, getTaskFragmentToken()); - // Cleanup the records - controller.removeContainer(this); + if (shouldRemoveRecord) { + // Cleanup the records + controller.removeContainer(this); + } // Clean up task fragment information mInfo = null; } diff --git a/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/SplitControllerTest.java b/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/SplitControllerTest.java index a26311efc23eb..17909d4a0763a 100644 --- a/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/SplitControllerTest.java +++ b/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/SplitControllerTest.java @@ -275,7 +275,8 @@ public class SplitControllerTest { assertNotNull(tf); assertNotNull(taskContainer); - assertEquals(TASK_BOUNDS, taskContainer.getConfiguration().windowConfiguration.getBounds()); + assertEquals(TASK_BOUNDS, taskContainer.getTaskProperties().getConfiguration() + .windowConfiguration.getBounds()); } @Test @@ -288,7 +289,7 @@ public class SplitControllerTest { doReturn(true).when(tf).isEmpty(); doReturn(true).when(mSplitController).launchPlaceholderIfNecessary(mTransaction, mActivity, false /* isOnCreated */); - doNothing().when(mSplitPresenter).updateSplitContainer(any(), any(), any()); + doNothing().when(mSplitPresenter).updateSplitContainer(any(), any()); mSplitController.updateContainer(mTransaction, tf); @@ -341,7 +342,7 @@ public class SplitControllerTest { mSplitController.updateContainer(mTransaction, tf); - verify(mSplitPresenter, never()).updateSplitContainer(any(), any(), any()); + verify(mSplitPresenter, never()).updateSplitContainer(any(), any()); // Verify if the top active split is updated if both of its containers are not finished. doReturn(false).when(mSplitController) @@ -349,7 +350,7 @@ public class SplitControllerTest { mSplitController.updateContainer(mTransaction, tf); - verify(mSplitPresenter).updateSplitContainer(splitContainer, tf, mTransaction); + verify(mSplitPresenter).updateSplitContainer(splitContainer, mTransaction); } @Test @@ -366,14 +367,14 @@ public class SplitControllerTest { doReturn(false).when(taskContainer).isVisible(); mSplitController.updateContainer(mTransaction, taskFragmentContainer); - verify(mSplitPresenter, never()).updateSplitContainer(any(), any(), any()); + verify(mSplitPresenter, never()).updateSplitContainer(any(), any()); // Update the split when the Task is visible. doReturn(true).when(taskContainer).isVisible(); mSplitController.updateContainer(mTransaction, taskFragmentContainer); verify(mSplitPresenter).updateSplitContainer(taskContainer.mSplitContainers.get(0), - taskFragmentContainer, mTransaction); + mTransaction); } @Test diff --git a/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/SplitPresenterTest.java b/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/SplitPresenterTest.java index a41e63f46f552..be7c26e9e2fe6 100644 --- a/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/SplitPresenterTest.java +++ b/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/SplitPresenterTest.java @@ -228,7 +228,7 @@ public class SplitPresenterTest { @Test public void testGetRelBoundsForPosition_expandContainers() { - final TaskContainer.TaskProperties taskProperties = getTaskProperty(); + final TaskContainer.TaskProperties taskProperties = getTaskProperties(); final SplitAttributes splitAttributes = new SplitAttributes.Builder() .setSplitType(new SplitAttributes.SplitType.ExpandContainersSplitType()) .build(); @@ -248,7 +248,7 @@ public class SplitPresenterTest { @Test public void testGetRelBoundsForPosition_expandContainers_isRelativeToParent() { - final TaskContainer.TaskProperties taskProperties = getTaskProperty( + final TaskContainer.TaskProperties taskProperties = getTaskProperties( new Rect(100, 100, 500, 1000)); final SplitAttributes splitAttributes = new SplitAttributes.Builder() .setSplitType(new SplitAttributes.SplitType.ExpandContainersSplitType()) @@ -273,7 +273,7 @@ public class SplitPresenterTest { false /* splitHorizontally */); final Rect secondaryBounds = getSplitBounds(false /* isPrimary */, false /* splitHorizontally */); - final TaskContainer.TaskProperties taskProperties = getTaskProperty(); + final TaskContainer.TaskProperties taskProperties = getTaskProperties(); SplitAttributes splitAttributes = new SplitAttributes.Builder() .setSplitType(SplitAttributes.SplitType.RatioSplitType.splitEqually()) .setLayoutDirection(SplitAttributes.LayoutDirection.LEFT_TO_RIGHT) @@ -339,7 +339,7 @@ public class SplitPresenterTest { // Offset TaskBounds to 100, 100. The returned rel bounds shouldn't be affected. final Rect taskBounds = new Rect(TASK_BOUNDS); taskBounds.offset(100, 100); - final TaskContainer.TaskProperties taskProperties = getTaskProperty(taskBounds); + final TaskContainer.TaskProperties taskProperties = getTaskProperties(taskBounds); SplitAttributes splitAttributes = new SplitAttributes.Builder() .setSplitType(SplitAttributes.SplitType.RatioSplitType.splitEqually()) .setLayoutDirection(SplitAttributes.LayoutDirection.LEFT_TO_RIGHT) @@ -400,7 +400,7 @@ public class SplitPresenterTest { true /* splitHorizontally */); final Rect secondaryBounds = getSplitBounds(false /* isPrimary */, true /* splitHorizontally */); - final TaskContainer.TaskProperties taskProperties = getTaskProperty(); + final TaskContainer.TaskProperties taskProperties = getTaskProperties(); SplitAttributes splitAttributes = new SplitAttributes.Builder() .setSplitType(SplitAttributes.SplitType.RatioSplitType.splitEqually()) .setLayoutDirection(SplitAttributes.LayoutDirection.TOP_TO_BOTTOM) @@ -442,7 +442,7 @@ public class SplitPresenterTest { false /* splitHorizontally */); final Rect secondaryBounds = getSplitBounds(false /* isPrimary */, false /* splitHorizontally */); - final TaskContainer.TaskProperties taskProperties = getTaskProperty(); + final TaskContainer.TaskProperties taskProperties = getTaskProperties(); final SplitAttributes splitAttributes = new SplitAttributes.Builder() .setSplitType(new SplitAttributes.SplitType.HingeSplitType( SplitAttributes.SplitType.RatioSplitType.splitEqually() @@ -506,7 +506,7 @@ public class SplitPresenterTest { @Test public void testGetRelBoundsForPosition_fallbackToExpandContainers() { - final TaskContainer.TaskProperties taskProperties = getTaskProperty(); + final TaskContainer.TaskProperties taskProperties = getTaskProperties(); final SplitAttributes splitAttributes = new SplitAttributes.Builder() .setSplitType(new SplitAttributes.SplitType.HingeSplitType( new SplitAttributes.SplitType.ExpandContainersSplitType() @@ -528,7 +528,7 @@ public class SplitPresenterTest { @Test public void testGetRelBoundsForPosition_useHingeSplitType() { - final TaskContainer.TaskProperties taskProperties = getTaskProperty(); + final TaskContainer.TaskProperties taskProperties = getTaskProperties(); final SplitAttributes splitAttributes = new SplitAttributes.Builder() .setSplitType(new SplitAttributes.SplitType.HingeSplitType( new SplitAttributes.SplitType.ExpandContainersSplitType() @@ -581,13 +581,13 @@ public class SplitPresenterTest { splitContainer, mActivity, secondaryActivity, null /* secondaryIntent */)); verify(mPresenter, never()).expandTaskFragment(any(), any()); - splitContainer.setSplitAttributes(SPLIT_ATTRIBUTES); + splitContainer.updateCurrentSplitAttributes(SPLIT_ATTRIBUTES); doReturn(createActivityInfoWithMinDimensions()).when(secondaryActivity).getActivityInfo(); assertEquals(RESULT_EXPAND_FAILED_NO_TF_INFO, mPresenter.expandSplitContainerIfNeeded( mTransaction, splitContainer, mActivity, secondaryActivity, null /* secondaryIntent */)); - splitContainer.setSplitAttributes(SPLIT_ATTRIBUTES); + splitContainer.updateCurrentSplitAttributes(SPLIT_ATTRIBUTES); primaryTf.setInfo(mTransaction, createMockTaskFragmentInfo(primaryTf, mActivity)); secondaryTf.setInfo(mTransaction, createMockTaskFragmentInfo(secondaryTf, secondaryActivity)); @@ -597,7 +597,7 @@ public class SplitPresenterTest { verify(mPresenter).expandTaskFragment(mTransaction, primaryTf.getTaskFragmentToken()); verify(mPresenter).expandTaskFragment(mTransaction, secondaryTf.getTaskFragmentToken()); - splitContainer.setSplitAttributes(SPLIT_ATTRIBUTES); + splitContainer.updateCurrentSplitAttributes(SPLIT_ATTRIBUTES); clearInvocations(mPresenter); assertEquals(RESULT_EXPANDED, mPresenter.expandSplitContainerIfNeeded(mTransaction, @@ -639,37 +639,35 @@ public class SplitPresenterTest { .setFinishPrimaryWithSecondary(DEFAULT_FINISH_PRIMARY_WITH_SECONDARY) .setDefaultSplitAttributes(SPLIT_ATTRIBUTES) .build(); - final TaskContainer.TaskProperties taskProperties = getTaskProperty(); + final TaskContainer.TaskProperties taskProperties = getTaskProperties(); assertEquals(SPLIT_ATTRIBUTES, mPresenter.computeSplitAttributes(taskProperties, - splitPairRule, null /* minDimensionsPair */)); + splitPairRule, SPLIT_ATTRIBUTES, null /* minDimensionsPair */)); final Pair minDimensionsPair = new Pair<>( new Size(TASK_BOUNDS.width(), TASK_BOUNDS.height()), null); assertEquals(EXPAND_CONTAINERS_ATTRIBUTES, mPresenter.computeSplitAttributes(taskProperties, - splitPairRule, minDimensionsPair)); + splitPairRule, SPLIT_ATTRIBUTES, minDimensionsPair)); taskProperties.getConfiguration().windowConfiguration.setBounds(new Rect( TASK_BOUNDS.left + 1, TASK_BOUNDS.top + 1, TASK_BOUNDS.right + 1, TASK_BOUNDS.bottom + 1)); assertEquals(EXPAND_CONTAINERS_ATTRIBUTES, mPresenter.computeSplitAttributes(taskProperties, - splitPairRule, null /* minDimensionsPair */)); + splitPairRule, SPLIT_ATTRIBUTES, null /* minDimensionsPair */)); final SplitAttributes splitAttributes = new SplitAttributes.Builder() - .setSplitType( - new SplitAttributes.SplitType.HingeSplitType( - SplitAttributes.SplitType.RatioSplitType.splitEqually() - ) - ).build(); + .setSplitType(new SplitAttributes.SplitType.HingeSplitType( + SplitAttributes.SplitType.RatioSplitType.splitEqually())) + .build(); final Function calculator = params -> splitAttributes; mController.setSplitAttributesCalculator(calculator); assertEquals(splitAttributes, mPresenter.computeSplitAttributes(taskProperties, - splitPairRule, null /* minDimensionsPair */)); + splitPairRule, SPLIT_ATTRIBUTES, null /* minDimensionsPair */)); } @Test @@ -696,14 +694,15 @@ public class SplitPresenterTest { doReturn(activityConfig).when(mActivityResources).getConfiguration(); doReturn(new ActivityInfo()).when(activity).getActivityInfo(); doReturn(mock(IBinder.class)).when(activity).getActivityToken(); + doReturn(TASK_ID).when(activity).getTaskId(); return activity; } - private static TaskContainer.TaskProperties getTaskProperty() { - return getTaskProperty(TASK_BOUNDS); + private static TaskContainer.TaskProperties getTaskProperties() { + return getTaskProperties(TASK_BOUNDS); } - private static TaskContainer.TaskProperties getTaskProperty(@NonNull Rect taskBounds) { + private static TaskContainer.TaskProperties getTaskProperties(@NonNull Rect taskBounds) { final Configuration configuration = new Configuration(); configuration.windowConfiguration.setBounds(taskBounds); return new TaskContainer.TaskProperties(DEFAULT_DISPLAY, configuration); diff --git a/libs/WindowManager/Jetpack/window-extensions-release.aar b/libs/WindowManager/Jetpack/window-extensions-release.aar index 7a6f46cdd7d9d60709111736b8335d2f3a200155..378ad811bd22a394b127f1db7a424abc926a8651 100644 GIT binary patch delta 32132 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 L0020M00000QW~+^ delta 32059 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