Merge "Finish existing secondary containers when starting to side" into sc-v2-dev am: 260fa38fa9

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15456938

Change-Id: I19e81cb246b7bdcb449e0da7d1826d15d5c8a74f
This commit is contained in:
TreeHugger Robot
2021-08-13 23:17:26 +00:00
committed by Automerger Merge Worker
3 changed files with 42 additions and 24 deletions

View File

@@ -96,11 +96,11 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer {
* @param activityIntent Intent to start the secondary Activity with. * @param activityIntent Intent to start the secondary Activity with.
* @param activityOptions ActivityOptions to start the secondary Activity with. * @param activityOptions ActivityOptions to start the secondary Activity with.
*/ */
void startActivityToSide(IBinder launchingFragmentToken, Rect launchingFragmentBounds, void startActivityToSide(@NonNull WindowContainerTransaction wct,
Activity launchingActivity, IBinder secondaryFragmentToken, @NonNull IBinder launchingFragmentToken, @NonNull Rect launchingFragmentBounds,
Rect secondaryFragmentBounds, Intent activityIntent, @NonNull Activity launchingActivity, @NonNull IBinder secondaryFragmentToken,
@NonNull Rect secondaryFragmentBounds, @NonNull Intent activityIntent,
@Nullable Bundle activityOptions) { @Nullable Bundle activityOptions) {
final WindowContainerTransaction wct = new WindowContainerTransaction();
final IBinder ownerToken = launchingActivity.getActivityToken(); final IBinder ownerToken = launchingActivity.getActivityToken();
// Create or resize the launching TaskFragment. // Create or resize the launching TaskFragment.
@@ -118,8 +118,6 @@ class JetpackTaskFragmentOrganizer extends TaskFragmentOrganizer {
// Set adjacent to each other so that the containers below will be invisible. // Set adjacent to each other so that the containers below will be invisible.
wct.setAdjacentTaskFragments(launchingFragmentToken, secondaryFragmentToken); wct.setAdjacentTaskFragments(launchingFragmentToken, secondaryFragmentToken);
applyTransaction(wct);
} }
/** /**

View File

@@ -296,12 +296,15 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen
} }
/** /**
* Creates and registers a new split with the provided containers and configuration. * Creates and registers a new split with the provided containers and configuration. Finishes
* existing secondary containers if found for the given primary container.
*/ */
void registerSplit(@NonNull TaskFragmentContainer primaryContainer, void registerSplit(@NonNull WindowContainerTransaction wct,
@NonNull Activity primaryActivity, @NonNull TaskFragmentContainer primaryContainer, @NonNull Activity primaryActivity,
@NonNull TaskFragmentContainer secondaryContainer, @NonNull TaskFragmentContainer secondaryContainer,
@NonNull ExtensionSplitPairRule splitPairRule) { @NonNull ExtensionSplitPairRule splitPairRule) {
removeExistingSecondaryContainers(wct, primaryContainer);
SplitContainer splitContainer = new SplitContainer(primaryContainer, primaryActivity, SplitContainer splitContainer = new SplitContainer(primaryContainer, primaryActivity,
secondaryContainer, splitPairRule); secondaryContainer, splitPairRule);
mSplitContainers.add(splitContainer); mSplitContainers.add(splitContainer);
@@ -323,6 +326,25 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen
mSplitContainers.removeAll(containersToRemove); mSplitContainers.removeAll(containersToRemove);
} }
/**
* Removes a secondary container for the given primary container if an existing split is
* already registered.
*/
void removeExistingSecondaryContainers(@NonNull WindowContainerTransaction wct,
@NonNull TaskFragmentContainer primaryContainer) {
// If the primary container was already in a split - remove the secondary container that
// is now covered by the new one that replaced it.
final SplitContainer existingSplitContainer = getActiveSplitForContainer(
primaryContainer);
if (existingSplitContainer == null
|| primaryContainer == existingSplitContainer.getSecondaryContainer()) {
return;
}
existingSplitContainer.getSecondaryContainer().finish(
false /* shouldFinishDependent */, mPresenter, wct, this);
}
/** /**
* Returns the topmost not finished container. * Returns the topmost not finished container.
*/ */

View File

@@ -108,9 +108,10 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer {
// Set adjacent to each other so that the containers below will be invisible. // Set adjacent to each other so that the containers below will be invisible.
wct.setAdjacentTaskFragments( wct.setAdjacentTaskFragments(
primaryContainer.getTaskFragmentToken(), secondaryContainer.getTaskFragmentToken()); primaryContainer.getTaskFragmentToken(), secondaryContainer.getTaskFragmentToken());
applyTransaction(wct);
mController.registerSplit(primaryContainer, primaryActivity, secondaryContainer, rule); mController.registerSplit(wct, primaryContainer, primaryActivity, secondaryContainer, rule);
applyTransaction(wct);
return secondaryContainer; return secondaryContainer;
} }
@@ -142,9 +143,10 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer {
// Set adjacent to each other so that the containers below will be invisible. // Set adjacent to each other so that the containers below will be invisible.
wct.setAdjacentTaskFragments( wct.setAdjacentTaskFragments(
primaryContainer.getTaskFragmentToken(), secondaryContainer.getTaskFragmentToken()); primaryContainer.getTaskFragmentToken(), secondaryContainer.getTaskFragmentToken());
applyTransaction(wct);
mController.registerSplit(primaryContainer, primaryActivity, secondaryContainer, rule); mController.registerSplit(wct, primaryContainer, primaryActivity, secondaryContainer, rule);
applyTransaction(wct);
} }
/** /**
@@ -202,20 +204,16 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer {
} }
TaskFragmentContainer secondaryContainer = mController.newContainer(null); TaskFragmentContainer secondaryContainer = mController.newContainer(null);
startActivityToSide( final WindowContainerTransaction wct = new WindowContainerTransaction();
primaryContainer.getTaskFragmentToken(), mController.registerSplit(wct, primaryContainer, launchingActivity, secondaryContainer,
primaryRectBounds, rule);
launchingActivity, startActivityToSide(wct, primaryContainer.getTaskFragmentToken(), primaryRectBounds,
secondaryContainer.getTaskFragmentToken(), launchingActivity, secondaryContainer.getTaskFragmentToken(), secondaryRectBounds,
secondaryRectBounds, activityIntent, activityOptions);
activityIntent, applyTransaction(wct);
activityOptions);
primaryContainer.setLastRequestedBounds(primaryRectBounds); primaryContainer.setLastRequestedBounds(primaryRectBounds);
secondaryContainer.setLastRequestedBounds(secondaryRectBounds); secondaryContainer.setLastRequestedBounds(secondaryRectBounds);
mController.registerSplit(primaryContainer, launchingActivity, secondaryContainer,
rule);
} }
/** /**