Merge "[1/n] Pin ActivityStack" into udc-qpr-dev am: 82db3963d2

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

Change-Id: I13ee5c46acd7803861059e2a1a3e846db9233249
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Louis Chang
2023-05-23 07:26:03 +00:00
committed by Automerger Merge Worker
3 changed files with 35 additions and 17 deletions

View File

@@ -1418,7 +1418,7 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen
if (splitRule instanceof SplitPairRule && ((SplitPairRule) splitRule).shouldClearTop()) { if (splitRule instanceof SplitPairRule && ((SplitPairRule) splitRule).shouldClearTop()) {
removeExistingSecondaryContainers(wct, primaryContainer); removeExistingSecondaryContainers(wct, primaryContainer);
} }
primaryContainer.getTaskContainer().mSplitContainers.add(splitContainer); primaryContainer.getTaskContainer().addSplitContainer(splitContainer);
} }
/** Cleanups all the dependencies when the TaskFragment is entering PIP. */ /** Cleanups all the dependencies when the TaskFragment is entering PIP. */
@@ -1430,8 +1430,9 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen
return; return;
} }
final List<SplitContainer> splitsToRemove = new ArrayList<>(); final List<SplitContainer> splitsToRemove = new ArrayList<>();
final List<SplitContainer> splitContainers = taskContainer.getSplitContainers();
final Set<TaskFragmentContainer> containersToUpdate = new ArraySet<>(); final Set<TaskFragmentContainer> containersToUpdate = new ArraySet<>();
for (SplitContainer splitContainer : taskContainer.mSplitContainers) { for (SplitContainer splitContainer : splitContainers) {
if (splitContainer.getPrimaryContainer() != container if (splitContainer.getPrimaryContainer() != container
&& splitContainer.getSecondaryContainer() != container) { && splitContainer.getSecondaryContainer() != container) {
continue; continue;
@@ -1449,7 +1450,7 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen
} }
} }
container.resetDependencies(); container.resetDependencies();
taskContainer.mSplitContainers.removeAll(splitsToRemove); taskContainer.removeSplitContainers(splitsToRemove);
// If there is any TaskFragment split with the PIP TaskFragment, update their presentations // If there is any TaskFragment split with the PIP TaskFragment, update their presentations
// since the split is dismissed. // since the split is dismissed.
// We don't want to close any of them even if they are dependencies of the PIP TaskFragment. // We don't want to close any of them even if they are dependencies of the PIP TaskFragment.
@@ -1481,7 +1482,8 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen
// Cleanup any split references. // Cleanup any split references.
final List<SplitContainer> containersToRemove = new ArrayList<>(); final List<SplitContainer> containersToRemove = new ArrayList<>();
for (SplitContainer splitContainer : taskContainer.mSplitContainers) { final List<SplitContainer> splitContainers = taskContainer.getSplitContainers();
for (SplitContainer splitContainer : splitContainers) {
if (containersToRemove.contains(splitContainer)) { if (containersToRemove.contains(splitContainer)) {
// Don't need to check because it has been in the remove list. // Don't need to check because it has been in the remove list.
continue; continue;
@@ -1492,7 +1494,7 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen
containersToRemove.add(splitContainer); containersToRemove.add(splitContainer);
} }
} }
taskContainer.mSplitContainers.removeAll(containersToRemove); taskContainer.removeSplitContainers(containersToRemove);
// Cleanup any dependent references. // Cleanup any dependent references.
for (TaskFragmentContainer containerToUpdate : taskContainer.mContainers) { for (TaskFragmentContainer containerToUpdate : taskContainer.mContainers) {
@@ -1629,7 +1631,7 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen
/** Whether the given split is the topmost split in the Task. */ /** Whether the given split is the topmost split in the Task. */
private boolean isTopMostSplit(@NonNull SplitContainer splitContainer) { private boolean isTopMostSplit(@NonNull SplitContainer splitContainer) {
final List<SplitContainer> splitContainers = splitContainer.getPrimaryContainer() final List<SplitContainer> splitContainers = splitContainer.getPrimaryContainer()
.getTaskContainer().mSplitContainers; .getTaskContainer().getSplitContainers();
return splitContainer == splitContainers.get(splitContainers.size() - 1); return splitContainer == splitContainers.get(splitContainers.size() - 1);
} }
@@ -1641,7 +1643,8 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen
if (container == null) { if (container == null) {
return null; return null;
} }
final List<SplitContainer> splitContainers = container.getTaskContainer().mSplitContainers; final List<SplitContainer> splitContainers =
container.getTaskContainer().getSplitContainers();
if (splitContainers.isEmpty()) { if (splitContainers.isEmpty()) {
return null; return null;
} }
@@ -1665,7 +1668,7 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen
@NonNull TaskFragmentContainer firstContainer, @NonNull TaskFragmentContainer firstContainer,
@NonNull TaskFragmentContainer secondContainer) { @NonNull TaskFragmentContainer secondContainer) {
final List<SplitContainer> splitContainers = firstContainer.getTaskContainer() final List<SplitContainer> splitContainers = firstContainer.getTaskContainer()
.mSplitContainers; .getSplitContainers();
for (int i = splitContainers.size() - 1; i >= 0; i--) { for (int i = splitContainers.size() - 1; i >= 0; i--) {
final SplitContainer splitContainer = splitContainers.get(i); final SplitContainer splitContainer = splitContainers.get(i);
final TaskFragmentContainer primary = splitContainer.getPrimaryContainer(); final TaskFragmentContainer primary = splitContainer.getPrimaryContainer();
@@ -1945,7 +1948,7 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen
@GuardedBy("mLock") @GuardedBy("mLock")
SplitContainer getSplitContainer(@NonNull IBinder token) { SplitContainer getSplitContainer(@NonNull IBinder token) {
for (int i = mTaskContainers.size() - 1; i >= 0; i--) { for (int i = mTaskContainers.size() - 1; i >= 0; i--) {
final List<SplitContainer> containers = mTaskContainers.valueAt(i).mSplitContainers; final List<SplitContainer> containers = mTaskContainers.valueAt(i).getSplitContainers();
for (SplitContainer container : containers) { for (SplitContainer container : containers) {
if (container.getToken().equals(token)) { if (container.getToken().equals(token)) {
return container; return container;

View File

@@ -55,7 +55,7 @@ class TaskContainer {
/** Active split pairs in this Task. */ /** Active split pairs in this Task. */
@NonNull @NonNull
final List<SplitContainer> mSplitContainers = new ArrayList<>(); private final List<SplitContainer> mSplitContainers = new ArrayList<>();
@NonNull @NonNull
private final Configuration mConfiguration; private final Configuration mConfiguration;
@@ -207,6 +207,19 @@ class TaskContainer {
return false; return false;
} }
@NonNull
List<SplitContainer> getSplitContainers() {
return new ArrayList<>(mSplitContainers);
}
void addSplitContainer(@NonNull SplitContainer splitContainer) {
mSplitContainers.add(splitContainer);
}
void removeSplitContainers(@NonNull List<SplitContainer> containers) {
mSplitContainers.removeAll(containers);
}
/** Adds the descriptors of split states in this Task to {@code outSplitStates}. */ /** Adds the descriptors of split states in this Task to {@code outSplitStates}. */
void getSplitStates(@NonNull List<SplitInfo> outSplitStates) { void getSplitStates(@NonNull List<SplitInfo> outSplitStates) {
for (SplitContainer container : mSplitContainers) { for (SplitContainer container : mSplitContainers) {

View File

@@ -320,11 +320,11 @@ public class SplitControllerTest {
doReturn(tf).when(splitContainer).getSecondaryContainer(); doReturn(tf).when(splitContainer).getSecondaryContainer();
doReturn(createTestTaskContainer()).when(splitContainer).getTaskContainer(); doReturn(createTestTaskContainer()).when(splitContainer).getTaskContainer();
doReturn(createSplitRule(mActivity, mActivity)).when(splitContainer).getSplitRule(); doReturn(createSplitRule(mActivity, mActivity)).when(splitContainer).getSplitRule();
final List<SplitContainer> splitContainers = final TaskContainer taskContainer = mSplitController.getTaskContainer(TASK_ID);
mSplitController.getTaskContainer(TASK_ID).mSplitContainers; taskContainer.addSplitContainer(splitContainer);
splitContainers.add(splitContainer);
// Add a mock SplitContainer on top of splitContainer // Add a mock SplitContainer on top of splitContainer
splitContainers.add(1, mock(SplitContainer.class)); final SplitContainer splitContainer2 = mock(SplitContainer.class);
taskContainer.addSplitContainer(splitContainer2);
mSplitController.updateContainer(mTransaction, tf); mSplitController.updateContainer(mTransaction, tf);
@@ -332,7 +332,9 @@ public class SplitControllerTest {
// Verify if one or both containers in the top SplitContainer are finished, // Verify if one or both containers in the top SplitContainer are finished,
// dismissPlaceholder() won't be called. // dismissPlaceholder() won't be called.
splitContainers.remove(1); final ArrayList<SplitContainer> splitContainersToRemove = new ArrayList<>();
splitContainersToRemove.add(splitContainer2);
taskContainer.removeSplitContainers(splitContainersToRemove);
doReturn(true).when(tf).isFinished(); doReturn(true).when(tf).isFinished();
mSplitController.updateContainer(mTransaction, tf); mSplitController.updateContainer(mTransaction, tf);
@@ -377,7 +379,7 @@ public class SplitControllerTest {
doReturn(true).when(taskContainer).isVisible(); doReturn(true).when(taskContainer).isVisible();
mSplitController.updateContainer(mTransaction, taskFragmentContainer); mSplitController.updateContainer(mTransaction, taskFragmentContainer);
verify(mSplitPresenter).updateSplitContainer(taskContainer.mSplitContainers.get(0), verify(mSplitPresenter).updateSplitContainer(taskContainer.getSplitContainers().get(0),
mTransaction); mTransaction);
} }
@@ -1091,7 +1093,7 @@ public class SplitControllerTest {
verify(mTransaction).finishActivity(secondaryActivity0.getActivityToken()); verify(mTransaction).finishActivity(secondaryActivity0.getActivityToken());
verify(mTransaction).finishActivity(secondaryActivity1.getActivityToken()); verify(mTransaction).finishActivity(secondaryActivity1.getActivityToken());
assertTrue(taskContainer.mContainers.isEmpty()); assertTrue(taskContainer.mContainers.isEmpty());
assertTrue(taskContainer.mSplitContainers.isEmpty()); assertTrue(taskContainer.getSplitContainers().isEmpty());
} }
@Test @Test