From ea6e6633e1488424c7497eb3ea8aa40b483b46a5 Mon Sep 17 00:00:00 2001 From: Andrii Kulian Date: Thu, 22 Jul 2021 23:10:45 -0700 Subject: [PATCH] Avoid re-adding to existing split If an activity is re-created after configuration change, make sure to check if it is not already in a split with an activity below before creating a new one. Bug: 190433398 Test: Manual Change-Id: Ib2b87e3736d6331209be4934303b20717446807c --- .../extensions/organizer/SplitController.java | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) 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 bc521beae6a6e..5971639eddda0 100644 --- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/organizer/SplitController.java +++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/organizer/SplitController.java @@ -147,6 +147,7 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen * Checks if the activity start should be routed to a particular container. It can create a new * container for the activity and a new split container if necessary. */ + // TODO(b/190433398): Break down into smaller functions. void onActivityCreated(@NonNull Activity launchedActivity) { final ComponentName componentName = launchedActivity.getComponentName(); @@ -200,6 +201,18 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen return; } + // Check if the split is already set. + final TaskFragmentContainer activityBelowContainer = getContainerWithActivity( + activityBelow.getActivityToken()); + if (currentContainer != null && activityBelowContainer != null) { + final SplitContainer existingSplit = getActiveSplitForContainers(currentContainer, + activityBelowContainer); + if (existingSplit != null) { + // There is already an active split with the activity below. + return; + } + } + final ExtensionSplitPairRule splitPairRule = getSplitRule( activityBelow.getComponentName(), componentName, splitRules); if (splitPairRule == null) { @@ -337,7 +350,7 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen } /** - * Returns the top active split container that has the provided container. + * Returns the top active split container that has the provided container, if available. */ @Nullable private SplitContainer getActiveSplitForContainer(@NonNull TaskFragmentContainer container) { @@ -351,6 +364,26 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen return null; } + /** + * Returns the active split that has the provided containers as primary and secondary or as + * secondary and primary, if available. + */ + @Nullable + private SplitContainer getActiveSplitForContainers( + @NonNull TaskFragmentContainer firstContainer, + @NonNull TaskFragmentContainer secondContainer) { + for (int i = mSplitContainers.size() - 1; i >= 0; i--) { + SplitContainer splitContainer = mSplitContainers.get(i); + final TaskFragmentContainer primary = splitContainer.getPrimaryContainer(); + final TaskFragmentContainer secondary = splitContainer.getSecondaryContainer(); + if ((firstContainer == secondary && secondContainer == primary) + || (firstContainer == primary && secondContainer == secondary)) { + return splitContainer; + } + } + return null; + } + /** * Checks if the container requires a placeholder and launches it if necessary. */